/* Mapbox GL JS is licensed under the 3-Clause BSD License. Full text of license: https://github.com/mapbox/mapbox-gl-js/blob/v1.0.0/LICENSE.txt */ (function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : typeof define === 'function' && define.amd ? define(factory) : (global = global || self, global.mapboxgl = factory()); }(this, function () { 'use strict'; /* eslint-disable */ var shared, worker, mapboxgl; // define gets called three times: one for each chunk. we rely on the order // they're imported to know which is which function define(_, chunk) { if (!shared) { shared = chunk; } else if (!worker) { worker = chunk; } else { var workerBundleString = 'var sharedChunk = {}; (' + shared + ')(sharedChunk); (' + worker + ')(sharedChunk);' var sharedChunk = {}; shared(sharedChunk); mapboxgl = chunk(sharedChunk); mapboxgl.workerUrl = window.URL.createObjectURL(new Blob([workerBundleString], { type: 'text/javascript' })); } } define(['exports'], function (exports) { 'use strict'; var commonjsGlobal = typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {}; function commonjsRequire () { throw new Error('Dynamic requires are not currently supported by rollup-plugin-commonjs'); } function unwrapExports (x) { return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x.default : x; } function createCommonjsModule(fn, module) { return module = { exports: {} }, fn(module, module.exports), module.exports; } function getCjsExportFromNamespace (n) { return n && n.default || n; } var isBufferBrowser = function isBuffer(arg) { return arg && typeof arg === 'object' && typeof arg.copy === 'function' && typeof arg.fill === 'function' && typeof arg.readUInt8 === 'function'; }; var inherits_browser = createCommonjsModule(function (module) { if (typeof Object.create === 'function') { // implementation from standard node.js 'util' module module.exports = function inherits(ctor, superCtor) { ctor.super_ = superCtor; ctor.prototype = Object.create(superCtor.prototype, { constructor: { value: ctor, enumerable: false, writable: true, configurable: true } }); }; } else { // old school shim for old browsers module.exports = function inherits(ctor, superCtor) { ctor.super_ = superCtor; var TempCtor = function () {}; TempCtor.prototype = superCtor.prototype; ctor.prototype = new TempCtor(); ctor.prototype.constructor = ctor; }; } }); var util = createCommonjsModule(function (module, exports) { // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a // copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to permit // persons to whom the Software is furnished to do so, subject to the // following conditions: // // The above copyright notice and this permission notice shall be included // in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE // USE OR OTHER DEALINGS IN THE SOFTWARE. var formatRegExp = /%[sdj%]/g; exports.format = function(f) { var arguments$1 = arguments; if (!isString(f)) { var objects = []; for (var i = 0; i < arguments.length; i++) { objects.push(inspect(arguments$1[i])); } return objects.join(' '); } var i = 1; var args = arguments; var len = args.length; var str = String(f).replace(formatRegExp, function(x) { if (x === '%%') { return '%'; } if (i >= len) { return x; } switch (x) { case '%s': return String(args[i++]); case '%d': return Number(args[i++]); case '%j': try { return JSON.stringify(args[i++]); } catch (_) { return '[Circular]'; } default: return x; } }); for (var x = args[i]; i < len; x = args[++i]) { if (isNull(x) || !isObject(x)) { str += ' ' + x; } else { str += ' ' + inspect(x); } } return str; }; // Mark that a method should not be used. // Returns a modified function which warns once by default. // If --no-deprecation is set, then it is a no-op. exports.deprecate = function(fn, msg) { // Allow for deprecating things in the process of starting up. if (isUndefined(global.process)) { return function() { return exports.deprecate(fn, msg).apply(this, arguments); }; } if (process.noDeprecation === true) { return fn; } var warned = false; function deprecated() { if (!warned) { if (process.throwDeprecation) { throw new Error(msg); } else if (process.traceDeprecation) { console.trace(msg); } else { console.error(msg); } warned = true; } return fn.apply(this, arguments); } return deprecated; }; var debugs = {}; var debugEnviron; exports.debuglog = function(set) { if (isUndefined(debugEnviron)) { debugEnviron = process.env.NODE_DEBUG || ''; } set = set.toUpperCase(); if (!debugs[set]) { if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) { var pid = process.pid; debugs[set] = function() { var msg = exports.format.apply(exports, arguments); console.error('%s %d: %s', set, pid, msg); }; } else { debugs[set] = function() {}; } } return debugs[set]; }; /** * Echos the value of a value. Trys to print the value out * in the best way possible given the different types. * * @param {Object} obj The object to print out. * @param {Object} opts Optional options object that alters the output. */ /* legacy: obj, showHidden, depth, colors*/ function inspect(obj, opts) { // default options var ctx = { seen: [], stylize: stylizeNoColor }; // legacy... if (arguments.length >= 3) { ctx.depth = arguments[2]; } if (arguments.length >= 4) { ctx.colors = arguments[3]; } if (isBoolean(opts)) { // legacy... ctx.showHidden = opts; } else if (opts) { // got an "options" object exports._extend(ctx, opts); } // set default options if (isUndefined(ctx.showHidden)) { ctx.showHidden = false; } if (isUndefined(ctx.depth)) { ctx.depth = 2; } if (isUndefined(ctx.colors)) { ctx.colors = false; } if (isUndefined(ctx.customInspect)) { ctx.customInspect = true; } if (ctx.colors) { ctx.stylize = stylizeWithColor; } return formatValue(ctx, obj, ctx.depth); } exports.inspect = inspect; // http://en.wikipedia.org/wiki/ANSI_escape_code#graphics inspect.colors = { 'bold' : [1, 22], 'italic' : [3, 23], 'underline' : [4, 24], 'inverse' : [7, 27], 'white' : [37, 39], 'grey' : [90, 39], 'black' : [30, 39], 'blue' : [34, 39], 'cyan' : [36, 39], 'green' : [32, 39], 'magenta' : [35, 39], 'red' : [31, 39], 'yellow' : [33, 39] }; // Don't use 'blue' not visible on cmd.exe inspect.styles = { 'special': 'cyan', 'number': 'yellow', 'boolean': 'yellow', 'undefined': 'grey', 'null': 'bold', 'string': 'green', 'date': 'magenta', // "name": intentionally not styling 'regexp': 'red' }; function stylizeWithColor(str, styleType) { var style = inspect.styles[styleType]; if (style) { return '\u001b[' + inspect.colors[style][0] + 'm' + str + '\u001b[' + inspect.colors[style][1] + 'm'; } else { return str; } } function stylizeNoColor(str, styleType) { return str; } function arrayToHash(array) { var hash = {}; array.forEach(function(val, idx) { hash[val] = true; }); return hash; } function formatValue(ctx, value, recurseTimes) { // Provide a hook for user-specified inspect functions. // Check that value is an object with an inspect function on it if (ctx.customInspect && value && isFunction(value.inspect) && // Filter out the util module, it's inspect function is special value.inspect !== exports.inspect && // Also filter out any prototype objects using the circular check. !(value.constructor && value.constructor.prototype === value)) { var ret = value.inspect(recurseTimes, ctx); if (!isString(ret)) { ret = formatValue(ctx, ret, recurseTimes); } return ret; } // Primitive types cannot have properties var primitive = formatPrimitive(ctx, value); if (primitive) { return primitive; } // Look up the keys of the object. var keys = Object.keys(value); var visibleKeys = arrayToHash(keys); if (ctx.showHidden) { keys = Object.getOwnPropertyNames(value); } // IE doesn't make error fields non-enumerable // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx if (isError(value) && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) { return formatError(value); } // Some type of object without properties can be shortcutted. if (keys.length === 0) { if (isFunction(value)) { var name = value.name ? ': ' + value.name : ''; return ctx.stylize('[Function' + name + ']', 'special'); } if (isRegExp(value)) { return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); } if (isDate(value)) { return ctx.stylize(Date.prototype.toString.call(value), 'date'); } if (isError(value)) { return formatError(value); } } var base = '', array = false, braces = ['{', '}']; // Make Array say that they are Array if (isArray(value)) { array = true; braces = ['[', ']']; } // Make functions say that they are functions if (isFunction(value)) { var n = value.name ? ': ' + value.name : ''; base = ' [Function' + n + ']'; } // Make RegExps say that they are RegExps if (isRegExp(value)) { base = ' ' + RegExp.prototype.toString.call(value); } // Make dates with properties first say the date if (isDate(value)) { base = ' ' + Date.prototype.toUTCString.call(value); } // Make error with message first say the error if (isError(value)) { base = ' ' + formatError(value); } if (keys.length === 0 && (!array || value.length == 0)) { return braces[0] + base + braces[1]; } if (recurseTimes < 0) { if (isRegExp(value)) { return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); } else { return ctx.stylize('[Object]', 'special'); } } ctx.seen.push(value); var output; if (array) { output = formatArray(ctx, value, recurseTimes, visibleKeys, keys); } else { output = keys.map(function(key) { return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array); }); } ctx.seen.pop(); return reduceToSingleString(output, base, braces); } function formatPrimitive(ctx, value) { if (isUndefined(value)) { return ctx.stylize('undefined', 'undefined'); } if (isString(value)) { var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '') .replace(/'/g, "\\'") .replace(/\\"/g, '"') + '\''; return ctx.stylize(simple, 'string'); } if (isNumber(value)) { return ctx.stylize('' + value, 'number'); } if (isBoolean(value)) { return ctx.stylize('' + value, 'boolean'); } // For some reason typeof null is "object", so special case here. if (isNull(value)) { return ctx.stylize('null', 'null'); } } function formatError(value) { return '[' + Error.prototype.toString.call(value) + ']'; } function formatArray(ctx, value, recurseTimes, visibleKeys, keys) { var output = []; for (var i = 0, l = value.length; i < l; ++i) { if (hasOwnProperty(value, String(i))) { output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, String(i), true)); } else { output.push(''); } } keys.forEach(function(key) { if (!key.match(/^\d+$/)) { output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, key, true)); } }); return output; } function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) { var name, str, desc; desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] }; if (desc.get) { if (desc.set) { str = ctx.stylize('[Getter/Setter]', 'special'); } else { str = ctx.stylize('[Getter]', 'special'); } } else { if (desc.set) { str = ctx.stylize('[Setter]', 'special'); } } if (!hasOwnProperty(visibleKeys, key)) { name = '[' + key + ']'; } if (!str) { if (ctx.seen.indexOf(desc.value) < 0) { if (isNull(recurseTimes)) { str = formatValue(ctx, desc.value, null); } else { str = formatValue(ctx, desc.value, recurseTimes - 1); } if (str.indexOf('\n') > -1) { if (array) { str = str.split('\n').map(function(line) { return ' ' + line; }).join('\n').substr(2); } else { str = '\n' + str.split('\n').map(function(line) { return ' ' + line; }).join('\n'); } } } else { str = ctx.stylize('[Circular]', 'special'); } } if (isUndefined(name)) { if (array && key.match(/^\d+$/)) { return str; } name = JSON.stringify('' + key); if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) { name = name.substr(1, name.length - 2); name = ctx.stylize(name, 'name'); } else { name = name.replace(/'/g, "\\'") .replace(/\\"/g, '"') .replace(/(^"|"$)/g, "'"); name = ctx.stylize(name, 'string'); } } return name + ': ' + str; } function reduceToSingleString(output, base, braces) { var numLinesEst = 0; var length = output.reduce(function(prev, cur) { numLinesEst++; if (cur.indexOf('\n') >= 0) { numLinesEst++; } return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1; }, 0); if (length > 60) { return braces[0] + (base === '' ? '' : base + '\n ') + ' ' + output.join(',\n ') + ' ' + braces[1]; } return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1]; } // NOTE: These type checking functions intentionally don't use `instanceof` // because it is fragile and can be easily faked with `Object.create()`. function isArray(ar) { return Array.isArray(ar); } exports.isArray = isArray; function isBoolean(arg) { return typeof arg === 'boolean'; } exports.isBoolean = isBoolean; function isNull(arg) { return arg === null; } exports.isNull = isNull; function isNullOrUndefined(arg) { return arg == null; } exports.isNullOrUndefined = isNullOrUndefined; function isNumber(arg) { return typeof arg === 'number'; } exports.isNumber = isNumber; function isString(arg) { return typeof arg === 'string'; } exports.isString = isString; function isSymbol(arg) { return typeof arg === 'symbol'; } exports.isSymbol = isSymbol; function isUndefined(arg) { return arg === void 0; } exports.isUndefined = isUndefined; function isRegExp(re) { return isObject(re) && objectToString(re) === '[object RegExp]'; } exports.isRegExp = isRegExp; function isObject(arg) { return typeof arg === 'object' && arg !== null; } exports.isObject = isObject; function isDate(d) { return isObject(d) && objectToString(d) === '[object Date]'; } exports.isDate = isDate; function isError(e) { return isObject(e) && (objectToString(e) === '[object Error]' || e instanceof Error); } exports.isError = isError; function isFunction(arg) { return typeof arg === 'function'; } exports.isFunction = isFunction; function isPrimitive(arg) { return arg === null || typeof arg === 'boolean' || typeof arg === 'number' || typeof arg === 'string' || typeof arg === 'symbol' || // ES6 symbol typeof arg === 'undefined'; } exports.isPrimitive = isPrimitive; exports.isBuffer = isBufferBrowser; function objectToString(o) { return Object.prototype.toString.call(o); } function pad(n) { return n < 10 ? '0' + n.toString(10) : n.toString(10); } var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']; // 26 Feb 16:19:34 function timestamp() { var d = new Date(); var time = [pad(d.getHours()), pad(d.getMinutes()), pad(d.getSeconds())].join(':'); return [d.getDate(), months[d.getMonth()], time].join(' '); } // log is just a thin wrapper to console.log that prepends a timestamp exports.log = function() { console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments)); }; /** * Inherit the prototype methods from one constructor into another. * * The Function.prototype.inherits from lang.js rewritten as a standalone * function (not on Function.prototype). NOTE: If this file is to be loaded * during bootstrapping this function needs to be rewritten using some native * functions as prototype setup using normal JavaScript does not work as * expected during bootstrapping (see mirror.js in r114903). * * @param {function} ctor Constructor function which needs to inherit the * prototype. * @param {function} superCtor Constructor function to inherit prototype from. */ exports.inherits = inherits_browser; exports._extend = function(origin, add) { // Don't do anything if add isn't an object if (!add || !isObject(add)) { return origin; } var keys = Object.keys(add); var i = keys.length; while (i--) { origin[keys[i]] = add[keys[i]]; } return origin; }; function hasOwnProperty(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); } }); var util_1 = util.format; var util_2 = util.deprecate; var util_3 = util.debuglog; var util_4 = util.inspect; var util_5 = util.isArray; var util_6 = util.isBoolean; var util_7 = util.isNull; var util_8 = util.isNullOrUndefined; var util_9 = util.isNumber; var util_10 = util.isString; var util_11 = util.isSymbol; var util_12 = util.isUndefined; var util_13 = util.isRegExp; var util_14 = util.isObject; var util_15 = util.isDate; var util_16 = util.isError; var util_17 = util.isFunction; var util_18 = util.isPrimitive; var util_19 = util.isBuffer; var util_20 = util.log; var util_21 = util.inherits; var util_22 = util._extend; var assert_1 = createCommonjsModule(function (module) { 'use strict'; // compare and isBuffer taken from https://github.com/feross/buffer/blob/680e9e5e488f22aac27599a57dc844a6315928dd/index.js // original notice: /*! * The buffer module from node.js, for the browser. * * @author Feross Aboukhadijeh * @license MIT */ function compare(a, b) { if (a === b) { return 0; } var x = a.length; var y = b.length; for (var i = 0, len = Math.min(x, y); i < len; ++i) { if (a[i] !== b[i]) { x = a[i]; y = b[i]; break; } } if (x < y) { return -1; } if (y < x) { return 1; } return 0; } function isBuffer(b) { if (global.Buffer && typeof global.Buffer.isBuffer === 'function') { return global.Buffer.isBuffer(b); } return !!(b != null && b._isBuffer); } // based on node assert, original notice: // http://wiki.commonjs.org/wiki/Unit_Testing/1.0 // // THIS IS NOT TESTED NOR LIKELY TO WORK OUTSIDE V8! // // Originally from narwhal.js (http://narwhaljs.org) // Copyright (c) 2009 Thomas Robinson <280north.com> // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the 'Software'), to // deal in the Software without restriction, including without limitation the // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or // sell copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. var hasOwn = Object.prototype.hasOwnProperty; var pSlice = Array.prototype.slice; var functionsHaveNames = (function () { return function foo() {}.name === 'foo'; }()); function pToString (obj) { return Object.prototype.toString.call(obj); } function isView(arrbuf) { if (isBuffer(arrbuf)) { return false; } if (typeof global.ArrayBuffer !== 'function') { return false; } if (typeof ArrayBuffer.isView === 'function') { return ArrayBuffer.isView(arrbuf); } if (!arrbuf) { return false; } if (arrbuf instanceof DataView) { return true; } if (arrbuf.buffer && arrbuf.buffer instanceof ArrayBuffer) { return true; } return false; } // 1. The assert module provides functions that throw // AssertionError's when particular conditions are not met. The // assert module must conform to the following interface. var assert = module.exports = ok; // 2. The AssertionError is defined in assert. // new assert.AssertionError({ message: message, // actual: actual, // expected: expected }) var regex = /\s*function\s+([^\(\s]*)\s*/; // based on https://github.com/ljharb/function.prototype.name/blob/adeeeec8bfcc6068b187d7d9fb3d5bb1d3a30899/implementation.js function getName(func) { if (!util.isFunction(func)) { return; } if (functionsHaveNames) { return func.name; } var str = func.toString(); var match = str.match(regex); return match && match[1]; } assert.AssertionError = function AssertionError(options) { this.name = 'AssertionError'; this.actual = options.actual; this.expected = options.expected; this.operator = options.operator; if (options.message) { this.message = options.message; this.generatedMessage = false; } else { this.message = getMessage(this); this.generatedMessage = true; } var stackStartFunction = options.stackStartFunction || fail; if (Error.captureStackTrace) { Error.captureStackTrace(this, stackStartFunction); } else { // non v8 browsers so we can have a stacktrace var err = new Error(); if (err.stack) { var out = err.stack; // try to strip useless frames var fn_name = getName(stackStartFunction); var idx = out.indexOf('\n' + fn_name); if (idx >= 0) { // once we have located the function frame // we need to strip out everything before it (and its line) var next_line = out.indexOf('\n', idx + 1); out = out.substring(next_line + 1); } this.stack = out; } } }; // assert.AssertionError instanceof Error util.inherits(assert.AssertionError, Error); function truncate(s, n) { if (typeof s === 'string') { return s.length < n ? s : s.slice(0, n); } else { return s; } } function inspect(something) { if (functionsHaveNames || !util.isFunction(something)) { return util.inspect(something); } var rawname = getName(something); var name = rawname ? ': ' + rawname : ''; return '[Function' + name + ']'; } function getMessage(self) { return truncate(inspect(self.actual), 128) + ' ' + self.operator + ' ' + truncate(inspect(self.expected), 128); } // At present only the three keys mentioned above are used and // understood by the spec. Implementations or sub modules can pass // other keys to the AssertionError's constructor - they will be // ignored. // 3. All of the following functions must throw an AssertionError // when a corresponding condition is not met, with a message that // may be undefined if not provided. All assertion methods provide // both the actual and expected values to the assertion error for // display purposes. function fail(actual, expected, message, operator, stackStartFunction) { throw new assert.AssertionError({ message: message, actual: actual, expected: expected, operator: operator, stackStartFunction: stackStartFunction }); } // EXTENSION! allows for well behaved errors defined elsewhere. assert.fail = fail; // 4. Pure assertion tests whether a value is truthy, as determined // by !!guard. // assert.ok(guard, message_opt); // This statement is equivalent to assert.equal(true, !!guard, // message_opt);. To test strictly for the value true, use // assert.strictEqual(true, guard, message_opt);. function ok(value, message) { if (!value) { fail(value, true, message, '==', assert.ok); } } assert.ok = ok; // 5. The equality assertion tests shallow, coercive equality with // ==. // assert.equal(actual, expected, message_opt); assert.equal = function equal(actual, expected, message) { if (actual != expected) { fail(actual, expected, message, '==', assert.equal); } }; // 6. The non-equality assertion tests for whether two objects are not equal // with != assert.notEqual(actual, expected, message_opt); assert.notEqual = function notEqual(actual, expected, message) { if (actual == expected) { fail(actual, expected, message, '!=', assert.notEqual); } }; // 7. The equivalence assertion tests a deep equality relation. // assert.deepEqual(actual, expected, message_opt); assert.deepEqual = function deepEqual(actual, expected, message) { if (!_deepEqual(actual, expected, false)) { fail(actual, expected, message, 'deepEqual', assert.deepEqual); } }; assert.deepStrictEqual = function deepStrictEqual(actual, expected, message) { if (!_deepEqual(actual, expected, true)) { fail(actual, expected, message, 'deepStrictEqual', assert.deepStrictEqual); } }; function _deepEqual(actual, expected, strict, memos) { // 7.1. All identical values are equivalent, as determined by ===. if (actual === expected) { return true; } else if (isBuffer(actual) && isBuffer(expected)) { return compare(actual, expected) === 0; // 7.2. If the expected value is a Date object, the actual value is // equivalent if it is also a Date object that refers to the same time. } else if (util.isDate(actual) && util.isDate(expected)) { return actual.getTime() === expected.getTime(); // 7.3 If the expected value is a RegExp object, the actual value is // equivalent if it is also a RegExp object with the same source and // properties (`global`, `multiline`, `lastIndex`, `ignoreCase`). } else if (util.isRegExp(actual) && util.isRegExp(expected)) { return actual.source === expected.source && actual.global === expected.global && actual.multiline === expected.multiline && actual.lastIndex === expected.lastIndex && actual.ignoreCase === expected.ignoreCase; // 7.4. Other pairs that do not both pass typeof value == 'object', // equivalence is determined by ==. } else if ((actual === null || typeof actual !== 'object') && (expected === null || typeof expected !== 'object')) { return strict ? actual === expected : actual == expected; // If both values are instances of typed arrays, wrap their underlying // ArrayBuffers in a Buffer each to increase performance // This optimization requires the arrays to have the same type as checked by // Object.prototype.toString (aka pToString). Never perform binary // comparisons for Float*Arrays, though, since e.g. +0 === -0 but their // bit patterns are not identical. } else if (isView(actual) && isView(expected) && pToString(actual) === pToString(expected) && !(actual instanceof Float32Array || actual instanceof Float64Array)) { return compare(new Uint8Array(actual.buffer), new Uint8Array(expected.buffer)) === 0; // 7.5 For all other Object pairs, including Array objects, equivalence is // determined by having the same number of owned properties (as verified // with Object.prototype.hasOwnProperty.call), the same set of keys // (although not necessarily the same order), equivalent values for every // corresponding key, and an identical 'prototype' property. Note: this // accounts for both named and indexed properties on Arrays. } else if (isBuffer(actual) !== isBuffer(expected)) { return false; } else { memos = memos || {actual: [], expected: []}; var actualIndex = memos.actual.indexOf(actual); if (actualIndex !== -1) { if (actualIndex === memos.expected.indexOf(expected)) { return true; } } memos.actual.push(actual); memos.expected.push(expected); return objEquiv(actual, expected, strict, memos); } } function isArguments(object) { return Object.prototype.toString.call(object) == '[object Arguments]'; } function objEquiv(a, b, strict, actualVisitedObjects) { if (a === null || a === undefined || b === null || b === undefined) { return false; } // if one is a primitive, the other must be same if (util.isPrimitive(a) || util.isPrimitive(b)) { return a === b; } if (strict && Object.getPrototypeOf(a) !== Object.getPrototypeOf(b)) { return false; } var aIsArgs = isArguments(a); var bIsArgs = isArguments(b); if ((aIsArgs && !bIsArgs) || (!aIsArgs && bIsArgs)) { return false; } if (aIsArgs) { a = pSlice.call(a); b = pSlice.call(b); return _deepEqual(a, b, strict); } var ka = objectKeys(a); var kb = objectKeys(b); var key, i; // having the same number of owned properties (keys incorporates // hasOwnProperty) if (ka.length !== kb.length) { return false; } //the same set of keys (although not necessarily the same order), ka.sort(); kb.sort(); //~~~cheap key test for (i = ka.length - 1; i >= 0; i--) { if (ka[i] !== kb[i]) { return false; } } //equivalent values for every corresponding key, and //~~~possibly expensive deep test for (i = ka.length - 1; i >= 0; i--) { key = ka[i]; if (!_deepEqual(a[key], b[key], strict, actualVisitedObjects)) { return false; } } return true; } // 8. The non-equivalence assertion tests for any deep inequality. // assert.notDeepEqual(actual, expected, message_opt); assert.notDeepEqual = function notDeepEqual(actual, expected, message) { if (_deepEqual(actual, expected, false)) { fail(actual, expected, message, 'notDeepEqual', assert.notDeepEqual); } }; assert.notDeepStrictEqual = notDeepStrictEqual; function notDeepStrictEqual(actual, expected, message) { if (_deepEqual(actual, expected, true)) { fail(actual, expected, message, 'notDeepStrictEqual', notDeepStrictEqual); } } // 9. The strict equality assertion tests strict equality, as determined by ===. // assert.strictEqual(actual, expected, message_opt); assert.strictEqual = function strictEqual(actual, expected, message) { if (actual !== expected) { fail(actual, expected, message, '===', assert.strictEqual); } }; // 10. The strict non-equality assertion tests for strict inequality, as // determined by !==. assert.notStrictEqual(actual, expected, message_opt); assert.notStrictEqual = function notStrictEqual(actual, expected, message) { if (actual === expected) { fail(actual, expected, message, '!==', assert.notStrictEqual); } }; function expectedException(actual, expected) { if (!actual || !expected) { return false; } if (Object.prototype.toString.call(expected) == '[object RegExp]') { return expected.test(actual); } try { if (actual instanceof expected) { return true; } } catch (e) { // Ignore. The instanceof check doesn't work for arrow functions. } if (Error.isPrototypeOf(expected)) { return false; } return expected.call({}, actual) === true; } function _tryBlock(block) { var error; try { block(); } catch (e) { error = e; } return error; } function _throws(shouldThrow, block, expected, message) { var actual; if (typeof block !== 'function') { throw new TypeError('"block" argument must be a function'); } if (typeof expected === 'string') { message = expected; expected = null; } actual = _tryBlock(block); message = (expected && expected.name ? ' (' + expected.name + ').' : '.') + (message ? ' ' + message : '.'); if (shouldThrow && !actual) { fail(actual, expected, 'Missing expected exception' + message); } var userProvidedMessage = typeof message === 'string'; var isUnwantedException = !shouldThrow && util.isError(actual); var isUnexpectedException = !shouldThrow && actual && !expected; if ((isUnwantedException && userProvidedMessage && expectedException(actual, expected)) || isUnexpectedException) { fail(actual, expected, 'Got unwanted exception' + message); } if ((shouldThrow && actual && expected && !expectedException(actual, expected)) || (!shouldThrow && actual)) { throw actual; } } // 11. Expected to throw an error: // assert.throws(block, Error_opt, message_opt); assert.throws = function(block, /*optional*/error, /*optional*/message) { _throws(true, block, error, message); }; // EXTENSION! This is annoying to write outside this module. assert.doesNotThrow = function(block, /*optional*/error, /*optional*/message) { _throws(false, block, error, message); }; assert.ifError = function(err) { if (err) { throw err; } }; var objectKeys = Object.keys || function (obj) { var keys = []; for (var key in obj) { if (hasOwn.call(obj, key)) { keys.push(key); } } return keys; }; }); var name = "mapbox-gl"; var description = "A WebGL interactive maps library"; var version = "1.0.0"; var main = "dist/mapbox-gl.js"; var style = "dist/mapbox-gl.css"; var license = "SEE LICENSE IN LICENSE.txt"; var repository = { type: "git", url: "git://github.com/mapbox/mapbox-gl-js.git" }; var engines = { node: ">=6.4.0" }; var dependencies = { "@mapbox/geojson-rewind": "^0.4.0", "@mapbox/geojson-types": "^1.0.2", "@mapbox/jsonlint-lines-primitives": "^2.0.2", "@mapbox/mapbox-gl-supported": "^1.4.0", "@mapbox/point-geometry": "^0.1.0", "@mapbox/tiny-sdf": "^1.1.0", "@mapbox/unitbezier": "^0.0.0", "@mapbox/vector-tile": "^1.3.1", "@mapbox/whoots-js": "^3.1.0", csscolorparser: "~1.0.2", earcut: "^2.1.5", esm: "~3.0.84", "geojson-vt": "^3.2.1", "gl-matrix": "^3.0.0", "grid-index": "^1.1.0", minimist: "0.0.8", "murmurhash-js": "^1.0.0", pbf: "^3.0.5", potpack: "^1.0.1", quickselect: "^2.0.0", rw: "^1.3.3", supercluster: "^6.0.1", tinyqueue: "^2.0.0", "vt-pbf": "^3.1.1" }; var devDependencies = { "@mapbox/appropriate-images": "^2.0.0", "@mapbox/appropriate-images-react": "^1.0.0", "@mapbox/batfish": "1.9.8", "@mapbox/dr-ui": "0.6.0", "@mapbox/flow-remove-types": "^1.3.0-await.upstream.2", "@mapbox/gazetteer": "^3.1.2", "@mapbox/mapbox-gl-rtl-text": "^0.2.1", "@mapbox/mapbox-gl-test-suite": "file:test/integration", "@mapbox/mbx-assembly": "^0.28.2", "@mapbox/mr-ui": "0.5.0", "@octokit/rest": "^15.15.1", "babel-eslint": "^10.0.1", benchmark: "^2.1.4", browserify: "^16.2.3", d3: "^4.12.0", documentation: "~9.1.1", ejs: "^2.5.7", eslint: "^5.15.3", "eslint-config-mourner": "^3.0.0", "eslint-plugin-flowtype": "^3.4.2", "eslint-plugin-html": "^5.0.3", "eslint-plugin-import": "^2.16.0", "eslint-plugin-react": "^7.12.4", "flow-bin": "^0.95.1", "github-slugger": "1.2.1", gl: "~4.1.1", glob: "^7.0.3", "is-builtin-module": "^3.0.0", jsdom: "^13.0.0", "json-stringify-pretty-compact": "^2.0.0", jsonwebtoken: "^8.3.0", "mock-geolocation": "^1.0.11", "npm-run-all": "^4.1.5", nyc: "^13.3.0", "object.entries": "^1.1.0", pirates: "^4.0.1", pngjs: "^3.4.0", "postcss-cli": "^6.1.2", "postcss-inline-svg": "^3.1.1", "pretty-bytes": "^5.1.0", prismjs: "^1.15.0", "prop-types": "^15.6.2", puppeteer: "^1.13.0", "raw-loader": "^1.0.0", react: "^16.7.0", "react-dom": "16.3.3", "react-helmet": "^5.2.0", remark: "^10.0.1", "remark-html": "^9.0.0", "remark-react": "^5.0.1", request: "^2.88.0", rollup: "^1.7.3", "rollup-plugin-buble": "^0.19.6", "rollup-plugin-commonjs": "^9.2.2", "rollup-plugin-json": "^4.0.0", "rollup-plugin-node-resolve": "^4.0.1", "rollup-plugin-replace": "^2.1.1", "rollup-plugin-sourcemaps": "^0.4.2", "rollup-plugin-terser": "^4.0.4", "rollup-plugin-unassert": "^0.2.0", sinon: "^7.3.0", slugg: "^1.2.1", st: "^1.2.2", stylelint: "^9.10.1", "stylelint-config-standard": "^18.2.0", tap: "~12.4.1" }; var browser = { "./src/shaders/index.js": "./src/shaders/shaders.js", "./src/util/window.js": "./src/util/browser/window.js", "./src/util/web_worker.js": "./src/util/browser/web_worker.js" }; var esm = true; var scripts = { "build-dev": "rollup -c --environment BUILD:dev", "watch-dev": "rollup -c --environment BUILD:dev --watch", "build-prod": "rollup -c --environment BUILD:production", "build-prod-min": "rollup -c --environment BUILD:production,MINIFY:true", "build-csp": "rollup -c rollup.config.csp.js", "build-flow-types": "cp build/mapbox-gl.js.flow dist/mapbox-gl.js.flow && cp build/mapbox-gl.js.flow dist/mapbox-gl-dev.js.flow", "build-css": "postcss -o dist/mapbox-gl.css src/css/mapbox-gl.css", "build-style-spec": "cd src/style-spec && npm run build && cd ../.. && mkdir -p dist/style-spec && cp src/style-spec/dist/* dist/style-spec", "watch-css": "postcss --watch -o dist/mapbox-gl.css src/css/mapbox-gl.css", "build-token": "node build/generate-access-token-script.js", "build-benchmarks": "BENCHMARK_VERSION=${BENCHMARK_VERSION:-\"$(git rev-parse --abbrev-ref HEAD) $(git rev-parse --short=7 HEAD)\"} rollup -c bench/versions/rollup_config_benchmarks.js", "watch-benchmarks": "BENCHMARK_VERSION=${BENCHMARK_VERSION:-\"$(git rev-parse --abbrev-ref HEAD) $(git rev-parse --short=7 HEAD)\"} rollup -c bench/rollup_config_benchmarks.js -w", "start-server": "st --no-cache -H 0.0.0.0 --port 9966 --index index.html .", start: "run-p build-token watch-css watch-dev watch-benchmarks start-server", "start-debug": "run-p build-token watch-css watch-dev start-server", "start-bench": "run-p build-token watch-benchmarks start-server", "build-docs": "documentation build --github --format json --config ./docs/documentation.yml --output docs/components/api.json src/index.js && npm run build-images", "build-images": "mkdir -p docs/img/dist && node docs/bin/build-image-config.js && node docs/bin/appropriate-images.js --all", "create-image": "node docs/bin/create-image", build: "run-s build-docs && batfish build # invoked by publisher when publishing docs on the publisher-production branch", "start-docs": "run-s build-prod-min build-css build-docs && DEPLOY_ENV=local batfish start", lint: "eslint --cache --ignore-path .gitignore src test bench docs docs/pages/example/*.html debug/*.html", "lint-docs": "documentation lint src/index.js", "lint-css": "stylelint 'src/css/mapbox-gl.css'", "open-changed-examples": "git diff --name-only publisher-production HEAD -- docs/pages/example/*.html | awk '{print \"http://127.0.0.1:4000/mapbox-gl-js/example/\" substr($0,33,length($0)-37)}' | xargs open", test: "run-s lint lint-css test-flow test-unit", "test-suite": "run-s test-render test-query", "test-suite-clean": "find test/integration/{render,query}-tests -mindepth 2 -type d -exec test -e \"{}/actual.png\" \\; -not \\( -exec test -e \"{}/style.json\" \\; \\) -print | xargs -t rm -r", "test-unit": "build/run-tap --reporter classic --no-coverage test/unit", "test-build": "build/run-tap --no-coverage test/build/**/*.test.js", "test-render": "node --max-old-space-size=2048 test/render.test.js", "test-query": "node test/query.test.js", "test-expressions": "build/run-node test/expression.test.js", "test-flow": "build/run-node build/generate-flow-typed-style-spec && flow .", "test-cov": "nyc --require=@mapbox/flow-remove-types/register --reporter=text-summary --reporter=lcov --cache run-s test-unit test-expressions test-query test-render", prepublishOnly: "run-s build-flow-types build-dev build-prod-min build-prod build-csp build-css build-style-spec test-build", codegen: "build/run-node build/generate-style-code.js && build/run-node build/generate-struct-arrays.js" }; var files = [ "build/", "dist/", "flow-typed/", "src/", ".flowconfig" ]; var _package = { name: name, description: description, version: version, main: main, style: style, license: license, repository: repository, engines: engines, dependencies: dependencies, devDependencies: devDependencies, browser: browser, esm: esm, scripts: scripts, files: files }; /* * Copyright (C) 2008 Apple Inc. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Ported from Webkit * http://svn.webkit.org/repository/webkit/trunk/Source/WebCore/platform/graphics/UnitBezier.h */ var unitbezier = UnitBezier; function UnitBezier(p1x, p1y, p2x, p2y) { // Calculate the polynomial coefficients, implicit first and last control points are (0,0) and (1,1). this.cx = 3.0 * p1x; this.bx = 3.0 * (p2x - p1x) - this.cx; this.ax = 1.0 - this.cx - this.bx; this.cy = 3.0 * p1y; this.by = 3.0 * (p2y - p1y) - this.cy; this.ay = 1.0 - this.cy - this.by; this.p1x = p1x; this.p1y = p2y; this.p2x = p2x; this.p2y = p2y; } UnitBezier.prototype.sampleCurveX = function(t) { // `ax t^3 + bx t^2 + cx t' expanded using Horner's rule. return ((this.ax * t + this.bx) * t + this.cx) * t; }; UnitBezier.prototype.sampleCurveY = function(t) { return ((this.ay * t + this.by) * t + this.cy) * t; }; UnitBezier.prototype.sampleCurveDerivativeX = function(t) { return (3.0 * this.ax * t + 2.0 * this.bx) * t + this.cx; }; UnitBezier.prototype.solveCurveX = function(x, epsilon) { if (typeof epsilon === 'undefined') { epsilon = 1e-6; } var t0, t1, t2, x2, i; // First try a few iterations of Newton's method -- normally very fast. for (t2 = x, i = 0; i < 8; i++) { x2 = this.sampleCurveX(t2) - x; if (Math.abs(x2) < epsilon) { return t2; } var d2 = this.sampleCurveDerivativeX(t2); if (Math.abs(d2) < 1e-6) { break; } t2 = t2 - x2 / d2; } // Fall back to the bisection method for reliability. t0 = 0.0; t1 = 1.0; t2 = x; if (t2 < t0) { return t0; } if (t2 > t1) { return t1; } while (t0 < t1) { x2 = this.sampleCurveX(t2); if (Math.abs(x2 - x) < epsilon) { return t2; } if (x > x2) { t0 = t2; } else { t1 = t2; } t2 = (t1 - t0) * 0.5 + t0; } // Failure. return t2; }; UnitBezier.prototype.solve = function(x, epsilon) { return this.sampleCurveY(this.solveCurveX(x, epsilon)); }; 'use strict'; var pointGeometry = Point; /** * A standalone point geometry with useful accessor, comparison, and * modification methods. * * @class Point * @param {Number} x the x-coordinate. this could be longitude or screen * pixels, or any other sort of unit. * @param {Number} y the y-coordinate. this could be latitude or screen * pixels, or any other sort of unit. * @example * var point = new Point(-77, 38); */ function Point(x, y) { this.x = x; this.y = y; } Point.prototype = { /** * Clone this point, returning a new point that can be modified * without affecting the old one. * @return {Point} the clone */ clone: function() { return new Point(this.x, this.y); }, /** * Add this point's x & y coordinates to another point, * yielding a new point. * @param {Point} p the other point * @return {Point} output point */ add: function(p) { return this.clone()._add(p); }, /** * Subtract this point's x & y coordinates to from point, * yielding a new point. * @param {Point} p the other point * @return {Point} output point */ sub: function(p) { return this.clone()._sub(p); }, /** * Multiply this point's x & y coordinates by point, * yielding a new point. * @param {Point} p the other point * @return {Point} output point */ multByPoint: function(p) { return this.clone()._multByPoint(p); }, /** * Divide this point's x & y coordinates by point, * yielding a new point. * @param {Point} p the other point * @return {Point} output point */ divByPoint: function(p) { return this.clone()._divByPoint(p); }, /** * Multiply this point's x & y coordinates by a factor, * yielding a new point. * @param {Point} k factor * @return {Point} output point */ mult: function(k) { return this.clone()._mult(k); }, /** * Divide this point's x & y coordinates by a factor, * yielding a new point. * @param {Point} k factor * @return {Point} output point */ div: function(k) { return this.clone()._div(k); }, /** * Rotate this point around the 0, 0 origin by an angle a, * given in radians * @param {Number} a angle to rotate around, in radians * @return {Point} output point */ rotate: function(a) { return this.clone()._rotate(a); }, /** * Rotate this point around p point by an angle a, * given in radians * @param {Number} a angle to rotate around, in radians * @param {Point} p Point to rotate around * @return {Point} output point */ rotateAround: function(a,p) { return this.clone()._rotateAround(a,p); }, /** * Multiply this point by a 4x1 transformation matrix * @param {Array} m transformation matrix * @return {Point} output point */ matMult: function(m) { return this.clone()._matMult(m); }, /** * Calculate this point but as a unit vector from 0, 0, meaning * that the distance from the resulting point to the 0, 0 * coordinate will be equal to 1 and the angle from the resulting * point to the 0, 0 coordinate will be the same as before. * @return {Point} unit vector point */ unit: function() { return this.clone()._unit(); }, /** * Compute a perpendicular point, where the new y coordinate * is the old x coordinate and the new x coordinate is the old y * coordinate multiplied by -1 * @return {Point} perpendicular point */ perp: function() { return this.clone()._perp(); }, /** * Return a version of this point with the x & y coordinates * rounded to integers. * @return {Point} rounded point */ round: function() { return this.clone()._round(); }, /** * Return the magitude of this point: this is the Euclidean * distance from the 0, 0 coordinate to this point's x and y * coordinates. * @return {Number} magnitude */ mag: function() { return Math.sqrt(this.x * this.x + this.y * this.y); }, /** * Judge whether this point is equal to another point, returning * true or false. * @param {Point} other the other point * @return {boolean} whether the points are equal */ equals: function(other) { return this.x === other.x && this.y === other.y; }, /** * Calculate the distance from this point to another point * @param {Point} p the other point * @return {Number} distance */ dist: function(p) { return Math.sqrt(this.distSqr(p)); }, /** * Calculate the distance from this point to another point, * without the square root step. Useful if you're comparing * relative distances. * @param {Point} p the other point * @return {Number} distance */ distSqr: function(p) { var dx = p.x - this.x, dy = p.y - this.y; return dx * dx + dy * dy; }, /** * Get the angle from the 0, 0 coordinate to this point, in radians * coordinates. * @return {Number} angle */ angle: function() { return Math.atan2(this.y, this.x); }, /** * Get the angle from this point to another point, in radians * @param {Point} b the other point * @return {Number} angle */ angleTo: function(b) { return Math.atan2(this.y - b.y, this.x - b.x); }, /** * Get the angle between this point and another point, in radians * @param {Point} b the other point * @return {Number} angle */ angleWith: function(b) { return this.angleWithSep(b.x, b.y); }, /* * Find the angle of the two vectors, solving the formula for * the cross product a x b = |a||b|sin(θ) for θ. * @param {Number} x the x-coordinate * @param {Number} y the y-coordinate * @return {Number} the angle in radians */ angleWithSep: function(x, y) { return Math.atan2( this.x * y - this.y * x, this.x * x + this.y * y); }, _matMult: function(m) { var x = m[0] * this.x + m[1] * this.y, y = m[2] * this.x + m[3] * this.y; this.x = x; this.y = y; return this; }, _add: function(p) { this.x += p.x; this.y += p.y; return this; }, _sub: function(p) { this.x -= p.x; this.y -= p.y; return this; }, _mult: function(k) { this.x *= k; this.y *= k; return this; }, _div: function(k) { this.x /= k; this.y /= k; return this; }, _multByPoint: function(p) { this.x *= p.x; this.y *= p.y; return this; }, _divByPoint: function(p) { this.x /= p.x; this.y /= p.y; return this; }, _unit: function() { this._div(this.mag()); return this; }, _perp: function() { var y = this.y; this.y = this.x; this.x = -y; return this; }, _rotate: function(angle) { var cos = Math.cos(angle), sin = Math.sin(angle), x = cos * this.x - sin * this.y, y = sin * this.x + cos * this.y; this.x = x; this.y = y; return this; }, _rotateAround: function(angle, p) { var cos = Math.cos(angle), sin = Math.sin(angle), x = p.x + cos * (this.x - p.x) - sin * (this.y - p.y), y = p.y + sin * (this.x - p.x) + cos * (this.y - p.y); this.x = x; this.y = y; return this; }, _round: function() { this.x = Math.round(this.x); this.y = Math.round(this.y); return this; } }; /** * Construct a point from an array if necessary, otherwise if the input * is already a Point, or an unknown type, return it unchanged * @param {Array|Point|*} a any kind of input value * @return {Point} constructed point, or passed-through value. * @example * // this * var point = Point.convert([0, 1]); * // is equivalent to * var point = new Point(0, 1); */ Point.convert = function (a) { if (a instanceof Point) { return a; } if (Array.isArray(a)) { return new Point(a[0], a[1]); } return a; }; // // /** * Deeply compares two object literals. * * @private */ function deepEqual(a , b ) { if (Array.isArray(a)) { if (!Array.isArray(b) || a.length !== b.length) { return false; } for (var i = 0; i < a.length; i++) { if (!deepEqual(a[i], b[i])) { return false; } } return true; } if (typeof a === 'object' && a !== null && b !== null) { if (!(typeof b === 'object')) { return false; } var keys = Object.keys(a); if (keys.length !== Object.keys(b).length) { return false; } for (var key in a) { if (!deepEqual(a[key], b[key])) { return false; } } return true; } return a === b; } // /** * @module util * @private */ /** * Given a value `t` that varies between 0 and 1, return * an interpolation function that eases between 0 and 1 in a pleasing * cubic in-out fashion. * * @private */ function easeCubicInOut(t ) { if (t <= 0) { return 0; } if (t >= 1) { return 1; } var t2 = t * t, t3 = t2 * t; return 4 * (t < 0.5 ? t3 : 3 * (t - t2) + t3 - 0.75); } /** * Given given (x, y), (x1, y1) control points for a bezier curve, * return a function that interpolates along that curve. * * @param p1x control point 1 x coordinate * @param p1y control point 1 y coordinate * @param p2x control point 2 x coordinate * @param p2y control point 2 y coordinate * @private */ function bezier(p1x , p1y , p2x , p2y ) { var bezier = new unitbezier(p1x, p1y, p2x, p2y); return function(t ) { return bezier.solve(t); }; } /** * A default bezier-curve powered easing function with * control points (0.25, 0.1) and (0.25, 1) * * @private */ var ease = bezier(0.25, 0.1, 0.25, 1); /** * constrain n to the given range via min + max * * @param n value * @param min the minimum value to be returned * @param max the maximum value to be returned * @returns the clamped value * @private */ function clamp(n , min , max ) { return Math.min(max, Math.max(min, n)); } /** * constrain n to the given range, excluding the minimum, via modular arithmetic * * @param n value * @param min the minimum value to be returned, exclusive * @param max the maximum value to be returned, inclusive * @returns constrained number * @private */ function wrap(n , min , max ) { var d = max - min; var w = ((n - min) % d + d) % d + min; return (w === min) ? max : w; } /* * Call an asynchronous function on an array of arguments, * calling `callback` with the completed results of all calls. * * @param array input to each call of the async function. * @param fn an async function with signature (data, callback) * @param callback a callback run after all async work is done. * called with an array, containing the results of each async call. * @private */ function asyncAll ( array , fn , callback ) { if (!array.length) { return callback(null, []); } var remaining = array.length; var results = new Array(array.length); var error = null; array.forEach(function (item, i) { fn(item, function (err, result) { if (err) { error = err; } results[i] = ((result ) ); // https://github.com/facebook/flow/issues/2123 if (--remaining === 0) { callback(error, results); } }); }); } /* * Polyfill for Object.values. Not fully spec compliant, but we don't * need it to be. * * @private */ function values (obj ) { var result = []; for (var k in obj) { result.push(obj[k]); } return result; } /* * Compute the difference between the keys in one object and the keys * in another object. * * @returns keys difference * @private */ function keysDifference (obj , other ) { var difference = []; for (var i in obj) { if (!(i in other)) { difference.push(i); } } return difference; } /** * Given a destination object and optionally many source objects, * copy all properties from the source objects into the destination. * The last source object given overrides properties from previous * source objects. * * @param dest destination object * @param sources sources from which properties are pulled * @private */ function extend(dest ) { var sources = [], len = arguments.length - 1; while ( len-- > 0 ) sources[ len ] = arguments[ len + 1 ]; for (var i = 0, list = sources; i < list.length; i += 1) { var src = list[i]; for (var k in src) { dest[k] = src[k]; } } return dest; } /** * Given an object and a number of properties as strings, return version * of that object with only those properties. * * @param src the object * @param properties an array of property names chosen * to appear on the resulting object. * @returns object with limited properties. * @example * var foo = { name: 'Charlie', age: 10 }; * var justName = pick(foo, ['name']); * // justName = { name: 'Charlie' } * @private */ function pick(src , properties ) { var result = {}; for (var i = 0; i < properties.length; i++) { var k = properties[i]; if (k in src) { result[k] = src[k]; } } return result; } var id = 1; /** * Return a unique numeric id, starting at 1 and incrementing with * each call. * * @returns unique numeric id. * @private */ function uniqueId() { return id++; } /** * Return a random UUID (v4). Taken from: https://gist.github.com/jed/982883 * @private */ function uuid() { function b(a) { return a ? (a ^ Math.random() * 16 >> a / 4).toString(16) : //$FlowFixMe: Flow doesn't like the implied array literal conversion here ([1e7] + -[1e3] + -4e3 + -8e3 + -1e11).replace(/[018]/g, b); } return b(); } /** * Validate a string to match UUID(v4) of the * form: xxxxxxxx-xxxx-4xxx-[89ab]xxx-xxxxxxxxxxxx * @param str string to validate. * @private */ function validateUuid(str ) { return str ? /^[0-9a-f]{8}-[0-9a-f]{4}-[4][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(str) : false; } /** * Given an array of member function names as strings, replace all of them * with bound versions that will always refer to `context` as `this`. This * is useful for classes where otherwise event bindings would reassign * `this` to the evented object or some other value: this lets you ensure * the `this` value always. * * @param fns list of member function names * @param context the context value * @example * function MyClass() { * bindAll(['ontimer'], this); * this.name = 'Tom'; * } * MyClass.prototype.ontimer = function() { * alert(this.name); * }; * var myClass = new MyClass(); * setTimeout(myClass.ontimer, 100); * @private */ function bindAll(fns , context ) { fns.forEach(function (fn) { if (!context[fn]) { return; } context[fn] = context[fn].bind(context); }); } /** * Determine if a string ends with a particular substring * * @private */ function endsWith(string , suffix ) { return string.indexOf(suffix, string.length - suffix.length) !== -1; } /** * Create an object by mapping all the values of an existing object while * preserving their keys. * * @private */ function mapObject(input , iterator , context ) { var output = {}; for (var key in input) { output[key] = iterator.call(context || this, input[key], key, input); } return output; } /** * Create an object by filtering out values of an existing object. * * @private */ function filterObject(input , iterator , context ) { var output = {}; for (var key in input) { if (iterator.call(context || this, input[key], key, input)) { output[key] = input[key]; } } return output; } /** * Deeply clones two objects. * * @private */ function clone (input ) { if (Array.isArray(input)) { return input.map(clone); } else if (typeof input === 'object' && input) { return ((mapObject(input, clone) ) ); } else { return input; } } /** * Check if two arrays have at least one common element. * * @private */ function arraysIntersect (a , b ) { for (var l = 0; l < a.length; l++) { if (b.indexOf(a[l]) >= 0) { return true; } } return false; } /** * Print a warning message to the console and ensure duplicate warning messages * are not printed. * * @private */ var warnOnceHistory = {}; function warnOnce(message ) { if (!warnOnceHistory[message]) { // console isn't defined in some WebWorkers, see #2558 if (typeof console !== "undefined") { console.warn(message); } warnOnceHistory[message] = true; } } /** * Indicates if the provided Points are in a counter clockwise (true) or clockwise (false) order * * @private * @returns true for a counter clockwise set of points */ // http://bryceboe.com/2006/10/23/line-segment-intersection-algorithm/ function isCounterClockwise(a , b , c ) { return (c.y - a.y) * (b.x - a.x) > (b.y - a.y) * (c.x - a.x); } /** * Returns the signed area for the polygon ring. Postive areas are exterior rings and * have a clockwise winding. Negative areas are interior rings and have a counter clockwise * ordering. * * @private * @param ring Exterior or interior ring */ function calculateSignedArea(ring ) { var sum = 0; for (var i = 0, len = ring.length, j = len - 1, p1 = (void 0), p2 = (void 0); i < len; j = i++) { p1 = ring[i]; p2 = ring[j]; sum += (p2.x - p1.x) * (p1.y + p2.y); } return sum; } /** * Detects closed polygons, first + last point are equal * * @private * @param points array of points * @return true if the points are a closed polygon */ function isClosedPolygon(points ) { // If it is 2 points that are the same then it is a point // If it is 3 points with start and end the same then it is a line if (points.length < 4) { return false; } var p1 = points[0]; var p2 = points[points.length - 1]; if (Math.abs(p1.x - p2.x) > 0 || Math.abs(p1.y - p2.y) > 0) { return false; } // polygon simplification can produce polygons with zero area and more than 3 points return Math.abs(calculateSignedArea(points)) > 0.01; } /** * Converts spherical coordinates to cartesian coordinates. * * @private * @param spherical Spherical coordinates, in [radial, azimuthal, polar] * @return cartesian coordinates in [x, y, z] */ function sphericalToCartesian(ref ) { var r = ref[0]; var azimuthal = ref[1]; var polar = ref[2]; // We abstract "north"/"up" (compass-wise) to be 0° when really this is 90° (π/2): // correct for that here azimuthal += 90; // Convert azimuthal and polar angles to radians azimuthal *= Math.PI / 180; polar *= Math.PI / 180; return { x: r * Math.cos(azimuthal) * Math.sin(polar), y: r * Math.sin(azimuthal) * Math.sin(polar), z: r * Math.cos(polar) }; } /** * Parses data from 'Cache-Control' headers. * * @private * @param cacheControl Value of 'Cache-Control' header * @return object containing parsed header info. */ function parseCacheControl(cacheControl ) { // Taken from [Wreck](https://github.com/hapijs/wreck) var re = /(?:^|(?:\s*\,\s*))([^\x00-\x20\(\)<>@\,;\:\\"\/\[\]\?\=\{\}\x7F]+)(?:\=(?:([^\x00-\x20\(\)<>@\,;\:\\"\/\[\]\?\=\{\}\x7F]+)|(?:\"((?:[^"\\]|\\.)*)\")))?/g; var header = {}; cacheControl.replace(re, function ($0, $1, $2, $3) { var value = $2 || $3; header[$1] = value ? value.toLowerCase() : true; return ''; }); if (header['max-age']) { var maxAge = parseInt(header['max-age'], 10); if (isNaN(maxAge)) { delete header['max-age']; } else { header['max-age'] = maxAge; } } return header; } function storageAvailable(type ) { try { var storage = self[type]; storage.setItem('_mapbox_test_', 1); storage.removeItem('_mapbox_test_'); return true; } catch (e) { return false; } } // The following methods are from https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding#The_Unicode_Problem //Unicode compliant base64 encoder for strings function b64EncodeUnicode(str ) { return self.btoa( encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, function (match, p1) { return String.fromCharCode(Number('0x' + p1)); //eslint-disable-line } ) ); } // Unicode compliant decoder for base64-encoded strings function b64DecodeUnicode(str ) { return decodeURIComponent(self.atob(str).split('').map(function (c) { return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2); //eslint-disable-line }).join('')); } // var now = self.performance && self.performance.now ? self.performance.now.bind(self.performance) : Date.now.bind(Date); var raf = self.requestAnimationFrame || self.mozRequestAnimationFrame || self.webkitRequestAnimationFrame || self.msRequestAnimationFrame; var cancel = self.cancelAnimationFrame || self.mozCancelAnimationFrame || self.webkitCancelAnimationFrame || self.msCancelAnimationFrame; var linkEl; /** * @private */ var exported = { /** * Provides a function that outputs milliseconds: either performance.now() * or a fallback to Date.now() */ now: now, frame: function frame(fn ) { var frame = raf(fn); return { cancel: function () { return cancel(frame); } }; }, getImageData: function getImageData(img ) { var canvas = self.document.createElement('canvas'); var context = canvas.getContext('2d'); if (!context) { throw new Error('failed to create canvas 2d context'); } canvas.width = img.width; canvas.height = img.height; context.drawImage(img, 0, 0, img.width, img.height); return context.getImageData(0, 0, img.width, img.height); }, resolveURL: function resolveURL(path ) { if (!linkEl) { linkEl = self.document.createElement('a'); } linkEl.href = path; return linkEl.href; }, hardwareConcurrency: self.navigator.hardwareConcurrency || 4, get devicePixelRatio() { return self.devicePixelRatio; } }; // var config = { API_URL: 'https://api.mapbox.com', get EVENTS_URL() { if (!this.API_URL) { return null; } if (this.API_URL.indexOf('https://api.mapbox.cn') === 0) { return 'https://events.mapbox.cn/events/v2'; } else if (this.API_URL.indexOf('https://api.mapbox.com') === 0) { return 'https://events.mapbox.com/events/v2'; } else { return null; } }, FEEDBACK_URL: 'https://apps.mapbox.com/feedback', REQUIRE_ACCESS_TOKEN: true, ACCESS_TOKEN: null, MAX_PARALLEL_IMAGE_REQUESTS: 16 }; // var exported$1 = { supported: false, testSupport: testSupport }; var glForTesting; var webpCheckComplete = false; var webpImgTest; var webpImgTestOnloadComplete = false; if (self.document) { webpImgTest = self.document.createElement('img'); webpImgTest.onload = function() { if (glForTesting) { testWebpTextureUpload(glForTesting); } glForTesting = null; webpImgTestOnloadComplete = true; }; webpImgTest.onerror = function() { webpCheckComplete = true; glForTesting = null; }; webpImgTest.src = 'data:image/webp;base64,UklGRh4AAABXRUJQVlA4TBEAAAAvAQAAAAfQ//73v/+BiOh/AAA='; } function testSupport(gl ) { if (webpCheckComplete || !webpImgTest) { return; } // HTMLImageElement.complete is set when an image is done loading it's source // regardless of whether the load was successful or not. // It's possible for an error to set HTMLImageElement.complete to true which would trigger // testWebpTextureUpload and mistakenly set exported.supported to true in browsers which don't support webp // To avoid this, we set a flag in the image's onload handler and only call testWebpTextureUpload // after a successful image load event. if (webpImgTestOnloadComplete) { testWebpTextureUpload(gl); } else { glForTesting = gl; } } function testWebpTextureUpload(gl ) { // Edge 18 supports WebP but not uploading a WebP image to a gl texture // Test support for this before allowing WebP images. // https://github.com/mapbox/mapbox-gl-js/issues/7671 var texture = gl.createTexture(); gl.bindTexture(gl.TEXTURE_2D, texture); try { gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, webpImgTest); // The error does not get triggered in Edge if the context is lost if (gl.isContextLost()) { return; } exported$1.supported = true; } catch (e) { // Catch "Unspecified Error." in Edge 18. } gl.deleteTexture(texture); webpCheckComplete = true; } // /***** START WARNING - IF YOU USE THIS CODE WITH MAPBOX MAPPING APIS, REMOVAL OR * MODIFICATION OF THE FOLLOWING CODE VIOLATES THE MAPBOX TERMS OF SERVICE ****** * The following code is used to access Mapbox's Mapping APIs. Removal or modification * of this code when used with Mapbox's Mapping APIs can result in higher fees and/or * termination of your account with Mapbox. * * Under the Mapbox Terms of Service, you may not use this code to access Mapbox * Mapping APIs other than through Mapbox SDKs. * * The Mapping APIs documentation is available at https://docs.mapbox.com/api/maps/#maps * and the Mapbox Terms of Service are available at https://www.mapbox.com/tos/ ******************************************************************************/ var SKU_ID = '01'; function createSkuToken() { // SKU_ID and TOKEN_VERSION are specified by an internal schema and should not change var TOKEN_VERSION = '1'; var base62chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; // sessionRandomizer is a randomized 10-digit base-62 number var sessionRandomizer = ''; for (var i = 0; i < 10; i++) { sessionRandomizer += base62chars[Math.floor(Math.random() * 62)]; } var expiration = 12 * 60 * 60 * 1000; // 12 hours var token = [TOKEN_VERSION, SKU_ID, sessionRandomizer].join(''); var tokenExpiresAt = Date.now() + expiration; return { token: token, tokenExpiresAt: tokenExpiresAt }; } /***** END WARNING - REMOVAL OR MODIFICATION OF THE PRECEDING CODE VIOLATES THE MAPBOX TERMS OF SERVICE ******/ // var RequestManager = function RequestManager(transformRequestFn ) { this._transformRequestFn = transformRequestFn; this._createSkuToken(); }; RequestManager.prototype._createSkuToken = function _createSkuToken () { var skuToken = createSkuToken(); this._skuToken = skuToken.token; this._skuTokenExpiresAt = skuToken.tokenExpiresAt; }; RequestManager.prototype._isSkuTokenExpired = function _isSkuTokenExpired () { return Date.now() > this._skuTokenExpiresAt; }; RequestManager.prototype.transformRequest = function transformRequest (url , type ) { if (this._transformRequestFn) { return this._transformRequestFn(url, type) || {url: url}; } return {url: url}; }; RequestManager.prototype.normalizeStyleURL = function normalizeStyleURL$1 (url , accessToken ) { return normalizeStyleURL(url, accessToken); }; RequestManager.prototype.normalizeGlyphsURL = function normalizeGlyphsURL$1 (url , accessToken ) { return normalizeGlyphsURL(url, accessToken); }; RequestManager.prototype.normalizeSourceURL = function normalizeSourceURL$1 (url , accessToken ) { return normalizeSourceURL(url, accessToken); }; RequestManager.prototype.normalizeSpriteURL = function normalizeSpriteURL$1 (url , format , extension , accessToken ) { return normalizeSpriteURL(url, format, extension, accessToken); }; RequestManager.prototype.normalizeTileURL = function normalizeTileURL$1 (tileURL , sourceURL , tileSize ) { if (this._isSkuTokenExpired()) { this._createSkuToken(); } return normalizeTileURL(tileURL, sourceURL, tileSize, this._skuToken); }; RequestManager.prototype.canonicalizeTileURL = function canonicalizeTileURL$1 (url ) { return canonicalizeTileURL(url); }; RequestManager.prototype.canonicalizeTileset = function canonicalizeTileset$1 (tileJSON , sourceURL ) { return canonicalizeTileset(tileJSON, sourceURL); }; var help = 'See https://www.mapbox.com/api-documentation/#access-tokens-and-token-scopes'; function makeAPIURL(urlObject , accessToken ) { var apiUrlObject = parseUrl(config.API_URL); urlObject.protocol = apiUrlObject.protocol; urlObject.authority = apiUrlObject.authority; if (apiUrlObject.path !== '/') { urlObject.path = "" + (apiUrlObject.path) + (urlObject.path); } if (!config.REQUIRE_ACCESS_TOKEN) { return formatUrl(urlObject); } accessToken = accessToken || config.ACCESS_TOKEN; if (!accessToken) { throw new Error(("An API access token is required to use Mapbox GL. " + help)); } if (accessToken[0] === 's') { throw new Error(("Use a public access token (pk.*) with Mapbox GL, not a secret access token (sk.*). " + help)); } urlObject.params.push(("access_token=" + accessToken)); return formatUrl(urlObject); } function isMapboxURL(url ) { return url.indexOf('mapbox:') === 0; } var mapboxHTTPURLRe = /^((https?:)?\/\/)?([^\/]+\.)?mapbox\.c(n|om)(\/|\?|$)/i; function isMapboxHTTPURL(url ) { return mapboxHTTPURLRe.test(url); } var normalizeStyleURL = function(url , accessToken ) { if (!isMapboxURL(url)) { return url; } var urlObject = parseUrl(url); urlObject.path = "/styles/v1" + (urlObject.path); return makeAPIURL(urlObject, accessToken); }; var normalizeGlyphsURL = function(url , accessToken ) { if (!isMapboxURL(url)) { return url; } var urlObject = parseUrl(url); urlObject.path = "/fonts/v1" + (urlObject.path); return makeAPIURL(urlObject, accessToken); }; var normalizeSourceURL = function(url , accessToken ) { if (!isMapboxURL(url)) { return url; } var urlObject = parseUrl(url); urlObject.path = "/v4/" + (urlObject.authority) + ".json"; // TileJSON requests need a secure flag appended to their URLs so // that the server knows to send SSL-ified resource references. urlObject.params.push('secure'); return makeAPIURL(urlObject, accessToken); }; var normalizeSpriteURL = function(url , format , extension , accessToken ) { var urlObject = parseUrl(url); if (!isMapboxURL(url)) { urlObject.path += "" + format + extension; return formatUrl(urlObject); } urlObject.path = "/styles/v1" + (urlObject.path) + "/sprite" + format + extension; return makeAPIURL(urlObject, accessToken); }; var imageExtensionRe = /(\.(png|jpg)\d*)(?=$)/; var normalizeTileURL = function(tileURL , sourceURL , tileSize , skuToken ) { if (!sourceURL || !isMapboxURL(sourceURL)) { return tileURL; } var urlObject = parseUrl(tileURL); // The v4 mapbox tile API supports 512x512 image tiles only when @2x // is appended to the tile URL. If `tileSize: 512` is specified for // a Mapbox raster source force the @2x suffix even if a non hidpi device. var suffix = exported.devicePixelRatio >= 2 || tileSize === 512 ? '@2x' : ''; var extension = exported$1.supported ? '.webp' : '$1'; urlObject.path = urlObject.path.replace(imageExtensionRe, ("" + suffix + extension)); urlObject.path = "/v4" + (urlObject.path); if (config.REQUIRE_ACCESS_TOKEN && config.ACCESS_TOKEN && skuToken) { urlObject.params.push(("sku=" + skuToken)); } return makeAPIURL(urlObject); }; // matches any file extension specified by a dot and one or more alphanumeric characters var extensionRe = /\.[\w]+$/; var canonicalizeTileURL = function(url ) { var version = "/v4/"; var urlObject = parseUrl(url); // Make sure that we are dealing with a valid Mapbox tile URL. // Has to begin with /v4/, with a valid filename + extension if (!urlObject.path.match(/(^\/v4\/)/) || !urlObject.path.match(extensionRe)) { // Not a proper Mapbox tile URL. return url; } // Reassemble the canonical URL from the parts we've parsed before. var result = "mapbox://tiles/"; result += urlObject.path.replace(version, ''); // Append the query string, minus the access token parameter. var params = urlObject.params.filter(function (p) { return !p.match(/^access_token=/); }); if (params.length) { result += "?" + (params.join('&')); } return result; }; var canonicalizeTileset = function(tileJSON , sourceURL ) { if (!isMapboxURL(sourceURL)) { return tileJSON.tiles || []; } var canonical = []; for (var i = 0, list = tileJSON.tiles; i < list.length; i += 1) { var url = list[i]; var canonicalUrl = canonicalizeTileURL(url); canonical.push(canonicalUrl); } return canonical; }; var urlRe = /^(\w+):\/\/([^/?]*)(\/[^?]+)?\??(.+)?/; function parseUrl(url ) { var parts = url.match(urlRe); if (!parts) { throw new Error('Unable to parse URL object'); } return { protocol: parts[1], authority: parts[2], path: parts[3] || '/', params: parts[4] ? parts[4].split('&') : [] }; } function formatUrl(obj ) { var params = obj.params.length ? ("?" + (obj.params.join('&'))) : ''; return ((obj.protocol) + "://" + (obj.authority) + (obj.path) + params); } var telemEventKey = 'mapbox.eventData'; function parseAccessToken(accessToken ) { if (!accessToken) { return null; } var parts = accessToken.split('.'); if (!parts || parts.length !== 3) { return null; } try { var jsonData = JSON.parse(b64DecodeUnicode(parts[1])); return jsonData; } catch (e) { return null; } } var TelemetryEvent = function TelemetryEvent(type ) { this.type = type; this.anonId = null; this.eventData = {}; this.queue = []; this.pendingRequest = null; }; TelemetryEvent.prototype.getStorageKey = function getStorageKey (domain ) { var tokenData = parseAccessToken(config.ACCESS_TOKEN); var u = ''; if (tokenData && tokenData['u']) { u = b64EncodeUnicode(tokenData['u']); } else { u = config.ACCESS_TOKEN || ''; } return domain ? (telemEventKey + "." + domain + ":" + u) : (telemEventKey + ":" + u); }; TelemetryEvent.prototype.fetchEventData = function fetchEventData () { var isLocalStorageAvailable = storageAvailable('localStorage'); var storageKey = this.getStorageKey(); var uuidKey = this.getStorageKey('uuid'); if (isLocalStorageAvailable) { //Retrieve cached data try { var data = self.localStorage.getItem(storageKey); if (data) { this.eventData = JSON.parse(data); } var uuid = self.localStorage.getItem(uuidKey); if (uuid) { this.anonId = uuid; } } catch (e) { warnOnce('Unable to read from LocalStorage'); } } }; TelemetryEvent.prototype.saveEventData = function saveEventData () { var isLocalStorageAvailable = storageAvailable('localStorage'); var storageKey = this.getStorageKey(); var uuidKey = this.getStorageKey('uuid'); if (isLocalStorageAvailable) { try { self.localStorage.setItem(uuidKey, this.anonId); if (Object.keys(this.eventData).length >= 1) { self.localStorage.setItem(storageKey, JSON.stringify(this.eventData)); } } catch (e) { warnOnce('Unable to write to LocalStorage'); } } }; TelemetryEvent.prototype.processRequests = function processRequests () {}; /* * If any event data should be persisted after the POST request, the callback should modify eventData` * to the values that should be saved. For this reason, the callback should be invoked prior to the call * to TelemetryEvent#saveData */ TelemetryEvent.prototype.postEvent = function postEvent (timestamp , additionalPayload , callback ) { var this$1 = this; if (!config.EVENTS_URL) { return; } var eventsUrlObject = parseUrl(config.EVENTS_URL); eventsUrlObject.params.push(("access_token=" + (config.ACCESS_TOKEN || ''))); var payload = { event: this.type, created: new Date(timestamp).toISOString(), sdkIdentifier: 'mapbox-gl-js', sdkVersion: version, skuId: SKU_ID, userId: this.anonId }; var finalPayload = additionalPayload ? extend(payload, additionalPayload) : payload; var request = { url: formatUrl(eventsUrlObject), headers: { 'Content-Type': 'text/plain' //Skip the pre-flight OPTIONS request }, body: JSON.stringify([finalPayload]) }; this.pendingRequest = postData(request, function (error) { this$1.pendingRequest = null; callback(error); this$1.saveEventData(); this$1.processRequests(); }); }; TelemetryEvent.prototype.queueRequest = function queueRequest (event ) { this.queue.push(event); this.processRequests(); }; var MapLoadEvent = /*@__PURE__*/(function (TelemetryEvent) { function MapLoadEvent() { TelemetryEvent.call(this, 'map.load'); this.success = {}; this.skuToken = ''; } if ( TelemetryEvent ) MapLoadEvent.__proto__ = TelemetryEvent; MapLoadEvent.prototype = Object.create( TelemetryEvent && TelemetryEvent.prototype ); MapLoadEvent.prototype.constructor = MapLoadEvent; MapLoadEvent.prototype.postMapLoadEvent = function postMapLoadEvent (tileUrls , mapId , skuToken ) { //Enabled only when Mapbox Access Token is set and a source uses // mapbox tiles. this.skuToken = skuToken; if (config.EVENTS_URL && config.ACCESS_TOKEN && Array.isArray(tileUrls) && tileUrls.some(function (url) { return isMapboxURL(url) || isMapboxHTTPURL(url); })) { this.queueRequest({id: mapId, timestamp: Date.now()}); } }; MapLoadEvent.prototype.processRequests = function processRequests () { var this$1 = this; if (this.pendingRequest || this.queue.length === 0) { return; } var ref = this.queue.shift(); var id = ref.id; var timestamp = ref.timestamp; // Only one load event should fire per map if (id && this.success[id]) { return; } if (!this.anonId) { this.fetchEventData(); } if (!validateUuid(this.anonId)) { this.anonId = uuid(); } this.postEvent(timestamp, {skuToken: this.skuToken}, function (err) { if (!err) { if (id) { this$1.success[id] = true; } } }); }; return MapLoadEvent; }(TelemetryEvent)); var TurnstileEvent = /*@__PURE__*/(function (TelemetryEvent) { function TurnstileEvent() { TelemetryEvent.call(this, 'appUserTurnstile'); } if ( TelemetryEvent ) TurnstileEvent.__proto__ = TelemetryEvent; TurnstileEvent.prototype = Object.create( TelemetryEvent && TelemetryEvent.prototype ); TurnstileEvent.prototype.constructor = TurnstileEvent; TurnstileEvent.prototype.postTurnstileEvent = function postTurnstileEvent (tileUrls ) { //Enabled only when Mapbox Access Token is set and a source uses // mapbox tiles. if (config.EVENTS_URL && config.ACCESS_TOKEN && Array.isArray(tileUrls) && tileUrls.some(function (url) { return isMapboxURL(url) || isMapboxHTTPURL(url); })) { this.queueRequest(Date.now()); } }; TurnstileEvent.prototype.processRequests = function processRequests () { var this$1 = this; if (this.pendingRequest || this.queue.length === 0) { return; } if (!this.anonId || !this.eventData.lastSuccess || !this.eventData.tokenU) { //Retrieve cached data this.fetchEventData(); } var tokenData = parseAccessToken(config.ACCESS_TOKEN); var tokenU = tokenData ? tokenData['u'] : config.ACCESS_TOKEN; //Reset event data cache if the access token owner changed. var dueForEvent = tokenU !== this.eventData.tokenU; if (!validateUuid(this.anonId)) { this.anonId = uuid(); dueForEvent = true; } var nextUpdate = this.queue.shift(); // Record turnstile event once per calendar day. if (this.eventData.lastSuccess) { var lastUpdate = new Date(this.eventData.lastSuccess); var nextDate = new Date(nextUpdate); var daysElapsed = (nextUpdate - this.eventData.lastSuccess) / (24 * 60 * 60 * 1000); dueForEvent = dueForEvent || daysElapsed >= 1 || daysElapsed < -1 || lastUpdate.getDate() !== nextDate.getDate(); } else { dueForEvent = true; } if (!dueForEvent) { return this.processRequests(); } this.postEvent(nextUpdate, {"enabled.telemetry": false}, function (err) { if (!err) { this$1.eventData.lastSuccess = nextUpdate; this$1.eventData.tokenU = tokenU; } }); }; return TurnstileEvent; }(TelemetryEvent)); var turnstileEvent_ = new TurnstileEvent(); var postTurnstileEvent = turnstileEvent_.postTurnstileEvent.bind(turnstileEvent_); var mapLoadEvent_ = new MapLoadEvent(); var postMapLoadEvent = mapLoadEvent_.postMapLoadEvent.bind(mapLoadEvent_); /***** END WARNING - REMOVAL OR MODIFICATION OF THE PRECEDING CODE VIOLATES THE MAPBOX TERMS OF SERVICE ******/ // /** * The type of a resource. * @private * @readonly * @enum {string} */ var ResourceType = { Unknown: 'Unknown', Style: 'Style', Source: 'Source', Tile: 'Tile', Glyphs: 'Glyphs', SpriteImage: 'SpriteImage', SpriteJSON: 'SpriteJSON', Image: 'Image' }; if (typeof Object.freeze == 'function') { Object.freeze(ResourceType); } /** * A `RequestParameters` object to be returned from Map.options.transformRequest callbacks. * @typedef {Object} RequestParameters * @property {string} url The URL to be requested. * @property {Object} headers The headers to be sent with the request. * @property {string} credentials `'same-origin'|'include'` Use 'include' to send cookies with cross-origin requests. */ var AJAXError = /*@__PURE__*/(function (Error) { function AJAXError(message , status , url ) { if (status === 401 && isMapboxHTTPURL(url)) { message += ': you may have provided an invalid Mapbox access token. See https://www.mapbox.com/api-documentation/#access-tokens-and-token-scopes'; } Error.call(this, message); this.status = status; this.url = url; // work around for https://github.com/Rich-Harris/buble/issues/40 this.name = this.constructor.name; this.message = message; } if ( Error ) AJAXError.__proto__ = Error; AJAXError.prototype = Object.create( Error && Error.prototype ); AJAXError.prototype.constructor = AJAXError; AJAXError.prototype.toString = function toString () { return ((this.name) + ": " + (this.message) + " (" + (this.status) + "): " + (this.url)); }; return AJAXError; }(Error)); function isWorker() { return typeof WorkerGlobalScope !== 'undefined' && typeof self !== 'undefined' && self instanceof WorkerGlobalScope; } // Ensure that we're sending the correct referrer from blob URL worker bundles. // For files loaded from the local file system, `location.origin` will be set // to the string(!) "null" (Firefox), or "file://" (Chrome, Safari, Edge, IE), // and we will set an empty referrer. Otherwise, we're using the document's URL. /* global self, WorkerGlobalScope */ var getReferrer = isWorker() ? function () { return self.worker && self.worker.referrer; } : function () { var origin = self.location.origin; if (origin && origin !== 'null' && origin !== 'file://') { return origin + self.location.pathname; } }; function makeFetchRequest(requestParameters , callback ) { var controller = new self.AbortController(); var request = new self.Request(requestParameters.url, { method: requestParameters.method || 'GET', body: requestParameters.body, credentials: requestParameters.credentials, headers: requestParameters.headers, referrer: getReferrer(), signal: controller.signal }); if (requestParameters.type === 'json') { request.headers.set('Accept', 'application/json'); } self.fetch(request).then(function (response) { if (response.ok) { response[requestParameters.type || 'text']().then(function (result) { callback(null, result, response.headers.get('Cache-Control'), response.headers.get('Expires')); }).catch(function (err) { return callback(new Error(err.message)); }); } else { callback(new AJAXError(response.statusText, response.status, requestParameters.url)); } }).catch(function (error) { if (error.code === 20) { // silence expected AbortError return; } callback(new Error(error.message)); }); return { cancel: function () { return controller.abort(); } }; } function makeXMLHttpRequest(requestParameters , callback ) { var xhr = new self.XMLHttpRequest(); xhr.open(requestParameters.method || 'GET', requestParameters.url, true); if (requestParameters.type === 'arrayBuffer') { xhr.responseType = 'arraybuffer'; } for (var k in requestParameters.headers) { xhr.setRequestHeader(k, requestParameters.headers[k]); } if (requestParameters.type === 'json') { xhr.setRequestHeader('Accept', 'application/json'); } xhr.withCredentials = requestParameters.credentials === 'include'; xhr.onerror = function () { callback(new Error(xhr.statusText)); }; xhr.onload = function () { if (((xhr.status >= 200 && xhr.status < 300) || xhr.status === 0) && xhr.response !== null) { var data = xhr.response; if (requestParameters.type === 'json') { // We're manually parsing JSON here to get better error messages. try { data = JSON.parse(xhr.response); } catch (err) { return callback(err); } } callback(null, data, xhr.getResponseHeader('Cache-Control'), xhr.getResponseHeader('Expires')); } else { callback(new AJAXError(xhr.statusText, xhr.status, requestParameters.url)); } }; xhr.send(requestParameters.body); return { cancel: function () { return xhr.abort(); } }; } var makeRequest = function(requestParameters , callback ) { // We're trying to use the Fetch API if possible. However, in some situations we can't use it: // - IE11 doesn't support it at all. In this case, we dispatch the request to the main thread so // that we can get an accruate referrer header. // - Safari exposes window.AbortController, but it doesn't work actually abort any requests in // some versions (see https://bugs.webkit.org/show_bug.cgi?id=174980#c2) // - Requests for resources with the file:// URI scheme don't work with the Fetch API either. In // this case we unconditionally use XHR on the current thread since referrers don't matter. if (!/^file:/.test(requestParameters.url)) { if (self.fetch && self.Request && self.AbortController && self.Request.prototype.hasOwnProperty('signal')) { return makeFetchRequest(requestParameters, callback); } if (isWorker() && self.worker && self.worker.actor) { return self.worker.actor.send('getResource', requestParameters, callback); } } return makeXMLHttpRequest(requestParameters, callback); }; var getJSON = function(requestParameters , callback ) { return makeRequest(extend(requestParameters, { type: 'json' }), callback); }; var getArrayBuffer = function(requestParameters , callback ) { return makeRequest(extend(requestParameters, { type: 'arrayBuffer' }), callback); }; var postData = function(requestParameters , callback ) { return makeRequest(extend(requestParameters, { method: 'POST' }), callback); }; function sameOrigin(url) { var a = self.document.createElement('a'); a.href = url; return a.protocol === self.document.location.protocol && a.host === self.document.location.host; } var transparentPngUrl = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQYV2NgAAIAAAUAAarVyFEAAAAASUVORK5CYII='; var imageQueue, numImageRequests; var resetImageRequestQueue = function () { imageQueue = []; numImageRequests = 0; }; resetImageRequestQueue(); var getImage = function(requestParameters , callback ) { // limit concurrent image loads to help with raster sources performance on big screens if (numImageRequests >= config.MAX_PARALLEL_IMAGE_REQUESTS) { var queued = { requestParameters: requestParameters, callback: callback, cancelled: false, cancel: function cancel() { this.cancelled = true; } }; imageQueue.push(queued); return queued; } numImageRequests++; var advanced = false; var advanceImageRequestQueue = function () { if (advanced) { return; } advanced = true; numImageRequests--; assert_1(numImageRequests >= 0); while (imageQueue.length && numImageRequests < config.MAX_PARALLEL_IMAGE_REQUESTS) { // eslint-disable-line var request = imageQueue.shift(); var requestParameters = request.requestParameters; var callback = request.callback; var cancelled = request.cancelled; if (!cancelled) { request.cancel = getImage(requestParameters, callback).cancel; } } }; // request the image with XHR to work around caching issues // see https://github.com/mapbox/mapbox-gl-js/issues/1470 var request = getArrayBuffer(requestParameters, function (err , data , cacheControl , expires ) { advanceImageRequestQueue(); if (err) { callback(err); } else if (data) { var img = new self.Image(); var URL = self.URL || self.webkitURL; img.onload = function () { callback(null, img); URL.revokeObjectURL(img.src); }; img.onerror = function () { return callback(new Error('Could not load image. Please make sure to use a supported image type such as PNG or JPEG. Note that SVGs are not supported.')); }; var blob = new self.Blob([new Uint8Array(data)], { type: 'image/png' }); (img ).cacheControl = cacheControl; (img ).expires = expires; img.src = data.byteLength ? URL.createObjectURL(blob) : transparentPngUrl; } }); return { cancel: function () { request.cancel(); advanceImageRequestQueue(); } }; }; var getVideo = function(urls , callback ) { var video = self.document.createElement('video'); video.muted = true; video.onloadstart = function() { callback(null, video); }; for (var i = 0; i < urls.length; i++) { var s = self.document.createElement('source'); if (!sameOrigin(urls[i])) { video.crossOrigin = 'Anonymous'; } s.src = urls[i]; video.appendChild(s); } return { cancel: function () {} }; }; // function _addEventListener(type , listener , listenerList ) { var listenerExists = listenerList[type] && listenerList[type].indexOf(listener) !== -1; if (!listenerExists) { listenerList[type] = listenerList[type] || []; listenerList[type].push(listener); } } function _removeEventListener(type , listener , listenerList ) { if (listenerList && listenerList[type]) { var index = listenerList[type].indexOf(listener); if (index !== -1) { listenerList[type].splice(index, 1); } } } var Event = function Event(type , data) { if ( data === void 0 ) data = {}; extend(this, data); this.type = type; }; var ErrorEvent = /*@__PURE__*/(function (Event) { function ErrorEvent(error , data) { if ( data === void 0 ) data = {}; Event.call(this, 'error', extend({error: error}, data)); } if ( Event ) ErrorEvent.__proto__ = Event; ErrorEvent.prototype = Object.create( Event && Event.prototype ); ErrorEvent.prototype.constructor = ErrorEvent; return ErrorEvent; }(Event)); /** * Methods mixed in to other classes for event capabilities. * * @mixin Evented */ var Evented = function Evented () {}; Evented.prototype.on = function on (type , listener ) { this._listeners = this._listeners || {}; _addEventListener(type, listener, this._listeners); return this; }; /** * Removes a previously registered event listener. * * @param {string} type The event type to remove listeners for. * @param {Function} listener The listener function to remove. * @returns {Object} `this` */ Evented.prototype.off = function off (type , listener ) { _removeEventListener(type, listener, this._listeners); _removeEventListener(type, listener, this._oneTimeListeners); return this; }; /** * Adds a listener that will be called only once to a specified event type. * * The listener will be called first time the event fires after the listener is registered. * * @param {string} type The event type to listen for. * @param {Function} listener The function to be called when the event is fired the first time. * @returns {Object} `this` */ Evented.prototype.once = function once (type , listener ) { this._oneTimeListeners = this._oneTimeListeners || {}; _addEventListener(type, listener, this._oneTimeListeners); return this; }; Evented.prototype.fire = function fire (event , properties ) { // Compatibility with (type: string, properties: Object) signature from previous versions. // See https://github.com/mapbox/mapbox-gl-js/issues/6522, // https://github.com/mapbox/mapbox-gl-draw/issues/766 if (typeof event === 'string') { event = new Event(event, properties || {}); } var type = event.type; if (this.listens(type)) { (event ).target = this; // make sure adding or removing listeners inside other listeners won't cause an infinite loop var listeners = this._listeners && this._listeners[type] ? this._listeners[type].slice() : []; for (var i = 0, list = listeners; i < list.length; i += 1) { var listener = list[i]; listener.call(this, event); } var oneTimeListeners = this._oneTimeListeners && this._oneTimeListeners[type] ? this._oneTimeListeners[type].slice() : []; for (var i$1 = 0, list$1 = oneTimeListeners; i$1 < list$1.length; i$1 += 1) { var listener$1 = list$1[i$1]; _removeEventListener(type, listener$1, this._oneTimeListeners); listener$1.call(this, event); } var parent = this._eventedParent; if (parent) { extend( event, typeof this._eventedParentData === 'function' ? this._eventedParentData() : this._eventedParentData ); parent.fire(event); } // To ensure that no error events are dropped, print them to the // console if they have no listeners. } else if (event instanceof ErrorEvent) { console.error(event.error); } return this; }; /** * Returns a true if this instance of Evented or any forwardeed instances of Evented have a listener for the specified type. * * @param {string} type The event type * @returns {boolean} `true` if there is at least one registered listener for specified event type, `false` otherwise * @private */ Evented.prototype.listens = function listens (type ) { return ( (this._listeners && this._listeners[type] && this._listeners[type].length > 0) || (this._oneTimeListeners && this._oneTimeListeners[type] && this._oneTimeListeners[type].length > 0) || (this._eventedParent && this._eventedParent.listens(type)) ); }; /** * Bubble all events fired by this instance of Evented to this parent instance of Evented. * * @private * @returns {Object} `this` * @private */ Evented.prototype.setEventedParent = function setEventedParent (parent , data ) { this._eventedParent = parent; this._eventedParentData = data; return this; }; var $version = 8; var $root = { version: { required: true, type: "enum", values: [ 8 ] }, name: { type: "string" }, metadata: { type: "*" }, center: { type: "array", value: "number" }, zoom: { type: "number" }, bearing: { type: "number", "default": 0, period: 360, units: "degrees" }, pitch: { type: "number", "default": 0, units: "degrees" }, light: { type: "light" }, sources: { required: true, type: "sources" }, sprite: { type: "string" }, glyphs: { type: "string" }, transition: { type: "transition" }, layers: { required: true, type: "array", value: "layer" } }; var sources = { "*": { type: "source" } }; var source = [ "source_vector", "source_raster", "source_raster_dem", "source_geojson", "source_video", "source_image" ]; var source_vector = { type: { required: true, type: "enum", values: { vector: { } } }, url: { type: "string" }, tiles: { type: "array", value: "string" }, bounds: { type: "array", value: "number", length: 4, "default": [ -180, -85.051129, 180, 85.051129 ] }, scheme: { type: "enum", values: { xyz: { }, tms: { } }, "default": "xyz" }, minzoom: { type: "number", "default": 0 }, maxzoom: { type: "number", "default": 22 }, attribution: { type: "string" }, "*": { type: "*" } }; var source_raster = { type: { required: true, type: "enum", values: { raster: { } } }, url: { type: "string" }, tiles: { type: "array", value: "string" }, bounds: { type: "array", value: "number", length: 4, "default": [ -180, -85.051129, 180, 85.051129 ] }, minzoom: { type: "number", "default": 0 }, maxzoom: { type: "number", "default": 22 }, tileSize: { type: "number", "default": 512, units: "pixels" }, scheme: { type: "enum", values: { xyz: { }, tms: { } }, "default": "xyz" }, attribution: { type: "string" }, "*": { type: "*" } }; var source_raster_dem = { type: { required: true, type: "enum", values: { "raster-dem": { } } }, url: { type: "string" }, tiles: { type: "array", value: "string" }, bounds: { type: "array", value: "number", length: 4, "default": [ -180, -85.051129, 180, 85.051129 ] }, minzoom: { type: "number", "default": 0 }, maxzoom: { type: "number", "default": 22 }, tileSize: { type: "number", "default": 512, units: "pixels" }, attribution: { type: "string" }, encoding: { type: "enum", values: { terrarium: { }, mapbox: { } }, "default": "mapbox" }, "*": { type: "*" } }; var source_geojson = { type: { required: true, type: "enum", values: { geojson: { } } }, data: { type: "*" }, maxzoom: { type: "number", "default": 18 }, attribution: { type: "string" }, buffer: { type: "number", "default": 128, maximum: 512, minimum: 0 }, tolerance: { type: "number", "default": 0.375 }, cluster: { type: "boolean", "default": false }, clusterRadius: { type: "number", "default": 50, minimum: 0 }, clusterMaxZoom: { type: "number" }, clusterProperties: { type: "*" }, lineMetrics: { type: "boolean", "default": false }, generateId: { type: "boolean", "default": false } }; var source_video = { type: { required: true, type: "enum", values: { video: { } } }, urls: { required: true, type: "array", value: "string" }, coordinates: { required: true, type: "array", length: 4, value: { type: "array", length: 2, value: "number" } } }; var source_image = { type: { required: true, type: "enum", values: { image: { } } }, url: { required: true, type: "string" }, coordinates: { required: true, type: "array", length: 4, value: { type: "array", length: 2, value: "number" } } }; var layer = { id: { type: "string", required: true }, type: { type: "enum", values: { fill: { }, line: { }, symbol: { }, circle: { }, heatmap: { }, "fill-extrusion": { }, raster: { }, hillshade: { }, background: { } }, required: true }, metadata: { type: "*" }, source: { type: "string" }, "source-layer": { type: "string" }, minzoom: { type: "number", minimum: 0, maximum: 24 }, maxzoom: { type: "number", minimum: 0, maximum: 24 }, filter: { type: "filter" }, layout: { type: "layout" }, paint: { type: "paint" } }; var layout = [ "layout_fill", "layout_line", "layout_circle", "layout_heatmap", "layout_fill-extrusion", "layout_symbol", "layout_raster", "layout_hillshade", "layout_background" ]; var layout_background = { visibility: { type: "enum", values: { visible: { }, none: { } }, "default": "visible", "property-type": "constant" } }; var layout_fill = { visibility: { type: "enum", values: { visible: { }, none: { } }, "default": "visible", "property-type": "constant" } }; var layout_circle = { visibility: { type: "enum", values: { visible: { }, none: { } }, "default": "visible", "property-type": "constant" } }; var layout_heatmap = { visibility: { type: "enum", values: { visible: { }, none: { } }, "default": "visible", "property-type": "constant" } }; var layout_line = { "line-cap": { type: "enum", values: { butt: { }, round: { }, square: { } }, "default": "butt", expression: { interpolated: false, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "line-join": { type: "enum", values: { bevel: { }, round: { }, miter: { } }, "default": "miter", expression: { interpolated: false, parameters: [ "zoom", "feature" ] }, "property-type": "data-driven" }, "line-miter-limit": { type: "number", "default": 2, requires: [ { "line-join": "miter" } ], expression: { interpolated: true, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "line-round-limit": { type: "number", "default": 1.05, requires: [ { "line-join": "round" } ], expression: { interpolated: true, parameters: [ "zoom" ] }, "property-type": "data-constant" }, visibility: { type: "enum", values: { visible: { }, none: { } }, "default": "visible", "property-type": "constant" } }; var layout_symbol = { "symbol-placement": { type: "enum", values: { point: { }, line: { }, "line-center": { } }, "default": "point", expression: { interpolated: false, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "symbol-spacing": { type: "number", "default": 250, minimum: 1, units: "pixels", requires: [ { "symbol-placement": "line" } ], expression: { interpolated: true, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "symbol-avoid-edges": { type: "boolean", "default": false, expression: { interpolated: false, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "symbol-sort-key": { type: "number", expression: { interpolated: false, parameters: [ "zoom", "feature" ] }, "property-type": "data-driven" }, "symbol-z-order": { type: "enum", values: { auto: { }, "viewport-y": { }, source: { } }, "default": "auto", expression: { interpolated: false, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "icon-allow-overlap": { type: "boolean", "default": false, requires: [ "icon-image" ], expression: { interpolated: false, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "icon-ignore-placement": { type: "boolean", "default": false, requires: [ "icon-image" ], expression: { interpolated: false, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "icon-optional": { type: "boolean", "default": false, requires: [ "icon-image", "text-field" ], expression: { interpolated: false, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "icon-rotation-alignment": { type: "enum", values: { map: { }, viewport: { }, auto: { } }, "default": "auto", requires: [ "icon-image" ], expression: { interpolated: false, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "icon-size": { type: "number", "default": 1, minimum: 0, units: "factor of the original icon size", requires: [ "icon-image" ], expression: { interpolated: true, parameters: [ "zoom", "feature" ] }, "property-type": "data-driven" }, "icon-text-fit": { type: "enum", values: { none: { }, width: { }, height: { }, both: { } }, "default": "none", requires: [ "icon-image", "text-field" ], expression: { interpolated: false, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "icon-text-fit-padding": { type: "array", value: "number", length: 4, "default": [ 0, 0, 0, 0 ], units: "pixels", requires: [ "icon-image", "text-field", { "icon-text-fit": [ "both", "width", "height" ] } ], expression: { interpolated: true, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "icon-image": { type: "string", tokens: true, expression: { interpolated: false, parameters: [ "zoom", "feature" ] }, "property-type": "data-driven" }, "icon-rotate": { type: "number", "default": 0, period: 360, units: "degrees", requires: [ "icon-image" ], expression: { interpolated: true, parameters: [ "zoom", "feature" ] }, "property-type": "data-driven" }, "icon-padding": { type: "number", "default": 2, minimum: 0, units: "pixels", requires: [ "icon-image" ], expression: { interpolated: true, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "icon-keep-upright": { type: "boolean", "default": false, requires: [ "icon-image", { "icon-rotation-alignment": "map" }, { "symbol-placement": [ "line", "line-center" ] } ], expression: { interpolated: false, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "icon-offset": { type: "array", value: "number", length: 2, "default": [ 0, 0 ], requires: [ "icon-image" ], expression: { interpolated: true, parameters: [ "zoom", "feature" ] }, "property-type": "data-driven" }, "icon-anchor": { type: "enum", values: { center: { }, left: { }, right: { }, top: { }, bottom: { }, "top-left": { }, "top-right": { }, "bottom-left": { }, "bottom-right": { } }, "default": "center", requires: [ "icon-image" ], expression: { interpolated: false, parameters: [ "zoom", "feature" ] }, "property-type": "data-driven" }, "icon-pitch-alignment": { type: "enum", values: { map: { }, viewport: { }, auto: { } }, "default": "auto", requires: [ "icon-image" ], expression: { interpolated: false, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "text-pitch-alignment": { type: "enum", values: { map: { }, viewport: { }, auto: { } }, "default": "auto", requires: [ "text-field" ], expression: { interpolated: false, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "text-rotation-alignment": { type: "enum", values: { map: { }, viewport: { }, auto: { } }, "default": "auto", requires: [ "text-field" ], expression: { interpolated: false, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "text-field": { type: "formatted", "default": "", tokens: true, expression: { interpolated: false, parameters: [ "zoom", "feature" ] }, "property-type": "data-driven" }, "text-font": { type: "array", value: "string", "default": [ "Open Sans Regular", "Arial Unicode MS Regular" ], requires: [ "text-field" ], expression: { interpolated: false, parameters: [ "zoom", "feature" ] }, "property-type": "data-driven" }, "text-size": { type: "number", "default": 16, minimum: 0, units: "pixels", requires: [ "text-field" ], expression: { interpolated: true, parameters: [ "zoom", "feature" ] }, "property-type": "data-driven" }, "text-max-width": { type: "number", "default": 10, minimum: 0, units: "ems", requires: [ "text-field" ], expression: { interpolated: true, parameters: [ "zoom", "feature" ] }, "property-type": "data-driven" }, "text-line-height": { type: "number", "default": 1.2, units: "ems", requires: [ "text-field" ], expression: { interpolated: true, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "text-letter-spacing": { type: "number", "default": 0, units: "ems", requires: [ "text-field" ], expression: { interpolated: true, parameters: [ "zoom", "feature" ] }, "property-type": "data-driven" }, "text-justify": { type: "enum", values: { auto: { }, left: { }, center: { }, right: { } }, "default": "center", requires: [ "text-field" ], expression: { interpolated: false, parameters: [ "zoom", "feature" ] }, "property-type": "data-driven" }, "text-radial-offset": { type: "number", units: "ems", "default": 0, requires: [ { "!": "text-offset" } ], "property-type": "data-driven", expression: { interpolated: true, parameters: [ "zoom", "feature" ] } }, "text-variable-anchor": { type: "array", value: "enum", values: { center: { }, left: { }, right: { }, top: { }, bottom: { }, "top-left": { }, "top-right": { }, "bottom-left": { }, "bottom-right": { } }, requires: [ { "!": "text-anchor" }, { "!": "text-offset" }, { "symbol-placement": [ "point" ] } ], expression: { interpolated: false, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "text-anchor": { type: "enum", requires: [ "text-field" ], values: { center: { }, left: { }, right: { }, top: { }, bottom: { }, "top-left": { }, "top-right": { }, "bottom-left": { }, "bottom-right": { } }, "default": "center", expression: { interpolated: false, parameters: [ "zoom", "feature" ] }, "property-type": "data-driven" }, "text-max-angle": { type: "number", "default": 45, units: "degrees", requires: [ "text-field", { "symbol-placement": [ "line", "line-center" ] } ], expression: { interpolated: true, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "text-rotate": { type: "number", "default": 0, period: 360, units: "degrees", requires: [ "text-field" ], expression: { interpolated: true, parameters: [ "zoom", "feature" ] }, "property-type": "data-driven" }, "text-padding": { type: "number", "default": 2, minimum: 0, units: "pixels", requires: [ "text-field" ], expression: { interpolated: true, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "text-keep-upright": { type: "boolean", "default": true, requires: [ "text-field", { "text-rotation-alignment": "map" }, { "symbol-placement": [ "line", "line-center" ] } ], expression: { interpolated: false, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "text-transform": { type: "enum", values: { none: { }, uppercase: { }, lowercase: { } }, "default": "none", requires: [ "text-field" ], expression: { interpolated: false, parameters: [ "zoom", "feature" ] }, "property-type": "data-driven" }, "text-offset": { type: "array", value: "number", units: "ems", length: 2, "default": [ 0, 0 ], requires: [ "text-field", { "!": "text-radial-offset" } ], expression: { interpolated: true, parameters: [ "zoom", "feature" ] }, "property-type": "data-driven" }, "text-allow-overlap": { type: "boolean", "default": false, requires: [ "text-field" ], expression: { interpolated: false, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "text-ignore-placement": { type: "boolean", "default": false, requires: [ "text-field" ], expression: { interpolated: false, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "text-optional": { type: "boolean", "default": false, requires: [ "text-field", "icon-image" ], expression: { interpolated: false, parameters: [ "zoom" ] }, "property-type": "data-constant" }, visibility: { type: "enum", values: { visible: { }, none: { } }, "default": "visible", "property-type": "constant" } }; var layout_raster = { visibility: { type: "enum", values: { visible: { }, none: { } }, "default": "visible", "property-type": "constant" } }; var layout_hillshade = { visibility: { type: "enum", values: { visible: { }, none: { } }, "default": "visible", "property-type": "constant" } }; var filter = { type: "array", value: "*" }; var filter_operator = { type: "enum", values: { "==": { }, "!=": { }, ">": { }, ">=": { }, "<": { }, "<=": { }, "in": { }, "!in": { }, all: { }, any: { }, none: { }, has: { }, "!has": { } } }; var geometry_type = { type: "enum", values: { Point: { }, LineString: { }, Polygon: { } } }; var function_stop = { type: "array", minimum: 0, maximum: 22, value: [ "number", "color" ], length: 2 }; var expression = { type: "array", value: "*", minimum: 1 }; var expression_name = { type: "enum", values: { "let": { group: "Variable binding" }, "var": { group: "Variable binding" }, literal: { group: "Types" }, array: { group: "Types" }, at: { group: "Lookup" }, "case": { group: "Decision" }, match: { group: "Decision" }, coalesce: { group: "Decision" }, step: { group: "Ramps, scales, curves" }, interpolate: { group: "Ramps, scales, curves" }, "interpolate-hcl": { group: "Ramps, scales, curves" }, "interpolate-lab": { group: "Ramps, scales, curves" }, ln2: { group: "Math" }, pi: { group: "Math" }, e: { group: "Math" }, "typeof": { group: "Types" }, string: { group: "Types" }, number: { group: "Types" }, boolean: { group: "Types" }, object: { group: "Types" }, collator: { group: "Types" }, format: { group: "Types" }, "number-format": { group: "Types" }, "to-string": { group: "Types" }, "to-number": { group: "Types" }, "to-boolean": { group: "Types" }, "to-rgba": { group: "Color" }, "to-color": { group: "Types" }, rgb: { group: "Color" }, rgba: { group: "Color" }, get: { group: "Lookup" }, has: { group: "Lookup" }, length: { group: "Lookup" }, properties: { group: "Feature data" }, "feature-state": { group: "Feature data" }, "geometry-type": { group: "Feature data" }, id: { group: "Feature data" }, zoom: { group: "Zoom" }, "heatmap-density": { group: "Heatmap" }, "line-progress": { group: "Feature data" }, accumulated: { group: "Feature data" }, "+": { group: "Math" }, "*": { group: "Math" }, "-": { group: "Math" }, "/": { group: "Math" }, "%": { group: "Math" }, "^": { group: "Math" }, sqrt: { group: "Math" }, log10: { group: "Math" }, ln: { group: "Math" }, log2: { group: "Math" }, sin: { group: "Math" }, cos: { group: "Math" }, tan: { group: "Math" }, asin: { group: "Math" }, acos: { group: "Math" }, atan: { group: "Math" }, min: { group: "Math" }, max: { group: "Math" }, round: { group: "Math" }, abs: { group: "Math" }, ceil: { group: "Math" }, floor: { group: "Math" }, "==": { group: "Decision" }, "!=": { group: "Decision" }, ">": { group: "Decision" }, "<": { group: "Decision" }, ">=": { group: "Decision" }, "<=": { group: "Decision" }, all: { group: "Decision" }, any: { group: "Decision" }, "!": { group: "Decision" }, "is-supported-script": { group: "String" }, upcase: { group: "String" }, downcase: { group: "String" }, concat: { group: "String" }, "resolved-locale": { group: "String" } } }; var light = { anchor: { type: "enum", "default": "viewport", values: { map: { }, viewport: { } }, "property-type": "data-constant", transition: false, expression: { interpolated: false, parameters: [ "zoom" ] } }, position: { type: "array", "default": [ 1.15, 210, 30 ], length: 3, value: "number", "property-type": "data-constant", transition: true, expression: { interpolated: true, parameters: [ "zoom" ] } }, color: { type: "color", "property-type": "data-constant", "default": "#ffffff", expression: { interpolated: true, parameters: [ "zoom" ] }, transition: true }, intensity: { type: "number", "property-type": "data-constant", "default": 0.5, minimum: 0, maximum: 1, expression: { interpolated: true, parameters: [ "zoom" ] }, transition: true } }; var paint = [ "paint_fill", "paint_line", "paint_circle", "paint_heatmap", "paint_fill-extrusion", "paint_symbol", "paint_raster", "paint_hillshade", "paint_background" ]; var paint_fill = { "fill-antialias": { type: "boolean", "default": true, expression: { interpolated: false, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "fill-opacity": { type: "number", "default": 1, minimum: 0, maximum: 1, transition: true, expression: { interpolated: true, parameters: [ "zoom", "feature", "feature-state" ] }, "property-type": "data-driven" }, "fill-color": { type: "color", "default": "#000000", transition: true, requires: [ { "!": "fill-pattern" } ], expression: { interpolated: true, parameters: [ "zoom", "feature", "feature-state" ] }, "property-type": "data-driven" }, "fill-outline-color": { type: "color", transition: true, requires: [ { "!": "fill-pattern" }, { "fill-antialias": true } ], expression: { interpolated: true, parameters: [ "zoom", "feature", "feature-state" ] }, "property-type": "data-driven" }, "fill-translate": { type: "array", value: "number", length: 2, "default": [ 0, 0 ], transition: true, units: "pixels", expression: { interpolated: true, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "fill-translate-anchor": { type: "enum", values: { map: { }, viewport: { } }, "default": "map", requires: [ "fill-translate" ], expression: { interpolated: false, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "fill-pattern": { type: "string", transition: true, expression: { interpolated: false, parameters: [ "zoom", "feature" ] }, "property-type": "cross-faded-data-driven" } }; var paint_line = { "line-opacity": { type: "number", "default": 1, minimum: 0, maximum: 1, transition: true, expression: { interpolated: true, parameters: [ "zoom", "feature", "feature-state" ] }, "property-type": "data-driven" }, "line-color": { type: "color", "default": "#000000", transition: true, requires: [ { "!": "line-pattern" } ], expression: { interpolated: true, parameters: [ "zoom", "feature", "feature-state" ] }, "property-type": "data-driven" }, "line-translate": { type: "array", value: "number", length: 2, "default": [ 0, 0 ], transition: true, units: "pixels", expression: { interpolated: true, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "line-translate-anchor": { type: "enum", values: { map: { }, viewport: { } }, "default": "map", requires: [ "line-translate" ], expression: { interpolated: false, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "line-width": { type: "number", "default": 1, minimum: 0, transition: true, units: "pixels", expression: { interpolated: true, parameters: [ "zoom", "feature", "feature-state" ] }, "property-type": "data-driven" }, "line-gap-width": { type: "number", "default": 0, minimum: 0, transition: true, units: "pixels", expression: { interpolated: true, parameters: [ "zoom", "feature", "feature-state" ] }, "property-type": "data-driven" }, "line-offset": { type: "number", "default": 0, transition: true, units: "pixels", expression: { interpolated: true, parameters: [ "zoom", "feature", "feature-state" ] }, "property-type": "data-driven" }, "line-blur": { type: "number", "default": 0, minimum: 0, transition: true, units: "pixels", expression: { interpolated: true, parameters: [ "zoom", "feature", "feature-state" ] }, "property-type": "data-driven" }, "line-dasharray": { type: "array", value: "number", minimum: 0, transition: true, units: "line widths", requires: [ { "!": "line-pattern" } ], expression: { interpolated: false, parameters: [ "zoom" ] }, "property-type": "cross-faded" }, "line-pattern": { type: "string", transition: true, expression: { interpolated: false, parameters: [ "zoom", "feature" ] }, "property-type": "cross-faded-data-driven" }, "line-gradient": { type: "color", transition: false, requires: [ { "!": "line-dasharray" }, { "!": "line-pattern" }, { source: "geojson", has: { lineMetrics: true } } ], expression: { interpolated: true, parameters: [ "line-progress" ] }, "property-type": "color-ramp" } }; var paint_circle = { "circle-radius": { type: "number", "default": 5, minimum: 0, transition: true, units: "pixels", expression: { interpolated: true, parameters: [ "zoom", "feature", "feature-state" ] }, "property-type": "data-driven" }, "circle-color": { type: "color", "default": "#000000", transition: true, expression: { interpolated: true, parameters: [ "zoom", "feature", "feature-state" ] }, "property-type": "data-driven" }, "circle-blur": { type: "number", "default": 0, transition: true, expression: { interpolated: true, parameters: [ "zoom", "feature", "feature-state" ] }, "property-type": "data-driven" }, "circle-opacity": { type: "number", "default": 1, minimum: 0, maximum: 1, transition: true, expression: { interpolated: true, parameters: [ "zoom", "feature", "feature-state" ] }, "property-type": "data-driven" }, "circle-translate": { type: "array", value: "number", length: 2, "default": [ 0, 0 ], transition: true, units: "pixels", expression: { interpolated: true, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "circle-translate-anchor": { type: "enum", values: { map: { }, viewport: { } }, "default": "map", requires: [ "circle-translate" ], expression: { interpolated: false, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "circle-pitch-scale": { type: "enum", values: { map: { }, viewport: { } }, "default": "map", expression: { interpolated: false, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "circle-pitch-alignment": { type: "enum", values: { map: { }, viewport: { } }, "default": "viewport", expression: { interpolated: false, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "circle-stroke-width": { type: "number", "default": 0, minimum: 0, transition: true, units: "pixels", expression: { interpolated: true, parameters: [ "zoom", "feature", "feature-state" ] }, "property-type": "data-driven" }, "circle-stroke-color": { type: "color", "default": "#000000", transition: true, expression: { interpolated: true, parameters: [ "zoom", "feature", "feature-state" ] }, "property-type": "data-driven" }, "circle-stroke-opacity": { type: "number", "default": 1, minimum: 0, maximum: 1, transition: true, expression: { interpolated: true, parameters: [ "zoom", "feature", "feature-state" ] }, "property-type": "data-driven" } }; var paint_heatmap = { "heatmap-radius": { type: "number", "default": 30, minimum: 1, transition: true, units: "pixels", expression: { interpolated: true, parameters: [ "zoom", "feature", "feature-state" ] }, "property-type": "data-driven" }, "heatmap-weight": { type: "number", "default": 1, minimum: 0, transition: false, expression: { interpolated: true, parameters: [ "zoom", "feature", "feature-state" ] }, "property-type": "data-driven" }, "heatmap-intensity": { type: "number", "default": 1, minimum: 0, transition: true, expression: { interpolated: true, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "heatmap-color": { type: "color", "default": [ "interpolate", [ "linear" ], [ "heatmap-density" ], 0, "rgba(0, 0, 255, 0)", 0.1, "royalblue", 0.3, "cyan", 0.5, "lime", 0.7, "yellow", 1, "red" ], transition: false, expression: { interpolated: true, parameters: [ "heatmap-density" ] }, "property-type": "color-ramp" }, "heatmap-opacity": { type: "number", "default": 1, minimum: 0, maximum: 1, transition: true, expression: { interpolated: true, parameters: [ "zoom" ] }, "property-type": "data-constant" } }; var paint_symbol = { "icon-opacity": { type: "number", "default": 1, minimum: 0, maximum: 1, transition: true, requires: [ "icon-image" ], expression: { interpolated: true, parameters: [ "zoom", "feature", "feature-state" ] }, "property-type": "data-driven" }, "icon-color": { type: "color", "default": "#000000", transition: true, requires: [ "icon-image" ], expression: { interpolated: true, parameters: [ "zoom", "feature", "feature-state" ] }, "property-type": "data-driven" }, "icon-halo-color": { type: "color", "default": "rgba(0, 0, 0, 0)", transition: true, requires: [ "icon-image" ], expression: { interpolated: true, parameters: [ "zoom", "feature", "feature-state" ] }, "property-type": "data-driven" }, "icon-halo-width": { type: "number", "default": 0, minimum: 0, transition: true, units: "pixels", requires: [ "icon-image" ], expression: { interpolated: true, parameters: [ "zoom", "feature", "feature-state" ] }, "property-type": "data-driven" }, "icon-halo-blur": { type: "number", "default": 0, minimum: 0, transition: true, units: "pixels", requires: [ "icon-image" ], expression: { interpolated: true, parameters: [ "zoom", "feature", "feature-state" ] }, "property-type": "data-driven" }, "icon-translate": { type: "array", value: "number", length: 2, "default": [ 0, 0 ], transition: true, units: "pixels", requires: [ "icon-image" ], expression: { interpolated: true, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "icon-translate-anchor": { type: "enum", values: { map: { }, viewport: { } }, "default": "map", requires: [ "icon-image", "icon-translate" ], expression: { interpolated: false, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "text-opacity": { type: "number", "default": 1, minimum: 0, maximum: 1, transition: true, requires: [ "text-field" ], expression: { interpolated: true, parameters: [ "zoom", "feature", "feature-state" ] }, "property-type": "data-driven" }, "text-color": { type: "color", "default": "#000000", transition: true, requires: [ "text-field" ], expression: { interpolated: true, parameters: [ "zoom", "feature", "feature-state" ] }, "property-type": "data-driven" }, "text-halo-color": { type: "color", "default": "rgba(0, 0, 0, 0)", transition: true, requires: [ "text-field" ], expression: { interpolated: true, parameters: [ "zoom", "feature", "feature-state" ] }, "property-type": "data-driven" }, "text-halo-width": { type: "number", "default": 0, minimum: 0, transition: true, units: "pixels", requires: [ "text-field" ], expression: { interpolated: true, parameters: [ "zoom", "feature", "feature-state" ] }, "property-type": "data-driven" }, "text-halo-blur": { type: "number", "default": 0, minimum: 0, transition: true, units: "pixels", requires: [ "text-field" ], expression: { interpolated: true, parameters: [ "zoom", "feature", "feature-state" ] }, "property-type": "data-driven" }, "text-translate": { type: "array", value: "number", length: 2, "default": [ 0, 0 ], transition: true, units: "pixels", requires: [ "text-field" ], expression: { interpolated: true, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "text-translate-anchor": { type: "enum", values: { map: { }, viewport: { } }, "default": "map", requires: [ "text-field", "text-translate" ], expression: { interpolated: false, parameters: [ "zoom" ] }, "property-type": "data-constant" } }; var paint_raster = { "raster-opacity": { type: "number", "default": 1, minimum: 0, maximum: 1, transition: true, expression: { interpolated: true, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "raster-hue-rotate": { type: "number", "default": 0, period: 360, transition: true, units: "degrees", expression: { interpolated: true, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "raster-brightness-min": { type: "number", "default": 0, minimum: 0, maximum: 1, transition: true, expression: { interpolated: true, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "raster-brightness-max": { type: "number", "default": 1, minimum: 0, maximum: 1, transition: true, expression: { interpolated: true, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "raster-saturation": { type: "number", "default": 0, minimum: -1, maximum: 1, transition: true, expression: { interpolated: true, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "raster-contrast": { type: "number", "default": 0, minimum: -1, maximum: 1, transition: true, expression: { interpolated: true, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "raster-resampling": { type: "enum", values: { linear: { }, nearest: { } }, "default": "linear", expression: { interpolated: false, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "raster-fade-duration": { type: "number", "default": 300, minimum: 0, transition: false, units: "milliseconds", expression: { interpolated: true, parameters: [ "zoom" ] }, "property-type": "data-constant" } }; var paint_hillshade = { "hillshade-illumination-direction": { type: "number", "default": 335, minimum: 0, maximum: 359, transition: false, expression: { interpolated: true, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "hillshade-illumination-anchor": { type: "enum", values: { map: { }, viewport: { } }, "default": "viewport", expression: { interpolated: false, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "hillshade-exaggeration": { type: "number", "default": 0.5, minimum: 0, maximum: 1, transition: true, expression: { interpolated: true, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "hillshade-shadow-color": { type: "color", "default": "#000000", transition: true, expression: { interpolated: true, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "hillshade-highlight-color": { type: "color", "default": "#FFFFFF", transition: true, expression: { interpolated: true, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "hillshade-accent-color": { type: "color", "default": "#000000", transition: true, expression: { interpolated: true, parameters: [ "zoom" ] }, "property-type": "data-constant" } }; var paint_background = { "background-color": { type: "color", "default": "#000000", transition: true, requires: [ { "!": "background-pattern" } ], expression: { interpolated: true, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "background-pattern": { type: "string", transition: true, expression: { interpolated: false, parameters: [ "zoom" ] }, "property-type": "cross-faded" }, "background-opacity": { type: "number", "default": 1, minimum: 0, maximum: 1, transition: true, expression: { interpolated: true, parameters: [ "zoom" ] }, "property-type": "data-constant" } }; var transition = { duration: { type: "number", "default": 300, minimum: 0, units: "milliseconds" }, delay: { type: "number", "default": 0, minimum: 0, units: "milliseconds" } }; var spec = { $version: $version, $root: $root, sources: sources, source: source, source_vector: source_vector, source_raster: source_raster, source_raster_dem: source_raster_dem, source_geojson: source_geojson, source_video: source_video, source_image: source_image, layer: layer, layout: layout, layout_background: layout_background, layout_fill: layout_fill, layout_circle: layout_circle, layout_heatmap: layout_heatmap, "layout_fill-extrusion": { visibility: { type: "enum", values: { visible: { }, none: { } }, "default": "visible", "property-type": "constant" } }, layout_line: layout_line, layout_symbol: layout_symbol, layout_raster: layout_raster, layout_hillshade: layout_hillshade, filter: filter, filter_operator: filter_operator, geometry_type: geometry_type, "function": { expression: { type: "expression" }, stops: { type: "array", value: "function_stop" }, base: { type: "number", "default": 1, minimum: 0 }, property: { type: "string", "default": "$zoom" }, type: { type: "enum", values: { identity: { }, exponential: { }, interval: { }, categorical: { } }, "default": "exponential" }, colorSpace: { type: "enum", values: { rgb: { }, lab: { }, hcl: { } }, "default": "rgb" }, "default": { type: "*", required: false } }, function_stop: function_stop, expression: expression, expression_name: expression_name, light: light, paint: paint, paint_fill: paint_fill, "paint_fill-extrusion": { "fill-extrusion-opacity": { type: "number", "default": 1, minimum: 0, maximum: 1, transition: true, expression: { interpolated: true, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "fill-extrusion-color": { type: "color", "default": "#000000", transition: true, requires: [ { "!": "fill-extrusion-pattern" } ], expression: { interpolated: true, parameters: [ "zoom", "feature", "feature-state" ] }, "property-type": "data-driven" }, "fill-extrusion-translate": { type: "array", value: "number", length: 2, "default": [ 0, 0 ], transition: true, units: "pixels", expression: { interpolated: true, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "fill-extrusion-translate-anchor": { type: "enum", values: { map: { }, viewport: { } }, "default": "map", requires: [ "fill-extrusion-translate" ], expression: { interpolated: false, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "fill-extrusion-pattern": { type: "string", transition: true, expression: { interpolated: false, parameters: [ "zoom", "feature" ] }, "property-type": "cross-faded-data-driven" }, "fill-extrusion-height": { type: "number", "default": 0, minimum: 0, units: "meters", transition: true, expression: { interpolated: true, parameters: [ "zoom", "feature", "feature-state" ] }, "property-type": "data-driven" }, "fill-extrusion-base": { type: "number", "default": 0, minimum: 0, units: "meters", transition: true, requires: [ "fill-extrusion-height" ], expression: { interpolated: true, parameters: [ "zoom", "feature", "feature-state" ] }, "property-type": "data-driven" }, "fill-extrusion-vertical-gradient": { type: "boolean", "default": true, transition: false, expression: { interpolated: false, parameters: [ "zoom" ] }, "property-type": "data-constant" } }, paint_line: paint_line, paint_circle: paint_circle, paint_heatmap: paint_heatmap, paint_symbol: paint_symbol, paint_raster: paint_raster, paint_hillshade: paint_hillshade, paint_background: paint_background, transition: transition, "property-type": { "data-driven": { type: "property-type" }, "cross-faded": { type: "property-type" }, "cross-faded-data-driven": { type: "property-type" }, "color-ramp": { type: "property-type" }, "data-constant": { type: "property-type" }, constant: { type: "property-type" } } }; var ValidationError = function ValidationError(key, value, message, identifier) { this.message = (key ? (key + ": ") : '') + message; if (identifier) { this.identifier = identifier; } if (value !== null && value !== undefined && value.__line__) { this.line = value.__line__; } }; function validateConstants(options) { var key = options.key; var constants = options.value; if (constants) { return [new ValidationError(key, constants, 'constants have been deprecated as of v8')]; } else { return []; } } function extend$1 (output) { var inputs = [], len = arguments.length - 1; while ( len-- > 0 ) inputs[ len ] = arguments[ len + 1 ]; for (var i = 0, list = inputs; i < list.length; i += 1) { var input = list[i]; for (var k in input) { output[k] = input[k]; } } return output; } // Turn jsonlint-lines-primitives objects into primitive objects function unbundle(value) { if (value instanceof Number || value instanceof String || value instanceof Boolean) { return value.valueOf(); } else { return value; } } function deepUnbundle(value) { if (Array.isArray(value)) { return value.map(deepUnbundle); } return unbundle(value); } // var ParsingError = /*@__PURE__*/(function (Error) { function ParsingError(key , message ) { Error.call(this, message); this.message = message; this.key = key; } if ( Error ) ParsingError.__proto__ = Error; ParsingError.prototype = Object.create( Error && Error.prototype ); ParsingError.prototype.constructor = ParsingError; return ParsingError; }(Error)); // /** * Tracks `let` bindings during expression parsing. * @private */ var Scope = function Scope(parent , bindings) { if ( bindings === void 0 ) bindings = []; this.parent = parent; this.bindings = {}; for (var i = 0, list = bindings; i < list.length; i += 1) { var ref = list[i]; var name = ref[0]; var expression = ref[1]; this.bindings[name] = expression; } }; Scope.prototype.concat = function concat (bindings ) { return new Scope(this, bindings); }; Scope.prototype.get = function get (name ) { if (this.bindings[name]) { return this.bindings[name]; } if (this.parent) { return this.parent.get(name); } throw new Error((name + " not found in scope.")); }; Scope.prototype.has = function has (name ) { if (this.bindings[name]) { return true; } return this.parent ? this.parent.has(name) : false; }; // var NullType = { kind: 'null' }; var NumberType = { kind: 'number' }; var StringType = { kind: 'string' }; var BooleanType = { kind: 'boolean' }; var ColorType = { kind: 'color' }; var ObjectType = { kind: 'object' }; var ValueType = { kind: 'value' }; var ErrorType = { kind: 'error' }; var CollatorType = { kind: 'collator' }; var FormattedType = { kind: 'formatted' }; function array(itemType , N ) { return { kind: 'array', itemType: itemType, N: N }; } function toString(type ) { if (type.kind === 'array') { var itemType = toString(type.itemType); return typeof type.N === 'number' ? ("array<" + itemType + ", " + (type.N) + ">") : type.itemType.kind === 'value' ? 'array' : ("array<" + itemType + ">"); } else { return type.kind; } } var valueMemberTypes = [ NullType, NumberType, StringType, BooleanType, ColorType, FormattedType, ObjectType, array(ValueType) ]; /** * Returns null if `t` is a subtype of `expected`; otherwise returns an * error message. * @private */ function checkSubtype(expected , t ) { if (t.kind === 'error') { // Error is a subtype of every type return null; } else if (expected.kind === 'array') { if (t.kind === 'array' && ((t.N === 0 && t.itemType.kind === 'value') || !checkSubtype(expected.itemType, t.itemType)) && (typeof expected.N !== 'number' || expected.N === t.N)) { return null; } } else if (expected.kind === t.kind) { return null; } else if (expected.kind === 'value') { for (var i = 0, list = valueMemberTypes; i < list.length; i += 1) { var memberType = list[i]; if (!checkSubtype(memberType, t)) { return null; } } } return ("Expected " + (toString(expected)) + " but found " + (toString(t)) + " instead."); } var csscolorparser = createCommonjsModule(function (module, exports) { // (c) Dean McNamee , 2012. // // https://github.com/deanm/css-color-parser-js // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to // deal in the Software without restriction, including without limitation the // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or // sell copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS // IN THE SOFTWARE. // http://www.w3.org/TR/css3-color/ var kCSSColorTable = { "transparent": [0,0,0,0], "aliceblue": [240,248,255,1], "antiquewhite": [250,235,215,1], "aqua": [0,255,255,1], "aquamarine": [127,255,212,1], "azure": [240,255,255,1], "beige": [245,245,220,1], "bisque": [255,228,196,1], "black": [0,0,0,1], "blanchedalmond": [255,235,205,1], "blue": [0,0,255,1], "blueviolet": [138,43,226,1], "brown": [165,42,42,1], "burlywood": [222,184,135,1], "cadetblue": [95,158,160,1], "chartreuse": [127,255,0,1], "chocolate": [210,105,30,1], "coral": [255,127,80,1], "cornflowerblue": [100,149,237,1], "cornsilk": [255,248,220,1], "crimson": [220,20,60,1], "cyan": [0,255,255,1], "darkblue": [0,0,139,1], "darkcyan": [0,139,139,1], "darkgoldenrod": [184,134,11,1], "darkgray": [169,169,169,1], "darkgreen": [0,100,0,1], "darkgrey": [169,169,169,1], "darkkhaki": [189,183,107,1], "darkmagenta": [139,0,139,1], "darkolivegreen": [85,107,47,1], "darkorange": [255,140,0,1], "darkorchid": [153,50,204,1], "darkred": [139,0,0,1], "darksalmon": [233,150,122,1], "darkseagreen": [143,188,143,1], "darkslateblue": [72,61,139,1], "darkslategray": [47,79,79,1], "darkslategrey": [47,79,79,1], "darkturquoise": [0,206,209,1], "darkviolet": [148,0,211,1], "deeppink": [255,20,147,1], "deepskyblue": [0,191,255,1], "dimgray": [105,105,105,1], "dimgrey": [105,105,105,1], "dodgerblue": [30,144,255,1], "firebrick": [178,34,34,1], "floralwhite": [255,250,240,1], "forestgreen": [34,139,34,1], "fuchsia": [255,0,255,1], "gainsboro": [220,220,220,1], "ghostwhite": [248,248,255,1], "gold": [255,215,0,1], "goldenrod": [218,165,32,1], "gray": [128,128,128,1], "green": [0,128,0,1], "greenyellow": [173,255,47,1], "grey": [128,128,128,1], "honeydew": [240,255,240,1], "hotpink": [255,105,180,1], "indianred": [205,92,92,1], "indigo": [75,0,130,1], "ivory": [255,255,240,1], "khaki": [240,230,140,1], "lavender": [230,230,250,1], "lavenderblush": [255,240,245,1], "lawngreen": [124,252,0,1], "lemonchiffon": [255,250,205,1], "lightblue": [173,216,230,1], "lightcoral": [240,128,128,1], "lightcyan": [224,255,255,1], "lightgoldenrodyellow": [250,250,210,1], "lightgray": [211,211,211,1], "lightgreen": [144,238,144,1], "lightgrey": [211,211,211,1], "lightpink": [255,182,193,1], "lightsalmon": [255,160,122,1], "lightseagreen": [32,178,170,1], "lightskyblue": [135,206,250,1], "lightslategray": [119,136,153,1], "lightslategrey": [119,136,153,1], "lightsteelblue": [176,196,222,1], "lightyellow": [255,255,224,1], "lime": [0,255,0,1], "limegreen": [50,205,50,1], "linen": [250,240,230,1], "magenta": [255,0,255,1], "maroon": [128,0,0,1], "mediumaquamarine": [102,205,170,1], "mediumblue": [0,0,205,1], "mediumorchid": [186,85,211,1], "mediumpurple": [147,112,219,1], "mediumseagreen": [60,179,113,1], "mediumslateblue": [123,104,238,1], "mediumspringgreen": [0,250,154,1], "mediumturquoise": [72,209,204,1], "mediumvioletred": [199,21,133,1], "midnightblue": [25,25,112,1], "mintcream": [245,255,250,1], "mistyrose": [255,228,225,1], "moccasin": [255,228,181,1], "navajowhite": [255,222,173,1], "navy": [0,0,128,1], "oldlace": [253,245,230,1], "olive": [128,128,0,1], "olivedrab": [107,142,35,1], "orange": [255,165,0,1], "orangered": [255,69,0,1], "orchid": [218,112,214,1], "palegoldenrod": [238,232,170,1], "palegreen": [152,251,152,1], "paleturquoise": [175,238,238,1], "palevioletred": [219,112,147,1], "papayawhip": [255,239,213,1], "peachpuff": [255,218,185,1], "peru": [205,133,63,1], "pink": [255,192,203,1], "plum": [221,160,221,1], "powderblue": [176,224,230,1], "purple": [128,0,128,1], "rebeccapurple": [102,51,153,1], "red": [255,0,0,1], "rosybrown": [188,143,143,1], "royalblue": [65,105,225,1], "saddlebrown": [139,69,19,1], "salmon": [250,128,114,1], "sandybrown": [244,164,96,1], "seagreen": [46,139,87,1], "seashell": [255,245,238,1], "sienna": [160,82,45,1], "silver": [192,192,192,1], "skyblue": [135,206,235,1], "slateblue": [106,90,205,1], "slategray": [112,128,144,1], "slategrey": [112,128,144,1], "snow": [255,250,250,1], "springgreen": [0,255,127,1], "steelblue": [70,130,180,1], "tan": [210,180,140,1], "teal": [0,128,128,1], "thistle": [216,191,216,1], "tomato": [255,99,71,1], "turquoise": [64,224,208,1], "violet": [238,130,238,1], "wheat": [245,222,179,1], "white": [255,255,255,1], "whitesmoke": [245,245,245,1], "yellow": [255,255,0,1], "yellowgreen": [154,205,50,1]}; function clamp_css_byte(i) { // Clamp to integer 0 .. 255. i = Math.round(i); // Seems to be what Chrome does (vs truncation). return i < 0 ? 0 : i > 255 ? 255 : i; } function clamp_css_float(f) { // Clamp to float 0.0 .. 1.0. return f < 0 ? 0 : f > 1 ? 1 : f; } function parse_css_int(str) { // int or percentage. if (str[str.length - 1] === '%') { return clamp_css_byte(parseFloat(str) / 100 * 255); } return clamp_css_byte(parseInt(str)); } function parse_css_float(str) { // float or percentage. if (str[str.length - 1] === '%') { return clamp_css_float(parseFloat(str) / 100); } return clamp_css_float(parseFloat(str)); } function css_hue_to_rgb(m1, m2, h) { if (h < 0) { h += 1; } else if (h > 1) { h -= 1; } if (h * 6 < 1) { return m1 + (m2 - m1) * h * 6; } if (h * 2 < 1) { return m2; } if (h * 3 < 2) { return m1 + (m2 - m1) * (2/3 - h) * 6; } return m1; } function parseCSSColor(css_str) { // Remove all whitespace, not compliant, but should just be more accepting. var str = css_str.replace(/ /g, '').toLowerCase(); // Color keywords (and transparent) lookup. if (str in kCSSColorTable) { return kCSSColorTable[str].slice(); } // dup. // #abc and #abc123 syntax. if (str[0] === '#') { if (str.length === 4) { var iv = parseInt(str.substr(1), 16); // TODO(deanm): Stricter parsing. if (!(iv >= 0 && iv <= 0xfff)) { return null; } // Covers NaN. return [((iv & 0xf00) >> 4) | ((iv & 0xf00) >> 8), (iv & 0xf0) | ((iv & 0xf0) >> 4), (iv & 0xf) | ((iv & 0xf) << 4), 1]; } else if (str.length === 7) { var iv = parseInt(str.substr(1), 16); // TODO(deanm): Stricter parsing. if (!(iv >= 0 && iv <= 0xffffff)) { return null; } // Covers NaN. return [(iv & 0xff0000) >> 16, (iv & 0xff00) >> 8, iv & 0xff, 1]; } return null; } var op = str.indexOf('('), ep = str.indexOf(')'); if (op !== -1 && ep + 1 === str.length) { var fname = str.substr(0, op); var params = str.substr(op+1, ep-(op+1)).split(','); var alpha = 1; // To allow case fallthrough. switch (fname) { case 'rgba': if (params.length !== 4) { return null; } alpha = parse_css_float(params.pop()); // Fall through. case 'rgb': if (params.length !== 3) { return null; } return [parse_css_int(params[0]), parse_css_int(params[1]), parse_css_int(params[2]), alpha]; case 'hsla': if (params.length !== 4) { return null; } alpha = parse_css_float(params.pop()); // Fall through. case 'hsl': if (params.length !== 3) { return null; } var h = (((parseFloat(params[0]) % 360) + 360) % 360) / 360; // 0 .. 1 // NOTE(deanm): According to the CSS spec s/l should only be // percentages, but we don't bother and let float or percentage. var s = parse_css_float(params[1]); var l = parse_css_float(params[2]); var m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s; var m1 = l * 2 - m2; return [clamp_css_byte(css_hue_to_rgb(m1, m2, h+1/3) * 255), clamp_css_byte(css_hue_to_rgb(m1, m2, h) * 255), clamp_css_byte(css_hue_to_rgb(m1, m2, h-1/3) * 255), alpha]; default: return null; } } return null; } try { exports.parseCSSColor = parseCSSColor; } catch(e) { } }); var csscolorparser_1 = csscolorparser.parseCSSColor; // /** * An RGBA color value. Create instances from color strings using the static * method `Color.parse`. The constructor accepts RGB channel values in the range * `[0, 1]`, premultiplied by A. * * @param {number} r The red channel. * @param {number} g The green channel. * @param {number} b The blue channel. * @param {number} a The alpha channel. * @private */ var Color = function Color(r , g , b , a) { if ( a === void 0 ) a = 1; this.r = r; this.g = g; this.b = b; this.a = a; }; /** * Parses valid CSS color strings and returns a `Color` instance. * @returns A `Color` instance, or `undefined` if the input is not a valid color string. */ Color.parse = function parse (input ) { if (!input) { return undefined; } if (input instanceof Color) { return input; } if (typeof input !== 'string') { return undefined; } var rgba = csscolorparser_1(input); if (!rgba) { return undefined; } return new Color( rgba[0] / 255 * rgba[3], rgba[1] / 255 * rgba[3], rgba[2] / 255 * rgba[3], rgba[3] ); }; /** * Returns an RGBA string representing the color value. * * @returns An RGBA string. * @example * var purple = new Color.parse('purple'); * purple.toString; // = "rgba(128,0,128,1)" * var translucentGreen = new Color.parse('rgba(26, 207, 26, .73)'); * translucentGreen.toString(); // = "rgba(26,207,26,0.73)" */ Color.prototype.toString = function toString () { var ref = this.toArray(); var r = ref[0]; var g = ref[1]; var b = ref[2]; var a = ref[3]; return ("rgba(" + (Math.round(r)) + "," + (Math.round(g)) + "," + (Math.round(b)) + "," + a + ")"); }; Color.prototype.toArray = function toArray () { var ref = this; var r = ref.r; var g = ref.g; var b = ref.b; var a = ref.a; return a === 0 ? [0, 0, 0, 0] : [ r * 255 / a, g * 255 / a, b * 255 / a, a ]; }; Color.black = new Color(0, 0, 0, 1); Color.white = new Color(1, 1, 1, 1); Color.transparent = new Color(0, 0, 0, 0); Color.red = new Color(1, 0, 0, 1); // // Flow type declarations for Intl cribbed from // https://github.com/facebook/flow/issues/1270 var Collator = function Collator(caseSensitive , diacriticSensitive , locale ) { if (caseSensitive) { this.sensitivity = diacriticSensitive ? 'variant' : 'case'; } else { this.sensitivity = diacriticSensitive ? 'accent' : 'base'; } this.locale = locale; this.collator = new Intl.Collator(this.locale ? this.locale : [], { sensitivity: this.sensitivity, usage: 'search' }); }; Collator.prototype.compare = function compare (lhs , rhs ) { return this.collator.compare(lhs, rhs); }; Collator.prototype.resolvedLocale = function resolvedLocale () { // We create a Collator without "usage: search" because we don't want // the search options encoded in our result (e.g. "en-u-co-search") return new Intl.Collator(this.locale ? this.locale : []) .resolvedOptions().locale; }; // var FormattedSection = function FormattedSection(text , scale , fontStack ) { this.text = text; this.scale = scale; this.fontStack = fontStack; }; var Formatted = function Formatted(sections ) { this.sections = sections; }; Formatted.fromString = function fromString (unformatted ) { return new Formatted([new FormattedSection(unformatted, null, null)]); }; Formatted.prototype.toString = function toString () { return this.sections.map(function (section) { return section.text; }).join(''); }; Formatted.prototype.serialize = function serialize () { var serialized = ["format"]; for (var i = 0, list = this.sections; i < list.length; i += 1) { var section = list[i]; serialized.push(section.text); var options = {}; if (section.fontStack) { options["text-font"] = ["literal", section.fontStack.split(',')]; } if (section.scale) { options["font-scale"] = section.scale; } serialized.push(options); } return serialized; }; // function validateRGBA(r , g , b , a ) { if (!( typeof r === 'number' && r >= 0 && r <= 255 && typeof g === 'number' && g >= 0 && g <= 255 && typeof b === 'number' && b >= 0 && b <= 255 )) { var value = typeof a === 'number' ? [r, g, b, a] : [r, g, b]; return ("Invalid rgba value [" + (value.join(', ')) + "]: 'r', 'g', and 'b' must be between 0 and 255."); } if (!( typeof a === 'undefined' || (typeof a === 'number' && a >= 0 && a <= 1) )) { return ("Invalid rgba value [" + ([r, g, b, a].join(', ')) + "]: 'a' must be between 0 and 1."); } return null; } function isValue(mixed ) { if (mixed === null) { return true; } else if (typeof mixed === 'string') { return true; } else if (typeof mixed === 'boolean') { return true; } else if (typeof mixed === 'number') { return true; } else if (mixed instanceof Color) { return true; } else if (mixed instanceof Collator) { return true; } else if (mixed instanceof Formatted) { return true; } else if (Array.isArray(mixed)) { for (var i = 0, list = mixed; i < list.length; i += 1) { var item = list[i]; if (!isValue(item)) { return false; } } return true; } else if (typeof mixed === 'object') { for (var key in mixed) { if (!isValue(mixed[key])) { return false; } } return true; } else { return false; } } function typeOf(value ) { if (value === null) { return NullType; } else if (typeof value === 'string') { return StringType; } else if (typeof value === 'boolean') { return BooleanType; } else if (typeof value === 'number') { return NumberType; } else if (value instanceof Color) { return ColorType; } else if (value instanceof Collator) { return CollatorType; } else if (value instanceof Formatted) { return FormattedType; } else if (Array.isArray(value)) { var length = value.length; var itemType ; for (var i = 0, list = value; i < list.length; i += 1) { var item = list[i]; var t = typeOf(item); if (!itemType) { itemType = t; } else if (itemType === t) { continue; } else { itemType = ValueType; break; } } return array(itemType || ValueType, length); } else { assert_1(typeof value === 'object'); return ObjectType; } } function toString$1(value ) { var type = typeof value; if (value === null) { return ''; } else if (type === 'string' || type === 'number' || type === 'boolean') { return String(value); } else if (value instanceof Color || value instanceof Formatted) { return value.toString(); } else { return JSON.stringify(value); } } // var Literal = function Literal(type , value ) { this.type = type; this.value = value; }; Literal.parse = function parse (args , context ) { if (args.length !== 2) { return context.error(("'literal' expression requires exactly one argument, but found " + (args.length - 1) + " instead.")); } if (!isValue(args[1])) { return context.error("invalid value"); } var value = (args[1] ); var type = typeOf(value); // special case: infer the item type if possible for zero-length arrays var expected = context.expectedType; if ( type.kind === 'array' && type.N === 0 && expected && expected.kind === 'array' && (typeof expected.N !== 'number' || expected.N === 0) ) { type = expected; } return new Literal(type, value); }; Literal.prototype.evaluate = function evaluate () { return this.value; }; Literal.prototype.eachChild = function eachChild () {}; Literal.prototype.possibleOutputs = function possibleOutputs () { return [this.value]; }; Literal.prototype.serialize = function serialize () { if (this.type.kind === 'array' || this.type.kind === 'object') { return ["literal", this.value]; } else if (this.value instanceof Color) { // Constant-folding can generate Literal expressions that you // couldn't actually generate with a "literal" expression, // so we have to implement an equivalent serialization here return ["rgba"].concat(this.value.toArray()); } else if (this.value instanceof Formatted) { // Same as Color return this.value.serialize(); } else { assert_1(this.value === null || typeof this.value === 'string' || typeof this.value === 'number' || typeof this.value === 'boolean'); return (this.value ); } }; // var RuntimeError = function RuntimeError(message ) { this.name = 'ExpressionEvaluationError'; this.message = message; }; RuntimeError.prototype.toJSON = function toJSON () { return this.message; }; // var types = { string: StringType, number: NumberType, boolean: BooleanType, object: ObjectType }; var Assertion = function Assertion(type , args ) { this.type = type; this.args = args; }; Assertion.parse = function parse (args , context ) { if (args.length < 2) { return context.error("Expected at least one argument."); } var i = 1; var type; var name = (args[0] ); if (name === 'array') { var itemType; if (args.length > 2) { var type$1 = args[1]; if (typeof type$1 !== 'string' || !(type$1 in types) || type$1 === 'object') { return context.error('The item type argument of "array" must be one of string, number, boolean', 1); } itemType = types[type$1]; i++; } else { itemType = ValueType; } var N; if (args.length > 3) { if (args[2] !== null && (typeof args[2] !== 'number' || args[2] < 0 || args[2] !== Math.floor(args[2])) ) { return context.error('The length argument to "array" must be a positive integer literal', 2); } N = args[2]; i++; } type = array(itemType, N); } else { assert_1(types[name], name); type = types[name]; } var parsed = []; for (; i < args.length; i++) { var input = context.parse(args[i], i, ValueType); if (!input) { return null; } parsed.push(input); } return new Assertion(type, parsed); }; Assertion.prototype.evaluate = function evaluate (ctx ) { for (var i = 0; i < this.args.length; i++) { var value = this.args[i].evaluate(ctx); var error = checkSubtype(this.type, typeOf(value)); if (!error) { return value; } else if (i === this.args.length - 1) { throw new RuntimeError(("Expected value to be of type " + (toString(this.type)) + ", but found " + (toString(typeOf(value))) + " instead.")); } } assert_1(false); return null; }; Assertion.prototype.eachChild = function eachChild (fn ) { this.args.forEach(fn); }; Assertion.prototype.possibleOutputs = function possibleOutputs () { var ref; return (ref = []).concat.apply(ref, this.args.map(function (arg) { return arg.possibleOutputs(); })); }; Assertion.prototype.serialize = function serialize () { var type = this.type; var serialized = [type.kind]; if (type.kind === 'array') { var itemType = type.itemType; if (itemType.kind === 'string' || itemType.kind === 'number' || itemType.kind === 'boolean') { serialized.push(itemType.kind); var N = type.N; if (typeof N === 'number' || this.args.length > 1) { serialized.push(N); } } } return serialized.concat(this.args.map(function (arg) { return arg.serialize(); })); }; // var FormatExpression = function FormatExpression(sections ) { this.type = FormattedType; this.sections = sections; }; FormatExpression.parse = function parse (args , context ) { if (args.length < 3) { return context.error("Expected at least two arguments."); } if ((args.length - 1) % 2 !== 0) { return context.error("Expected an even number of arguments."); } var sections = []; for (var i = 1; i < args.length - 1; i += 2) { var text = context.parse(args[i], 1, ValueType); if (!text) { return null; } var kind = text.type.kind; if (kind !== 'string' && kind !== 'value' && kind !== 'null') { return context.error("Formatted text type must be 'string', 'value', or 'null'."); } var options = (args[i + 1] ); if (typeof options !== "object" || Array.isArray(options)) { return context.error("Format options argument must be an object."); } var scale = null; if (options['font-scale']) { scale = context.parse(options['font-scale'], 1, NumberType); if (!scale) { return null; } } var font = null; if (options['text-font']) { font = context.parse(options['text-font'], 1, array(StringType)); if (!font) { return null; } } sections.push({text: text, scale: scale, font: font}); } return new FormatExpression(sections); }; FormatExpression.prototype.evaluate = function evaluate (ctx ) { return new Formatted( this.sections.map(function (section) { return new FormattedSection( toString$1(section.text.evaluate(ctx)), section.scale ? section.scale.evaluate(ctx) : null, section.font ? section.font.evaluate(ctx).join(',') : null ); } ) ); }; FormatExpression.prototype.eachChild = function eachChild (fn ) { for (var i = 0, list = this.sections; i < list.length; i += 1) { var section = list[i]; fn(section.text); if (section.scale) { fn(section.scale); } if (section.font) { fn(section.font); } } }; FormatExpression.prototype.possibleOutputs = function possibleOutputs () { // Technically the combinatoric set of all children // Usually, this.text will be undefined anyway return [undefined]; }; FormatExpression.prototype.serialize = function serialize () { var serialized = ["format"]; for (var i = 0, list = this.sections; i < list.length; i += 1) { var section = list[i]; serialized.push(section.text.serialize()); var options = {}; if (section.scale) { options['font-scale'] = section.scale.serialize(); } if (section.font) { options['text-font'] = section.font.serialize(); } serialized.push(options); } return serialized; }; // var types$1 = { 'to-boolean': BooleanType, 'to-color': ColorType, 'to-number': NumberType, 'to-string': StringType }; /** * Special form for error-coalescing coercion expressions "to-number", * "to-color". Since these coercions can fail at runtime, they accept multiple * arguments, only evaluating one at a time until one succeeds. * * @private */ var Coercion = function Coercion(type , args ) { this.type = type; this.args = args; }; Coercion.parse = function parse (args , context ) { if (args.length < 2) { return context.error("Expected at least one argument."); } var name = (args[0] ); assert_1(types$1[name], name); if ((name === 'to-boolean' || name === 'to-string') && args.length !== 2) { return context.error("Expected one argument."); } var type = types$1[name]; var parsed = []; for (var i = 1; i < args.length; i++) { var input = context.parse(args[i], i, ValueType); if (!input) { return null; } parsed.push(input); } return new Coercion(type, parsed); }; Coercion.prototype.evaluate = function evaluate (ctx ) { if (this.type.kind === 'boolean') { return Boolean(this.args[0].evaluate(ctx)); } else if (this.type.kind === 'color') { var input; var error; for (var i = 0, list = this.args; i < list.length; i += 1) { var arg = list[i]; input = arg.evaluate(ctx); error = null; if (input instanceof Color) { return input; } else if (typeof input === 'string') { var c = ctx.parseColor(input); if (c) { return c; } } else if (Array.isArray(input)) { if (input.length < 3 || input.length > 4) { error = "Invalid rbga value " + (JSON.stringify(input)) + ": expected an array containing either three or four numeric values."; } else { error = validateRGBA(input[0], input[1], input[2], input[3]); } if (!error) { return new Color((input[0] ) / 255, (input[1] ) / 255, (input[2] ) / 255, (input[3] )); } } } throw new RuntimeError(error || ("Could not parse color from value '" + (typeof input === 'string' ? input : String(JSON.stringify(input))) + "'")); } else if (this.type.kind === 'number') { var value = null; for (var i$1 = 0, list$1 = this.args; i$1 < list$1.length; i$1 += 1) { var arg$1 = list$1[i$1]; value = arg$1.evaluate(ctx); if (value === null) { return 0; } var num = Number(value); if (isNaN(num)) { continue; } return num; } throw new RuntimeError(("Could not convert " + (JSON.stringify(value)) + " to number.")); } else if (this.type.kind === 'formatted') { // There is no explicit 'to-formatted' but this coercion can be implicitly // created by properties that expect the 'formatted' type. return Formatted.fromString(toString$1(this.args[0].evaluate(ctx))); } else { return toString$1(this.args[0].evaluate(ctx)); } }; Coercion.prototype.eachChild = function eachChild (fn ) { this.args.forEach(fn); }; Coercion.prototype.possibleOutputs = function possibleOutputs () { var ref; return (ref = []).concat.apply(ref, this.args.map(function (arg) { return arg.possibleOutputs(); })); }; Coercion.prototype.serialize = function serialize () { if (this.type.kind === 'formatted') { return new FormatExpression([{text: this.args[0], scale: null, font: null}]).serialize(); } var serialized = [("to-" + (this.type.kind))]; this.eachChild(function (child) { serialized.push(child.serialize()); }); return serialized; }; // var geometryTypes = ['Unknown', 'Point', 'LineString', 'Polygon']; var EvaluationContext = function EvaluationContext() { this.globals = (null ); this.feature = null; this.featureState = null; this._parseColorCache = {}; }; EvaluationContext.prototype.id = function id () { return this.feature && 'id' in this.feature ? this.feature.id : null; }; EvaluationContext.prototype.geometryType = function geometryType () { return this.feature ? typeof this.feature.type === 'number' ? geometryTypes[this.feature.type] : this.feature.type : null; }; EvaluationContext.prototype.properties = function properties () { return this.feature && this.feature.properties || {}; }; EvaluationContext.prototype.parseColor = function parseColor (input ) { var cached = this._parseColorCache[input]; if (!cached) { cached = this._parseColorCache[input] = Color.parse(input); } return cached; }; // var CompoundExpression = function CompoundExpression(name , type , evaluate , args ) { this.name = name; this.type = type; this._evaluate = evaluate; this.args = args; }; CompoundExpression.prototype.evaluate = function evaluate (ctx ) { return this._evaluate(ctx, this.args); }; CompoundExpression.prototype.eachChild = function eachChild (fn ) { this.args.forEach(fn); }; CompoundExpression.prototype.possibleOutputs = function possibleOutputs () { return [undefined]; }; CompoundExpression.prototype.serialize = function serialize () { return [this.name].concat(this.args.map(function (arg) { return arg.serialize(); })); }; CompoundExpression.parse = function parse (args , context ) { var ref$1; var op = (args[0] ); var definition = CompoundExpression.definitions[op]; if (!definition) { return context.error(("Unknown expression \"" + op + "\". If you wanted a literal array, use [\"literal\", [...]]."), 0); } // Now check argument types against each signature var type = Array.isArray(definition) ? definition[0] : definition.type; var availableOverloads = Array.isArray(definition) ? [[definition[1], definition[2]]] : definition.overloads; var overloads = availableOverloads.filter(function (ref) { var signature = ref[0]; return ( !Array.isArray(signature) || // varags signature.length === args.length - 1 // correct param count ); }); var signatureContext = (null ); for (var i$3 = 0, list = overloads; i$3 < list.length; i$3 += 1) { // Use a fresh context for each attempted signature so that, if // we eventually succeed, we haven't polluted `context.errors`. var ref = list[i$3]; var params = ref[0]; var evaluate = ref[1]; signatureContext = new ParsingContext(context.registry, context.path, null, context.scope); // First parse all the args, potentially coercing to the // types expected by this overload. var parsedArgs = []; var argParseFailed = false; for (var i = 1; i < args.length; i++) { var arg = args[i]; var expectedType = Array.isArray(params) ? params[i - 1] : params.type; var parsed = signatureContext.parse(arg, 1 + parsedArgs.length, expectedType); if (!parsed) { argParseFailed = true; break; } parsedArgs.push(parsed); } if (argParseFailed) { // Couldn't coerce args of this overload to expected type, move // on to next one. continue; } if (Array.isArray(params)) { if (params.length !== parsedArgs.length) { signatureContext.error(("Expected " + (params.length) + " arguments, but found " + (parsedArgs.length) + " instead.")); continue; } } for (var i$1 = 0; i$1 < parsedArgs.length; i$1++) { var expected = Array.isArray(params) ? params[i$1] : params.type; var arg$1 = parsedArgs[i$1]; signatureContext.concat(i$1 + 1).checkSubtype(expected, arg$1.type); } if (signatureContext.errors.length === 0) { return new CompoundExpression(op, type, evaluate, parsedArgs); } } assert_1(!signatureContext || signatureContext.errors.length > 0); if (overloads.length === 1) { (ref$1 = context.errors).push.apply(ref$1, signatureContext.errors); } else { var expected$1 = overloads.length ? overloads : availableOverloads; var signatures = expected$1 .map(function (ref) { var params = ref[0]; return stringifySignature(params); }) .join(' | '); var actualTypes = []; // For error message, re-parse arguments without trying to // apply any coercions for (var i$2 = 1; i$2 < args.length; i$2++) { var parsed$1 = context.parse(args[i$2], 1 + actualTypes.length); if (!parsed$1) { return null; } actualTypes.push(toString(parsed$1.type)); } context.error(("Expected arguments of type " + signatures + ", but found (" + (actualTypes.join(', ')) + ") instead.")); } return null; }; CompoundExpression.register = function register ( registry , definitions ) { assert_1(!CompoundExpression.definitions); CompoundExpression.definitions = definitions; for (var name in definitions) { registry[name] = CompoundExpression; } }; function stringifySignature(signature ) { if (Array.isArray(signature)) { return ("(" + (signature.map(toString).join(', ')) + ")"); } else { return ("(" + (toString(signature.type)) + "...)"); } } // var CollatorExpression = function CollatorExpression(caseSensitive , diacriticSensitive , locale ) { this.type = CollatorType; this.locale = locale; this.caseSensitive = caseSensitive; this.diacriticSensitive = diacriticSensitive; }; CollatorExpression.parse = function parse (args , context ) { if (args.length !== 2) { return context.error("Expected one argument."); } var options = (args[1] ); if (typeof options !== "object" || Array.isArray(options)) { return context.error("Collator options argument must be an object."); } var caseSensitive = context.parse( options['case-sensitive'] === undefined ? false : options['case-sensitive'], 1, BooleanType); if (!caseSensitive) { return null; } var diacriticSensitive = context.parse( options['diacritic-sensitive'] === undefined ? false : options['diacritic-sensitive'], 1, BooleanType); if (!diacriticSensitive) { return null; } var locale = null; if (options['locale']) { locale = context.parse(options['locale'], 1, StringType); if (!locale) { return null; } } return new CollatorExpression(caseSensitive, diacriticSensitive, locale); }; CollatorExpression.prototype.evaluate = function evaluate (ctx ) { return new Collator(this.caseSensitive.evaluate(ctx), this.diacriticSensitive.evaluate(ctx), this.locale ? this.locale.evaluate(ctx) : null); }; CollatorExpression.prototype.eachChild = function eachChild (fn ) { fn(this.caseSensitive); fn(this.diacriticSensitive); if (this.locale) { fn(this.locale); } }; CollatorExpression.prototype.possibleOutputs = function possibleOutputs () { // Technically the set of possible outputs is the combinatoric set of Collators produced // by all possibleOutputs of locale/caseSensitive/diacriticSensitive // But for the primary use of Collators in comparison operators, we ignore the Collator's // possibleOutputs anyway, so we can get away with leaving this undefined for now. return [undefined]; }; CollatorExpression.prototype.serialize = function serialize () { var options = {}; options['case-sensitive'] = this.caseSensitive.serialize(); options['diacritic-sensitive'] = this.diacriticSensitive.serialize(); if (this.locale) { options['locale'] = this.locale.serialize(); } return ["collator", options]; }; // function isFeatureConstant(e ) { if (e instanceof CompoundExpression) { if (e.name === 'get' && e.args.length === 1) { return false; } else if (e.name === 'feature-state') { return false; } else if (e.name === 'has' && e.args.length === 1) { return false; } else if ( e.name === 'properties' || e.name === 'geometry-type' || e.name === 'id' ) { return false; } else if (/^filter-/.test(e.name)) { return false; } } var result = true; e.eachChild(function (arg) { if (result && !isFeatureConstant(arg)) { result = false; } }); return result; } function isStateConstant(e ) { if (e instanceof CompoundExpression) { if (e.name === 'feature-state') { return false; } } var result = true; e.eachChild(function (arg) { if (result && !isStateConstant(arg)) { result = false; } }); return result; } function isGlobalPropertyConstant(e , properties ) { if (e instanceof CompoundExpression && properties.indexOf(e.name) >= 0) { return false; } var result = true; e.eachChild(function (arg) { if (result && !isGlobalPropertyConstant(arg, properties)) { result = false; } }); return result; } // var Var = function Var(name , boundExpression ) { this.type = boundExpression.type; this.name = name; this.boundExpression = boundExpression; }; Var.parse = function parse (args , context ) { if (args.length !== 2 || typeof args[1] !== 'string') { return context.error("'var' expression requires exactly one string literal argument."); } var name = args[1]; if (!context.scope.has(name)) { return context.error(("Unknown variable \"" + name + "\". Make sure \"" + name + "\" has been bound in an enclosing \"let\" expression before using it."), 1); } return new Var(name, context.scope.get(name)); }; Var.prototype.evaluate = function evaluate (ctx ) { return this.boundExpression.evaluate(ctx); }; Var.prototype.eachChild = function eachChild () {}; Var.prototype.possibleOutputs = function possibleOutputs () { return [undefined]; }; Var.prototype.serialize = function serialize () { return ["var", this.name]; }; // /** * State associated parsing at a given point in an expression tree. * @private */ var ParsingContext = function ParsingContext( registry , path, expectedType , scope, errors ) { if ( path === void 0 ) path = []; if ( scope === void 0 ) scope = new Scope(); if ( errors === void 0 ) errors = []; this.registry = registry; this.path = path; this.key = path.map(function (part) { return ("[" + part + "]"); }).join(''); this.scope = scope; this.errors = errors; this.expectedType = expectedType; }; /** * @param expr the JSON expression to parse * @param index the optional argument index if this expression is an argument of a parent expression that's being parsed * @param options * @param options.omitTypeAnnotations set true to omit inferred type annotations. Caller beware: with this option set, the parsed expression's type will NOT satisfy `expectedType` if it would normally be wrapped in an inferred annotation. * @private */ ParsingContext.prototype.parse = function parse ( expr , index , expectedType , bindings , options ) { if ( options === void 0 ) options = {}; if (index) { return this.concat(index, expectedType, bindings)._parse(expr, options); } return this._parse(expr, options); }; ParsingContext.prototype._parse = function _parse (expr , options ) { if (expr === null || typeof expr === 'string' || typeof expr === 'boolean' || typeof expr === 'number') { expr = ['literal', expr]; } function annotate(parsed, type, typeAnnotation ) { if (typeAnnotation === 'assert') { return new Assertion(type, [parsed]); } else if (typeAnnotation === 'coerce') { return new Coercion(type, [parsed]); } else { return parsed; } } if (Array.isArray(expr)) { if (expr.length === 0) { return this.error("Expected an array with at least one element. If you wanted a literal array, use [\"literal\", []]."); } var op = expr[0]; if (typeof op !== 'string') { this.error(("Expression name must be a string, but found " + (typeof op) + " instead. If you wanted a literal array, use [\"literal\", [...]]."), 0); return null; } var Expr = this.registry[op]; if (Expr) { var parsed = Expr.parse(expr, this); if (!parsed) { return null; } if (this.expectedType) { var expected = this.expectedType; var actual = parsed.type; // When we expect a number, string, boolean, or array but have a value, wrap it in an assertion. // When we expect a color or formatted string, but have a string or value, wrap it in a coercion. // Otherwise, we do static type-checking. // // These behaviors are overridable for: // * The "coalesce" operator, which needs to omit type annotations. // * String-valued properties (e.g. `text-field`), where coercion is more convenient than assertion. // if ((expected.kind === 'string' || expected.kind === 'number' || expected.kind === 'boolean' || expected.kind === 'object' || expected.kind === 'array') && actual.kind === 'value') { parsed = annotate(parsed, expected, options.typeAnnotation || 'assert'); } else if ((expected.kind === 'color' || expected.kind === 'formatted') && (actual.kind === 'value' || actual.kind === 'string')) { parsed = annotate(parsed, expected, options.typeAnnotation || 'coerce'); } else if (this.checkSubtype(expected, actual)) { return null; } } // If an expression's arguments are all literals, we can evaluate // it immediately and replace it with a literal value in the // parsed/compiled result. if (!(parsed instanceof Literal) && isConstant(parsed)) { var ec = new EvaluationContext(); try { parsed = new Literal(parsed.type, parsed.evaluate(ec)); } catch (e) { this.error(e.message); return null; } } return parsed; } return this.error(("Unknown expression \"" + op + "\". If you wanted a literal array, use [\"literal\", [...]]."), 0); } else if (typeof expr === 'undefined') { return this.error("'undefined' value invalid. Use null instead."); } else if (typeof expr === 'object') { return this.error("Bare objects invalid. Use [\"literal\", {...}] instead."); } else { return this.error(("Expected an array, but found " + (typeof expr) + " instead.")); } }; /** * Returns a copy of this context suitable for parsing the subexpression at * index `index`, optionally appending to 'let' binding map. * * Note that `errors` property, intended for collecting errors while * parsing, is copied by reference rather than cloned. * @private */ ParsingContext.prototype.concat = function concat (index , expectedType , bindings ) { var path = typeof index === 'number' ? this.path.concat(index) : this.path; var scope = bindings ? this.scope.concat(bindings) : this.scope; return new ParsingContext( this.registry, path, expectedType || null, scope, this.errors ); }; /** * Push a parsing (or type checking) error into the `this.errors` * @param error The message * @param keys Optionally specify the source of the error at a child * of the current expression at `this.key`. * @private */ ParsingContext.prototype.error = function error (error$1 ) { var keys = [], len = arguments.length - 1; while ( len-- > 0 ) keys[ len ] = arguments[ len + 1 ]; var key = "" + (this.key) + (keys.map(function (k) { return ("[" + k + "]"); }).join('')); this.errors.push(new ParsingError(key, error$1)); }; /** * Returns null if `t` is a subtype of `expected`; otherwise returns an * error message and also pushes it to `this.errors`. */ ParsingContext.prototype.checkSubtype = function checkSubtype$1 (expected , t ) { var error = checkSubtype(expected, t); if (error) { this.error(error); } return error; }; function isConstant(expression ) { if (expression instanceof Var) { return isConstant(expression.boundExpression); } else if (expression instanceof CompoundExpression && expression.name === 'error') { return false; } else if (expression instanceof CollatorExpression) { // Although the results of a Collator expression with fixed arguments // generally shouldn't change between executions, we can't serialize them // as constant expressions because results change based on environment. return false; } var isTypeAnnotation = expression instanceof Coercion || expression instanceof Assertion; var childrenConstant = true; expression.eachChild(function (child) { // We can _almost_ assume that if `expressions` children are constant, // they would already have been evaluated to Literal values when they // were parsed. Type annotations are the exception, because they might // have been inferred and added after a child was parsed. // So we recurse into isConstant() for the children of type annotations, // but otherwise simply check whether they are Literals. if (isTypeAnnotation) { childrenConstant = childrenConstant && isConstant(child); } else { childrenConstant = childrenConstant && child instanceof Literal; } }); if (!childrenConstant) { return false; } return isFeatureConstant(expression) && isGlobalPropertyConstant(expression, ['zoom', 'heatmap-density', 'line-progress', 'accumulated', 'is-supported-script']); } // /** * Returns the index of the last stop <= input, or 0 if it doesn't exist. * @private */ function findStopLessThanOrEqualTo(stops , input ) { var n = stops.length; var lowerIndex = 0; var upperIndex = n - 1; var currentIndex = 0; var currentValue, upperValue; while (lowerIndex <= upperIndex) { currentIndex = Math.floor((lowerIndex + upperIndex) / 2); currentValue = stops[currentIndex]; upperValue = stops[currentIndex + 1]; if (input === currentValue || input > currentValue && input < upperValue) { // Search complete return currentIndex; } else if (currentValue < input) { lowerIndex = currentIndex + 1; } else if (currentValue > input) { upperIndex = currentIndex - 1; } else { throw new RuntimeError('Input is not a number.'); } } return Math.max(currentIndex - 1, 0); } // var Step = function Step(type , input , stops ) { this.type = type; this.input = input; this.labels = []; this.outputs = []; for (var i = 0, list = stops; i < list.length; i += 1) { var ref = list[i]; var label = ref[0]; var expression = ref[1]; this.labels.push(label); this.outputs.push(expression); } }; Step.parse = function parse (args , context ) { var input = args[1]; var rest = args.slice(2); if (args.length - 1 < 4) { return context.error(("Expected at least 4 arguments, but found only " + (args.length - 1) + ".")); } if ((args.length - 1) % 2 !== 0) { return context.error("Expected an even number of arguments."); } input = context.parse(input, 1, NumberType); if (!input) { return null; } var stops = []; var outputType = (null ); if (context.expectedType && context.expectedType.kind !== 'value') { outputType = context.expectedType; } rest.unshift(-Infinity); for (var i = 0; i < rest.length; i += 2) { var label = rest[i]; var value = rest[i + 1]; var labelKey = i + 1; var valueKey = i + 2; if (typeof label !== 'number') { return context.error('Input/output pairs for "step" expressions must be defined using literal numeric values (not computed expressions) for the input values.', labelKey); } if (stops.length && stops[stops.length - 1][0] >= label) { return context.error('Input/output pairs for "step" expressions must be arranged with input values in strictly ascending order.', labelKey); } var parsed = context.parse(value, valueKey, outputType); if (!parsed) { return null; } outputType = outputType || parsed.type; stops.push([label, parsed]); } return new Step(outputType, input, stops); }; Step.prototype.evaluate = function evaluate (ctx ) { var labels = this.labels; var outputs = this.outputs; if (labels.length === 1) { return outputs[0].evaluate(ctx); } var value = ((this.input.evaluate(ctx) ) ); if (value <= labels[0]) { return outputs[0].evaluate(ctx); } var stopCount = labels.length; if (value >= labels[stopCount - 1]) { return outputs[stopCount - 1].evaluate(ctx); } var index = findStopLessThanOrEqualTo(labels, value); return outputs[index].evaluate(ctx); }; Step.prototype.eachChild = function eachChild (fn ) { fn(this.input); for (var i = 0, list = this.outputs; i < list.length; i += 1) { var expression = list[i]; fn(expression); } }; Step.prototype.possibleOutputs = function possibleOutputs () { var ref; return (ref = []).concat.apply(ref, this.outputs.map(function (output) { return output.possibleOutputs(); })); }; Step.prototype.serialize = function serialize () { var serialized = ["step", this.input.serialize()]; for (var i = 0; i < this.labels.length; i++) { if (i > 0) { serialized.push(this.labels[i]); } serialized.push(this.outputs[i].serialize()); } return serialized; }; // function number(a , b , t ) { return (a * (1 - t)) + (b * t); } function color(from , to , t ) { return new Color( number(from.r, to.r, t), number(from.g, to.g, t), number(from.b, to.b, t), number(from.a, to.a, t) ); } function array$1(from , to , t ) { return from.map(function (d, i) { return number(d, to[i], t); }); } var interpolate = /*#__PURE__*/Object.freeze({ number: number, color: color, array: array$1 }); // // Constants var Xn = 0.950470, // D65 standard referent Yn = 1, Zn = 1.088830, t0 = 4 / 29, t1 = 6 / 29, t2 = 3 * t1 * t1, t3 = t1 * t1 * t1, deg2rad = Math.PI / 180, rad2deg = 180 / Math.PI; // Utilities function xyz2lab(t) { return t > t3 ? Math.pow(t, 1 / 3) : t / t2 + t0; } function lab2xyz(t) { return t > t1 ? t * t * t : t2 * (t - t0); } function xyz2rgb(x) { return 255 * (x <= 0.0031308 ? 12.92 * x : 1.055 * Math.pow(x, 1 / 2.4) - 0.055); } function rgb2xyz(x) { x /= 255; return x <= 0.04045 ? x / 12.92 : Math.pow((x + 0.055) / 1.055, 2.4); } // LAB function rgbToLab(rgbColor ) { var b = rgb2xyz(rgbColor.r), a = rgb2xyz(rgbColor.g), l = rgb2xyz(rgbColor.b), x = xyz2lab((0.4124564 * b + 0.3575761 * a + 0.1804375 * l) / Xn), y = xyz2lab((0.2126729 * b + 0.7151522 * a + 0.0721750 * l) / Yn), z = xyz2lab((0.0193339 * b + 0.1191920 * a + 0.9503041 * l) / Zn); return { l: 116 * y - 16, a: 500 * (x - y), b: 200 * (y - z), alpha: rgbColor.a }; } function labToRgb(labColor ) { var y = (labColor.l + 16) / 116, x = isNaN(labColor.a) ? y : y + labColor.a / 500, z = isNaN(labColor.b) ? y : y - labColor.b / 200; y = Yn * lab2xyz(y); x = Xn * lab2xyz(x); z = Zn * lab2xyz(z); return new Color( xyz2rgb(3.2404542 * x - 1.5371385 * y - 0.4985314 * z), // D65 -> sRGB xyz2rgb(-0.9692660 * x + 1.8760108 * y + 0.0415560 * z), xyz2rgb(0.0556434 * x - 0.2040259 * y + 1.0572252 * z), labColor.alpha ); } function interpolateLab(from , to , t ) { return { l: number(from.l, to.l, t), a: number(from.a, to.a, t), b: number(from.b, to.b, t), alpha: number(from.alpha, to.alpha, t) }; } // HCL function rgbToHcl(rgbColor ) { var ref = rgbToLab(rgbColor); var l = ref.l; var a = ref.a; var b = ref.b; var h = Math.atan2(b, a) * rad2deg; return { h: h < 0 ? h + 360 : h, c: Math.sqrt(a * a + b * b), l: l, alpha: rgbColor.a }; } function hclToRgb(hclColor ) { var h = hclColor.h * deg2rad, c = hclColor.c, l = hclColor.l; return labToRgb({ l: l, a: Math.cos(h) * c, b: Math.sin(h) * c, alpha: hclColor.alpha }); } function interpolateHue(a , b , t ) { var d = b - a; return a + t * (d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d); } function interpolateHcl(from , to , t ) { return { h: interpolateHue(from.h, to.h, t), c: number(from.c, to.c, t), l: number(from.l, to.l, t), alpha: number(from.alpha, to.alpha, t) }; } var lab = { forward: rgbToLab, reverse: labToRgb, interpolate: interpolateLab }; var hcl = { forward: rgbToHcl, reverse: hclToRgb, interpolate: interpolateHcl }; var colorSpaces = /*#__PURE__*/Object.freeze({ lab: lab, hcl: hcl }); // var Interpolate = function Interpolate(type , operator , interpolation , input , stops ) { this.type = type; this.operator = operator; this.interpolation = interpolation; this.input = input; this.labels = []; this.outputs = []; for (var i = 0, list = stops; i < list.length; i += 1) { var ref = list[i]; var label = ref[0]; var expression = ref[1]; this.labels.push(label); this.outputs.push(expression); } }; Interpolate.interpolationFactor = function interpolationFactor (interpolation , input , lower , upper ) { var t = 0; if (interpolation.name === 'exponential') { t = exponentialInterpolation(input, interpolation.base, lower, upper); } else if (interpolation.name === 'linear') { t = exponentialInterpolation(input, 1, lower, upper); } else if (interpolation.name === 'cubic-bezier') { var c = interpolation.controlPoints; var ub = new unitbezier(c[0], c[1], c[2], c[3]); t = ub.solve(exponentialInterpolation(input, 1, lower, upper)); } return t; }; Interpolate.parse = function parse (args , context ) { var operator = args[0]; var interpolation = args[1]; var input = args[2]; var rest = args.slice(3); if (!Array.isArray(interpolation) || interpolation.length === 0) { return context.error("Expected an interpolation type expression.", 1); } if (interpolation[0] === 'linear') { interpolation = { name: 'linear' }; } else if (interpolation[0] === 'exponential') { var base = interpolation[1]; if (typeof base !== 'number') { return context.error("Exponential interpolation requires a numeric base.", 1, 1); } interpolation = { name: 'exponential', base: base }; } else if (interpolation[0] === 'cubic-bezier') { var controlPoints = interpolation.slice(1); if ( controlPoints.length !== 4 || controlPoints.some(function (t) { return typeof t !== 'number' || t < 0 || t > 1; }) ) { return context.error('Cubic bezier interpolation requires four numeric arguments with values between 0 and 1.', 1); } interpolation = { name: 'cubic-bezier', controlPoints: (controlPoints ) }; } else { return context.error(("Unknown interpolation type " + (String(interpolation[0]))), 1, 0); } if (args.length - 1 < 4) { return context.error(("Expected at least 4 arguments, but found only " + (args.length - 1) + ".")); } if ((args.length - 1) % 2 !== 0) { return context.error("Expected an even number of arguments."); } input = context.parse(input, 2, NumberType); if (!input) { return null; } var stops = []; var outputType = (null ); if (operator === 'interpolate-hcl' || operator === 'interpolate-lab') { outputType = ColorType; } else if (context.expectedType && context.expectedType.kind !== 'value') { outputType = context.expectedType; } for (var i = 0; i < rest.length; i += 2) { var label = rest[i]; var value = rest[i + 1]; var labelKey = i + 3; var valueKey = i + 4; if (typeof label !== 'number') { return context.error('Input/output pairs for "interpolate" expressions must be defined using literal numeric values (not computed expressions) for the input values.', labelKey); } if (stops.length && stops[stops.length - 1][0] >= label) { return context.error('Input/output pairs for "interpolate" expressions must be arranged with input values in strictly ascending order.', labelKey); } var parsed = context.parse(value, valueKey, outputType); if (!parsed) { return null; } outputType = outputType || parsed.type; stops.push([label, parsed]); } if (outputType.kind !== 'number' && outputType.kind !== 'color' && !( outputType.kind === 'array' && outputType.itemType.kind === 'number' && typeof outputType.N === 'number' ) ) { return context.error(("Type " + (toString(outputType)) + " is not interpolatable.")); } return new Interpolate(outputType, (operator ), interpolation, input, stops); }; Interpolate.prototype.evaluate = function evaluate (ctx ) { var labels = this.labels; var outputs = this.outputs; if (labels.length === 1) { return outputs[0].evaluate(ctx); } var value = ((this.input.evaluate(ctx) ) ); if (value <= labels[0]) { return outputs[0].evaluate(ctx); } var stopCount = labels.length; if (value >= labels[stopCount - 1]) { return outputs[stopCount - 1].evaluate(ctx); } var index = findStopLessThanOrEqualTo(labels, value); var lower = labels[index]; var upper = labels[index + 1]; var t = Interpolate.interpolationFactor(this.interpolation, value, lower, upper); var outputLower = outputs[index].evaluate(ctx); var outputUpper = outputs[index + 1].evaluate(ctx); if (this.operator === 'interpolate') { return (interpolate[this.type.kind.toLowerCase()] )(outputLower, outputUpper, t); // eslint-disable-line import/namespace } else if (this.operator === 'interpolate-hcl') { return hcl.reverse(hcl.interpolate(hcl.forward(outputLower), hcl.forward(outputUpper), t)); } else { return lab.reverse(lab.interpolate(lab.forward(outputLower), lab.forward(outputUpper), t)); } }; Interpolate.prototype.eachChild = function eachChild (fn ) { fn(this.input); for (var i = 0, list = this.outputs; i < list.length; i += 1) { var expression = list[i]; fn(expression); } }; Interpolate.prototype.possibleOutputs = function possibleOutputs () { var ref; return (ref = []).concat.apply(ref, this.outputs.map(function (output) { return output.possibleOutputs(); })); }; Interpolate.prototype.serialize = function serialize () { var interpolation; if (this.interpolation.name === 'linear') { interpolation = ["linear"]; } else if (this.interpolation.name === 'exponential') { if (this.interpolation.base === 1) { interpolation = ["linear"]; } else { interpolation = ["exponential", this.interpolation.base]; } } else { interpolation = ["cubic-bezier" ].concat(this.interpolation.controlPoints); } var serialized = [this.operator, interpolation, this.input.serialize()]; for (var i = 0; i < this.labels.length; i++) { serialized.push( this.labels[i], this.outputs[i].serialize() ); } return serialized; }; /** * Returns a ratio that can be used to interpolate between exponential function * stops. * How it works: Two consecutive stop values define a (scaled and shifted) exponential function `f(x) = a * base^x + b`, where `base` is the user-specified base, * and `a` and `b` are constants affording sufficient degrees of freedom to fit * the function to the given stops. * * Here's a bit of algebra that lets us compute `f(x)` directly from the stop * values without explicitly solving for `a` and `b`: * * First stop value: `f(x0) = y0 = a * base^x0 + b` * Second stop value: `f(x1) = y1 = a * base^x1 + b` * => `y1 - y0 = a(base^x1 - base^x0)` * => `a = (y1 - y0)/(base^x1 - base^x0)` * * Desired value: `f(x) = y = a * base^x + b` * => `f(x) = y0 + a * (base^x - base^x0)` * * From the above, we can replace the `a` in `a * (base^x - base^x0)` and do a * little algebra: * ``` * a * (base^x - base^x0) = (y1 - y0)/(base^x1 - base^x0) * (base^x - base^x0) * = (y1 - y0) * (base^x - base^x0) / (base^x1 - base^x0) * ``` * * If we let `(base^x - base^x0) / (base^x1 base^x0)`, then we have * `f(x) = y0 + (y1 - y0) * ratio`. In other words, `ratio` may be treated as * an interpolation factor between the two stops' output values. * * (Note: a slightly different form for `ratio`, * `(base^(x-x0) - 1) / (base^(x1-x0) - 1) `, is equivalent, but requires fewer * expensive `Math.pow()` operations.) * * @private */ function exponentialInterpolation(input, base, lowerValue, upperValue) { var difference = upperValue - lowerValue; var progress = input - lowerValue; if (difference === 0) { return 0; } else if (base === 1) { return progress / difference; } else { return (Math.pow(base, progress) - 1) / (Math.pow(base, difference) - 1); } } // var Coalesce = function Coalesce(type , args ) { this.type = type; this.args = args; }; Coalesce.parse = function parse (args , context ) { if (args.length < 2) { return context.error("Expectected at least one argument."); } var outputType = (null ); var expectedType = context.expectedType; if (expectedType && expectedType.kind !== 'value') { outputType = expectedType; } var parsedArgs = []; for (var i = 0, list = args.slice(1); i < list.length; i += 1) { var arg = list[i]; var parsed = context.parse(arg, 1 + parsedArgs.length, outputType, undefined, {typeAnnotation: 'omit'}); if (!parsed) { return null; } outputType = outputType || parsed.type; parsedArgs.push(parsed); } assert_1(outputType); // Above, we parse arguments without inferred type annotation so that // they don't produce a runtime error for `null` input, which would // preempt the desired null-coalescing behavior. // Thus, if any of our arguments would have needed an annotation, we // need to wrap the enclosing coalesce expression with it instead. var needsAnnotation = expectedType && parsedArgs.some(function (arg) { return checkSubtype(expectedType, arg.type); }); return needsAnnotation ? new Coalesce(ValueType, parsedArgs) : new Coalesce((outputType ), parsedArgs); }; Coalesce.prototype.evaluate = function evaluate (ctx ) { var result = null; for (var i = 0, list = this.args; i < list.length; i += 1) { var arg = list[i]; result = arg.evaluate(ctx); if (result !== null) { break; } } return result; }; Coalesce.prototype.eachChild = function eachChild (fn ) { this.args.forEach(fn); }; Coalesce.prototype.possibleOutputs = function possibleOutputs () { var ref; return (ref = []).concat.apply(ref, this.args.map(function (arg) { return arg.possibleOutputs(); })); }; Coalesce.prototype.serialize = function serialize () { var serialized = ["coalesce"]; this.eachChild(function (child) { serialized.push(child.serialize()); }); return serialized; }; // var Let = function Let(bindings , result ) { this.type = result.type; this.bindings = [].concat(bindings); this.result = result; }; Let.prototype.evaluate = function evaluate (ctx ) { return this.result.evaluate(ctx); }; Let.prototype.eachChild = function eachChild (fn ) { for (var i = 0, list = this.bindings; i < list.length; i += 1) { var binding = list[i]; fn(binding[1]); } fn(this.result); }; Let.parse = function parse (args , context ) { if (args.length < 4) { return context.error(("Expected at least 3 arguments, but found " + (args.length - 1) + " instead.")); } var bindings = []; for (var i = 1; i < args.length - 1; i += 2) { var name = args[i]; if (typeof name !== 'string') { return context.error(("Expected string, but found " + (typeof name) + " instead."), i); } if (/[^a-zA-Z0-9_]/.test(name)) { return context.error("Variable names must contain only alphanumeric characters or '_'.", i); } var value = context.parse(args[i + 1], i + 1); if (!value) { return null; } bindings.push([name, value]); } var result = context.parse(args[args.length - 1], args.length - 1, context.expectedType, bindings); if (!result) { return null; } return new Let(bindings, result); }; Let.prototype.possibleOutputs = function possibleOutputs () { return this.result.possibleOutputs(); }; Let.prototype.serialize = function serialize () { var serialized = ["let"]; for (var i = 0, list = this.bindings; i < list.length; i += 1) { var ref = list[i]; var name = ref[0]; var expr = ref[1]; serialized.push(name, expr.serialize()); } serialized.push(this.result.serialize()); return serialized; }; // var At = function At(type , index , input ) { this.type = type; this.index = index; this.input = input; }; At.parse = function parse (args , context ) { if (args.length !== 3) { return context.error(("Expected 2 arguments, but found " + (args.length - 1) + " instead.")); } var index = context.parse(args[1], 1, NumberType); var input = context.parse(args[2], 2, array(context.expectedType || ValueType)); if (!index || !input) { return null; } var t = (input.type ); return new At(t.itemType, index, input); }; At.prototype.evaluate = function evaluate (ctx ) { var index = ((this.index.evaluate(ctx) ) ); var array = ((this.input.evaluate(ctx) ) ); if (index < 0) { throw new RuntimeError(("Array index out of bounds: " + index + " < 0.")); } if (index >= array.length) { throw new RuntimeError(("Array index out of bounds: " + index + " > " + (array.length - 1) + ".")); } if (index !== Math.floor(index)) { throw new RuntimeError(("Array index must be an integer, but found " + index + " instead.")); } return array[index]; }; At.prototype.eachChild = function eachChild (fn ) { fn(this.index); fn(this.input); }; At.prototype.possibleOutputs = function possibleOutputs () { return [undefined]; }; At.prototype.serialize = function serialize () { return ["at", this.index.serialize(), this.input.serialize()]; }; // // Map input label values to output expression index var Match = function Match(inputType , outputType , input , cases , outputs , otherwise ) { this.inputType = inputType; this.type = outputType; this.input = input; this.cases = cases; this.outputs = outputs; this.otherwise = otherwise; }; Match.parse = function parse (args , context ) { if (args.length < 5) { return context.error(("Expected at least 4 arguments, but found only " + (args.length - 1) + ".")); } if (args.length % 2 !== 1) { return context.error("Expected an even number of arguments."); } var inputType; var outputType; if (context.expectedType && context.expectedType.kind !== 'value') { outputType = context.expectedType; } var cases = {}; var outputs = []; for (var i = 2; i < args.length - 1; i += 2) { var labels = args[i]; var value = args[i + 1]; if (!Array.isArray(labels)) { labels = [labels]; } var labelContext = context.concat(i); if (labels.length === 0) { return labelContext.error('Expected at least one branch label.'); } for (var i$1 = 0, list = labels; i$1 < list.length; i$1 += 1) { var label = list[i$1]; if (typeof label !== 'number' && typeof label !== 'string') { return labelContext.error("Branch labels must be numbers or strings."); } else if (typeof label === 'number' && Math.abs(label) > Number.MAX_SAFE_INTEGER) { return labelContext.error(("Branch labels must be integers no larger than " + (Number.MAX_SAFE_INTEGER) + ".")); } else if (typeof label === 'number' && Math.floor(label) !== label) { return labelContext.error("Numeric branch labels must be integer values."); } else if (!inputType) { inputType = typeOf(label); } else if (labelContext.checkSubtype(inputType, typeOf(label))) { return null; } if (typeof cases[String(label)] !== 'undefined') { return labelContext.error('Branch labels must be unique.'); } cases[String(label)] = outputs.length; } var result = context.parse(value, i, outputType); if (!result) { return null; } outputType = outputType || result.type; outputs.push(result); } var input = context.parse(args[1], 1, ValueType); if (!input) { return null; } var otherwise = context.parse(args[args.length - 1], args.length - 1, outputType); if (!otherwise) { return null; } assert_1(inputType && outputType); if (input.type.kind !== 'value' && context.concat(1).checkSubtype((inputType ), input.type)) { return null; } return new Match((inputType ), (outputType ), input, cases, outputs, otherwise); }; Match.prototype.evaluate = function evaluate (ctx ) { var input = (this.input.evaluate(ctx) ); var output = (typeOf(input) === this.inputType && this.outputs[this.cases[input]]) || this.otherwise; return output.evaluate(ctx); }; Match.prototype.eachChild = function eachChild (fn ) { fn(this.input); this.outputs.forEach(fn); fn(this.otherwise); }; Match.prototype.possibleOutputs = function possibleOutputs () { var ref; return (ref = []) .concat.apply(ref, this.outputs.map(function (out) { return out.possibleOutputs(); })) .concat(this.otherwise.possibleOutputs()); }; Match.prototype.serialize = function serialize () { var this$1 = this; var serialized = ["match", this.input.serialize()]; // Sort so serialization has an arbitrary defined order, even though // branch order doesn't affect evaluation var sortedLabels = Object.keys(this.cases).sort(); // Group branches by unique match expression to support condensed // serializations of the form [case1, case2, ...] -> matchExpression var groupedByOutput = []; var outputLookup = {}; // lookup index into groupedByOutput for a given output expression for (var i = 0, list = sortedLabels; i < list.length; i += 1) { var label = list[i]; var outputIndex = outputLookup[this.cases[label]]; if (outputIndex === undefined) { // First time seeing this output, add it to the end of the grouped list outputLookup[this.cases[label]] = groupedByOutput.length; groupedByOutput.push([this.cases[label], [label]]); } else { // We've seen this expression before, add the label to that output's group groupedByOutput[outputIndex][1].push(label); } } var coerceLabel = function (label) { return this$1.inputType.kind === 'number' ? Number(label) : label; }; for (var i$1 = 0, list$1 = groupedByOutput; i$1 < list$1.length; i$1 += 1) { var ref = list$1[i$1]; var outputIndex = ref[0]; var labels = ref[1]; if (labels.length === 1) { // Only a single label matches this output expression serialized.push(coerceLabel(labels[0])); } else { // Array of literal labels pointing to this output expression serialized.push(labels.map(coerceLabel)); } serialized.push(this.outputs[outputIndex$1].serialize()); } serialized.push(this.otherwise.serialize()); return serialized; }; // var Case = function Case(type , branches , otherwise ) { this.type = type; this.branches = branches; this.otherwise = otherwise; }; Case.parse = function parse (args , context ) { if (args.length < 4) { return context.error(("Expected at least 3 arguments, but found only " + (args.length - 1) + ".")); } if (args.length % 2 !== 0) { return context.error("Expected an odd number of arguments."); } var outputType ; if (context.expectedType && context.expectedType.kind !== 'value') { outputType = context.expectedType; } var branches = []; for (var i = 1; i < args.length - 1; i += 2) { var test = context.parse(args[i], i, BooleanType); if (!test) { return null; } var result = context.parse(args[i + 1], i + 1, outputType); if (!result) { return null; } branches.push([test, result]); outputType = outputType || result.type; } var otherwise = context.parse(args[args.length - 1], args.length - 1, outputType); if (!otherwise) { return null; } assert_1(outputType); return new Case((outputType ), branches, otherwise); }; Case.prototype.evaluate = function evaluate (ctx ) { for (var i = 0, list = this.branches; i < list.length; i += 1) { var ref = list[i]; var test = ref[0]; var expression = ref[1]; if (test.evaluate(ctx)) { return expression.evaluate(ctx); } } return this.otherwise.evaluate(ctx); }; Case.prototype.eachChild = function eachChild (fn ) { for (var i = 0, list = this.branches; i < list.length; i += 1) { var ref = list[i]; var test = ref[0]; var expression = ref[1]; fn(test); fn(expression); } fn(this.otherwise); }; Case.prototype.possibleOutputs = function possibleOutputs () { var ref; return (ref = []) .concat.apply(ref, this.branches.map(function (ref) { var _ = ref[0]; var out = ref[1]; return out.possibleOutputs(); })) .concat(this.otherwise.possibleOutputs()); }; Case.prototype.serialize = function serialize () { var serialized = ["case"]; this.eachChild(function (child) { serialized.push(child.serialize()); }); return serialized; }; // function isComparableType(op , type ) { if (op === '==' || op === '!=') { // equality operator return type.kind === 'boolean' || type.kind === 'string' || type.kind === 'number' || type.kind === 'null' || type.kind === 'value'; } else { // ordering operator return type.kind === 'string' || type.kind === 'number' || type.kind === 'value'; } } function eq(ctx, a, b) { return a === b; } function neq(ctx, a, b) { return a !== b; } function lt(ctx, a, b) { return a < b; } function gt(ctx, a, b) { return a > b; } function lteq(ctx, a, b) { return a <= b; } function gteq(ctx, a, b) { return a >= b; } function eqCollate(ctx, a, b, c) { return c.compare(a, b) === 0; } function neqCollate(ctx, a, b, c) { return !eqCollate(ctx, a, b, c); } function ltCollate(ctx, a, b, c) { return c.compare(a, b) < 0; } function gtCollate(ctx, a, b, c) { return c.compare(a, b) > 0; } function lteqCollate(ctx, a, b, c) { return c.compare(a, b) <= 0; } function gteqCollate(ctx, a, b, c) { return c.compare(a, b) >= 0; } /** * Special form for comparison operators, implementing the signatures: * - (T, T, ?Collator) => boolean * - (T, value, ?Collator) => boolean * - (value, T, ?Collator) => boolean * * For inequalities, T must be either value, string, or number. For ==/!=, it * can also be boolean or null. * * Equality semantics are equivalent to Javascript's strict equality (===/!==) * -- i.e., when the arguments' types don't match, == evaluates to false, != to * true. * * When types don't match in an ordering comparison, a runtime error is thrown. * * @private */ function makeComparison(op , compareBasic, compareWithCollator) { var isOrderComparison = op !== '==' && op !== '!='; return /*@__PURE__*/(function () { function Comparison(lhs , rhs , collator ) { this.type = BooleanType; this.lhs = lhs; this.rhs = rhs; this.collator = collator; this.hasUntypedArgument = lhs.type.kind === 'value' || rhs.type.kind === 'value'; } Comparison.parse = function parse (args , context ) { if (args.length !== 3 && args.length !== 4) { return context.error("Expected two or three arguments."); } var op = (args[0] ); var lhs = context.parse(args[1], 1, ValueType); if (!lhs) { return null; } if (!isComparableType(op, lhs.type)) { return context.concat(1).error(("\"" + op + "\" comparisons are not supported for type '" + (toString(lhs.type)) + "'.")); } var rhs = context.parse(args[2], 2, ValueType); if (!rhs) { return null; } if (!isComparableType(op, rhs.type)) { return context.concat(2).error(("\"" + op + "\" comparisons are not supported for type '" + (toString(rhs.type)) + "'.")); } if ( lhs.type.kind !== rhs.type.kind && lhs.type.kind !== 'value' && rhs.type.kind !== 'value' ) { return context.error(("Cannot compare types '" + (toString(lhs.type)) + "' and '" + (toString(rhs.type)) + "'.")); } if (isOrderComparison) { // typing rules specific to less/greater than operators if (lhs.type.kind === 'value' && rhs.type.kind !== 'value') { // (value, T) lhs = new Assertion(rhs.type, [lhs]); } else if (lhs.type.kind !== 'value' && rhs.type.kind === 'value') { // (T, value) rhs = new Assertion(lhs.type, [rhs]); } } var collator = null; if (args.length === 4) { if ( lhs.type.kind !== 'string' && rhs.type.kind !== 'string' && lhs.type.kind !== 'value' && rhs.type.kind !== 'value' ) { return context.error("Cannot use collator to compare non-string types."); } collator = context.parse(args[3], 3, CollatorType); if (!collator) { return null; } } return new Comparison(lhs, rhs, collator); }; Comparison.prototype.evaluate = function evaluate (ctx ) { var lhs = this.lhs.evaluate(ctx); var rhs = this.rhs.evaluate(ctx); if (isOrderComparison && this.hasUntypedArgument) { var lt = typeOf(lhs); var rt = typeOf(rhs); // check that type is string or number, and equal if (lt.kind !== rt.kind || !(lt.kind === 'string' || lt.kind === 'number')) { throw new RuntimeError(("Expected arguments for \"" + op + "\" to be (string, string) or (number, number), but found (" + (lt.kind) + ", " + (rt.kind) + ") instead.")); } } if (this.collator && !isOrderComparison && this.hasUntypedArgument) { var lt$1 = typeOf(lhs); var rt$1 = typeOf(rhs); if (lt$1.kind !== 'string' || rt$1.kind !== 'string') { return compareBasic(ctx, lhs, rhs); } } return this.collator ? compareWithCollator(ctx, lhs, rhs, this.collator.evaluate(ctx)) : compareBasic(ctx, lhs, rhs); }; Comparison.prototype.eachChild = function eachChild (fn ) { fn(this.lhs); fn(this.rhs); if (this.collator) { fn(this.collator); } }; Comparison.prototype.possibleOutputs = function possibleOutputs () { return [true, false]; }; Comparison.prototype.serialize = function serialize () { var serialized = [op]; this.eachChild(function (child) { serialized.push(child.serialize()); }); return serialized; }; return Comparison; }()); } var Equals = makeComparison('==', eq, eqCollate); var NotEquals = makeComparison('!=', neq, neqCollate); var LessThan = makeComparison('<', lt, ltCollate); var GreaterThan = makeComparison('>', gt, gtCollate); var LessThanOrEqual = makeComparison('<=', lteq, lteqCollate); var GreaterThanOrEqual = makeComparison('>=', gteq, gteqCollate); // var NumberFormat = function NumberFormat(number , locale , currency , minFractionDigits , maxFractionDigits ) { this.type = StringType; this.number = number; this.locale = locale; this.currency = currency; this.minFractionDigits = minFractionDigits; this.maxFractionDigits = maxFractionDigits; }; NumberFormat.parse = function parse (args , context ) { if (args.length !== 3) { return context.error("Expected two arguments."); } var number = context.parse(args[1], 1, NumberType); if (!number) { return null; } var options = (args[2] ); if (typeof options !== "object" || Array.isArray(options)) { return context.error("NumberFormat options argument must be an object."); } var locale = null; if (options['locale']) { locale = context.parse(options['locale'], 1, StringType); if (!locale) { return null; } } var currency = null; if (options['currency']) { currency = context.parse(options['currency'], 1, StringType); if (!currency) { return null; } } var minFractionDigits = null; if (options['min-fraction-digits']) { minFractionDigits = context.parse(options['min-fraction-digits'], 1, NumberType); if (!minFractionDigits) { return null; } } var maxFractionDigits = null; if (options['max-fraction-digits']) { maxFractionDigits = context.parse(options['max-fraction-digits'], 1, NumberType); if (!maxFractionDigits) { return null; } } return new NumberFormat(number, locale, currency, minFractionDigits, maxFractionDigits); }; NumberFormat.prototype.evaluate = function evaluate (ctx ) { return new Intl.NumberFormat(this.locale ? this.locale.evaluate(ctx) : [], { style: this.currency ? "currency" : "decimal", currency: this.currency ? this.currency.evaluate(ctx) : undefined, minimumFractionDigits: this.minFractionDigits ? this.minFractionDigits.evaluate(ctx) : undefined, maximumFractionDigits: this.maxFractionDigits ? this.maxFractionDigits.evaluate(ctx) : undefined, }).format(this.number.evaluate(ctx)); }; NumberFormat.prototype.eachChild = function eachChild (fn ) { fn(this.number); if (this.locale) { fn(this.locale); } if (this.currency) { fn(this.currency); } if (this.minFractionDigits) { fn(this.minFractionDigits); } if (this.maxFractionDigits) { fn(this.maxFractionDigits); } }; NumberFormat.prototype.possibleOutputs = function possibleOutputs () { return [undefined]; }; NumberFormat.prototype.serialize = function serialize () { var options = {}; if (this.locale) { options['locale'] = this.locale.serialize(); } if (this.currency) { options['currency'] = this.currency.serialize(); } if (this.minFractionDigits) { options['min-fraction-digits'] = this.minFractionDigits.serialize(); } if (this.maxFractionDigits) { options['max-fraction-digits'] = this.maxFractionDigits.serialize(); } return ["number-format", this.number.serialize(), options]; }; // var Length = function Length(input ) { this.type = NumberType; this.input = input; }; Length.parse = function parse (args , context ) { if (args.length !== 2) { return context.error(("Expected 1 argument, but found " + (args.length - 1) + " instead.")); } var input = context.parse(args[1], 1); if (!input) { return null; } if (input.type.kind !== 'array' && input.type.kind !== 'string' && input.type.kind !== 'value') { return context.error(("Expected argument of type string or array, but found " + (toString(input.type)) + " instead.")); } return new Length(input); }; Length.prototype.evaluate = function evaluate (ctx ) { var input = this.input.evaluate(ctx); if (typeof input === 'string') { return input.length; } else if (Array.isArray(input)) { return input.length; } else { throw new RuntimeError(("Expected value to be of type string or array, but found " + (toString(typeOf(input))) + " instead.")); } }; Length.prototype.eachChild = function eachChild (fn ) { fn(this.input); }; Length.prototype.possibleOutputs = function possibleOutputs () { return [undefined]; }; Length.prototype.serialize = function serialize () { var serialized = ["length"]; this.eachChild(function (child) { serialized.push(child.serialize()); }); return serialized; }; // var expressions = { // special forms '==': Equals, '!=': NotEquals, '>': GreaterThan, '<': LessThan, '>=': GreaterThanOrEqual, '<=': LessThanOrEqual, 'array': Assertion, 'at': At, 'boolean': Assertion, 'case': Case, 'coalesce': Coalesce, 'collator': CollatorExpression, 'format': FormatExpression, 'interpolate': Interpolate, 'interpolate-hcl': Interpolate, 'interpolate-lab': Interpolate, 'length': Length, 'let': Let, 'literal': Literal, 'match': Match, 'number': Assertion, 'number-format': NumberFormat, 'object': Assertion, 'step': Step, 'string': Assertion, 'to-boolean': Coercion, 'to-color': Coercion, 'to-number': Coercion, 'to-string': Coercion, 'var': Var }; function rgba(ctx, ref) { var r = ref[0]; var g = ref[1]; var b = ref[2]; var a = ref[3]; r = r.evaluate(ctx); g = g.evaluate(ctx); b = b.evaluate(ctx); var alpha = a ? a.evaluate(ctx) : 1; var error = validateRGBA(r, g, b, alpha); if (error) { throw new RuntimeError(error); } return new Color(r / 255 * alpha, g / 255 * alpha, b / 255 * alpha, alpha); } function has(key, obj) { return key in obj; } function get(key, obj) { var v = obj[key]; return typeof v === 'undefined' ? null : v; } function binarySearch(v, a, i, j) { while (i <= j) { var m = (i + j) >> 1; if (a[m] === v) { return true; } if (a[m] > v) { j = m - 1; } else { i = m + 1; } } return false; } function varargs(type ) { return { type: type }; } CompoundExpression.register(expressions, { 'error': [ ErrorType, [StringType], function (ctx, ref) { var v = ref[0]; throw new RuntimeError(v.evaluate(ctx)); } ], 'typeof': [ StringType, [ValueType], function (ctx, ref) { var v = ref[0]; return toString(typeOf(v.evaluate(ctx))); } ], 'to-rgba': [ array(NumberType, 4), [ColorType], function (ctx, ref) { var v = ref[0]; return v.evaluate(ctx).toArray(); } ], 'rgb': [ ColorType, [NumberType, NumberType, NumberType], rgba ], 'rgba': [ ColorType, [NumberType, NumberType, NumberType, NumberType], rgba ], 'has': { type: BooleanType, overloads: [ [ [StringType], function (ctx, ref) { var key = ref[0]; return has(key.evaluate(ctx), ctx.properties()); } ], [ [StringType, ObjectType], function (ctx, ref) { var key = ref[0]; var obj = ref[1]; return has(key.evaluate(ctx), obj.evaluate(ctx)); } ] ] }, 'get': { type: ValueType, overloads: [ [ [StringType], function (ctx, ref) { var key = ref[0]; return get(key.evaluate(ctx), ctx.properties()); } ], [ [StringType, ObjectType], function (ctx, ref) { var key = ref[0]; var obj = ref[1]; return get(key.evaluate(ctx), obj.evaluate(ctx)); } ] ] }, 'feature-state': [ ValueType, [StringType], function (ctx, ref) { var key = ref[0]; return get(key.evaluate(ctx), ctx.featureState || {}); } ], 'properties': [ ObjectType, [], function (ctx) { return ctx.properties(); } ], 'geometry-type': [ StringType, [], function (ctx) { return ctx.geometryType(); } ], 'id': [ ValueType, [], function (ctx) { return ctx.id(); } ], 'zoom': [ NumberType, [], function (ctx) { return ctx.globals.zoom; } ], 'heatmap-density': [ NumberType, [], function (ctx) { return ctx.globals.heatmapDensity || 0; } ], 'line-progress': [ NumberType, [], function (ctx) { return ctx.globals.lineProgress || 0; } ], 'accumulated': [ ValueType, [], function (ctx) { return ctx.globals.accumulated === undefined ? null : ctx.globals.accumulated; } ], '+': [ NumberType, varargs(NumberType), function (ctx, args) { var result = 0; for (var i = 0, list = args; i < list.length; i += 1) { var arg = list[i]; result += arg.evaluate(ctx); } return result; } ], '*': [ NumberType, varargs(NumberType), function (ctx, args) { var result = 1; for (var i = 0, list = args; i < list.length; i += 1) { var arg = list[i]; result *= arg.evaluate(ctx); } return result; } ], '-': { type: NumberType, overloads: [ [ [NumberType, NumberType], function (ctx, ref) { var a = ref[0]; var b = ref[1]; return a.evaluate(ctx) - b.evaluate(ctx); } ], [ [NumberType], function (ctx, ref) { var a = ref[0]; return -a.evaluate(ctx); } ] ] }, '/': [ NumberType, [NumberType, NumberType], function (ctx, ref) { var a = ref[0]; var b = ref[1]; return a.evaluate(ctx) / b.evaluate(ctx); } ], '%': [ NumberType, [NumberType, NumberType], function (ctx, ref) { var a = ref[0]; var b = ref[1]; return a.evaluate(ctx) % b.evaluate(ctx); } ], 'ln2': [ NumberType, [], function () { return Math.LN2; } ], 'pi': [ NumberType, [], function () { return Math.PI; } ], 'e': [ NumberType, [], function () { return Math.E; } ], '^': [ NumberType, [NumberType, NumberType], function (ctx, ref) { var b = ref[0]; var e = ref[1]; return Math.pow(b.evaluate(ctx), e.evaluate(ctx)); } ], 'sqrt': [ NumberType, [NumberType], function (ctx, ref) { var x = ref[0]; return Math.sqrt(x.evaluate(ctx)); } ], 'log10': [ NumberType, [NumberType], function (ctx, ref) { var n = ref[0]; return Math.log(n.evaluate(ctx)) / Math.LN10; } ], 'ln': [ NumberType, [NumberType], function (ctx, ref) { var n = ref[0]; return Math.log(n.evaluate(ctx)); } ], 'log2': [ NumberType, [NumberType], function (ctx, ref) { var n = ref[0]; return Math.log(n.evaluate(ctx)) / Math.LN2; } ], 'sin': [ NumberType, [NumberType], function (ctx, ref) { var n = ref[0]; return Math.sin(n.evaluate(ctx)); } ], 'cos': [ NumberType, [NumberType], function (ctx, ref) { var n = ref[0]; return Math.cos(n.evaluate(ctx)); } ], 'tan': [ NumberType, [NumberType], function (ctx, ref) { var n = ref[0]; return Math.tan(n.evaluate(ctx)); } ], 'asin': [ NumberType, [NumberType], function (ctx, ref) { var n = ref[0]; return Math.asin(n.evaluate(ctx)); } ], 'acos': [ NumberType, [NumberType], function (ctx, ref) { var n = ref[0]; return Math.acos(n.evaluate(ctx)); } ], 'atan': [ NumberType, [NumberType], function (ctx, ref) { var n = ref[0]; return Math.atan(n.evaluate(ctx)); } ], 'min': [ NumberType, varargs(NumberType), function (ctx, args) { return Math.min.apply(Math, args.map(function (arg) { return arg.evaluate(ctx); })); } ], 'max': [ NumberType, varargs(NumberType), function (ctx, args) { return Math.max.apply(Math, args.map(function (arg) { return arg.evaluate(ctx); })); } ], 'abs': [ NumberType, [NumberType], function (ctx, ref) { var n = ref[0]; return Math.abs(n.evaluate(ctx)); } ], 'round': [ NumberType, [NumberType], function (ctx, ref) { var n = ref[0]; var v = n.evaluate(ctx); // Javascript's Math.round() rounds towards +Infinity for halfway // values, even when they're negative. It's more common to round // away from 0 (e.g., this is what python and C++ do) return v < 0 ? -Math.round(-v) : Math.round(v); } ], 'floor': [ NumberType, [NumberType], function (ctx, ref) { var n = ref[0]; return Math.floor(n.evaluate(ctx)); } ], 'ceil': [ NumberType, [NumberType], function (ctx, ref) { var n = ref[0]; return Math.ceil(n.evaluate(ctx)); } ], 'filter-==': [ BooleanType, [StringType, ValueType], function (ctx, ref) { var k = ref[0]; var v = ref[1]; return ctx.properties()[(k ).value] === (v ).value; } ], 'filter-id-==': [ BooleanType, [ValueType], function (ctx, ref) { var v = ref[0]; return ctx.id() === (v ).value; } ], 'filter-type-==': [ BooleanType, [StringType], function (ctx, ref) { var v = ref[0]; return ctx.geometryType() === (v ).value; } ], 'filter-<': [ BooleanType, [StringType, ValueType], function (ctx, ref) { var k = ref[0]; var v = ref[1]; var a = ctx.properties()[(k ).value]; var b = (v ).value; return typeof a === typeof b && a < b; } ], 'filter-id-<': [ BooleanType, [ValueType], function (ctx, ref) { var v = ref[0]; var a = ctx.id(); var b = (v ).value; return typeof a === typeof b && a < b; } ], 'filter->': [ BooleanType, [StringType, ValueType], function (ctx, ref) { var k = ref[0]; var v = ref[1]; var a = ctx.properties()[(k ).value]; var b = (v ).value; return typeof a === typeof b && a > b; } ], 'filter-id->': [ BooleanType, [ValueType], function (ctx, ref) { var v = ref[0]; var a = ctx.id(); var b = (v ).value; return typeof a === typeof b && a > b; } ], 'filter-<=': [ BooleanType, [StringType, ValueType], function (ctx, ref) { var k = ref[0]; var v = ref[1]; var a = ctx.properties()[(k ).value]; var b = (v ).value; return typeof a === typeof b && a <= b; } ], 'filter-id-<=': [ BooleanType, [ValueType], function (ctx, ref) { var v = ref[0]; var a = ctx.id(); var b = (v ).value; return typeof a === typeof b && a <= b; } ], 'filter->=': [ BooleanType, [StringType, ValueType], function (ctx, ref) { var k = ref[0]; var v = ref[1]; var a = ctx.properties()[(k ).value]; var b = (v ).value; return typeof a === typeof b && a >= b; } ], 'filter-id->=': [ BooleanType, [ValueType], function (ctx, ref) { var v = ref[0]; var a = ctx.id(); var b = (v ).value; return typeof a === typeof b && a >= b; } ], 'filter-has': [ BooleanType, [ValueType], function (ctx, ref) { var k = ref[0]; return (k ).value in ctx.properties(); } ], 'filter-has-id': [ BooleanType, [], function (ctx) { return ctx.id() !== null; } ], 'filter-type-in': [ BooleanType, [array(StringType)], function (ctx, ref) { var v = ref[0]; return (v ).value.indexOf(ctx.geometryType()) >= 0; } ], 'filter-id-in': [ BooleanType, [array(ValueType)], function (ctx, ref) { var v = ref[0]; return (v ).value.indexOf(ctx.id()) >= 0; } ], 'filter-in-small': [ BooleanType, [StringType, array(ValueType)], // assumes v is an array literal function (ctx, ref) { var k = ref[0]; var v = ref[1]; return (v ).value.indexOf(ctx.properties()[(k ).value]) >= 0; } ], 'filter-in-large': [ BooleanType, [StringType, array(ValueType)], // assumes v is a array literal with values sorted in ascending order and of a single type function (ctx, ref) { var k = ref[0]; var v = ref[1]; return binarySearch(ctx.properties()[(k ).value], (v ).value, 0, (v ).value.length - 1); } ], 'all': { type: BooleanType, overloads: [ [ [BooleanType, BooleanType], function (ctx, ref) { var a = ref[0]; var b = ref[1]; return a.evaluate(ctx) && b.evaluate(ctx); } ], [ varargs(BooleanType), function (ctx, args) { for (var i = 0, list = args; i < list.length; i += 1) { var arg = list[i]; if (!arg.evaluate(ctx)) { return false; } } return true; } ] ] }, 'any': { type: BooleanType, overloads: [ [ [BooleanType, BooleanType], function (ctx, ref) { var a = ref[0]; var b = ref[1]; return a.evaluate(ctx) || b.evaluate(ctx); } ], [ varargs(BooleanType), function (ctx, args) { for (var i = 0, list = args; i < list.length; i += 1) { var arg = list[i]; if (arg.evaluate(ctx)) { return true; } } return false; } ] ] }, '!': [ BooleanType, [BooleanType], function (ctx, ref) { var b = ref[0]; return !b.evaluate(ctx); } ], 'is-supported-script': [ BooleanType, [StringType], // At parse time this will always return true, so we need to exclude this expression with isGlobalPropertyConstant function (ctx, ref) { var s = ref[0]; var isSupportedScript = ctx.globals && ctx.globals.isSupportedScript; if (isSupportedScript) { return isSupportedScript(s.evaluate(ctx)); } return true; } ], 'upcase': [ StringType, [StringType], function (ctx, ref) { var s = ref[0]; return s.evaluate(ctx).toUpperCase(); } ], 'downcase': [ StringType, [StringType], function (ctx, ref) { var s = ref[0]; return s.evaluate(ctx).toLowerCase(); } ], 'concat': [ StringType, varargs(ValueType), function (ctx, args) { return args.map(function (arg) { return toString$1(arg.evaluate(ctx)); }).join(''); } ], 'resolved-locale': [ StringType, [CollatorType], function (ctx, ref) { var collator = ref[0]; return collator.evaluate(ctx).resolvedLocale(); } ] }); // /** * A type used for returning and propagating errors. The first element of the union * represents success and contains a value, and the second represents an error and * contains an error value. * @private */ function success (value ) { return { result: 'success', value: value }; } function error (value ) { return { result: 'error', value: value }; } // function supportsPropertyExpression(spec ) { return spec['property-type'] === 'data-driven' || spec['property-type'] === 'cross-faded-data-driven'; } function supportsZoomExpression(spec ) { return !!spec.expression && spec.expression.parameters.indexOf('zoom') > -1; } function supportsInterpolation(spec ) { return !!spec.expression && spec.expression.interpolated; } function getType(val) { if (val instanceof Number) { return 'number'; } else if (val instanceof String) { return 'string'; } else if (val instanceof Boolean) { return 'boolean'; } else if (Array.isArray(val)) { return 'array'; } else if (val === null) { return 'null'; } else { return typeof val; } } function isFunction(value) { return typeof value === 'object' && value !== null && !Array.isArray(value); } function identityFunction(x) { return x; } function createFunction(parameters, propertySpec) { var isColor = propertySpec.type === 'color'; var zoomAndFeatureDependent = parameters.stops && typeof parameters.stops[0][0] === 'object'; var featureDependent = zoomAndFeatureDependent || parameters.property !== undefined; var zoomDependent = zoomAndFeatureDependent || !featureDependent; var type = parameters.type || (supportsInterpolation(propertySpec) ? 'exponential' : 'interval'); if (isColor) { parameters = extend$1({}, parameters); if (parameters.stops) { parameters.stops = parameters.stops.map(function (stop) { return [stop[0], Color.parse(stop[1])]; }); } if (parameters.default) { parameters.default = Color.parse(parameters.default); } else { parameters.default = Color.parse(propertySpec.default); } } if (parameters.colorSpace && parameters.colorSpace !== 'rgb' && !colorSpaces[parameters.colorSpace]) { // eslint-disable-line import/namespace throw new Error(("Unknown color space: " + (parameters.colorSpace))); } var innerFun; var hashedStops; var categoricalKeyType; if (type === 'exponential') { innerFun = evaluateExponentialFunction; } else if (type === 'interval') { innerFun = evaluateIntervalFunction; } else if (type === 'categorical') { innerFun = evaluateCategoricalFunction; // For categorical functions, generate an Object as a hashmap of the stops for fast searching hashedStops = Object.create(null); for (var i = 0, list = parameters.stops; i < list.length; i += 1) { var stop = list[i]; hashedStops[stop[0]] = stop[1]; } // Infer key type based on first stop key-- used to encforce strict type checking later categoricalKeyType = typeof parameters.stops[0][0]; } else if (type === 'identity') { innerFun = evaluateIdentityFunction; } else { throw new Error(("Unknown function type \"" + type + "\"")); } if (zoomAndFeatureDependent) { var featureFunctions = {}; var zoomStops = []; for (var s = 0; s < parameters.stops.length; s++) { var stop$1 = parameters.stops[s]; var zoom = stop$1[0].zoom; if (featureFunctions[zoom] === undefined) { featureFunctions[zoom] = { zoom: zoom, type: parameters.type, property: parameters.property, default: parameters.default, stops: [] }; zoomStops.push(zoom); } featureFunctions[zoom].stops.push([stop$1[0].value, stop$1[1]]); } var featureFunctionStops = []; for (var i$1 = 0, list$1 = zoomStops; i$1 < list$1.length; i$1 += 1) { var z = list$1[i$1]; featureFunctionStops.push([featureFunctions[z].zoom, createFunction(featureFunctions[z], propertySpec)]); } return { kind: 'composite', interpolationFactor: Interpolate.interpolationFactor.bind(undefined, {name: 'linear'}), zoomStops: featureFunctionStops.map(function (s) { return s[0]; }), evaluate: function evaluate(ref, properties) { var zoom = ref.zoom; return evaluateExponentialFunction({ stops: featureFunctionStops, base: parameters.base }, propertySpec, zoom).evaluate(zoom, properties); } }; } else if (zoomDependent) { return { kind: 'camera', interpolationFactor: type === 'exponential' ? Interpolate.interpolationFactor.bind(undefined, {name: 'exponential', base: parameters.base !== undefined ? parameters.base : 1}) : function () { return 0; }, zoomStops: parameters.stops.map(function (s) { return s[0]; }), evaluate: function (ref) { var zoom = ref.zoom; return innerFun(parameters, propertySpec, zoom, hashedStops, categoricalKeyType); } }; } else { return { kind: 'source', evaluate: function evaluate(_, feature) { var value = feature && feature.properties ? feature.properties[parameters.property] : undefined; if (value === undefined) { return coalesce(parameters.default, propertySpec.default); } return innerFun(parameters, propertySpec, value, hashedStops, categoricalKeyType); } }; } } function coalesce(a, b, c) { if (a !== undefined) { return a; } if (b !== undefined) { return b; } if (c !== undefined) { return c; } } function evaluateCategoricalFunction(parameters, propertySpec, input, hashedStops, keyType) { var evaluated = typeof input === keyType ? hashedStops[input] : undefined; // Enforce strict typing on input return coalesce(evaluated, parameters.default, propertySpec.default); } function evaluateIntervalFunction(parameters, propertySpec, input) { // Edge cases if (getType(input) !== 'number') { return coalesce(parameters.default, propertySpec.default); } var n = parameters.stops.length; if (n === 1) { return parameters.stops[0][1]; } if (input <= parameters.stops[0][0]) { return parameters.stops[0][1]; } if (input >= parameters.stops[n - 1][0]) { return parameters.stops[n - 1][1]; } var index = findStopLessThanOrEqualTo$1(parameters.stops, input); return parameters.stops[index][1]; } function evaluateExponentialFunction(parameters, propertySpec, input) { var base = parameters.base !== undefined ? parameters.base : 1; // Edge cases if (getType(input) !== 'number') { return coalesce(parameters.default, propertySpec.default); } var n = parameters.stops.length; if (n === 1) { return parameters.stops[0][1]; } if (input <= parameters.stops[0][0]) { return parameters.stops[0][1]; } if (input >= parameters.stops[n - 1][0]) { return parameters.stops[n - 1][1]; } var index = findStopLessThanOrEqualTo$1(parameters.stops, input); var t = interpolationFactor( input, base, parameters.stops[index][0], parameters.stops[index + 1][0]); var outputLower = parameters.stops[index][1]; var outputUpper = parameters.stops[index + 1][1]; var interp = interpolate[propertySpec.type] || identityFunction; // eslint-disable-line import/namespace if (parameters.colorSpace && parameters.colorSpace !== 'rgb') { var colorspace = colorSpaces[parameters.colorSpace]; // eslint-disable-line import/namespace interp = function (a, b) { return colorspace.reverse(colorspace.interpolate(colorspace.forward(a), colorspace.forward(b), t)); }; } if (typeof outputLower.evaluate === 'function') { return { evaluate: function evaluate() { var args = [], len = arguments.length; while ( len-- ) args[ len ] = arguments[ len ]; var evaluatedLower = outputLower.evaluate.apply(undefined, args); var evaluatedUpper = outputUpper.evaluate.apply(undefined, args); // Special case for fill-outline-color, which has no spec default. if (evaluatedLower === undefined || evaluatedUpper === undefined) { return undefined; } return interp(evaluatedLower, evaluatedUpper, t); } }; } return interp(outputLower, outputUpper, t); } function evaluateIdentityFunction(parameters, propertySpec, input) { if (propertySpec.type === 'color') { input = Color.parse(input); } else if (propertySpec.type === 'formatted') { input = Formatted.fromString(input.toString()); } else if (getType(input) !== propertySpec.type && (propertySpec.type !== 'enum' || !propertySpec.values[input])) { input = undefined; } return coalesce(input, parameters.default, propertySpec.default); } /** * Returns the index of the last stop <= input, or 0 if it doesn't exist. * * @private */ function findStopLessThanOrEqualTo$1(stops, input) { var n = stops.length; var lowerIndex = 0; var upperIndex = n - 1; var currentIndex = 0; var currentValue, upperValue; while (lowerIndex <= upperIndex) { currentIndex = Math.floor((lowerIndex + upperIndex) / 2); currentValue = stops[currentIndex][0]; upperValue = stops[currentIndex + 1][0]; if (input === currentValue || input > currentValue && input < upperValue) { // Search complete return currentIndex; } else if (currentValue < input) { lowerIndex = currentIndex + 1; } else if (currentValue > input) { upperIndex = currentIndex - 1; } } return Math.max(currentIndex - 1, 0); } /** * Returns a ratio that can be used to interpolate between exponential function * stops. * * How it works: * Two consecutive stop values define a (scaled and shifted) exponential * function `f(x) = a * base^x + b`, where `base` is the user-specified base, * and `a` and `b` are constants affording sufficient degrees of freedom to fit * the function to the given stops. * * Here's a bit of algebra that lets us compute `f(x)` directly from the stop * values without explicitly solving for `a` and `b`: * * First stop value: `f(x0) = y0 = a * base^x0 + b` * Second stop value: `f(x1) = y1 = a * base^x1 + b` * => `y1 - y0 = a(base^x1 - base^x0)` * => `a = (y1 - y0)/(base^x1 - base^x0)` * * Desired value: `f(x) = y = a * base^x + b` * => `f(x) = y0 + a * (base^x - base^x0)` * * From the above, we can replace the `a` in `a * (base^x - base^x0)` and do a * little algebra: * ``` * a * (base^x - base^x0) = (y1 - y0)/(base^x1 - base^x0) * (base^x - base^x0) * = (y1 - y0) * (base^x - base^x0) / (base^x1 - base^x0) * ``` * * If we let `(base^x - base^x0) / (base^x1 base^x0)`, then we have * `f(x) = y0 + (y1 - y0) * ratio`. In other words, `ratio` may be treated as * an interpolation factor between the two stops' output values. * * (Note: a slightly different form for `ratio`, * `(base^(x-x0) - 1) / (base^(x1-x0) - 1) `, is equivalent, but requires fewer * expensive `Math.pow()` operations.) * * @private */ function interpolationFactor(input, base, lowerValue, upperValue) { var difference = upperValue - lowerValue; var progress = input - lowerValue; if (difference === 0) { return 0; } else if (base === 1) { return progress / difference; } else { return (Math.pow(base, progress) - 1) / (Math.pow(base, difference) - 1); } } // var StyleExpression = function StyleExpression(expression , propertySpec ) { this.expression = expression; this._warningHistory = {}; this._evaluator = new EvaluationContext(); this._defaultValue = propertySpec ? getDefaultValue(propertySpec) : null; this._enumValues = propertySpec && propertySpec.type === 'enum' ? propertySpec.values : null; }; StyleExpression.prototype.evaluateWithoutErrorHandling = function evaluateWithoutErrorHandling (globals , feature , featureState ) { this._evaluator.globals = globals; this._evaluator.feature = feature; this._evaluator.featureState = featureState; return this.expression.evaluate(this._evaluator); }; StyleExpression.prototype.evaluate = function evaluate (globals , feature , featureState ) { this._evaluator.globals = globals; this._evaluator.feature = feature || null; this._evaluator.featureState = featureState || null; try { var val = this.expression.evaluate(this._evaluator); if (val === null || val === undefined) { return this._defaultValue; } if (this._enumValues && !(val in this._enumValues)) { throw new RuntimeError(("Expected value to be one of " + (Object.keys(this._enumValues).map(function (v) { return JSON.stringify(v); }).join(', ')) + ", but found " + (JSON.stringify(val)) + " instead.")); } return val; } catch (e) { if (!this._warningHistory[e.message]) { this._warningHistory[e.message] = true; if (typeof console !== 'undefined') { console.warn(e.message); } } return this._defaultValue; } }; function isExpression(expression ) { return Array.isArray(expression) && expression.length > 0 && typeof expression[0] === 'string' && expression[0] in expressions; } /** * Parse and typecheck the given style spec JSON expression. If * options.defaultValue is provided, then the resulting StyleExpression's * `evaluate()` method will handle errors by logging a warning (once per * message) and returning the default value. Otherwise, it will throw * evaluation errors. * * @private */ function createExpression(expression , propertySpec ) { var parser = new ParsingContext(expressions, [], propertySpec ? getExpectedType(propertySpec) : undefined); // For string-valued properties, coerce to string at the top level rather than asserting. var parsed = parser.parse(expression, undefined, undefined, undefined, propertySpec && propertySpec.type === 'string' ? {typeAnnotation: 'coerce'} : undefined); if (!parsed) { assert_1(parser.errors.length > 0); return error(parser.errors); } return success(new StyleExpression(parsed, propertySpec)); } var ZoomConstantExpression = function ZoomConstantExpression(kind , expression ) { this.kind = kind; this._styleExpression = expression; this.isStateDependent = kind !== ('constant' ) && !isStateConstant(expression.expression); }; ZoomConstantExpression.prototype.evaluateWithoutErrorHandling = function evaluateWithoutErrorHandling (globals , feature , featureState ) { return this._styleExpression.evaluateWithoutErrorHandling(globals, feature, featureState); }; ZoomConstantExpression.prototype.evaluate = function evaluate (globals , feature , featureState ) { return this._styleExpression.evaluate(globals, feature, featureState); }; var ZoomDependentExpression = function ZoomDependentExpression(kind , expression , zoomCurve ) { this.kind = kind; this.zoomStops = zoomCurve.labels; this._styleExpression = expression; this.isStateDependent = kind !== ('camera' ) && !isStateConstant(expression.expression); if (zoomCurve instanceof Interpolate) { this._interpolationType = zoomCurve.interpolation; } }; ZoomDependentExpression.prototype.evaluateWithoutErrorHandling = function evaluateWithoutErrorHandling (globals , feature , featureState ) { return this._styleExpression.evaluateWithoutErrorHandling(globals, feature, featureState); }; ZoomDependentExpression.prototype.evaluate = function evaluate (globals , feature , featureState ) { return this._styleExpression.evaluate(globals, feature, featureState); }; ZoomDependentExpression.prototype.interpolationFactor = function interpolationFactor (input , lower , upper ) { if (this._interpolationType) { return Interpolate.interpolationFactor(this._interpolationType, input, lower, upper); } else { return 0; } }; function createPropertyExpression(expression , propertySpec ) { expression = createExpression(expression, propertySpec); if (expression.result === 'error') { return expression; } var parsed = expression.value.expression; var isFeatureConstant$1 = isFeatureConstant(parsed); if (!isFeatureConstant$1 && !supportsPropertyExpression(propertySpec)) { return error([new ParsingError('', 'data expressions not supported')]); } var isZoomConstant = isGlobalPropertyConstant(parsed, ['zoom']); if (!isZoomConstant && !supportsZoomExpression(propertySpec)) { return error([new ParsingError('', 'zoom expressions not supported')]); } var zoomCurve = findZoomCurve(parsed); if (!zoomCurve && !isZoomConstant) { return error([new ParsingError('', '"zoom" expression may only be used as input to a top-level "step" or "interpolate" expression.')]); } else if (zoomCurve instanceof ParsingError) { return error([zoomCurve]); } else if (zoomCurve instanceof Interpolate && !supportsInterpolation(propertySpec)) { return error([new ParsingError('', '"interpolate" expressions cannot be used with this property')]); } if (!zoomCurve) { return success(isFeatureConstant$1 ? (new ZoomConstantExpression('constant', expression.value) ) : (new ZoomConstantExpression('source', expression.value) )); } return success(isFeatureConstant$1 ? (new ZoomDependentExpression('camera', expression.value, zoomCurve) ) : (new ZoomDependentExpression('composite', expression.value, zoomCurve) )); } // serialization wrapper for old-style stop functions normalized to the // expression interface var StylePropertyFunction = function StylePropertyFunction(parameters , specification ) { this._parameters = parameters; this._specification = specification; extend$1(this, createFunction(this._parameters, this._specification)); }; StylePropertyFunction.deserialize = function deserialize (serialized ) { return ((new StylePropertyFunction(serialized._parameters, serialized._specification)) ); }; StylePropertyFunction.serialize = function serialize (input ) { return { _parameters: input._parameters, _specification: input._specification }; }; function normalizePropertyExpression (value , specification ) { if (isFunction(value)) { return (new StylePropertyFunction(value, specification) ); } else if (isExpression(value)) { var expression = createPropertyExpression(value, specification); if (expression.result === 'error') { // this should have been caught in validation throw new Error(expression.value.map(function (err) { return ((err.key) + ": " + (err.message)); }).join(', ')); } return expression.value; } else { var constant = value; if (typeof value === 'string' && specification.type === 'color') { constant = Color.parse(value); } return { kind: 'constant', evaluate: function () { return constant; } }; } } // Zoom-dependent expressions may only use ["zoom"] as the input to a top-level "step" or "interpolate" // expression (collectively referred to as a "curve"). The curve may be wrapped in one or more "let" or // "coalesce" expressions. function findZoomCurve(expression ) { var result = null; if (expression instanceof Let) { result = findZoomCurve(expression.result); } else if (expression instanceof Coalesce) { for (var i = 0, list = expression.args; i < list.length; i += 1) { var arg = list[i]; result = findZoomCurve(arg); if (result) { break; } } } else if ((expression instanceof Step || expression instanceof Interpolate) && expression.input instanceof CompoundExpression && expression.input.name === 'zoom') { result = expression; } if (result instanceof ParsingError) { return result; } expression.eachChild(function (child) { var childResult = findZoomCurve(child); if (childResult instanceof ParsingError) { result = childResult; } else if (!result && childResult) { result = new ParsingError('', '"zoom" expression may only be used as input to a top-level "step" or "interpolate" expression.'); } else if (result && childResult && result !== childResult) { result = new ParsingError('', 'Only one zoom-based "step" or "interpolate" subexpression may be used in an expression.'); } }); return result; } function getExpectedType(spec ) { var types = { color: ColorType, string: StringType, number: NumberType, enum: StringType, boolean: BooleanType, formatted: FormattedType }; if (spec.type === 'array') { return array(types[spec.value] || ValueType, spec.length); } return types[spec.type]; } function getDefaultValue(spec ) { if (spec.type === 'color' && isFunction(spec.default)) { // Special case for heatmap-color: it uses the 'default:' to define a // default color ramp, but createExpression expects a simple value to fall // back to in case of runtime errors return new Color(0, 0, 0, 0); } else if (spec.type === 'color') { return Color.parse(spec.default) || null; } else if (spec.default === undefined) { return null; } else { return spec.default; } } function validateObject(options) { var key = options.key; var object = options.value; var elementSpecs = options.valueSpec || {}; var elementValidators = options.objectElementValidators || {}; var style = options.style; var styleSpec = options.styleSpec; var errors = []; var type = getType(object); if (type !== 'object') { return [new ValidationError(key, object, ("object expected, " + type + " found"))]; } for (var objectKey in object) { var elementSpecKey = objectKey.split('.')[0]; // treat 'paint.*' as 'paint' var elementSpec = elementSpecs[elementSpecKey] || elementSpecs['*']; var validateElement = (void 0); if (elementValidators[elementSpecKey]) { validateElement = elementValidators[elementSpecKey]; } else if (elementSpecs[elementSpecKey]) { validateElement = validate; } else if (elementValidators['*']) { validateElement = elementValidators['*']; } else if (elementSpecs['*']) { validateElement = validate; } else { errors.push(new ValidationError(key, object[objectKey], ("unknown property \"" + objectKey + "\""))); continue; } errors = errors.concat(validateElement({ key: (key ? (key + ".") : key) + objectKey, value: object[objectKey], valueSpec: elementSpec, style: style, styleSpec: styleSpec, object: object, objectKey: objectKey }, object)); } for (var elementSpecKey$1 in elementSpecs) { // Don't check `required` when there's a custom validator for that property. if (elementValidators[elementSpecKey$1]) { continue; } if (elementSpecs[elementSpecKey$1].required && elementSpecs[elementSpecKey$1]['default'] === undefined && object[elementSpecKey$1] === undefined) { errors.push(new ValidationError(key, object, ("missing required property \"" + elementSpecKey$1 + "\""))); } } return errors; } function validateArray(options) { var array = options.value; var arraySpec = options.valueSpec; var style = options.style; var styleSpec = options.styleSpec; var key = options.key; var validateArrayElement = options.arrayElementValidator || validate; if (getType(array) !== 'array') { return [new ValidationError(key, array, ("array expected, " + (getType(array)) + " found"))]; } if (arraySpec.length && array.length !== arraySpec.length) { return [new ValidationError(key, array, ("array length " + (arraySpec.length) + " expected, length " + (array.length) + " found"))]; } if (arraySpec['min-length'] && array.length < arraySpec['min-length']) { return [new ValidationError(key, array, ("array length at least " + (arraySpec['min-length']) + " expected, length " + (array.length) + " found"))]; } var arrayElementSpec = { "type": arraySpec.value, "values": arraySpec.values }; if (styleSpec.$version < 7) { arrayElementSpec.function = arraySpec.function; } if (getType(arraySpec.value) === 'object') { arrayElementSpec = arraySpec.value; } var errors = []; for (var i = 0; i < array.length; i++) { errors = errors.concat(validateArrayElement({ array: array, arrayIndex: i, value: array[i], valueSpec: arrayElementSpec, style: style, styleSpec: styleSpec, key: (key + "[" + i + "]") })); } return errors; } function validateNumber(options) { var key = options.key; var value = options.value; var valueSpec = options.valueSpec; var type = getType(value); if (type !== 'number') { return [new ValidationError(key, value, ("number expected, " + type + " found"))]; } if ('minimum' in valueSpec && value < valueSpec.minimum) { return [new ValidationError(key, value, (value + " is less than the minimum value " + (valueSpec.minimum)))]; } if ('maximum' in valueSpec && value > valueSpec.maximum) { return [new ValidationError(key, value, (value + " is greater than the maximum value " + (valueSpec.maximum)))]; } return []; } function validateFunction(options) { var functionValueSpec = options.valueSpec; var functionType = unbundle(options.value.type); var stopKeyType; var stopDomainValues = {}; var previousStopDomainValue; var previousStopDomainZoom; var isZoomFunction = functionType !== 'categorical' && options.value.property === undefined; var isPropertyFunction = !isZoomFunction; var isZoomAndPropertyFunction = getType(options.value.stops) === 'array' && getType(options.value.stops[0]) === 'array' && getType(options.value.stops[0][0]) === 'object'; var errors = validateObject({ key: options.key, value: options.value, valueSpec: options.styleSpec.function, style: options.style, styleSpec: options.styleSpec, objectElementValidators: { stops: validateFunctionStops, default: validateFunctionDefault } }); if (functionType === 'identity' && isZoomFunction) { errors.push(new ValidationError(options.key, options.value, 'missing required property "property"')); } if (functionType !== 'identity' && !options.value.stops) { errors.push(new ValidationError(options.key, options.value, 'missing required property "stops"')); } if (functionType === 'exponential' && options.valueSpec.expression && !supportsInterpolation(options.valueSpec)) { errors.push(new ValidationError(options.key, options.value, 'exponential functions not supported')); } if (options.styleSpec.$version >= 8) { if (isPropertyFunction && !supportsPropertyExpression(options.valueSpec)) { errors.push(new ValidationError(options.key, options.value, 'property functions not supported')); } else if (isZoomFunction && !supportsZoomExpression(options.valueSpec)) { errors.push(new ValidationError(options.key, options.value, 'zoom functions not supported')); } } if ((functionType === 'categorical' || isZoomAndPropertyFunction) && options.value.property === undefined) { errors.push(new ValidationError(options.key, options.value, '"property" property is required')); } return errors; function validateFunctionStops(options) { if (functionType === 'identity') { return [new ValidationError(options.key, options.value, 'identity function may not have a "stops" property')]; } var errors = []; var value = options.value; errors = errors.concat(validateArray({ key: options.key, value: value, valueSpec: options.valueSpec, style: options.style, styleSpec: options.styleSpec, arrayElementValidator: validateFunctionStop })); if (getType(value) === 'array' && value.length === 0) { errors.push(new ValidationError(options.key, value, 'array must have at least one stop')); } return errors; } function validateFunctionStop(options) { var errors = []; var value = options.value; var key = options.key; if (getType(value) !== 'array') { return [new ValidationError(key, value, ("array expected, " + (getType(value)) + " found"))]; } if (value.length !== 2) { return [new ValidationError(key, value, ("array length 2 expected, length " + (value.length) + " found"))]; } if (isZoomAndPropertyFunction) { if (getType(value[0]) !== 'object') { return [new ValidationError(key, value, ("object expected, " + (getType(value[0])) + " found"))]; } if (value[0].zoom === undefined) { return [new ValidationError(key, value, 'object stop key must have zoom')]; } if (value[0].value === undefined) { return [new ValidationError(key, value, 'object stop key must have value')]; } if (previousStopDomainZoom && previousStopDomainZoom > unbundle(value[0].zoom)) { return [new ValidationError(key, value[0].zoom, 'stop zoom values must appear in ascending order')]; } if (unbundle(value[0].zoom) !== previousStopDomainZoom) { previousStopDomainZoom = unbundle(value[0].zoom); previousStopDomainValue = undefined; stopDomainValues = {}; } errors = errors.concat(validateObject({ key: (key + "[0]"), value: value[0], valueSpec: { zoom: {} }, style: options.style, styleSpec: options.styleSpec, objectElementValidators: { zoom: validateNumber, value: validateStopDomainValue } })); } else { errors = errors.concat(validateStopDomainValue({ key: (key + "[0]"), value: value[0], valueSpec: {}, style: options.style, styleSpec: options.styleSpec }, value)); } if (isExpression(deepUnbundle(value[1]))) { return errors.concat([new ValidationError((key + "[1]"), value[1], 'expressions are not allowed in function stops.')]); } return errors.concat(validate({ key: (key + "[1]"), value: value[1], valueSpec: functionValueSpec, style: options.style, styleSpec: options.styleSpec })); } function validateStopDomainValue(options, stop) { var type = getType(options.value); var value = unbundle(options.value); var reportValue = options.value !== null ? options.value : stop; if (!stopKeyType) { stopKeyType = type; } else if (type !== stopKeyType) { return [new ValidationError(options.key, reportValue, (type + " stop domain type must match previous stop domain type " + stopKeyType))]; } if (type !== 'number' && type !== 'string' && type !== 'boolean') { return [new ValidationError(options.key, reportValue, 'stop domain value must be a number, string, or boolean')]; } if (type !== 'number' && functionType !== 'categorical') { var message = "number expected, " + type + " found"; if (supportsPropertyExpression(functionValueSpec) && functionType === undefined) { message += '\nIf you intended to use a categorical function, specify `"type": "categorical"`.'; } return [new ValidationError(options.key, reportValue, message)]; } if (functionType === 'categorical' && type === 'number' && (!isFinite(value) || Math.floor(value) !== value)) { return [new ValidationError(options.key, reportValue, ("integer expected, found " + value))]; } if (functionType !== 'categorical' && type === 'number' && previousStopDomainValue !== undefined && value < previousStopDomainValue) { return [new ValidationError(options.key, reportValue, 'stop domain values must appear in ascending order')]; } else { previousStopDomainValue = value; } if (functionType === 'categorical' && value in stopDomainValues) { return [new ValidationError(options.key, reportValue, 'stop domain values must be unique')]; } else { stopDomainValues[value] = true; } return []; } function validateFunctionDefault(options) { return validate({ key: options.key, value: options.value, valueSpec: functionValueSpec, style: options.style, styleSpec: options.styleSpec }); } } // function validateExpression(options ) { var expression = (options.expressionContext === 'property' ? createPropertyExpression : createExpression)(deepUnbundle(options.value), options.valueSpec); if (expression.result === 'error') { return expression.value.map(function (error) { return new ValidationError(("" + (options.key) + (error.key)), options.value, error.message); }); } var expressionObj = (expression.value ).expression || (expression.value )._styleExpression.expression; if (options.expressionContext === 'property' && (options.propertyKey === 'text-font') && expressionObj.possibleOutputs().indexOf(undefined) !== -1) { return [new ValidationError(options.key, options.value, ("Invalid data expression for \"" + (options.propertyKey) + "\". Output values must be contained as literals within the expression."))]; } if (options.expressionContext === 'property' && options.propertyType === 'layout' && (!isStateConstant(expressionObj))) { return [new ValidationError(options.key, options.value, '"feature-state" data expressions are not supported with layout properties.')]; } if (options.expressionContext === 'filter' && !isStateConstant(expressionObj)) { return [new ValidationError(options.key, options.value, '"feature-state" data expressions are not supported with filters.')]; } if (options.expressionContext && options.expressionContext.indexOf('cluster') === 0) { if (!isGlobalPropertyConstant(expressionObj, ['zoom', 'feature-state'])) { return [new ValidationError(options.key, options.value, '"zoom" and "feature-state" expressions are not supported with cluster properties.')]; } if (options.expressionContext === 'cluster-initial' && !isFeatureConstant(expressionObj)) { return [new ValidationError(options.key, options.value, 'Feature data expressions are not supported with initial expression part of cluster properties.')]; } } return []; } function validateBoolean(options) { var value = options.value; var key = options.key; var type = getType(value); if (type !== 'boolean') { return [new ValidationError(key, value, ("boolean expected, " + type + " found"))]; } return []; } function validateColor(options) { var key = options.key; var value = options.value; var type = getType(value); if (type !== 'string') { return [new ValidationError(key, value, ("color expected, " + type + " found"))]; } if (csscolorparser_1(value) === null) { return [new ValidationError(key, value, ("color expected, \"" + value + "\" found"))]; } return []; } function validateEnum(options) { var key = options.key; var value = options.value; var valueSpec = options.valueSpec; var errors = []; if (Array.isArray(valueSpec.values)) { // <=v7 if (valueSpec.values.indexOf(unbundle(value)) === -1) { errors.push(new ValidationError(key, value, ("expected one of [" + (valueSpec.values.join(', ')) + "], " + (JSON.stringify(value)) + " found"))); } } else { // >=v8 if (Object.keys(valueSpec.values).indexOf(unbundle(value)) === -1) { errors.push(new ValidationError(key, value, ("expected one of [" + (Object.keys(valueSpec.values).join(', ')) + "], " + (JSON.stringify(value)) + " found"))); } } return errors; } // function isExpressionFilter(filter ) { if (filter === true || filter === false) { return true; } if (!Array.isArray(filter) || filter.length === 0) { return false; } switch (filter[0]) { case 'has': return filter.length >= 2 && filter[1] !== '$id' && filter[1] !== '$type'; case 'in': case '!in': case '!has': case 'none': return false; case '==': case '!=': case '>': case '>=': case '<': case '<=': return filter.length !== 3 || (Array.isArray(filter[1]) || Array.isArray(filter[2])); case 'any': case 'all': for (var i = 0, list = filter.slice(1); i < list.length; i += 1) { var f = list[i]; if (!isExpressionFilter(f) && typeof f !== 'boolean') { return false; } } return true; default: return true; } } var filterSpec = { 'type': 'boolean', 'default': false, 'transition': false, 'property-type': 'data-driven', 'expression': { 'interpolated': false, 'parameters': ['zoom', 'feature'] } }; /** * Given a filter expressed as nested arrays, return a new function * that evaluates whether a given feature (with a .properties or .tags property) * passes its test. * * @private * @param {Array} filter mapbox gl filter * @returns {Function} filter-evaluating function */ function createFilter(filter ) { if (filter === null || filter === undefined) { return function () { return true; }; } if (!isExpressionFilter(filter)) { filter = convertFilter(filter); } var compiled = createExpression(filter, filterSpec); if (compiled.result === 'error') { throw new Error(compiled.value.map(function (err) { return ((err.key) + ": " + (err.message)); }).join(', ')); } else { return function (globalProperties , feature ) { return compiled.value.evaluate(globalProperties, feature); }; } } // Comparison function to sort numbers and strings function compare(a, b) { return a < b ? -1 : a > b ? 1 : 0; } function convertFilter(filter ) { if (!filter) { return true; } var op = filter[0]; if (filter.length <= 1) { return (op !== 'any'); } var converted = op === '==' ? convertComparisonOp(filter[1], filter[2], '==') : op === '!=' ? convertNegation(convertComparisonOp(filter[1], filter[2], '==')) : op === '<' || op === '>' || op === '<=' || op === '>=' ? convertComparisonOp(filter[1], filter[2], op) : op === 'any' ? convertDisjunctionOp(filter.slice(1)) : op === 'all' ? ['all'].concat(filter.slice(1).map(convertFilter)) : op === 'none' ? ['all'].concat(filter.slice(1).map(convertFilter).map(convertNegation)) : op === 'in' ? convertInOp(filter[1], filter.slice(2)) : op === '!in' ? convertNegation(convertInOp(filter[1], filter.slice(2))) : op === 'has' ? convertHasOp(filter[1]) : op === '!has' ? convertNegation(convertHasOp(filter[1])) : true; return converted; } function convertComparisonOp(property , value , op ) { switch (property) { case '$type': return [("filter-type-" + op), value]; case '$id': return [("filter-id-" + op), value]; default: return [("filter-" + op), property, value]; } } function convertDisjunctionOp(filters ) { return ['any'].concat(filters.map(convertFilter)); } function convertInOp(property , values ) { if (values.length === 0) { return false; } switch (property) { case '$type': return ["filter-type-in", ['literal', values]]; case '$id': return ["filter-id-in", ['literal', values]]; default: if (values.length > 200 && !values.some(function (v) { return typeof v !== typeof values[0]; })) { return ['filter-in-large', property, ['literal', values.sort(compare)]]; } else { return ['filter-in-small', property, ['literal', values]]; } } } function convertHasOp(property ) { switch (property) { case '$type': return true; case '$id': return ["filter-has-id"]; default: return ["filter-has", property]; } } function convertNegation(filter ) { return ['!', filter]; } function validateFilter(options) { if (isExpressionFilter(deepUnbundle(options.value))) { return validateExpression(extend$1({}, options, { expressionContext: 'filter', valueSpec: { value: 'boolean' } })); } else { return validateNonExpressionFilter(options); } } function validateNonExpressionFilter(options) { var value = options.value; var key = options.key; if (getType(value) !== 'array') { return [new ValidationError(key, value, ("array expected, " + (getType(value)) + " found"))]; } var styleSpec = options.styleSpec; var type; var errors = []; if (value.length < 1) { return [new ValidationError(key, value, 'filter array must have at least 1 element')]; } errors = errors.concat(validateEnum({ key: (key + "[0]"), value: value[0], valueSpec: styleSpec.filter_operator, style: options.style, styleSpec: options.styleSpec })); switch (unbundle(value[0])) { case '<': case '<=': case '>': case '>=': if (value.length >= 2 && unbundle(value[1]) === '$type') { errors.push(new ValidationError(key, value, ("\"$type\" cannot be use with operator \"" + (value[0]) + "\""))); } /* falls through */ case '==': case '!=': if (value.length !== 3) { errors.push(new ValidationError(key, value, ("filter array for operator \"" + (value[0]) + "\" must have 3 elements"))); } /* falls through */ case 'in': case '!in': if (value.length >= 2) { type = getType(value[1]); if (type !== 'string') { errors.push(new ValidationError((key + "[1]"), value[1], ("string expected, " + type + " found"))); } } for (var i = 2; i < value.length; i++) { type = getType(value[i]); if (unbundle(value[1]) === '$type') { errors = errors.concat(validateEnum({ key: (key + "[" + i + "]"), value: value[i], valueSpec: styleSpec.geometry_type, style: options.style, styleSpec: options.styleSpec })); } else if (type !== 'string' && type !== 'number' && type !== 'boolean') { errors.push(new ValidationError((key + "[" + i + "]"), value[i], ("string, number, or boolean expected, " + type + " found"))); } } break; case 'any': case 'all': case 'none': for (var i$1 = 1; i$1 < value.length; i$1++) { errors = errors.concat(validateNonExpressionFilter({ key: (key + "[" + i$1 + "]"), value: value[i$1], style: options.style, styleSpec: options.styleSpec })); } break; case 'has': case '!has': type = getType(value[1]); if (value.length !== 2) { errors.push(new ValidationError(key, value, ("filter array for \"" + (value[0]) + "\" operator must have 2 elements"))); } else if (type !== 'string') { errors.push(new ValidationError((key + "[1]"), value[1], ("string expected, " + type + " found"))); } break; } return errors; } function validateProperty(options, propertyType) { var key = options.key; var style = options.style; var styleSpec = options.styleSpec; var value = options.value; var propertyKey = options.objectKey; var layerSpec = styleSpec[(propertyType + "_" + (options.layerType))]; if (!layerSpec) { return []; } var transitionMatch = propertyKey.match(/^(.*)-transition$/); if (propertyType === 'paint' && transitionMatch && layerSpec[transitionMatch[1]] && layerSpec[transitionMatch[1]].transition) { return validate({ key: key, value: value, valueSpec: styleSpec.transition, style: style, styleSpec: styleSpec }); } var valueSpec = options.valueSpec || layerSpec[propertyKey]; if (!valueSpec) { return [new ValidationError(key, value, ("unknown property \"" + propertyKey + "\""))]; } var tokenMatch; if (getType(value) === 'string' && supportsPropertyExpression(valueSpec) && !valueSpec.tokens && (tokenMatch = /^{([^}]+)}$/.exec(value))) { return [new ValidationError( key, value, "\"" + propertyKey + "\" does not support interpolation syntax\n" + "Use an identity property function instead: `{ \"type\": \"identity\", \"property\": " + (JSON.stringify(tokenMatch[1])) + " }`.")]; } var errors = []; if (options.layerType === 'symbol') { if (propertyKey === 'text-field' && style && !style.glyphs) { errors.push(new ValidationError(key, value, 'use of "text-field" requires a style "glyphs" property')); } if (propertyKey === 'text-font' && isFunction(deepUnbundle(value)) && unbundle(value.type) === 'identity') { errors.push(new ValidationError(key, value, '"text-font" does not support identity functions')); } } return errors.concat(validate({ key: options.key, value: value, valueSpec: valueSpec, style: style, styleSpec: styleSpec, expressionContext: 'property', propertyType: propertyType, propertyKey: propertyKey })); } function validatePaintProperty(options) { return validateProperty(options, 'paint'); } function validateLayoutProperty(options) { return validateProperty(options, 'layout'); } function validateLayer(options) { var errors = []; var layer = options.value; var key = options.key; var style = options.style; var styleSpec = options.styleSpec; if (!layer.type && !layer.ref) { errors.push(new ValidationError(key, layer, 'either "type" or "ref" is required')); } var type = unbundle(layer.type); var ref = unbundle(layer.ref); if (layer.id) { var layerId = unbundle(layer.id); for (var i = 0; i < options.arrayIndex; i++) { var otherLayer = style.layers[i]; if (unbundle(otherLayer.id) === layerId) { errors.push(new ValidationError(key, layer.id, ("duplicate layer id \"" + (layer.id) + "\", previously used at line " + (otherLayer.id.__line__)))); } } } if ('ref' in layer) { ['type', 'source', 'source-layer', 'filter', 'layout'].forEach(function (p) { if (p in layer) { errors.push(new ValidationError(key, layer[p], ("\"" + p + "\" is prohibited for ref layers"))); } }); var parent; style.layers.forEach(function (layer) { if (unbundle(layer.id) === ref) { parent = layer; } }); if (!parent) { errors.push(new ValidationError(key, layer.ref, ("ref layer \"" + ref + "\" not found"))); } else if (parent.ref) { errors.push(new ValidationError(key, layer.ref, 'ref cannot reference another ref layer')); } else { type = unbundle(parent.type); } } else if (type !== 'background') { if (!layer.source) { errors.push(new ValidationError(key, layer, 'missing required property "source"')); } else { var source = style.sources && style.sources[layer.source]; var sourceType = source && unbundle(source.type); if (!source) { errors.push(new ValidationError(key, layer.source, ("source \"" + (layer.source) + "\" not found"))); } else if (sourceType === 'vector' && type === 'raster') { errors.push(new ValidationError(key, layer.source, ("layer \"" + (layer.id) + "\" requires a raster source"))); } else if (sourceType === 'raster' && type !== 'raster') { errors.push(new ValidationError(key, layer.source, ("layer \"" + (layer.id) + "\" requires a vector source"))); } else if (sourceType === 'vector' && !layer['source-layer']) { errors.push(new ValidationError(key, layer, ("layer \"" + (layer.id) + "\" must specify a \"source-layer\""))); } else if (sourceType === 'raster-dem' && type !== 'hillshade') { errors.push(new ValidationError(key, layer.source, 'raster-dem source can only be used with layer type \'hillshade\'.')); } else if (type === 'line' && layer.paint && layer.paint['line-gradient'] && (sourceType !== 'geojson' || !source.lineMetrics)) { errors.push(new ValidationError(key, layer, ("layer \"" + (layer.id) + "\" specifies a line-gradient, which requires a GeoJSON source with `lineMetrics` enabled."))); } } } errors = errors.concat(validateObject({ key: key, value: layer, valueSpec: styleSpec.layer, style: options.style, styleSpec: options.styleSpec, objectElementValidators: { '*': function _() { return []; }, // We don't want to enforce the spec's `"requires": true` for backward compatibility with refs; // the actual requirement is validated above. See https://github.com/mapbox/mapbox-gl-js/issues/5772. type: function type() { return validate({ key: (key + ".type"), value: layer.type, valueSpec: styleSpec.layer.type, style: options.style, styleSpec: options.styleSpec, object: layer, objectKey: 'type' }); }, filter: validateFilter, layout: function layout(options) { return validateObject({ layer: layer, key: options.key, value: options.value, style: options.style, styleSpec: options.styleSpec, objectElementValidators: { '*': function _(options) { return validateLayoutProperty(extend$1({layerType: type}, options)); } } }); }, paint: function paint(options) { return validateObject({ layer: layer, key: options.key, value: options.value, style: options.style, styleSpec: options.styleSpec, objectElementValidators: { '*': function _(options) { return validatePaintProperty(extend$1({layerType: type}, options)); } } }); } } })); return errors; } function validateSource(options) { var value = options.value; var key = options.key; var styleSpec = options.styleSpec; var style = options.style; if (!value.type) { return [new ValidationError(key, value, '"type" is required')]; } var type = unbundle(value.type); var errors; switch (type) { case 'vector': case 'raster': case 'raster-dem': errors = validateObject({ key: key, value: value, valueSpec: styleSpec[("source_" + (type.replace('-', '_')))], style: options.style, styleSpec: styleSpec }); if ('url' in value) { for (var prop in value) { if (['type', 'url', 'tileSize'].indexOf(prop) < 0) { errors.push(new ValidationError((key + "." + prop), value[prop], ("a source with a \"url\" property may not include a \"" + prop + "\" property"))); } } } return errors; case 'geojson': errors = validateObject({ key: key, value: value, valueSpec: styleSpec.source_geojson, style: style, styleSpec: styleSpec }); if (value.cluster) { for (var prop$1 in value.clusterProperties) { var ref = value.clusterProperties[prop$1]; var operator = ref[0]; var mapExpr = ref[1]; var reduceExpr = typeof operator === 'string' ? [operator, ['accumulated'], ['get', prop$1]] : operator; errors.push.apply(errors, validateExpression({ key: (key + "." + prop$1 + ".map"), value: mapExpr, expressionContext: 'cluster-map' })); errors.push.apply(errors, validateExpression({ key: (key + "." + prop$1 + ".reduce"), value: reduceExpr, expressionContext: 'cluster-reduce' })); } } return errors; case 'video': return validateObject({ key: key, value: value, valueSpec: styleSpec.source_video, style: style, styleSpec: styleSpec }); case 'image': return validateObject({ key: key, value: value, valueSpec: styleSpec.source_image, style: style, styleSpec: styleSpec }); case 'canvas': return [new ValidationError(key, null, "Please use runtime APIs to add canvas sources, rather than including them in stylesheets.", 'source.canvas')]; default: return validateEnum({ key: (key + ".type"), value: value.type, valueSpec: {values: ['vector', 'raster', 'raster-dem', 'geojson', 'video', 'image']}, style: style, styleSpec: styleSpec }); } } function validateLight(options) { var light = options.value; var styleSpec = options.styleSpec; var lightSpec = styleSpec.light; var style = options.style; var errors = []; var rootType = getType(light); if (light === undefined) { return errors; } else if (rootType !== 'object') { errors = errors.concat([new ValidationError('light', light, ("object expected, " + rootType + " found"))]); return errors; } for (var key in light) { var transitionMatch = key.match(/^(.*)-transition$/); if (transitionMatch && lightSpec[transitionMatch[1]] && lightSpec[transitionMatch[1]].transition) { errors = errors.concat(validate({ key: key, value: light[key], valueSpec: styleSpec.transition, style: style, styleSpec: styleSpec })); } else if (lightSpec[key]) { errors = errors.concat(validate({ key: key, value: light[key], valueSpec: lightSpec[key], style: style, styleSpec: styleSpec })); } else { errors = errors.concat([new ValidationError(key, light[key], ("unknown property \"" + key + "\""))]); } } return errors; } function validateString(options) { var value = options.value; var key = options.key; var type = getType(value); if (type !== 'string') { return [new ValidationError(key, value, ("string expected, " + type + " found"))]; } return []; } // function validateFormatted(options ) { if (validateString(options).length === 0) { return []; } return validateExpression(options); } var VALIDATORS = { '*': function _() { return []; }, 'array': validateArray, 'boolean': validateBoolean, 'number': validateNumber, 'color': validateColor, 'constants': validateConstants, 'enum': validateEnum, 'filter': validateFilter, 'function': validateFunction, 'layer': validateLayer, 'object': validateObject, 'source': validateSource, 'light': validateLight, 'string': validateString, 'formatted': validateFormatted }; // Main recursive validation function. Tracks: // // - key: string representing location of validation in style tree. Used only // for more informative error reporting. // - value: current value from style being evaluated. May be anything from a // high level object that needs to be descended into deeper or a simple // scalar value. // - valueSpec: current spec being evaluated. Tracks value. // - styleSpec: current full spec being evaluated. function validate(options) { var value = options.value; var valueSpec = options.valueSpec; var styleSpec = options.styleSpec; if (valueSpec.expression && isFunction(unbundle(value))) { return validateFunction(options); } else if (valueSpec.expression && isExpression(deepUnbundle(value))) { return validateExpression(options); } else if (valueSpec.type && VALIDATORS[valueSpec.type]) { return VALIDATORS[valueSpec.type](options); } else { var valid = validateObject(extend$1({}, options, { valueSpec: valueSpec.type ? styleSpec[valueSpec.type] : valueSpec })); return valid; } } function validateGlyphsURL(options) { var value = options.value; var key = options.key; var errors = validateString(options); if (errors.length) { return errors; } if (value.indexOf('{fontstack}') === -1) { errors.push(new ValidationError(key, value, '"glyphs" url must include a "{fontstack}" token')); } if (value.indexOf('{range}') === -1) { errors.push(new ValidationError(key, value, '"glyphs" url must include a "{range}" token')); } return errors; } /** * Validate a Mapbox GL style against the style specification. This entrypoint, * `mapbox-gl-style-spec/lib/validate_style.min`, is designed to produce as * small a browserify bundle as possible by omitting unnecessary functionality * and legacy style specifications. * * @private * @param {Object} style The style to be validated. * @param {Object} [styleSpec] The style specification to validate against. * If omitted, the latest style spec is used. * @returns {Array} * @example * var validate = require('mapbox-gl-style-spec/lib/validate_style.min'); * var errors = validate(style); */ function validateStyleMin(style, styleSpec) { styleSpec = styleSpec || spec; var errors = []; errors = errors.concat(validate({ key: '', value: style, valueSpec: styleSpec.$root, styleSpec: styleSpec, style: style, objectElementValidators: { glyphs: validateGlyphsURL, '*': function _() { return []; } } })); if (style.constants) { errors = errors.concat(validateConstants({ key: 'constants', value: style.constants, style: style, styleSpec: styleSpec })); } return sortErrors(errors); } validateStyleMin.source = wrapCleanErrors(validateSource); validateStyleMin.light = wrapCleanErrors(validateLight); validateStyleMin.layer = wrapCleanErrors(validateLayer); validateStyleMin.filter = wrapCleanErrors(validateFilter); validateStyleMin.paintProperty = wrapCleanErrors(validatePaintProperty); validateStyleMin.layoutProperty = wrapCleanErrors(validateLayoutProperty); function sortErrors(errors) { return [].concat(errors).sort(function (a, b) { return a.line - b.line; }); } function wrapCleanErrors(inner) { return function() { var args = [], len = arguments.length; while ( len-- ) args[ len ] = arguments[ len ]; return sortErrors(inner.apply(this, args)); }; } // var validateStyle = (validateStyleMin ); var validateSource$1 = (validateStyleMin.source ); var validateLight$1 = (validateStyleMin.light ); var validateFilter$1 = (validateStyleMin.filter ); var validatePaintProperty$1 = (validateStyleMin.paintProperty ); var validateLayoutProperty$1 = (validateStyleMin.layoutProperty ); function emitValidationErrors(emitter , errors ) { var hasErrors = false; if (errors && errors.length) { for (var i = 0, list = errors; i < list.length; i += 1) { var error = list[i]; emitter.fire(new ErrorEvent(new Error(error.message))); hasErrors = true; } } return hasErrors; } 'use strict'; var gridIndex = GridIndex; var NUM_PARAMS = 3; function GridIndex(extent, n, padding) { var cells = this.cells = []; if (extent instanceof ArrayBuffer) { this.arrayBuffer = extent; var array = new Int32Array(this.arrayBuffer); extent = array[0]; n = array[1]; padding = array[2]; this.d = n + 2 * padding; for (var k = 0; k < this.d * this.d; k++) { var start = array[NUM_PARAMS + k]; var end = array[NUM_PARAMS + k + 1]; cells.push(start === end ? null : array.subarray(start, end)); } var keysOffset = array[NUM_PARAMS + cells.length]; var bboxesOffset = array[NUM_PARAMS + cells.length + 1]; this.keys = array.subarray(keysOffset, bboxesOffset); this.bboxes = array.subarray(bboxesOffset); this.insert = this._insertReadonly; } else { this.d = n + 2 * padding; for (var i = 0; i < this.d * this.d; i++) { cells.push([]); } this.keys = []; this.bboxes = []; } this.n = n; this.extent = extent; this.padding = padding; this.scale = n / extent; this.uid = 0; var p = (padding / n) * extent; this.min = -p; this.max = extent + p; } GridIndex.prototype.insert = function(key, x1, y1, x2, y2) { this._forEachCell(x1, y1, x2, y2, this._insertCell, this.uid++); this.keys.push(key); this.bboxes.push(x1); this.bboxes.push(y1); this.bboxes.push(x2); this.bboxes.push(y2); }; GridIndex.prototype._insertReadonly = function() { throw 'Cannot insert into a GridIndex created from an ArrayBuffer.'; }; GridIndex.prototype._insertCell = function(x1, y1, x2, y2, cellIndex, uid) { this.cells[cellIndex].push(uid); }; GridIndex.prototype.query = function(x1, y1, x2, y2, intersectionTest) { var min = this.min; var max = this.max; if (x1 <= min && y1 <= min && max <= x2 && max <= y2 && !intersectionTest) { // We use `Array#slice` because `this.keys` may be a `Int32Array` and // some browsers (Safari and IE) do not support `TypedArray#slice` // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/slice#Browser_compatibility return Array.prototype.slice.call(this.keys); } else { var result = []; var seenUids = {}; this._forEachCell(x1, y1, x2, y2, this._queryCell, result, seenUids, intersectionTest); return result; } }; GridIndex.prototype._queryCell = function(x1, y1, x2, y2, cellIndex, result, seenUids, intersectionTest) { var cell = this.cells[cellIndex]; if (cell !== null) { var keys = this.keys; var bboxes = this.bboxes; for (var u = 0; u < cell.length; u++) { var uid = cell[u]; if (seenUids[uid] === undefined) { var offset = uid * 4; if (intersectionTest ? intersectionTest(bboxes[offset + 0], bboxes[offset + 1], bboxes[offset + 2], bboxes[offset + 3]) : ((x1 <= bboxes[offset + 2]) && (y1 <= bboxes[offset + 3]) && (x2 >= bboxes[offset + 0]) && (y2 >= bboxes[offset + 1]))) { seenUids[uid] = true; result.push(keys[uid]); } else { seenUids[uid] = false; } } } } }; GridIndex.prototype._forEachCell = function(x1, y1, x2, y2, fn, arg1, arg2, intersectionTest) { var cx1 = this._convertToCellCoord(x1); var cy1 = this._convertToCellCoord(y1); var cx2 = this._convertToCellCoord(x2); var cy2 = this._convertToCellCoord(y2); for (var x = cx1; x <= cx2; x++) { for (var y = cy1; y <= cy2; y++) { var cellIndex = this.d * y + x; if (intersectionTest && !intersectionTest( this._convertFromCellCoord(x), this._convertFromCellCoord(y), this._convertFromCellCoord(x + 1), this._convertFromCellCoord(y + 1))) { continue; } if (fn.call(this, x1, y1, x2, y2, cellIndex, arg1, arg2, intersectionTest)) { return; } } } }; GridIndex.prototype._convertFromCellCoord = function(x) { return (x - this.padding) / this.scale; }; GridIndex.prototype._convertToCellCoord = function(x) { return Math.max(0, Math.min(this.d - 1, Math.floor(x * this.scale) + this.padding)); }; GridIndex.prototype.toArrayBuffer = function() { if (this.arrayBuffer) { return this.arrayBuffer; } var cells = this.cells; var metadataLength = NUM_PARAMS + this.cells.length + 1 + 1; var totalCellLength = 0; for (var i = 0; i < this.cells.length; i++) { totalCellLength += this.cells[i].length; } var array = new Int32Array(metadataLength + totalCellLength + this.keys.length + this.bboxes.length); array[0] = this.extent; array[1] = this.n; array[2] = this.padding; var offset = metadataLength; for (var k = 0; k < cells.length; k++) { var cell = cells[k]; array[NUM_PARAMS + k] = offset; array.set(cell, offset); offset += cell.length; } array[NUM_PARAMS + cells.length] = offset; array.set(this.keys, offset); offset += this.keys.length; array[NUM_PARAMS + cells.length + 1] = offset; array.set(this.bboxes, offset); offset += this.bboxes.length; return array.buffer; }; // var ImageData = self.ImageData; // eslint-disable-line var registry = {}; /** * Register the given class as serializable. * * @param options * @param options.omit List of properties to omit from serialization (e.g., cached/computed properties) * @param options.shallow List of properties that should be serialized by a simple shallow copy, rather than by a recursive call to serialize(). * * @private */ function register (name , klass , options) { if ( options === void 0 ) options = {}; assert_1(!registry[name], (name + " is already registered.")); (Object.defineProperty )(klass, '_classRegistryKey', { value: name, writeable: false }); registry[name] = { klass: klass, omit: options.omit || [], shallow: options.shallow || [] }; } register('Object', Object); gridIndex.serialize = function serialize(grid , transferables ) { var buffer = grid.toArrayBuffer(); if (transferables) { transferables.push(buffer); } return {buffer: buffer}; }; gridIndex.deserialize = function deserialize(serialized ) { return new gridIndex(serialized.buffer); }; register('Grid', gridIndex); register('Color', Color); register('Error', Error); register('StylePropertyFunction', StylePropertyFunction); register('StyleExpression', StyleExpression, {omit: ['_evaluator']}); register('ZoomDependentExpression', ZoomDependentExpression); register('ZoomConstantExpression', ZoomConstantExpression); register('CompoundExpression', CompoundExpression, {omit: ['_evaluate']}); for (var name$1 in expressions) { if ((expressions[name$1] )._classRegistryKey) { continue; } register(("Expression_" + name$1), expressions[name$1]); } /** * Serialize the given object for transfer to or from a web worker. * * For non-builtin types, recursively serialize each property (possibly * omitting certain properties - see register()), and package the result along * with the constructor's `name` so that the appropriate constructor can be * looked up in `deserialize()`. * * If a `transferables` array is provided, add any transferable objects (i.e., * any ArrayBuffers or ArrayBuffer views) to the list. (If a copy is needed, * this should happen in the client code, before using serialize().) * * @private */ function serialize(input , transferables ) { if (input === null || input === undefined || typeof input === 'boolean' || typeof input === 'number' || typeof input === 'string' || input instanceof Boolean || input instanceof Number || input instanceof String || input instanceof Date || input instanceof RegExp) { return input; } if (input instanceof ArrayBuffer) { if (transferables) { transferables.push(input); } return input; } if (ArrayBuffer.isView(input)) { var view = (input ); if (transferables) { transferables.push(view.buffer); } return view; } if (input instanceof ImageData) { if (transferables) { transferables.push(input.data.buffer); } return input; } if (Array.isArray(input)) { var serialized = []; for (var i = 0, list = input; i < list.length; i += 1) { var item = list[i]; serialized.push(serialize(item, transferables)); } return serialized; } if (typeof input === 'object') { var klass = (input.constructor ); var name = klass._classRegistryKey; if (!name) { throw new Error("can't serialize object of unregistered class"); } assert_1(registry[name]); var properties = klass.serialize ? // (Temporary workaround) allow a class to provide static // `serialize()` and `deserialize()` methods to bypass the generic // approach. // This temporary workaround lets us use the generic serialization // approach for objects whose members include instances of dynamic // StructArray types. Once we refactor StructArray to be static, // we can remove this complexity. (klass.serialize(input, transferables) ) : {}; if (!klass.serialize) { for (var key in input) { // any cast due to https://github.com/facebook/flow/issues/5393 if (!(input ).hasOwnProperty(key)) { continue; } if (registry[name].omit.indexOf(key) >= 0) { continue; } var property = (input )[key]; properties[key] = registry[name].shallow.indexOf(key) >= 0 ? property : serialize(property, transferables); } if (input instanceof Error) { properties.message = input.message; } } else { // make sure statically serialized object survives transfer of $name property assert_1(!transferables || properties !== transferables[transferables.length - 1]); } if (properties.$name) { throw new Error('$name property is reserved for worker serialization logic.'); } if (name !== 'Object') { properties.$name = name; } return properties; } throw new Error(("can't serialize object of type " + (typeof input))); } function deserialize(input ) { if (input === null || input === undefined || typeof input === 'boolean' || typeof input === 'number' || typeof input === 'string' || input instanceof Boolean || input instanceof Number || input instanceof String || input instanceof Date || input instanceof RegExp || input instanceof ArrayBuffer || ArrayBuffer.isView(input) || input instanceof ImageData) { return input; } if (Array.isArray(input)) { return input.map(deserialize); } if (typeof input === 'object') { var name = (input ).$name || 'Object'; var ref = registry[name]; var klass = ref.klass; if (!klass) { throw new Error(("can't deserialize unregistered class " + name)); } if (klass.deserialize) { return (klass.deserialize )(input); } var result = Object.create(klass.prototype); for (var i = 0, list = Object.keys(input); i < list.length; i += 1) { var key = list[i]; if (key === '$name') { continue; } var value = (input )[key]; result[key] = registry[name].shallow.indexOf(key) >= 0 ? value : deserialize(value); } return result; } throw new Error(("can't deserialize object of type " + (typeof input))); } // var ZoomHistory = function ZoomHistory() { this.first = true; }; ZoomHistory.prototype.update = function update (z , now ) { var floorZ = Math.floor(z); if (this.first) { this.first = false; this.lastIntegerZoom = floorZ; this.lastIntegerZoomTime = 0; this.lastZoom = z; this.lastFloorZoom = floorZ; return true; } if (this.lastFloorZoom > floorZ) { this.lastIntegerZoom = floorZ + 1; this.lastIntegerZoomTime = now; } else if (this.lastFloorZoom < floorZ) { this.lastIntegerZoom = floorZ; this.lastIntegerZoomTime = now; } if (z !== this.lastZoom) { this.lastZoom = z; this.lastFloorZoom = floorZ; return true; } return false; }; // // The following table comes from . // Keep it synchronized with . var unicodeBlockLookup = { // 'Basic Latin': (char) => char >= 0x0000 && char <= 0x007F, 'Latin-1 Supplement': function (char) { return char >= 0x0080 && char <= 0x00FF; }, // 'Latin Extended-A': (char) => char >= 0x0100 && char <= 0x017F, // 'Latin Extended-B': (char) => char >= 0x0180 && char <= 0x024F, // 'IPA Extensions': (char) => char >= 0x0250 && char <= 0x02AF, // 'Spacing Modifier Letters': (char) => char >= 0x02B0 && char <= 0x02FF, // 'Combining Diacritical Marks': (char) => char >= 0x0300 && char <= 0x036F, // 'Greek and Coptic': (char) => char >= 0x0370 && char <= 0x03FF, // 'Cyrillic': (char) => char >= 0x0400 && char <= 0x04FF, // 'Cyrillic Supplement': (char) => char >= 0x0500 && char <= 0x052F, // 'Armenian': (char) => char >= 0x0530 && char <= 0x058F, //'Hebrew': (char) => char >= 0x0590 && char <= 0x05FF, 'Arabic': function (char) { return char >= 0x0600 && char <= 0x06FF; }, //'Syriac': (char) => char >= 0x0700 && char <= 0x074F, 'Arabic Supplement': function (char) { return char >= 0x0750 && char <= 0x077F; }, // 'Thaana': (char) => char >= 0x0780 && char <= 0x07BF, // 'NKo': (char) => char >= 0x07C0 && char <= 0x07FF, // 'Samaritan': (char) => char >= 0x0800 && char <= 0x083F, // 'Mandaic': (char) => char >= 0x0840 && char <= 0x085F, // 'Syriac Supplement': (char) => char >= 0x0860 && char <= 0x086F, 'Arabic Extended-A': function (char) { return char >= 0x08A0 && char <= 0x08FF; }, // 'Devanagari': (char) => char >= 0x0900 && char <= 0x097F, // 'Bengali': (char) => char >= 0x0980 && char <= 0x09FF, // 'Gurmukhi': (char) => char >= 0x0A00 && char <= 0x0A7F, // 'Gujarati': (char) => char >= 0x0A80 && char <= 0x0AFF, // 'Oriya': (char) => char >= 0x0B00 && char <= 0x0B7F, // 'Tamil': (char) => char >= 0x0B80 && char <= 0x0BFF, // 'Telugu': (char) => char >= 0x0C00 && char <= 0x0C7F, // 'Kannada': (char) => char >= 0x0C80 && char <= 0x0CFF, // 'Malayalam': (char) => char >= 0x0D00 && char <= 0x0D7F, // 'Sinhala': (char) => char >= 0x0D80 && char <= 0x0DFF, // 'Thai': (char) => char >= 0x0E00 && char <= 0x0E7F, // 'Lao': (char) => char >= 0x0E80 && char <= 0x0EFF, // 'Tibetan': (char) => char >= 0x0F00 && char <= 0x0FFF, // 'Myanmar': (char) => char >= 0x1000 && char <= 0x109F, // 'Georgian': (char) => char >= 0x10A0 && char <= 0x10FF, 'Hangul Jamo': function (char) { return char >= 0x1100 && char <= 0x11FF; }, // 'Ethiopic': (char) => char >= 0x1200 && char <= 0x137F, // 'Ethiopic Supplement': (char) => char >= 0x1380 && char <= 0x139F, // 'Cherokee': (char) => char >= 0x13A0 && char <= 0x13FF, 'Unified Canadian Aboriginal Syllabics': function (char) { return char >= 0x1400 && char <= 0x167F; }, // 'Ogham': (char) => char >= 0x1680 && char <= 0x169F, // 'Runic': (char) => char >= 0x16A0 && char <= 0x16FF, // 'Tagalog': (char) => char >= 0x1700 && char <= 0x171F, // 'Hanunoo': (char) => char >= 0x1720 && char <= 0x173F, // 'Buhid': (char) => char >= 0x1740 && char <= 0x175F, // 'Tagbanwa': (char) => char >= 0x1760 && char <= 0x177F, 'Khmer': function (char) { return char >= 0x1780 && char <= 0x17FF; }, // 'Mongolian': (char) => char >= 0x1800 && char <= 0x18AF, 'Unified Canadian Aboriginal Syllabics Extended': function (char) { return char >= 0x18B0 && char <= 0x18FF; }, // 'Limbu': (char) => char >= 0x1900 && char <= 0x194F, // 'Tai Le': (char) => char >= 0x1950 && char <= 0x197F, // 'New Tai Lue': (char) => char >= 0x1980 && char <= 0x19DF, // 'Khmer Symbols': (char) => char >= 0x19E0 && char <= 0x19FF, // 'Buginese': (char) => char >= 0x1A00 && char <= 0x1A1F, // 'Tai Tham': (char) => char >= 0x1A20 && char <= 0x1AAF, // 'Combining Diacritical Marks Extended': (char) => char >= 0x1AB0 && char <= 0x1AFF, // 'Balinese': (char) => char >= 0x1B00 && char <= 0x1B7F, // 'Sundanese': (char) => char >= 0x1B80 && char <= 0x1BBF, // 'Batak': (char) => char >= 0x1BC0 && char <= 0x1BFF, // 'Lepcha': (char) => char >= 0x1C00 && char <= 0x1C4F, // 'Ol Chiki': (char) => char >= 0x1C50 && char <= 0x1C7F, // 'Cyrillic Extended-C': (char) => char >= 0x1C80 && char <= 0x1C8F, // 'Georgian Extended': (char) => char >= 0x1C90 && char <= 0x1CBF, // 'Sundanese Supplement': (char) => char >= 0x1CC0 && char <= 0x1CCF, // 'Vedic Extensions': (char) => char >= 0x1CD0 && char <= 0x1CFF, // 'Phonetic Extensions': (char) => char >= 0x1D00 && char <= 0x1D7F, // 'Phonetic Extensions Supplement': (char) => char >= 0x1D80 && char <= 0x1DBF, // 'Combining Diacritical Marks Supplement': (char) => char >= 0x1DC0 && char <= 0x1DFF, // 'Latin Extended Additional': (char) => char >= 0x1E00 && char <= 0x1EFF, // 'Greek Extended': (char) => char >= 0x1F00 && char <= 0x1FFF, 'General Punctuation': function (char) { return char >= 0x2000 && char <= 0x206F; }, // 'Superscripts and Subscripts': (char) => char >= 0x2070 && char <= 0x209F, // 'Currency Symbols': (char) => char >= 0x20A0 && char <= 0x20CF, // 'Combining Diacritical Marks for Symbols': (char) => char >= 0x20D0 && char <= 0x20FF, 'Letterlike Symbols': function (char) { return char >= 0x2100 && char <= 0x214F; }, 'Number Forms': function (char) { return char >= 0x2150 && char <= 0x218F; }, // 'Arrows': (char) => char >= 0x2190 && char <= 0x21FF, // 'Mathematical Operators': (char) => char >= 0x2200 && char <= 0x22FF, 'Miscellaneous Technical': function (char) { return char >= 0x2300 && char <= 0x23FF; }, 'Control Pictures': function (char) { return char >= 0x2400 && char <= 0x243F; }, 'Optical Character Recognition': function (char) { return char >= 0x2440 && char <= 0x245F; }, 'Enclosed Alphanumerics': function (char) { return char >= 0x2460 && char <= 0x24FF; }, // 'Box Drawing': (char) => char >= 0x2500 && char <= 0x257F, // 'Block Elements': (char) => char >= 0x2580 && char <= 0x259F, 'Geometric Shapes': function (char) { return char >= 0x25A0 && char <= 0x25FF; }, 'Miscellaneous Symbols': function (char) { return char >= 0x2600 && char <= 0x26FF; }, // 'Dingbats': (char) => char >= 0x2700 && char <= 0x27BF, // 'Miscellaneous Mathematical Symbols-A': (char) => char >= 0x27C0 && char <= 0x27EF, // 'Supplemental Arrows-A': (char) => char >= 0x27F0 && char <= 0x27FF, // 'Braille Patterns': (char) => char >= 0x2800 && char <= 0x28FF, // 'Supplemental Arrows-B': (char) => char >= 0x2900 && char <= 0x297F, // 'Miscellaneous Mathematical Symbols-B': (char) => char >= 0x2980 && char <= 0x29FF, // 'Supplemental Mathematical Operators': (char) => char >= 0x2A00 && char <= 0x2AFF, 'Miscellaneous Symbols and Arrows': function (char) { return char >= 0x2B00 && char <= 0x2BFF; }, // 'Glagolitic': (char) => char >= 0x2C00 && char <= 0x2C5F, // 'Latin Extended-C': (char) => char >= 0x2C60 && char <= 0x2C7F, // 'Coptic': (char) => char >= 0x2C80 && char <= 0x2CFF, // 'Georgian Supplement': (char) => char >= 0x2D00 && char <= 0x2D2F, // 'Tifinagh': (char) => char >= 0x2D30 && char <= 0x2D7F, // 'Ethiopic Extended': (char) => char >= 0x2D80 && char <= 0x2DDF, // 'Cyrillic Extended-A': (char) => char >= 0x2DE0 && char <= 0x2DFF, // 'Supplemental Punctuation': (char) => char >= 0x2E00 && char <= 0x2E7F, 'CJK Radicals Supplement': function (char) { return char >= 0x2E80 && char <= 0x2EFF; }, 'Kangxi Radicals': function (char) { return char >= 0x2F00 && char <= 0x2FDF; }, 'Ideographic Description Characters': function (char) { return char >= 0x2FF0 && char <= 0x2FFF; }, 'CJK Symbols and Punctuation': function (char) { return char >= 0x3000 && char <= 0x303F; }, 'Hiragana': function (char) { return char >= 0x3040 && char <= 0x309F; }, 'Katakana': function (char) { return char >= 0x30A0 && char <= 0x30FF; }, 'Bopomofo': function (char) { return char >= 0x3100 && char <= 0x312F; }, 'Hangul Compatibility Jamo': function (char) { return char >= 0x3130 && char <= 0x318F; }, 'Kanbun': function (char) { return char >= 0x3190 && char <= 0x319F; }, 'Bopomofo Extended': function (char) { return char >= 0x31A0 && char <= 0x31BF; }, 'CJK Strokes': function (char) { return char >= 0x31C0 && char <= 0x31EF; }, 'Katakana Phonetic Extensions': function (char) { return char >= 0x31F0 && char <= 0x31FF; }, 'Enclosed CJK Letters and Months': function (char) { return char >= 0x3200 && char <= 0x32FF; }, 'CJK Compatibility': function (char) { return char >= 0x3300 && char <= 0x33FF; }, 'CJK Unified Ideographs Extension A': function (char) { return char >= 0x3400 && char <= 0x4DBF; }, 'Yijing Hexagram Symbols': function (char) { return char >= 0x4DC0 && char <= 0x4DFF; }, 'CJK Unified Ideographs': function (char) { return char >= 0x4E00 && char <= 0x9FFF; }, 'Yi Syllables': function (char) { return char >= 0xA000 && char <= 0xA48F; }, 'Yi Radicals': function (char) { return char >= 0xA490 && char <= 0xA4CF; }, // 'Lisu': (char) => char >= 0xA4D0 && char <= 0xA4FF, // 'Vai': (char) => char >= 0xA500 && char <= 0xA63F, // 'Cyrillic Extended-B': (char) => char >= 0xA640 && char <= 0xA69F, // 'Bamum': (char) => char >= 0xA6A0 && char <= 0xA6FF, // 'Modifier Tone Letters': (char) => char >= 0xA700 && char <= 0xA71F, // 'Latin Extended-D': (char) => char >= 0xA720 && char <= 0xA7FF, // 'Syloti Nagri': (char) => char >= 0xA800 && char <= 0xA82F, // 'Common Indic Number Forms': (char) => char >= 0xA830 && char <= 0xA83F, // 'Phags-pa': (char) => char >= 0xA840 && char <= 0xA87F, // 'Saurashtra': (char) => char >= 0xA880 && char <= 0xA8DF, // 'Devanagari Extended': (char) => char >= 0xA8E0 && char <= 0xA8FF, // 'Kayah Li': (char) => char >= 0xA900 && char <= 0xA92F, // 'Rejang': (char) => char >= 0xA930 && char <= 0xA95F, 'Hangul Jamo Extended-A': function (char) { return char >= 0xA960 && char <= 0xA97F; }, // 'Javanese': (char) => char >= 0xA980 && char <= 0xA9DF, // 'Myanmar Extended-B': (char) => char >= 0xA9E0 && char <= 0xA9FF, // 'Cham': (char) => char >= 0xAA00 && char <= 0xAA5F, // 'Myanmar Extended-A': (char) => char >= 0xAA60 && char <= 0xAA7F, // 'Tai Viet': (char) => char >= 0xAA80 && char <= 0xAADF, // 'Meetei Mayek Extensions': (char) => char >= 0xAAE0 && char <= 0xAAFF, // 'Ethiopic Extended-A': (char) => char >= 0xAB00 && char <= 0xAB2F, // 'Latin Extended-E': (char) => char >= 0xAB30 && char <= 0xAB6F, // 'Cherokee Supplement': (char) => char >= 0xAB70 && char <= 0xABBF, // 'Meetei Mayek': (char) => char >= 0xABC0 && char <= 0xABFF, 'Hangul Syllables': function (char) { return char >= 0xAC00 && char <= 0xD7AF; }, 'Hangul Jamo Extended-B': function (char) { return char >= 0xD7B0 && char <= 0xD7FF; }, // 'High Surrogates': (char) => char >= 0xD800 && char <= 0xDB7F, // 'High Private Use Surrogates': (char) => char >= 0xDB80 && char <= 0xDBFF, // 'Low Surrogates': (char) => char >= 0xDC00 && char <= 0xDFFF, 'Private Use Area': function (char) { return char >= 0xE000 && char <= 0xF8FF; }, 'CJK Compatibility Ideographs': function (char) { return char >= 0xF900 && char <= 0xFAFF; }, // 'Alphabetic Presentation Forms': (char) => char >= 0xFB00 && char <= 0xFB4F, 'Arabic Presentation Forms-A': function (char) { return char >= 0xFB50 && char <= 0xFDFF; }, // 'Variation Selectors': (char) => char >= 0xFE00 && char <= 0xFE0F, 'Vertical Forms': function (char) { return char >= 0xFE10 && char <= 0xFE1F; }, // 'Combining Half Marks': (char) => char >= 0xFE20 && char <= 0xFE2F, 'CJK Compatibility Forms': function (char) { return char >= 0xFE30 && char <= 0xFE4F; }, 'Small Form Variants': function (char) { return char >= 0xFE50 && char <= 0xFE6F; }, 'Arabic Presentation Forms-B': function (char) { return char >= 0xFE70 && char <= 0xFEFF; }, 'Halfwidth and Fullwidth Forms': function (char) { return char >= 0xFF00 && char <= 0xFFEF; } // 'Specials': (char) => char >= 0xFFF0 && char <= 0xFFFF, // 'Linear B Syllabary': (char) => char >= 0x10000 && char <= 0x1007F, // 'Linear B Ideograms': (char) => char >= 0x10080 && char <= 0x100FF, // 'Aegean Numbers': (char) => char >= 0x10100 && char <= 0x1013F, // 'Ancient Greek Numbers': (char) => char >= 0x10140 && char <= 0x1018F, // 'Ancient Symbols': (char) => char >= 0x10190 && char <= 0x101CF, // 'Phaistos Disc': (char) => char >= 0x101D0 && char <= 0x101FF, // 'Lycian': (char) => char >= 0x10280 && char <= 0x1029F, // 'Carian': (char) => char >= 0x102A0 && char <= 0x102DF, // 'Coptic Epact Numbers': (char) => char >= 0x102E0 && char <= 0x102FF, // 'Old Italic': (char) => char >= 0x10300 && char <= 0x1032F, // 'Gothic': (char) => char >= 0x10330 && char <= 0x1034F, // 'Old Permic': (char) => char >= 0x10350 && char <= 0x1037F, // 'Ugaritic': (char) => char >= 0x10380 && char <= 0x1039F, // 'Old Persian': (char) => char >= 0x103A0 && char <= 0x103DF, // 'Deseret': (char) => char >= 0x10400 && char <= 0x1044F, // 'Shavian': (char) => char >= 0x10450 && char <= 0x1047F, // 'Osmanya': (char) => char >= 0x10480 && char <= 0x104AF, // 'Osage': (char) => char >= 0x104B0 && char <= 0x104FF, // 'Elbasan': (char) => char >= 0x10500 && char <= 0x1052F, // 'Caucasian Albanian': (char) => char >= 0x10530 && char <= 0x1056F, // 'Linear A': (char) => char >= 0x10600 && char <= 0x1077F, // 'Cypriot Syllabary': (char) => char >= 0x10800 && char <= 0x1083F, // 'Imperial Aramaic': (char) => char >= 0x10840 && char <= 0x1085F, // 'Palmyrene': (char) => char >= 0x10860 && char <= 0x1087F, // 'Nabataean': (char) => char >= 0x10880 && char <= 0x108AF, // 'Hatran': (char) => char >= 0x108E0 && char <= 0x108FF, // 'Phoenician': (char) => char >= 0x10900 && char <= 0x1091F, // 'Lydian': (char) => char >= 0x10920 && char <= 0x1093F, // 'Meroitic Hieroglyphs': (char) => char >= 0x10980 && char <= 0x1099F, // 'Meroitic Cursive': (char) => char >= 0x109A0 && char <= 0x109FF, // 'Kharoshthi': (char) => char >= 0x10A00 && char <= 0x10A5F, // 'Old South Arabian': (char) => char >= 0x10A60 && char <= 0x10A7F, // 'Old North Arabian': (char) => char >= 0x10A80 && char <= 0x10A9F, // 'Manichaean': (char) => char >= 0x10AC0 && char <= 0x10AFF, // 'Avestan': (char) => char >= 0x10B00 && char <= 0x10B3F, // 'Inscriptional Parthian': (char) => char >= 0x10B40 && char <= 0x10B5F, // 'Inscriptional Pahlavi': (char) => char >= 0x10B60 && char <= 0x10B7F, // 'Psalter Pahlavi': (char) => char >= 0x10B80 && char <= 0x10BAF, // 'Old Turkic': (char) => char >= 0x10C00 && char <= 0x10C4F, // 'Old Hungarian': (char) => char >= 0x10C80 && char <= 0x10CFF, // 'Hanifi Rohingya': (char) => char >= 0x10D00 && char <= 0x10D3F, // 'Rumi Numeral Symbols': (char) => char >= 0x10E60 && char <= 0x10E7F, // 'Old Sogdian': (char) => char >= 0x10F00 && char <= 0x10F2F, // 'Sogdian': (char) => char >= 0x10F30 && char <= 0x10F6F, // 'Brahmi': (char) => char >= 0x11000 && char <= 0x1107F, // 'Kaithi': (char) => char >= 0x11080 && char <= 0x110CF, // 'Sora Sompeng': (char) => char >= 0x110D0 && char <= 0x110FF, // 'Chakma': (char) => char >= 0x11100 && char <= 0x1114F, // 'Mahajani': (char) => char >= 0x11150 && char <= 0x1117F, // 'Sharada': (char) => char >= 0x11180 && char <= 0x111DF, // 'Sinhala Archaic Numbers': (char) => char >= 0x111E0 && char <= 0x111FF, // 'Khojki': (char) => char >= 0x11200 && char <= 0x1124F, // 'Multani': (char) => char >= 0x11280 && char <= 0x112AF, // 'Khudawadi': (char) => char >= 0x112B0 && char <= 0x112FF, // 'Grantha': (char) => char >= 0x11300 && char <= 0x1137F, // 'Newa': (char) => char >= 0x11400 && char <= 0x1147F, // 'Tirhuta': (char) => char >= 0x11480 && char <= 0x114DF, // 'Siddham': (char) => char >= 0x11580 && char <= 0x115FF, // 'Modi': (char) => char >= 0x11600 && char <= 0x1165F, // 'Mongolian Supplement': (char) => char >= 0x11660 && char <= 0x1167F, // 'Takri': (char) => char >= 0x11680 && char <= 0x116CF, // 'Ahom': (char) => char >= 0x11700 && char <= 0x1173F, // 'Dogra': (char) => char >= 0x11800 && char <= 0x1184F, // 'Warang Citi': (char) => char >= 0x118A0 && char <= 0x118FF, // 'Zanabazar Square': (char) => char >= 0x11A00 && char <= 0x11A4F, // 'Soyombo': (char) => char >= 0x11A50 && char <= 0x11AAF, // 'Pau Cin Hau': (char) => char >= 0x11AC0 && char <= 0x11AFF, // 'Bhaiksuki': (char) => char >= 0x11C00 && char <= 0x11C6F, // 'Marchen': (char) => char >= 0x11C70 && char <= 0x11CBF, // 'Masaram Gondi': (char) => char >= 0x11D00 && char <= 0x11D5F, // 'Gunjala Gondi': (char) => char >= 0x11D60 && char <= 0x11DAF, // 'Makasar': (char) => char >= 0x11EE0 && char <= 0x11EFF, // 'Cuneiform': (char) => char >= 0x12000 && char <= 0x123FF, // 'Cuneiform Numbers and Punctuation': (char) => char >= 0x12400 && char <= 0x1247F, // 'Early Dynastic Cuneiform': (char) => char >= 0x12480 && char <= 0x1254F, // 'Egyptian Hieroglyphs': (char) => char >= 0x13000 && char <= 0x1342F, // 'Anatolian Hieroglyphs': (char) => char >= 0x14400 && char <= 0x1467F, // 'Bamum Supplement': (char) => char >= 0x16800 && char <= 0x16A3F, // 'Mro': (char) => char >= 0x16A40 && char <= 0x16A6F, // 'Bassa Vah': (char) => char >= 0x16AD0 && char <= 0x16AFF, // 'Pahawh Hmong': (char) => char >= 0x16B00 && char <= 0x16B8F, // 'Medefaidrin': (char) => char >= 0x16E40 && char <= 0x16E9F, // 'Miao': (char) => char >= 0x16F00 && char <= 0x16F9F, // 'Ideographic Symbols and Punctuation': (char) => char >= 0x16FE0 && char <= 0x16FFF, // 'Tangut': (char) => char >= 0x17000 && char <= 0x187FF, // 'Tangut Components': (char) => char >= 0x18800 && char <= 0x18AFF, // 'Kana Supplement': (char) => char >= 0x1B000 && char <= 0x1B0FF, // 'Kana Extended-A': (char) => char >= 0x1B100 && char <= 0x1B12F, // 'Nushu': (char) => char >= 0x1B170 && char <= 0x1B2FF, // 'Duployan': (char) => char >= 0x1BC00 && char <= 0x1BC9F, // 'Shorthand Format Controls': (char) => char >= 0x1BCA0 && char <= 0x1BCAF, // 'Byzantine Musical Symbols': (char) => char >= 0x1D000 && char <= 0x1D0FF, // 'Musical Symbols': (char) => char >= 0x1D100 && char <= 0x1D1FF, // 'Ancient Greek Musical Notation': (char) => char >= 0x1D200 && char <= 0x1D24F, // 'Mayan Numerals': (char) => char >= 0x1D2E0 && char <= 0x1D2FF, // 'Tai Xuan Jing Symbols': (char) => char >= 0x1D300 && char <= 0x1D35F, // 'Counting Rod Numerals': (char) => char >= 0x1D360 && char <= 0x1D37F, // 'Mathematical Alphanumeric Symbols': (char) => char >= 0x1D400 && char <= 0x1D7FF, // 'Sutton SignWriting': (char) => char >= 0x1D800 && char <= 0x1DAAF, // 'Glagolitic Supplement': (char) => char >= 0x1E000 && char <= 0x1E02F, // 'Mende Kikakui': (char) => char >= 0x1E800 && char <= 0x1E8DF, // 'Adlam': (char) => char >= 0x1E900 && char <= 0x1E95F, // 'Indic Siyaq Numbers': (char) => char >= 0x1EC70 && char <= 0x1ECBF, // 'Arabic Mathematical Alphabetic Symbols': (char) => char >= 0x1EE00 && char <= 0x1EEFF, // 'Mahjong Tiles': (char) => char >= 0x1F000 && char <= 0x1F02F, // 'Domino Tiles': (char) => char >= 0x1F030 && char <= 0x1F09F, // 'Playing Cards': (char) => char >= 0x1F0A0 && char <= 0x1F0FF, // 'Enclosed Alphanumeric Supplement': (char) => char >= 0x1F100 && char <= 0x1F1FF, // 'Enclosed Ideographic Supplement': (char) => char >= 0x1F200 && char <= 0x1F2FF, // 'Miscellaneous Symbols and Pictographs': (char) => char >= 0x1F300 && char <= 0x1F5FF, // 'Emoticons': (char) => char >= 0x1F600 && char <= 0x1F64F, // 'Ornamental Dingbats': (char) => char >= 0x1F650 && char <= 0x1F67F, // 'Transport and Map Symbols': (char) => char >= 0x1F680 && char <= 0x1F6FF, // 'Alchemical Symbols': (char) => char >= 0x1F700 && char <= 0x1F77F, // 'Geometric Shapes Extended': (char) => char >= 0x1F780 && char <= 0x1F7FF, // 'Supplemental Arrows-C': (char) => char >= 0x1F800 && char <= 0x1F8FF, // 'Supplemental Symbols and Pictographs': (char) => char >= 0x1F900 && char <= 0x1F9FF, // 'Chess Symbols': (char) => char >= 0x1FA00 && char <= 0x1FA6F, // 'CJK Unified Ideographs Extension B': (char) => char >= 0x20000 && char <= 0x2A6DF, // 'CJK Unified Ideographs Extension C': (char) => char >= 0x2A700 && char <= 0x2B73F, // 'CJK Unified Ideographs Extension D': (char) => char >= 0x2B740 && char <= 0x2B81F, // 'CJK Unified Ideographs Extension E': (char) => char >= 0x2B820 && char <= 0x2CEAF, // 'CJK Unified Ideographs Extension F': (char) => char >= 0x2CEB0 && char <= 0x2EBEF, // 'CJK Compatibility Ideographs Supplement': (char) => char >= 0x2F800 && char <= 0x2FA1F, // 'Tags': (char) => char >= 0xE0000 && char <= 0xE007F, // 'Variation Selectors Supplement': (char) => char >= 0xE0100 && char <= 0xE01EF, // 'Supplementary Private Use Area-A': (char) => char >= 0xF0000 && char <= 0xFFFFF, // 'Supplementary Private Use Area-B': (char) => char >= 0x100000 && char <= 0x10FFFF, }; // function allowsIdeographicBreaking(chars ) { for (var i = 0, list = chars; i < list.length; i += 1) { var char = list[i]; if (!charAllowsIdeographicBreaking(char.charCodeAt(0))) { return false; } } return true; } function allowsVerticalWritingMode(chars ) { for (var i = 0, list = chars; i < list.length; i += 1) { var char = list[i]; if (charHasUprightVerticalOrientation(char.charCodeAt(0))) { return true; } } return false; } function allowsLetterSpacing(chars ) { for (var i = 0, list = chars; i < list.length; i += 1) { var char = list[i]; if (!charAllowsLetterSpacing(char.charCodeAt(0))) { return false; } } return true; } function charAllowsLetterSpacing(char ) { if (unicodeBlockLookup['Arabic'](char)) { return false; } if (unicodeBlockLookup['Arabic Supplement'](char)) { return false; } if (unicodeBlockLookup['Arabic Extended-A'](char)) { return false; } if (unicodeBlockLookup['Arabic Presentation Forms-A'](char)) { return false; } if (unicodeBlockLookup['Arabic Presentation Forms-B'](char)) { return false; } return true; } function charAllowsIdeographicBreaking(char ) { // Return early for characters outside all ideographic ranges. if (char < 0x2E80) { return false; } if (unicodeBlockLookup['Bopomofo Extended'](char)) { return true; } if (unicodeBlockLookup['Bopomofo'](char)) { return true; } if (unicodeBlockLookup['CJK Compatibility Forms'](char)) { return true; } if (unicodeBlockLookup['CJK Compatibility Ideographs'](char)) { return true; } if (unicodeBlockLookup['CJK Compatibility'](char)) { return true; } if (unicodeBlockLookup['CJK Radicals Supplement'](char)) { return true; } if (unicodeBlockLookup['CJK Strokes'](char)) { return true; } if (unicodeBlockLookup['CJK Symbols and Punctuation'](char)) { return true; } if (unicodeBlockLookup['CJK Unified Ideographs Extension A'](char)) { return true; } if (unicodeBlockLookup['CJK Unified Ideographs'](char)) { return true; } if (unicodeBlockLookup['Enclosed CJK Letters and Months'](char)) { return true; } if (unicodeBlockLookup['Halfwidth and Fullwidth Forms'](char)) { return true; } if (unicodeBlockLookup['Hiragana'](char)) { return true; } if (unicodeBlockLookup['Ideographic Description Characters'](char)) { return true; } if (unicodeBlockLookup['Kangxi Radicals'](char)) { return true; } if (unicodeBlockLookup['Katakana Phonetic Extensions'](char)) { return true; } if (unicodeBlockLookup['Katakana'](char)) { return true; } if (unicodeBlockLookup['Vertical Forms'](char)) { return true; } if (unicodeBlockLookup['Yi Radicals'](char)) { return true; } if (unicodeBlockLookup['Yi Syllables'](char)) { return true; } return false; } // The following logic comes from // . // The data file denotes with “U” or “Tu” any codepoint that may be drawn // upright in vertical text but does not distinguish between upright and // “neutral” characters. // Blocks in the Unicode supplementary planes are excluded from this module due // to . /** * Returns true if the given Unicode codepoint identifies a character with * upright orientation. * * A character has upright orientation if it is drawn upright (unrotated) * whether the line is oriented horizontally or vertically, even if both * adjacent characters can be rotated. For example, a Chinese character is * always drawn upright. An uprightly oriented character causes an adjacent * “neutral” character to be drawn upright as well. * @private */ function charHasUprightVerticalOrientation(char ) { if (char === 0x02EA /* modifier letter yin departing tone mark */ || char === 0x02EB /* modifier letter yang departing tone mark */) { return true; } // Return early for characters outside all ranges whose characters remain // upright in vertical writing mode. if (char < 0x1100) { return false; } if (unicodeBlockLookup['Bopomofo Extended'](char)) { return true; } if (unicodeBlockLookup['Bopomofo'](char)) { return true; } if (unicodeBlockLookup['CJK Compatibility Forms'](char)) { if (!((char >= 0xFE49 /* dashed overline */ && char <= 0xFE4F) /* wavy low line */)) { return true; } } if (unicodeBlockLookup['CJK Compatibility Ideographs'](char)) { return true; } if (unicodeBlockLookup['CJK Compatibility'](char)) { return true; } if (unicodeBlockLookup['CJK Radicals Supplement'](char)) { return true; } if (unicodeBlockLookup['CJK Strokes'](char)) { return true; } if (unicodeBlockLookup['CJK Symbols and Punctuation'](char)) { if (!((char >= 0x3008 /* left angle bracket */ && char <= 0x3011) /* right black lenticular bracket */) && !((char >= 0x3014 /* left tortoise shell bracket */ && char <= 0x301F) /* low double prime quotation mark */) && char !== 0x3030 /* wavy dash */) { return true; } } if (unicodeBlockLookup['CJK Unified Ideographs Extension A'](char)) { return true; } if (unicodeBlockLookup['CJK Unified Ideographs'](char)) { return true; } if (unicodeBlockLookup['Enclosed CJK Letters and Months'](char)) { return true; } if (unicodeBlockLookup['Hangul Compatibility Jamo'](char)) { return true; } if (unicodeBlockLookup['Hangul Jamo Extended-A'](char)) { return true; } if (unicodeBlockLookup['Hangul Jamo Extended-B'](char)) { return true; } if (unicodeBlockLookup['Hangul Jamo'](char)) { return true; } if (unicodeBlockLookup['Hangul Syllables'](char)) { return true; } if (unicodeBlockLookup['Hiragana'](char)) { return true; } if (unicodeBlockLookup['Ideographic Description Characters'](char)) { return true; } if (unicodeBlockLookup['Kanbun'](char)) { return true; } if (unicodeBlockLookup['Kangxi Radicals'](char)) { return true; } if (unicodeBlockLookup['Katakana Phonetic Extensions'](char)) { return true; } if (unicodeBlockLookup['Katakana'](char)) { if (char !== 0x30FC /* katakana-hiragana prolonged sound mark */) { return true; } } if (unicodeBlockLookup['Halfwidth and Fullwidth Forms'](char)) { if (char !== 0xFF08 /* fullwidth left parenthesis */ && char !== 0xFF09 /* fullwidth right parenthesis */ && char !== 0xFF0D /* fullwidth hyphen-minus */ && !((char >= 0xFF1A /* fullwidth colon */ && char <= 0xFF1E) /* fullwidth greater-than sign */) && char !== 0xFF3B /* fullwidth left square bracket */ && char !== 0xFF3D /* fullwidth right square bracket */ && char !== 0xFF3F /* fullwidth low line */ && !(char >= 0xFF5B /* fullwidth left curly bracket */ && char <= 0xFFDF) && char !== 0xFFE3 /* fullwidth macron */ && !(char >= 0xFFE8 /* halfwidth forms light vertical */ && char <= 0xFFEF)) { return true; } } if (unicodeBlockLookup['Small Form Variants'](char)) { if (!((char >= 0xFE58 /* small em dash */ && char <= 0xFE5E) /* small right tortoise shell bracket */) && !((char >= 0xFE63 /* small hyphen-minus */ && char <= 0xFE66) /* small equals sign */)) { return true; } } if (unicodeBlockLookup['Unified Canadian Aboriginal Syllabics'](char)) { return true; } if (unicodeBlockLookup['Unified Canadian Aboriginal Syllabics Extended'](char)) { return true; } if (unicodeBlockLookup['Vertical Forms'](char)) { return true; } if (unicodeBlockLookup['Yijing Hexagram Symbols'](char)) { return true; } if (unicodeBlockLookup['Yi Syllables'](char)) { return true; } if (unicodeBlockLookup['Yi Radicals'](char)) { return true; } return false; } /** * Returns true if the given Unicode codepoint identifies a character with * neutral orientation. * * A character has neutral orientation if it may be drawn rotated or unrotated * when the line is oriented vertically, depending on the orientation of the * adjacent characters. For example, along a verticlly oriented line, the vulgar * fraction ½ is drawn upright among Chinese characters but rotated among Latin * letters. A neutrally oriented character does not influence whether an * adjacent character is drawn upright or rotated. * @private */ function charHasNeutralVerticalOrientation(char ) { if (unicodeBlockLookup['Latin-1 Supplement'](char)) { if (char === 0x00A7 /* section sign */ || char === 0x00A9 /* copyright sign */ || char === 0x00AE /* registered sign */ || char === 0x00B1 /* plus-minus sign */ || char === 0x00BC /* vulgar fraction one quarter */ || char === 0x00BD /* vulgar fraction one half */ || char === 0x00BE /* vulgar fraction three quarters */ || char === 0x00D7 /* multiplication sign */ || char === 0x00F7 /* division sign */) { return true; } } if (unicodeBlockLookup['General Punctuation'](char)) { if (char === 0x2016 /* double vertical line */ || char === 0x2020 /* dagger */ || char === 0x2021 /* double dagger */ || char === 0x2030 /* per mille sign */ || char === 0x2031 /* per ten thousand sign */ || char === 0x203B /* reference mark */ || char === 0x203C /* double exclamation mark */ || char === 0x2042 /* asterism */ || char === 0x2047 /* double question mark */ || char === 0x2048 /* question exclamation mark */ || char === 0x2049 /* exclamation question mark */ || char === 0x2051 /* two asterisks aligned vertically */) { return true; } } if (unicodeBlockLookup['Letterlike Symbols'](char)) { return true; } if (unicodeBlockLookup['Number Forms'](char)) { return true; } if (unicodeBlockLookup['Miscellaneous Technical'](char)) { if ((char >= 0x2300 /* diameter sign */ && char <= 0x2307 /* wavy line */) || (char >= 0x230C /* bottom right crop */ && char <= 0x231F /* bottom right corner */) || (char >= 0x2324 /* up arrowhead between two horizontal bars */ && char <= 0x2328 /* keyboard */) || char === 0x232B /* erase to the left */ || (char >= 0x237D /* shouldered open box */ && char <= 0x239A /* clear screen symbol */) || (char >= 0x23BE /* dentistry symbol light vertical and top right */ && char <= 0x23CD /* square foot */) || char === 0x23CF /* eject symbol */ || (char >= 0x23D1 /* metrical breve */ && char <= 0x23DB /* fuse */) || (char >= 0x23E2 /* white trapezium */ && char <= 0x23FF)) { return true; } } if (unicodeBlockLookup['Control Pictures'](char) && char !== 0x2423 /* open box */) { return true; } if (unicodeBlockLookup['Optical Character Recognition'](char)) { return true; } if (unicodeBlockLookup['Enclosed Alphanumerics'](char)) { return true; } if (unicodeBlockLookup['Geometric Shapes'](char)) { return true; } if (unicodeBlockLookup['Miscellaneous Symbols'](char)) { if (!((char >= 0x261A /* black left pointing index */ && char <= 0x261F) /* white down pointing index */)) { return true; } } if (unicodeBlockLookup['Miscellaneous Symbols and Arrows'](char)) { if ((char >= 0x2B12 /* square with top half black */ && char <= 0x2B2F /* white vertical ellipse */) || (char >= 0x2B50 /* white medium star */ && char <= 0x2B59 /* heavy circled saltire */) || (char >= 0x2BB8 /* upwards white arrow from bar with horizontal bar */ && char <= 0x2BEB)) { return true; } } if (unicodeBlockLookup['CJK Symbols and Punctuation'](char)) { return true; } if (unicodeBlockLookup['Katakana'](char)) { return true; } if (unicodeBlockLookup['Private Use Area'](char)) { return true; } if (unicodeBlockLookup['CJK Compatibility Forms'](char)) { return true; } if (unicodeBlockLookup['Small Form Variants'](char)) { return true; } if (unicodeBlockLookup['Halfwidth and Fullwidth Forms'](char)) { return true; } if (char === 0x221E /* infinity */ || char === 0x2234 /* therefore */ || char === 0x2235 /* because */ || (char >= 0x2700 /* black safety scissors */ && char <= 0x2767 /* rotated floral heart bullet */) || (char >= 0x2776 /* dingbat negative circled digit one */ && char <= 0x2793 /* dingbat negative circled sans-serif number ten */) || char === 0xFFFC /* object replacement character */ || char === 0xFFFD /* replacement character */) { return true; } return false; } /** * Returns true if the given Unicode codepoint identifies a character with * rotated orientation. * * A character has rotated orientation if it is drawn rotated when the line is * oriented vertically, even if both adjacent characters are upright. For * example, a Latin letter is drawn rotated along a vertical line. A rotated * character causes an adjacent “neutral” character to be drawn rotated as well. * @private */ function charHasRotatedVerticalOrientation(char ) { return !(charHasUprightVerticalOrientation(char) || charHasNeutralVerticalOrientation(char)); } function charInSupportedScript(char , canRenderRTL ) { // This is a rough heuristic: whether we "can render" a script // actually depends on the properties of the font being used // and whether differences from the ideal rendering are considered // semantically significant. // Even in Latin script, we "can't render" combinations such as the fi // ligature, but we don't consider that semantically significant. if (!canRenderRTL && ((char >= 0x0590 && char <= 0x08FF) || unicodeBlockLookup['Arabic Presentation Forms-A'](char) || unicodeBlockLookup['Arabic Presentation Forms-B'](char))) { // Main blocks for Hebrew, Arabic, Thaana and other RTL scripts return false; } if ((char >= 0x0900 && char <= 0x0DFF) || // Main blocks for Indic scripts and Sinhala (char >= 0x0F00 && char <= 0x109F) || // Main blocks for Tibetan and Myanmar unicodeBlockLookup['Khmer'](char)) { // These blocks cover common scripts that require // complex text shaping, based on unicode script metadata: // http://www.unicode.org/repos/cldr/trunk/common/properties/scriptMetadata.txt // where "Web Rank <= 32" "Shaping Required = YES" return false; } return true; } function isStringInSupportedScript(chars , canRenderRTL ) { for (var i = 0, list = chars; i < list.length; i += 1) { var char = list[i]; if (!charInSupportedScript(char.charCodeAt(0), canRenderRTL)) { return false; } } return true; } // var pluginRequested = false; var pluginURL = null; var foregroundLoadComplete = false; var evented = new Evented(); var _completionCallback; var registerForPluginAvailability = function( callback ) { if (pluginURL) { callback({ pluginURL: pluginURL, completionCallback: _completionCallback}); } else { evented.once('pluginAvailable', callback); } return callback; }; var clearRTLTextPlugin = function() { pluginRequested = false; pluginURL = null; }; var setRTLTextPlugin = function(url , callback ) { if (pluginRequested) { throw new Error('setRTLTextPlugin cannot be called multiple times.'); } pluginRequested = true; pluginURL = exported.resolveURL(url); _completionCallback = function (error ) { if (error) { // Clear loaded state to allow retries clearRTLTextPlugin(); if (callback) { callback(error); } } else { // Called once for each worker foregroundLoadComplete = true; } }; evented.fire(new Event('pluginAvailable', { pluginURL: pluginURL, completionCallback: _completionCallback })); }; var plugin = { applyArabicShaping: null, processBidirectionalText: null, processStyledBidirectionalText: null, isLoaded: function isLoaded() { return foregroundLoadComplete || // Foreground: loaded if the completion callback returned successfully plugin.applyArabicShaping != null; // Background: loaded if the plugin functions have been compiled } }; // var EvaluationParameters = function EvaluationParameters(zoom , options ) { this.zoom = zoom; if (options) { this.now = options.now; this.fadeDuration = options.fadeDuration; this.zoomHistory = options.zoomHistory; this.transition = options.transition; } else { this.now = 0; this.fadeDuration = 0; this.zoomHistory = new ZoomHistory(); this.transition = {}; } }; EvaluationParameters.prototype.isSupportedScript = function isSupportedScript (str ) { return isStringInSupportedScript(str, plugin.isLoaded()); }; EvaluationParameters.prototype.crossFadingFactor = function crossFadingFactor () { if (this.fadeDuration === 0) { return 1; } else { return Math.min((this.now - this.zoomHistory.lastIntegerZoomTime) / this.fadeDuration, 1); } }; EvaluationParameters.prototype.getCrossfadeParameters = function getCrossfadeParameters () { var z = this.zoom; var fraction = z - Math.floor(z); var t = this.crossFadingFactor(); return z > this.zoomHistory.lastIntegerZoom ? { fromScale: 2, toScale: 1, t: fraction + (1 - fraction) * t } : { fromScale: 0.5, toScale: 1, t: 1 - (1 - t) * fraction }; }; // /** * Implements a number of classes that define state and behavior for paint and layout properties, most * importantly their respective evaluation chains: * * Transitionable paint property value * → Transitioning paint property value * → Possibly evaluated paint property value * → Fully evaluated paint property value * * Layout property value * → Possibly evaluated layout property value * → Fully evaluated layout property value * * @module * @private */ /** * Implementations of the `Property` interface: * * * Hold metadata about a property that's independent of any specific value: stuff like the type of the value, * the default value, etc. This comes from the style specification JSON. * * Define behavior that needs to be polymorphic across different properties: "possibly evaluating" * an input value (see below), and interpolating between two possibly-evaluted values. * * The type `T` is the fully-evaluated value type (e.g. `number`, `string`, `Color`). * The type `R` is the intermediate "possibly evaluated" value type. See below. * * There are two main implementations of the interface -- one for properties that allow data-driven values, * and one for properties that don't. There are a few "special case" implementations as well: one for properties * which cross-fade between two values rather than interpolating, one for `heatmap-color` and `line-gradient`, * and one for `light-position`. * * @private */ /** * `PropertyValue` represents the value part of a property key-value unit. It's used to represent both * paint and layout property values, and regardless of whether or not their property supports data-driven * expressions. * * `PropertyValue` stores the raw input value as seen in a style or a runtime styling API call, i.e. one of the * following: * * * A constant value of the type appropriate for the property * * A function which produces a value of that type (but functions are quasi-deprecated in favor of expressions) * * An expression which produces a value of that type * * "undefined"/"not present", in which case the property is assumed to take on its default value. * * In addition to storing the original input value, `PropertyValue` also stores a normalized representation, * effectively treating functions as if they are expressions, and constant or default values as if they are * (constant) expressions. * * @private */ var PropertyValue = function PropertyValue(property , value ) { this.property = property; this.value = value; this.expression = normalizePropertyExpression(value === undefined ? property.specification.default : value, property.specification); }; PropertyValue.prototype.isDataDriven = function isDataDriven () { return this.expression.kind === 'source' || this.expression.kind === 'composite'; }; PropertyValue.prototype.possiblyEvaluate = function possiblyEvaluate (parameters ) { return this.property.possiblyEvaluate(this, parameters); }; // ------- Transitionable ------- /** * Paint properties are _transitionable_: they can change in a fluid manner, interpolating or cross-fading between * old and new value. The duration of the transition, and the delay before it begins, is configurable. * * `TransitionablePropertyValue` is a compositional class that stores both the property value and that transition * configuration. * * A `TransitionablePropertyValue` can calculate the next step in the evaluation chain for paint property values: * `TransitioningPropertyValue`. * * @private */ var TransitionablePropertyValue = function TransitionablePropertyValue(property ) { this.property = property; this.value = new PropertyValue(property, undefined); }; TransitionablePropertyValue.prototype.transitioned = function transitioned (parameters , prior ) { return new TransitioningPropertyValue(this.property, this.value, prior, // eslint-disable-line no-use-before-define extend({}, parameters.transition, this.transition), parameters.now); }; TransitionablePropertyValue.prototype.untransitioned = function untransitioned () { return new TransitioningPropertyValue(this.property, this.value, null, {}, 0); // eslint-disable-line no-use-before-define }; /** * A helper type: given an object type `Properties` whose values are each of type `Property`, it calculates * an object type with the same keys and values of type `TransitionablePropertyValue`. * * @private */ /** * `Transitionable` stores a map of all (property name, `TransitionablePropertyValue`) pairs for paint properties of a * given layer type. It can calculate the `TransitioningPropertyValue`s for all of them at once, producing a * `Transitioning` instance for the same set of properties. * * @private */ var Transitionable = function Transitionable(properties ) { this._properties = properties; this._values = (Object.create(properties.defaultTransitionablePropertyValues) ); }; Transitionable.prototype.getValue = function getValue (name ) { return clone(this._values[name].value.value); }; Transitionable.prototype.setValue = function setValue (name , value ) { if (!this._values.hasOwnProperty(name)) { this._values[name] = new TransitionablePropertyValue(this._values[name].property); } // Note that we do not _remove_ an own property in the case where a value is being reset // to the default: the transition might still be non-default. this._values[name].value = new PropertyValue(this._values[name].property, value === null ? undefined : clone(value)); }; Transitionable.prototype.getTransition = function getTransition (name ) { return clone(this._values[name].transition); }; Transitionable.prototype.setTransition = function setTransition (name , value ) { if (!this._values.hasOwnProperty(name)) { this._values[name] = new TransitionablePropertyValue(this._values[name].property); } this._values[name].transition = clone(value) || undefined; }; Transitionable.prototype.serialize = function serialize () { var result = {}; for (var i = 0, list = Object.keys(this._values); i < list.length; i += 1) { var property = list[i]; var value = this.getValue(property); if (value !== undefined) { result[property] = value; } var transition = this.getTransition(property); if (transition !== undefined) { result[(property + "-transition")] = transition; } } return result; }; Transitionable.prototype.transitioned = function transitioned (parameters , prior ) { var result = new Transitioning(this._properties); // eslint-disable-line no-use-before-define for (var i = 0, list = Object.keys(this._values); i < list.length; i += 1) { var property = list[i]; result._values[property] = this._values[property].transitioned(parameters, prior._values[property]); } return result; }; Transitionable.prototype.untransitioned = function untransitioned () { var result = new Transitioning(this._properties); // eslint-disable-line no-use-before-define for (var i = 0, list = Object.keys(this._values); i < list.length; i += 1) { var property = list[i]; result._values[property] = this._values[property].untransitioned(); } return result; }; // ------- Transitioning ------- /** * `TransitioningPropertyValue` implements the first of two intermediate steps in the evaluation chain of a paint * property value. In this step, transitions between old and new values are handled: as long as the transition is in * progress, `TransitioningPropertyValue` maintains a reference to the prior value, and interpolates between it and * the new value based on the current time and the configured transition duration and delay. The product is the next * step in the evaluation chain: the "possibly evaluated" result type `R`. See below for more on this concept. * * @private */ var TransitioningPropertyValue = function TransitioningPropertyValue(property , value , prior , transition , now ) { this.property = property; this.value = value; this.begin = now + transition.delay || 0; this.end = this.begin + transition.duration || 0; if (property.specification.transition && (transition.delay || transition.duration)) { this.prior = prior; } }; TransitioningPropertyValue.prototype.possiblyEvaluate = function possiblyEvaluate (parameters ) { var now = parameters.now || 0; var finalValue = this.value.possiblyEvaluate(parameters); var prior = this.prior; if (!prior) { // No prior value. return finalValue; } else if (now > this.end) { // Transition from prior value is now complete. this.prior = null; return finalValue; } else if (this.value.isDataDriven()) { // Transitions to data-driven properties are not supported. // We snap immediately to the data-driven value so that, when we perform layout, // we see the data-driven function and can use it to populate vertex buffers. this.prior = null; return finalValue; } else if (now < this.begin) { // Transition hasn't started yet. return prior.possiblyEvaluate(parameters); } else { // Interpolate between recursively-calculated prior value and final. var t = (now - this.begin) / (this.end - this.begin); return this.property.interpolate(prior.possiblyEvaluate(parameters), finalValue, easeCubicInOut(t)); } }; /** * A helper type: given an object type `Properties` whose values are each of type `Property`, it calculates * an object type with the same keys and values of type `TransitioningPropertyValue`. * * @private */ /** * `Transitioning` stores a map of all (property name, `TransitioningPropertyValue`) pairs for paint properties of a * given layer type. It can calculate the possibly-evaluated values for all of them at once, producing a * `PossiblyEvaluated` instance for the same set of properties. * * @private */ var Transitioning = function Transitioning(properties ) { this._properties = properties; this._values = (Object.create(properties.defaultTransitioningPropertyValues) ); }; Transitioning.prototype.possiblyEvaluate = function possiblyEvaluate (parameters ) { var result = new PossiblyEvaluated(this._properties); // eslint-disable-line no-use-before-define for (var i = 0, list = Object.keys(this._values); i < list.length; i += 1) { var property = list[i]; result._values[property] = this._values[property].possiblyEvaluate(parameters); } return result; }; Transitioning.prototype.hasTransition = function hasTransition () { for (var i = 0, list = Object.keys(this._values); i < list.length; i += 1) { var property = list[i]; if (this._values[property].prior) { return true; } } return false; }; // ------- Layout ------- /** * A helper type: given an object type `Properties` whose values are each of type `Property`, it calculates * an object type with the same keys and values of type `PropertyValue`. * * @private */ /** * Because layout properties are not transitionable, they have a simpler representation and evaluation chain than * paint properties: `PropertyValue`s are possibly evaluated, producing possibly evaluated values, which are then * fully evaluated. * * `Layout` stores a map of all (property name, `PropertyValue`) pairs for layout properties of a * given layer type. It can calculate the possibly-evaluated values for all of them at once, producing a * `PossiblyEvaluated` instance for the same set of properties. * * @private */ var Layout = function Layout(properties ) { this._properties = properties; this._values = (Object.create(properties.defaultPropertyValues) ); }; Layout.prototype.getValue = function getValue (name ) { return clone(this._values[name].value); }; Layout.prototype.setValue = function setValue (name , value ) { this._values[name] = new PropertyValue(this._values[name].property, value === null ? undefined : clone(value)); }; Layout.prototype.serialize = function serialize () { var result = {}; for (var i = 0, list = Object.keys(this._values); i < list.length; i += 1) { var property = list[i]; var value = this.getValue(property); if (value !== undefined) { result[property] = value; } } return result; }; Layout.prototype.possiblyEvaluate = function possiblyEvaluate (parameters ) { var result = new PossiblyEvaluated(this._properties); // eslint-disable-line no-use-before-define for (var i = 0, list = Object.keys(this._values); i < list.length; i += 1) { var property = list[i]; result._values[property] = this._values[property].possiblyEvaluate(parameters); } return result; }; // ------- PossiblyEvaluated ------- /** * "Possibly evaluated value" is an intermediate stage in the evaluation chain for both paint and layout property * values. The purpose of this stage is to optimize away unnecessary recalculations for data-driven properties. Code * which uses data-driven property values must assume that the value is dependent on feature data, and request that it * be evaluated for each feature. But when that property value is in fact a constant or camera function, the calculation * will not actually depend on the feature, and we can benefit from returning the prior result of having done the * evaluation once, ahead of time, in an intermediate step whose inputs are just the value and "global" parameters * such as current zoom level. * * `PossiblyEvaluatedValue` represents the three possible outcomes of this step: if the input value was a constant or * camera expression, then the "possibly evaluated" result is a constant value. Otherwise, the input value was either * a source or composite expression, and we must defer final evaluation until supplied a feature. We separate * the source and composite cases because they are handled differently when generating GL attributes, buffers, and * uniforms. * * Note that `PossiblyEvaluatedValue` (and `PossiblyEvaluatedPropertyValue`, below) are _not_ used for properties that * do not allow data-driven values. For such properties, we know that the "possibly evaluated" result is always a constant * scalar value. See below. * * @private */ /** * `PossiblyEvaluatedPropertyValue` is used for data-driven paint and layout property values. It holds a * `PossiblyEvaluatedValue` and the `GlobalProperties` that were used to generate it. You're not allowed to supply * a different set of `GlobalProperties` when performing the final evaluation because they would be ignored in the * case where the input value was a constant or camera function. * * @private */ var PossiblyEvaluatedPropertyValue = function PossiblyEvaluatedPropertyValue(property , value , parameters ) { this.property = property; this.value = value; this.parameters = parameters; }; PossiblyEvaluatedPropertyValue.prototype.isConstant = function isConstant () { return this.value.kind === 'constant'; }; PossiblyEvaluatedPropertyValue.prototype.constantOr = function constantOr (value ) { if (this.value.kind === 'constant') { return this.value.value; } else { return value; } }; PossiblyEvaluatedPropertyValue.prototype.evaluate = function evaluate (feature , featureState ) { return this.property.evaluate(this.value, this.parameters, feature, featureState); }; /** * A helper type: given an object type `Properties` whose values are each of type `Property`, it calculates * an object type with the same keys, and values of type `R`. * * For properties that don't allow data-driven values, `R` is a scalar type such as `number`, `string`, or `Color`. * For data-driven properties, it is `PossiblyEvaluatedPropertyValue`. Critically, the type definitions are set up * in a way that allows flow to know which of these two cases applies for any given property name, and if you attempt * to use a `PossiblyEvaluatedPropertyValue` as if it was a scalar, or vice versa, you will get a type error. (However, * there's at least one case in which flow fails to produce a type error that you should be aware of: in a context such * as `layer.paint.get('foo-opacity') === 0`, if `foo-opacity` is data-driven, than the left-hand side is of type * `PossiblyEvaluatedPropertyValue`, but flow will not complain about comparing this to a number using `===`. * See https://github.com/facebook/flow/issues/2359.) * * There's also a third, special case possiblity for `R`: for cross-faded properties, it's `?CrossFaded`. * * @private */ /** * `PossiblyEvaluated` stores a map of all (property name, `R`) pairs for paint or layout properties of a * given layer type. * @private */ var PossiblyEvaluated = function PossiblyEvaluated(properties ) { this._properties = properties; this._values = (Object.create(properties.defaultPossiblyEvaluatedValues) ); }; PossiblyEvaluated.prototype.get = function get (name ) { return this._values[name]; }; /** * An implementation of `Property` for properties that do not permit data-driven (source or composite) expressions. * This restriction allows us to declare statically that the result of possibly evaluating this kind of property * is in fact always the scalar type `T`, and can be used without further evaluating the value on a per-feature basis. * * @private */ var DataConstantProperty = function DataConstantProperty(specification ) { this.specification = specification; }; DataConstantProperty.prototype.possiblyEvaluate = function possiblyEvaluate (value , parameters ) { assert_1(!value.isDataDriven()); return value.expression.evaluate(parameters); }; DataConstantProperty.prototype.interpolate = function interpolate$1 (a , b , t ) { var interp = (interpolate )[this.specification.type]; if (interp) { return interp(a, b, t); } else { return a; } }; /** * An implementation of `Property` for properties that permit data-driven (source or composite) expressions. * The result of possibly evaluating this kind of property is `PossiblyEvaluatedPropertyValue`; obtaining * a scalar value `T` requires further evaluation on a per-feature basis. * * @private */ var DataDrivenProperty = function DataDrivenProperty(specification ) { this.specification = specification; }; DataDrivenProperty.prototype.possiblyEvaluate = function possiblyEvaluate (value , parameters ) { if (value.expression.kind === 'constant' || value.expression.kind === 'camera') { return new PossiblyEvaluatedPropertyValue(this, {kind: 'constant', value: value.expression.evaluate(parameters)}, parameters); } else { return new PossiblyEvaluatedPropertyValue(this, value.expression, parameters); } }; DataDrivenProperty.prototype.interpolate = function interpolate$2 (a , b , t ) { // If either possibly-evaluated value is non-constant, give up: we aren't able to interpolate data-driven values. if (a.value.kind !== 'constant' || b.value.kind !== 'constant') { return a; } // Special case hack solely for fill-outline-color. The undefined value is subsequently handled in // FillStyleLayer#recalculate, which sets fill-outline-color to the fill-color value if the former // is a PossiblyEvaluatedPropertyValue containing a constant undefined value. In addition to the // return value here, the other source of a PossiblyEvaluatedPropertyValue containing a constant // undefined value is the "default value" for fill-outline-color held in // `Properties#defaultPossiblyEvaluatedValues`, which serves as the prototype of // `PossiblyEvaluated#_values`. if (a.value.value === undefined || b.value.value === undefined) { return new PossiblyEvaluatedPropertyValue(this, {kind: 'constant', value: (undefined )}, a.parameters); } var interp = (interpolate )[this.specification.type]; if (interp) { return new PossiblyEvaluatedPropertyValue(this, {kind: 'constant', value: interp(a.value.value, b.value.value, t)}, a.parameters); } else { return a; } }; DataDrivenProperty.prototype.evaluate = function evaluate (value , parameters , feature , featureState ) { if (value.kind === 'constant') { return value.value; } else { return value.evaluate(parameters, feature, featureState); } }; /** * An implementation of `Property` for data driven `line-pattern` which are transitioned by cross-fading * rather than interpolation. * * @private */ var CrossFadedDataDrivenProperty = /*@__PURE__*/(function (DataDrivenProperty) { function CrossFadedDataDrivenProperty () { DataDrivenProperty.apply(this, arguments); } if ( DataDrivenProperty ) CrossFadedDataDrivenProperty.__proto__ = DataDrivenProperty; CrossFadedDataDrivenProperty.prototype = Object.create( DataDrivenProperty && DataDrivenProperty.prototype ); CrossFadedDataDrivenProperty.prototype.constructor = CrossFadedDataDrivenProperty; CrossFadedDataDrivenProperty.prototype.possiblyEvaluate = function possiblyEvaluate (value , parameters ) { if (value.value === undefined) { return new PossiblyEvaluatedPropertyValue(this, {kind: 'constant', value: undefined}, parameters); } else if (value.expression.kind === 'constant') { var constantValue = value.expression.evaluate(parameters); var constant = this._calculate(constantValue, constantValue, constantValue, parameters); return new PossiblyEvaluatedPropertyValue(this, {kind: 'constant', value: constant}, parameters); } else if (value.expression.kind === 'camera') { var cameraVal = this._calculate( value.expression.evaluate({zoom: parameters.zoom - 1.0}), value.expression.evaluate({zoom: parameters.zoom}), value.expression.evaluate({zoom: parameters.zoom + 1.0}), parameters); return new PossiblyEvaluatedPropertyValue(this, {kind: 'constant', value: cameraVal}, parameters); } else { // source or composite expression return new PossiblyEvaluatedPropertyValue(this, value.expression, parameters); } }; CrossFadedDataDrivenProperty.prototype.evaluate = function evaluate (value , globals , feature , featureState ) { if (value.kind === 'source') { var constant = value.evaluate(globals, feature, featureState); return this._calculate(constant, constant, constant, globals); } else if (value.kind === 'composite') { return this._calculate( value.evaluate({zoom: Math.floor(globals.zoom) - 1.0}, feature, featureState), value.evaluate({zoom: Math.floor(globals.zoom)}, feature, featureState), value.evaluate({zoom: Math.floor(globals.zoom) + 1.0}, feature, featureState), globals); } else { return value.value; } }; CrossFadedDataDrivenProperty.prototype._calculate = function _calculate (min , mid , max , parameters ) { var z = parameters.zoom; return z > parameters.zoomHistory.lastIntegerZoom ? { from: min, to: mid } : { from: max, to: mid }; }; CrossFadedDataDrivenProperty.prototype.interpolate = function interpolate (a ) { return a; }; return CrossFadedDataDrivenProperty; }(DataDrivenProperty)); /** * An implementation of `Property` for `*-pattern` and `line-dasharray`, which are transitioned by cross-fading * rather than interpolation. * * @private */ var CrossFadedProperty = function CrossFadedProperty(specification ) { this.specification = specification; }; CrossFadedProperty.prototype.possiblyEvaluate = function possiblyEvaluate (value , parameters ) { if (value.value === undefined) { return undefined; } else if (value.expression.kind === 'constant') { var constant = value.expression.evaluate(parameters); return this._calculate(constant, constant, constant, parameters); } else { assert_1(!value.isDataDriven()); return this._calculate( value.expression.evaluate(new EvaluationParameters(Math.floor(parameters.zoom - 1.0), parameters)), value.expression.evaluate(new EvaluationParameters(Math.floor(parameters.zoom), parameters)), value.expression.evaluate(new EvaluationParameters(Math.floor(parameters.zoom + 1.0), parameters)), parameters); } }; CrossFadedProperty.prototype._calculate = function _calculate (min , mid , max , parameters ) { var z = parameters.zoom; return z > parameters.zoomHistory.lastIntegerZoom ? { from: min, to: mid } : { from: max, to: mid }; }; CrossFadedProperty.prototype.interpolate = function interpolate (a ) { return a; }; /** * An implementation of `Property` for `heatmap-color` and `line-gradient`. Interpolation is a no-op, and * evaluation returns a boolean value in order to indicate its presence, but the real * evaluation happens in StyleLayer classes. * * @private */ var ColorRampProperty = function ColorRampProperty(specification ) { this.specification = specification; }; ColorRampProperty.prototype.possiblyEvaluate = function possiblyEvaluate (value , parameters ) { return !!value.expression.evaluate(parameters); }; ColorRampProperty.prototype.interpolate = function interpolate () { return false; }; /** * `Properties` holds objects containing default values for the layout or paint property set of a given * layer type. These objects are immutable, and they are used as the prototypes for the `_values` members of * `Transitionable`, `Transitioning`, `Layout`, and `PossiblyEvaluated`. This allows these classes to avoid * doing work in the common case where a property has no explicit value set and should be considered to take * on the default value: using `for (const property of Object.keys(this._values))`, they can iterate over * only the _own_ properties of `_values`, skipping repeated calculation of transitions and possible/final * evaluations for defaults, the result of which will always be the same. * * @private */ var Properties = function Properties(properties ) { this.properties = properties; this.defaultPropertyValues = ({} ); this.defaultTransitionablePropertyValues = ({} ); this.defaultTransitioningPropertyValues = ({} ); this.defaultPossiblyEvaluatedValues = ({} ); for (var property in properties) { var prop = properties[property]; var defaultPropertyValue = this.defaultPropertyValues[property] = new PropertyValue(prop, undefined); var defaultTransitionablePropertyValue = this.defaultTransitionablePropertyValues[property] = new TransitionablePropertyValue(prop); this.defaultTransitioningPropertyValues[property] = defaultTransitionablePropertyValue.untransitioned(); this.defaultPossiblyEvaluatedValues[property] = defaultPropertyValue.possiblyEvaluate(({} )); } }; register('DataDrivenProperty', DataDrivenProperty); register('DataConstantProperty', DataConstantProperty); register('CrossFadedDataDrivenProperty', CrossFadedDataDrivenProperty); register('CrossFadedProperty', CrossFadedProperty); register('ColorRampProperty', ColorRampProperty); // var TRANSITION_SUFFIX = '-transition'; var StyleLayer = /*@__PURE__*/(function (Evented) { function StyleLayer(layer , properties ) { Evented.call(this); this.id = layer.id; this.type = layer.type; this._featureFilter = function () { return true; }; if (layer.type === 'custom') { return; } layer = ((layer ) ); this.metadata = layer.metadata; this.minzoom = layer.minzoom; this.maxzoom = layer.maxzoom; if (layer.type !== 'background') { this.source = layer.source; this.sourceLayer = layer['source-layer']; this.filter = layer.filter; } if (properties.layout) { this._unevaluatedLayout = new Layout(properties.layout); } if (properties.paint) { this._transitionablePaint = new Transitionable(properties.paint); for (var property in layer.paint) { this.setPaintProperty(property, layer.paint[property], {validate: false}); } for (var property$1 in layer.layout) { this.setLayoutProperty(property$1, layer.layout[property$1], {validate: false}); } this._transitioningPaint = this._transitionablePaint.untransitioned(); } } if ( Evented ) StyleLayer.__proto__ = Evented; StyleLayer.prototype = Object.create( Evented && Evented.prototype ); StyleLayer.prototype.constructor = StyleLayer; StyleLayer.prototype.getCrossfadeParameters = function getCrossfadeParameters () { return this._crossfadeParameters; }; StyleLayer.prototype.getLayoutProperty = function getLayoutProperty (name ) { if (name === 'visibility') { return this.visibility; } return this._unevaluatedLayout.getValue(name); }; StyleLayer.prototype.setLayoutProperty = function setLayoutProperty (name , value , options) { if ( options === void 0 ) options = {}; if (value !== null && value !== undefined) { var key = "layers." + (this.id) + ".layout." + name; if (this._validate(validateLayoutProperty$1, key, name, value, options)) { return; } } if (name === 'visibility') { this.visibility = value; return; } this._unevaluatedLayout.setValue(name, value); }; StyleLayer.prototype.getPaintProperty = function getPaintProperty (name ) { if (endsWith(name, TRANSITION_SUFFIX)) { return this._transitionablePaint.getTransition(name.slice(0, -TRANSITION_SUFFIX.length)); } else { return this._transitionablePaint.getValue(name); } }; StyleLayer.prototype.setPaintProperty = function setPaintProperty (name , value , options) { if ( options === void 0 ) options = {}; if (value !== null && value !== undefined) { var key = "layers." + (this.id) + ".paint." + name; if (this._validate(validatePaintProperty$1, key, name, value, options)) { return false; } } if (endsWith(name, TRANSITION_SUFFIX)) { this._transitionablePaint.setTransition(name.slice(0, -TRANSITION_SUFFIX.length), (value ) || undefined); return false; } else { // if a cross-faded value is changed, we need to make sure the new icons get added to each tile's iconAtlas // so a call to _updateLayer is necessary, and we return true from this function so it gets called in // Style#setPaintProperty var prop = this._transitionablePaint._values[name]; var newCrossFadedValue = prop.property.specification["property-type"] === 'cross-faded-data-driven' && !prop.value.value && value; var wasDataDriven = this._transitionablePaint._values[name].value.isDataDriven(); this._transitionablePaint.setValue(name, value); var isDataDriven = this._transitionablePaint._values[name].value.isDataDriven(); this._handleSpecialPaintPropertyUpdate(name); return isDataDriven || wasDataDriven || newCrossFadedValue; } }; StyleLayer.prototype._handleSpecialPaintPropertyUpdate = function _handleSpecialPaintPropertyUpdate (_ ) { // No-op; can be overridden by derived classes. }; StyleLayer.prototype.isHidden = function isHidden (zoom ) { if (this.minzoom && zoom < this.minzoom) { return true; } if (this.maxzoom && zoom >= this.maxzoom) { return true; } return this.visibility === 'none'; }; StyleLayer.prototype.updateTransitions = function updateTransitions (parameters ) { this._transitioningPaint = this._transitionablePaint.transitioned(parameters, this._transitioningPaint); }; StyleLayer.prototype.hasTransition = function hasTransition () { return this._transitioningPaint.hasTransition(); }; StyleLayer.prototype.recalculate = function recalculate (parameters ) { if (parameters.getCrossfadeParameters) { this._crossfadeParameters = parameters.getCrossfadeParameters(); } if (this._unevaluatedLayout) { (this ).layout = this._unevaluatedLayout.possiblyEvaluate(parameters); } (this ).paint = this._transitioningPaint.possiblyEvaluate(parameters); }; StyleLayer.prototype.serialize = function serialize () { var output = { 'id': this.id, 'type': this.type, 'source': this.source, 'source-layer': this.sourceLayer, 'metadata': this.metadata, 'minzoom': this.minzoom, 'maxzoom': this.maxzoom, 'filter': this.filter, 'layout': this._unevaluatedLayout && this._unevaluatedLayout.serialize(), 'paint': this._transitionablePaint && this._transitionablePaint.serialize() }; if (this.visibility) { output.layout = output.layout || {}; output.layout.visibility = this.visibility; } return filterObject(output, function (value, key) { return value !== undefined && !(key === 'layout' && !Object.keys(value).length) && !(key === 'paint' && !Object.keys(value).length); }); }; StyleLayer.prototype._validate = function _validate (validate , key , name , value , options) { if ( options === void 0 ) options = {}; if (options && options.validate === false) { return false; } return emitValidationErrors(this, validate.call(validateStyle, { key: key, layerType: this.type, objectKey: name, value: value, styleSpec: spec, // Workaround for https://github.com/mapbox/mapbox-gl-js/issues/2407 style: {glyphs: true, sprite: true} })); }; StyleLayer.prototype.is3D = function is3D () { return false; }; StyleLayer.prototype.isTileClipped = function isTileClipped () { return false; }; StyleLayer.prototype.hasOffscreenPass = function hasOffscreenPass () { return false; }; StyleLayer.prototype.resize = function resize () { // noop }; StyleLayer.prototype.isStateDependent = function isStateDependent () { for (var property in (this ).paint._values) { var value = (this ).paint.get(property); if (!(value instanceof PossiblyEvaluatedPropertyValue) || !supportsPropertyExpression(value.property.specification)) { continue; } if ((value.value.kind === 'source' || value.value.kind === 'composite') && value.value.isStateDependent) { return true; } } return false; }; return StyleLayer; }(Evented)); // var viewTypes = { 'Int8': Int8Array, 'Uint8': Uint8Array, 'Int16': Int16Array, 'Uint16': Uint16Array, 'Int32': Int32Array, 'Uint32': Uint32Array, 'Float32': Float32Array }; /** * @private */ var Struct = function Struct(structArray , index ) { (this )._structArray = structArray; this._pos1 = index * this.size; this._pos2 = this._pos1 / 2; this._pos4 = this._pos1 / 4; this._pos8 = this._pos1 / 8; }; var DEFAULT_CAPACITY = 128; var RESIZE_MULTIPLIER = 5; /** * `StructArray` provides an abstraction over `ArrayBuffer` and `TypedArray` * making it behave like an array of typed structs. * * Conceptually, a StructArray is comprised of elements, i.e., instances of its * associated struct type. Each particular struct type, together with an * alignment size, determines the memory layout of a StructArray whose elements * are of that type. Thus, for each such layout that we need, we have * a corrseponding StructArrayLayout class, inheriting from StructArray and * implementing `emplaceBack()` and `_refreshViews()`. * * In some cases, where we need to access particular elements of a StructArray, * we implement a more specific subclass that inherits from one of the * StructArrayLayouts and adds a `get(i): T` accessor that returns a structured * object whose properties are proxies into the underlying memory space for the * i-th element. This affords the convience of working with (seemingly) plain * Javascript objects without the overhead of serializing/deserializing them * into ArrayBuffers for efficient web worker transfer. * * @private */ var StructArray = function StructArray() { this.isTransferred = false; this.capacity = -1; this.resize(0); }; /** * Serialize a StructArray instance.Serializes both the raw data and the * metadata needed to reconstruct the StructArray base class during * deserialization. */ StructArray.serialize = function serialize (array , transferables ) { assert_1(!array.isTransferred); array._trim(); if (transferables) { array.isTransferred = true; transferables.push(array.arrayBuffer); } return { length: array.length, arrayBuffer: array.arrayBuffer, }; }; StructArray.deserialize = function deserialize (input ) { var structArray = Object.create(this.prototype); structArray.arrayBuffer = input.arrayBuffer; structArray.length = input.length; structArray.capacity = input.arrayBuffer.byteLength / structArray.bytesPerElement; structArray._refreshViews(); return structArray; }; /** * Resize the array to discard unused capacity. */ StructArray.prototype._trim = function _trim () { if (this.length !== this.capacity) { this.capacity = this.length; this.arrayBuffer = this.arrayBuffer.slice(0, this.length * this.bytesPerElement); this._refreshViews(); } }; /** * Resets the the length of the array to 0 without de-allocating capcacity. */ StructArray.prototype.clear = function clear () { this.length = 0; }; /** * Resize the array. * If `n` is greater than the current length then additional elements with undefined values are added. * If `n` is less than the current length then the array will be reduced to the first `n` elements. * @param {number} n The new size of the array. */ StructArray.prototype.resize = function resize (n ) { assert_1(!this.isTransferred); this.reserve(n); this.length = n; }; /** * Indicate a planned increase in size, so that any necessary allocation may * be done once, ahead of time. * @param {number} n The expected size of the array. */ StructArray.prototype.reserve = function reserve (n ) { if (n > this.capacity) { this.capacity = Math.max(n, Math.floor(this.capacity * RESIZE_MULTIPLIER), DEFAULT_CAPACITY); this.arrayBuffer = new ArrayBuffer(this.capacity * this.bytesPerElement); var oldUint8Array = this.uint8; this._refreshViews(); if (oldUint8Array) { this.uint8.set(oldUint8Array); } } }; /** * Create TypedArray views for the current ArrayBuffer. */ StructArray.prototype._refreshViews = function _refreshViews () { throw new Error('_refreshViews() must be implemented by each concrete StructArray layout'); }; /** * Given a list of member fields, create a full StructArrayLayout, in * particular calculating the correct byte offset for each field. This data * is used at build time to generate StructArrayLayout_*#emplaceBack() and * other accessors, and at runtime for binding vertex buffer attributes. * * @private */ function createLayout( members , alignment ) { if ( alignment === void 0 ) alignment = 1; var offset = 0; var maxSize = 0; var layoutMembers = members.map(function (member) { assert_1(member.name.length); var typeSize = sizeOf(member.type); var memberOffset = offset = align(offset, Math.max(alignment, typeSize)); var components = member.components || 1; maxSize = Math.max(maxSize, typeSize); offset += typeSize * components; return { name: member.name, type: member.type, components: components, offset: memberOffset, }; }); var size = align(offset, Math.max(maxSize, alignment)); return { members: layoutMembers, size: size, alignment: alignment }; } function sizeOf(type ) { return viewTypes[type].BYTES_PER_ELEMENT; } function align(offset , size ) { return Math.ceil(offset / size) * size; } // This file is generated. Edit build/generate-struct-arrays.js, then run `yarn run codegen`. /** * Implementation of the StructArray layout: * [0]: Int16[2] * * @private */ var StructArrayLayout2i4 = /*@__PURE__*/(function (StructArray) { function StructArrayLayout2i4 () { StructArray.apply(this, arguments); } if ( StructArray ) StructArrayLayout2i4.__proto__ = StructArray; StructArrayLayout2i4.prototype = Object.create( StructArray && StructArray.prototype ); StructArrayLayout2i4.prototype.constructor = StructArrayLayout2i4; StructArrayLayout2i4.prototype._refreshViews = function _refreshViews () { this.uint8 = new Uint8Array(this.arrayBuffer); this.int16 = new Int16Array(this.arrayBuffer); }; StructArrayLayout2i4.prototype.emplaceBack = function emplaceBack (v0 , v1 ) { var i = this.length; this.resize(i + 1); return this.emplace(i, v0, v1); }; StructArrayLayout2i4.prototype.emplace = function emplace (i , v0 , v1 ) { var o2 = i * 2; this.int16[o2 + 0] = v0; this.int16[o2 + 1] = v1; return i; }; return StructArrayLayout2i4; }(StructArray)); StructArrayLayout2i4.prototype.bytesPerElement = 4; register('StructArrayLayout2i4', StructArrayLayout2i4); /** * Implementation of the StructArray layout: * [0]: Int16[4] * * @private */ var StructArrayLayout4i8 = /*@__PURE__*/(function (StructArray) { function StructArrayLayout4i8 () { StructArray.apply(this, arguments); } if ( StructArray ) StructArrayLayout4i8.__proto__ = StructArray; StructArrayLayout4i8.prototype = Object.create( StructArray && StructArray.prototype ); StructArrayLayout4i8.prototype.constructor = StructArrayLayout4i8; StructArrayLayout4i8.prototype._refreshViews = function _refreshViews () { this.uint8 = new Uint8Array(this.arrayBuffer); this.int16 = new Int16Array(this.arrayBuffer); }; StructArrayLayout4i8.prototype.emplaceBack = function emplaceBack (v0 , v1 , v2 , v3 ) { var i = this.length; this.resize(i + 1); return this.emplace(i, v0, v1, v2, v3); }; StructArrayLayout4i8.prototype.emplace = function emplace (i , v0 , v1 , v2 , v3 ) { var o2 = i * 4; this.int16[o2 + 0] = v0; this.int16[o2 + 1] = v1; this.int16[o2 + 2] = v2; this.int16[o2 + 3] = v3; return i; }; return StructArrayLayout4i8; }(StructArray)); StructArrayLayout4i8.prototype.bytesPerElement = 8; register('StructArrayLayout4i8', StructArrayLayout4i8); /** * Implementation of the StructArray layout: * [0]: Int16[2] * [4]: Int16[4] * * @private */ var StructArrayLayout2i4i12 = /*@__PURE__*/(function (StructArray) { function StructArrayLayout2i4i12 () { StructArray.apply(this, arguments); } if ( StructArray ) StructArrayLayout2i4i12.__proto__ = StructArray; StructArrayLayout2i4i12.prototype = Object.create( StructArray && StructArray.prototype ); StructArrayLayout2i4i12.prototype.constructor = StructArrayLayout2i4i12; StructArrayLayout2i4i12.prototype._refreshViews = function _refreshViews () { this.uint8 = new Uint8Array(this.arrayBuffer); this.int16 = new Int16Array(this.arrayBuffer); }; StructArrayLayout2i4i12.prototype.emplaceBack = function emplaceBack (v0 , v1 , v2 , v3 , v4 , v5 ) { var i = this.length; this.resize(i + 1); return this.emplace(i, v0, v1, v2, v3, v4, v5); }; StructArrayLayout2i4i12.prototype.emplace = function emplace (i , v0 , v1 , v2 , v3 , v4 , v5 ) { var o2 = i * 6; this.int16[o2 + 0] = v0; this.int16[o2 + 1] = v1; this.int16[o2 + 2] = v2; this.int16[o2 + 3] = v3; this.int16[o2 + 4] = v4; this.int16[o2 + 5] = v5; return i; }; return StructArrayLayout2i4i12; }(StructArray)); StructArrayLayout2i4i12.prototype.bytesPerElement = 12; register('StructArrayLayout2i4i12', StructArrayLayout2i4i12); /** * Implementation of the StructArray layout: * [0]: Int16[4] * [8]: Uint8[4] * * @private */ var StructArrayLayout4i4ub12 = /*@__PURE__*/(function (StructArray) { function StructArrayLayout4i4ub12 () { StructArray.apply(this, arguments); } if ( StructArray ) StructArrayLayout4i4ub12.__proto__ = StructArray; StructArrayLayout4i4ub12.prototype = Object.create( StructArray && StructArray.prototype ); StructArrayLayout4i4ub12.prototype.constructor = StructArrayLayout4i4ub12; StructArrayLayout4i4ub12.prototype._refreshViews = function _refreshViews () { this.uint8 = new Uint8Array(this.arrayBuffer); this.int16 = new Int16Array(this.arrayBuffer); }; StructArrayLayout4i4ub12.prototype.emplaceBack = function emplaceBack (v0 , v1 , v2 , v3 , v4 , v5 , v6 , v7 ) { var i = this.length; this.resize(i + 1); return this.emplace(i, v0, v1, v2, v3, v4, v5, v6, v7); }; StructArrayLayout4i4ub12.prototype.emplace = function emplace (i , v0 , v1 , v2 , v3 , v4 , v5 , v6 , v7 ) { var o2 = i * 6; var o1 = i * 12; this.int16[o2 + 0] = v0; this.int16[o2 + 1] = v1; this.int16[o2 + 2] = v2; this.int16[o2 + 3] = v3; this.uint8[o1 + 8] = v4; this.uint8[o1 + 9] = v5; this.uint8[o1 + 10] = v6; this.uint8[o1 + 11] = v7; return i; }; return StructArrayLayout4i4ub12; }(StructArray)); StructArrayLayout4i4ub12.prototype.bytesPerElement = 12; register('StructArrayLayout4i4ub12', StructArrayLayout4i4ub12); /** * Implementation of the StructArray layout: * [0]: Uint16[8] * * @private */ var StructArrayLayout8ui16 = /*@__PURE__*/(function (StructArray) { function StructArrayLayout8ui16 () { StructArray.apply(this, arguments); } if ( StructArray ) StructArrayLayout8ui16.__proto__ = StructArray; StructArrayLayout8ui16.prototype = Object.create( StructArray && StructArray.prototype ); StructArrayLayout8ui16.prototype.constructor = StructArrayLayout8ui16; StructArrayLayout8ui16.prototype._refreshViews = function _refreshViews () { this.uint8 = new Uint8Array(this.arrayBuffer); this.uint16 = new Uint16Array(this.arrayBuffer); }; StructArrayLayout8ui16.prototype.emplaceBack = function emplaceBack (v0 , v1 , v2 , v3 , v4 , v5 , v6 , v7 ) { var i = this.length; this.resize(i + 1); return this.emplace(i, v0, v1, v2, v3, v4, v5, v6, v7); }; StructArrayLayout8ui16.prototype.emplace = function emplace (i , v0 , v1 , v2 , v3 , v4 , v5 , v6 , v7 ) { var o2 = i * 8; this.uint16[o2 + 0] = v0; this.uint16[o2 + 1] = v1; this.uint16[o2 + 2] = v2; this.uint16[o2 + 3] = v3; this.uint16[o2 + 4] = v4; this.uint16[o2 + 5] = v5; this.uint16[o2 + 6] = v6; this.uint16[o2 + 7] = v7; return i; }; return StructArrayLayout8ui16; }(StructArray)); StructArrayLayout8ui16.prototype.bytesPerElement = 16; register('StructArrayLayout8ui16', StructArrayLayout8ui16); /** * Implementation of the StructArray layout: * [0]: Int16[4] * [8]: Uint16[4] * * @private */ var StructArrayLayout4i4ui16 = /*@__PURE__*/(function (StructArray) { function StructArrayLayout4i4ui16 () { StructArray.apply(this, arguments); } if ( StructArray ) StructArrayLayout4i4ui16.__proto__ = StructArray; StructArrayLayout4i4ui16.prototype = Object.create( StructArray && StructArray.prototype ); StructArrayLayout4i4ui16.prototype.constructor = StructArrayLayout4i4ui16; StructArrayLayout4i4ui16.prototype._refreshViews = function _refreshViews () { this.uint8 = new Uint8Array(this.arrayBuffer); this.int16 = new Int16Array(this.arrayBuffer); this.uint16 = new Uint16Array(this.arrayBuffer); }; StructArrayLayout4i4ui16.prototype.emplaceBack = function emplaceBack (v0 , v1 , v2 , v3 , v4 , v5 , v6 , v7 ) { var i = this.length; this.resize(i + 1); return this.emplace(i, v0, v1, v2, v3, v4, v5, v6, v7); }; StructArrayLayout4i4ui16.prototype.emplace = function emplace (i , v0 , v1 , v2 , v3 , v4 , v5 , v6 , v7 ) { var o2 = i * 8; this.int16[o2 + 0] = v0; this.int16[o2 + 1] = v1; this.int16[o2 + 2] = v2; this.int16[o2 + 3] = v3; this.uint16[o2 + 4] = v4; this.uint16[o2 + 5] = v5; this.uint16[o2 + 6] = v6; this.uint16[o2 + 7] = v7; return i; }; return StructArrayLayout4i4ui16; }(StructArray)); StructArrayLayout4i4ui16.prototype.bytesPerElement = 16; register('StructArrayLayout4i4ui16', StructArrayLayout4i4ui16); /** * Implementation of the StructArray layout: * [0]: Float32[3] * * @private */ var StructArrayLayout3f12 = /*@__PURE__*/(function (StructArray) { function StructArrayLayout3f12 () { StructArray.apply(this, arguments); } if ( StructArray ) StructArrayLayout3f12.__proto__ = StructArray; StructArrayLayout3f12.prototype = Object.create( StructArray && StructArray.prototype ); StructArrayLayout3f12.prototype.constructor = StructArrayLayout3f12; StructArrayLayout3f12.prototype._refreshViews = function _refreshViews () { this.uint8 = new Uint8Array(this.arrayBuffer); this.float32 = new Float32Array(this.arrayBuffer); }; StructArrayLayout3f12.prototype.emplaceBack = function emplaceBack (v0 , v1 , v2 ) { var i = this.length; this.resize(i + 1); return this.emplace(i, v0, v1, v2); }; StructArrayLayout3f12.prototype.emplace = function emplace (i , v0 , v1 , v2 ) { var o4 = i * 3; this.float32[o4 + 0] = v0; this.float32[o4 + 1] = v1; this.float32[o4 + 2] = v2; return i; }; return StructArrayLayout3f12; }(StructArray)); StructArrayLayout3f12.prototype.bytesPerElement = 12; register('StructArrayLayout3f12', StructArrayLayout3f12); /** * Implementation of the StructArray layout: * [0]: Uint32[1] * * @private */ var StructArrayLayout1ul4 = /*@__PURE__*/(function (StructArray) { function StructArrayLayout1ul4 () { StructArray.apply(this, arguments); } if ( StructArray ) StructArrayLayout1ul4.__proto__ = StructArray; StructArrayLayout1ul4.prototype = Object.create( StructArray && StructArray.prototype ); StructArrayLayout1ul4.prototype.constructor = StructArrayLayout1ul4; StructArrayLayout1ul4.prototype._refreshViews = function _refreshViews () { this.uint8 = new Uint8Array(this.arrayBuffer); this.uint32 = new Uint32Array(this.arrayBuffer); }; StructArrayLayout1ul4.prototype.emplaceBack = function emplaceBack (v0 ) { var i = this.length; this.resize(i + 1); return this.emplace(i, v0); }; StructArrayLayout1ul4.prototype.emplace = function emplace (i , v0 ) { var o4 = i * 1; this.uint32[o4 + 0] = v0; return i; }; return StructArrayLayout1ul4; }(StructArray)); StructArrayLayout1ul4.prototype.bytesPerElement = 4; register('StructArrayLayout1ul4', StructArrayLayout1ul4); /** * Implementation of the StructArray layout: * [0]: Int16[6] * [12]: Uint32[1] * [16]: Uint16[2] * [20]: Int16[2] * * @private */ var StructArrayLayout6i1ul2ui2i24 = /*@__PURE__*/(function (StructArray) { function StructArrayLayout6i1ul2ui2i24 () { StructArray.apply(this, arguments); } if ( StructArray ) StructArrayLayout6i1ul2ui2i24.__proto__ = StructArray; StructArrayLayout6i1ul2ui2i24.prototype = Object.create( StructArray && StructArray.prototype ); StructArrayLayout6i1ul2ui2i24.prototype.constructor = StructArrayLayout6i1ul2ui2i24; StructArrayLayout6i1ul2ui2i24.prototype._refreshViews = function _refreshViews () { this.uint8 = new Uint8Array(this.arrayBuffer); this.int16 = new Int16Array(this.arrayBuffer); this.uint32 = new Uint32Array(this.arrayBuffer); this.uint16 = new Uint16Array(this.arrayBuffer); }; StructArrayLayout6i1ul2ui2i24.prototype.emplaceBack = function emplaceBack (v0 , v1 , v2 , v3 , v4 , v5 , v6 , v7 , v8 , v9 , v10 ) { var i = this.length; this.resize(i + 1); return this.emplace(i, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10); }; StructArrayLayout6i1ul2ui2i24.prototype.emplace = function emplace (i , v0 , v1 , v2 , v3 , v4 , v5 , v6 , v7 , v8 , v9 , v10 ) { var o2 = i * 12; var o4 = i * 6; this.int16[o2 + 0] = v0; this.int16[o2 + 1] = v1; this.int16[o2 + 2] = v2; this.int16[o2 + 3] = v3; this.int16[o2 + 4] = v4; this.int16[o2 + 5] = v5; this.uint32[o4 + 3] = v6; this.uint16[o2 + 8] = v7; this.uint16[o2 + 9] = v8; this.int16[o2 + 10] = v9; this.int16[o2 + 11] = v10; return i; }; return StructArrayLayout6i1ul2ui2i24; }(StructArray)); StructArrayLayout6i1ul2ui2i24.prototype.bytesPerElement = 24; register('StructArrayLayout6i1ul2ui2i24', StructArrayLayout6i1ul2ui2i24); /** * Implementation of the StructArray layout: * [0]: Int16[2] * [4]: Int16[2] * [8]: Int16[2] * * @private */ var StructArrayLayout2i2i2i12 = /*@__PURE__*/(function (StructArray) { function StructArrayLayout2i2i2i12 () { StructArray.apply(this, arguments); } if ( StructArray ) StructArrayLayout2i2i2i12.__proto__ = StructArray; StructArrayLayout2i2i2i12.prototype = Object.create( StructArray && StructArray.prototype ); StructArrayLayout2i2i2i12.prototype.constructor = StructArrayLayout2i2i2i12; StructArrayLayout2i2i2i12.prototype._refreshViews = function _refreshViews () { this.uint8 = new Uint8Array(this.arrayBuffer); this.int16 = new Int16Array(this.arrayBuffer); }; StructArrayLayout2i2i2i12.prototype.emplaceBack = function emplaceBack (v0 , v1 , v2 , v3 , v4 , v5 ) { var i = this.length; this.resize(i + 1); return this.emplace(i, v0, v1, v2, v3, v4, v5); }; StructArrayLayout2i2i2i12.prototype.emplace = function emplace (i , v0 , v1 , v2 , v3 , v4 , v5 ) { var o2 = i * 6; this.int16[o2 + 0] = v0; this.int16[o2 + 1] = v1; this.int16[o2 + 2] = v2; this.int16[o2 + 3] = v3; this.int16[o2 + 4] = v4; this.int16[o2 + 5] = v5; return i; }; return StructArrayLayout2i2i2i12; }(StructArray)); StructArrayLayout2i2i2i12.prototype.bytesPerElement = 12; register('StructArrayLayout2i2i2i12', StructArrayLayout2i2i2i12); /** * Implementation of the StructArray layout: * [0]: Uint8[2] * [4]: Float32[2] * * @private */ var StructArrayLayout2ub2f12 = /*@__PURE__*/(function (StructArray) { function StructArrayLayout2ub2f12 () { StructArray.apply(this, arguments); } if ( StructArray ) StructArrayLayout2ub2f12.__proto__ = StructArray; StructArrayLayout2ub2f12.prototype = Object.create( StructArray && StructArray.prototype ); StructArrayLayout2ub2f12.prototype.constructor = StructArrayLayout2ub2f12; StructArrayLayout2ub2f12.prototype._refreshViews = function _refreshViews () { this.uint8 = new Uint8Array(this.arrayBuffer); this.float32 = new Float32Array(this.arrayBuffer); }; StructArrayLayout2ub2f12.prototype.emplaceBack = function emplaceBack (v0 , v1 , v2 , v3 ) { var i = this.length; this.resize(i + 1); return this.emplace(i, v0, v1, v2, v3); }; StructArrayLayout2ub2f12.prototype.emplace = function emplace (i , v0 , v1 , v2 , v3 ) { var o1 = i * 12; var o4 = i * 3; this.uint8[o1 + 0] = v0; this.uint8[o1 + 1] = v1; this.float32[o4 + 1] = v2; this.float32[o4 + 2] = v3; return i; }; return StructArrayLayout2ub2f12; }(StructArray)); StructArrayLayout2ub2f12.prototype.bytesPerElement = 12; register('StructArrayLayout2ub2f12', StructArrayLayout2ub2f12); /** * Implementation of the StructArray layout: * [0]: Int16[2] * [4]: Uint16[2] * [8]: Uint32[3] * [20]: Uint16[3] * [28]: Float32[2] * [36]: Uint8[2] * [40]: Uint32[1] * * @private */ var StructArrayLayout2i2ui3ul3ui2f2ub1ul44 = /*@__PURE__*/(function (StructArray) { function StructArrayLayout2i2ui3ul3ui2f2ub1ul44 () { StructArray.apply(this, arguments); } if ( StructArray ) StructArrayLayout2i2ui3ul3ui2f2ub1ul44.__proto__ = StructArray; StructArrayLayout2i2ui3ul3ui2f2ub1ul44.prototype = Object.create( StructArray && StructArray.prototype ); StructArrayLayout2i2ui3ul3ui2f2ub1ul44.prototype.constructor = StructArrayLayout2i2ui3ul3ui2f2ub1ul44; StructArrayLayout2i2ui3ul3ui2f2ub1ul44.prototype._refreshViews = function _refreshViews () { this.uint8 = new Uint8Array(this.arrayBuffer); this.int16 = new Int16Array(this.arrayBuffer); this.uint16 = new Uint16Array(this.arrayBuffer); this.uint32 = new Uint32Array(this.arrayBuffer); this.float32 = new Float32Array(this.arrayBuffer); }; StructArrayLayout2i2ui3ul3ui2f2ub1ul44.prototype.emplaceBack = function emplaceBack (v0 , v1 , v2 , v3 , v4 , v5 , v6 , v7 , v8 , v9 , v10 , v11 , v12 , v13 , v14 ) { var i = this.length; this.resize(i + 1); return this.emplace(i, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14); }; StructArrayLayout2i2ui3ul3ui2f2ub1ul44.prototype.emplace = function emplace (i , v0 , v1 , v2 , v3 , v4 , v5 , v6 , v7 , v8 , v9 , v10 , v11 , v12 , v13 , v14 ) { var o2 = i * 22; var o4 = i * 11; var o1 = i * 44; this.int16[o2 + 0] = v0; this.int16[o2 + 1] = v1; this.uint16[o2 + 2] = v2; this.uint16[o2 + 3] = v3; this.uint32[o4 + 2] = v4; this.uint32[o4 + 3] = v5; this.uint32[o4 + 4] = v6; this.uint16[o2 + 10] = v7; this.uint16[o2 + 11] = v8; this.uint16[o2 + 12] = v9; this.float32[o4 + 7] = v10; this.float32[o4 + 8] = v11; this.uint8[o1 + 36] = v12; this.uint8[o1 + 37] = v13; this.uint32[o4 + 10] = v14; return i; }; return StructArrayLayout2i2ui3ul3ui2f2ub1ul44; }(StructArray)); StructArrayLayout2i2ui3ul3ui2f2ub1ul44.prototype.bytesPerElement = 44; register('StructArrayLayout2i2ui3ul3ui2f2ub1ul44', StructArrayLayout2i2ui3ul3ui2f2ub1ul44); /** * Implementation of the StructArray layout: * [0]: Int16[6] * [12]: Uint16[9] * [32]: Uint32[1] * [36]: Float32[2] * * @private */ var StructArrayLayout6i9ui1ul2f44 = /*@__PURE__*/(function (StructArray) { function StructArrayLayout6i9ui1ul2f44 () { StructArray.apply(this, arguments); } if ( StructArray ) StructArrayLayout6i9ui1ul2f44.__proto__ = StructArray; StructArrayLayout6i9ui1ul2f44.prototype = Object.create( StructArray && StructArray.prototype ); StructArrayLayout6i9ui1ul2f44.prototype.constructor = StructArrayLayout6i9ui1ul2f44; StructArrayLayout6i9ui1ul2f44.prototype._refreshViews = function _refreshViews () { this.uint8 = new Uint8Array(this.arrayBuffer); this.int16 = new Int16Array(this.arrayBuffer); this.uint16 = new Uint16Array(this.arrayBuffer); this.uint32 = new Uint32Array(this.arrayBuffer); this.float32 = new Float32Array(this.arrayBuffer); }; StructArrayLayout6i9ui1ul2f44.prototype.emplaceBack = function emplaceBack (v0 , v1 , v2 , v3 , v4 , v5 , v6 , v7 , v8 , v9 , v10 , v11 , v12 , v13 , v14 , v15 , v16 , v17 ) { var i = this.length; this.resize(i + 1); return this.emplace(i, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17); }; StructArrayLayout6i9ui1ul2f44.prototype.emplace = function emplace (i , v0 , v1 , v2 , v3 , v4 , v5 , v6 , v7 , v8 , v9 , v10 , v11 , v12 , v13 , v14 , v15 , v16 , v17 ) { var o2 = i * 22; var o4 = i * 11; this.int16[o2 + 0] = v0; this.int16[o2 + 1] = v1; this.int16[o2 + 2] = v2; this.int16[o2 + 3] = v3; this.int16[o2 + 4] = v4; this.int16[o2 + 5] = v5; this.uint16[o2 + 6] = v6; this.uint16[o2 + 7] = v7; this.uint16[o2 + 8] = v8; this.uint16[o2 + 9] = v9; this.uint16[o2 + 10] = v10; this.uint16[o2 + 11] = v11; this.uint16[o2 + 12] = v12; this.uint16[o2 + 13] = v13; this.uint16[o2 + 14] = v14; this.uint32[o4 + 8] = v15; this.float32[o4 + 9] = v16; this.float32[o4 + 10] = v17; return i; }; return StructArrayLayout6i9ui1ul2f44; }(StructArray)); StructArrayLayout6i9ui1ul2f44.prototype.bytesPerElement = 44; register('StructArrayLayout6i9ui1ul2f44', StructArrayLayout6i9ui1ul2f44); /** * Implementation of the StructArray layout: * [0]: Float32[1] * * @private */ var StructArrayLayout1f4 = /*@__PURE__*/(function (StructArray) { function StructArrayLayout1f4 () { StructArray.apply(this, arguments); } if ( StructArray ) StructArrayLayout1f4.__proto__ = StructArray; StructArrayLayout1f4.prototype = Object.create( StructArray && StructArray.prototype ); StructArrayLayout1f4.prototype.constructor = StructArrayLayout1f4; StructArrayLayout1f4.prototype._refreshViews = function _refreshViews () { this.uint8 = new Uint8Array(this.arrayBuffer); this.float32 = new Float32Array(this.arrayBuffer); }; StructArrayLayout1f4.prototype.emplaceBack = function emplaceBack (v0 ) { var i = this.length; this.resize(i + 1); return this.emplace(i, v0); }; StructArrayLayout1f4.prototype.emplace = function emplace (i , v0 ) { var o4 = i * 1; this.float32[o4 + 0] = v0; return i; }; return StructArrayLayout1f4; }(StructArray)); StructArrayLayout1f4.prototype.bytesPerElement = 4; register('StructArrayLayout1f4', StructArrayLayout1f4); /** * Implementation of the StructArray layout: * [0]: Int16[3] * * @private */ var StructArrayLayout3i6 = /*@__PURE__*/(function (StructArray) { function StructArrayLayout3i6 () { StructArray.apply(this, arguments); } if ( StructArray ) StructArrayLayout3i6.__proto__ = StructArray; StructArrayLayout3i6.prototype = Object.create( StructArray && StructArray.prototype ); StructArrayLayout3i6.prototype.constructor = StructArrayLayout3i6; StructArrayLayout3i6.prototype._refreshViews = function _refreshViews () { this.uint8 = new Uint8Array(this.arrayBuffer); this.int16 = new Int16Array(this.arrayBuffer); }; StructArrayLayout3i6.prototype.emplaceBack = function emplaceBack (v0 , v1 , v2 ) { var i = this.length; this.resize(i + 1); return this.emplace(i, v0, v1, v2); }; StructArrayLayout3i6.prototype.emplace = function emplace (i , v0 , v1 , v2 ) { var o2 = i * 3; this.int16[o2 + 0] = v0; this.int16[o2 + 1] = v1; this.int16[o2 + 2] = v2; return i; }; return StructArrayLayout3i6; }(StructArray)); StructArrayLayout3i6.prototype.bytesPerElement = 6; register('StructArrayLayout3i6', StructArrayLayout3i6); /** * Implementation of the StructArray layout: * [0]: Uint32[1] * [4]: Uint16[2] * * @private */ var StructArrayLayout1ul2ui8 = /*@__PURE__*/(function (StructArray) { function StructArrayLayout1ul2ui8 () { StructArray.apply(this, arguments); } if ( StructArray ) StructArrayLayout1ul2ui8.__proto__ = StructArray; StructArrayLayout1ul2ui8.prototype = Object.create( StructArray && StructArray.prototype ); StructArrayLayout1ul2ui8.prototype.constructor = StructArrayLayout1ul2ui8; StructArrayLayout1ul2ui8.prototype._refreshViews = function _refreshViews () { this.uint8 = new Uint8Array(this.arrayBuffer); this.uint32 = new Uint32Array(this.arrayBuffer); this.uint16 = new Uint16Array(this.arrayBuffer); }; StructArrayLayout1ul2ui8.prototype.emplaceBack = function emplaceBack (v0 , v1 , v2 ) { var i = this.length; this.resize(i + 1); return this.emplace(i, v0, v1, v2); }; StructArrayLayout1ul2ui8.prototype.emplace = function emplace (i , v0 , v1 , v2 ) { var o4 = i * 2; var o2 = i * 4; this.uint32[o4 + 0] = v0; this.uint16[o2 + 2] = v1; this.uint16[o2 + 3] = v2; return i; }; return StructArrayLayout1ul2ui8; }(StructArray)); StructArrayLayout1ul2ui8.prototype.bytesPerElement = 8; register('StructArrayLayout1ul2ui8', StructArrayLayout1ul2ui8); /** * Implementation of the StructArray layout: * [0]: Uint16[3] * * @private */ var StructArrayLayout3ui6 = /*@__PURE__*/(function (StructArray) { function StructArrayLayout3ui6 () { StructArray.apply(this, arguments); } if ( StructArray ) StructArrayLayout3ui6.__proto__ = StructArray; StructArrayLayout3ui6.prototype = Object.create( StructArray && StructArray.prototype ); StructArrayLayout3ui6.prototype.constructor = StructArrayLayout3ui6; StructArrayLayout3ui6.prototype._refreshViews = function _refreshViews () { this.uint8 = new Uint8Array(this.arrayBuffer); this.uint16 = new Uint16Array(this.arrayBuffer); }; StructArrayLayout3ui6.prototype.emplaceBack = function emplaceBack (v0 , v1 , v2 ) { var i = this.length; this.resize(i + 1); return this.emplace(i, v0, v1, v2); }; StructArrayLayout3ui6.prototype.emplace = function emplace (i , v0 , v1 , v2 ) { var o2 = i * 3; this.uint16[o2 + 0] = v0; this.uint16[o2 + 1] = v1; this.uint16[o2 + 2] = v2; return i; }; return StructArrayLayout3ui6; }(StructArray)); StructArrayLayout3ui6.prototype.bytesPerElement = 6; register('StructArrayLayout3ui6', StructArrayLayout3ui6); /** * Implementation of the StructArray layout: * [0]: Uint16[2] * * @private */ var StructArrayLayout2ui4 = /*@__PURE__*/(function (StructArray) { function StructArrayLayout2ui4 () { StructArray.apply(this, arguments); } if ( StructArray ) StructArrayLayout2ui4.__proto__ = StructArray; StructArrayLayout2ui4.prototype = Object.create( StructArray && StructArray.prototype ); StructArrayLayout2ui4.prototype.constructor = StructArrayLayout2ui4; StructArrayLayout2ui4.prototype._refreshViews = function _refreshViews () { this.uint8 = new Uint8Array(this.arrayBuffer); this.uint16 = new Uint16Array(this.arrayBuffer); }; StructArrayLayout2ui4.prototype.emplaceBack = function emplaceBack (v0 , v1 ) { var i = this.length; this.resize(i + 1); return this.emplace(i, v0, v1); }; StructArrayLayout2ui4.prototype.emplace = function emplace (i , v0 , v1 ) { var o2 = i * 2; this.uint16[o2 + 0] = v0; this.uint16[o2 + 1] = v1; return i; }; return StructArrayLayout2ui4; }(StructArray)); StructArrayLayout2ui4.prototype.bytesPerElement = 4; register('StructArrayLayout2ui4', StructArrayLayout2ui4); /** * Implementation of the StructArray layout: * [0]: Uint16[1] * * @private */ var StructArrayLayout1ui2 = /*@__PURE__*/(function (StructArray) { function StructArrayLayout1ui2 () { StructArray.apply(this, arguments); } if ( StructArray ) StructArrayLayout1ui2.__proto__ = StructArray; StructArrayLayout1ui2.prototype = Object.create( StructArray && StructArray.prototype ); StructArrayLayout1ui2.prototype.constructor = StructArrayLayout1ui2; StructArrayLayout1ui2.prototype._refreshViews = function _refreshViews () { this.uint8 = new Uint8Array(this.arrayBuffer); this.uint16 = new Uint16Array(this.arrayBuffer); }; StructArrayLayout1ui2.prototype.emplaceBack = function emplaceBack (v0 ) { var i = this.length; this.resize(i + 1); return this.emplace(i, v0); }; StructArrayLayout1ui2.prototype.emplace = function emplace (i , v0 ) { var o2 = i * 1; this.uint16[o2 + 0] = v0; return i; }; return StructArrayLayout1ui2; }(StructArray)); StructArrayLayout1ui2.prototype.bytesPerElement = 2; register('StructArrayLayout1ui2', StructArrayLayout1ui2); /** * Implementation of the StructArray layout: * [0]: Float32[2] * * @private */ var StructArrayLayout2f8 = /*@__PURE__*/(function (StructArray) { function StructArrayLayout2f8 () { StructArray.apply(this, arguments); } if ( StructArray ) StructArrayLayout2f8.__proto__ = StructArray; StructArrayLayout2f8.prototype = Object.create( StructArray && StructArray.prototype ); StructArrayLayout2f8.prototype.constructor = StructArrayLayout2f8; StructArrayLayout2f8.prototype._refreshViews = function _refreshViews () { this.uint8 = new Uint8Array(this.arrayBuffer); this.float32 = new Float32Array(this.arrayBuffer); }; StructArrayLayout2f8.prototype.emplaceBack = function emplaceBack (v0 , v1 ) { var i = this.length; this.resize(i + 1); return this.emplace(i, v0, v1); }; StructArrayLayout2f8.prototype.emplace = function emplace (i , v0 , v1 ) { var o4 = i * 2; this.float32[o4 + 0] = v0; this.float32[o4 + 1] = v1; return i; }; return StructArrayLayout2f8; }(StructArray)); StructArrayLayout2f8.prototype.bytesPerElement = 8; register('StructArrayLayout2f8', StructArrayLayout2f8); /** * Implementation of the StructArray layout: * [0]: Float32[4] * * @private */ var StructArrayLayout4f16 = /*@__PURE__*/(function (StructArray) { function StructArrayLayout4f16 () { StructArray.apply(this, arguments); } if ( StructArray ) StructArrayLayout4f16.__proto__ = StructArray; StructArrayLayout4f16.prototype = Object.create( StructArray && StructArray.prototype ); StructArrayLayout4f16.prototype.constructor = StructArrayLayout4f16; StructArrayLayout4f16.prototype._refreshViews = function _refreshViews () { this.uint8 = new Uint8Array(this.arrayBuffer); this.float32 = new Float32Array(this.arrayBuffer); }; StructArrayLayout4f16.prototype.emplaceBack = function emplaceBack (v0 , v1 , v2 , v3 ) { var i = this.length; this.resize(i + 1); return this.emplace(i, v0, v1, v2, v3); }; StructArrayLayout4f16.prototype.emplace = function emplace (i , v0 , v1 , v2 , v3 ) { var o4 = i * 4; this.float32[o4 + 0] = v0; this.float32[o4 + 1] = v1; this.float32[o4 + 2] = v2; this.float32[o4 + 3] = v3; return i; }; return StructArrayLayout4f16; }(StructArray)); StructArrayLayout4f16.prototype.bytesPerElement = 16; register('StructArrayLayout4f16', StructArrayLayout4f16); var CollisionBoxStruct = /*@__PURE__*/(function (Struct) { function CollisionBoxStruct () { Struct.apply(this, arguments); } if ( Struct ) CollisionBoxStruct.__proto__ = Struct; CollisionBoxStruct.prototype = Object.create( Struct && Struct.prototype ); CollisionBoxStruct.prototype.constructor = CollisionBoxStruct; var prototypeAccessors = { anchorPointX: { configurable: true },anchorPointY: { configurable: true },x1: { configurable: true },y1: { configurable: true },x2: { configurable: true },y2: { configurable: true },featureIndex: { configurable: true },sourceLayerIndex: { configurable: true },bucketIndex: { configurable: true },radius: { configurable: true },signedDistanceFromAnchor: { configurable: true },anchorPoint: { configurable: true } }; prototypeAccessors.anchorPointX.get = function () { return this._structArray.int16[this._pos2 + 0]; }; prototypeAccessors.anchorPointX.set = function (x) { this._structArray.int16[this._pos2 + 0] = x; }; prototypeAccessors.anchorPointY.get = function () { return this._structArray.int16[this._pos2 + 1]; }; prototypeAccessors.anchorPointY.set = function (x) { this._structArray.int16[this._pos2 + 1] = x; }; prototypeAccessors.x1.get = function () { return this._structArray.int16[this._pos2 + 2]; }; prototypeAccessors.x1.set = function (x) { this._structArray.int16[this._pos2 + 2] = x; }; prototypeAccessors.y1.get = function () { return this._structArray.int16[this._pos2 + 3]; }; prototypeAccessors.y1.set = function (x) { this._structArray.int16[this._pos2 + 3] = x; }; prototypeAccessors.x2.get = function () { return this._structArray.int16[this._pos2 + 4]; }; prototypeAccessors.x2.set = function (x) { this._structArray.int16[this._pos2 + 4] = x; }; prototypeAccessors.y2.get = function () { return this._structArray.int16[this._pos2 + 5]; }; prototypeAccessors.y2.set = function (x) { this._structArray.int16[this._pos2 + 5] = x; }; prototypeAccessors.featureIndex.get = function () { return this._structArray.uint32[this._pos4 + 3]; }; prototypeAccessors.featureIndex.set = function (x) { this._structArray.uint32[this._pos4 + 3] = x; }; prototypeAccessors.sourceLayerIndex.get = function () { return this._structArray.uint16[this._pos2 + 8]; }; prototypeAccessors.sourceLayerIndex.set = function (x) { this._structArray.uint16[this._pos2 + 8] = x; }; prototypeAccessors.bucketIndex.get = function () { return this._structArray.uint16[this._pos2 + 9]; }; prototypeAccessors.bucketIndex.set = function (x) { this._structArray.uint16[this._pos2 + 9] = x; }; prototypeAccessors.radius.get = function () { return this._structArray.int16[this._pos2 + 10]; }; prototypeAccessors.radius.set = function (x) { this._structArray.int16[this._pos2 + 10] = x; }; prototypeAccessors.signedDistanceFromAnchor.get = function () { return this._structArray.int16[this._pos2 + 11]; }; prototypeAccessors.signedDistanceFromAnchor.set = function (x) { this._structArray.int16[this._pos2 + 11] = x; }; prototypeAccessors.anchorPoint.get = function () { return new pointGeometry(this.anchorPointX, this.anchorPointY); }; Object.defineProperties( CollisionBoxStruct.prototype, prototypeAccessors ); return CollisionBoxStruct; }(Struct)); CollisionBoxStruct.prototype.size = 24; /** * @private */ var CollisionBoxArray = /*@__PURE__*/(function (StructArrayLayout6i1ul2ui2i24) { function CollisionBoxArray () { StructArrayLayout6i1ul2ui2i24.apply(this, arguments); } if ( StructArrayLayout6i1ul2ui2i24 ) CollisionBoxArray.__proto__ = StructArrayLayout6i1ul2ui2i24; CollisionBoxArray.prototype = Object.create( StructArrayLayout6i1ul2ui2i24 && StructArrayLayout6i1ul2ui2i24.prototype ); CollisionBoxArray.prototype.constructor = CollisionBoxArray; CollisionBoxArray.prototype.get = function get (index ) { assert_1(!this.isTransferred); return new CollisionBoxStruct(this, index); }; return CollisionBoxArray; }(StructArrayLayout6i1ul2ui2i24)); register('CollisionBoxArray', CollisionBoxArray); var PlacedSymbolStruct = /*@__PURE__*/(function (Struct) { function PlacedSymbolStruct () { Struct.apply(this, arguments); } if ( Struct ) PlacedSymbolStruct.__proto__ = Struct; PlacedSymbolStruct.prototype = Object.create( Struct && Struct.prototype ); PlacedSymbolStruct.prototype.constructor = PlacedSymbolStruct; var prototypeAccessors$1 = { anchorX: { configurable: true },anchorY: { configurable: true },glyphStartIndex: { configurable: true },numGlyphs: { configurable: true },vertexStartIndex: { configurable: true },lineStartIndex: { configurable: true },lineLength: { configurable: true },segment: { configurable: true },lowerSize: { configurable: true },upperSize: { configurable: true },lineOffsetX: { configurable: true },lineOffsetY: { configurable: true },writingMode: { configurable: true },hidden: { configurable: true },crossTileID: { configurable: true } }; prototypeAccessors$1.anchorX.get = function () { return this._structArray.int16[this._pos2 + 0]; }; prototypeAccessors$1.anchorX.set = function (x) { this._structArray.int16[this._pos2 + 0] = x; }; prototypeAccessors$1.anchorY.get = function () { return this._structArray.int16[this._pos2 + 1]; }; prototypeAccessors$1.anchorY.set = function (x) { this._structArray.int16[this._pos2 + 1] = x; }; prototypeAccessors$1.glyphStartIndex.get = function () { return this._structArray.uint16[this._pos2 + 2]; }; prototypeAccessors$1.glyphStartIndex.set = function (x) { this._structArray.uint16[this._pos2 + 2] = x; }; prototypeAccessors$1.numGlyphs.get = function () { return this._structArray.uint16[this._pos2 + 3]; }; prototypeAccessors$1.numGlyphs.set = function (x) { this._structArray.uint16[this._pos2 + 3] = x; }; prototypeAccessors$1.vertexStartIndex.get = function () { return this._structArray.uint32[this._pos4 + 2]; }; prototypeAccessors$1.vertexStartIndex.set = function (x) { this._structArray.uint32[this._pos4 + 2] = x; }; prototypeAccessors$1.lineStartIndex.get = function () { return this._structArray.uint32[this._pos4 + 3]; }; prototypeAccessors$1.lineStartIndex.set = function (x) { this._structArray.uint32[this._pos4 + 3] = x; }; prototypeAccessors$1.lineLength.get = function () { return this._structArray.uint32[this._pos4 + 4]; }; prototypeAccessors$1.lineLength.set = function (x) { this._structArray.uint32[this._pos4 + 4] = x; }; prototypeAccessors$1.segment.get = function () { return this._structArray.uint16[this._pos2 + 10]; }; prototypeAccessors$1.segment.set = function (x) { this._structArray.uint16[this._pos2 + 10] = x; }; prototypeAccessors$1.lowerSize.get = function () { return this._structArray.uint16[this._pos2 + 11]; }; prototypeAccessors$1.lowerSize.set = function (x) { this._structArray.uint16[this._pos2 + 11] = x; }; prototypeAccessors$1.upperSize.get = function () { return this._structArray.uint16[this._pos2 + 12]; }; prototypeAccessors$1.upperSize.set = function (x) { this._structArray.uint16[this._pos2 + 12] = x; }; prototypeAccessors$1.lineOffsetX.get = function () { return this._structArray.float32[this._pos4 + 7]; }; prototypeAccessors$1.lineOffsetX.set = function (x) { this._structArray.float32[this._pos4 + 7] = x; }; prototypeAccessors$1.lineOffsetY.get = function () { return this._structArray.float32[this._pos4 + 8]; }; prototypeAccessors$1.lineOffsetY.set = function (x) { this._structArray.float32[this._pos4 + 8] = x; }; prototypeAccessors$1.writingMode.get = function () { return this._structArray.uint8[this._pos1 + 36]; }; prototypeAccessors$1.writingMode.set = function (x) { this._structArray.uint8[this._pos1 + 36] = x; }; prototypeAccessors$1.hidden.get = function () { return this._structArray.uint8[this._pos1 + 37]; }; prototypeAccessors$1.hidden.set = function (x) { this._structArray.uint8[this._pos1 + 37] = x; }; prototypeAccessors$1.crossTileID.get = function () { return this._structArray.uint32[this._pos4 + 10]; }; prototypeAccessors$1.crossTileID.set = function (x) { this._structArray.uint32[this._pos4 + 10] = x; }; Object.defineProperties( PlacedSymbolStruct.prototype, prototypeAccessors$1 ); return PlacedSymbolStruct; }(Struct)); PlacedSymbolStruct.prototype.size = 44; /** * @private */ var PlacedSymbolArray = /*@__PURE__*/(function (StructArrayLayout2i2ui3ul3ui2f2ub1ul44) { function PlacedSymbolArray () { StructArrayLayout2i2ui3ul3ui2f2ub1ul44.apply(this, arguments); } if ( StructArrayLayout2i2ui3ul3ui2f2ub1ul44 ) PlacedSymbolArray.__proto__ = StructArrayLayout2i2ui3ul3ui2f2ub1ul44; PlacedSymbolArray.prototype = Object.create( StructArrayLayout2i2ui3ul3ui2f2ub1ul44 && StructArrayLayout2i2ui3ul3ui2f2ub1ul44.prototype ); PlacedSymbolArray.prototype.constructor = PlacedSymbolArray; PlacedSymbolArray.prototype.get = function get (index ) { assert_1(!this.isTransferred); return new PlacedSymbolStruct(this, index); }; return PlacedSymbolArray; }(StructArrayLayout2i2ui3ul3ui2f2ub1ul44)); register('PlacedSymbolArray', PlacedSymbolArray); var SymbolInstanceStruct = /*@__PURE__*/(function (Struct) { function SymbolInstanceStruct () { Struct.apply(this, arguments); } if ( Struct ) SymbolInstanceStruct.__proto__ = Struct; SymbolInstanceStruct.prototype = Object.create( Struct && Struct.prototype ); SymbolInstanceStruct.prototype.constructor = SymbolInstanceStruct; var prototypeAccessors$2 = { anchorX: { configurable: true },anchorY: { configurable: true },rightJustifiedTextSymbolIndex: { configurable: true },centerJustifiedTextSymbolIndex: { configurable: true },leftJustifiedTextSymbolIndex: { configurable: true },verticalPlacedTextSymbolIndex: { configurable: true },key: { configurable: true },textBoxStartIndex: { configurable: true },textBoxEndIndex: { configurable: true },iconBoxStartIndex: { configurable: true },iconBoxEndIndex: { configurable: true },featureIndex: { configurable: true },numHorizontalGlyphVertices: { configurable: true },numVerticalGlyphVertices: { configurable: true },numIconVertices: { configurable: true },crossTileID: { configurable: true },textBoxScale: { configurable: true },radialTextOffset: { configurable: true } }; prototypeAccessors$2.anchorX.get = function () { return this._structArray.int16[this._pos2 + 0]; }; prototypeAccessors$2.anchorX.set = function (x) { this._structArray.int16[this._pos2 + 0] = x; }; prototypeAccessors$2.anchorY.get = function () { return this._structArray.int16[this._pos2 + 1]; }; prototypeAccessors$2.anchorY.set = function (x) { this._structArray.int16[this._pos2 + 1] = x; }; prototypeAccessors$2.rightJustifiedTextSymbolIndex.get = function () { return this._structArray.int16[this._pos2 + 2]; }; prototypeAccessors$2.rightJustifiedTextSymbolIndex.set = function (x) { this._structArray.int16[this._pos2 + 2] = x; }; prototypeAccessors$2.centerJustifiedTextSymbolIndex.get = function () { return this._structArray.int16[this._pos2 + 3]; }; prototypeAccessors$2.centerJustifiedTextSymbolIndex.set = function (x) { this._structArray.int16[this._pos2 + 3] = x; }; prototypeAccessors$2.leftJustifiedTextSymbolIndex.get = function () { return this._structArray.int16[this._pos2 + 4]; }; prototypeAccessors$2.leftJustifiedTextSymbolIndex.set = function (x) { this._structArray.int16[this._pos2 + 4] = x; }; prototypeAccessors$2.verticalPlacedTextSymbolIndex.get = function () { return this._structArray.int16[this._pos2 + 5]; }; prototypeAccessors$2.verticalPlacedTextSymbolIndex.set = function (x) { this._structArray.int16[this._pos2 + 5] = x; }; prototypeAccessors$2.key.get = function () { return this._structArray.uint16[this._pos2 + 6]; }; prototypeAccessors$2.key.set = function (x) { this._structArray.uint16[this._pos2 + 6] = x; }; prototypeAccessors$2.textBoxStartIndex.get = function () { return this._structArray.uint16[this._pos2 + 7]; }; prototypeAccessors$2.textBoxStartIndex.set = function (x) { this._structArray.uint16[this._pos2 + 7] = x; }; prototypeAccessors$2.textBoxEndIndex.get = function () { return this._structArray.uint16[this._pos2 + 8]; }; prototypeAccessors$2.textBoxEndIndex.set = function (x) { this._structArray.uint16[this._pos2 + 8] = x; }; prototypeAccessors$2.iconBoxStartIndex.get = function () { return this._structArray.uint16[this._pos2 + 9]; }; prototypeAccessors$2.iconBoxStartIndex.set = function (x) { this._structArray.uint16[this._pos2 + 9] = x; }; prototypeAccessors$2.iconBoxEndIndex.get = function () { return this._structArray.uint16[this._pos2 + 10]; }; prototypeAccessors$2.iconBoxEndIndex.set = function (x) { this._structArray.uint16[this._pos2 + 10] = x; }; prototypeAccessors$2.featureIndex.get = function () { return this._structArray.uint16[this._pos2 + 11]; }; prototypeAccessors$2.featureIndex.set = function (x) { this._structArray.uint16[this._pos2 + 11] = x; }; prototypeAccessors$2.numHorizontalGlyphVertices.get = function () { return this._structArray.uint16[this._pos2 + 12]; }; prototypeAccessors$2.numHorizontalGlyphVertices.set = function (x) { this._structArray.uint16[this._pos2 + 12] = x; }; prototypeAccessors$2.numVerticalGlyphVertices.get = function () { return this._structArray.uint16[this._pos2 + 13]; }; prototypeAccessors$2.numVerticalGlyphVertices.set = function (x) { this._structArray.uint16[this._pos2 + 13] = x; }; prototypeAccessors$2.numIconVertices.get = function () { return this._structArray.uint16[this._pos2 + 14]; }; prototypeAccessors$2.numIconVertices.set = function (x) { this._structArray.uint16[this._pos2 + 14] = x; }; prototypeAccessors$2.crossTileID.get = function () { return this._structArray.uint32[this._pos4 + 8]; }; prototypeAccessors$2.crossTileID.set = function (x) { this._structArray.uint32[this._pos4 + 8] = x; }; prototypeAccessors$2.textBoxScale.get = function () { return this._structArray.float32[this._pos4 + 9]; }; prototypeAccessors$2.textBoxScale.set = function (x) { this._structArray.float32[this._pos4 + 9] = x; }; prototypeAccessors$2.radialTextOffset.get = function () { return this._structArray.float32[this._pos4 + 10]; }; prototypeAccessors$2.radialTextOffset.set = function (x) { this._structArray.float32[this._pos4 + 10] = x; }; Object.defineProperties( SymbolInstanceStruct.prototype, prototypeAccessors$2 ); return SymbolInstanceStruct; }(Struct)); SymbolInstanceStruct.prototype.size = 44; /** * @private */ var SymbolInstanceArray = /*@__PURE__*/(function (StructArrayLayout6i9ui1ul2f44) { function SymbolInstanceArray () { StructArrayLayout6i9ui1ul2f44.apply(this, arguments); } if ( StructArrayLayout6i9ui1ul2f44 ) SymbolInstanceArray.__proto__ = StructArrayLayout6i9ui1ul2f44; SymbolInstanceArray.prototype = Object.create( StructArrayLayout6i9ui1ul2f44 && StructArrayLayout6i9ui1ul2f44.prototype ); SymbolInstanceArray.prototype.constructor = SymbolInstanceArray; SymbolInstanceArray.prototype.get = function get (index ) { assert_1(!this.isTransferred); return new SymbolInstanceStruct(this, index); }; return SymbolInstanceArray; }(StructArrayLayout6i9ui1ul2f44)); register('SymbolInstanceArray', SymbolInstanceArray); var GlyphOffsetStruct = /*@__PURE__*/(function (Struct) { function GlyphOffsetStruct () { Struct.apply(this, arguments); } if ( Struct ) GlyphOffsetStruct.__proto__ = Struct; GlyphOffsetStruct.prototype = Object.create( Struct && Struct.prototype ); GlyphOffsetStruct.prototype.constructor = GlyphOffsetStruct; var prototypeAccessors$3 = { offsetX: { configurable: true } }; prototypeAccessors$3.offsetX.get = function () { return this._structArray.float32[this._pos4 + 0]; }; prototypeAccessors$3.offsetX.set = function (x) { this._structArray.float32[this._pos4 + 0] = x; }; Object.defineProperties( GlyphOffsetStruct.prototype, prototypeAccessors$3 ); return GlyphOffsetStruct; }(Struct)); GlyphOffsetStruct.prototype.size = 4; /** * @private */ var GlyphOffsetArray = /*@__PURE__*/(function (StructArrayLayout1f4) { function GlyphOffsetArray () { StructArrayLayout1f4.apply(this, arguments); } if ( StructArrayLayout1f4 ) GlyphOffsetArray.__proto__ = StructArrayLayout1f4; GlyphOffsetArray.prototype = Object.create( StructArrayLayout1f4 && StructArrayLayout1f4.prototype ); GlyphOffsetArray.prototype.constructor = GlyphOffsetArray; GlyphOffsetArray.prototype.getoffsetX = function getoffsetX (index ) { return this.float32[index * 1 + 0]; }; /** * Return the GlyphOffsetStruct at the given location in the array. * @param {number} index The index of the element. */ GlyphOffsetArray.prototype.get = function get (index ) { assert_1(!this.isTransferred); return new GlyphOffsetStruct(this, index); }; return GlyphOffsetArray; }(StructArrayLayout1f4)); register('GlyphOffsetArray', GlyphOffsetArray); var SymbolLineVertexStruct = /*@__PURE__*/(function (Struct) { function SymbolLineVertexStruct () { Struct.apply(this, arguments); } if ( Struct ) SymbolLineVertexStruct.__proto__ = Struct; SymbolLineVertexStruct.prototype = Object.create( Struct && Struct.prototype ); SymbolLineVertexStruct.prototype.constructor = SymbolLineVertexStruct; var prototypeAccessors$4 = { x: { configurable: true },y: { configurable: true },tileUnitDistanceFromAnchor: { configurable: true } }; prototypeAccessors$4.x.get = function () { return this._structArray.int16[this._pos2 + 0]; }; prototypeAccessors$4.x.set = function (x) { this._structArray.int16[this._pos2 + 0] = x; }; prototypeAccessors$4.y.get = function () { return this._structArray.int16[this._pos2 + 1]; }; prototypeAccessors$4.y.set = function (x) { this._structArray.int16[this._pos2 + 1] = x; }; prototypeAccessors$4.tileUnitDistanceFromAnchor.get = function () { return this._structArray.int16[this._pos2 + 2]; }; prototypeAccessors$4.tileUnitDistanceFromAnchor.set = function (x) { this._structArray.int16[this._pos2 + 2] = x; }; Object.defineProperties( SymbolLineVertexStruct.prototype, prototypeAccessors$4 ); return SymbolLineVertexStruct; }(Struct)); SymbolLineVertexStruct.prototype.size = 6; /** * @private */ var SymbolLineVertexArray = /*@__PURE__*/(function (StructArrayLayout3i6) { function SymbolLineVertexArray () { StructArrayLayout3i6.apply(this, arguments); } if ( StructArrayLayout3i6 ) SymbolLineVertexArray.__proto__ = StructArrayLayout3i6; SymbolLineVertexArray.prototype = Object.create( StructArrayLayout3i6 && StructArrayLayout3i6.prototype ); SymbolLineVertexArray.prototype.constructor = SymbolLineVertexArray; SymbolLineVertexArray.prototype.getx = function getx (index ) { return this.int16[index * 3 + 0]; }; SymbolLineVertexArray.prototype.gety = function gety (index ) { return this.int16[index * 3 + 1]; }; SymbolLineVertexArray.prototype.gettileUnitDistanceFromAnchor = function gettileUnitDistanceFromAnchor (index ) { return this.int16[index * 3 + 2]; }; /** * Return the SymbolLineVertexStruct at the given location in the array. * @param {number} index The index of the element. */ SymbolLineVertexArray.prototype.get = function get (index ) { assert_1(!this.isTransferred); return new SymbolLineVertexStruct(this, index); }; return SymbolLineVertexArray; }(StructArrayLayout3i6)); register('SymbolLineVertexArray', SymbolLineVertexArray); var FeatureIndexStruct = /*@__PURE__*/(function (Struct) { function FeatureIndexStruct () { Struct.apply(this, arguments); } if ( Struct ) FeatureIndexStruct.__proto__ = Struct; FeatureIndexStruct.prototype = Object.create( Struct && Struct.prototype ); FeatureIndexStruct.prototype.constructor = FeatureIndexStruct; var prototypeAccessors$5 = { featureIndex: { configurable: true },sourceLayerIndex: { configurable: true },bucketIndex: { configurable: true } }; prototypeAccessors$5.featureIndex.get = function () { return this._structArray.uint32[this._pos4 + 0]; }; prototypeAccessors$5.featureIndex.set = function (x) { this._structArray.uint32[this._pos4 + 0] = x; }; prototypeAccessors$5.sourceLayerIndex.get = function () { return this._structArray.uint16[this._pos2 + 2]; }; prototypeAccessors$5.sourceLayerIndex.set = function (x) { this._structArray.uint16[this._pos2 + 2] = x; }; prototypeAccessors$5.bucketIndex.get = function () { return this._structArray.uint16[this._pos2 + 3]; }; prototypeAccessors$5.bucketIndex.set = function (x) { this._structArray.uint16[this._pos2 + 3] = x; }; Object.defineProperties( FeatureIndexStruct.prototype, prototypeAccessors$5 ); return FeatureIndexStruct; }(Struct)); FeatureIndexStruct.prototype.size = 8; /** * @private */ var FeatureIndexArray = /*@__PURE__*/(function (StructArrayLayout1ul2ui8) { function FeatureIndexArray () { StructArrayLayout1ul2ui8.apply(this, arguments); } if ( StructArrayLayout1ul2ui8 ) FeatureIndexArray.__proto__ = StructArrayLayout1ul2ui8; FeatureIndexArray.prototype = Object.create( StructArrayLayout1ul2ui8 && StructArrayLayout1ul2ui8.prototype ); FeatureIndexArray.prototype.constructor = FeatureIndexArray; FeatureIndexArray.prototype.get = function get (index ) { assert_1(!this.isTransferred); return new FeatureIndexStruct(this, index); }; return FeatureIndexArray; }(StructArrayLayout1ul2ui8)); register('FeatureIndexArray', FeatureIndexArray); // var layout$1 = createLayout([ {name: 'a_pos', components: 2, type: 'Int16'} ], 4); var members = layout$1.members; var size = layout$1.size; var alignment = layout$1.alignment; // var SegmentVector = function SegmentVector(segments) { if ( segments === void 0 ) segments = []; this.segments = segments; }; SegmentVector.prototype.prepareSegment = function prepareSegment (numVertices , layoutVertexArray , indexArray , sortKey ) { var segment = this.segments[this.segments.length - 1]; if (numVertices > SegmentVector.MAX_VERTEX_ARRAY_LENGTH) { warnOnce(("Max vertices per segment is " + (SegmentVector.MAX_VERTEX_ARRAY_LENGTH) + ": bucket requested " + numVertices)); } if (!segment || segment.vertexLength + numVertices > SegmentVector.MAX_VERTEX_ARRAY_LENGTH || segment.sortKey !== sortKey) { segment = ({ vertexOffset: layoutVertexArray.length, primitiveOffset: indexArray.length, vertexLength: 0, primitiveLength: 0 } ); if (sortKey !== undefined) { segment.sortKey = sortKey; } this.segments.push(segment); } return segment; }; SegmentVector.prototype.get = function get () { return this.segments; }; SegmentVector.prototype.destroy = function destroy () { for (var i = 0, list = this.segments; i < list.length; i += 1) { var segment = list[i]; for (var k in segment.vaos) { segment.vaos[k].destroy(); } } }; SegmentVector.simpleSegment = function simpleSegment (vertexOffset , primitiveOffset , vertexLength , primitiveLength ) { return new SegmentVector([{ vertexOffset: vertexOffset, primitiveOffset: primitiveOffset, vertexLength: vertexLength, primitiveLength: primitiveLength, vaos: {}, sortKey: 0 }]); }; /* * The maximum size of a vertex array. This limit is imposed by WebGL's 16 bit * addressing of vertex buffers. * @private * @readonly */ SegmentVector.MAX_VERTEX_ARRAY_LENGTH = Math.pow(2, 16) - 1; register('SegmentVector', SegmentVector); // /** * Packs two numbers, interpreted as 8-bit unsigned integers, into a single * float. Unpack them in the shader using the `unpack_float()` function, * defined in _prelude.vertex.glsl * * @private */ function packUint8ToFloat(a , b ) { // coerce a and b to 8-bit ints a = clamp(Math.floor(a), 0, 255); b = clamp(Math.floor(b), 0, 255); return 256 * a + b; } // // A transferable data structure that maps feature ids to their indices and buffer offsets var FeaturePositionMap = function FeaturePositionMap() { this.ids = []; this.positions = []; this.indexed = false; }; FeaturePositionMap.prototype.add = function add (id , index , start , end ) { this.ids.push(id); this.positions.push(index, start, end); }; FeaturePositionMap.prototype.getPositions = function getPositions (id ) { assert_1(this.indexed); // binary search for the first occurrence of id in this.ids; // relies on ids/positions being sorted by id, which happens in serialization var i = 0; var j = this.ids.length - 1; while (i < j) { var m = (i + j) >> 1; if (this.ids[m] >= id) { j = m; } else { i = m + 1; } } var positions = []; while (this.ids[i] === id) { var index = this.positions[3 * i]; var start = this.positions[3 * i + 1]; var end = this.positions[3 * i + 2]; positions.push({index: index, start: start, end: end}); i++; } return positions; }; FeaturePositionMap.serialize = function serialize (map , transferables ) { var ids = new Float64Array(map.ids); var positions = new Uint32Array(map.positions); sort(ids, positions, 0, ids.length - 1); transferables.push(ids.buffer, positions.buffer); return {ids: ids, positions: positions}; }; FeaturePositionMap.deserialize = function deserialize (obj ) { var map = new FeaturePositionMap(); // after transferring, we only use these arrays statically (no pushes), // so TypedArray vs Array distinction that flow points out doesn't matter map.ids = (obj.ids ); map.positions = (obj.positions ); map.indexed = true; return map; }; // custom quicksort that sorts ids, indices and offsets together (by ids) function sort(ids, positions, left, right) { if (left >= right) { return; } var pivot = ids[(left + right) >> 1]; var i = left - 1; var j = right + 1; while (true) { do { i++; } while (ids[i] < pivot); do { j--; } while (ids[j] > pivot); if (i >= j) { break; } swap(ids, i, j); swap(positions, 3 * i, 3 * j); swap(positions, 3 * i + 1, 3 * j + 1); swap(positions, 3 * i + 2, 3 * j + 2); } sort(ids, positions, left, j); sort(ids, positions, j + 1, right); } function swap(arr, i, j) { var tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; } register('FeaturePositionMap', FeaturePositionMap); // var Uniform = function Uniform(context , location ) { this.gl = context.gl; this.location = location; }; var Uniform1i = /*@__PURE__*/(function (Uniform) { function Uniform1i(context , location ) { Uniform.call(this, context, location); this.current = 0; } if ( Uniform ) Uniform1i.__proto__ = Uniform; Uniform1i.prototype = Object.create( Uniform && Uniform.prototype ); Uniform1i.prototype.constructor = Uniform1i; Uniform1i.prototype.set = function set (v ) { if (this.current !== v) { this.current = v; this.gl.uniform1i(this.location, v); } }; return Uniform1i; }(Uniform)); var Uniform1f = /*@__PURE__*/(function (Uniform) { function Uniform1f(context , location ) { Uniform.call(this, context, location); this.current = 0; } if ( Uniform ) Uniform1f.__proto__ = Uniform; Uniform1f.prototype = Object.create( Uniform && Uniform.prototype ); Uniform1f.prototype.constructor = Uniform1f; Uniform1f.prototype.set = function set (v ) { if (this.current !== v) { this.current = v; this.gl.uniform1f(this.location, v); } }; return Uniform1f; }(Uniform)); var Uniform2f = /*@__PURE__*/(function (Uniform) { function Uniform2f(context , location ) { Uniform.call(this, context, location); this.current = [0, 0]; } if ( Uniform ) Uniform2f.__proto__ = Uniform; Uniform2f.prototype = Object.create( Uniform && Uniform.prototype ); Uniform2f.prototype.constructor = Uniform2f; Uniform2f.prototype.set = function set (v ) { if (v[0] !== this.current[0] || v[1] !== this.current[1]) { this.current = v; this.gl.uniform2f(this.location, v[0], v[1]); } }; return Uniform2f; }(Uniform)); var Uniform3f = /*@__PURE__*/(function (Uniform) { function Uniform3f(context , location ) { Uniform.call(this, context, location); this.current = [0, 0, 0]; } if ( Uniform ) Uniform3f.__proto__ = Uniform; Uniform3f.prototype = Object.create( Uniform && Uniform.prototype ); Uniform3f.prototype.constructor = Uniform3f; Uniform3f.prototype.set = function set (v ) { if (v[0] !== this.current[0] || v[1] !== this.current[1] || v[2] !== this.current[2]) { this.current = v; this.gl.uniform3f(this.location, v[0], v[1], v[2]); } }; return Uniform3f; }(Uniform)); var Uniform4f = /*@__PURE__*/(function (Uniform) { function Uniform4f(context , location ) { Uniform.call(this, context, location); this.current = [0, 0, 0, 0]; } if ( Uniform ) Uniform4f.__proto__ = Uniform; Uniform4f.prototype = Object.create( Uniform && Uniform.prototype ); Uniform4f.prototype.constructor = Uniform4f; Uniform4f.prototype.set = function set (v ) { if (v[0] !== this.current[0] || v[1] !== this.current[1] || v[2] !== this.current[2] || v[3] !== this.current[3]) { this.current = v; this.gl.uniform4f(this.location, v[0], v[1], v[2], v[3]); } }; return Uniform4f; }(Uniform)); var UniformColor = /*@__PURE__*/(function (Uniform) { function UniformColor(context , location ) { Uniform.call(this, context, location); this.current = Color.transparent; } if ( Uniform ) UniformColor.__proto__ = Uniform; UniformColor.prototype = Object.create( Uniform && Uniform.prototype ); UniformColor.prototype.constructor = UniformColor; UniformColor.prototype.set = function set (v ) { if (v.r !== this.current.r || v.g !== this.current.g || v.b !== this.current.b || v.a !== this.current.a) { this.current = v; this.gl.uniform4f(this.location, v.r, v.g, v.b, v.a); } }; return UniformColor; }(Uniform)); var emptyMat4 = new Float32Array(16); var UniformMatrix4f = /*@__PURE__*/(function (Uniform) { function UniformMatrix4f(context , location ) { Uniform.call(this, context, location); this.current = emptyMat4; } if ( Uniform ) UniformMatrix4f.__proto__ = Uniform; UniformMatrix4f.prototype = Object.create( Uniform && Uniform.prototype ); UniformMatrix4f.prototype.constructor = UniformMatrix4f; UniformMatrix4f.prototype.set = function set (v ) { // The vast majority of matrix comparisons that will trip this set // happen at i=12 or i=0, so we check those first to avoid lots of // unnecessary iteration: if (v[12] !== this.current[12] || v[0] !== this.current[0]) { this.current = v; this.gl.uniformMatrix4fv(this.location, false, v); return; } for (var i = 1; i < 16; i++) { if (v[i] !== this.current[i]) { this.current = v; this.gl.uniformMatrix4fv(this.location, false, v); break; } } }; return UniformMatrix4f; }(Uniform)); // function packColor(color ) { return [ packUint8ToFloat(255 * color.r, 255 * color.g), packUint8ToFloat(255 * color.b, 255 * color.a) ]; } /** * `Binder` is the interface definition for the strategies for constructing, * uploading, and binding paint property data as GLSL attributes. Most style- * spec properties have a 1:1 relationship to shader attribute/uniforms, but * some require multliple values per feature to be passed to the GPU, and in * those cases we bind multiple attributes/uniforms. * * It has three implementations, one for each of the three strategies we use: * * * For _constant_ properties -- those whose value is a constant, or the constant * result of evaluating a camera expression at a particular camera position -- we * don't need a vertex attribute buffer, and instead use a uniform. * * For data expressions, we use a vertex buffer with a single attribute value, * the evaluated result of the source function for the given feature. * * For composite expressions, we use a vertex buffer with two attributes: min and * max values covering the range of zooms at which we expect the tile to be * displayed. These values are calculated by evaluating the composite expression for * the given feature at strategically chosen zoom levels. In addition to this * attribute data, we also use a uniform value which the shader uses to interpolate * between the min and max value at the final displayed zoom level. The use of a * uniform allows us to cheaply update the value on every frame. * * Note that the shader source varies depending on whether we're using a uniform or * attribute. We dynamically compile shaders at runtime to accomodate this. * * @private */ var ConstantBinder = function ConstantBinder(value , names , type ) { this.value = value; this.names = names; this.uniformNames = this.names.map(function (name) { return ("u_" + name); }); this.type = type; this.maxValue = -Infinity; }; ConstantBinder.prototype.defines = function defines () { return this.names.map(function (name) { return ("#define HAS_UNIFORM_u_" + name); }); }; ConstantBinder.prototype.setConstantPatternPositions = function setConstantPatternPositions () {}; ConstantBinder.prototype.populatePaintArray = function populatePaintArray () {}; ConstantBinder.prototype.updatePaintArray = function updatePaintArray () {}; ConstantBinder.prototype.upload = function upload () {}; ConstantBinder.prototype.destroy = function destroy () {}; ConstantBinder.prototype.setUniforms = function setUniforms (context , uniform , globals , currentValue ) { uniform.set(currentValue.constantOr(this.value)); }; ConstantBinder.prototype.getBinding = function getBinding (context , location ) { return (this.type === 'color') ? new UniformColor(context, location) : new Uniform1f(context, location); }; ConstantBinder.serialize = function serialize$1 (binder ) { var value = binder.value; var names = binder.names; var type = binder.type; return {value: serialize(value), names: names, type: type}; }; ConstantBinder.deserialize = function deserialize$1 (serialized ) { var value = serialized.value; var names = serialized.names; var type = serialized.type; return new ConstantBinder(deserialize(value), names, type); }; var CrossFadedConstantBinder = function CrossFadedConstantBinder(value , names , type ) { this.value = value; this.names = names; this.uniformNames = this.names.map(function (name) { return ("u_" + name); }); this.type = type; this.maxValue = -Infinity; this.patternPositions = {patternTo: null, patternFrom: null}; }; CrossFadedConstantBinder.prototype.defines = function defines () { return this.names.map(function (name) { return ("#define HAS_UNIFORM_u_" + name); }); }; CrossFadedConstantBinder.prototype.populatePaintArray = function populatePaintArray () {}; CrossFadedConstantBinder.prototype.updatePaintArray = function updatePaintArray () {}; CrossFadedConstantBinder.prototype.upload = function upload () {}; CrossFadedConstantBinder.prototype.destroy = function destroy () {}; CrossFadedConstantBinder.prototype.setConstantPatternPositions = function setConstantPatternPositions (posTo , posFrom ) { this.patternPositions.patternTo = posTo.tlbr; this.patternPositions.patternFrom = posFrom.tlbr; }; CrossFadedConstantBinder.prototype.setUniforms = function setUniforms (context , uniform , globals , currentValue , uniformName ) { var pos = this.patternPositions; if (uniformName === "u_pattern_to" && pos.patternTo) { uniform.set(pos.patternTo); } if (uniformName === "u_pattern_from" && pos.patternFrom) { uniform.set(pos.patternFrom); } }; CrossFadedConstantBinder.prototype.getBinding = function getBinding (context , location ) { return new Uniform4f(context, location); }; var SourceExpressionBinder = function SourceExpressionBinder(expression , names , type , PaintVertexArray ) { this.expression = expression; this.names = names; this.type = type; this.uniformNames = this.names.map(function (name) { return ("a_" + name); }); this.maxValue = -Infinity; this.paintVertexAttributes = names.map(function (name) { return ({ name: ("a_" + name), type: 'Float32', components: type === 'color' ? 2 : 1, offset: 0 }); } ); this.paintVertexArray = new PaintVertexArray(); }; SourceExpressionBinder.prototype.defines = function defines () { return []; }; SourceExpressionBinder.prototype.setConstantPatternPositions = function setConstantPatternPositions () {}; SourceExpressionBinder.prototype.populatePaintArray = function populatePaintArray (newLength , feature ) { var paintArray = this.paintVertexArray; var start = paintArray.length; paintArray.reserve(newLength); var value = this.expression.evaluate(new EvaluationParameters(0), feature, {}); if (this.type === 'color') { var color = packColor(value); for (var i = start; i < newLength; i++) { paintArray.emplaceBack(color[0], color[1]); } } else { for (var i$1 = start; i$1 < newLength; i$1++) { paintArray.emplaceBack(value); } this.maxValue = Math.max(this.maxValue, value); } }; SourceExpressionBinder.prototype.updatePaintArray = function updatePaintArray (start , end , feature , featureState ) { var paintArray = this.paintVertexArray; var value = this.expression.evaluate({zoom: 0}, feature, featureState); if (this.type === 'color') { var color = packColor(value); for (var i = start; i < end; i++) { paintArray.emplace(i, color[0], color[1]); } } else { for (var i$1 = start; i$1 < end; i$1++) { paintArray.emplace(i$1, value); } this.maxValue = Math.max(this.maxValue, value); } }; SourceExpressionBinder.prototype.upload = function upload (context ) { if (this.paintVertexArray && this.paintVertexArray.arrayBuffer) { if (this.paintVertexBuffer && this.paintVertexBuffer.buffer) { this.paintVertexBuffer.updateData(this.paintVertexArray); } else { this.paintVertexBuffer = context.createVertexBuffer(this.paintVertexArray, this.paintVertexAttributes, this.expression.isStateDependent); } } }; SourceExpressionBinder.prototype.destroy = function destroy () { if (this.paintVertexBuffer) { this.paintVertexBuffer.destroy(); } }; SourceExpressionBinder.prototype.setUniforms = function setUniforms (context , uniform ) { uniform.set(0); }; SourceExpressionBinder.prototype.getBinding = function getBinding (context , location ) { return new Uniform1f(context, location); }; var CompositeExpressionBinder = function CompositeExpressionBinder(expression , names , type , useIntegerZoom , zoom , layout ) { this.expression = expression; this.names = names; this.uniformNames = this.names.map(function (name) { return ("a_" + name + "_t"); }); this.type = type; this.useIntegerZoom = useIntegerZoom; this.zoom = zoom; this.maxValue = -Infinity; var PaintVertexArray = layout; this.paintVertexAttributes = names.map(function (name) { return { name: ("a_" + name), type: 'Float32', components: type === 'color' ? 4 : 2, offset: 0 }; }); this.paintVertexArray = new PaintVertexArray(); }; CompositeExpressionBinder.prototype.defines = function defines () { return []; }; CompositeExpressionBinder.prototype.setConstantPatternPositions = function setConstantPatternPositions () {}; CompositeExpressionBinder.prototype.populatePaintArray = function populatePaintArray (newLength , feature ) { var paintArray = this.paintVertexArray; var start = paintArray.length; paintArray.reserve(newLength); var min = this.expression.evaluate(new EvaluationParameters(this.zoom), feature, {}); var max = this.expression.evaluate(new EvaluationParameters(this.zoom + 1), feature, {}); if (this.type === 'color') { var minColor = packColor(min); var maxColor = packColor(max); for (var i = start; i < newLength; i++) { paintArray.emplaceBack(minColor[0], minColor[1], maxColor[0], maxColor[1]); } } else { for (var i$1 = start; i$1 < newLength; i$1++) { paintArray.emplaceBack(min, max); } this.maxValue = Math.max(this.maxValue, min, max); } }; CompositeExpressionBinder.prototype.updatePaintArray = function updatePaintArray (start , end , feature , featureState ) { var paintArray = this.paintVertexArray; var min = this.expression.evaluate({zoom: this.zoom }, feature, featureState); var max = this.expression.evaluate({zoom: this.zoom + 1}, feature, featureState); if (this.type === 'color') { var minColor = packColor(min); var maxColor = packColor(max); for (var i = start; i < end; i++) { paintArray.emplace(i, minColor[0], minColor[1], maxColor[0], maxColor[1]); } } else { for (var i$1 = start; i$1 < end; i$1++) { paintArray.emplace(i$1, min, max); } this.maxValue = Math.max(this.maxValue, min, max); } }; CompositeExpressionBinder.prototype.upload = function upload (context ) { if (this.paintVertexArray && this.paintVertexArray.arrayBuffer) { if (this.paintVertexBuffer && this.paintVertexBuffer.buffer) { this.paintVertexBuffer.updateData(this.paintVertexArray); } else { this.paintVertexBuffer = context.createVertexBuffer(this.paintVertexArray, this.paintVertexAttributes, this.expression.isStateDependent); } } }; CompositeExpressionBinder.prototype.destroy = function destroy () { if (this.paintVertexBuffer) { this.paintVertexBuffer.destroy(); } }; CompositeExpressionBinder.prototype.interpolationFactor = function interpolationFactor (currentZoom ) { if (this.useIntegerZoom) { return this.expression.interpolationFactor(Math.floor(currentZoom), this.zoom, this.zoom + 1); } else { return this.expression.interpolationFactor(currentZoom, this.zoom, this.zoom + 1); } }; CompositeExpressionBinder.prototype.setUniforms = function setUniforms (context , uniform , globals ) { uniform.set(this.interpolationFactor(globals.zoom)); }; CompositeExpressionBinder.prototype.getBinding = function getBinding (context , location ) { return new Uniform1f(context, location); }; var CrossFadedCompositeBinder = function CrossFadedCompositeBinder(expression , names , type , useIntegerZoom , zoom , PaintVertexArray , layerId ) { this.expression = expression; this.names = names; this.type = type; this.uniformNames = this.names.map(function (name) { return ("a_" + name + "_t"); }); this.useIntegerZoom = useIntegerZoom; this.zoom = zoom; this.maxValue = -Infinity; this.layerId = layerId; this.paintVertexAttributes = names.map(function (name) { return ({ name: ("a_" + name), type: 'Uint16', components: 4, offset: 0 }); } ); this.zoomInPaintVertexArray = new PaintVertexArray(); this.zoomOutPaintVertexArray = new PaintVertexArray(); }; CrossFadedCompositeBinder.prototype.defines = function defines () { return []; }; CrossFadedCompositeBinder.prototype.setConstantPatternPositions = function setConstantPatternPositions () {}; CrossFadedCompositeBinder.prototype.populatePaintArray = function populatePaintArray (length , feature , imagePositions ) { // We populate two paint arrays because, for cross-faded properties, we don't know which direction // we're cross-fading to at layout time. In order to keep vertex attributes to a minimum and not pass // unnecessary vertex data to the shaders, we determine which to upload at draw time. var zoomInArray = this.zoomInPaintVertexArray; var zoomOutArray = this.zoomOutPaintVertexArray; var ref = this; var layerId = ref.layerId; var start = zoomInArray.length; zoomInArray.reserve(length); zoomOutArray.reserve(length); if (imagePositions && feature.patterns && feature.patterns[layerId]) { var ref$1 = feature.patterns[layerId]; var min = ref$1.min; var mid = ref$1.mid; var max = ref$1.max; var imageMin = imagePositions[min]; var imageMid = imagePositions[mid]; var imageMax = imagePositions[max]; if (!imageMin || !imageMid || !imageMax) { return; } for (var i = start; i < length; i++) { zoomInArray.emplaceBack( imageMid.tl[0], imageMid.tl[1], imageMid.br[0], imageMid.br[1], imageMin.tl[0], imageMin.tl[1], imageMin.br[0], imageMin.br[1] ); zoomOutArray.emplaceBack( imageMid.tl[0], imageMid.tl[1], imageMid.br[0], imageMid.br[1], imageMax.tl[0], imageMax.tl[1], imageMax.br[0], imageMax.br[1] ); } } }; CrossFadedCompositeBinder.prototype.updatePaintArray = function updatePaintArray (start , end , feature , featureState , imagePositions ) { // We populate two paint arrays because, for cross-faded properties, we don't know which direction // we're cross-fading to at layout time. In order to keep vertex attributes to a minimum and not pass // unnecessary vertex data to the shaders, we determine which to upload at draw time. var zoomInArray = this.zoomInPaintVertexArray; var zoomOutArray = this.zoomOutPaintVertexArray; var ref = this; var layerId = ref.layerId; if (imagePositions && feature.patterns && feature.patterns[layerId]) { var ref$1 = feature.patterns[layerId]; var min = ref$1.min; var mid = ref$1.mid; var max = ref$1.max; var imageMin = imagePositions[min]; var imageMid = imagePositions[mid]; var imageMax = imagePositions[max]; if (!imageMin || !imageMid || !imageMax) { return; } for (var i = start; i < end; i++) { zoomInArray.emplace(i, imageMid.tl[0], imageMid.tl[1], imageMid.br[0], imageMid.br[1], imageMin.tl[0], imageMin.tl[1], imageMin.br[0], imageMin.br[1] ); zoomOutArray.emplace(i, imageMid.tl[0], imageMid.tl[1], imageMid.br[0], imageMid.br[1], imageMax.tl[0], imageMax.tl[1], imageMax.br[0], imageMax.br[1] ); } } }; CrossFadedCompositeBinder.prototype.upload = function upload (context ) { if (this.zoomInPaintVertexArray && this.zoomInPaintVertexArray.arrayBuffer && this.zoomOutPaintVertexArray && this.zoomOutPaintVertexArray.arrayBuffer) { this.zoomInPaintVertexBuffer = context.createVertexBuffer(this.zoomInPaintVertexArray, this.paintVertexAttributes, this.expression.isStateDependent); this.zoomOutPaintVertexBuffer = context.createVertexBuffer(this.zoomOutPaintVertexArray, this.paintVertexAttributes, this.expression.isStateDependent); } }; CrossFadedCompositeBinder.prototype.destroy = function destroy () { if (this.zoomOutPaintVertexBuffer) { this.zoomOutPaintVertexBuffer.destroy(); } if (this.zoomInPaintVertexBuffer) { this.zoomInPaintVertexBuffer.destroy(); } }; CrossFadedCompositeBinder.prototype.setUniforms = function setUniforms (context , uniform ) { uniform.set(0); }; CrossFadedCompositeBinder.prototype.getBinding = function getBinding (context , location ) { return new Uniform1f(context, location); }; /** * ProgramConfiguration contains the logic for binding style layer properties and tile * layer feature data into GL program uniforms and vertex attributes. * * Non-data-driven property values are bound to shader uniforms. Data-driven property * values are bound to vertex attributes. In order to support a uniform GLSL syntax over * both, [Mapbox GL Shaders](https://github.com/mapbox/mapbox-gl-shaders) defines a `#pragma` * abstraction, which ProgramConfiguration is responsible for implementing. At runtime, * it examines the attributes of a particular layer, combines this with fixed knowledge * about how layers of the particular type are implemented, and determines which uniforms * and vertex attributes will be required. It can then substitute the appropriate text * into the shader source code, create and link a program, and bind the uniforms and * vertex attributes in preparation for drawing. * * When a vector tile is parsed, this same configuration information is used to * populate the attribute buffers needed for data-driven styling using the zoom * level and feature property data. * * @private */ var ProgramConfiguration = function ProgramConfiguration() { this.binders = {}; this.cacheKey = ''; this._buffers = []; this._featureMap = new FeaturePositionMap(); this._bufferOffset = 0; }; ProgramConfiguration.createDynamic = function createDynamic (layer , zoom , filterProperties ) { var self = new ProgramConfiguration(); var keys = []; for (var property in layer.paint._values) { if (!filterProperties(property)) { continue; } var value = layer.paint.get(property); if (!(value instanceof PossiblyEvaluatedPropertyValue) || !supportsPropertyExpression(value.property.specification)) { continue; } var names = paintAttributeNames(property, layer.type); var type = value.property.specification.type; var useIntegerZoom = value.property.useIntegerZoom; var isCrossFaded = value.property.specification['property-type'] === 'cross-faded' || value.property.specification['property-type'] === 'cross-faded-data-driven'; if (isCrossFaded) { if (value.value.kind === 'constant') { self.binders[property] = new CrossFadedConstantBinder(value.value.value, names, type); keys.push(("/u_" + property)); } else { var StructArrayLayout = layoutType(property, type, 'source'); self.binders[property] = new CrossFadedCompositeBinder(value.value, names, type, useIntegerZoom, zoom, StructArrayLayout, layer.id); keys.push(("/a_" + property)); } } else if (value.value.kind === 'constant') { self.binders[property] = new ConstantBinder(value.value.value, names, type); keys.push(("/u_" + property)); } else if (value.value.kind === 'source') { var StructArrayLayout$1 = layoutType(property, type, 'source'); self.binders[property] = new SourceExpressionBinder(value.value, names, type, StructArrayLayout$1); keys.push(("/a_" + property)); } else { var StructArrayLayout$2 = layoutType(property, type, 'composite'); self.binders[property] = new CompositeExpressionBinder(value.value, names, type, useIntegerZoom, zoom, StructArrayLayout$2); keys.push(("/z_" + property)); } } self.cacheKey = keys.sort().join(''); return self; }; ProgramConfiguration.prototype.populatePaintArrays = function populatePaintArrays (newLength , feature , index , imagePositions ) { for (var property in this.binders) { var binder = this.binders[property]; binder.populatePaintArray(newLength, feature, imagePositions); } if (feature.id !== undefined) { this._featureMap.add(+feature.id, index, this._bufferOffset, newLength); } this._bufferOffset = newLength; }; ProgramConfiguration.prototype.setConstantPatternPositions = function setConstantPatternPositions (posTo , posFrom ) { for (var property in this.binders) { var binder = this.binders[property]; binder.setConstantPatternPositions(posTo, posFrom); } }; ProgramConfiguration.prototype.updatePaintArrays = function updatePaintArrays (featureStates , vtLayer , layer , imagePositions ) { var dirty = false; for (var id in featureStates) { var positions = this._featureMap.getPositions(+id); for (var i = 0, list = positions; i < list.length; i += 1) { var pos = list[i]; var feature = vtLayer.feature(pos.index); for (var property in this.binders) { var binder = this.binders[property]; if (binder instanceof ConstantBinder || binder instanceof CrossFadedConstantBinder) { continue; } if ((binder ).expression.isStateDependent === true) { //AHM: Remove after https://github.com/mapbox/mapbox-gl-js/issues/6255 var value = layer.paint.get(property); (binder ).expression = value.value; binder.updatePaintArray(pos.start, pos.end, feature, featureStates[id], imagePositions); dirty = true; } } } } return dirty; }; ProgramConfiguration.prototype.defines = function defines () { var result = []; for (var property in this.binders) { result.push.apply(result, this.binders[property].defines()); } return result; }; ProgramConfiguration.prototype.getPaintVertexBuffers = function getPaintVertexBuffers () { return this._buffers; }; ProgramConfiguration.prototype.getUniforms = function getUniforms (context , locations ) { var uniforms = []; for (var property in this.binders) { var binder = this.binders[property]; for (var i = 0, list = binder.uniformNames; i < list.length; i += 1) { var name = list[i]; if (locations[name]) { var binding = binder.getBinding(context, locations[name]); uniforms.push({name: name, property: property, binding: binding}); } } } return uniforms; }; ProgramConfiguration.prototype.setUniforms = function setUniforms (context , binderUniforms , properties , globals ) { // Uniform state bindings are owned by the Program, but we set them // from within the ProgramConfiguraton's binder members. for (var i = 0, list = binderUniforms; i < list.length; i += 1) { var ref = list[i]; var name = ref.name; var property = ref.property; var binding = ref.binding; this.binders[property].setUniforms(context, binding, globals, properties.get(property), name); } }; ProgramConfiguration.prototype.updatePatternPaintBuffers = function updatePatternPaintBuffers (crossfade ) { var buffers = []; for (var property in this.binders) { var binder = this.binders[property]; if (binder instanceof CrossFadedCompositeBinder) { var patternVertexBuffer = crossfade.fromScale === 2 ? binder.zoomInPaintVertexBuffer : binder.zoomOutPaintVertexBuffer; if (patternVertexBuffer) { buffers.push(patternVertexBuffer); } } else if ((binder instanceof SourceExpressionBinder || binder instanceof CompositeExpressionBinder) && binder.paintVertexBuffer ) { buffers.push(binder.paintVertexBuffer); } } this._buffers = buffers; }; ProgramConfiguration.prototype.upload = function upload (context ) { for (var property in this.binders) { this.binders[property].upload(context); } var buffers = []; for (var property$1 in this.binders) { var binder = this.binders[property$1]; if ((binder instanceof SourceExpressionBinder || binder instanceof CompositeExpressionBinder) && binder.paintVertexBuffer ) { buffers.push(binder.paintVertexBuffer); } } this._buffers = buffers; }; ProgramConfiguration.prototype.destroy = function destroy () { for (var property in this.binders) { this.binders[property].destroy(); } }; var ProgramConfigurationSet = function ProgramConfigurationSet(layoutAttributes , layers , zoom , filterProperties) { if ( filterProperties === void 0 ) filterProperties = function () { return true; }; this.programConfigurations = {}; for (var i = 0, list = layers; i < list.length; i += 1) { var layer = list[i]; this.programConfigurations[layer.id] = ProgramConfiguration.createDynamic(layer, zoom, filterProperties); this.programConfigurations[layer.id].layoutAttributes = layoutAttributes; } this.needsUpload = false; }; ProgramConfigurationSet.prototype.populatePaintArrays = function populatePaintArrays (length , feature , index , imagePositions ) { for (var key in this.programConfigurations) { this.programConfigurations[key].populatePaintArrays(length, feature, index, imagePositions); } this.needsUpload = true; }; ProgramConfigurationSet.prototype.updatePaintArrays = function updatePaintArrays (featureStates , vtLayer , layers , imagePositions ) { for (var i = 0, list = layers; i < list.length; i += 1) { var layer = list[i]; this.needsUpload = this.programConfigurations[layer.id].updatePaintArrays(featureStates, vtLayer, layer, imagePositions) || this.needsUpload; } }; ProgramConfigurationSet.prototype.get = function get (layerId ) { return this.programConfigurations[layerId]; }; ProgramConfigurationSet.prototype.upload = function upload (context ) { if (!this.needsUpload) { return; } for (var layerId in this.programConfigurations) { this.programConfigurations[layerId].upload(context); } this.needsUpload = false; }; ProgramConfigurationSet.prototype.destroy = function destroy () { for (var layerId in this.programConfigurations) { this.programConfigurations[layerId].destroy(); } }; function paintAttributeNames(property, type) { var attributeNameExceptions = { 'text-opacity': ['opacity'], 'icon-opacity': ['opacity'], 'text-color': ['fill_color'], 'icon-color': ['fill_color'], 'text-halo-color': ['halo_color'], 'icon-halo-color': ['halo_color'], 'text-halo-blur': ['halo_blur'], 'icon-halo-blur': ['halo_blur'], 'text-halo-width': ['halo_width'], 'icon-halo-width': ['halo_width'], 'line-gap-width': ['gapwidth'], 'line-pattern': ['pattern_to', 'pattern_from'], 'fill-pattern': ['pattern_to', 'pattern_from'], 'fill-extrusion-pattern': ['pattern_to', 'pattern_from'], }; return attributeNameExceptions[property] || [property.replace((type + "-"), '').replace(/-/g, '_')]; } function getLayoutException(property) { var propertyExceptions = { 'line-pattern':{ 'source': StructArrayLayout8ui16, 'composite': StructArrayLayout8ui16 }, 'fill-pattern': { 'source': StructArrayLayout8ui16, 'composite': StructArrayLayout8ui16 }, 'fill-extrusion-pattern':{ 'source': StructArrayLayout8ui16, 'composite': StructArrayLayout8ui16 } }; return propertyExceptions[property]; } function layoutType(property, type, binderType) { var defaultLayouts = { 'color': { 'source': StructArrayLayout2f8, 'composite': StructArrayLayout4f16 }, 'number': { 'source': StructArrayLayout1f4, 'composite': StructArrayLayout2f8 } }; var layoutException = getLayoutException(property); return layoutException && layoutException[binderType] || defaultLayouts[type][binderType]; } register('ConstantBinder', ConstantBinder); register('CrossFadedConstantBinder', CrossFadedConstantBinder); register('SourceExpressionBinder', SourceExpressionBinder); register('CrossFadedCompositeBinder', CrossFadedCompositeBinder); register('CompositeExpressionBinder', CompositeExpressionBinder); register('ProgramConfiguration', ProgramConfiguration, {omit: ['_buffers']}); register('ProgramConfigurationSet', ProgramConfigurationSet); // // /** * The maximum value of a coordinate in the internal tile coordinate system. Coordinates of * all source features normalized to this extent upon load. * * The value is a consequence of the following: * * * Vertex buffer store positions as signed 16 bit integers. * * One bit is lost for signedness to support tile buffers. * * One bit is lost because the line vertex buffer used to pack 1 bit of other data into the int. * This is no longer the case but we're reserving this bit anyway. * * One bit is lost to support features extending past the extent on the right edge of the tile. * * This leaves us with 2^13 = 8192 * * @private * @readonly */ var EXTENT = 8192; // // These bounds define the minimum and maximum supported coordinate values. // While visible coordinates are within [0, EXTENT], tiles may theoretically // contain cordinates within [-Infinity, Infinity]. Our range is limited by the // number of bits used to represent the coordinate. function createBounds(bits) { return { min: -1 * Math.pow(2, bits - 1), max: Math.pow(2, bits - 1) - 1 }; } var bounds = createBounds(16); /** * Loads a geometry from a VectorTileFeature and scales it to the common extent * used internally. * @param {VectorTileFeature} feature * @private */ function loadGeometry(feature ) { var scale = EXTENT / feature.extent; var geometry = feature.loadGeometry(); for (var r = 0; r < geometry.length; r++) { var ring = geometry[r]; for (var p = 0; p < ring.length; p++) { var point = ring[p]; // round here because mapbox-gl-native uses integers to represent // points and we need to do the same to avoid renering differences. point.x = Math.round(point.x * scale); point.y = Math.round(point.y * scale); if (point.x < bounds.min || point.x > bounds.max || point.y < bounds.min || point.y > bounds.max) { warnOnce('Geometry exceeds allowed extent, reduce your vector tile buffer size'); } } } return geometry; } // function addCircleVertex(layoutVertexArray, x, y, extrudeX, extrudeY) { layoutVertexArray.emplaceBack( (x * 2) + ((extrudeX + 1) / 2), (y * 2) + ((extrudeY + 1) / 2)); } /** * Circles are represented by two triangles. * * Each corner has a pos that is the center of the circle and an extrusion * vector that is where it points. * @private */ var CircleBucket = function CircleBucket(options ) { this.zoom = options.zoom; this.overscaling = options.overscaling; this.layers = options.layers; this.layerIds = this.layers.map(function (layer) { return layer.id; }); this.index = options.index; this.hasPattern = false; this.layoutVertexArray = new StructArrayLayout2i4(); this.indexArray = new StructArrayLayout3ui6(); this.segments = new SegmentVector(); this.programConfigurations = new ProgramConfigurationSet(members, options.layers, options.zoom); this.stateDependentLayerIds = this.layers.filter(function (l) { return l.isStateDependent(); }).map(function (l) { return l.id; }); }; CircleBucket.prototype.populate = function populate (features , options ) { for (var i = 0, list = features; i < list.length; i += 1) { var ref = list[i]; var feature = ref.feature; var index = ref.index; var sourceLayerIndex = ref.sourceLayerIndex; if (this.layers[0]._featureFilter(new EvaluationParameters(this.zoom), feature)) { var geometry = loadGeometry(feature); this.addFeature(feature, geometry, index); options.featureIndex.insert(feature, geometry, index, sourceLayerIndex, this.index); } } }; CircleBucket.prototype.update = function update (states , vtLayer , imagePositions ) { if (!this.stateDependentLayers.length) { return; } this.programConfigurations.updatePaintArrays(states, vtLayer, this.stateDependentLayers, imagePositions); }; CircleBucket.prototype.isEmpty = function isEmpty () { return this.layoutVertexArray.length === 0; }; CircleBucket.prototype.uploadPending = function uploadPending () { return !this.uploaded || this.programConfigurations.needsUpload; }; CircleBucket.prototype.upload = function upload (context ) { if (!this.uploaded) { this.layoutVertexBuffer = context.createVertexBuffer(this.layoutVertexArray, members); this.indexBuffer = context.createIndexBuffer(this.indexArray); } this.programConfigurations.upload(context); this.uploaded = true; }; CircleBucket.prototype.destroy = function destroy () { if (!this.layoutVertexBuffer) { return; } this.layoutVertexBuffer.destroy(); this.indexBuffer.destroy(); this.programConfigurations.destroy(); this.segments.destroy(); }; CircleBucket.prototype.addFeature = function addFeature (feature , geometry , index ) { for (var i$1 = 0, list$1 = geometry; i$1 < list$1.length; i$1 += 1) { var ring = list$1[i$1]; for (var i = 0, list = ring; i < list.length; i += 1) { var point = list[i]; var x = point.x; var y = point.y; // Do not include points that are outside the tile boundaries. if (x < 0 || x >= EXTENT || y < 0 || y >= EXTENT) { continue; } // this geometry will be of the Point type, and we'll derive // two triangles from it. // // ┌─────────┐ // │ 3 2 │ // │ │ // │ 0 1 │ // └─────────┘ var segment = this.segments.prepareSegment(4, this.layoutVertexArray, this.indexArray); var index$1 = segment.vertexLength; addCircleVertex(this.layoutVertexArray, x, y, -1, -1); addCircleVertex(this.layoutVertexArray, x, y, 1, -1); addCircleVertex(this.layoutVertexArray, x, y, 1, 1); addCircleVertex(this.layoutVertexArray, x, y, -1, 1); this.indexArray.emplaceBack(index$1, index$1 + 1, index$1 + 2); this.indexArray.emplaceBack(index$1, index$1 + 3, index$1 + 2); segment.vertexLength += 4; segment.primitiveLength += 2; } } this.programConfigurations.populatePaintArrays(this.layoutVertexArray.length, feature, index, {}); }; register('CircleBucket', CircleBucket, {omit: ['layers']}); // function polygonIntersectsPolygon(polygonA , polygonB ) { for (var i = 0; i < polygonA.length; i++) { if (polygonContainsPoint(polygonB, polygonA[i])) { return true; } } for (var i$1 = 0; i$1 < polygonB.length; i$1++) { if (polygonContainsPoint(polygonA, polygonB[i$1])) { return true; } } if (lineIntersectsLine(polygonA, polygonB)) { return true; } return false; } function polygonIntersectsBufferedPoint(polygon , point , radius ) { if (polygonContainsPoint(polygon, point)) { return true; } if (pointIntersectsBufferedLine(point, polygon, radius)) { return true; } return false; } function polygonIntersectsMultiPolygon(polygon , multiPolygon ) { if (polygon.length === 1) { return multiPolygonContainsPoint(multiPolygon, polygon[0]); } for (var m = 0; m < multiPolygon.length; m++) { var ring = multiPolygon[m]; for (var n = 0; n < ring.length; n++) { if (polygonContainsPoint(polygon, ring[n])) { return true; } } } for (var i = 0; i < polygon.length; i++) { if (multiPolygonContainsPoint(multiPolygon, polygon[i])) { return true; } } for (var k = 0; k < multiPolygon.length; k++) { if (lineIntersectsLine(polygon, multiPolygon[k])) { return true; } } return false; } function polygonIntersectsBufferedMultiLine(polygon , multiLine , radius ) { for (var i = 0; i < multiLine.length; i++) { var line = multiLine[i]; if (polygon.length >= 3) { for (var k = 0; k < line.length; k++) { if (polygonContainsPoint(polygon, line[k])) { return true; } } } if (lineIntersectsBufferedLine(polygon, line, radius)) { return true; } } return false; } function lineIntersectsBufferedLine(lineA , lineB , radius ) { if (lineA.length > 1) { if (lineIntersectsLine(lineA, lineB)) { return true; } // Check whether any point in either line is within radius of the other line for (var j = 0; j < lineB.length; j++) { if (pointIntersectsBufferedLine(lineB[j], lineA, radius)) { return true; } } } for (var k = 0; k < lineA.length; k++) { if (pointIntersectsBufferedLine(lineA[k], lineB, radius)) { return true; } } return false; } function lineIntersectsLine(lineA , lineB ) { if (lineA.length === 0 || lineB.length === 0) { return false; } for (var i = 0; i < lineA.length - 1; i++) { var a0 = lineA[i]; var a1 = lineA[i + 1]; for (var j = 0; j < lineB.length - 1; j++) { var b0 = lineB[j]; var b1 = lineB[j + 1]; if (lineSegmentIntersectsLineSegment(a0, a1, b0, b1)) { return true; } } } return false; } function lineSegmentIntersectsLineSegment(a0 , a1 , b0 , b1 ) { return isCounterClockwise(a0, b0, b1) !== isCounterClockwise(a1, b0, b1) && isCounterClockwise(a0, a1, b0) !== isCounterClockwise(a0, a1, b1); } function pointIntersectsBufferedLine(p , line , radius ) { var radiusSquared = radius * radius; if (line.length === 1) { return p.distSqr(line[0]) < radiusSquared; } for (var i = 1; i < line.length; i++) { // Find line segments that have a distance <= radius^2 to p // In that case, we treat the line as "containing point p". var v = line[i - 1], w = line[i]; if (distToSegmentSquared(p, v, w) < radiusSquared) { return true; } } return false; } // Code from http://stackoverflow.com/a/1501725/331379. function distToSegmentSquared(p , v , w ) { var l2 = v.distSqr(w); if (l2 === 0) { return p.distSqr(v); } var t = ((p.x - v.x) * (w.x - v.x) + (p.y - v.y) * (w.y - v.y)) / l2; if (t < 0) { return p.distSqr(v); } if (t > 1) { return p.distSqr(w); } return p.distSqr(w.sub(v)._mult(t)._add(v)); } // point in polygon ray casting algorithm function multiPolygonContainsPoint(rings , p ) { var c = false, ring, p1, p2; for (var k = 0; k < rings.length; k++) { ring = rings[k]; for (var i = 0, j = ring.length - 1; i < ring.length; j = i++) { p1 = ring[i]; p2 = ring[j]; if (((p1.y > p.y) !== (p2.y > p.y)) && (p.x < (p2.x - p1.x) * (p.y - p1.y) / (p2.y - p1.y) + p1.x)) { c = !c; } } } return c; } function polygonContainsPoint(ring , p ) { var c = false; for (var i = 0, j = ring.length - 1; i < ring.length; j = i++) { var p1 = ring[i]; var p2 = ring[j]; if (((p1.y > p.y) !== (p2.y > p.y)) && (p.x < (p2.x - p1.x) * (p.y - p1.y) / (p2.y - p1.y) + p1.x)) { c = !c; } } return c; } function polygonIntersectsBox(ring , boxX1 , boxY1 , boxX2 , boxY2 ) { for (var i$1 = 0, list = ring; i$1 < list.length; i$1 += 1) { var p = list[i$1]; if (boxX1 <= p.x && boxY1 <= p.y && boxX2 >= p.x && boxY2 >= p.y) { return true; } } var corners = [ new pointGeometry(boxX1, boxY1), new pointGeometry(boxX1, boxY2), new pointGeometry(boxX2, boxY2), new pointGeometry(boxX2, boxY1)]; if (ring.length > 2) { for (var i$2 = 0, list$1 = corners; i$2 < list$1.length; i$2 += 1) { var corner = list$1[i$2]; if (polygonContainsPoint(ring, corner)) { return true; } } } for (var i = 0; i < ring.length - 1; i++) { var p1 = ring[i]; var p2 = ring[i + 1]; if (edgeIntersectsBox(p1, p2, corners)) { return true; } } return false; } function edgeIntersectsBox(e1 , e2 , corners ) { var tl = corners[0]; var br = corners[2]; // the edge and box do not intersect in either the x or y dimensions if (((e1.x < tl.x) && (e2.x < tl.x)) || ((e1.x > br.x) && (e2.x > br.x)) || ((e1.y < tl.y) && (e2.y < tl.y)) || ((e1.y > br.y) && (e2.y > br.y))) { return false; } // check if all corners of the box are on the same side of the edge var dir = isCounterClockwise(e1, e2, corners[0]); return dir !== isCounterClockwise(e1, e2, corners[1]) || dir !== isCounterClockwise(e1, e2, corners[2]) || dir !== isCounterClockwise(e1, e2, corners[3]); } // function getMaximumPaintValue(property , layer , bucket ) { var value = ((layer.paint ).get(property) ).value; if (value.kind === 'constant') { return value.value; } else { var binders = bucket.programConfigurations.get(layer.id).binders; return binders[property].maxValue; } } function translateDistance(translate ) { return Math.sqrt(translate[0] * translate[0] + translate[1] * translate[1]); } function translate(queryGeometry , translate , translateAnchor , bearing , pixelsToTileUnits ) { if (!translate[0] && !translate[1]) { return queryGeometry; } var pt = pointGeometry.convert(translate)._mult(pixelsToTileUnits); if (translateAnchor === "viewport") { pt._rotate(-bearing); } var translated = []; for (var i = 0; i < queryGeometry.length; i++) { var point = queryGeometry[i]; translated.push(point.sub(pt)); } return translated; } // This file is generated. Edit build/generate-style-code.js, then run `yarn run codegen`. var paint$1 = new Properties({ "circle-radius": new DataDrivenProperty(spec["paint_circle"]["circle-radius"]), "circle-color": new DataDrivenProperty(spec["paint_circle"]["circle-color"]), "circle-blur": new DataDrivenProperty(spec["paint_circle"]["circle-blur"]), "circle-opacity": new DataDrivenProperty(spec["paint_circle"]["circle-opacity"]), "circle-translate": new DataConstantProperty(spec["paint_circle"]["circle-translate"]), "circle-translate-anchor": new DataConstantProperty(spec["paint_circle"]["circle-translate-anchor"]), "circle-pitch-scale": new DataConstantProperty(spec["paint_circle"]["circle-pitch-scale"]), "circle-pitch-alignment": new DataConstantProperty(spec["paint_circle"]["circle-pitch-alignment"]), "circle-stroke-width": new DataDrivenProperty(spec["paint_circle"]["circle-stroke-width"]), "circle-stroke-color": new DataDrivenProperty(spec["paint_circle"]["circle-stroke-color"]), "circle-stroke-opacity": new DataDrivenProperty(spec["paint_circle"]["circle-stroke-opacity"]), }); // Note: without adding the explicit type annotation, Flow infers weaker types // for these objects from their use in the constructor to StyleLayer, as // {layout?: Properties<...>, paint: Properties<...>} var properties = ({ paint: paint$1 } ); /** * Common utilities * @module glMatrix */ // Configuration Constants var EPSILON = 0.000001; var ARRAY_TYPE = typeof Float32Array !== 'undefined' ? Float32Array : Array; var RANDOM = Math.random; /** * Sets the type of array used when creating new vectors and matrices * * @param {Type} type Array type, such as Float32Array or Array */ function setMatrixArrayType(type) { ARRAY_TYPE = type; } var degree = Math.PI / 180; /** * Convert Degree To Radian * * @param {Number} a Angle in Degrees */ function toRadian(a) { return a * degree; } /** * Tests whether or not the arguments have approximately the same value, within an absolute * or relative tolerance of glMatrix.EPSILON (an absolute tolerance is used for values less * than or equal to 1.0, and a relative tolerance is used for larger values) * * @param {Number} a The first number to test. * @param {Number} b The second number to test. * @returns {Boolean} True if the numbers are approximately equal, false otherwise. */ function equals(a, b) { return Math.abs(a - b) <= EPSILON * Math.max(1.0, Math.abs(a), Math.abs(b)); } /** * 2x2 Matrix * @module mat2 */ /** * Creates a new identity mat2 * * @returns {mat2} a new 2x2 matrix */ function create() { var out = new ARRAY_TYPE(4); if (ARRAY_TYPE != Float32Array) { out[1] = 0; out[2] = 0; } out[0] = 1; out[3] = 1; return out; } /** * Creates a new mat2 initialized with values from an existing matrix * * @param {mat2} a matrix to clone * @returns {mat2} a new 2x2 matrix */ function clone$1(a) { var out = new ARRAY_TYPE(4); out[0] = a[0]; out[1] = a[1]; out[2] = a[2]; out[3] = a[3]; return out; } /** * Copy the values from one mat2 to another * * @param {mat2} out the receiving matrix * @param {mat2} a the source matrix * @returns {mat2} out */ function copy(out, a) { out[0] = a[0]; out[1] = a[1]; out[2] = a[2]; out[3] = a[3]; return out; } /** * Set a mat2 to the identity matrix * * @param {mat2} out the receiving matrix * @returns {mat2} out */ function identity(out) { out[0] = 1; out[1] = 0; out[2] = 0; out[3] = 1; return out; } /** * Create a new mat2 with the given values * * @param {Number} m00 Component in column 0, row 0 position (index 0) * @param {Number} m01 Component in column 0, row 1 position (index 1) * @param {Number} m10 Component in column 1, row 0 position (index 2) * @param {Number} m11 Component in column 1, row 1 position (index 3) * @returns {mat2} out A new 2x2 matrix */ function fromValues(m00, m01, m10, m11) { var out = new ARRAY_TYPE(4); out[0] = m00; out[1] = m01; out[2] = m10; out[3] = m11; return out; } /** * Set the components of a mat2 to the given values * * @param {mat2} out the receiving matrix * @param {Number} m00 Component in column 0, row 0 position (index 0) * @param {Number} m01 Component in column 0, row 1 position (index 1) * @param {Number} m10 Component in column 1, row 0 position (index 2) * @param {Number} m11 Component in column 1, row 1 position (index 3) * @returns {mat2} out */ function set(out, m00, m01, m10, m11) { out[0] = m00; out[1] = m01; out[2] = m10; out[3] = m11; return out; } /** * Transpose the values of a mat2 * * @param {mat2} out the receiving matrix * @param {mat2} a the source matrix * @returns {mat2} out */ function transpose(out, a) { // If we are transposing ourselves we can skip a few steps but have to cache // some values if (out === a) { var a1 = a[1]; out[1] = a[2]; out[2] = a1; } else { out[0] = a[0]; out[1] = a[2]; out[2] = a[1]; out[3] = a[3]; } return out; } /** * Inverts a mat2 * * @param {mat2} out the receiving matrix * @param {mat2} a the source matrix * @returns {mat2} out */ function invert(out, a) { var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3]; // Calculate the determinant var det = a0 * a3 - a2 * a1; if (!det) { return null; } det = 1.0 / det; out[0] = a3 * det; out[1] = -a1 * det; out[2] = -a2 * det; out[3] = a0 * det; return out; } /** * Calculates the adjugate of a mat2 * * @param {mat2} out the receiving matrix * @param {mat2} a the source matrix * @returns {mat2} out */ function adjoint(out, a) { // Caching this value is nessecary if out == a var a0 = a[0]; out[0] = a[3]; out[1] = -a[1]; out[2] = -a[2]; out[3] = a0; return out; } /** * Calculates the determinant of a mat2 * * @param {mat2} a the source matrix * @returns {Number} determinant of a */ function determinant(a) { return a[0] * a[3] - a[2] * a[1]; } /** * Multiplies two mat2's * * @param {mat2} out the receiving matrix * @param {mat2} a the first operand * @param {mat2} b the second operand * @returns {mat2} out */ function multiply(out, a, b) { var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3]; var b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3]; out[0] = a0 * b0 + a2 * b1; out[1] = a1 * b0 + a3 * b1; out[2] = a0 * b2 + a2 * b3; out[3] = a1 * b2 + a3 * b3; return out; } /** * Rotates a mat2 by the given angle * * @param {mat2} out the receiving matrix * @param {mat2} a the matrix to rotate * @param {Number} rad the angle to rotate the matrix by * @returns {mat2} out */ function rotate(out, a, rad) { var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3]; var s = Math.sin(rad); var c = Math.cos(rad); out[0] = a0 * c + a2 * s; out[1] = a1 * c + a3 * s; out[2] = a0 * -s + a2 * c; out[3] = a1 * -s + a3 * c; return out; } /** * Scales the mat2 by the dimensions in the given vec2 * * @param {mat2} out the receiving matrix * @param {mat2} a the matrix to rotate * @param {vec2} v the vec2 to scale the matrix by * @returns {mat2} out **/ function scale(out, a, v) { var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3]; var v0 = v[0], v1 = v[1]; out[0] = a0 * v0; out[1] = a1 * v0; out[2] = a2 * v1; out[3] = a3 * v1; return out; } /** * Creates a matrix from a given angle * This is equivalent to (but much faster than): * * mat2.identity(dest); * mat2.rotate(dest, dest, rad); * * @param {mat2} out mat2 receiving operation result * @param {Number} rad the angle to rotate the matrix by * @returns {mat2} out */ function fromRotation(out, rad) { var s = Math.sin(rad); var c = Math.cos(rad); out[0] = c; out[1] = s; out[2] = -s; out[3] = c; return out; } /** * Creates a matrix from a vector scaling * This is equivalent to (but much faster than): * * mat2.identity(dest); * mat2.scale(dest, dest, vec); * * @param {mat2} out mat2 receiving operation result * @param {vec2} v Scaling vector * @returns {mat2} out */ function fromScaling(out, v) { out[0] = v[0]; out[1] = 0; out[2] = 0; out[3] = v[1]; return out; } /** * Returns a string representation of a mat2 * * @param {mat2} a matrix to represent as a string * @returns {String} string representation of the matrix */ function str(a) { return 'mat2(' + a[0] + ', ' + a[1] + ', ' + a[2] + ', ' + a[3] + ')'; } /** * Returns Frobenius norm of a mat2 * * @param {mat2} a the matrix to calculate Frobenius norm of * @returns {Number} Frobenius norm */ function frob(a) { return Math.sqrt(Math.pow(a[0], 2) + Math.pow(a[1], 2) + Math.pow(a[2], 2) + Math.pow(a[3], 2)); } /** * Returns L, D and U matrices (Lower triangular, Diagonal and Upper triangular) by factorizing the input matrix * @param {mat2} L the lower triangular matrix * @param {mat2} D the diagonal matrix * @param {mat2} U the upper triangular matrix * @param {mat2} a the input matrix to factorize */ function LDU(L, D, U, a) { L[2] = a[2] / a[0]; U[0] = a[0]; U[1] = a[1]; U[3] = a[3] - L[2] * U[1]; return [L, D, U]; } /** * Adds two mat2's * * @param {mat2} out the receiving matrix * @param {mat2} a the first operand * @param {mat2} b the second operand * @returns {mat2} out */ function add(out, a, b) { out[0] = a[0] + b[0]; out[1] = a[1] + b[1]; out[2] = a[2] + b[2]; out[3] = a[3] + b[3]; return out; } /** * Subtracts matrix b from matrix a * * @param {mat2} out the receiving matrix * @param {mat2} a the first operand * @param {mat2} b the second operand * @returns {mat2} out */ function subtract(out, a, b) { out[0] = a[0] - b[0]; out[1] = a[1] - b[1]; out[2] = a[2] - b[2]; out[3] = a[3] - b[3]; return out; } /** * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===) * * @param {mat2} a The first matrix. * @param {mat2} b The second matrix. * @returns {Boolean} True if the matrices are equal, false otherwise. */ function exactEquals(a, b) { return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3]; } /** * Returns whether or not the matrices have approximately the same elements in the same position. * * @param {mat2} a The first matrix. * @param {mat2} b The second matrix. * @returns {Boolean} True if the matrices are equal, false otherwise. */ function equals$1(a, b) { var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3]; var b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3]; return Math.abs(a0 - b0) <= EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)); } /** * Multiply each element of the matrix by a scalar. * * @param {mat2} out the receiving matrix * @param {mat2} a the matrix to scale * @param {Number} b amount to scale the matrix's elements by * @returns {mat2} out */ function multiplyScalar(out, a, b) { out[0] = a[0] * b; out[1] = a[1] * b; out[2] = a[2] * b; out[3] = a[3] * b; return out; } /** * Adds two mat2's after multiplying each element of the second operand by a scalar value. * * @param {mat2} out the receiving vector * @param {mat2} a the first operand * @param {mat2} b the second operand * @param {Number} scale the amount to scale b's elements by before adding * @returns {mat2} out */ function multiplyScalarAndAdd(out, a, b, scale) { out[0] = a[0] + b[0] * scale; out[1] = a[1] + b[1] * scale; out[2] = a[2] + b[2] * scale; out[3] = a[3] + b[3] * scale; return out; } /** * Alias for {@link mat2.multiply} * @function */ var mul = multiply; /** * Alias for {@link mat2.subtract} * @function */ var sub = subtract; /** * 2x3 Matrix * @module mat2d * * @description * A mat2d contains six elements defined as: *
 * [a, c, tx,
 *  b, d, ty]
 * 
* This is a short form for the 3x3 matrix: *
 * [a, c, tx,
 *  b, d, ty,
 *  0, 0, 1]
 * 
* The last row is ignored so the array is shorter and operations are faster. */ /** * Creates a new identity mat2d * * @returns {mat2d} a new 2x3 matrix */ function create$1() { var out = new ARRAY_TYPE(6); if (ARRAY_TYPE != Float32Array) { out[1] = 0; out[2] = 0; out[4] = 0; out[5] = 0; } out[0] = 1; out[3] = 1; return out; } /** * Creates a new mat2d initialized with values from an existing matrix * * @param {mat2d} a matrix to clone * @returns {mat2d} a new 2x3 matrix */ function clone$2(a) { var out = new ARRAY_TYPE(6); out[0] = a[0]; out[1] = a[1]; out[2] = a[2]; out[3] = a[3]; out[4] = a[4]; out[5] = a[5]; return out; } /** * Copy the values from one mat2d to another * * @param {mat2d} out the receiving matrix * @param {mat2d} a the source matrix * @returns {mat2d} out */ function copy$1(out, a) { out[0] = a[0]; out[1] = a[1]; out[2] = a[2]; out[3] = a[3]; out[4] = a[4]; out[5] = a[5]; return out; } /** * Set a mat2d to the identity matrix * * @param {mat2d} out the receiving matrix * @returns {mat2d} out */ function identity$1(out) { out[0] = 1; out[1] = 0; out[2] = 0; out[3] = 1; out[4] = 0; out[5] = 0; return out; } /** * Create a new mat2d with the given values * * @param {Number} a Component A (index 0) * @param {Number} b Component B (index 1) * @param {Number} c Component C (index 2) * @param {Number} d Component D (index 3) * @param {Number} tx Component TX (index 4) * @param {Number} ty Component TY (index 5) * @returns {mat2d} A new mat2d */ function fromValues$1(a, b, c, d, tx, ty) { var out = new ARRAY_TYPE(6); out[0] = a; out[1] = b; out[2] = c; out[3] = d; out[4] = tx; out[5] = ty; return out; } /** * Set the components of a mat2d to the given values * * @param {mat2d} out the receiving matrix * @param {Number} a Component A (index 0) * @param {Number} b Component B (index 1) * @param {Number} c Component C (index 2) * @param {Number} d Component D (index 3) * @param {Number} tx Component TX (index 4) * @param {Number} ty Component TY (index 5) * @returns {mat2d} out */ function set$1(out, a, b, c, d, tx, ty) { out[0] = a; out[1] = b; out[2] = c; out[3] = d; out[4] = tx; out[5] = ty; return out; } /** * Inverts a mat2d * * @param {mat2d} out the receiving matrix * @param {mat2d} a the source matrix * @returns {mat2d} out */ function invert$1(out, a) { var aa = a[0], ab = a[1], ac = a[2], ad = a[3]; var atx = a[4], aty = a[5]; var det = aa * ad - ab * ac; if (!det) { return null; } det = 1.0 / det; out[0] = ad * det; out[1] = -ab * det; out[2] = -ac * det; out[3] = aa * det; out[4] = (ac * aty - ad * atx) * det; out[5] = (ab * atx - aa * aty) * det; return out; } /** * Calculates the determinant of a mat2d * * @param {mat2d} a the source matrix * @returns {Number} determinant of a */ function determinant$1(a) { return a[0] * a[3] - a[1] * a[2]; } /** * Multiplies two mat2d's * * @param {mat2d} out the receiving matrix * @param {mat2d} a the first operand * @param {mat2d} b the second operand * @returns {mat2d} out */ function multiply$1(out, a, b) { var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], a4 = a[4], a5 = a[5]; var b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3], b4 = b[4], b5 = b[5]; out[0] = a0 * b0 + a2 * b1; out[1] = a1 * b0 + a3 * b1; out[2] = a0 * b2 + a2 * b3; out[3] = a1 * b2 + a3 * b3; out[4] = a0 * b4 + a2 * b5 + a4; out[5] = a1 * b4 + a3 * b5 + a5; return out; } /** * Rotates a mat2d by the given angle * * @param {mat2d} out the receiving matrix * @param {mat2d} a the matrix to rotate * @param {Number} rad the angle to rotate the matrix by * @returns {mat2d} out */ function rotate$1(out, a, rad) { var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], a4 = a[4], a5 = a[5]; var s = Math.sin(rad); var c = Math.cos(rad); out[0] = a0 * c + a2 * s; out[1] = a1 * c + a3 * s; out[2] = a0 * -s + a2 * c; out[3] = a1 * -s + a3 * c; out[4] = a4; out[5] = a5; return out; } /** * Scales the mat2d by the dimensions in the given vec2 * * @param {mat2d} out the receiving matrix * @param {mat2d} a the matrix to translate * @param {vec2} v the vec2 to scale the matrix by * @returns {mat2d} out **/ function scale$1(out, a, v) { var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], a4 = a[4], a5 = a[5]; var v0 = v[0], v1 = v[1]; out[0] = a0 * v0; out[1] = a1 * v0; out[2] = a2 * v1; out[3] = a3 * v1; out[4] = a4; out[5] = a5; return out; } /** * Translates the mat2d by the dimensions in the given vec2 * * @param {mat2d} out the receiving matrix * @param {mat2d} a the matrix to translate * @param {vec2} v the vec2 to translate the matrix by * @returns {mat2d} out **/ function translate$1(out, a, v) { var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], a4 = a[4], a5 = a[5]; var v0 = v[0], v1 = v[1]; out[0] = a0; out[1] = a1; out[2] = a2; out[3] = a3; out[4] = a0 * v0 + a2 * v1 + a4; out[5] = a1 * v0 + a3 * v1 + a5; return out; } /** * Creates a matrix from a given angle * This is equivalent to (but much faster than): * * mat2d.identity(dest); * mat2d.rotate(dest, dest, rad); * * @param {mat2d} out mat2d receiving operation result * @param {Number} rad the angle to rotate the matrix by * @returns {mat2d} out */ function fromRotation$1(out, rad) { var s = Math.sin(rad), c = Math.cos(rad); out[0] = c; out[1] = s; out[2] = -s; out[3] = c; out[4] = 0; out[5] = 0; return out; } /** * Creates a matrix from a vector scaling * This is equivalent to (but much faster than): * * mat2d.identity(dest); * mat2d.scale(dest, dest, vec); * * @param {mat2d} out mat2d receiving operation result * @param {vec2} v Scaling vector * @returns {mat2d} out */ function fromScaling$1(out, v) { out[0] = v[0]; out[1] = 0; out[2] = 0; out[3] = v[1]; out[4] = 0; out[5] = 0; return out; } /** * Creates a matrix from a vector translation * This is equivalent to (but much faster than): * * mat2d.identity(dest); * mat2d.translate(dest, dest, vec); * * @param {mat2d} out mat2d receiving operation result * @param {vec2} v Translation vector * @returns {mat2d} out */ function fromTranslation(out, v) { out[0] = 1; out[1] = 0; out[2] = 0; out[3] = 1; out[4] = v[0]; out[5] = v[1]; return out; } /** * Returns a string representation of a mat2d * * @param {mat2d} a matrix to represent as a string * @returns {String} string representation of the matrix */ function str$1(a) { return 'mat2d(' + a[0] + ', ' + a[1] + ', ' + a[2] + ', ' + a[3] + ', ' + a[4] + ', ' + a[5] + ')'; } /** * Returns Frobenius norm of a mat2d * * @param {mat2d} a the matrix to calculate Frobenius norm of * @returns {Number} Frobenius norm */ function frob$1(a) { return Math.sqrt(Math.pow(a[0], 2) + Math.pow(a[1], 2) + Math.pow(a[2], 2) + Math.pow(a[3], 2) + Math.pow(a[4], 2) + Math.pow(a[5], 2) + 1); } /** * Adds two mat2d's * * @param {mat2d} out the receiving matrix * @param {mat2d} a the first operand * @param {mat2d} b the second operand * @returns {mat2d} out */ function add$1(out, a, b) { out[0] = a[0] + b[0]; out[1] = a[1] + b[1]; out[2] = a[2] + b[2]; out[3] = a[3] + b[3]; out[4] = a[4] + b[4]; out[5] = a[5] + b[5]; return out; } /** * Subtracts matrix b from matrix a * * @param {mat2d} out the receiving matrix * @param {mat2d} a the first operand * @param {mat2d} b the second operand * @returns {mat2d} out */ function subtract$1(out, a, b) { out[0] = a[0] - b[0]; out[1] = a[1] - b[1]; out[2] = a[2] - b[2]; out[3] = a[3] - b[3]; out[4] = a[4] - b[4]; out[5] = a[5] - b[5]; return out; } /** * Multiply each element of the matrix by a scalar. * * @param {mat2d} out the receiving matrix * @param {mat2d} a the matrix to scale * @param {Number} b amount to scale the matrix's elements by * @returns {mat2d} out */ function multiplyScalar$1(out, a, b) { out[0] = a[0] * b; out[1] = a[1] * b; out[2] = a[2] * b; out[3] = a[3] * b; out[4] = a[4] * b; out[5] = a[5] * b; return out; } /** * Adds two mat2d's after multiplying each element of the second operand by a scalar value. * * @param {mat2d} out the receiving vector * @param {mat2d} a the first operand * @param {mat2d} b the second operand * @param {Number} scale the amount to scale b's elements by before adding * @returns {mat2d} out */ function multiplyScalarAndAdd$1(out, a, b, scale) { out[0] = a[0] + b[0] * scale; out[1] = a[1] + b[1] * scale; out[2] = a[2] + b[2] * scale; out[3] = a[3] + b[3] * scale; out[4] = a[4] + b[4] * scale; out[5] = a[5] + b[5] * scale; return out; } /** * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===) * * @param {mat2d} a The first matrix. * @param {mat2d} b The second matrix. * @returns {Boolean} True if the matrices are equal, false otherwise. */ function exactEquals$1(a, b) { return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5]; } /** * Returns whether or not the matrices have approximately the same elements in the same position. * * @param {mat2d} a The first matrix. * @param {mat2d} b The second matrix. * @returns {Boolean} True if the matrices are equal, false otherwise. */ function equals$2(a, b) { var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], a4 = a[4], a5 = a[5]; var b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3], b4 = b[4], b5 = b[5]; return Math.abs(a0 - b0) <= EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= EPSILON * Math.max(1.0, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= EPSILON * Math.max(1.0, Math.abs(a5), Math.abs(b5)); } /** * Alias for {@link mat2d.multiply} * @function */ var mul$1 = multiply$1; /** * Alias for {@link mat2d.subtract} * @function */ var sub$1 = subtract$1; /** * 3x3 Matrix * @module mat3 */ /** * Creates a new identity mat3 * * @returns {mat3} a new 3x3 matrix */ function create$2() { var out = new ARRAY_TYPE(9); if (ARRAY_TYPE != Float32Array) { out[1] = 0; out[2] = 0; out[3] = 0; out[5] = 0; out[6] = 0; out[7] = 0; } out[0] = 1; out[4] = 1; out[8] = 1; return out; } /** * Copies the upper-left 3x3 values into the given mat3. * * @param {mat3} out the receiving 3x3 matrix * @param {mat4} a the source 4x4 matrix * @returns {mat3} out */ function fromMat4(out, a) { out[0] = a[0]; out[1] = a[1]; out[2] = a[2]; out[3] = a[4]; out[4] = a[5]; out[5] = a[6]; out[6] = a[8]; out[7] = a[9]; out[8] = a[10]; return out; } /** * Creates a new mat3 initialized with values from an existing matrix * * @param {mat3} a matrix to clone * @returns {mat3} a new 3x3 matrix */ function clone$3(a) { var out = new ARRAY_TYPE(9); out[0] = a[0]; out[1] = a[1]; out[2] = a[2]; out[3] = a[3]; out[4] = a[4]; out[5] = a[5]; out[6] = a[6]; out[7] = a[7]; out[8] = a[8]; return out; } /** * Copy the values from one mat3 to another * * @param {mat3} out the receiving matrix * @param {mat3} a the source matrix * @returns {mat3} out */ function copy$2(out, a) { out[0] = a[0]; out[1] = a[1]; out[2] = a[2]; out[3] = a[3]; out[4] = a[4]; out[5] = a[5]; out[6] = a[6]; out[7] = a[7]; out[8] = a[8]; return out; } /** * Create a new mat3 with the given values * * @param {Number} m00 Component in column 0, row 0 position (index 0) * @param {Number} m01 Component in column 0, row 1 position (index 1) * @param {Number} m02 Component in column 0, row 2 position (index 2) * @param {Number} m10 Component in column 1, row 0 position (index 3) * @param {Number} m11 Component in column 1, row 1 position (index 4) * @param {Number} m12 Component in column 1, row 2 position (index 5) * @param {Number} m20 Component in column 2, row 0 position (index 6) * @param {Number} m21 Component in column 2, row 1 position (index 7) * @param {Number} m22 Component in column 2, row 2 position (index 8) * @returns {mat3} A new mat3 */ function fromValues$2(m00, m01, m02, m10, m11, m12, m20, m21, m22) { var out = new ARRAY_TYPE(9); out[0] = m00; out[1] = m01; out[2] = m02; out[3] = m10; out[4] = m11; out[5] = m12; out[6] = m20; out[7] = m21; out[8] = m22; return out; } /** * Set the components of a mat3 to the given values * * @param {mat3} out the receiving matrix * @param {Number} m00 Component in column 0, row 0 position (index 0) * @param {Number} m01 Component in column 0, row 1 position (index 1) * @param {Number} m02 Component in column 0, row 2 position (index 2) * @param {Number} m10 Component in column 1, row 0 position (index 3) * @param {Number} m11 Component in column 1, row 1 position (index 4) * @param {Number} m12 Component in column 1, row 2 position (index 5) * @param {Number} m20 Component in column 2, row 0 position (index 6) * @param {Number} m21 Component in column 2, row 1 position (index 7) * @param {Number} m22 Component in column 2, row 2 position (index 8) * @returns {mat3} out */ function set$2(out, m00, m01, m02, m10, m11, m12, m20, m21, m22) { out[0] = m00; out[1] = m01; out[2] = m02; out[3] = m10; out[4] = m11; out[5] = m12; out[6] = m20; out[7] = m21; out[8] = m22; return out; } /** * Set a mat3 to the identity matrix * * @param {mat3} out the receiving matrix * @returns {mat3} out */ function identity$2(out) { out[0] = 1; out[1] = 0; out[2] = 0; out[3] = 0; out[4] = 1; out[5] = 0; out[6] = 0; out[7] = 0; out[8] = 1; return out; } /** * Transpose the values of a mat3 * * @param {mat3} out the receiving matrix * @param {mat3} a the source matrix * @returns {mat3} out */ function transpose$1(out, a) { // If we are transposing ourselves we can skip a few steps but have to cache some values if (out === a) { var a01 = a[1], a02 = a[2], a12 = a[5]; out[1] = a[3]; out[2] = a[6]; out[3] = a01; out[5] = a[7]; out[6] = a02; out[7] = a12; } else { out[0] = a[0]; out[1] = a[3]; out[2] = a[6]; out[3] = a[1]; out[4] = a[4]; out[5] = a[7]; out[6] = a[2]; out[7] = a[5]; out[8] = a[8]; } return out; } /** * Inverts a mat3 * * @param {mat3} out the receiving matrix * @param {mat3} a the source matrix * @returns {mat3} out */ function invert$2(out, a) { var a00 = a[0], a01 = a[1], a02 = a[2]; var a10 = a[3], a11 = a[4], a12 = a[5]; var a20 = a[6], a21 = a[7], a22 = a[8]; var b01 = a22 * a11 - a12 * a21; var b11 = -a22 * a10 + a12 * a20; var b21 = a21 * a10 - a11 * a20; // Calculate the determinant var det = a00 * b01 + a01 * b11 + a02 * b21; if (!det) { return null; } det = 1.0 / det; out[0] = b01 * det; out[1] = (-a22 * a01 + a02 * a21) * det; out[2] = (a12 * a01 - a02 * a11) * det; out[3] = b11 * det; out[4] = (a22 * a00 - a02 * a20) * det; out[5] = (-a12 * a00 + a02 * a10) * det; out[6] = b21 * det; out[7] = (-a21 * a00 + a01 * a20) * det; out[8] = (a11 * a00 - a01 * a10) * det; return out; } /** * Calculates the adjugate of a mat3 * * @param {mat3} out the receiving matrix * @param {mat3} a the source matrix * @returns {mat3} out */ function adjoint$1(out, a) { var a00 = a[0], a01 = a[1], a02 = a[2]; var a10 = a[3], a11 = a[4], a12 = a[5]; var a20 = a[6], a21 = a[7], a22 = a[8]; out[0] = a11 * a22 - a12 * a21; out[1] = a02 * a21 - a01 * a22; out[2] = a01 * a12 - a02 * a11; out[3] = a12 * a20 - a10 * a22; out[4] = a00 * a22 - a02 * a20; out[5] = a02 * a10 - a00 * a12; out[6] = a10 * a21 - a11 * a20; out[7] = a01 * a20 - a00 * a21; out[8] = a00 * a11 - a01 * a10; return out; } /** * Calculates the determinant of a mat3 * * @param {mat3} a the source matrix * @returns {Number} determinant of a */ function determinant$2(a) { var a00 = a[0], a01 = a[1], a02 = a[2]; var a10 = a[3], a11 = a[4], a12 = a[5]; var a20 = a[6], a21 = a[7], a22 = a[8]; return a00 * (a22 * a11 - a12 * a21) + a01 * (-a22 * a10 + a12 * a20) + a02 * (a21 * a10 - a11 * a20); } /** * Multiplies two mat3's * * @param {mat3} out the receiving matrix * @param {mat3} a the first operand * @param {mat3} b the second operand * @returns {mat3} out */ function multiply$2(out, a, b) { var a00 = a[0], a01 = a[1], a02 = a[2]; var a10 = a[3], a11 = a[4], a12 = a[5]; var a20 = a[6], a21 = a[7], a22 = a[8]; var b00 = b[0], b01 = b[1], b02 = b[2]; var b10 = b[3], b11 = b[4], b12 = b[5]; var b20 = b[6], b21 = b[7], b22 = b[8]; out[0] = b00 * a00 + b01 * a10 + b02 * a20; out[1] = b00 * a01 + b01 * a11 + b02 * a21; out[2] = b00 * a02 + b01 * a12 + b02 * a22; out[3] = b10 * a00 + b11 * a10 + b12 * a20; out[4] = b10 * a01 + b11 * a11 + b12 * a21; out[5] = b10 * a02 + b11 * a12 + b12 * a22; out[6] = b20 * a00 + b21 * a10 + b22 * a20; out[7] = b20 * a01 + b21 * a11 + b22 * a21; out[8] = b20 * a02 + b21 * a12 + b22 * a22; return out; } /** * Translate a mat3 by the given vector * * @param {mat3} out the receiving matrix * @param {mat3} a the matrix to translate * @param {vec2} v vector to translate by * @returns {mat3} out */ function translate$2(out, a, v) { var a00 = a[0], a01 = a[1], a02 = a[2], a10 = a[3], a11 = a[4], a12 = a[5], a20 = a[6], a21 = a[7], a22 = a[8], x = v[0], y = v[1]; out[0] = a00; out[1] = a01; out[2] = a02; out[3] = a10; out[4] = a11; out[5] = a12; out[6] = x * a00 + y * a10 + a20; out[7] = x * a01 + y * a11 + a21; out[8] = x * a02 + y * a12 + a22; return out; } /** * Rotates a mat3 by the given angle * * @param {mat3} out the receiving matrix * @param {mat3} a the matrix to rotate * @param {Number} rad the angle to rotate the matrix by * @returns {mat3} out */ function rotate$2(out, a, rad) { var a00 = a[0], a01 = a[1], a02 = a[2], a10 = a[3], a11 = a[4], a12 = a[5], a20 = a[6], a21 = a[7], a22 = a[8], s = Math.sin(rad), c = Math.cos(rad); out[0] = c * a00 + s * a10; out[1] = c * a01 + s * a11; out[2] = c * a02 + s * a12; out[3] = c * a10 - s * a00; out[4] = c * a11 - s * a01; out[5] = c * a12 - s * a02; out[6] = a20; out[7] = a21; out[8] = a22; return out; } ; /** * Scales the mat3 by the dimensions in the given vec2 * * @param {mat3} out the receiving matrix * @param {mat3} a the matrix to rotate * @param {vec2} v the vec2 to scale the matrix by * @returns {mat3} out **/ function scale$2(out, a, v) { var x = v[0], y = v[1]; out[0] = x * a[0]; out[1] = x * a[1]; out[2] = x * a[2]; out[3] = y * a[3]; out[4] = y * a[4]; out[5] = y * a[5]; out[6] = a[6]; out[7] = a[7]; out[8] = a[8]; return out; } /** * Creates a matrix from a vector translation * This is equivalent to (but much faster than): * * mat3.identity(dest); * mat3.translate(dest, dest, vec); * * @param {mat3} out mat3 receiving operation result * @param {vec2} v Translation vector * @returns {mat3} out */ function fromTranslation$1(out, v) { out[0] = 1; out[1] = 0; out[2] = 0; out[3] = 0; out[4] = 1; out[5] = 0; out[6] = v[0]; out[7] = v[1]; out[8] = 1; return out; } /** * Creates a matrix from a given angle * This is equivalent to (but much faster than): * * mat3.identity(dest); * mat3.rotate(dest, dest, rad); * * @param {mat3} out mat3 receiving operation result * @param {Number} rad the angle to rotate the matrix by * @returns {mat3} out */ function fromRotation$2(out, rad) { var s = Math.sin(rad), c = Math.cos(rad); out[0] = c; out[1] = s; out[2] = 0; out[3] = -s; out[4] = c; out[5] = 0; out[6] = 0; out[7] = 0; out[8] = 1; return out; } /** * Creates a matrix from a vector scaling * This is equivalent to (but much faster than): * * mat3.identity(dest); * mat3.scale(dest, dest, vec); * * @param {mat3} out mat3 receiving operation result * @param {vec2} v Scaling vector * @returns {mat3} out */ function fromScaling$2(out, v) { out[0] = v[0]; out[1] = 0; out[2] = 0; out[3] = 0; out[4] = v[1]; out[5] = 0; out[6] = 0; out[7] = 0; out[8] = 1; return out; } /** * Copies the values from a mat2d into a mat3 * * @param {mat3} out the receiving matrix * @param {mat2d} a the matrix to copy * @returns {mat3} out **/ function fromMat2d(out, a) { out[0] = a[0]; out[1] = a[1]; out[2] = 0; out[3] = a[2]; out[4] = a[3]; out[5] = 0; out[6] = a[4]; out[7] = a[5]; out[8] = 1; return out; } /** * Calculates a 3x3 matrix from the given quaternion * * @param {mat3} out mat3 receiving operation result * @param {quat} q Quaternion to create matrix from * * @returns {mat3} out */ function fromQuat(out, q) { var x = q[0], y = q[1], z = q[2], w = q[3]; var x2 = x + x; var y2 = y + y; var z2 = z + z; var xx = x * x2; var yx = y * x2; var yy = y * y2; var zx = z * x2; var zy = z * y2; var zz = z * z2; var wx = w * x2; var wy = w * y2; var wz = w * z2; out[0] = 1 - yy - zz; out[3] = yx - wz; out[6] = zx + wy; out[1] = yx + wz; out[4] = 1 - xx - zz; out[7] = zy - wx; out[2] = zx - wy; out[5] = zy + wx; out[8] = 1 - xx - yy; return out; } /** * Calculates a 3x3 normal matrix (transpose inverse) from the 4x4 matrix * * @param {mat3} out mat3 receiving operation result * @param {mat4} a Mat4 to derive the normal matrix from * * @returns {mat3} out */ function normalFromMat4(out, a) { var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3]; var a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7]; var a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11]; var a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15]; var b00 = a00 * a11 - a01 * a10; var b01 = a00 * a12 - a02 * a10; var b02 = a00 * a13 - a03 * a10; var b03 = a01 * a12 - a02 * a11; var b04 = a01 * a13 - a03 * a11; var b05 = a02 * a13 - a03 * a12; var b06 = a20 * a31 - a21 * a30; var b07 = a20 * a32 - a22 * a30; var b08 = a20 * a33 - a23 * a30; var b09 = a21 * a32 - a22 * a31; var b10 = a21 * a33 - a23 * a31; var b11 = a22 * a33 - a23 * a32; // Calculate the determinant var det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06; if (!det) { return null; } det = 1.0 / det; out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det; out[1] = (a12 * b08 - a10 * b11 - a13 * b07) * det; out[2] = (a10 * b10 - a11 * b08 + a13 * b06) * det; out[3] = (a02 * b10 - a01 * b11 - a03 * b09) * det; out[4] = (a00 * b11 - a02 * b08 + a03 * b07) * det; out[5] = (a01 * b08 - a00 * b10 - a03 * b06) * det; out[6] = (a31 * b05 - a32 * b04 + a33 * b03) * det; out[7] = (a32 * b02 - a30 * b05 - a33 * b01) * det; out[8] = (a30 * b04 - a31 * b02 + a33 * b00) * det; return out; } /** * Generates a 2D projection matrix with the given bounds * * @param {mat3} out mat3 frustum matrix will be written into * @param {number} width Width of your gl context * @param {number} height Height of gl context * @returns {mat3} out */ function projection(out, width, height) { out[0] = 2 / width; out[1] = 0; out[2] = 0; out[3] = 0; out[4] = -2 / height; out[5] = 0; out[6] = -1; out[7] = 1; out[8] = 1; return out; } /** * Returns a string representation of a mat3 * * @param {mat3} a matrix to represent as a string * @returns {String} string representation of the matrix */ function str$2(a) { return 'mat3(' + a[0] + ', ' + a[1] + ', ' + a[2] + ', ' + a[3] + ', ' + a[4] + ', ' + a[5] + ', ' + a[6] + ', ' + a[7] + ', ' + a[8] + ')'; } /** * Returns Frobenius norm of a mat3 * * @param {mat3} a the matrix to calculate Frobenius norm of * @returns {Number} Frobenius norm */ function frob$2(a) { return Math.sqrt(Math.pow(a[0], 2) + Math.pow(a[1], 2) + Math.pow(a[2], 2) + Math.pow(a[3], 2) + Math.pow(a[4], 2) + Math.pow(a[5], 2) + Math.pow(a[6], 2) + Math.pow(a[7], 2) + Math.pow(a[8], 2)); } /** * Adds two mat3's * * @param {mat3} out the receiving matrix * @param {mat3} a the first operand * @param {mat3} b the second operand * @returns {mat3} out */ function add$2(out, a, b) { out[0] = a[0] + b[0]; out[1] = a[1] + b[1]; out[2] = a[2] + b[2]; out[3] = a[3] + b[3]; out[4] = a[4] + b[4]; out[5] = a[5] + b[5]; out[6] = a[6] + b[6]; out[7] = a[7] + b[7]; out[8] = a[8] + b[8]; return out; } /** * Subtracts matrix b from matrix a * * @param {mat3} out the receiving matrix * @param {mat3} a the first operand * @param {mat3} b the second operand * @returns {mat3} out */ function subtract$2(out, a, b) { out[0] = a[0] - b[0]; out[1] = a[1] - b[1]; out[2] = a[2] - b[2]; out[3] = a[3] - b[3]; out[4] = a[4] - b[4]; out[5] = a[5] - b[5]; out[6] = a[6] - b[6]; out[7] = a[7] - b[7]; out[8] = a[8] - b[8]; return out; } /** * Multiply each element of the matrix by a scalar. * * @param {mat3} out the receiving matrix * @param {mat3} a the matrix to scale * @param {Number} b amount to scale the matrix's elements by * @returns {mat3} out */ function multiplyScalar$2(out, a, b) { out[0] = a[0] * b; out[1] = a[1] * b; out[2] = a[2] * b; out[3] = a[3] * b; out[4] = a[4] * b; out[5] = a[5] * b; out[6] = a[6] * b; out[7] = a[7] * b; out[8] = a[8] * b; return out; } /** * Adds two mat3's after multiplying each element of the second operand by a scalar value. * * @param {mat3} out the receiving vector * @param {mat3} a the first operand * @param {mat3} b the second operand * @param {Number} scale the amount to scale b's elements by before adding * @returns {mat3} out */ function multiplyScalarAndAdd$2(out, a, b, scale) { out[0] = a[0] + b[0] * scale; out[1] = a[1] + b[1] * scale; out[2] = a[2] + b[2] * scale; out[3] = a[3] + b[3] * scale; out[4] = a[4] + b[4] * scale; out[5] = a[5] + b[5] * scale; out[6] = a[6] + b[6] * scale; out[7] = a[7] + b[7] * scale; out[8] = a[8] + b[8] * scale; return out; } /** * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===) * * @param {mat3} a The first matrix. * @param {mat3} b The second matrix. * @returns {Boolean} True if the matrices are equal, false otherwise. */ function exactEquals$2(a, b) { return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5] && a[6] === b[6] && a[7] === b[7] && a[8] === b[8]; } /** * Returns whether or not the matrices have approximately the same elements in the same position. * * @param {mat3} a The first matrix. * @param {mat3} b The second matrix. * @returns {Boolean} True if the matrices are equal, false otherwise. */ function equals$3(a, b) { var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], a4 = a[4], a5 = a[5], a6 = a[6], a7 = a[7], a8 = a[8]; var b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3], b4 = b[4], b5 = b[5], b6 = b[6], b7 = b[7], b8 = b[8]; return Math.abs(a0 - b0) <= EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= EPSILON * Math.max(1.0, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= EPSILON * Math.max(1.0, Math.abs(a5), Math.abs(b5)) && Math.abs(a6 - b6) <= EPSILON * Math.max(1.0, Math.abs(a6), Math.abs(b6)) && Math.abs(a7 - b7) <= EPSILON * Math.max(1.0, Math.abs(a7), Math.abs(b7)) && Math.abs(a8 - b8) <= EPSILON * Math.max(1.0, Math.abs(a8), Math.abs(b8)); } /** * Alias for {@link mat3.multiply} * @function */ var mul$2 = multiply$2; /** * Alias for {@link mat3.subtract} * @function */ var sub$2 = subtract$2; /** * 4x4 Matrix
Format: column-major, when typed out it looks like row-major
The matrices are being post multiplied. * @module mat4 */ /** * Creates a new identity mat4 * * @returns {mat4} a new 4x4 matrix */ function create$3() { var out = new ARRAY_TYPE(16); if (ARRAY_TYPE != Float32Array) { out[1] = 0; out[2] = 0; out[3] = 0; out[4] = 0; out[6] = 0; out[7] = 0; out[8] = 0; out[9] = 0; out[11] = 0; out[12] = 0; out[13] = 0; out[14] = 0; } out[0] = 1; out[5] = 1; out[10] = 1; out[15] = 1; return out; } /** * Creates a new mat4 initialized with values from an existing matrix * * @param {mat4} a matrix to clone * @returns {mat4} a new 4x4 matrix */ function clone$4(a) { var out = new ARRAY_TYPE(16); out[0] = a[0]; out[1] = a[1]; out[2] = a[2]; out[3] = a[3]; out[4] = a[4]; out[5] = a[5]; out[6] = a[6]; out[7] = a[7]; out[8] = a[8]; out[9] = a[9]; out[10] = a[10]; out[11] = a[11]; out[12] = a[12]; out[13] = a[13]; out[14] = a[14]; out[15] = a[15]; return out; } /** * Copy the values from one mat4 to another * * @param {mat4} out the receiving matrix * @param {mat4} a the source matrix * @returns {mat4} out */ function copy$3(out, a) { out[0] = a[0]; out[1] = a[1]; out[2] = a[2]; out[3] = a[3]; out[4] = a[4]; out[5] = a[5]; out[6] = a[6]; out[7] = a[7]; out[8] = a[8]; out[9] = a[9]; out[10] = a[10]; out[11] = a[11]; out[12] = a[12]; out[13] = a[13]; out[14] = a[14]; out[15] = a[15]; return out; } /** * Create a new mat4 with the given values * * @param {Number} m00 Component in column 0, row 0 position (index 0) * @param {Number} m01 Component in column 0, row 1 position (index 1) * @param {Number} m02 Component in column 0, row 2 position (index 2) * @param {Number} m03 Component in column 0, row 3 position (index 3) * @param {Number} m10 Component in column 1, row 0 position (index 4) * @param {Number} m11 Component in column 1, row 1 position (index 5) * @param {Number} m12 Component in column 1, row 2 position (index 6) * @param {Number} m13 Component in column 1, row 3 position (index 7) * @param {Number} m20 Component in column 2, row 0 position (index 8) * @param {Number} m21 Component in column 2, row 1 position (index 9) * @param {Number} m22 Component in column 2, row 2 position (index 10) * @param {Number} m23 Component in column 2, row 3 position (index 11) * @param {Number} m30 Component in column 3, row 0 position (index 12) * @param {Number} m31 Component in column 3, row 1 position (index 13) * @param {Number} m32 Component in column 3, row 2 position (index 14) * @param {Number} m33 Component in column 3, row 3 position (index 15) * @returns {mat4} A new mat4 */ function fromValues$3(m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) { var out = new ARRAY_TYPE(16); out[0] = m00; out[1] = m01; out[2] = m02; out[3] = m03; out[4] = m10; out[5] = m11; out[6] = m12; out[7] = m13; out[8] = m20; out[9] = m21; out[10] = m22; out[11] = m23; out[12] = m30; out[13] = m31; out[14] = m32; out[15] = m33; return out; } /** * Set the components of a mat4 to the given values * * @param {mat4} out the receiving matrix * @param {Number} m00 Component in column 0, row 0 position (index 0) * @param {Number} m01 Component in column 0, row 1 position (index 1) * @param {Number} m02 Component in column 0, row 2 position (index 2) * @param {Number} m03 Component in column 0, row 3 position (index 3) * @param {Number} m10 Component in column 1, row 0 position (index 4) * @param {Number} m11 Component in column 1, row 1 position (index 5) * @param {Number} m12 Component in column 1, row 2 position (index 6) * @param {Number} m13 Component in column 1, row 3 position (index 7) * @param {Number} m20 Component in column 2, row 0 position (index 8) * @param {Number} m21 Component in column 2, row 1 position (index 9) * @param {Number} m22 Component in column 2, row 2 position (index 10) * @param {Number} m23 Component in column 2, row 3 position (index 11) * @param {Number} m30 Component in column 3, row 0 position (index 12) * @param {Number} m31 Component in column 3, row 1 position (index 13) * @param {Number} m32 Component in column 3, row 2 position (index 14) * @param {Number} m33 Component in column 3, row 3 position (index 15) * @returns {mat4} out */ function set$3(out, m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) { out[0] = m00; out[1] = m01; out[2] = m02; out[3] = m03; out[4] = m10; out[5] = m11; out[6] = m12; out[7] = m13; out[8] = m20; out[9] = m21; out[10] = m22; out[11] = m23; out[12] = m30; out[13] = m31; out[14] = m32; out[15] = m33; return out; } /** * Set a mat4 to the identity matrix * * @param {mat4} out the receiving matrix * @returns {mat4} out */ function identity$3(out) { out[0] = 1; out[1] = 0; out[2] = 0; out[3] = 0; out[4] = 0; out[5] = 1; out[6] = 0; out[7] = 0; out[8] = 0; out[9] = 0; out[10] = 1; out[11] = 0; out[12] = 0; out[13] = 0; out[14] = 0; out[15] = 1; return out; } /** * Transpose the values of a mat4 * * @param {mat4} out the receiving matrix * @param {mat4} a the source matrix * @returns {mat4} out */ function transpose$2(out, a) { // If we are transposing ourselves we can skip a few steps but have to cache some values if (out === a) { var a01 = a[1], a02 = a[2], a03 = a[3]; var a12 = a[6], a13 = a[7]; var a23 = a[11]; out[1] = a[4]; out[2] = a[8]; out[3] = a[12]; out[4] = a01; out[6] = a[9]; out[7] = a[13]; out[8] = a02; out[9] = a12; out[11] = a[14]; out[12] = a03; out[13] = a13; out[14] = a23; } else { out[0] = a[0]; out[1] = a[4]; out[2] = a[8]; out[3] = a[12]; out[4] = a[1]; out[5] = a[5]; out[6] = a[9]; out[7] = a[13]; out[8] = a[2]; out[9] = a[6]; out[10] = a[10]; out[11] = a[14]; out[12] = a[3]; out[13] = a[7]; out[14] = a[11]; out[15] = a[15]; } return out; } /** * Inverts a mat4 * * @param {mat4} out the receiving matrix * @param {mat4} a the source matrix * @returns {mat4} out */ function invert$3(out, a) { var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3]; var a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7]; var a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11]; var a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15]; var b00 = a00 * a11 - a01 * a10; var b01 = a00 * a12 - a02 * a10; var b02 = a00 * a13 - a03 * a10; var b03 = a01 * a12 - a02 * a11; var b04 = a01 * a13 - a03 * a11; var b05 = a02 * a13 - a03 * a12; var b06 = a20 * a31 - a21 * a30; var b07 = a20 * a32 - a22 * a30; var b08 = a20 * a33 - a23 * a30; var b09 = a21 * a32 - a22 * a31; var b10 = a21 * a33 - a23 * a31; var b11 = a22 * a33 - a23 * a32; // Calculate the determinant var det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06; if (!det) { return null; } det = 1.0 / det; out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det; out[1] = (a02 * b10 - a01 * b11 - a03 * b09) * det; out[2] = (a31 * b05 - a32 * b04 + a33 * b03) * det; out[3] = (a22 * b04 - a21 * b05 - a23 * b03) * det; out[4] = (a12 * b08 - a10 * b11 - a13 * b07) * det; out[5] = (a00 * b11 - a02 * b08 + a03 * b07) * det; out[6] = (a32 * b02 - a30 * b05 - a33 * b01) * det; out[7] = (a20 * b05 - a22 * b02 + a23 * b01) * det; out[8] = (a10 * b10 - a11 * b08 + a13 * b06) * det; out[9] = (a01 * b08 - a00 * b10 - a03 * b06) * det; out[10] = (a30 * b04 - a31 * b02 + a33 * b00) * det; out[11] = (a21 * b02 - a20 * b04 - a23 * b00) * det; out[12] = (a11 * b07 - a10 * b09 - a12 * b06) * det; out[13] = (a00 * b09 - a01 * b07 + a02 * b06) * det; out[14] = (a31 * b01 - a30 * b03 - a32 * b00) * det; out[15] = (a20 * b03 - a21 * b01 + a22 * b00) * det; return out; } /** * Calculates the adjugate of a mat4 * * @param {mat4} out the receiving matrix * @param {mat4} a the source matrix * @returns {mat4} out */ function adjoint$2(out, a) { var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3]; var a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7]; var a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11]; var a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15]; out[0] = a11 * (a22 * a33 - a23 * a32) - a21 * (a12 * a33 - a13 * a32) + a31 * (a12 * a23 - a13 * a22); out[1] = -(a01 * (a22 * a33 - a23 * a32) - a21 * (a02 * a33 - a03 * a32) + a31 * (a02 * a23 - a03 * a22)); out[2] = a01 * (a12 * a33 - a13 * a32) - a11 * (a02 * a33 - a03 * a32) + a31 * (a02 * a13 - a03 * a12); out[3] = -(a01 * (a12 * a23 - a13 * a22) - a11 * (a02 * a23 - a03 * a22) + a21 * (a02 * a13 - a03 * a12)); out[4] = -(a10 * (a22 * a33 - a23 * a32) - a20 * (a12 * a33 - a13 * a32) + a30 * (a12 * a23 - a13 * a22)); out[5] = a00 * (a22 * a33 - a23 * a32) - a20 * (a02 * a33 - a03 * a32) + a30 * (a02 * a23 - a03 * a22); out[6] = -(a00 * (a12 * a33 - a13 * a32) - a10 * (a02 * a33 - a03 * a32) + a30 * (a02 * a13 - a03 * a12)); out[7] = a00 * (a12 * a23 - a13 * a22) - a10 * (a02 * a23 - a03 * a22) + a20 * (a02 * a13 - a03 * a12); out[8] = a10 * (a21 * a33 - a23 * a31) - a20 * (a11 * a33 - a13 * a31) + a30 * (a11 * a23 - a13 * a21); out[9] = -(a00 * (a21 * a33 - a23 * a31) - a20 * (a01 * a33 - a03 * a31) + a30 * (a01 * a23 - a03 * a21)); out[10] = a00 * (a11 * a33 - a13 * a31) - a10 * (a01 * a33 - a03 * a31) + a30 * (a01 * a13 - a03 * a11); out[11] = -(a00 * (a11 * a23 - a13 * a21) - a10 * (a01 * a23 - a03 * a21) + a20 * (a01 * a13 - a03 * a11)); out[12] = -(a10 * (a21 * a32 - a22 * a31) - a20 * (a11 * a32 - a12 * a31) + a30 * (a11 * a22 - a12 * a21)); out[13] = a00 * (a21 * a32 - a22 * a31) - a20 * (a01 * a32 - a02 * a31) + a30 * (a01 * a22 - a02 * a21); out[14] = -(a00 * (a11 * a32 - a12 * a31) - a10 * (a01 * a32 - a02 * a31) + a30 * (a01 * a12 - a02 * a11)); out[15] = a00 * (a11 * a22 - a12 * a21) - a10 * (a01 * a22 - a02 * a21) + a20 * (a01 * a12 - a02 * a11); return out; } /** * Calculates the determinant of a mat4 * * @param {mat4} a the source matrix * @returns {Number} determinant of a */ function determinant$3(a) { var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3]; var a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7]; var a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11]; var a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15]; var b00 = a00 * a11 - a01 * a10; var b01 = a00 * a12 - a02 * a10; var b02 = a00 * a13 - a03 * a10; var b03 = a01 * a12 - a02 * a11; var b04 = a01 * a13 - a03 * a11; var b05 = a02 * a13 - a03 * a12; var b06 = a20 * a31 - a21 * a30; var b07 = a20 * a32 - a22 * a30; var b08 = a20 * a33 - a23 * a30; var b09 = a21 * a32 - a22 * a31; var b10 = a21 * a33 - a23 * a31; var b11 = a22 * a33 - a23 * a32; // Calculate the determinant return b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06; } /** * Multiplies two mat4s * * @param {mat4} out the receiving matrix * @param {mat4} a the first operand * @param {mat4} b the second operand * @returns {mat4} out */ function multiply$3(out, a, b) { var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3]; var a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7]; var a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11]; var a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15]; // Cache only the current line of the second matrix var b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3]; out[0] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30; out[1] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31; out[2] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32; out[3] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33; b0 = b[4]; b1 = b[5]; b2 = b[6]; b3 = b[7]; out[4] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30; out[5] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31; out[6] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32; out[7] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33; b0 = b[8]; b1 = b[9]; b2 = b[10]; b3 = b[11]; out[8] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30; out[9] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31; out[10] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32; out[11] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33; b0 = b[12]; b1 = b[13]; b2 = b[14]; b3 = b[15]; out[12] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30; out[13] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31; out[14] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32; out[15] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33; return out; } /** * Translate a mat4 by the given vector * * @param {mat4} out the receiving matrix * @param {mat4} a the matrix to translate * @param {vec3} v vector to translate by * @returns {mat4} out */ function translate$3(out, a, v) { var x = v[0], y = v[1], z = v[2]; var a00, a01, a02, a03; var a10, a11, a12, a13; var a20, a21, a22, a23; if (a === out) { out[12] = a[0] * x + a[4] * y + a[8] * z + a[12]; out[13] = a[1] * x + a[5] * y + a[9] * z + a[13]; out[14] = a[2] * x + a[6] * y + a[10] * z + a[14]; out[15] = a[3] * x + a[7] * y + a[11] * z + a[15]; } else { a00 = a[0]; a01 = a[1]; a02 = a[2]; a03 = a[3]; a10 = a[4]; a11 = a[5]; a12 = a[6]; a13 = a[7]; a20 = a[8]; a21 = a[9]; a22 = a[10]; a23 = a[11]; out[0] = a00; out[1] = a01; out[2] = a02; out[3] = a03; out[4] = a10; out[5] = a11; out[6] = a12; out[7] = a13; out[8] = a20; out[9] = a21; out[10] = a22; out[11] = a23; out[12] = a00 * x + a10 * y + a20 * z + a[12]; out[13] = a01 * x + a11 * y + a21 * z + a[13]; out[14] = a02 * x + a12 * y + a22 * z + a[14]; out[15] = a03 * x + a13 * y + a23 * z + a[15]; } return out; } /** * Scales the mat4 by the dimensions in the given vec3 not using vectorization * * @param {mat4} out the receiving matrix * @param {mat4} a the matrix to scale * @param {vec3} v the vec3 to scale the matrix by * @returns {mat4} out **/ function scale$3(out, a, v) { var x = v[0], y = v[1], z = v[2]; out[0] = a[0] * x; out[1] = a[1] * x; out[2] = a[2] * x; out[3] = a[3] * x; out[4] = a[4] * y; out[5] = a[5] * y; out[6] = a[6] * y; out[7] = a[7] * y; out[8] = a[8] * z; out[9] = a[9] * z; out[10] = a[10] * z; out[11] = a[11] * z; out[12] = a[12]; out[13] = a[13]; out[14] = a[14]; out[15] = a[15]; return out; } /** * Rotates a mat4 by the given angle around the given axis * * @param {mat4} out the receiving matrix * @param {mat4} a the matrix to rotate * @param {Number} rad the angle to rotate the matrix by * @param {vec3} axis the axis to rotate around * @returns {mat4} out */ function rotate$3(out, a, rad, axis) { var x = axis[0], y = axis[1], z = axis[2]; var len = Math.sqrt(x * x + y * y + z * z); var s, c, t; var a00, a01, a02, a03; var a10, a11, a12, a13; var a20, a21, a22, a23; var b00, b01, b02; var b10, b11, b12; var b20, b21, b22; if (len < EPSILON) { return null; } len = 1 / len; x *= len; y *= len; z *= len; s = Math.sin(rad); c = Math.cos(rad); t = 1 - c; a00 = a[0]; a01 = a[1]; a02 = a[2]; a03 = a[3]; a10 = a[4]; a11 = a[5]; a12 = a[6]; a13 = a[7]; a20 = a[8]; a21 = a[9]; a22 = a[10]; a23 = a[11]; // Construct the elements of the rotation matrix b00 = x * x * t + c; b01 = y * x * t + z * s; b02 = z * x * t - y * s; b10 = x * y * t - z * s; b11 = y * y * t + c; b12 = z * y * t + x * s; b20 = x * z * t + y * s; b21 = y * z * t - x * s; b22 = z * z * t + c; // Perform rotation-specific matrix multiplication out[0] = a00 * b00 + a10 * b01 + a20 * b02; out[1] = a01 * b00 + a11 * b01 + a21 * b02; out[2] = a02 * b00 + a12 * b01 + a22 * b02; out[3] = a03 * b00 + a13 * b01 + a23 * b02; out[4] = a00 * b10 + a10 * b11 + a20 * b12; out[5] = a01 * b10 + a11 * b11 + a21 * b12; out[6] = a02 * b10 + a12 * b11 + a22 * b12; out[7] = a03 * b10 + a13 * b11 + a23 * b12; out[8] = a00 * b20 + a10 * b21 + a20 * b22; out[9] = a01 * b20 + a11 * b21 + a21 * b22; out[10] = a02 * b20 + a12 * b21 + a22 * b22; out[11] = a03 * b20 + a13 * b21 + a23 * b22; if (a !== out) { // If the source and destination differ, copy the unchanged last row out[12] = a[12]; out[13] = a[13]; out[14] = a[14]; out[15] = a[15]; } return out; } /** * Rotates a matrix by the given angle around the X axis * * @param {mat4} out the receiving matrix * @param {mat4} a the matrix to rotate * @param {Number} rad the angle to rotate the matrix by * @returns {mat4} out */ function rotateX(out, a, rad) { var s = Math.sin(rad); var c = Math.cos(rad); var a10 = a[4]; var a11 = a[5]; var a12 = a[6]; var a13 = a[7]; var a20 = a[8]; var a21 = a[9]; var a22 = a[10]; var a23 = a[11]; if (a !== out) { // If the source and destination differ, copy the unchanged rows out[0] = a[0]; out[1] = a[1]; out[2] = a[2]; out[3] = a[3]; out[12] = a[12]; out[13] = a[13]; out[14] = a[14]; out[15] = a[15]; } // Perform axis-specific matrix multiplication out[4] = a10 * c + a20 * s; out[5] = a11 * c + a21 * s; out[6] = a12 * c + a22 * s; out[7] = a13 * c + a23 * s; out[8] = a20 * c - a10 * s; out[9] = a21 * c - a11 * s; out[10] = a22 * c - a12 * s; out[11] = a23 * c - a13 * s; return out; } /** * Rotates a matrix by the given angle around the Y axis * * @param {mat4} out the receiving matrix * @param {mat4} a the matrix to rotate * @param {Number} rad the angle to rotate the matrix by * @returns {mat4} out */ function rotateY(out, a, rad) { var s = Math.sin(rad); var c = Math.cos(rad); var a00 = a[0]; var a01 = a[1]; var a02 = a[2]; var a03 = a[3]; var a20 = a[8]; var a21 = a[9]; var a22 = a[10]; var a23 = a[11]; if (a !== out) { // If the source and destination differ, copy the unchanged rows out[4] = a[4]; out[5] = a[5]; out[6] = a[6]; out[7] = a[7]; out[12] = a[12]; out[13] = a[13]; out[14] = a[14]; out[15] = a[15]; } // Perform axis-specific matrix multiplication out[0] = a00 * c - a20 * s; out[1] = a01 * c - a21 * s; out[2] = a02 * c - a22 * s; out[3] = a03 * c - a23 * s; out[8] = a00 * s + a20 * c; out[9] = a01 * s + a21 * c; out[10] = a02 * s + a22 * c; out[11] = a03 * s + a23 * c; return out; } /** * Rotates a matrix by the given angle around the Z axis * * @param {mat4} out the receiving matrix * @param {mat4} a the matrix to rotate * @param {Number} rad the angle to rotate the matrix by * @returns {mat4} out */ function rotateZ(out, a, rad) { var s = Math.sin(rad); var c = Math.cos(rad); var a00 = a[0]; var a01 = a[1]; var a02 = a[2]; var a03 = a[3]; var a10 = a[4]; var a11 = a[5]; var a12 = a[6]; var a13 = a[7]; if (a !== out) { // If the source and destination differ, copy the unchanged last row out[8] = a[8]; out[9] = a[9]; out[10] = a[10]; out[11] = a[11]; out[12] = a[12]; out[13] = a[13]; out[14] = a[14]; out[15] = a[15]; } // Perform axis-specific matrix multiplication out[0] = a00 * c + a10 * s; out[1] = a01 * c + a11 * s; out[2] = a02 * c + a12 * s; out[3] = a03 * c + a13 * s; out[4] = a10 * c - a00 * s; out[5] = a11 * c - a01 * s; out[6] = a12 * c - a02 * s; out[7] = a13 * c - a03 * s; return out; } /** * Creates a matrix from a vector translation * This is equivalent to (but much faster than): * * mat4.identity(dest); * mat4.translate(dest, dest, vec); * * @param {mat4} out mat4 receiving operation result * @param {vec3} v Translation vector * @returns {mat4} out */ function fromTranslation$2(out, v) { out[0] = 1; out[1] = 0; out[2] = 0; out[3] = 0; out[4] = 0; out[5] = 1; out[6] = 0; out[7] = 0; out[8] = 0; out[9] = 0; out[10] = 1; out[11] = 0; out[12] = v[0]; out[13] = v[1]; out[14] = v[2]; out[15] = 1; return out; } /** * Creates a matrix from a vector scaling * This is equivalent to (but much faster than): * * mat4.identity(dest); * mat4.scale(dest, dest, vec); * * @param {mat4} out mat4 receiving operation result * @param {vec3} v Scaling vector * @returns {mat4} out */ function fromScaling$3(out, v) { out[0] = v[0]; out[1] = 0; out[2] = 0; out[3] = 0; out[4] = 0; out[5] = v[1]; out[6] = 0; out[7] = 0; out[8] = 0; out[9] = 0; out[10] = v[2]; out[11] = 0; out[12] = 0; out[13] = 0; out[14] = 0; out[15] = 1; return out; } /** * Creates a matrix from a given angle around a given axis * This is equivalent to (but much faster than): * * mat4.identity(dest); * mat4.rotate(dest, dest, rad, axis); * * @param {mat4} out mat4 receiving operation result * @param {Number} rad the angle to rotate the matrix by * @param {vec3} axis the axis to rotate around * @returns {mat4} out */ function fromRotation$3(out, rad, axis) { var x = axis[0], y = axis[1], z = axis[2]; var len = Math.sqrt(x * x + y * y + z * z); var s, c, t; if (len < EPSILON) { return null; } len = 1 / len; x *= len; y *= len; z *= len; s = Math.sin(rad); c = Math.cos(rad); t = 1 - c; // Perform rotation-specific matrix multiplication out[0] = x * x * t + c; out[1] = y * x * t + z * s; out[2] = z * x * t - y * s; out[3] = 0; out[4] = x * y * t - z * s; out[5] = y * y * t + c; out[6] = z * y * t + x * s; out[7] = 0; out[8] = x * z * t + y * s; out[9] = y * z * t - x * s; out[10] = z * z * t + c; out[11] = 0; out[12] = 0; out[13] = 0; out[14] = 0; out[15] = 1; return out; } /** * Creates a matrix from the given angle around the X axis * This is equivalent to (but much faster than): * * mat4.identity(dest); * mat4.rotateX(dest, dest, rad); * * @param {mat4} out mat4 receiving operation result * @param {Number} rad the angle to rotate the matrix by * @returns {mat4} out */ function fromXRotation(out, rad) { var s = Math.sin(rad); var c = Math.cos(rad); // Perform axis-specific matrix multiplication out[0] = 1; out[1] = 0; out[2] = 0; out[3] = 0; out[4] = 0; out[5] = c; out[6] = s; out[7] = 0; out[8] = 0; out[9] = -s; out[10] = c; out[11] = 0; out[12] = 0; out[13] = 0; out[14] = 0; out[15] = 1; return out; } /** * Creates a matrix from the given angle around the Y axis * This is equivalent to (but much faster than): * * mat4.identity(dest); * mat4.rotateY(dest, dest, rad); * * @param {mat4} out mat4 receiving operation result * @param {Number} rad the angle to rotate the matrix by * @returns {mat4} out */ function fromYRotation(out, rad) { var s = Math.sin(rad); var c = Math.cos(rad); // Perform axis-specific matrix multiplication out[0] = c; out[1] = 0; out[2] = -s; out[3] = 0; out[4] = 0; out[5] = 1; out[6] = 0; out[7] = 0; out[8] = s; out[9] = 0; out[10] = c; out[11] = 0; out[12] = 0; out[13] = 0; out[14] = 0; out[15] = 1; return out; } /** * Creates a matrix from the given angle around the Z axis * This is equivalent to (but much faster than): * * mat4.identity(dest); * mat4.rotateZ(dest, dest, rad); * * @param {mat4} out mat4 receiving operation result * @param {Number} rad the angle to rotate the matrix by * @returns {mat4} out */ function fromZRotation(out, rad) { var s = Math.sin(rad); var c = Math.cos(rad); // Perform axis-specific matrix multiplication out[0] = c; out[1] = s; out[2] = 0; out[3] = 0; out[4] = -s; out[5] = c; out[6] = 0; out[7] = 0; out[8] = 0; out[9] = 0; out[10] = 1; out[11] = 0; out[12] = 0; out[13] = 0; out[14] = 0; out[15] = 1; return out; } /** * Creates a matrix from a quaternion rotation and vector translation * This is equivalent to (but much faster than): * * mat4.identity(dest); * mat4.translate(dest, vec); * let quatMat = mat4.create(); * quat4.toMat4(quat, quatMat); * mat4.multiply(dest, quatMat); * * @param {mat4} out mat4 receiving operation result * @param {quat4} q Rotation quaternion * @param {vec3} v Translation vector * @returns {mat4} out */ function fromRotationTranslation(out, q, v) { // Quaternion math var x = q[0], y = q[1], z = q[2], w = q[3]; var x2 = x + x; var y2 = y + y; var z2 = z + z; var xx = x * x2; var xy = x * y2; var xz = x * z2; var yy = y * y2; var yz = y * z2; var zz = z * z2; var wx = w * x2; var wy = w * y2; var wz = w * z2; out[0] = 1 - (yy + zz); out[1] = xy + wz; out[2] = xz - wy; out[3] = 0; out[4] = xy - wz; out[5] = 1 - (xx + zz); out[6] = yz + wx; out[7] = 0; out[8] = xz + wy; out[9] = yz - wx; out[10] = 1 - (xx + yy); out[11] = 0; out[12] = v[0]; out[13] = v[1]; out[14] = v[2]; out[15] = 1; return out; } /** * Creates a new mat4 from a dual quat. * * @param {mat4} out Matrix * @param {quat2} a Dual Quaternion * @returns {mat4} mat4 receiving operation result */ function fromQuat2(out, a) { var translation = new ARRAY_TYPE(3); var bx = -a[0], by = -a[1], bz = -a[2], bw = a[3], ax = a[4], ay = a[5], az = a[6], aw = a[7]; var magnitude = bx * bx + by * by + bz * bz + bw * bw; //Only scale if it makes sense if (magnitude > 0) { translation[0] = (ax * bw + aw * bx + ay * bz - az * by) * 2 / magnitude; translation[1] = (ay * bw + aw * by + az * bx - ax * bz) * 2 / magnitude; translation[2] = (az * bw + aw * bz + ax * by - ay * bx) * 2 / magnitude; } else { translation[0] = (ax * bw + aw * bx + ay * bz - az * by) * 2; translation[1] = (ay * bw + aw * by + az * bx - ax * bz) * 2; translation[2] = (az * bw + aw * bz + ax * by - ay * bx) * 2; } fromRotationTranslation(out, a, translation); return out; } /** * Returns the translation vector component of a transformation * matrix. If a matrix is built with fromRotationTranslation, * the returned vector will be the same as the translation vector * originally supplied. * @param {vec3} out Vector to receive translation component * @param {mat4} mat Matrix to be decomposed (input) * @return {vec3} out */ function getTranslation(out, mat) { out[0] = mat[12]; out[1] = mat[13]; out[2] = mat[14]; return out; } /** * Returns the scaling factor component of a transformation * matrix. If a matrix is built with fromRotationTranslationScale * with a normalized Quaternion paramter, the returned vector will be * the same as the scaling vector * originally supplied. * @param {vec3} out Vector to receive scaling factor component * @param {mat4} mat Matrix to be decomposed (input) * @return {vec3} out */ function getScaling(out, mat) { var m11 = mat[0]; var m12 = mat[1]; var m13 = mat[2]; var m21 = mat[4]; var m22 = mat[5]; var m23 = mat[6]; var m31 = mat[8]; var m32 = mat[9]; var m33 = mat[10]; out[0] = Math.sqrt(m11 * m11 + m12 * m12 + m13 * m13); out[1] = Math.sqrt(m21 * m21 + m22 * m22 + m23 * m23); out[2] = Math.sqrt(m31 * m31 + m32 * m32 + m33 * m33); return out; } /** * Returns a quaternion representing the rotational component * of a transformation matrix. If a matrix is built with * fromRotationTranslation, the returned quaternion will be the * same as the quaternion originally supplied. * @param {quat} out Quaternion to receive the rotation component * @param {mat4} mat Matrix to be decomposed (input) * @return {quat} out */ function getRotation(out, mat) { // Algorithm taken from http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm var trace = mat[0] + mat[5] + mat[10]; var S = 0; if (trace > 0) { S = Math.sqrt(trace + 1.0) * 2; out[3] = 0.25 * S; out[0] = (mat[6] - mat[9]) / S; out[1] = (mat[8] - mat[2]) / S; out[2] = (mat[1] - mat[4]) / S; } else if (mat[0] > mat[5] && mat[0] > mat[10]) { S = Math.sqrt(1.0 + mat[0] - mat[5] - mat[10]) * 2; out[3] = (mat[6] - mat[9]) / S; out[0] = 0.25 * S; out[1] = (mat[1] + mat[4]) / S; out[2] = (mat[8] + mat[2]) / S; } else if (mat[5] > mat[10]) { S = Math.sqrt(1.0 + mat[5] - mat[0] - mat[10]) * 2; out[3] = (mat[8] - mat[2]) / S; out[0] = (mat[1] + mat[4]) / S; out[1] = 0.25 * S; out[2] = (mat[6] + mat[9]) / S; } else { S = Math.sqrt(1.0 + mat[10] - mat[0] - mat[5]) * 2; out[3] = (mat[1] - mat[4]) / S; out[0] = (mat[8] + mat[2]) / S; out[1] = (mat[6] + mat[9]) / S; out[2] = 0.25 * S; } return out; } /** * Creates a matrix from a quaternion rotation, vector translation and vector scale * This is equivalent to (but much faster than): * * mat4.identity(dest); * mat4.translate(dest, vec); * let quatMat = mat4.create(); * quat4.toMat4(quat, quatMat); * mat4.multiply(dest, quatMat); * mat4.scale(dest, scale) * * @param {mat4} out mat4 receiving operation result * @param {quat4} q Rotation quaternion * @param {vec3} v Translation vector * @param {vec3} s Scaling vector * @returns {mat4} out */ function fromRotationTranslationScale(out, q, v, s) { // Quaternion math var x = q[0], y = q[1], z = q[2], w = q[3]; var x2 = x + x; var y2 = y + y; var z2 = z + z; var xx = x * x2; var xy = x * y2; var xz = x * z2; var yy = y * y2; var yz = y * z2; var zz = z * z2; var wx = w * x2; var wy = w * y2; var wz = w * z2; var sx = s[0]; var sy = s[1]; var sz = s[2]; out[0] = (1 - (yy + zz)) * sx; out[1] = (xy + wz) * sx; out[2] = (xz - wy) * sx; out[3] = 0; out[4] = (xy - wz) * sy; out[5] = (1 - (xx + zz)) * sy; out[6] = (yz + wx) * sy; out[7] = 0; out[8] = (xz + wy) * sz; out[9] = (yz - wx) * sz; out[10] = (1 - (xx + yy)) * sz; out[11] = 0; out[12] = v[0]; out[13] = v[1]; out[14] = v[2]; out[15] = 1; return out; } /** * Creates a matrix from a quaternion rotation, vector translation and vector scale, rotating and scaling around the given origin * This is equivalent to (but much faster than): * * mat4.identity(dest); * mat4.translate(dest, vec); * mat4.translate(dest, origin); * let quatMat = mat4.create(); * quat4.toMat4(quat, quatMat); * mat4.multiply(dest, quatMat); * mat4.scale(dest, scale) * mat4.translate(dest, negativeOrigin); * * @param {mat4} out mat4 receiving operation result * @param {quat4} q Rotation quaternion * @param {vec3} v Translation vector * @param {vec3} s Scaling vector * @param {vec3} o The origin vector around which to scale and rotate * @returns {mat4} out */ function fromRotationTranslationScaleOrigin(out, q, v, s, o) { // Quaternion math var x = q[0], y = q[1], z = q[2], w = q[3]; var x2 = x + x; var y2 = y + y; var z2 = z + z; var xx = x * x2; var xy = x * y2; var xz = x * z2; var yy = y * y2; var yz = y * z2; var zz = z * z2; var wx = w * x2; var wy = w * y2; var wz = w * z2; var sx = s[0]; var sy = s[1]; var sz = s[2]; var ox = o[0]; var oy = o[1]; var oz = o[2]; var out0 = (1 - (yy + zz)) * sx; var out1 = (xy + wz) * sx; var out2 = (xz - wy) * sx; var out4 = (xy - wz) * sy; var out5 = (1 - (xx + zz)) * sy; var out6 = (yz + wx) * sy; var out8 = (xz + wy) * sz; var out9 = (yz - wx) * sz; var out10 = (1 - (xx + yy)) * sz; out[0] = out0; out[1] = out1; out[2] = out2; out[3] = 0; out[4] = out4; out[5] = out5; out[6] = out6; out[7] = 0; out[8] = out8; out[9] = out9; out[10] = out10; out[11] = 0; out[12] = v[0] + ox - (out0 * ox + out4 * oy + out8 * oz); out[13] = v[1] + oy - (out1 * ox + out5 * oy + out9 * oz); out[14] = v[2] + oz - (out2 * ox + out6 * oy + out10 * oz); out[15] = 1; return out; } /** * Calculates a 4x4 matrix from the given quaternion * * @param {mat4} out mat4 receiving operation result * @param {quat} q Quaternion to create matrix from * * @returns {mat4} out */ function fromQuat$1(out, q) { var x = q[0], y = q[1], z = q[2], w = q[3]; var x2 = x + x; var y2 = y + y; var z2 = z + z; var xx = x * x2; var yx = y * x2; var yy = y * y2; var zx = z * x2; var zy = z * y2; var zz = z * z2; var wx = w * x2; var wy = w * y2; var wz = w * z2; out[0] = 1 - yy - zz; out[1] = yx + wz; out[2] = zx - wy; out[3] = 0; out[4] = yx - wz; out[5] = 1 - xx - zz; out[6] = zy + wx; out[7] = 0; out[8] = zx + wy; out[9] = zy - wx; out[10] = 1 - xx - yy; out[11] = 0; out[12] = 0; out[13] = 0; out[14] = 0; out[15] = 1; return out; } /** * Generates a frustum matrix with the given bounds * * @param {mat4} out mat4 frustum matrix will be written into * @param {Number} left Left bound of the frustum * @param {Number} right Right bound of the frustum * @param {Number} bottom Bottom bound of the frustum * @param {Number} top Top bound of the frustum * @param {Number} near Near bound of the frustum * @param {Number} far Far bound of the frustum * @returns {mat4} out */ function frustum(out, left, right, bottom, top, near, far) { var rl = 1 / (right - left); var tb = 1 / (top - bottom); var nf = 1 / (near - far); out[0] = near * 2 * rl; out[1] = 0; out[2] = 0; out[3] = 0; out[4] = 0; out[5] = near * 2 * tb; out[6] = 0; out[7] = 0; out[8] = (right + left) * rl; out[9] = (top + bottom) * tb; out[10] = (far + near) * nf; out[11] = -1; out[12] = 0; out[13] = 0; out[14] = far * near * 2 * nf; out[15] = 0; return out; } /** * Generates a perspective projection matrix with the given bounds. * Passing null/undefined/no value for far will generate infinite projection matrix. * * @param {mat4} out mat4 frustum matrix will be written into * @param {number} fovy Vertical field of view in radians * @param {number} aspect Aspect ratio. typically viewport width/height * @param {number} near Near bound of the frustum * @param {number} far Far bound of the frustum, can be null or Infinity * @returns {mat4} out */ function perspective(out, fovy, aspect, near, far) { var f = 1.0 / Math.tan(fovy / 2), nf; out[0] = f / aspect; out[1] = 0; out[2] = 0; out[3] = 0; out[4] = 0; out[5] = f; out[6] = 0; out[7] = 0; out[8] = 0; out[9] = 0; out[11] = -1; out[12] = 0; out[13] = 0; out[15] = 0; if (far != null && far !== Infinity) { nf = 1 / (near - far); out[10] = (far + near) * nf; out[14] = 2 * far * near * nf; } else { out[10] = -1; out[14] = -2 * near; } return out; } /** * Generates a perspective projection matrix with the given field of view. * This is primarily useful for generating projection matrices to be used * with the still experiemental WebVR API. * * @param {mat4} out mat4 frustum matrix will be written into * @param {Object} fov Object containing the following values: upDegrees, downDegrees, leftDegrees, rightDegrees * @param {number} near Near bound of the frustum * @param {number} far Far bound of the frustum * @returns {mat4} out */ function perspectiveFromFieldOfView(out, fov, near, far) { var upTan = Math.tan(fov.upDegrees * Math.PI / 180.0); var downTan = Math.tan(fov.downDegrees * Math.PI / 180.0); var leftTan = Math.tan(fov.leftDegrees * Math.PI / 180.0); var rightTan = Math.tan(fov.rightDegrees * Math.PI / 180.0); var xScale = 2.0 / (leftTan + rightTan); var yScale = 2.0 / (upTan + downTan); out[0] = xScale; out[1] = 0.0; out[2] = 0.0; out[3] = 0.0; out[4] = 0.0; out[5] = yScale; out[6] = 0.0; out[7] = 0.0; out[8] = -((leftTan - rightTan) * xScale * 0.5); out[9] = (upTan - downTan) * yScale * 0.5; out[10] = far / (near - far); out[11] = -1.0; out[12] = 0.0; out[13] = 0.0; out[14] = far * near / (near - far); out[15] = 0.0; return out; } /** * Generates a orthogonal projection matrix with the given bounds * * @param {mat4} out mat4 frustum matrix will be written into * @param {number} left Left bound of the frustum * @param {number} right Right bound of the frustum * @param {number} bottom Bottom bound of the frustum * @param {number} top Top bound of the frustum * @param {number} near Near bound of the frustum * @param {number} far Far bound of the frustum * @returns {mat4} out */ function ortho(out, left, right, bottom, top, near, far) { var lr = 1 / (left - right); var bt = 1 / (bottom - top); var nf = 1 / (near - far); out[0] = -2 * lr; out[1] = 0; out[2] = 0; out[3] = 0; out[4] = 0; out[5] = -2 * bt; out[6] = 0; out[7] = 0; out[8] = 0; out[9] = 0; out[10] = 2 * nf; out[11] = 0; out[12] = (left + right) * lr; out[13] = (top + bottom) * bt; out[14] = (far + near) * nf; out[15] = 1; return out; } /** * Generates a look-at matrix with the given eye position, focal point, and up axis. * If you want a matrix that actually makes an object look at another object, you should use targetTo instead. * * @param {mat4} out mat4 frustum matrix will be written into * @param {vec3} eye Position of the viewer * @param {vec3} center Point the viewer is looking at * @param {vec3} up vec3 pointing up * @returns {mat4} out */ function lookAt(out, eye, center, up) { var x0, x1, x2, y0, y1, y2, z0, z1, z2, len; var eyex = eye[0]; var eyey = eye[1]; var eyez = eye[2]; var upx = up[0]; var upy = up[1]; var upz = up[2]; var centerx = center[0]; var centery = center[1]; var centerz = center[2]; if (Math.abs(eyex - centerx) < EPSILON && Math.abs(eyey - centery) < EPSILON && Math.abs(eyez - centerz) < EPSILON) { return identity$3(out); } z0 = eyex - centerx; z1 = eyey - centery; z2 = eyez - centerz; len = 1 / Math.sqrt(z0 * z0 + z1 * z1 + z2 * z2); z0 *= len; z1 *= len; z2 *= len; x0 = upy * z2 - upz * z1; x1 = upz * z0 - upx * z2; x2 = upx * z1 - upy * z0; len = Math.sqrt(x0 * x0 + x1 * x1 + x2 * x2); if (!len) { x0 = 0; x1 = 0; x2 = 0; } else { len = 1 / len; x0 *= len; x1 *= len; x2 *= len; } y0 = z1 * x2 - z2 * x1; y1 = z2 * x0 - z0 * x2; y2 = z0 * x1 - z1 * x0; len = Math.sqrt(y0 * y0 + y1 * y1 + y2 * y2); if (!len) { y0 = 0; y1 = 0; y2 = 0; } else { len = 1 / len; y0 *= len; y1 *= len; y2 *= len; } out[0] = x0; out[1] = y0; out[2] = z0; out[3] = 0; out[4] = x1; out[5] = y1; out[6] = z1; out[7] = 0; out[8] = x2; out[9] = y2; out[10] = z2; out[11] = 0; out[12] = -(x0 * eyex + x1 * eyey + x2 * eyez); out[13] = -(y0 * eyex + y1 * eyey + y2 * eyez); out[14] = -(z0 * eyex + z1 * eyey + z2 * eyez); out[15] = 1; return out; } /** * Generates a matrix that makes something look at something else. * * @param {mat4} out mat4 frustum matrix will be written into * @param {vec3} eye Position of the viewer * @param {vec3} center Point the viewer is looking at * @param {vec3} up vec3 pointing up * @returns {mat4} out */ function targetTo(out, eye, target, up) { var eyex = eye[0], eyey = eye[1], eyez = eye[2], upx = up[0], upy = up[1], upz = up[2]; var z0 = eyex - target[0], z1 = eyey - target[1], z2 = eyez - target[2]; var len = z0 * z0 + z1 * z1 + z2 * z2; if (len > 0) { len = 1 / Math.sqrt(len); z0 *= len; z1 *= len; z2 *= len; } var x0 = upy * z2 - upz * z1, x1 = upz * z0 - upx * z2, x2 = upx * z1 - upy * z0; len = x0 * x0 + x1 * x1 + x2 * x2; if (len > 0) { len = 1 / Math.sqrt(len); x0 *= len; x1 *= len; x2 *= len; } out[0] = x0; out[1] = x1; out[2] = x2; out[3] = 0; out[4] = z1 * x2 - z2 * x1; out[5] = z2 * x0 - z0 * x2; out[6] = z0 * x1 - z1 * x0; out[7] = 0; out[8] = z0; out[9] = z1; out[10] = z2; out[11] = 0; out[12] = eyex; out[13] = eyey; out[14] = eyez; out[15] = 1; return out; } ; /** * Returns a string representation of a mat4 * * @param {mat4} a matrix to represent as a string * @returns {String} string representation of the matrix */ function str$3(a) { return 'mat4(' + a[0] + ', ' + a[1] + ', ' + a[2] + ', ' + a[3] + ', ' + a[4] + ', ' + a[5] + ', ' + a[6] + ', ' + a[7] + ', ' + a[8] + ', ' + a[9] + ', ' + a[10] + ', ' + a[11] + ', ' + a[12] + ', ' + a[13] + ', ' + a[14] + ', ' + a[15] + ')'; } /** * Returns Frobenius norm of a mat4 * * @param {mat4} a the matrix to calculate Frobenius norm of * @returns {Number} Frobenius norm */ function frob$3(a) { return Math.sqrt(Math.pow(a[0], 2) + Math.pow(a[1], 2) + Math.pow(a[2], 2) + Math.pow(a[3], 2) + Math.pow(a[4], 2) + Math.pow(a[5], 2) + Math.pow(a[6], 2) + Math.pow(a[7], 2) + Math.pow(a[8], 2) + Math.pow(a[9], 2) + Math.pow(a[10], 2) + Math.pow(a[11], 2) + Math.pow(a[12], 2) + Math.pow(a[13], 2) + Math.pow(a[14], 2) + Math.pow(a[15], 2)); } /** * Adds two mat4's * * @param {mat4} out the receiving matrix * @param {mat4} a the first operand * @param {mat4} b the second operand * @returns {mat4} out */ function add$3(out, a, b) { out[0] = a[0] + b[0]; out[1] = a[1] + b[1]; out[2] = a[2] + b[2]; out[3] = a[3] + b[3]; out[4] = a[4] + b[4]; out[5] = a[5] + b[5]; out[6] = a[6] + b[6]; out[7] = a[7] + b[7]; out[8] = a[8] + b[8]; out[9] = a[9] + b[9]; out[10] = a[10] + b[10]; out[11] = a[11] + b[11]; out[12] = a[12] + b[12]; out[13] = a[13] + b[13]; out[14] = a[14] + b[14]; out[15] = a[15] + b[15]; return out; } /** * Subtracts matrix b from matrix a * * @param {mat4} out the receiving matrix * @param {mat4} a the first operand * @param {mat4} b the second operand * @returns {mat4} out */ function subtract$3(out, a, b) { out[0] = a[0] - b[0]; out[1] = a[1] - b[1]; out[2] = a[2] - b[2]; out[3] = a[3] - b[3]; out[4] = a[4] - b[4]; out[5] = a[5] - b[5]; out[6] = a[6] - b[6]; out[7] = a[7] - b[7]; out[8] = a[8] - b[8]; out[9] = a[9] - b[9]; out[10] = a[10] - b[10]; out[11] = a[11] - b[11]; out[12] = a[12] - b[12]; out[13] = a[13] - b[13]; out[14] = a[14] - b[14]; out[15] = a[15] - b[15]; return out; } /** * Multiply each element of the matrix by a scalar. * * @param {mat4} out the receiving matrix * @param {mat4} a the matrix to scale * @param {Number} b amount to scale the matrix's elements by * @returns {mat4} out */ function multiplyScalar$3(out, a, b) { out[0] = a[0] * b; out[1] = a[1] * b; out[2] = a[2] * b; out[3] = a[3] * b; out[4] = a[4] * b; out[5] = a[5] * b; out[6] = a[6] * b; out[7] = a[7] * b; out[8] = a[8] * b; out[9] = a[9] * b; out[10] = a[10] * b; out[11] = a[11] * b; out[12] = a[12] * b; out[13] = a[13] * b; out[14] = a[14] * b; out[15] = a[15] * b; return out; } /** * Adds two mat4's after multiplying each element of the second operand by a scalar value. * * @param {mat4} out the receiving vector * @param {mat4} a the first operand * @param {mat4} b the second operand * @param {Number} scale the amount to scale b's elements by before adding * @returns {mat4} out */ function multiplyScalarAndAdd$3(out, a, b, scale) { out[0] = a[0] + b[0] * scale; out[1] = a[1] + b[1] * scale; out[2] = a[2] + b[2] * scale; out[3] = a[3] + b[3] * scale; out[4] = a[4] + b[4] * scale; out[5] = a[5] + b[5] * scale; out[6] = a[6] + b[6] * scale; out[7] = a[7] + b[7] * scale; out[8] = a[8] + b[8] * scale; out[9] = a[9] + b[9] * scale; out[10] = a[10] + b[10] * scale; out[11] = a[11] + b[11] * scale; out[12] = a[12] + b[12] * scale; out[13] = a[13] + b[13] * scale; out[14] = a[14] + b[14] * scale; out[15] = a[15] + b[15] * scale; return out; } /** * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===) * * @param {mat4} a The first matrix. * @param {mat4} b The second matrix. * @returns {Boolean} True if the matrices are equal, false otherwise. */ function exactEquals$3(a, b) { return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5] && a[6] === b[6] && a[7] === b[7] && a[8] === b[8] && a[9] === b[9] && a[10] === b[10] && a[11] === b[11] && a[12] === b[12] && a[13] === b[13] && a[14] === b[14] && a[15] === b[15]; } /** * Returns whether or not the matrices have approximately the same elements in the same position. * * @param {mat4} a The first matrix. * @param {mat4} b The second matrix. * @returns {Boolean} True if the matrices are equal, false otherwise. */ function equals$4(a, b) { var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3]; var a4 = a[4], a5 = a[5], a6 = a[6], a7 = a[7]; var a8 = a[8], a9 = a[9], a10 = a[10], a11 = a[11]; var a12 = a[12], a13 = a[13], a14 = a[14], a15 = a[15]; var b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3]; var b4 = b[4], b5 = b[5], b6 = b[6], b7 = b[7]; var b8 = b[8], b9 = b[9], b10 = b[10], b11 = b[11]; var b12 = b[12], b13 = b[13], b14 = b[14], b15 = b[15]; return Math.abs(a0 - b0) <= EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= EPSILON * Math.max(1.0, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= EPSILON * Math.max(1.0, Math.abs(a5), Math.abs(b5)) && Math.abs(a6 - b6) <= EPSILON * Math.max(1.0, Math.abs(a6), Math.abs(b6)) && Math.abs(a7 - b7) <= EPSILON * Math.max(1.0, Math.abs(a7), Math.abs(b7)) && Math.abs(a8 - b8) <= EPSILON * Math.max(1.0, Math.abs(a8), Math.abs(b8)) && Math.abs(a9 - b9) <= EPSILON * Math.max(1.0, Math.abs(a9), Math.abs(b9)) && Math.abs(a10 - b10) <= EPSILON * Math.max(1.0, Math.abs(a10), Math.abs(b10)) && Math.abs(a11 - b11) <= EPSILON * Math.max(1.0, Math.abs(a11), Math.abs(b11)) && Math.abs(a12 - b12) <= EPSILON * Math.max(1.0, Math.abs(a12), Math.abs(b12)) && Math.abs(a13 - b13) <= EPSILON * Math.max(1.0, Math.abs(a13), Math.abs(b13)) && Math.abs(a14 - b14) <= EPSILON * Math.max(1.0, Math.abs(a14), Math.abs(b14)) && Math.abs(a15 - b15) <= EPSILON * Math.max(1.0, Math.abs(a15), Math.abs(b15)); } /** * Alias for {@link mat4.multiply} * @function */ var mul$3 = multiply$3; /** * Alias for {@link mat4.subtract} * @function */ var sub$3 = subtract$3; /** * 3 Dimensional Vector * @module vec3 */ /** * Creates a new, empty vec3 * * @returns {vec3} a new 3D vector */ function create$4() { var out = new ARRAY_TYPE(3); if (ARRAY_TYPE != Float32Array) { out[0] = 0; out[1] = 0; out[2] = 0; } return out; } /** * Creates a new vec3 initialized with values from an existing vector * * @param {vec3} a vector to clone * @returns {vec3} a new 3D vector */ function clone$5(a) { var out = new ARRAY_TYPE(3); out[0] = a[0]; out[1] = a[1]; out[2] = a[2]; return out; } /** * Calculates the length of a vec3 * * @param {vec3} a vector to calculate length of * @returns {Number} length of a */ function length(a) { var x = a[0]; var y = a[1]; var z = a[2]; return Math.sqrt(x * x + y * y + z * z); } /** * Creates a new vec3 initialized with the given values * * @param {Number} x X component * @param {Number} y Y component * @param {Number} z Z component * @returns {vec3} a new 3D vector */ function fromValues$4(x, y, z) { var out = new ARRAY_TYPE(3); out[0] = x; out[1] = y; out[2] = z; return out; } /** * Copy the values from one vec3 to another * * @param {vec3} out the receiving vector * @param {vec3} a the source vector * @returns {vec3} out */ function copy$4(out, a) { out[0] = a[0]; out[1] = a[1]; out[2] = a[2]; return out; } /** * Set the components of a vec3 to the given values * * @param {vec3} out the receiving vector * @param {Number} x X component * @param {Number} y Y component * @param {Number} z Z component * @returns {vec3} out */ function set$4(out, x, y, z) { out[0] = x; out[1] = y; out[2] = z; return out; } /** * Adds two vec3's * * @param {vec3} out the receiving vector * @param {vec3} a the first operand * @param {vec3} b the second operand * @returns {vec3} out */ function add$4(out, a, b) { out[0] = a[0] + b[0]; out[1] = a[1] + b[1]; out[2] = a[2] + b[2]; return out; } /** * Subtracts vector b from vector a * * @param {vec3} out the receiving vector * @param {vec3} a the first operand * @param {vec3} b the second operand * @returns {vec3} out */ function subtract$4(out, a, b) { out[0] = a[0] - b[0]; out[1] = a[1] - b[1]; out[2] = a[2] - b[2]; return out; } /** * Multiplies two vec3's * * @param {vec3} out the receiving vector * @param {vec3} a the first operand * @param {vec3} b the second operand * @returns {vec3} out */ function multiply$4(out, a, b) { out[0] = a[0] * b[0]; out[1] = a[1] * b[1]; out[2] = a[2] * b[2]; return out; } /** * Divides two vec3's * * @param {vec3} out the receiving vector * @param {vec3} a the first operand * @param {vec3} b the second operand * @returns {vec3} out */ function divide(out, a, b) { out[0] = a[0] / b[0]; out[1] = a[1] / b[1]; out[2] = a[2] / b[2]; return out; } /** * Math.ceil the components of a vec3 * * @param {vec3} out the receiving vector * @param {vec3} a vector to ceil * @returns {vec3} out */ function ceil(out, a) { out[0] = Math.ceil(a[0]); out[1] = Math.ceil(a[1]); out[2] = Math.ceil(a[2]); return out; } /** * Math.floor the components of a vec3 * * @param {vec3} out the receiving vector * @param {vec3} a vector to floor * @returns {vec3} out */ function floor(out, a) { out[0] = Math.floor(a[0]); out[1] = Math.floor(a[1]); out[2] = Math.floor(a[2]); return out; } /** * Returns the minimum of two vec3's * * @param {vec3} out the receiving vector * @param {vec3} a the first operand * @param {vec3} b the second operand * @returns {vec3} out */ function min(out, a, b) { out[0] = Math.min(a[0], b[0]); out[1] = Math.min(a[1], b[1]); out[2] = Math.min(a[2], b[2]); return out; } /** * Returns the maximum of two vec3's * * @param {vec3} out the receiving vector * @param {vec3} a the first operand * @param {vec3} b the second operand * @returns {vec3} out */ function max(out, a, b) { out[0] = Math.max(a[0], b[0]); out[1] = Math.max(a[1], b[1]); out[2] = Math.max(a[2], b[2]); return out; } /** * Math.round the components of a vec3 * * @param {vec3} out the receiving vector * @param {vec3} a vector to round * @returns {vec3} out */ function round(out, a) { out[0] = Math.round(a[0]); out[1] = Math.round(a[1]); out[2] = Math.round(a[2]); return out; } /** * Scales a vec3 by a scalar number * * @param {vec3} out the receiving vector * @param {vec3} a the vector to scale * @param {Number} b amount to scale the vector by * @returns {vec3} out */ function scale$4(out, a, b) { out[0] = a[0] * b; out[1] = a[1] * b; out[2] = a[2] * b; return out; } /** * Adds two vec3's after scaling the second operand by a scalar value * * @param {vec3} out the receiving vector * @param {vec3} a the first operand * @param {vec3} b the second operand * @param {Number} scale the amount to scale b by before adding * @returns {vec3} out */ function scaleAndAdd(out, a, b, scale) { out[0] = a[0] + b[0] * scale; out[1] = a[1] + b[1] * scale; out[2] = a[2] + b[2] * scale; return out; } /** * Calculates the euclidian distance between two vec3's * * @param {vec3} a the first operand * @param {vec3} b the second operand * @returns {Number} distance between a and b */ function distance(a, b) { var x = b[0] - a[0]; var y = b[1] - a[1]; var z = b[2] - a[2]; return Math.sqrt(x * x + y * y + z * z); } /** * Calculates the squared euclidian distance between two vec3's * * @param {vec3} a the first operand * @param {vec3} b the second operand * @returns {Number} squared distance between a and b */ function squaredDistance(a, b) { var x = b[0] - a[0]; var y = b[1] - a[1]; var z = b[2] - a[2]; return x * x + y * y + z * z; } /** * Calculates the squared length of a vec3 * * @param {vec3} a vector to calculate squared length of * @returns {Number} squared length of a */ function squaredLength(a) { var x = a[0]; var y = a[1]; var z = a[2]; return x * x + y * y + z * z; } /** * Negates the components of a vec3 * * @param {vec3} out the receiving vector * @param {vec3} a vector to negate * @returns {vec3} out */ function negate(out, a) { out[0] = -a[0]; out[1] = -a[1]; out[2] = -a[2]; return out; } /** * Returns the inverse of the components of a vec3 * * @param {vec3} out the receiving vector * @param {vec3} a vector to invert * @returns {vec3} out */ function inverse(out, a) { out[0] = 1.0 / a[0]; out[1] = 1.0 / a[1]; out[2] = 1.0 / a[2]; return out; } /** * Normalize a vec3 * * @param {vec3} out the receiving vector * @param {vec3} a vector to normalize * @returns {vec3} out */ function normalize(out, a) { var x = a[0]; var y = a[1]; var z = a[2]; var len = x * x + y * y + z * z; if (len > 0) { //TODO: evaluate use of glm_invsqrt here? len = 1 / Math.sqrt(len); } out[0] = a[0] * len; out[1] = a[1] * len; out[2] = a[2] * len; return out; } /** * Calculates the dot product of two vec3's * * @param {vec3} a the first operand * @param {vec3} b the second operand * @returns {Number} dot product of a and b */ function dot(a, b) { return a[0] * b[0] + a[1] * b[1] + a[2] * b[2]; } /** * Computes the cross product of two vec3's * * @param {vec3} out the receiving vector * @param {vec3} a the first operand * @param {vec3} b the second operand * @returns {vec3} out */ function cross(out, a, b) { var ax = a[0], ay = a[1], az = a[2]; var bx = b[0], by = b[1], bz = b[2]; out[0] = ay * bz - az * by; out[1] = az * bx - ax * bz; out[2] = ax * by - ay * bx; return out; } /** * Performs a linear interpolation between two vec3's * * @param {vec3} out the receiving vector * @param {vec3} a the first operand * @param {vec3} b the second operand * @param {Number} t interpolation amount, in the range [0-1], between the two inputs * @returns {vec3} out */ function lerp(out, a, b, t) { var ax = a[0]; var ay = a[1]; var az = a[2]; out[0] = ax + t * (b[0] - ax); out[1] = ay + t * (b[1] - ay); out[2] = az + t * (b[2] - az); return out; } /** * Performs a hermite interpolation with two control points * * @param {vec3} out the receiving vector * @param {vec3} a the first operand * @param {vec3} b the second operand * @param {vec3} c the third operand * @param {vec3} d the fourth operand * @param {Number} t interpolation amount, in the range [0-1], between the two inputs * @returns {vec3} out */ function hermite(out, a, b, c, d, t) { var factorTimes2 = t * t; var factor1 = factorTimes2 * (2 * t - 3) + 1; var factor2 = factorTimes2 * (t - 2) + t; var factor3 = factorTimes2 * (t - 1); var factor4 = factorTimes2 * (3 - 2 * t); out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4; out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4; out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4; return out; } /** * Performs a bezier interpolation with two control points * * @param {vec3} out the receiving vector * @param {vec3} a the first operand * @param {vec3} b the second operand * @param {vec3} c the third operand * @param {vec3} d the fourth operand * @param {Number} t interpolation amount, in the range [0-1], between the two inputs * @returns {vec3} out */ function bezier$1(out, a, b, c, d, t) { var inverseFactor = 1 - t; var inverseFactorTimesTwo = inverseFactor * inverseFactor; var factorTimes2 = t * t; var factor1 = inverseFactorTimesTwo * inverseFactor; var factor2 = 3 * t * inverseFactorTimesTwo; var factor3 = 3 * factorTimes2 * inverseFactor; var factor4 = factorTimes2 * t; out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4; out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4; out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4; return out; } /** * Generates a random vector with the given scale * * @param {vec3} out the receiving vector * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned * @returns {vec3} out */ function random(out, scale) { scale = scale || 1.0; var r = RANDOM() * 2.0 * Math.PI; var z = RANDOM() * 2.0 - 1.0; var zScale = Math.sqrt(1.0 - z * z) * scale; out[0] = Math.cos(r) * zScale; out[1] = Math.sin(r) * zScale; out[2] = z * scale; return out; } /** * Transforms the vec3 with a mat4. * 4th vector component is implicitly '1' * * @param {vec3} out the receiving vector * @param {vec3} a the vector to transform * @param {mat4} m matrix to transform with * @returns {vec3} out */ function transformMat4(out, a, m) { var x = a[0], y = a[1], z = a[2]; var w = m[3] * x + m[7] * y + m[11] * z + m[15]; w = w || 1.0; out[0] = (m[0] * x + m[4] * y + m[8] * z + m[12]) / w; out[1] = (m[1] * x + m[5] * y + m[9] * z + m[13]) / w; out[2] = (m[2] * x + m[6] * y + m[10] * z + m[14]) / w; return out; } /** * Transforms the vec3 with a mat3. * * @param {vec3} out the receiving vector * @param {vec3} a the vector to transform * @param {mat3} m the 3x3 matrix to transform with * @returns {vec3} out */ function transformMat3(out, a, m) { var x = a[0], y = a[1], z = a[2]; out[0] = x * m[0] + y * m[3] + z * m[6]; out[1] = x * m[1] + y * m[4] + z * m[7]; out[2] = x * m[2] + y * m[5] + z * m[8]; return out; } /** * Transforms the vec3 with a quat * Can also be used for dual quaternions. (Multiply it with the real part) * * @param {vec3} out the receiving vector * @param {vec3} a the vector to transform * @param {quat} q quaternion to transform with * @returns {vec3} out */ function transformQuat(out, a, q) { // benchmarks: https://jsperf.com/quaternion-transform-vec3-implementations-fixed var qx = q[0], qy = q[1], qz = q[2], qw = q[3]; var x = a[0], y = a[1], z = a[2]; // var qvec = [qx, qy, qz]; // var uv = vec3.cross([], qvec, a); var uvx = qy * z - qz * y, uvy = qz * x - qx * z, uvz = qx * y - qy * x; // var uuv = vec3.cross([], qvec, uv); var uuvx = qy * uvz - qz * uvy, uuvy = qz * uvx - qx * uvz, uuvz = qx * uvy - qy * uvx; // vec3.scale(uv, uv, 2 * w); var w2 = qw * 2; uvx *= w2; uvy *= w2; uvz *= w2; // vec3.scale(uuv, uuv, 2); uuvx *= 2; uuvy *= 2; uuvz *= 2; // return vec3.add(out, a, vec3.add(out, uv, uuv)); out[0] = x + uvx + uuvx; out[1] = y + uvy + uuvy; out[2] = z + uvz + uuvz; return out; } /** * Rotate a 3D vector around the x-axis * @param {vec3} out The receiving vec3 * @param {vec3} a The vec3 point to rotate * @param {vec3} b The origin of the rotation * @param {Number} c The angle of rotation * @returns {vec3} out */ function rotateX$1(out, a, b, c) { var p = [], r = []; //Translate point to the origin p[0] = a[0] - b[0]; p[1] = a[1] - b[1]; p[2] = a[2] - b[2]; //perform rotation r[0] = p[0]; r[1] = p[1] * Math.cos(c) - p[2] * Math.sin(c); r[2] = p[1] * Math.sin(c) + p[2] * Math.cos(c); //translate to correct position out[0] = r[0] + b[0]; out[1] = r[1] + b[1]; out[2] = r[2] + b[2]; return out; } /** * Rotate a 3D vector around the y-axis * @param {vec3} out The receiving vec3 * @param {vec3} a The vec3 point to rotate * @param {vec3} b The origin of the rotation * @param {Number} c The angle of rotation * @returns {vec3} out */ function rotateY$1(out, a, b, c) { var p = [], r = []; //Translate point to the origin p[0] = a[0] - b[0]; p[1] = a[1] - b[1]; p[2] = a[2] - b[2]; //perform rotation r[0] = p[2] * Math.sin(c) + p[0] * Math.cos(c); r[1] = p[1]; r[2] = p[2] * Math.cos(c) - p[0] * Math.sin(c); //translate to correct position out[0] = r[0] + b[0]; out[1] = r[1] + b[1]; out[2] = r[2] + b[2]; return out; } /** * Rotate a 3D vector around the z-axis * @param {vec3} out The receiving vec3 * @param {vec3} a The vec3 point to rotate * @param {vec3} b The origin of the rotation * @param {Number} c The angle of rotation * @returns {vec3} out */ function rotateZ$1(out, a, b, c) { var p = [], r = []; //Translate point to the origin p[0] = a[0] - b[0]; p[1] = a[1] - b[1]; p[2] = a[2] - b[2]; //perform rotation r[0] = p[0] * Math.cos(c) - p[1] * Math.sin(c); r[1] = p[0] * Math.sin(c) + p[1] * Math.cos(c); r[2] = p[2]; //translate to correct position out[0] = r[0] + b[0]; out[1] = r[1] + b[1]; out[2] = r[2] + b[2]; return out; } /** * Get the angle between two 3D vectors * @param {vec3} a The first operand * @param {vec3} b The second operand * @returns {Number} The angle in radians */ function angle(a, b) { var tempA = fromValues$4(a[0], a[1], a[2]); var tempB = fromValues$4(b[0], b[1], b[2]); normalize(tempA, tempA); normalize(tempB, tempB); var cosine = dot(tempA, tempB); if (cosine > 1.0) { return 0; } else if (cosine < -1.0) { return Math.PI; } else { return Math.acos(cosine); } } /** * Set the components of a vec3 to zero * * @param {vec3} out the receiving vector * @returns {vec3} out */ function zero(out) { out[0] = 0.0; out[1] = 0.0; out[2] = 0.0; return out; } /** * Returns a string representation of a vector * * @param {vec3} a vector to represent as a string * @returns {String} string representation of the vector */ function str$4(a) { return 'vec3(' + a[0] + ', ' + a[1] + ', ' + a[2] + ')'; } /** * Returns whether or not the vectors have exactly the same elements in the same position (when compared with ===) * * @param {vec3} a The first vector. * @param {vec3} b The second vector. * @returns {Boolean} True if the vectors are equal, false otherwise. */ function exactEquals$4(a, b) { return a[0] === b[0] && a[1] === b[1] && a[2] === b[2]; } /** * Returns whether or not the vectors have approximately the same elements in the same position. * * @param {vec3} a The first vector. * @param {vec3} b The second vector. * @returns {Boolean} True if the vectors are equal, false otherwise. */ function equals$5(a, b) { var a0 = a[0], a1 = a[1], a2 = a[2]; var b0 = b[0], b1 = b[1], b2 = b[2]; return Math.abs(a0 - b0) <= EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)); } /** * Alias for {@link vec3.subtract} * @function */ var sub$4 = subtract$4; /** * Alias for {@link vec3.multiply} * @function */ var mul$4 = multiply$4; /** * Alias for {@link vec3.divide} * @function */ var div = divide; /** * Alias for {@link vec3.distance} * @function */ var dist = distance; /** * Alias for {@link vec3.squaredDistance} * @function */ var sqrDist = squaredDistance; /** * Alias for {@link vec3.length} * @function */ var len = length; /** * Alias for {@link vec3.squaredLength} * @function */ var sqrLen = squaredLength; /** * Perform some operation over an array of vec3s. * * @param {Array} a the array of vectors to iterate over * @param {Number} stride Number of elements between the start of each vec3. If 0 assumes tightly packed * @param {Number} offset Number of elements to skip at the beginning of the array * @param {Number} count Number of vec3s to iterate over. If 0 iterates over entire array * @param {Function} fn Function to call for each vector in the array * @param {Object} [arg] additional argument to pass to fn * @returns {Array} a * @function */ var forEach = function () { var vec = create$4(); return function (a, stride, offset, count, fn, arg) { var i, l; if (!stride) { stride = 3; } if (!offset) { offset = 0; } if (count) { l = Math.min(count * stride + offset, a.length); } else { l = a.length; } for (i = offset; i < l; i += stride) { vec[0] = a[i]; vec[1] = a[i + 1]; vec[2] = a[i + 2]; fn(vec, vec, arg); a[i] = vec[0]; a[i + 1] = vec[1]; a[i + 2] = vec[2]; } return a; }; }(); /** * 4 Dimensional Vector * @module vec4 */ /** * Creates a new, empty vec4 * * @returns {vec4} a new 4D vector */ function create$5() { var out = new ARRAY_TYPE(4); if (ARRAY_TYPE != Float32Array) { out[0] = 0; out[1] = 0; out[2] = 0; out[3] = 0; } return out; } /** * Creates a new vec4 initialized with values from an existing vector * * @param {vec4} a vector to clone * @returns {vec4} a new 4D vector */ function clone$6(a) { var out = new ARRAY_TYPE(4); out[0] = a[0]; out[1] = a[1]; out[2] = a[2]; out[3] = a[3]; return out; } /** * Creates a new vec4 initialized with the given values * * @param {Number} x X component * @param {Number} y Y component * @param {Number} z Z component * @param {Number} w W component * @returns {vec4} a new 4D vector */ function fromValues$5(x, y, z, w) { var out = new ARRAY_TYPE(4); out[0] = x; out[1] = y; out[2] = z; out[3] = w; return out; } /** * Copy the values from one vec4 to another * * @param {vec4} out the receiving vector * @param {vec4} a the source vector * @returns {vec4} out */ function copy$5(out, a) { out[0] = a[0]; out[1] = a[1]; out[2] = a[2]; out[3] = a[3]; return out; } /** * Set the components of a vec4 to the given values * * @param {vec4} out the receiving vector * @param {Number} x X component * @param {Number} y Y component * @param {Number} z Z component * @param {Number} w W component * @returns {vec4} out */ function set$5(out, x, y, z, w) { out[0] = x; out[1] = y; out[2] = z; out[3] = w; return out; } /** * Adds two vec4's * * @param {vec4} out the receiving vector * @param {vec4} a the first operand * @param {vec4} b the second operand * @returns {vec4} out */ function add$5(out, a, b) { out[0] = a[0] + b[0]; out[1] = a[1] + b[1]; out[2] = a[2] + b[2]; out[3] = a[3] + b[3]; return out; } /** * Subtracts vector b from vector a * * @param {vec4} out the receiving vector * @param {vec4} a the first operand * @param {vec4} b the second operand * @returns {vec4} out */ function subtract$5(out, a, b) { out[0] = a[0] - b[0]; out[1] = a[1] - b[1]; out[2] = a[2] - b[2]; out[3] = a[3] - b[3]; return out; } /** * Multiplies two vec4's * * @param {vec4} out the receiving vector * @param {vec4} a the first operand * @param {vec4} b the second operand * @returns {vec4} out */ function multiply$5(out, a, b) { out[0] = a[0] * b[0]; out[1] = a[1] * b[1]; out[2] = a[2] * b[2]; out[3] = a[3] * b[3]; return out; } /** * Divides two vec4's * * @param {vec4} out the receiving vector * @param {vec4} a the first operand * @param {vec4} b the second operand * @returns {vec4} out */ function divide$1(out, a, b) { out[0] = a[0] / b[0]; out[1] = a[1] / b[1]; out[2] = a[2] / b[2]; out[3] = a[3] / b[3]; return out; } /** * Math.ceil the components of a vec4 * * @param {vec4} out the receiving vector * @param {vec4} a vector to ceil * @returns {vec4} out */ function ceil$1(out, a) { out[0] = Math.ceil(a[0]); out[1] = Math.ceil(a[1]); out[2] = Math.ceil(a[2]); out[3] = Math.ceil(a[3]); return out; } /** * Math.floor the components of a vec4 * * @param {vec4} out the receiving vector * @param {vec4} a vector to floor * @returns {vec4} out */ function floor$1(out, a) { out[0] = Math.floor(a[0]); out[1] = Math.floor(a[1]); out[2] = Math.floor(a[2]); out[3] = Math.floor(a[3]); return out; } /** * Returns the minimum of two vec4's * * @param {vec4} out the receiving vector * @param {vec4} a the first operand * @param {vec4} b the second operand * @returns {vec4} out */ function min$1(out, a, b) { out[0] = Math.min(a[0], b[0]); out[1] = Math.min(a[1], b[1]); out[2] = Math.min(a[2], b[2]); out[3] = Math.min(a[3], b[3]); return out; } /** * Returns the maximum of two vec4's * * @param {vec4} out the receiving vector * @param {vec4} a the first operand * @param {vec4} b the second operand * @returns {vec4} out */ function max$1(out, a, b) { out[0] = Math.max(a[0], b[0]); out[1] = Math.max(a[1], b[1]); out[2] = Math.max(a[2], b[2]); out[3] = Math.max(a[3], b[3]); return out; } /** * Math.round the components of a vec4 * * @param {vec4} out the receiving vector * @param {vec4} a vector to round * @returns {vec4} out */ function round$1(out, a) { out[0] = Math.round(a[0]); out[1] = Math.round(a[1]); out[2] = Math.round(a[2]); out[3] = Math.round(a[3]); return out; } /** * Scales a vec4 by a scalar number * * @param {vec4} out the receiving vector * @param {vec4} a the vector to scale * @param {Number} b amount to scale the vector by * @returns {vec4} out */ function scale$5(out, a, b) { out[0] = a[0] * b; out[1] = a[1] * b; out[2] = a[2] * b; out[3] = a[3] * b; return out; } /** * Adds two vec4's after scaling the second operand by a scalar value * * @param {vec4} out the receiving vector * @param {vec4} a the first operand * @param {vec4} b the second operand * @param {Number} scale the amount to scale b by before adding * @returns {vec4} out */ function scaleAndAdd$1(out, a, b, scale) { out[0] = a[0] + b[0] * scale; out[1] = a[1] + b[1] * scale; out[2] = a[2] + b[2] * scale; out[3] = a[3] + b[3] * scale; return out; } /** * Calculates the euclidian distance between two vec4's * * @param {vec4} a the first operand * @param {vec4} b the second operand * @returns {Number} distance between a and b */ function distance$1(a, b) { var x = b[0] - a[0]; var y = b[1] - a[1]; var z = b[2] - a[2]; var w = b[3] - a[3]; return Math.sqrt(x * x + y * y + z * z + w * w); } /** * Calculates the squared euclidian distance between two vec4's * * @param {vec4} a the first operand * @param {vec4} b the second operand * @returns {Number} squared distance between a and b */ function squaredDistance$1(a, b) { var x = b[0] - a[0]; var y = b[1] - a[1]; var z = b[2] - a[2]; var w = b[3] - a[3]; return x * x + y * y + z * z + w * w; } /** * Calculates the length of a vec4 * * @param {vec4} a vector to calculate length of * @returns {Number} length of a */ function length$1(a) { var x = a[0]; var y = a[1]; var z = a[2]; var w = a[3]; return Math.sqrt(x * x + y * y + z * z + w * w); } /** * Calculates the squared length of a vec4 * * @param {vec4} a vector to calculate squared length of * @returns {Number} squared length of a */ function squaredLength$1(a) { var x = a[0]; var y = a[1]; var z = a[2]; var w = a[3]; return x * x + y * y + z * z + w * w; } /** * Negates the components of a vec4 * * @param {vec4} out the receiving vector * @param {vec4} a vector to negate * @returns {vec4} out */ function negate$1(out, a) { out[0] = -a[0]; out[1] = -a[1]; out[2] = -a[2]; out[3] = -a[3]; return out; } /** * Returns the inverse of the components of a vec4 * * @param {vec4} out the receiving vector * @param {vec4} a vector to invert * @returns {vec4} out */ function inverse$1(out, a) { out[0] = 1.0 / a[0]; out[1] = 1.0 / a[1]; out[2] = 1.0 / a[2]; out[3] = 1.0 / a[3]; return out; } /** * Normalize a vec4 * * @param {vec4} out the receiving vector * @param {vec4} a vector to normalize * @returns {vec4} out */ function normalize$1(out, a) { var x = a[0]; var y = a[1]; var z = a[2]; var w = a[3]; var len = x * x + y * y + z * z + w * w; if (len > 0) { len = 1 / Math.sqrt(len); } out[0] = x * len; out[1] = y * len; out[2] = z * len; out[3] = w * len; return out; } /** * Calculates the dot product of two vec4's * * @param {vec4} a the first operand * @param {vec4} b the second operand * @returns {Number} dot product of a and b */ function dot$1(a, b) { return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3]; } /** * Returns the cross-product of three vectors in a 4-dimensional space * * @param {vec4} result the receiving vector * @param {vec4} U the first vector * @param {vec4} V the second vector * @param {vec4} W the third vector * @returns {vec4} result */ function cross$1(out, u, v, w) { var A = v[0] * w[1] - v[1] * w[0], B = v[0] * w[2] - v[2] * w[0], C = v[0] * w[3] - v[3] * w[0], D = v[1] * w[2] - v[2] * w[1], E = v[1] * w[3] - v[3] * w[1], F = v[2] * w[3] - v[3] * w[2]; var G = u[0]; var H = u[1]; var I = u[2]; var J = u[3]; out[0] = H * F - I * E + J * D; out[1] = -(G * F) + I * C - J * B; out[2] = G * E - H * C + J * A; out[3] = -(G * D) + H * B - I * A; return out; } ; /** * Performs a linear interpolation between two vec4's * * @param {vec4} out the receiving vector * @param {vec4} a the first operand * @param {vec4} b the second operand * @param {Number} t interpolation amount, in the range [0-1], between the two inputs * @returns {vec4} out */ function lerp$1(out, a, b, t) { var ax = a[0]; var ay = a[1]; var az = a[2]; var aw = a[3]; out[0] = ax + t * (b[0] - ax); out[1] = ay + t * (b[1] - ay); out[2] = az + t * (b[2] - az); out[3] = aw + t * (b[3] - aw); return out; } /** * Generates a random vector with the given scale * * @param {vec4} out the receiving vector * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned * @returns {vec4} out */ function random$1(out, scale) { scale = scale || 1.0; // Marsaglia, George. Choosing a Point from the Surface of a // Sphere. Ann. Math. Statist. 43 (1972), no. 2, 645--646. // http://projecteuclid.org/euclid.aoms/1177692644; var v1, v2, v3, v4; var s1, s2; do { v1 = RANDOM() * 2 - 1; v2 = RANDOM() * 2 - 1; s1 = v1 * v1 + v2 * v2; } while (s1 >= 1); do { v3 = RANDOM() * 2 - 1; v4 = RANDOM() * 2 - 1; s2 = v3 * v3 + v4 * v4; } while (s2 >= 1); var d = Math.sqrt((1 - s1) / s2); out[0] = scale * v1; out[1] = scale * v2; out[2] = scale * v3 * d; out[3] = scale * v4 * d; return out; } /** * Transforms the vec4 with a mat4. * * @param {vec4} out the receiving vector * @param {vec4} a the vector to transform * @param {mat4} m matrix to transform with * @returns {vec4} out */ function transformMat4$1(out, a, m) { var x = a[0], y = a[1], z = a[2], w = a[3]; out[0] = m[0] * x + m[4] * y + m[8] * z + m[12] * w; out[1] = m[1] * x + m[5] * y + m[9] * z + m[13] * w; out[2] = m[2] * x + m[6] * y + m[10] * z + m[14] * w; out[3] = m[3] * x + m[7] * y + m[11] * z + m[15] * w; return out; } /** * Transforms the vec4 with a quat * * @param {vec4} out the receiving vector * @param {vec4} a the vector to transform * @param {quat} q quaternion to transform with * @returns {vec4} out */ function transformQuat$1(out, a, q) { var x = a[0], y = a[1], z = a[2]; var qx = q[0], qy = q[1], qz = q[2], qw = q[3]; // calculate quat * vec 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 out[0] = ix * qw + iw * -qx + iy * -qz - iz * -qy; out[1] = iy * qw + iw * -qy + iz * -qx - ix * -qz; out[2] = iz * qw + iw * -qz + ix * -qy - iy * -qx; out[3] = a[3]; return out; } /** * Set the components of a vec4 to zero * * @param {vec4} out the receiving vector * @returns {vec4} out */ function zero$1(out) { out[0] = 0.0; out[1] = 0.0; out[2] = 0.0; out[3] = 0.0; return out; } /** * Returns a string representation of a vector * * @param {vec4} a vector to represent as a string * @returns {String} string representation of the vector */ function str$5(a) { return 'vec4(' + a[0] + ', ' + a[1] + ', ' + a[2] + ', ' + a[3] + ')'; } /** * Returns whether or not the vectors have exactly the same elements in the same position (when compared with ===) * * @param {vec4} a The first vector. * @param {vec4} b The second vector. * @returns {Boolean} True if the vectors are equal, false otherwise. */ function exactEquals$5(a, b) { return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3]; } /** * Returns whether or not the vectors have approximately the same elements in the same position. * * @param {vec4} a The first vector. * @param {vec4} b The second vector. * @returns {Boolean} True if the vectors are equal, false otherwise. */ function equals$6(a, b) { var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3]; var b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3]; return Math.abs(a0 - b0) <= EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)); } /** * Alias for {@link vec4.subtract} * @function */ var sub$5 = subtract$5; /** * Alias for {@link vec4.multiply} * @function */ var mul$5 = multiply$5; /** * Alias for {@link vec4.divide} * @function */ var div$1 = divide$1; /** * Alias for {@link vec4.distance} * @function */ var dist$1 = distance$1; /** * Alias for {@link vec4.squaredDistance} * @function */ var sqrDist$1 = squaredDistance$1; /** * Alias for {@link vec4.length} * @function */ var len$1 = length$1; /** * Alias for {@link vec4.squaredLength} * @function */ var sqrLen$1 = squaredLength$1; /** * Perform some operation over an array of vec4s. * * @param {Array} a the array of vectors to iterate over * @param {Number} stride Number of elements between the start of each vec4. If 0 assumes tightly packed * @param {Number} offset Number of elements to skip at the beginning of the array * @param {Number} count Number of vec4s to iterate over. If 0 iterates over entire array * @param {Function} fn Function to call for each vector in the array * @param {Object} [arg] additional argument to pass to fn * @returns {Array} a * @function */ var forEach$1 = function () { var vec = create$5(); return function (a, stride, offset, count, fn, arg) { var i, l; if (!stride) { stride = 4; } if (!offset) { offset = 0; } if (count) { l = Math.min(count * stride + offset, a.length); } else { l = a.length; } for (i = offset; i < l; i += stride) { vec[0] = a[i]; vec[1] = a[i + 1]; vec[2] = a[i + 2]; vec[3] = a[i + 3]; fn(vec, vec, arg); a[i] = vec[0]; a[i + 1] = vec[1]; a[i + 2] = vec[2]; a[i + 3] = vec[3]; } return a; }; }(); /** * Quaternion * @module quat */ /** * Creates a new identity quat * * @returns {quat} a new quaternion */ function create$6() { var out = new ARRAY_TYPE(4); if (ARRAY_TYPE != Float32Array) { out[0] = 0; out[1] = 0; out[2] = 0; } out[3] = 1; return out; } /** * Set a quat to the identity quaternion * * @param {quat} out the receiving quaternion * @returns {quat} out */ function identity$4(out) { out[0] = 0; out[1] = 0; out[2] = 0; out[3] = 1; return out; } /** * Sets a quat from the given angle and rotation axis, * then returns it. * * @param {quat} out the receiving quaternion * @param {vec3} axis the axis around which to rotate * @param {Number} rad the angle in radians * @returns {quat} out **/ function setAxisAngle(out, axis, rad) { rad = rad * 0.5; var s = Math.sin(rad); out[0] = s * axis[0]; out[1] = s * axis[1]; out[2] = s * axis[2]; out[3] = Math.cos(rad); return out; } /** * Gets the rotation axis and angle for a given * quaternion. If a quaternion is created with * setAxisAngle, this method will return the same * values as providied in the original parameter list * OR functionally equivalent values. * Example: The quaternion formed by axis [0, 0, 1] and * angle -90 is the same as the quaternion formed by * [0, 0, 1] and 270. This method favors the latter. * @param {vec3} out_axis Vector receiving the axis of rotation * @param {quat} q Quaternion to be decomposed * @return {Number} Angle, in radians, of the rotation */ function getAxisAngle(out_axis, q) { var rad = Math.acos(q[3]) * 2.0; var s = Math.sin(rad / 2.0); if (s > EPSILON) { out_axis[0] = q[0] / s; out_axis[1] = q[1] / s; out_axis[2] = q[2] / s; } else { // If s is zero, return any axis (no rotation - axis does not matter) out_axis[0] = 1; out_axis[1] = 0; out_axis[2] = 0; } return rad; } /** * Multiplies two quat's * * @param {quat} out the receiving quaternion * @param {quat} a the first operand * @param {quat} b the second operand * @returns {quat} out */ function multiply$6(out, a, b) { var ax = a[0], ay = a[1], az = a[2], aw = a[3]; var bx = b[0], by = b[1], bz = b[2], bw = b[3]; out[0] = ax * bw + aw * bx + ay * bz - az * by; out[1] = ay * bw + aw * by + az * bx - ax * bz; out[2] = az * bw + aw * bz + ax * by - ay * bx; out[3] = aw * bw - ax * bx - ay * by - az * bz; return out; } /** * Rotates a quaternion by the given angle about the X axis * * @param {quat} out quat receiving operation result * @param {quat} a quat to rotate * @param {number} rad angle (in radians) to rotate * @returns {quat} out */ function rotateX$2(out, a, rad) { rad *= 0.5; var ax = a[0], ay = a[1], az = a[2], aw = a[3]; var bx = Math.sin(rad), bw = Math.cos(rad); out[0] = ax * bw + aw * bx; out[1] = ay * bw + az * bx; out[2] = az * bw - ay * bx; out[3] = aw * bw - ax * bx; return out; } /** * Rotates a quaternion by the given angle about the Y axis * * @param {quat} out quat receiving operation result * @param {quat} a quat to rotate * @param {number} rad angle (in radians) to rotate * @returns {quat} out */ function rotateY$2(out, a, rad) { rad *= 0.5; var ax = a[0], ay = a[1], az = a[2], aw = a[3]; var by = Math.sin(rad), bw = Math.cos(rad); out[0] = ax * bw - az * by; out[1] = ay * bw + aw * by; out[2] = az * bw + ax * by; out[3] = aw * bw - ay * by; return out; } /** * Rotates a quaternion by the given angle about the Z axis * * @param {quat} out quat receiving operation result * @param {quat} a quat to rotate * @param {number} rad angle (in radians) to rotate * @returns {quat} out */ function rotateZ$2(out, a, rad) { rad *= 0.5; var ax = a[0], ay = a[1], az = a[2], aw = a[3]; var bz = Math.sin(rad), bw = Math.cos(rad); out[0] = ax * bw + ay * bz; out[1] = ay * bw - ax * bz; out[2] = az * bw + aw * bz; out[3] = aw * bw - az * bz; return out; } /** * Calculates the W component of a quat from the X, Y, and Z components. * Assumes that quaternion is 1 unit in length. * Any existing W component will be ignored. * * @param {quat} out the receiving quaternion * @param {quat} a quat to calculate W component of * @returns {quat} out */ function calculateW(out, a) { var x = a[0], y = a[1], z = a[2]; out[0] = x; out[1] = y; out[2] = z; out[3] = Math.sqrt(Math.abs(1.0 - x * x - y * y - z * z)); return out; } /** * Performs a spherical linear interpolation between two quat * * @param {quat} out the receiving quaternion * @param {quat} a the first operand * @param {quat} b the second operand * @param {Number} t interpolation amount, in the range [0-1], between the two inputs * @returns {quat} out */ function slerp(out, a, b, t) { // benchmarks: // http://jsperf.com/quaternion-slerp-implementations var ax = a[0], ay = a[1], az = a[2], aw = a[3]; var bx = b[0], by = b[1], bz = b[2], bw = b[3]; var omega, cosom, sinom, scale0, scale1; // calc cosine cosom = ax * bx + ay * by + az * bz + aw * bw; // adjust signs (if necessary) if (cosom < 0.0) { cosom = -cosom; bx = -bx; by = -by; bz = -bz; bw = -bw; } // calculate coefficients if (1.0 - cosom > EPSILON) { // standard case (slerp) omega = Math.acos(cosom); sinom = Math.sin(omega); scale0 = Math.sin((1.0 - t) * omega) / sinom; scale1 = Math.sin(t * omega) / sinom; } else { // "from" and "to" quaternions are very close // ... so we can do a linear interpolation scale0 = 1.0 - t; scale1 = t; } // calculate final values out[0] = scale0 * ax + scale1 * bx; out[1] = scale0 * ay + scale1 * by; out[2] = scale0 * az + scale1 * bz; out[3] = scale0 * aw + scale1 * bw; return out; } /** * Generates a random quaternion * * @param {quat} out the receiving quaternion * @returns {quat} out */ function random$2(out) { // Implementation of http://planning.cs.uiuc.edu/node198.html // TODO: Calling random 3 times is probably not the fastest solution var u1 = RANDOM(); var u2 = RANDOM(); var u3 = RANDOM(); var sqrt1MinusU1 = Math.sqrt(1 - u1); var sqrtU1 = Math.sqrt(u1); out[0] = sqrt1MinusU1 * Math.sin(2.0 * Math.PI * u2); out[1] = sqrt1MinusU1 * Math.cos(2.0 * Math.PI * u2); out[2] = sqrtU1 * Math.sin(2.0 * Math.PI * u3); out[3] = sqrtU1 * Math.cos(2.0 * Math.PI * u3); return out; } /** * Calculates the inverse of a quat * * @param {quat} out the receiving quaternion * @param {quat} a quat to calculate inverse of * @returns {quat} out */ function invert$4(out, a) { var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3]; var dot = a0 * a0 + a1 * a1 + a2 * a2 + a3 * a3; var invDot = dot ? 1.0 / dot : 0; // TODO: Would be faster to return [0,0,0,0] immediately if dot == 0 out[0] = -a0 * invDot; out[1] = -a1 * invDot; out[2] = -a2 * invDot; out[3] = a3 * invDot; return out; } /** * Calculates the conjugate of a quat * If the quaternion is normalized, this function is faster than quat.inverse and produces the same result. * * @param {quat} out the receiving quaternion * @param {quat} a quat to calculate conjugate of * @returns {quat} out */ function conjugate(out, a) { out[0] = -a[0]; out[1] = -a[1]; out[2] = -a[2]; out[3] = a[3]; return out; } /** * Creates a quaternion from the given 3x3 rotation matrix. * * NOTE: The resultant quaternion is not normalized, so you should be sure * to renormalize the quaternion yourself where necessary. * * @param {quat} out the receiving quaternion * @param {mat3} m rotation matrix * @returns {quat} out * @function */ function fromMat3(out, m) { // Algorithm in Ken Shoemake's article in 1987 SIGGRAPH course notes // article "Quaternion Calculus and Fast Animation". var fTrace = m[0] + m[4] + m[8]; var fRoot; if (fTrace > 0.0) { // |w| > 1/2, may as well choose w > 1/2 fRoot = Math.sqrt(fTrace + 1.0); // 2w out[3] = 0.5 * fRoot; fRoot = 0.5 / fRoot; // 1/(4w) out[0] = (m[5] - m[7]) * fRoot; out[1] = (m[6] - m[2]) * fRoot; out[2] = (m[1] - m[3]) * fRoot; } else { // |w| <= 1/2 var i = 0; if (m[4] > m[0]) { i = 1; } if (m[8] > m[i * 3 + i]) { i = 2; } var j = (i + 1) % 3; var k = (i + 2) % 3; fRoot = Math.sqrt(m[i * 3 + i] - m[j * 3 + j] - m[k * 3 + k] + 1.0); out[i] = 0.5 * fRoot; fRoot = 0.5 / fRoot; out[3] = (m[j * 3 + k] - m[k * 3 + j]) * fRoot; out[j] = (m[j * 3 + i] + m[i * 3 + j]) * fRoot; out[k] = (m[k * 3 + i] + m[i * 3 + k]) * fRoot; } return out; } /** * Creates a quaternion from the given euler angle x, y, z. * * @param {quat} out the receiving quaternion * @param {x} Angle to rotate around X axis in degrees. * @param {y} Angle to rotate around Y axis in degrees. * @param {z} Angle to rotate around Z axis in degrees. * @returns {quat} out * @function */ function fromEuler(out, x, y, z) { var halfToRad = 0.5 * Math.PI / 180.0; x *= halfToRad; y *= halfToRad; z *= halfToRad; var sx = Math.sin(x); var cx = Math.cos(x); var sy = Math.sin(y); var cy = Math.cos(y); var sz = Math.sin(z); var cz = Math.cos(z); out[0] = sx * cy * cz - cx * sy * sz; out[1] = cx * sy * cz + sx * cy * sz; out[2] = cx * cy * sz - sx * sy * cz; out[3] = cx * cy * cz + sx * sy * sz; return out; } /** * Returns a string representation of a quatenion * * @param {quat} a vector to represent as a string * @returns {String} string representation of the vector */ function str$6(a) { return 'quat(' + a[0] + ', ' + a[1] + ', ' + a[2] + ', ' + a[3] + ')'; } /** * Creates a new quat initialized with values from an existing quaternion * * @param {quat} a quaternion to clone * @returns {quat} a new quaternion * @function */ var clone$7 = clone$6; /** * Creates a new quat initialized with the given values * * @param {Number} x X component * @param {Number} y Y component * @param {Number} z Z component * @param {Number} w W component * @returns {quat} a new quaternion * @function */ var fromValues$6 = fromValues$5; /** * Copy the values from one quat to another * * @param {quat} out the receiving quaternion * @param {quat} a the source quaternion * @returns {quat} out * @function */ var copy$6 = copy$5; /** * Set the components of a quat to the given values * * @param {quat} out the receiving quaternion * @param {Number} x X component * @param {Number} y Y component * @param {Number} z Z component * @param {Number} w W component * @returns {quat} out * @function */ var set$6 = set$5; /** * Adds two quat's * * @param {quat} out the receiving quaternion * @param {quat} a the first operand * @param {quat} b the second operand * @returns {quat} out * @function */ var add$6 = add$5; /** * Alias for {@link quat.multiply} * @function */ var mul$6 = multiply$6; /** * Scales a quat by a scalar number * * @param {quat} out the receiving vector * @param {quat} a the vector to scale * @param {Number} b amount to scale the vector by * @returns {quat} out * @function */ var scale$6 = scale$5; /** * Calculates the dot product of two quat's * * @param {quat} a the first operand * @param {quat} b the second operand * @returns {Number} dot product of a and b * @function */ var dot$2 = dot$1; /** * Performs a linear interpolation between two quat's * * @param {quat} out the receiving quaternion * @param {quat} a the first operand * @param {quat} b the second operand * @param {Number} t interpolation amount, in the range [0-1], between the two inputs * @returns {quat} out * @function */ var lerp$2 = lerp$1; /** * Calculates the length of a quat * * @param {quat} a vector to calculate length of * @returns {Number} length of a */ var length$2 = length$1; /** * Alias for {@link quat.length} * @function */ var len$2 = length$2; /** * Calculates the squared length of a quat * * @param {quat} a vector to calculate squared length of * @returns {Number} squared length of a * @function */ var squaredLength$2 = squaredLength$1; /** * Alias for {@link quat.squaredLength} * @function */ var sqrLen$2 = squaredLength$2; /** * Normalize a quat * * @param {quat} out the receiving quaternion * @param {quat} a quaternion to normalize * @returns {quat} out * @function */ var normalize$2 = normalize$1; /** * Returns whether or not the quaternions have exactly the same elements in the same position (when compared with ===) * * @param {quat} a The first quaternion. * @param {quat} b The second quaternion. * @returns {Boolean} True if the vectors are equal, false otherwise. */ var exactEquals$6 = exactEquals$5; /** * Returns whether or not the quaternions have approximately the same elements in the same position. * * @param {quat} a The first vector. * @param {quat} b The second vector. * @returns {Boolean} True if the vectors are equal, false otherwise. */ var equals$7 = equals$6; /** * Sets a quaternion to represent the shortest rotation from one * vector to another. * * Both vectors are assumed to be unit length. * * @param {quat} out the receiving quaternion. * @param {vec3} a the initial vector * @param {vec3} b the destination vector * @returns {quat} out */ var rotationTo = function () { var tmpvec3 = create$4(); var xUnitVec3 = fromValues$4(1, 0, 0); var yUnitVec3 = fromValues$4(0, 1, 0); return function (out, a, b) { var dot$1 = dot(a, b); if (dot$1 < -0.999999) { cross(tmpvec3, xUnitVec3, a); if (len(tmpvec3) < 0.000001) { cross(tmpvec3, yUnitVec3, a); } normalize(tmpvec3, tmpvec3); setAxisAngle(out, tmpvec3, Math.PI); return out; } else if (dot$1 > 0.999999) { out[0] = 0; out[1] = 0; out[2] = 0; out[3] = 1; return out; } else { cross(tmpvec3, a, b); out[0] = tmpvec3[0]; out[1] = tmpvec3[1]; out[2] = tmpvec3[2]; out[3] = 1 + dot$1; return normalize$2(out, out); } }; }(); /** * Performs a spherical linear interpolation with two control points * * @param {quat} out the receiving quaternion * @param {quat} a the first operand * @param {quat} b the second operand * @param {quat} c the third operand * @param {quat} d the fourth operand * @param {Number} t interpolation amount, in the range [0-1], between the two inputs * @returns {quat} out */ var sqlerp = function () { var temp1 = create$6(); var temp2 = create$6(); return function (out, a, b, c, d, t) { slerp(temp1, a, d, t); slerp(temp2, b, c, t); slerp(out, temp1, temp2, 2 * t * (1 - t)); return out; }; }(); /** * Sets the specified quaternion with values corresponding to the given * axes. Each axis is a vec3 and is expected to be unit length and * perpendicular to all other specified axes. * * @param {vec3} view the vector representing the viewing direction * @param {vec3} right the vector representing the local "right" direction * @param {vec3} up the vector representing the local "up" direction * @returns {quat} out */ var setAxes = function () { var matr = create$2(); return function (out, view, right, up) { matr[0] = right[0]; matr[3] = right[1]; matr[6] = right[2]; matr[1] = up[0]; matr[4] = up[1]; matr[7] = up[2]; matr[2] = -view[0]; matr[5] = -view[1]; matr[8] = -view[2]; return normalize$2(out, fromMat3(out, matr)); }; }(); /** * Dual Quaternion
* Format: [real, dual]
* Quaternion format: XYZW
* Make sure to have normalized dual quaternions, otherwise the functions may not work as intended.
* @module quat2 */ /** * Creates a new identity dual quat * * @returns {quat2} a new dual quaternion [real -> rotation, dual -> translation] */ function create$7() { var dq = new ARRAY_TYPE(8); if (ARRAY_TYPE != Float32Array) { dq[0] = 0; dq[1] = 0; dq[2] = 0; dq[4] = 0; dq[5] = 0; dq[6] = 0; dq[7] = 0; } dq[3] = 1; return dq; } /** * Creates a new quat initialized with values from an existing quaternion * * @param {quat2} a dual quaternion to clone * @returns {quat2} new dual quaternion * @function */ function clone$8(a) { var dq = new ARRAY_TYPE(8); dq[0] = a[0]; dq[1] = a[1]; dq[2] = a[2]; dq[3] = a[3]; dq[4] = a[4]; dq[5] = a[5]; dq[6] = a[6]; dq[7] = a[7]; return dq; } /** * Creates a new dual quat initialized with the given values * * @param {Number} x1 X component * @param {Number} y1 Y component * @param {Number} z1 Z component * @param {Number} w1 W component * @param {Number} x2 X component * @param {Number} y2 Y component * @param {Number} z2 Z component * @param {Number} w2 W component * @returns {quat2} new dual quaternion * @function */ function fromValues$7(x1, y1, z1, w1, x2, y2, z2, w2) { var dq = new ARRAY_TYPE(8); dq[0] = x1; dq[1] = y1; dq[2] = z1; dq[3] = w1; dq[4] = x2; dq[5] = y2; dq[6] = z2; dq[7] = w2; return dq; } /** * Creates a new dual quat from the given values (quat and translation) * * @param {Number} x1 X component * @param {Number} y1 Y component * @param {Number} z1 Z component * @param {Number} w1 W component * @param {Number} x2 X component (translation) * @param {Number} y2 Y component (translation) * @param {Number} z2 Z component (translation) * @returns {quat2} new dual quaternion * @function */ function fromRotationTranslationValues(x1, y1, z1, w1, x2, y2, z2) { var dq = new ARRAY_TYPE(8); dq[0] = x1; dq[1] = y1; dq[2] = z1; dq[3] = w1; var ax = x2 * 0.5, ay = y2 * 0.5, az = z2 * 0.5; dq[4] = ax * w1 + ay * z1 - az * y1; dq[5] = ay * w1 + az * x1 - ax * z1; dq[6] = az * w1 + ax * y1 - ay * x1; dq[7] = -ax * x1 - ay * y1 - az * z1; return dq; } /** * Creates a dual quat from a quaternion and a translation * * @param {quat2} dual quaternion receiving operation result * @param {quat} q quaternion * @param {vec3} t tranlation vector * @returns {quat2} dual quaternion receiving operation result * @function */ function fromRotationTranslation$1(out, q, t) { var ax = t[0] * 0.5, ay = t[1] * 0.5, az = t[2] * 0.5, bx = q[0], by = q[1], bz = q[2], bw = q[3]; out[0] = bx; out[1] = by; out[2] = bz; out[3] = bw; out[4] = ax * bw + ay * bz - az * by; out[5] = ay * bw + az * bx - ax * bz; out[6] = az * bw + ax * by - ay * bx; out[7] = -ax * bx - ay * by - az * bz; return out; } /** * Creates a dual quat from a translation * * @param {quat2} dual quaternion receiving operation result * @param {vec3} t translation vector * @returns {quat2} dual quaternion receiving operation result * @function */ function fromTranslation$3(out, t) { out[0] = 0; out[1] = 0; out[2] = 0; out[3] = 1; out[4] = t[0] * 0.5; out[5] = t[1] * 0.5; out[6] = t[2] * 0.5; out[7] = 0; return out; } /** * Creates a dual quat from a quaternion * * @param {quat2} dual quaternion receiving operation result * @param {quat} q the quaternion * @returns {quat2} dual quaternion receiving operation result * @function */ function fromRotation$4(out, q) { out[0] = q[0]; out[1] = q[1]; out[2] = q[2]; out[3] = q[3]; out[4] = 0; out[5] = 0; out[6] = 0; out[7] = 0; return out; } /** * Creates a new dual quat from a matrix (4x4) * * @param {quat2} out the dual quaternion * @param {mat4} a the matrix * @returns {quat2} dual quat receiving operation result * @function */ function fromMat4$1(out, a) { //TODO Optimize this var outer = create$6(); getRotation(outer, a); var t = new ARRAY_TYPE(3); getTranslation(t, a); fromRotationTranslation$1(out, outer, t); return out; } /** * Copy the values from one dual quat to another * * @param {quat2} out the receiving dual quaternion * @param {quat2} a the source dual quaternion * @returns {quat2} out * @function */ function copy$7(out, a) { out[0] = a[0]; out[1] = a[1]; out[2] = a[2]; out[3] = a[3]; out[4] = a[4]; out[5] = a[5]; out[6] = a[6]; out[7] = a[7]; return out; } /** * Set a dual quat to the identity dual quaternion * * @param {quat2} out the receiving quaternion * @returns {quat2} out */ function identity$5(out) { out[0] = 0; out[1] = 0; out[2] = 0; out[3] = 1; out[4] = 0; out[5] = 0; out[6] = 0; out[7] = 0; return out; } /** * Set the components of a dual quat to the given values * * @param {quat2} out the receiving quaternion * @param {Number} x1 X component * @param {Number} y1 Y component * @param {Number} z1 Z component * @param {Number} w1 W component * @param {Number} x2 X component * @param {Number} y2 Y component * @param {Number} z2 Z component * @param {Number} w2 W component * @returns {quat2} out * @function */ function set$7(out, x1, y1, z1, w1, x2, y2, z2, w2) { out[0] = x1; out[1] = y1; out[2] = z1; out[3] = w1; out[4] = x2; out[5] = y2; out[6] = z2; out[7] = w2; return out; } /** * Gets the real part of a dual quat * @param {quat} out real part * @param {quat2} a Dual Quaternion * @return {quat} real part */ var getReal = copy$6; /** * Gets the dual part of a dual quat * @param {quat} out dual part * @param {quat2} a Dual Quaternion * @return {quat} dual part */ function getDual(out, a) { out[0] = a[4]; out[1] = a[5]; out[2] = a[6]; out[3] = a[7]; return out; } /** * Set the real component of a dual quat to the given quaternion * * @param {quat2} out the receiving quaternion * @param {quat} q a quaternion representing the real part * @returns {quat2} out * @function */ var setReal = copy$6; /** * Set the dual component of a dual quat to the given quaternion * * @param {quat2} out the receiving quaternion * @param {quat} q a quaternion representing the dual part * @returns {quat2} out * @function */ function setDual(out, q) { out[4] = q[0]; out[5] = q[1]; out[6] = q[2]; out[7] = q[3]; return out; } /** * Gets the translation of a normalized dual quat * @param {vec3} out translation * @param {quat2} a Dual Quaternion to be decomposed * @return {vec3} translation */ function getTranslation$1(out, a) { var ax = a[4], ay = a[5], az = a[6], aw = a[7], bx = -a[0], by = -a[1], bz = -a[2], bw = a[3]; out[0] = (ax * bw + aw * bx + ay * bz - az * by) * 2; out[1] = (ay * bw + aw * by + az * bx - ax * bz) * 2; out[2] = (az * bw + aw * bz + ax * by - ay * bx) * 2; return out; } /** * Translates a dual quat by the given vector * * @param {quat2} out the receiving dual quaternion * @param {quat2} a the dual quaternion to translate * @param {vec3} v vector to translate by * @returns {quat2} out */ function translate$4(out, a, v) { var ax1 = a[0], ay1 = a[1], az1 = a[2], aw1 = a[3], bx1 = v[0] * 0.5, by1 = v[1] * 0.5, bz1 = v[2] * 0.5, ax2 = a[4], ay2 = a[5], az2 = a[6], aw2 = a[7]; out[0] = ax1; out[1] = ay1; out[2] = az1; out[3] = aw1; out[4] = aw1 * bx1 + ay1 * bz1 - az1 * by1 + ax2; out[5] = aw1 * by1 + az1 * bx1 - ax1 * bz1 + ay2; out[6] = aw1 * bz1 + ax1 * by1 - ay1 * bx1 + az2; out[7] = -ax1 * bx1 - ay1 * by1 - az1 * bz1 + aw2; return out; } /** * Rotates a dual quat around the X axis * * @param {quat2} out the receiving dual quaternion * @param {quat2} a the dual quaternion to rotate * @param {number} rad how far should the rotation be * @returns {quat2} out */ function rotateX$3(out, a, rad) { var bx = -a[0], by = -a[1], bz = -a[2], bw = a[3], ax = a[4], ay = a[5], az = a[6], aw = a[7], ax1 = ax * bw + aw * bx + ay * bz - az * by, ay1 = ay * bw + aw * by + az * bx - ax * bz, az1 = az * bw + aw * bz + ax * by - ay * bx, aw1 = aw * bw - ax * bx - ay * by - az * bz; rotateX$2(out, a, rad); bx = out[0]; by = out[1]; bz = out[2]; bw = out[3]; out[4] = ax1 * bw + aw1 * bx + ay1 * bz - az1 * by; out[5] = ay1 * bw + aw1 * by + az1 * bx - ax1 * bz; out[6] = az1 * bw + aw1 * bz + ax1 * by - ay1 * bx; out[7] = aw1 * bw - ax1 * bx - ay1 * by - az1 * bz; return out; } /** * Rotates a dual quat around the Y axis * * @param {quat2} out the receiving dual quaternion * @param {quat2} a the dual quaternion to rotate * @param {number} rad how far should the rotation be * @returns {quat2} out */ function rotateY$3(out, a, rad) { var bx = -a[0], by = -a[1], bz = -a[2], bw = a[3], ax = a[4], ay = a[5], az = a[6], aw = a[7], ax1 = ax * bw + aw * bx + ay * bz - az * by, ay1 = ay * bw + aw * by + az * bx - ax * bz, az1 = az * bw + aw * bz + ax * by - ay * bx, aw1 = aw * bw - ax * bx - ay * by - az * bz; rotateY$2(out, a, rad); bx = out[0]; by = out[1]; bz = out[2]; bw = out[3]; out[4] = ax1 * bw + aw1 * bx + ay1 * bz - az1 * by; out[5] = ay1 * bw + aw1 * by + az1 * bx - ax1 * bz; out[6] = az1 * bw + aw1 * bz + ax1 * by - ay1 * bx; out[7] = aw1 * bw - ax1 * bx - ay1 * by - az1 * bz; return out; } /** * Rotates a dual quat around the Z axis * * @param {quat2} out the receiving dual quaternion * @param {quat2} a the dual quaternion to rotate * @param {number} rad how far should the rotation be * @returns {quat2} out */ function rotateZ$3(out, a, rad) { var bx = -a[0], by = -a[1], bz = -a[2], bw = a[3], ax = a[4], ay = a[5], az = a[6], aw = a[7], ax1 = ax * bw + aw * bx + ay * bz - az * by, ay1 = ay * bw + aw * by + az * bx - ax * bz, az1 = az * bw + aw * bz + ax * by - ay * bx, aw1 = aw * bw - ax * bx - ay * by - az * bz; rotateZ$2(out, a, rad); bx = out[0]; by = out[1]; bz = out[2]; bw = out[3]; out[4] = ax1 * bw + aw1 * bx + ay1 * bz - az1 * by; out[5] = ay1 * bw + aw1 * by + az1 * bx - ax1 * bz; out[6] = az1 * bw + aw1 * bz + ax1 * by - ay1 * bx; out[7] = aw1 * bw - ax1 * bx - ay1 * by - az1 * bz; return out; } /** * Rotates a dual quat by a given quaternion (a * q) * * @param {quat2} out the receiving dual quaternion * @param {quat2} a the dual quaternion to rotate * @param {quat} q quaternion to rotate by * @returns {quat2} out */ function rotateByQuatAppend(out, a, q) { var qx = q[0], qy = q[1], qz = q[2], qw = q[3], ax = a[0], ay = a[1], az = a[2], aw = a[3]; out[0] = ax * qw + aw * qx + ay * qz - az * qy; out[1] = ay * qw + aw * qy + az * qx - ax * qz; out[2] = az * qw + aw * qz + ax * qy - ay * qx; out[3] = aw * qw - ax * qx - ay * qy - az * qz; ax = a[4]; ay = a[5]; az = a[6]; aw = a[7]; out[4] = ax * qw + aw * qx + ay * qz - az * qy; out[5] = ay * qw + aw * qy + az * qx - ax * qz; out[6] = az * qw + aw * qz + ax * qy - ay * qx; out[7] = aw * qw - ax * qx - ay * qy - az * qz; return out; } /** * Rotates a dual quat by a given quaternion (q * a) * * @param {quat2} out the receiving dual quaternion * @param {quat} q quaternion to rotate by * @param {quat2} a the dual quaternion to rotate * @returns {quat2} out */ function rotateByQuatPrepend(out, q, a) { var qx = q[0], qy = q[1], qz = q[2], qw = q[3], bx = a[0], by = a[1], bz = a[2], bw = a[3]; out[0] = qx * bw + qw * bx + qy * bz - qz * by; out[1] = qy * bw + qw * by + qz * bx - qx * bz; out[2] = qz * bw + qw * bz + qx * by - qy * bx; out[3] = qw * bw - qx * bx - qy * by - qz * bz; bx = a[4]; by = a[5]; bz = a[6]; bw = a[7]; out[4] = qx * bw + qw * bx + qy * bz - qz * by; out[5] = qy * bw + qw * by + qz * bx - qx * bz; out[6] = qz * bw + qw * bz + qx * by - qy * bx; out[7] = qw * bw - qx * bx - qy * by - qz * bz; return out; } /** * Rotates a dual quat around a given axis. Does the normalisation automatically * * @param {quat2} out the receiving dual quaternion * @param {quat2} a the dual quaternion to rotate * @param {vec3} axis the axis to rotate around * @param {Number} rad how far the rotation should be * @returns {quat2} out */ function rotateAroundAxis(out, a, axis, rad) { //Special case for rad = 0 if (Math.abs(rad) < EPSILON) { return copy$7(out, a); } var axisLength = Math.sqrt(axis[0] * axis[0] + axis[1] * axis[1] + axis[2] * axis[2]); rad = rad * 0.5; var s = Math.sin(rad); var bx = s * axis[0] / axisLength; var by = s * axis[1] / axisLength; var bz = s * axis[2] / axisLength; var bw = Math.cos(rad); var ax1 = a[0], ay1 = a[1], az1 = a[2], aw1 = a[3]; out[0] = ax1 * bw + aw1 * bx + ay1 * bz - az1 * by; out[1] = ay1 * bw + aw1 * by + az1 * bx - ax1 * bz; out[2] = az1 * bw + aw1 * bz + ax1 * by - ay1 * bx; out[3] = aw1 * bw - ax1 * bx - ay1 * by - az1 * bz; var ax = a[4], ay = a[5], az = a[6], aw = a[7]; out[4] = ax * bw + aw * bx + ay * bz - az * by; out[5] = ay * bw + aw * by + az * bx - ax * bz; out[6] = az * bw + aw * bz + ax * by - ay * bx; out[7] = aw * bw - ax * bx - ay * by - az * bz; return out; } /** * Adds two dual quat's * * @param {quat2} out the receiving dual quaternion * @param {quat2} a the first operand * @param {quat2} b the second operand * @returns {quat2} out * @function */ function add$7(out, a, b) { out[0] = a[0] + b[0]; out[1] = a[1] + b[1]; out[2] = a[2] + b[2]; out[3] = a[3] + b[3]; out[4] = a[4] + b[4]; out[5] = a[5] + b[5]; out[6] = a[6] + b[6]; out[7] = a[7] + b[7]; return out; } /** * Multiplies two dual quat's * * @param {quat2} out the receiving dual quaternion * @param {quat2} a the first operand * @param {quat2} b the second operand * @returns {quat2} out */ function multiply$7(out, a, b) { var ax0 = a[0], ay0 = a[1], az0 = a[2], aw0 = a[3], bx1 = b[4], by1 = b[5], bz1 = b[6], bw1 = b[7], ax1 = a[4], ay1 = a[5], az1 = a[6], aw1 = a[7], bx0 = b[0], by0 = b[1], bz0 = b[2], bw0 = b[3]; out[0] = ax0 * bw0 + aw0 * bx0 + ay0 * bz0 - az0 * by0; out[1] = ay0 * bw0 + aw0 * by0 + az0 * bx0 - ax0 * bz0; out[2] = az0 * bw0 + aw0 * bz0 + ax0 * by0 - ay0 * bx0; out[3] = aw0 * bw0 - ax0 * bx0 - ay0 * by0 - az0 * bz0; out[4] = ax0 * bw1 + aw0 * bx1 + ay0 * bz1 - az0 * by1 + ax1 * bw0 + aw1 * bx0 + ay1 * bz0 - az1 * by0; out[5] = ay0 * bw1 + aw0 * by1 + az0 * bx1 - ax0 * bz1 + ay1 * bw0 + aw1 * by0 + az1 * bx0 - ax1 * bz0; out[6] = az0 * bw1 + aw0 * bz1 + ax0 * by1 - ay0 * bx1 + az1 * bw0 + aw1 * bz0 + ax1 * by0 - ay1 * bx0; out[7] = aw0 * bw1 - ax0 * bx1 - ay0 * by1 - az0 * bz1 + aw1 * bw0 - ax1 * bx0 - ay1 * by0 - az1 * bz0; return out; } /** * Alias for {@link quat2.multiply} * @function */ var mul$7 = multiply$7; /** * Scales a dual quat by a scalar number * * @param {quat2} out the receiving dual quat * @param {quat2} a the dual quat to scale * @param {Number} b amount to scale the dual quat by * @returns {quat2} out * @function */ function scale$7(out, a, b) { out[0] = a[0] * b; out[1] = a[1] * b; out[2] = a[2] * b; out[3] = a[3] * b; out[4] = a[4] * b; out[5] = a[5] * b; out[6] = a[6] * b; out[7] = a[7] * b; return out; } /** * Calculates the dot product of two dual quat's (The dot product of the real parts) * * @param {quat2} a the first operand * @param {quat2} b the second operand * @returns {Number} dot product of a and b * @function */ var dot$3 = dot$2; /** * Performs a linear interpolation between two dual quats's * NOTE: The resulting dual quaternions won't always be normalized (The error is most noticeable when t = 0.5) * * @param {quat2} out the receiving dual quat * @param {quat2} a the first operand * @param {quat2} b the second operand * @param {Number} t interpolation amount, in the range [0-1], between the two inputs * @returns {quat2} out */ function lerp$3(out, a, b, t) { var mt = 1 - t; if (dot$3(a, b) < 0) { t = -t; } out[0] = a[0] * mt + b[0] * t; out[1] = a[1] * mt + b[1] * t; out[2] = a[2] * mt + b[2] * t; out[3] = a[3] * mt + b[3] * t; out[4] = a[4] * mt + b[4] * t; out[5] = a[5] * mt + b[5] * t; out[6] = a[6] * mt + b[6] * t; out[7] = a[7] * mt + b[7] * t; return out; } /** * Calculates the inverse of a dual quat. If they are normalized, conjugate is cheaper * * @param {quat2} out the receiving dual quaternion * @param {quat2} a dual quat to calculate inverse of * @returns {quat2} out */ function invert$5(out, a) { var sqlen = squaredLength$3(a); out[0] = -a[0] / sqlen; out[1] = -a[1] / sqlen; out[2] = -a[2] / sqlen; out[3] = a[3] / sqlen; out[4] = -a[4] / sqlen; out[5] = -a[5] / sqlen; out[6] = -a[6] / sqlen; out[7] = a[7] / sqlen; return out; } /** * Calculates the conjugate of a dual quat * If the dual quaternion is normalized, this function is faster than quat2.inverse and produces the same result. * * @param {quat2} out the receiving quaternion * @param {quat2} a quat to calculate conjugate of * @returns {quat2} out */ function conjugate$1(out, a) { out[0] = -a[0]; out[1] = -a[1]; out[2] = -a[2]; out[3] = a[3]; out[4] = -a[4]; out[5] = -a[5]; out[6] = -a[6]; out[7] = a[7]; return out; } /** * Calculates the length of a dual quat * * @param {quat2} a dual quat to calculate length of * @returns {Number} length of a * @function */ var length$3 = length$2; /** * Alias for {@link quat2.length} * @function */ var len$3 = length$3; /** * Calculates the squared length of a dual quat * * @param {quat2} a dual quat to calculate squared length of * @returns {Number} squared length of a * @function */ var squaredLength$3 = squaredLength$2; /** * Alias for {@link quat2.squaredLength} * @function */ var sqrLen$3 = squaredLength$3; /** * Normalize a dual quat * * @param {quat2} out the receiving dual quaternion * @param {quat2} a dual quaternion to normalize * @returns {quat2} out * @function */ function normalize$3(out, a) { var magnitude = squaredLength$3(a); if (magnitude > 0) { magnitude = Math.sqrt(magnitude); var a0 = a[0] / magnitude; var a1 = a[1] / magnitude; var a2 = a[2] / magnitude; var a3 = a[3] / magnitude; var b0 = a[4]; var b1 = a[5]; var b2 = a[6]; var b3 = a[7]; var a_dot_b = a0 * b0 + a1 * b1 + a2 * b2 + a3 * b3; out[0] = a0; out[1] = a1; out[2] = a2; out[3] = a3; out[4] = (b0 - a0 * a_dot_b) / magnitude; out[5] = (b1 - a1 * a_dot_b) / magnitude; out[6] = (b2 - a2 * a_dot_b) / magnitude; out[7] = (b3 - a3 * a_dot_b) / magnitude; } return out; } /** * Returns a string representation of a dual quatenion * * @param {quat2} a dual quaternion to represent as a string * @returns {String} string representation of the dual quat */ function str$7(a) { return 'quat2(' + a[0] + ', ' + a[1] + ', ' + a[2] + ', ' + a[3] + ', ' + a[4] + ', ' + a[5] + ', ' + a[6] + ', ' + a[7] + ')'; } /** * Returns whether or not the dual quaternions have exactly the same elements in the same position (when compared with ===) * * @param {quat2} a the first dual quaternion. * @param {quat2} b the second dual quaternion. * @returns {Boolean} true if the dual quaternions are equal, false otherwise. */ function exactEquals$7(a, b) { return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5] && a[6] === b[6] && a[7] === b[7]; } /** * Returns whether or not the dual quaternions have approximately the same elements in the same position. * * @param {quat2} a the first dual quat. * @param {quat2} b the second dual quat. * @returns {Boolean} true if the dual quats are equal, false otherwise. */ function equals$8(a, b) { var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], a4 = a[4], a5 = a[5], a6 = a[6], a7 = a[7]; var b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3], b4 = b[4], b5 = b[5], b6 = b[6], b7 = b[7]; return Math.abs(a0 - b0) <= EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= EPSILON * Math.max(1.0, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= EPSILON * Math.max(1.0, Math.abs(a5), Math.abs(b5)) && Math.abs(a6 - b6) <= EPSILON * Math.max(1.0, Math.abs(a6), Math.abs(b6)) && Math.abs(a7 - b7) <= EPSILON * Math.max(1.0, Math.abs(a7), Math.abs(b7)); } /** * 2 Dimensional Vector * @module vec2 */ /** * Creates a new, empty vec2 * * @returns {vec2} a new 2D vector */ function create$8() { var out = new ARRAY_TYPE(2); if (ARRAY_TYPE != Float32Array) { out[0] = 0; out[1] = 0; } return out; } /** * Creates a new vec2 initialized with values from an existing vector * * @param {vec2} a vector to clone * @returns {vec2} a new 2D vector */ function clone$9(a) { var out = new ARRAY_TYPE(2); out[0] = a[0]; out[1] = a[1]; return out; } /** * Creates a new vec2 initialized with the given values * * @param {Number} x X component * @param {Number} y Y component * @returns {vec2} a new 2D vector */ function fromValues$8(x, y) { var out = new ARRAY_TYPE(2); out[0] = x; out[1] = y; return out; } /** * Copy the values from one vec2 to another * * @param {vec2} out the receiving vector * @param {vec2} a the source vector * @returns {vec2} out */ function copy$8(out, a) { out[0] = a[0]; out[1] = a[1]; return out; } /** * Set the components of a vec2 to the given values * * @param {vec2} out the receiving vector * @param {Number} x X component * @param {Number} y Y component * @returns {vec2} out */ function set$8(out, x, y) { out[0] = x; out[1] = y; return out; } /** * Adds two vec2's * * @param {vec2} out the receiving vector * @param {vec2} a the first operand * @param {vec2} b the second operand * @returns {vec2} out */ function add$8(out, a, b) { out[0] = a[0] + b[0]; out[1] = a[1] + b[1]; return out; } /** * Subtracts vector b from vector a * * @param {vec2} out the receiving vector * @param {vec2} a the first operand * @param {vec2} b the second operand * @returns {vec2} out */ function subtract$6(out, a, b) { out[0] = a[0] - b[0]; out[1] = a[1] - b[1]; return out; } /** * Multiplies two vec2's * * @param {vec2} out the receiving vector * @param {vec2} a the first operand * @param {vec2} b the second operand * @returns {vec2} out */ function multiply$8(out, a, b) { out[0] = a[0] * b[0]; out[1] = a[1] * b[1]; return out; } /** * Divides two vec2's * * @param {vec2} out the receiving vector * @param {vec2} a the first operand * @param {vec2} b the second operand * @returns {vec2} out */ function divide$2(out, a, b) { out[0] = a[0] / b[0]; out[1] = a[1] / b[1]; return out; } /** * Math.ceil the components of a vec2 * * @param {vec2} out the receiving vector * @param {vec2} a vector to ceil * @returns {vec2} out */ function ceil$2(out, a) { out[0] = Math.ceil(a[0]); out[1] = Math.ceil(a[1]); return out; } /** * Math.floor the components of a vec2 * * @param {vec2} out the receiving vector * @param {vec2} a vector to floor * @returns {vec2} out */ function floor$2(out, a) { out[0] = Math.floor(a[0]); out[1] = Math.floor(a[1]); return out; } /** * Returns the minimum of two vec2's * * @param {vec2} out the receiving vector * @param {vec2} a the first operand * @param {vec2} b the second operand * @returns {vec2} out */ function min$2(out, a, b) { out[0] = Math.min(a[0], b[0]); out[1] = Math.min(a[1], b[1]); return out; } /** * Returns the maximum of two vec2's * * @param {vec2} out the receiving vector * @param {vec2} a the first operand * @param {vec2} b the second operand * @returns {vec2} out */ function max$2(out, a, b) { out[0] = Math.max(a[0], b[0]); out[1] = Math.max(a[1], b[1]); return out; } /** * Math.round the components of a vec2 * * @param {vec2} out the receiving vector * @param {vec2} a vector to round * @returns {vec2} out */ function round$2(out, a) { out[0] = Math.round(a[0]); out[1] = Math.round(a[1]); return out; } /** * Scales a vec2 by a scalar number * * @param {vec2} out the receiving vector * @param {vec2} a the vector to scale * @param {Number} b amount to scale the vector by * @returns {vec2} out */ function scale$8(out, a, b) { out[0] = a[0] * b; out[1] = a[1] * b; return out; } /** * Adds two vec2's after scaling the second operand by a scalar value * * @param {vec2} out the receiving vector * @param {vec2} a the first operand * @param {vec2} b the second operand * @param {Number} scale the amount to scale b by before adding * @returns {vec2} out */ function scaleAndAdd$2(out, a, b, scale) { out[0] = a[0] + b[0] * scale; out[1] = a[1] + b[1] * scale; return out; } /** * Calculates the euclidian distance between two vec2's * * @param {vec2} a the first operand * @param {vec2} b the second operand * @returns {Number} distance between a and b */ function distance$2(a, b) { var x = b[0] - a[0], y = b[1] - a[1]; return Math.sqrt(x * x + y * y); } /** * Calculates the squared euclidian distance between two vec2's * * @param {vec2} a the first operand * @param {vec2} b the second operand * @returns {Number} squared distance between a and b */ function squaredDistance$2(a, b) { var x = b[0] - a[0], y = b[1] - a[1]; return x * x + y * y; } /** * Calculates the length of a vec2 * * @param {vec2} a vector to calculate length of * @returns {Number} length of a */ function length$4(a) { var x = a[0], y = a[1]; return Math.sqrt(x * x + y * y); } /** * Calculates the squared length of a vec2 * * @param {vec2} a vector to calculate squared length of * @returns {Number} squared length of a */ function squaredLength$4(a) { var x = a[0], y = a[1]; return x * x + y * y; } /** * Negates the components of a vec2 * * @param {vec2} out the receiving vector * @param {vec2} a vector to negate * @returns {vec2} out */ function negate$2(out, a) { out[0] = -a[0]; out[1] = -a[1]; return out; } /** * Returns the inverse of the components of a vec2 * * @param {vec2} out the receiving vector * @param {vec2} a vector to invert * @returns {vec2} out */ function inverse$2(out, a) { out[0] = 1.0 / a[0]; out[1] = 1.0 / a[1]; return out; } /** * Normalize a vec2 * * @param {vec2} out the receiving vector * @param {vec2} a vector to normalize * @returns {vec2} out */ function normalize$4(out, a) { var x = a[0], y = a[1]; var len = x * x + y * y; if (len > 0) { //TODO: evaluate use of glm_invsqrt here? len = 1 / Math.sqrt(len); } out[0] = a[0] * len; out[1] = a[1] * len; return out; } /** * Calculates the dot product of two vec2's * * @param {vec2} a the first operand * @param {vec2} b the second operand * @returns {Number} dot product of a and b */ function dot$4(a, b) { return a[0] * b[0] + a[1] * b[1]; } /** * Computes the cross product of two vec2's * Note that the cross product must by definition produce a 3D vector * * @param {vec3} out the receiving vector * @param {vec2} a the first operand * @param {vec2} b the second operand * @returns {vec3} out */ function cross$2(out, a, b) { var z = a[0] * b[1] - a[1] * b[0]; out[0] = out[1] = 0; out[2] = z; return out; } /** * Performs a linear interpolation between two vec2's * * @param {vec2} out the receiving vector * @param {vec2} a the first operand * @param {vec2} b the second operand * @param {Number} t interpolation amount, in the range [0-1], between the two inputs * @returns {vec2} out */ function lerp$4(out, a, b, t) { var ax = a[0], ay = a[1]; out[0] = ax + t * (b[0] - ax); out[1] = ay + t * (b[1] - ay); return out; } /** * Generates a random vector with the given scale * * @param {vec2} out the receiving vector * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned * @returns {vec2} out */ function random$3(out, scale) { scale = scale || 1.0; var r = RANDOM() * 2.0 * Math.PI; out[0] = Math.cos(r) * scale; out[1] = Math.sin(r) * scale; return out; } /** * Transforms the vec2 with a mat2 * * @param {vec2} out the receiving vector * @param {vec2} a the vector to transform * @param {mat2} m matrix to transform with * @returns {vec2} out */ function transformMat2(out, a, m) { var x = a[0], y = a[1]; out[0] = m[0] * x + m[2] * y; out[1] = m[1] * x + m[3] * y; return out; } /** * Transforms the vec2 with a mat2d * * @param {vec2} out the receiving vector * @param {vec2} a the vector to transform * @param {mat2d} m matrix to transform with * @returns {vec2} out */ function transformMat2d(out, a, m) { var x = a[0], y = a[1]; out[0] = m[0] * x + m[2] * y + m[4]; out[1] = m[1] * x + m[3] * y + m[5]; return out; } /** * Transforms the vec2 with a mat3 * 3rd vector component is implicitly '1' * * @param {vec2} out the receiving vector * @param {vec2} a the vector to transform * @param {mat3} m matrix to transform with * @returns {vec2} out */ function transformMat3$1(out, a, m) { var x = a[0], y = a[1]; out[0] = m[0] * x + m[3] * y + m[6]; out[1] = m[1] * x + m[4] * y + m[7]; return out; } /** * Transforms the vec2 with a mat4 * 3rd vector component is implicitly '0' * 4th vector component is implicitly '1' * * @param {vec2} out the receiving vector * @param {vec2} a the vector to transform * @param {mat4} m matrix to transform with * @returns {vec2} out */ function transformMat4$2(out, a, m) { var x = a[0]; var y = a[1]; out[0] = m[0] * x + m[4] * y + m[12]; out[1] = m[1] * x + m[5] * y + m[13]; return out; } /** * Rotate a 2D vector * @param {vec2} out The receiving vec2 * @param {vec2} a The vec2 point to rotate * @param {vec2} b The origin of the rotation * @param {Number} c The angle of rotation * @returns {vec2} out */ function rotate$4(out, a, b, c) { //Translate point to the origin var p0 = a[0] - b[0], p1 = a[1] - b[1], sinC = Math.sin(c), cosC = Math.cos(c); //perform rotation and translate to correct position out[0] = p0 * cosC - p1 * sinC + b[0]; out[1] = p0 * sinC + p1 * cosC + b[1]; return out; } /** * Get the angle between two 2D vectors * @param {vec2} a The first operand * @param {vec2} b The second operand * @returns {Number} The angle in radians */ function angle$1(a, b) { var x1 = a[0], y1 = a[1], x2 = b[0], y2 = b[1]; var len1 = x1 * x1 + y1 * y1; if (len1 > 0) { //TODO: evaluate use of glm_invsqrt here? len1 = 1 / Math.sqrt(len1); } var len2 = x2 * x2 + y2 * y2; if (len2 > 0) { //TODO: evaluate use of glm_invsqrt here? len2 = 1 / Math.sqrt(len2); } var cosine = (x1 * x2 + y1 * y2) * len1 * len2; if (cosine > 1.0) { return 0; } else if (cosine < -1.0) { return Math.PI; } else { return Math.acos(cosine); } } /** * Set the components of a vec2 to zero * * @param {vec2} out the receiving vector * @returns {vec2} out */ function zero$2(out) { out[0] = 0.0; out[1] = 0.0; return out; } /** * Returns a string representation of a vector * * @param {vec2} a vector to represent as a string * @returns {String} string representation of the vector */ function str$8(a) { return 'vec2(' + a[0] + ', ' + a[1] + ')'; } /** * Returns whether or not the vectors exactly have the same elements in the same position (when compared with ===) * * @param {vec2} a The first vector. * @param {vec2} b The second vector. * @returns {Boolean} True if the vectors are equal, false otherwise. */ function exactEquals$8(a, b) { return a[0] === b[0] && a[1] === b[1]; } /** * Returns whether or not the vectors have approximately the same elements in the same position. * * @param {vec2} a The first vector. * @param {vec2} b The second vector. * @returns {Boolean} True if the vectors are equal, false otherwise. */ function equals$9(a, b) { var a0 = a[0], a1 = a[1]; var b0 = b[0], b1 = b[1]; return Math.abs(a0 - b0) <= EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)); } /** * Alias for {@link vec2.length} * @function */ var len$4 = length$4; /** * Alias for {@link vec2.subtract} * @function */ var sub$6 = subtract$6; /** * Alias for {@link vec2.multiply} * @function */ var mul$8 = multiply$8; /** * Alias for {@link vec2.divide} * @function */ var div$2 = divide$2; /** * Alias for {@link vec2.distance} * @function */ var dist$2 = distance$2; /** * Alias for {@link vec2.squaredDistance} * @function */ var sqrDist$2 = squaredDistance$2; /** * Alias for {@link vec2.squaredLength} * @function */ var sqrLen$4 = squaredLength$4; /** * Perform some operation over an array of vec2s. * * @param {Array} a the array of vectors to iterate over * @param {Number} stride Number of elements between the start of each vec2. If 0 assumes tightly packed * @param {Number} offset Number of elements to skip at the beginning of the array * @param {Number} count Number of vec2s to iterate over. If 0 iterates over entire array * @param {Function} fn Function to call for each vector in the array * @param {Object} [arg] additional argument to pass to fn * @returns {Array} a * @function */ var forEach$2 = function () { var vec = create$8(); return function (a, stride, offset, count, fn, arg) { var i, l; if (!stride) { stride = 2; } if (!offset) { offset = 0; } if (count) { l = Math.min(count * stride + offset, a.length); } else { l = a.length; } for (i = offset; i < l; i += stride) { vec[0] = a[i]; vec[1] = a[i + 1]; fn(vec, vec, arg); a[i] = vec[0]; a[i + 1] = vec[1]; } return a; }; }(); // var CircleStyleLayer = /*@__PURE__*/(function (StyleLayer) { function CircleStyleLayer(layer ) { StyleLayer.call(this, layer, properties); } if ( StyleLayer ) CircleStyleLayer.__proto__ = StyleLayer; CircleStyleLayer.prototype = Object.create( StyleLayer && StyleLayer.prototype ); CircleStyleLayer.prototype.constructor = CircleStyleLayer; CircleStyleLayer.prototype.createBucket = function createBucket (parameters ) { return new CircleBucket(parameters); }; CircleStyleLayer.prototype.queryRadius = function queryRadius (bucket ) { var circleBucket = (bucket ); return getMaximumPaintValue('circle-radius', this, circleBucket) + getMaximumPaintValue('circle-stroke-width', this, circleBucket) + translateDistance(this.paint.get('circle-translate')); }; CircleStyleLayer.prototype.queryIntersectsFeature = function queryIntersectsFeature (queryGeometry , feature , featureState , geometry , zoom , transform , pixelsToTileUnits , pixelPosMatrix ) { var translatedPolygon = translate(queryGeometry, this.paint.get('circle-translate'), this.paint.get('circle-translate-anchor'), transform.angle, pixelsToTileUnits); var radius = this.paint.get('circle-radius').evaluate(feature, featureState); var stroke = this.paint.get('circle-stroke-width').evaluate(feature, featureState); var size = radius + stroke; // For pitch-alignment: map, compare feature geometry to query geometry in the plane of the tile // // Otherwise, compare geometry in the plane of the viewport // // A circle with fixed scaling relative to the viewport gets larger in tile space as it moves into the distance // // A circle with fixed scaling relative to the map gets smaller in viewport space as it moves into the distance var alignWithMap = this.paint.get('circle-pitch-alignment') === 'map'; var transformedPolygon = alignWithMap ? translatedPolygon : projectQueryGeometry(translatedPolygon, pixelPosMatrix); var transformedSize = alignWithMap ? size * pixelsToTileUnits : size; for (var i$1 = 0, list$1 = geometry; i$1 < list$1.length; i$1 += 1) { var ring = list$1[i$1]; for (var i = 0, list = ring; i < list.length; i += 1) { var point = list[i]; var transformedPoint = alignWithMap ? point : projectPoint(point, pixelPosMatrix); var adjustedSize = transformedSize; var projectedCenter = transformMat4$1([], [point.x, point.y, 0, 1], pixelPosMatrix); if (this.paint.get('circle-pitch-scale') === 'viewport' && this.paint.get('circle-pitch-alignment') === 'map') { adjustedSize *= projectedCenter[3] / transform.cameraToCenterDistance; } else if (this.paint.get('circle-pitch-scale') === 'map' && this.paint.get('circle-pitch-alignment') === 'viewport') { adjustedSize *= transform.cameraToCenterDistance / projectedCenter[3]; } if (polygonIntersectsBufferedPoint(transformedPolygon, transformedPoint, adjustedSize)) { return true; } } } return false; }; return CircleStyleLayer; }(StyleLayer)); function projectPoint(p , pixelPosMatrix ) { var point = transformMat4$1([], [p.x, p.y, 0, 1], pixelPosMatrix); return new pointGeometry(point[0] / point[3], point[1] / point[3]); } function projectQueryGeometry(queryGeometry , pixelPosMatrix ) { return queryGeometry.map(function (p) { return projectPoint(p, pixelPosMatrix); }); } // var HeatmapBucket = /*@__PURE__*/(function (CircleBucket) { function HeatmapBucket () { CircleBucket.apply(this, arguments); }if ( CircleBucket ) HeatmapBucket.__proto__ = CircleBucket; HeatmapBucket.prototype = Object.create( CircleBucket && CircleBucket.prototype ); HeatmapBucket.prototype.constructor = HeatmapBucket; return HeatmapBucket; }(CircleBucket)); register('HeatmapBucket', HeatmapBucket, {omit: ['layers']}); // function createImage(image , ref , channels , data ) { var width = ref.width; var height = ref.height; if (!data) { data = new Uint8Array(width * height * channels); } else if (data.length !== width * height * channels) { throw new RangeError('mismatched image size'); } image.width = width; image.height = height; image.data = data; return image; } function resizeImage(image , ref , channels ) { var width = ref.width; var height = ref.height; if (width === image.width && height === image.height) { return; } var newImage = createImage({}, {width: width, height: height}, channels); copyImage(image, newImage, {x: 0, y: 0}, {x: 0, y: 0}, { width: Math.min(image.width, width), height: Math.min(image.height, height) }, channels); image.width = width; image.height = height; image.data = newImage.data; } function copyImage(srcImg , dstImg , srcPt , dstPt , size , channels ) { if (size.width === 0 || size.height === 0) { return dstImg; } if (size.width > srcImg.width || size.height > srcImg.height || srcPt.x > srcImg.width - size.width || srcPt.y > srcImg.height - size.height) { throw new RangeError('out of range source coordinates for image copy'); } if (size.width > dstImg.width || size.height > dstImg.height || dstPt.x > dstImg.width - size.width || dstPt.y > dstImg.height - size.height) { throw new RangeError('out of range destination coordinates for image copy'); } var srcData = srcImg.data; var dstData = dstImg.data; assert_1(srcData !== dstData); for (var y = 0; y < size.height; y++) { var srcOffset = ((srcPt.y + y) * srcImg.width + srcPt.x) * channels; var dstOffset = ((dstPt.y + y) * dstImg.width + dstPt.x) * channels; for (var i = 0; i < size.width * channels; i++) { dstData[dstOffset + i] = srcData[srcOffset + i]; } } return dstImg; } var AlphaImage = function AlphaImage(size , data ) { createImage(this, size, 1, data); }; AlphaImage.prototype.resize = function resize (size ) { resizeImage(this, size, 1); }; AlphaImage.prototype.clone = function clone () { return new AlphaImage({width: this.width, height: this.height}, new Uint8Array(this.data)); }; AlphaImage.copy = function copy (srcImg , dstImg , srcPt , dstPt , size ) { copyImage(srcImg, dstImg, srcPt, dstPt, size, 1); }; // Not premultiplied, because ImageData is not premultiplied. // UNPACK_PREMULTIPLY_ALPHA_WEBGL must be used when uploading to a texture. var RGBAImage = function RGBAImage(size , data ) { createImage(this, size, 4, data); }; RGBAImage.prototype.resize = function resize (size ) { resizeImage(this, size, 4); }; RGBAImage.prototype.replace = function replace (data , copy ) { if (copy) { this.data.set(data); } else { this.data = data; } }; RGBAImage.prototype.clone = function clone () { return new RGBAImage({width: this.width, height: this.height}, new Uint8Array(this.data)); }; RGBAImage.copy = function copy (srcImg , dstImg , srcPt , dstPt , size ) { copyImage(srcImg, dstImg, srcPt, dstPt, size, 4); }; register('AlphaImage', AlphaImage); register('RGBAImage', RGBAImage); // This file is generated. Edit build/generate-style-code.js, then run `yarn run codegen`. var paint$2 = new Properties({ "heatmap-radius": new DataDrivenProperty(spec["paint_heatmap"]["heatmap-radius"]), "heatmap-weight": new DataDrivenProperty(spec["paint_heatmap"]["heatmap-weight"]), "heatmap-intensity": new DataConstantProperty(spec["paint_heatmap"]["heatmap-intensity"]), "heatmap-color": new ColorRampProperty(spec["paint_heatmap"]["heatmap-color"]), "heatmap-opacity": new DataConstantProperty(spec["paint_heatmap"]["heatmap-opacity"]), }); // Note: without adding the explicit type annotation, Flow infers weaker types // for these objects from their use in the constructor to StyleLayer, as // {layout?: Properties<...>, paint: Properties<...>} var properties$1 = ({ paint: paint$2 } ); // /** * Given an expression that should evaluate to a color ramp, return * a 256x1 px RGBA image representing that ramp expression. * * @private */ function renderColorRamp(expression , colorRampEvaluationParameter ) { var colorRampData = new Uint8Array(256 * 4); var evaluationGlobals = {}; for (var i = 0, j = 0; i < 256; i++, j += 4) { evaluationGlobals[colorRampEvaluationParameter] = i / 255; var pxColor = expression.evaluate((evaluationGlobals )); // the colors are being unpremultiplied because Color uses // premultiplied values, and the Texture class expects unpremultiplied ones colorRampData[j + 0] = Math.floor(pxColor.r * 255 / pxColor.a); colorRampData[j + 1] = Math.floor(pxColor.g * 255 / pxColor.a); colorRampData[j + 2] = Math.floor(pxColor.b * 255 / pxColor.a); colorRampData[j + 3] = Math.floor(pxColor.a * 255); } return new RGBAImage({width: 256, height: 1}, colorRampData); } // var HeatmapStyleLayer = /*@__PURE__*/(function (StyleLayer) { function HeatmapStyleLayer(layer ) { StyleLayer.call(this, layer, properties$1); // make sure color ramp texture is generated for default heatmap color too this._updateColorRamp(); } if ( StyleLayer ) HeatmapStyleLayer.__proto__ = StyleLayer; HeatmapStyleLayer.prototype = Object.create( StyleLayer && StyleLayer.prototype ); HeatmapStyleLayer.prototype.constructor = HeatmapStyleLayer; HeatmapStyleLayer.prototype.createBucket = function createBucket (options ) { return new HeatmapBucket(options); }; HeatmapStyleLayer.prototype._handleSpecialPaintPropertyUpdate = function _handleSpecialPaintPropertyUpdate (name ) { if (name === 'heatmap-color') { this._updateColorRamp(); } }; HeatmapStyleLayer.prototype._updateColorRamp = function _updateColorRamp () { var expression = this._transitionablePaint._values['heatmap-color'].value.expression; this.colorRamp = renderColorRamp(expression, 'heatmapDensity'); this.colorRampTexture = null; }; HeatmapStyleLayer.prototype.resize = function resize () { if (this.heatmapFbo) { this.heatmapFbo.destroy(); this.heatmapFbo = null; } }; HeatmapStyleLayer.prototype.queryRadius = function queryRadius () { return 0; }; HeatmapStyleLayer.prototype.queryIntersectsFeature = function queryIntersectsFeature () { return false; }; HeatmapStyleLayer.prototype.hasOffscreenPass = function hasOffscreenPass () { return this.paint.get('heatmap-opacity') !== 0 && this.visibility !== 'none'; }; return HeatmapStyleLayer; }(StyleLayer)); // This file is generated. Edit build/generate-style-code.js, then run `yarn run codegen`. var paint$3 = new Properties({ "hillshade-illumination-direction": new DataConstantProperty(spec["paint_hillshade"]["hillshade-illumination-direction"]), "hillshade-illumination-anchor": new DataConstantProperty(spec["paint_hillshade"]["hillshade-illumination-anchor"]), "hillshade-exaggeration": new DataConstantProperty(spec["paint_hillshade"]["hillshade-exaggeration"]), "hillshade-shadow-color": new DataConstantProperty(spec["paint_hillshade"]["hillshade-shadow-color"]), "hillshade-highlight-color": new DataConstantProperty(spec["paint_hillshade"]["hillshade-highlight-color"]), "hillshade-accent-color": new DataConstantProperty(spec["paint_hillshade"]["hillshade-accent-color"]), }); // Note: without adding the explicit type annotation, Flow infers weaker types // for these objects from their use in the constructor to StyleLayer, as // {layout?: Properties<...>, paint: Properties<...>} var properties$2 = ({ paint: paint$3 } ); // var HillshadeStyleLayer = /*@__PURE__*/(function (StyleLayer) { function HillshadeStyleLayer(layer ) { StyleLayer.call(this, layer, properties$2); } if ( StyleLayer ) HillshadeStyleLayer.__proto__ = StyleLayer; HillshadeStyleLayer.prototype = Object.create( StyleLayer && StyleLayer.prototype ); HillshadeStyleLayer.prototype.constructor = HillshadeStyleLayer; HillshadeStyleLayer.prototype.hasOffscreenPass = function hasOffscreenPass () { return this.paint.get('hillshade-exaggeration') !== 0 && this.visibility !== 'none'; }; return HillshadeStyleLayer; }(StyleLayer)); // var layout$2 = createLayout([ {name: 'a_pos', components: 2, type: 'Int16'} ], 4); var members$1 = layout$2.members; var size$1 = layout$2.size; var alignment$1 = layout$2.alignment; 'use strict'; var earcut_1 = earcut; var default_1 = earcut; function earcut(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 || outerNode.next === outerNode.prev) { 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$a(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$a(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 vertex 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); var p = ear.prevZ, n = ear.nextZ; // look for points inside the triangle in both directions while (p && p.z >= minZ && n && n.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.prevZ; if (n !== ear.prev && n !== ear.next && pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, n.x, n.y) && area(n.prev, n, n.next) >= 0) { return false; } n = n.nextZ; } // look for remaining points in decreasing z-order 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; } // look for remaining points in increasing z-order while (n && n.z <= maxZ) { if (n !== ear.prev && n !== ear.next && pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, n.x, n.y) && area(n.prev, n, n.next) >= 0) { return false; } n = n.nextZ; } 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(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 || (p.x === leftmost.x && p.y < leftmost.y)) { 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$a(p1, p2) { return p1.x === p2.x && p1.y === p2.y; } // check if two segments intersect function intersects(p1, q1, p2, q2) { if ((equals$a(p1, q1) && equals$a(p2, q2)) || (equals$a(p1, q2) && equals$a(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) { // vertex index in coordinates array this.i = i; // vertex coordinates this.x = x; this.y = y; // previous and next vertex 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; } // return a percentage difference between the polygon area and its triangulation area; // used to verify correctness of triangulation earcut.deviation = function (data, holeIndices, dim, triangles) { var hasHoles = holeIndices && holeIndices.length; var outerLen = hasHoles ? holeIndices[0] * dim : data.length; var polygonArea = Math.abs(signedArea(data, 0, outerLen, dim)); if (hasHoles) { for (var i = 0, len = holeIndices.length; i < len; i++) { var start = holeIndices[i] * dim; var end = i < len - 1 ? holeIndices[i + 1] * dim : data.length; polygonArea -= Math.abs(signedArea(data, start, end, dim)); } } var trianglesArea = 0; for (i = 0; i < triangles.length; i += 3) { var a = triangles[i] * dim; var b = triangles[i + 1] * dim; var c = triangles[i + 2] * dim; trianglesArea += Math.abs( (data[a] - data[c]) * (data[b + 1] - data[a + 1]) - (data[a] - data[b]) * (data[c + 1] - data[a + 1])); } return polygonArea === 0 && trianglesArea === 0 ? 0 : Math.abs((trianglesArea - polygonArea) / polygonArea); }; 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; } // turn a polygon in a multi-dimensional array form (e.g. as in GeoJSON) into a form Earcut accepts earcut.flatten = function (data) { var dim = data[0][0].length, result = {vertices: [], holes: [], dimensions: dim}, holeIndex = 0; for (var i = 0; i < data.length; i++) { for (var j = 0; j < data[i].length; j++) { for (var d = 0; d < dim; d++) { result.vertices.push(data[i][j][d]); } } if (i > 0) { holeIndex += data[i - 1].length; result.holes.push(holeIndex); } } return result; }; earcut_1.default = default_1; function quickselect(arr, k, left, right, compare) { quickselectStep(arr, k, left || 0, right || (arr.length - 1), compare || defaultCompare); } function quickselectStep(arr, k, left, right, compare) { while (right > left) { if (right - left > 600) { var n = right - left + 1; var m = k - left + 1; var z = Math.log(n); var s = 0.5 * Math.exp(2 * z / 3); var sd = 0.5 * Math.sqrt(z * s * (n - s) / n) * (m - n / 2 < 0 ? -1 : 1); var newLeft = Math.max(left, Math.floor(k - m * s / n + sd)); var newRight = Math.min(right, Math.floor(k + (n - m) * s / n + sd)); quickselectStep(arr, k, newLeft, newRight, compare); } var t = arr[k]; var i = left; var j = right; swap$1(arr, left, k); if (compare(arr[right], t) > 0) { swap$1(arr, left, right); } while (i < j) { swap$1(arr, i, j); i++; j--; while (compare(arr[i], t) < 0) { i++; } while (compare(arr[j], t) > 0) { j--; } } if (compare(arr[left], t) === 0) { swap$1(arr, left, j); } else { j++; swap$1(arr, j, right); } if (j <= k) { left = j + 1; } if (k <= j) { right = j - 1; } } } function swap$1(arr, i, j) { var tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; } function defaultCompare(a, b) { return a < b ? -1 : a > b ? 1 : 0; } // // classifies an array of rings into polygons with outer rings and holes function classifyRings(rings , maxRings ) { var len = rings.length; if (len <= 1) { return [rings]; } var polygons = []; var polygon, ccw; for (var i = 0; i < len; i++) { var area = calculateSignedArea(rings[i]); if (area === 0) { continue; } (rings[i] ).area = Math.abs(area); if (ccw === undefined) { ccw = area < 0; } if (ccw === area < 0) { if (polygon) { polygons.push(polygon); } polygon = [rings[i]]; } else { (polygon ).push(rings[i]); } } if (polygon) { polygons.push(polygon); } // Earcut performance degrades with the # of rings in a polygon. For this // reason, we limit strip out all but the `maxRings` largest rings. if (maxRings > 1) { for (var j = 0; j < polygons.length; j++) { if (polygons[j].length <= maxRings) { continue; } quickselect(polygons[j], maxRings, 1, polygons[j].length - 1, compareAreas); polygons[j] = polygons[j].slice(0, maxRings); } } return polygons; } function compareAreas(a, b) { return b.area - a.area; } // function hasPattern(type , layers , options ) { var patterns = options.patternDependencies; var hasPattern = false; for (var i = 0, list = layers; i < list.length; i += 1) { var layer = list[i]; var patternProperty = layer.paint.get((type + "-pattern")); if (!patternProperty.isConstant()) { hasPattern = true; } var constantPattern = patternProperty.constantOr(null); if (constantPattern) { hasPattern = true; patterns[constantPattern.to] = true; patterns[constantPattern.from] = true; } } return hasPattern; } function addPatternDependencies(type , layers , patternFeature , zoom , options ) { var patterns = options.patternDependencies; for (var i = 0, list = layers; i < list.length; i += 1) { var layer = list[i]; var patternProperty = layer.paint.get((type + "-pattern")); var patternPropertyValue = patternProperty.value; if (patternPropertyValue.kind !== "constant") { var min = patternPropertyValue.evaluate({zoom: zoom - 1}, patternFeature, {}); var mid = patternPropertyValue.evaluate({zoom: zoom}, patternFeature, {}); var max = patternPropertyValue.evaluate({zoom: zoom + 1}, patternFeature, {}); // add to patternDependencies patterns[min] = true; patterns[mid] = true; patterns[max] = true; // save for layout patternFeature.patterns[layer.id] = { min: min, mid: mid, max: max }; } } return patternFeature; } // var EARCUT_MAX_RINGS = 500; var FillBucket = function FillBucket(options ) { this.zoom = options.zoom; this.overscaling = options.overscaling; this.layers = options.layers; this.layerIds = this.layers.map(function (layer) { return layer.id; }); this.index = options.index; this.hasPattern = false; this.layoutVertexArray = new StructArrayLayout2i4(); this.indexArray = new StructArrayLayout3ui6(); this.indexArray2 = new StructArrayLayout2ui4(); this.programConfigurations = new ProgramConfigurationSet(members$1, options.layers, options.zoom); this.segments = new SegmentVector(); this.segments2 = new SegmentVector(); this.stateDependentLayerIds = this.layers.filter(function (l) { return l.isStateDependent(); }).map(function (l) { return l.id; }); }; FillBucket.prototype.populate = function populate (features , options ) { this.features = []; this.hasPattern = hasPattern('fill', this.layers, options); for (var i = 0, list = features; i < list.length; i += 1) { var ref = list[i]; var feature = ref.feature; var index = ref.index; var sourceLayerIndex = ref.sourceLayerIndex; if (!this.layers[0]._featureFilter(new EvaluationParameters(this.zoom), feature)) { continue; } var geometry = loadGeometry(feature); var patternFeature = { sourceLayerIndex: sourceLayerIndex, index: index, geometry: geometry, properties: feature.properties, type: feature.type, patterns: {} }; if (typeof feature.id !== 'undefined') { patternFeature.id = feature.id; } if (this.hasPattern) { this.features.push(addPatternDependencies('fill', this.layers, patternFeature, this.zoom, options)); } else { this.addFeature(patternFeature, geometry, index, {}); } options.featureIndex.insert(feature, geometry, index, sourceLayerIndex, this.index); } }; FillBucket.prototype.update = function update (states , vtLayer , imagePositions ) { if (!this.stateDependentLayers.length) { return; } this.programConfigurations.updatePaintArrays(states, vtLayer, this.stateDependentLayers, imagePositions); }; FillBucket.prototype.addFeatures = function addFeatures (options , imagePositions ) { for (var i = 0, list = this.features; i < list.length; i += 1) { var feature = list[i]; var geometry = feature.geometry; this.addFeature(feature, geometry, feature.index, imagePositions); } }; FillBucket.prototype.isEmpty = function isEmpty () { return this.layoutVertexArray.length === 0; }; FillBucket.prototype.uploadPending = function uploadPending () { return !this.uploaded || this.programConfigurations.needsUpload; }; FillBucket.prototype.upload = function upload (context ) { if (!this.uploaded) { this.layoutVertexBuffer = context.createVertexBuffer(this.layoutVertexArray, members$1); this.indexBuffer = context.createIndexBuffer(this.indexArray); this.indexBuffer2 = context.createIndexBuffer(this.indexArray2); } this.programConfigurations.upload(context); this.uploaded = true; }; FillBucket.prototype.destroy = function destroy () { if (!this.layoutVertexBuffer) { return; } this.layoutVertexBuffer.destroy(); this.indexBuffer.destroy(); this.indexBuffer2.destroy(); this.programConfigurations.destroy(); this.segments.destroy(); this.segments2.destroy(); }; FillBucket.prototype.addFeature = function addFeature (feature , geometry , index , imagePositions ) { for (var i$4 = 0, list$2 = classifyRings(geometry, EARCUT_MAX_RINGS); i$4 < list$2.length; i$4 += 1) { var polygon = list$2[i$4]; var numVertices = 0; for (var i$2 = 0, list = polygon; i$2 < list.length; i$2 += 1) { var ring = list[i$2]; numVertices += ring.length; } var triangleSegment = this.segments.prepareSegment(numVertices, this.layoutVertexArray, this.indexArray); var triangleIndex = triangleSegment.vertexLength; var flattened = []; var holeIndices = []; for (var i$3 = 0, list$1 = polygon; i$3 < list$1.length; i$3 += 1) { var ring$1 = list$1[i$3]; if (ring$1.length === 0) { continue; } if (ring$1 !== polygon[0]) { holeIndices.push(flattened.length / 2); } var lineSegment = this.segments2.prepareSegment(ring$1.length, this.layoutVertexArray, this.indexArray2); var lineIndex = lineSegment.vertexLength; this.layoutVertexArray.emplaceBack(ring$1[0].x, ring$1[0].y); this.indexArray2.emplaceBack(lineIndex + ring$1.length - 1, lineIndex); flattened.push(ring$1[0].x); flattened.push(ring$1[0].y); for (var i = 1; i < ring$1.length; i++) { this.layoutVertexArray.emplaceBack(ring$1[i].x, ring$1[i].y); this.indexArray2.emplaceBack(lineIndex + i - 1, lineIndex + i); flattened.push(ring$1[i].x); flattened.push(ring$1[i].y); } lineSegment.vertexLength += ring$1.length; lineSegment.primitiveLength += ring$1.length; } var indices = earcut_1(flattened, holeIndices); assert_1(indices.length % 3 === 0); for (var i$1 = 0; i$1 < indices.length; i$1 += 3) { this.indexArray.emplaceBack( triangleIndex + indices[i$1], triangleIndex + indices[i$1 + 1], triangleIndex + indices[i$1 + 2]); } triangleSegment.vertexLength += numVertices; triangleSegment.primitiveLength += indices.length / 3; } this.programConfigurations.populatePaintArrays(this.layoutVertexArray.length, feature, index, imagePositions); }; register('FillBucket', FillBucket, {omit: ['layers', 'features']}); // This file is generated. Edit build/generate-style-code.js, then run `yarn run codegen`. var paint$4 = new Properties({ "fill-antialias": new DataConstantProperty(spec["paint_fill"]["fill-antialias"]), "fill-opacity": new DataDrivenProperty(spec["paint_fill"]["fill-opacity"]), "fill-color": new DataDrivenProperty(spec["paint_fill"]["fill-color"]), "fill-outline-color": new DataDrivenProperty(spec["paint_fill"]["fill-outline-color"]), "fill-translate": new DataConstantProperty(spec["paint_fill"]["fill-translate"]), "fill-translate-anchor": new DataConstantProperty(spec["paint_fill"]["fill-translate-anchor"]), "fill-pattern": new CrossFadedDataDrivenProperty(spec["paint_fill"]["fill-pattern"]), }); // Note: without adding the explicit type annotation, Flow infers weaker types // for these objects from their use in the constructor to StyleLayer, as // {layout?: Properties<...>, paint: Properties<...>} var properties$3 = ({ paint: paint$4 } ); // var FillStyleLayer = /*@__PURE__*/(function (StyleLayer) { function FillStyleLayer(layer ) { StyleLayer.call(this, layer, properties$3); } if ( StyleLayer ) FillStyleLayer.__proto__ = StyleLayer; FillStyleLayer.prototype = Object.create( StyleLayer && StyleLayer.prototype ); FillStyleLayer.prototype.constructor = FillStyleLayer; FillStyleLayer.prototype.recalculate = function recalculate (parameters ) { StyleLayer.prototype.recalculate.call(this, parameters); var outlineColor = this.paint._values['fill-outline-color']; if (outlineColor.value.kind === 'constant' && outlineColor.value.value === undefined) { this.paint._values['fill-outline-color'] = this.paint._values['fill-color']; } }; FillStyleLayer.prototype.createBucket = function createBucket (parameters ) { return new FillBucket(parameters); }; FillStyleLayer.prototype.queryRadius = function queryRadius () { return translateDistance(this.paint.get('fill-translate')); }; FillStyleLayer.prototype.queryIntersectsFeature = function queryIntersectsFeature (queryGeometry , feature , featureState , geometry , zoom , transform , pixelsToTileUnits ) { var translatedPolygon = translate(queryGeometry, this.paint.get('fill-translate'), this.paint.get('fill-translate-anchor'), transform.angle, pixelsToTileUnits); return polygonIntersectsMultiPolygon(translatedPolygon, geometry); }; FillStyleLayer.prototype.isTileClipped = function isTileClipped () { return true; }; return FillStyleLayer; }(StyleLayer)); // var layout$3 = createLayout([ {name: 'a_pos', components: 2, type: 'Int16'}, {name: 'a_normal_ed', components: 4, type: 'Int16'} ], 4); var members$2 = layout$3.members; var size$2 = layout$3.size; var alignment$2 = layout$3.alignment; 'use strict'; var vectortilefeature = VectorTileFeature; function VectorTileFeature(pbf, end, extent, keys, values) { // Public this.properties = {}; this.extent = extent; this.type = 0; // Private this._pbf = pbf; this._geometry = -1; this._keys = keys; this._values = values; pbf.readFields(readFeature, this, end); } function readFeature(tag, feature, pbf) { if (tag == 1) { feature.id = pbf.readVarint(); } else if (tag == 2) { readTag(pbf, feature); } else if (tag == 3) { feature.type = pbf.readVarint(); } else if (tag == 4) { feature._geometry = pbf.pos; } } function readTag(pbf, feature) { var end = pbf.readVarint() + pbf.pos; while (pbf.pos < end) { var key = feature._keys[pbf.readVarint()], value = feature._values[pbf.readVarint()]; feature.properties[key] = value; } } VectorTileFeature.types = ['Unknown', 'Point', 'LineString', 'Polygon']; VectorTileFeature.prototype.loadGeometry = function() { var pbf = this._pbf; pbf.pos = this._geometry; var end = pbf.readVarint() + pbf.pos, cmd = 1, length = 0, x = 0, y = 0, lines = [], line; while (pbf.pos < end) { if (length <= 0) { var cmdLen = pbf.readVarint(); cmd = cmdLen & 0x7; length = cmdLen >> 3; } length--; if (cmd === 1 || cmd === 2) { x += pbf.readSVarint(); y += pbf.readSVarint(); if (cmd === 1) { // moveTo if (line) { lines.push(line); } line = []; } line.push(new pointGeometry(x, y)); } else if (cmd === 7) { // Workaround for https://github.com/mapbox/mapnik-vector-tile/issues/90 if (line) { line.push(line[0].clone()); // closePolygon } } else { throw new Error('unknown command ' + cmd); } } if (line) { lines.push(line); } return lines; }; VectorTileFeature.prototype.bbox = function() { var pbf = this._pbf; pbf.pos = this._geometry; var end = pbf.readVarint() + pbf.pos, cmd = 1, length = 0, x = 0, y = 0, x1 = Infinity, x2 = -Infinity, y1 = Infinity, y2 = -Infinity; while (pbf.pos < end) { if (length <= 0) { var cmdLen = pbf.readVarint(); cmd = cmdLen & 0x7; length = cmdLen >> 3; } length--; if (cmd === 1 || cmd === 2) { x += pbf.readSVarint(); y += pbf.readSVarint(); if (x < x1) { x1 = x; } if (x > x2) { x2 = x; } if (y < y1) { y1 = y; } if (y > y2) { y2 = y; } } else if (cmd !== 7) { throw new Error('unknown command ' + cmd); } } return [x1, y1, x2, y2]; }; VectorTileFeature.prototype.toGeoJSON = function(x, y, z) { var size = this.extent * Math.pow(2, z), x0 = this.extent * x, y0 = this.extent * y, coords = this.loadGeometry(), type = VectorTileFeature.types[this.type], i, j; function project(line) { for (var j = 0; j < line.length; j++) { var p = line[j], y2 = 180 - (p.y + y0) * 360 / size; line[j] = [ (p.x + x0) * 360 / size - 180, 360 / Math.PI * Math.atan(Math.exp(y2 * Math.PI / 180)) - 90 ]; } } switch (this.type) { case 1: var points = []; for (i = 0; i < coords.length; i++) { points[i] = coords[i][0]; } coords = points; project(coords); break; case 2: for (i = 0; i < coords.length; i++) { project(coords[i]); } break; case 3: coords = classifyRings$1(coords); for (i = 0; i < coords.length; i++) { for (j = 0; j < coords[i].length; j++) { project(coords[i][j]); } } break; } if (coords.length === 1) { coords = coords[0]; } else { type = 'Multi' + type; } var result = { type: "Feature", geometry: { type: type, coordinates: coords }, properties: this.properties }; if ('id' in this) { result.id = this.id; } return result; }; // classifies an array of rings into polygons with outer rings and holes function classifyRings$1(rings) { var len = rings.length; if (len <= 1) { return [rings]; } var polygons = [], polygon, ccw; for (var i = 0; i < len; i++) { var area = signedArea$1(rings[i]); if (area === 0) { continue; } if (ccw === undefined) { ccw = area < 0; } if (ccw === area < 0) { if (polygon) { polygons.push(polygon); } polygon = [rings[i]]; } else { polygon.push(rings[i]); } } if (polygon) { polygons.push(polygon); } return polygons; } function signedArea$1(ring) { var sum = 0; for (var i = 0, len = ring.length, j = len - 1, p1, p2; i < len; j = i++) { p1 = ring[i]; p2 = ring[j]; sum += (p2.x - p1.x) * (p1.y + p2.y); } return sum; } 'use strict'; var vectortilelayer = VectorTileLayer; function VectorTileLayer(pbf, end) { // Public this.version = 1; this.name = null; this.extent = 4096; this.length = 0; // Private this._pbf = pbf; this._keys = []; this._values = []; this._features = []; pbf.readFields(readLayer, this, end); this.length = this._features.length; } function readLayer(tag, layer, pbf) { if (tag === 15) { layer.version = pbf.readVarint(); } else if (tag === 1) { layer.name = pbf.readString(); } else if (tag === 5) { layer.extent = pbf.readVarint(); } else if (tag === 2) { layer._features.push(pbf.pos); } else if (tag === 3) { layer._keys.push(pbf.readString()); } else if (tag === 4) { layer._values.push(readValueMessage(pbf)); } } function readValueMessage(pbf) { var value = null, end = pbf.readVarint() + pbf.pos; while (pbf.pos < end) { var tag = pbf.readVarint() >> 3; value = tag === 1 ? pbf.readString() : tag === 2 ? pbf.readFloat() : tag === 3 ? pbf.readDouble() : tag === 4 ? pbf.readVarint64() : tag === 5 ? pbf.readVarint() : tag === 6 ? pbf.readSVarint() : tag === 7 ? pbf.readBoolean() : null; } return value; } // return feature `i` from this layer as a `VectorTileFeature` VectorTileLayer.prototype.feature = function(i) { if (i < 0 || i >= this._features.length) { throw new Error('feature index out of bounds'); } this._pbf.pos = this._features[i]; var end = this._pbf.readVarint() + this._pbf.pos; return new vectortilefeature(this._pbf, end, this.extent, this._keys, this._values); }; 'use strict'; var vectortile = VectorTile; function VectorTile(pbf, end) { this.layers = pbf.readFields(readTile, {}, end); } function readTile(tag, layers, pbf) { if (tag === 3) { var layer = new vectortilelayer(pbf, pbf.readVarint() + pbf.pos); if (layer.length) { layers[layer.name] = layer; } } } var VectorTile$1 = vectortile; var VectorTileFeature$1 = vectortilefeature; var VectorTileLayer$1 = vectortilelayer; var vectorTile = { VectorTile: VectorTile$1, VectorTileFeature: VectorTileFeature$1, VectorTileLayer: VectorTileLayer$1 }; // var vectorTileFeatureTypes = vectorTile.VectorTileFeature.types; var EARCUT_MAX_RINGS$1 = 500; var FACTOR = Math.pow(2, 13); function addVertex(vertexArray, x, y, nx, ny, nz, t, e) { vertexArray.emplaceBack( // a_pos x, y, // a_normal_ed: 3-component normal and 1-component edgedistance Math.floor(nx * FACTOR) * 2 + t, ny * FACTOR * 2, nz * FACTOR * 2, // edgedistance (used for wrapping patterns around extrusion sides) Math.round(e) ); } var FillExtrusionBucket = function FillExtrusionBucket(options ) { this.zoom = options.zoom; this.overscaling = options.overscaling; this.layers = options.layers; this.layerIds = this.layers.map(function (layer) { return layer.id; }); this.index = options.index; this.hasPattern = false; this.layoutVertexArray = new StructArrayLayout2i4i12(); this.indexArray = new StructArrayLayout3ui6(); this.programConfigurations = new ProgramConfigurationSet(members$2, options.layers, options.zoom); this.segments = new SegmentVector(); this.stateDependentLayerIds = this.layers.filter(function (l) { return l.isStateDependent(); }).map(function (l) { return l.id; }); }; FillExtrusionBucket.prototype.populate = function populate (features , options ) { this.features = []; this.hasPattern = hasPattern('fill-extrusion', this.layers, options); for (var i = 0, list = features; i < list.length; i += 1) { var ref = list[i]; var feature = ref.feature; var index = ref.index; var sourceLayerIndex = ref.sourceLayerIndex; if (!this.layers[0]._featureFilter(new EvaluationParameters(this.zoom), feature)) { continue; } var geometry = loadGeometry(feature); var patternFeature = { sourceLayerIndex: sourceLayerIndex, index: index, geometry: geometry, properties: feature.properties, type: feature.type, patterns: {} }; if (typeof feature.id !== 'undefined') { patternFeature.id = feature.id; } if (this.hasPattern) { this.features.push(addPatternDependencies('fill-extrusion', this.layers, patternFeature, this.zoom, options)); } else { this.addFeature(patternFeature, geometry, index, {}); } options.featureIndex.insert(feature, geometry, index, sourceLayerIndex, this.index, true); } }; FillExtrusionBucket.prototype.addFeatures = function addFeatures (options , imagePositions ) { for (var i = 0, list = this.features; i < list.length; i += 1) { var feature = list[i]; var geometry = feature.geometry; this.addFeature(feature, geometry, feature.index, imagePositions); } }; FillExtrusionBucket.prototype.update = function update (states , vtLayer , imagePositions ) { if (!this.stateDependentLayers.length) { return; } this.programConfigurations.updatePaintArrays(states, vtLayer, this.stateDependentLayers, imagePositions); }; FillExtrusionBucket.prototype.isEmpty = function isEmpty () { return this.layoutVertexArray.length === 0; }; FillExtrusionBucket.prototype.uploadPending = function uploadPending () { return !this.uploaded || this.programConfigurations.needsUpload; }; FillExtrusionBucket.prototype.upload = function upload (context ) { if (!this.uploaded) { this.layoutVertexBuffer = context.createVertexBuffer(this.layoutVertexArray, members$2); this.indexBuffer = context.createIndexBuffer(this.indexArray); } this.programConfigurations.upload(context); this.uploaded = true; }; FillExtrusionBucket.prototype.destroy = function destroy () { if (!this.layoutVertexBuffer) { return; } this.layoutVertexBuffer.destroy(); this.indexBuffer.destroy(); this.programConfigurations.destroy(); this.segments.destroy(); }; FillExtrusionBucket.prototype.addFeature = function addFeature (feature , geometry , index , imagePositions ) { for (var i$4 = 0, list$3 = classifyRings(geometry, EARCUT_MAX_RINGS$1); i$4 < list$3.length; i$4 += 1) { var polygon = list$3[i$4]; var numVertices = 0; for (var i$1 = 0, list = polygon; i$1 < list.length; i$1 += 1) { var ring = list[i$1]; numVertices += ring.length; } var segment = this.segments.prepareSegment(4, this.layoutVertexArray, this.indexArray); for (var i$2 = 0, list$1 = polygon; i$2 < list$1.length; i$2 += 1) { var ring$1 = list$1[i$2]; if (ring$1.length === 0) { continue; } if (isEntirelyOutside(ring$1)) { continue; } var edgeDistance = 0; for (var p = 0; p < ring$1.length; p++) { var p1 = ring$1[p]; if (p >= 1) { var p2 = ring$1[p - 1]; if (!isBoundaryEdge(p1, p2)) { if (segment.vertexLength + 4 > SegmentVector.MAX_VERTEX_ARRAY_LENGTH) { segment = this.segments.prepareSegment(4, this.layoutVertexArray, this.indexArray); } var perp = p1.sub(p2)._perp()._unit(); var dist = p2.dist(p1); if (edgeDistance + dist > 32768) { edgeDistance = 0; } addVertex(this.layoutVertexArray, p1.x, p1.y, perp.x, perp.y, 0, 0, edgeDistance); addVertex(this.layoutVertexArray, p1.x, p1.y, perp.x, perp.y, 0, 1, edgeDistance); edgeDistance += dist; addVertex(this.layoutVertexArray, p2.x, p2.y, perp.x, perp.y, 0, 0, edgeDistance); addVertex(this.layoutVertexArray, p2.x, p2.y, perp.x, perp.y, 0, 1, edgeDistance); var bottomRight = segment.vertexLength; // ┌──────┐ // │ 0 1 │ Counter-clockwise winding order. // │ │ Triangle 1: 0 => 2 => 1 // │ 2 3 │ Triangle 2: 1 => 2 => 3 // └──────┘ this.indexArray.emplaceBack(bottomRight, bottomRight + 2, bottomRight + 1); this.indexArray.emplaceBack(bottomRight + 1, bottomRight + 2, bottomRight + 3); segment.vertexLength += 4; segment.primitiveLength += 2; } } } } if (segment.vertexLength + numVertices > SegmentVector.MAX_VERTEX_ARRAY_LENGTH) { segment = this.segments.prepareSegment(numVertices, this.layoutVertexArray, this.indexArray); } //Only triangulate and draw the area of the feature if it is a polygon //Other feature types (e.g. LineString) do not have area, so triangulation is pointless / undefined if (vectorTileFeatureTypes[feature.type] !== 'Polygon') { continue; } var flattened = []; var holeIndices = []; var triangleIndex = segment.vertexLength; for (var i$3 = 0, list$2 = polygon; i$3 < list$2.length; i$3 += 1) { var ring$2 = list$2[i$3]; if (ring$2.length === 0) { continue; } if (ring$2 !== polygon[0]) { holeIndices.push(flattened.length / 2); } for (var i = 0; i < ring$2.length; i++) { var p$1 = ring$2[i]; addVertex(this.layoutVertexArray, p$1.x, p$1.y, 0, 0, 1, 1, 0); flattened.push(p$1.x); flattened.push(p$1.y); } } var indices = earcut_1(flattened, holeIndices); assert_1(indices.length % 3 === 0); for (var j = 0; j < indices.length; j += 3) { // Counter-clockwise winding order. this.indexArray.emplaceBack( triangleIndex + indices[j], triangleIndex + indices[j + 2], triangleIndex + indices[j + 1]); } segment.primitiveLength += indices.length / 3; segment.vertexLength += numVertices; } this.programConfigurations.populatePaintArrays(this.layoutVertexArray.length, feature, index, imagePositions); }; register('FillExtrusionBucket', FillExtrusionBucket, {omit: ['layers', 'features']}); function isBoundaryEdge(p1, p2) { return (p1.x === p2.x && (p1.x < 0 || p1.x > EXTENT)) || (p1.y === p2.y && (p1.y < 0 || p1.y > EXTENT)); } function isEntirelyOutside(ring) { return ring.every(function (p) { return p.x < 0; }) || ring.every(function (p) { return p.x > EXTENT; }) || ring.every(function (p) { return p.y < 0; }) || ring.every(function (p) { return p.y > EXTENT; }); } // This file is generated. Edit build/generate-style-code.js, then run `yarn run codegen`. var paint$5 = new Properties({ "fill-extrusion-opacity": new DataConstantProperty(spec["paint_fill-extrusion"]["fill-extrusion-opacity"]), "fill-extrusion-color": new DataDrivenProperty(spec["paint_fill-extrusion"]["fill-extrusion-color"]), "fill-extrusion-translate": new DataConstantProperty(spec["paint_fill-extrusion"]["fill-extrusion-translate"]), "fill-extrusion-translate-anchor": new DataConstantProperty(spec["paint_fill-extrusion"]["fill-extrusion-translate-anchor"]), "fill-extrusion-pattern": new CrossFadedDataDrivenProperty(spec["paint_fill-extrusion"]["fill-extrusion-pattern"]), "fill-extrusion-height": new DataDrivenProperty(spec["paint_fill-extrusion"]["fill-extrusion-height"]), "fill-extrusion-base": new DataDrivenProperty(spec["paint_fill-extrusion"]["fill-extrusion-base"]), "fill-extrusion-vertical-gradient": new DataConstantProperty(spec["paint_fill-extrusion"]["fill-extrusion-vertical-gradient"]), }); // Note: without adding the explicit type annotation, Flow infers weaker types // for these objects from their use in the constructor to StyleLayer, as // {layout?: Properties<...>, paint: Properties<...>} var properties$4 = ({ paint: paint$5 } ); // var FillExtrusionStyleLayer = /*@__PURE__*/(function (StyleLayer) { function FillExtrusionStyleLayer(layer ) { StyleLayer.call(this, layer, properties$4); } if ( StyleLayer ) FillExtrusionStyleLayer.__proto__ = StyleLayer; FillExtrusionStyleLayer.prototype = Object.create( StyleLayer && StyleLayer.prototype ); FillExtrusionStyleLayer.prototype.constructor = FillExtrusionStyleLayer; FillExtrusionStyleLayer.prototype.createBucket = function createBucket (parameters ) { return new FillExtrusionBucket(parameters); }; FillExtrusionStyleLayer.prototype.queryRadius = function queryRadius () { return translateDistance(this.paint.get('fill-extrusion-translate')); }; FillExtrusionStyleLayer.prototype.is3D = function is3D () { return true; }; FillExtrusionStyleLayer.prototype.queryIntersectsFeature = function queryIntersectsFeature (queryGeometry , feature , featureState , geometry , zoom , transform , pixelsToTileUnits , pixelPosMatrix ) { var translatedPolygon = translate(queryGeometry, this.paint.get('fill-extrusion-translate'), this.paint.get('fill-extrusion-translate-anchor'), transform.angle, pixelsToTileUnits); var height = this.paint.get('fill-extrusion-height').evaluate(feature, featureState); var base = this.paint.get('fill-extrusion-base').evaluate(feature, featureState); var projectedQueryGeometry = projectQueryGeometry$1(translatedPolygon, pixelPosMatrix, transform, 0); var projected = projectExtrusion(geometry, base, height, pixelPosMatrix); var projectedBase = projected[0]; var projectedTop = projected[1]; return checkIntersection(projectedBase, projectedTop, projectedQueryGeometry); }; return FillExtrusionStyleLayer; }(StyleLayer)); function dot$5(a, b) { return a.x * b.x + a.y * b.y; } function getIntersectionDistance(projectedQueryGeometry , projectedFace ) { if (projectedQueryGeometry.length === 1) { // For point queries calculate the z at which the point intersects the face // using barycentric coordinates. // Find the barycentric coordinates of the projected point within the first // triangle of the face, using only the xy plane. It doesn't matter if the // point is outside the first triangle because all the triangles in the face // are in the same plane. var a = projectedFace[0]; var b = projectedFace[1]; var c = projectedFace[3]; var p = projectedQueryGeometry[0]; var ab = b.sub(a); var ac = c.sub(a); var ap = p.sub(a); var dotABAB = dot$5(ab, ab); var dotABAC = dot$5(ab, ac); var dotACAC = dot$5(ac, ac); var dotAPAB = dot$5(ap, ab); var dotAPAC = dot$5(ap, ac); var denom = dotABAB * dotACAC - dotABAC * dotABAC; var v = (dotACAC * dotAPAB - dotABAC * dotAPAC) / denom; var w = (dotABAB * dotAPAC - dotABAC * dotAPAB) / denom; var u = 1 - v - w; // Use the barycentric weighting along with the original triangle z coordinates to get the point of intersection. return a.z * u + b.z * v + c.z * w; } else { // The counts as closest is less clear when the query is a box. This // returns the distance to the nearest point on the face, whether it is // within the query or not. It could be more correct to return the // distance to the closest point within the query box but this would be // more complicated and expensive to calculate with little benefit. var closestDistance = Infinity; for (var i = 0, list = projectedFace; i < list.length; i += 1) { var p$1 = list[i]; closestDistance = Math.min(closestDistance, p$1.z); } return closestDistance; } } function checkIntersection(projectedBase , projectedTop , projectedQueryGeometry ) { var closestDistance = Infinity; if (polygonIntersectsMultiPolygon(projectedQueryGeometry, projectedTop)) { closestDistance = getIntersectionDistance(projectedQueryGeometry, projectedTop[0]); } for (var r = 0; r < projectedTop.length; r++) { var ringTop = projectedTop[r]; var ringBase = projectedBase[r]; for (var p = 0; p < ringTop.length - 1; p++) { var topA = ringTop[p]; var topB = ringTop[p + 1]; var baseA = ringBase[p]; var baseB = ringBase[p + 1]; var face = [topA, topB, baseB, baseA, topA]; if (polygonIntersectsPolygon(projectedQueryGeometry, face)) { closestDistance = Math.min(closestDistance, getIntersectionDistance(projectedQueryGeometry, face)); } } } return closestDistance === Infinity ? false : closestDistance; } /* * Project the geometry using matrix `m`. This is essentially doing * `vec4.transformMat4([], [p.x, p.y, z, 1], m)` but the multiplication * is inlined so that parts of the projection that are the same across * different points can only be done once. This produced a measurable * performance improvement. */ function projectExtrusion(geometry , zBase , zTop , m ) { var projectedBase = []; var projectedTop = []; var baseXZ = m[8] * zBase; var baseYZ = m[9] * zBase; var baseZZ = m[10] * zBase; var baseWZ = m[11] * zBase; var topXZ = m[8] * zTop; var topYZ = m[9] * zTop; var topZZ = m[10] * zTop; var topWZ = m[11] * zTop; for (var i$1 = 0, list$1 = geometry; i$1 < list$1.length; i$1 += 1) { var r = list$1[i$1]; var ringBase = []; var ringTop = []; for (var i = 0, list = r; i < list.length; i += 1) { var p = list[i]; var x = p.x; var y = p.y; var sX = m[0] * x + m[4] * y + m[12]; var sY = m[1] * x + m[5] * y + m[13]; var sZ = m[2] * x + m[6] * y + m[14]; var sW = m[3] * x + m[7] * y + m[15]; var baseX = sX + baseXZ; var baseY = sY + baseYZ; var baseZ = sZ + baseZZ; var baseW = sW + baseWZ; var topX = sX + topXZ; var topY = sY + topYZ; var topZ = sZ + topZZ; var topW = sW + topWZ; var b = new pointGeometry(baseX / baseW, baseY / baseW); b.z = baseZ / baseW; ringBase.push(b); var t = new pointGeometry(topX / topW, topY / topW); t.z = topZ / topW; ringTop.push(t); } projectedBase.push(ringBase); projectedTop.push(ringTop); } return [projectedBase, projectedTop]; } function projectQueryGeometry$1(queryGeometry , pixelPosMatrix , transform , z ) { var projectedQueryGeometry = []; for (var i = 0, list = queryGeometry; i < list.length; i += 1) { var p = list[i]; var v = [p.x, p.y, z, 1]; transformMat4$1(v, v, pixelPosMatrix); projectedQueryGeometry.push(new pointGeometry(v[0] / v[3], v[1] / v[3])); } return projectedQueryGeometry; } // var lineLayoutAttributes = createLayout([ {name: 'a_pos_normal', components: 4, type: 'Int16'}, {name: 'a_data', components: 4, type: 'Uint8'} ], 4); var members$3 = lineLayoutAttributes.members; var size$3 = lineLayoutAttributes.size; var alignment$3 = lineLayoutAttributes.alignment; // var vectorTileFeatureTypes$1 = vectorTile.VectorTileFeature.types; // NOTE ON EXTRUDE SCALE: // scale the extrusion vector so that the normal length is this value. // contains the "texture" normals (-1..1). this is distinct from the extrude // normals for line joins, because the x-value remains 0 for the texture // normal array, while the extrude normal actually moves the vertex to create // the acute/bevelled line join. var EXTRUDE_SCALE = 63; /* * Sharp corners cause dashed lines to tilt because the distance along the line * is the same at both the inner and outer corners. To improve the appearance of * dashed lines we add extra points near sharp corners so that a smaller part * of the line is tilted. * * COS_HALF_SHARP_CORNER controls how sharp a corner has to be for us to add an * extra vertex. The default is 75 degrees. * * The newly created vertices are placed SHARP_CORNER_OFFSET pixels from the corner. */ var COS_HALF_SHARP_CORNER = Math.cos(75 / 2 * (Math.PI / 180)); var SHARP_CORNER_OFFSET = 15; // The number of bits that is used to store the line distance in the buffer. var LINE_DISTANCE_BUFFER_BITS = 15; // We don't have enough bits for the line distance as we'd like to have, so // use this value to scale the line distance (in tile units) down to a smaller // value. This lets us store longer distances while sacrificing precision. var LINE_DISTANCE_SCALE = 1 / 2; // The maximum line distance, in tile units, that fits in the buffer. var MAX_LINE_DISTANCE = Math.pow(2, LINE_DISTANCE_BUFFER_BITS - 1) / LINE_DISTANCE_SCALE; function addLineVertex(layoutVertexBuffer, point , extrude , round , up , dir , linesofar ) { layoutVertexBuffer.emplaceBack( // a_pos_normal point.x, point.y, round ? 1 : 0, up ? 1 : -1, // a_data // add 128 to store a byte in an unsigned byte Math.round(EXTRUDE_SCALE * extrude.x) + 128, Math.round(EXTRUDE_SCALE * extrude.y) + 128, // Encode the -1/0/1 direction value into the first two bits of .z of a_data. // Combine it with the lower 6 bits of `linesofar` (shifted by 2 bites to make // room for the direction value). The upper 8 bits of `linesofar` are placed in // the `w` component. `linesofar` is scaled down by `LINE_DISTANCE_SCALE` so that // we can store longer distances while sacrificing precision. ((dir === 0 ? 0 : (dir < 0 ? -1 : 1)) + 1) | (((linesofar * LINE_DISTANCE_SCALE) & 0x3F) << 2), (linesofar * LINE_DISTANCE_SCALE) >> 6); } /** * @private */ var LineBucket = function LineBucket(options ) { this.zoom = options.zoom; this.overscaling = options.overscaling; this.layers = options.layers; this.layerIds = this.layers.map(function (layer) { return layer.id; }); this.index = options.index; this.features = []; this.hasPattern = false; this.layoutVertexArray = new StructArrayLayout4i4ub12(); this.indexArray = new StructArrayLayout3ui6(); this.programConfigurations = new ProgramConfigurationSet(members$3, options.layers, options.zoom); this.segments = new SegmentVector(); this.stateDependentLayerIds = this.layers.filter(function (l) { return l.isStateDependent(); }).map(function (l) { return l.id; }); }; LineBucket.prototype.populate = function populate (features , options ) { this.features = []; this.hasPattern = hasPattern('line', this.layers, options); for (var i = 0, list = features; i < list.length; i += 1) { var ref = list[i]; var feature = ref.feature; var index = ref.index; var sourceLayerIndex = ref.sourceLayerIndex; if (!this.layers[0]._featureFilter(new EvaluationParameters(this.zoom), feature)) { continue; } var geometry = loadGeometry(feature); var patternFeature = { sourceLayerIndex: sourceLayerIndex, index: index, geometry: geometry, properties: feature.properties, type: feature.type, patterns: {} }; if (typeof feature.id !== 'undefined') { patternFeature.id = feature.id; } if (this.hasPattern) { this.features.push(addPatternDependencies('line', this.layers, patternFeature, this.zoom, options)); } else { this.addFeature(patternFeature, geometry, index, {}); } options.featureIndex.insert(feature, geometry, index, sourceLayerIndex, this.index); } }; LineBucket.prototype.update = function update (states , vtLayer , imagePositions ) { if (!this.stateDependentLayers.length) { return; } this.programConfigurations.updatePaintArrays(states, vtLayer, this.stateDependentLayers, imagePositions); }; LineBucket.prototype.addFeatures = function addFeatures (options , imagePositions ) { for (var i = 0, list = this.features; i < list.length; i += 1) { var feature = list[i]; var geometry = feature.geometry; this.addFeature(feature, geometry, feature.index, imagePositions); } }; LineBucket.prototype.isEmpty = function isEmpty () { return this.layoutVertexArray.length === 0; }; LineBucket.prototype.uploadPending = function uploadPending () { return !this.uploaded || this.programConfigurations.needsUpload; }; LineBucket.prototype.upload = function upload (context ) { if (!this.uploaded) { this.layoutVertexBuffer = context.createVertexBuffer(this.layoutVertexArray, members$3); this.indexBuffer = context.createIndexBuffer(this.indexArray); } this.programConfigurations.upload(context); this.uploaded = true; }; LineBucket.prototype.destroy = function destroy () { if (!this.layoutVertexBuffer) { return; } this.layoutVertexBuffer.destroy(); this.indexBuffer.destroy(); this.programConfigurations.destroy(); this.segments.destroy(); }; LineBucket.prototype.addFeature = function addFeature (feature , geometry , index , imagePositions ) { var layout = this.layers[0].layout; var join = layout.get('line-join').evaluate(feature, {}); var cap = layout.get('line-cap'); var miterLimit = layout.get('line-miter-limit'); var roundLimit = layout.get('line-round-limit'); for (var i = 0, list = geometry; i < list.length; i += 1) { var line = list[i]; this.addLine(line, feature, join, cap, miterLimit, roundLimit, index, imagePositions); } }; LineBucket.prototype.addLine = function addLine (vertices , feature , join , cap , miterLimit , roundLimit , index , imagePositions ) { var lineDistances = null; if (!!feature.properties && feature.properties.hasOwnProperty('mapbox_clip_start') && feature.properties.hasOwnProperty('mapbox_clip_end')) { lineDistances = { start: feature.properties.mapbox_clip_start, end: feature.properties.mapbox_clip_end, tileTotal: undefined }; } var isPolygon = vectorTileFeatureTypes$1[feature.type] === 'Polygon'; // If the line has duplicate vertices at the ends, adjust start/length to remove them. var len = vertices.length; while (len >= 2 && vertices[len - 1].equals(vertices[len - 2])) { len--; } var first = 0; while (first < len - 1 && vertices[first].equals(vertices[first + 1])) { first++; } // Ignore invalid geometry. if (len < (isPolygon ? 3 : 2)) { return; } if (lineDistances) { lineDistances.tileTotal = calculateFullDistance(vertices, first, len); } if (join === 'bevel') { miterLimit = 1.05; } var sharpCornerOffset = SHARP_CORNER_OFFSET * (EXTENT / (512 * this.overscaling)); var firstVertex = vertices[first]; // we could be more precise, but it would only save a negligible amount of space var segment = this.segments.prepareSegment(len * 10, this.layoutVertexArray, this.indexArray); this.distance = 0; var beginCap = cap, endCap = isPolygon ? 'butt' : cap; var startOfLine = true; var currentVertex; var prevVertex = ((undefined ) ); var nextVertex = ((undefined ) ); var prevNormal = ((undefined ) ); var nextNormal = ((undefined ) ); var offsetA; var offsetB; // the last three vertices added this.e1 = this.e2 = this.e3 = -1; if (isPolygon) { currentVertex = vertices[len - 2]; nextNormal = firstVertex.sub(currentVertex)._unit()._perp(); } for (var i = first; i < len; i++) { nextVertex = isPolygon && i === len - 1 ? vertices[first + 1] : // if the line is closed, we treat the last vertex like the first vertices[i + 1]; // just the next vertex // if two consecutive vertices exist, skip the current one if (nextVertex && vertices[i].equals(nextVertex)) { continue; } if (nextNormal) { prevNormal = nextNormal; } if (currentVertex) { prevVertex = currentVertex; } currentVertex = vertices[i]; // Calculate the normal towards the next vertex in this line. In case // there is no next vertex, pretend that the line is continuing straight, // meaning that we are just using the previous normal. nextNormal = nextVertex ? nextVertex.sub(currentVertex)._unit()._perp() : prevNormal; // If we still don't have a previous normal, this is the beginning of a // non-closed line, so we're doing a straight "join". prevNormal = prevNormal || nextNormal; // Determine the normal of the join extrusion. It is the angle bisector // of the segments between the previous line and the next line. // In the case of 180° angles, the prev and next normals cancel each other out: // prevNormal + nextNormal = (0, 0), its magnitude is 0, so the unit vector would be // undefined. In that case, we're keeping the joinNormal at (0, 0), so that the cosHalfAngle // below will also become 0 and miterLength will become Infinity. var joinNormal = prevNormal.add(nextNormal); if (joinNormal.x !== 0 || joinNormal.y !== 0) { joinNormal._unit(); } /* joinNormal prevNormal * ↖ ↑ * .________. prevVertex * | * nextNormal ← | currentVertex * | * nextVertex ! * */ // Calculate the length of the miter (the ratio of the miter to the width). // Find the cosine of the angle between the next and join normals // using dot product. The inverse of that is the miter length. var cosHalfAngle = joinNormal.x * nextNormal.x + joinNormal.y * nextNormal.y; var miterLength = cosHalfAngle !== 0 ? 1 / cosHalfAngle : Infinity; var isSharpCorner = cosHalfAngle < COS_HALF_SHARP_CORNER && prevVertex && nextVertex; if (isSharpCorner && i > first) { var prevSegmentLength = currentVertex.dist(prevVertex); if (prevSegmentLength > 2 * sharpCornerOffset) { var newPrevVertex = currentVertex.sub(currentVertex.sub(prevVertex)._mult(sharpCornerOffset / prevSegmentLength)._round()); this.distance += newPrevVertex.dist(prevVertex); this.addCurrentVertex(newPrevVertex, this.distance, prevNormal.mult(1), 0, 0, false, segment, lineDistances); prevVertex = newPrevVertex; } } // The join if a middle vertex, otherwise the cap. var middleVertex = prevVertex && nextVertex; var currentJoin = middleVertex ? join : nextVertex ? beginCap : endCap; if (middleVertex && currentJoin === 'round') { if (miterLength < roundLimit) { currentJoin = 'miter'; } else if (miterLength <= 2) { currentJoin = 'fakeround'; } } if (currentJoin === 'miter' && miterLength > miterLimit) { currentJoin = 'bevel'; } if (currentJoin === 'bevel') { // The maximum extrude length is 128 / 63 = 2 times the width of the line // so if miterLength >= 2 we need to draw a different type of bevel here. if (miterLength > 2) { currentJoin = 'flipbevel'; } // If the miterLength is really small and the line bevel wouldn't be visible, // just draw a miter join to save a triangle. if (miterLength < miterLimit) { currentJoin = 'miter'; } } // Calculate how far along the line the currentVertex is if (prevVertex) { this.distance += currentVertex.dist(prevVertex); } if (currentJoin === 'miter') { joinNormal._mult(miterLength); this.addCurrentVertex(currentVertex, this.distance, joinNormal, 0, 0, false, segment, lineDistances); } else if (currentJoin === 'flipbevel') { // miter is too big, flip the direction to make a beveled join if (miterLength > 100) { // Almost parallel lines joinNormal = nextNormal.clone().mult(-1); } else { var direction = prevNormal.x * nextNormal.y - prevNormal.y * nextNormal.x > 0 ? -1 : 1; var bevelLength = miterLength * prevNormal.add(nextNormal).mag() / prevNormal.sub(nextNormal).mag(); joinNormal._perp()._mult(bevelLength * direction); } this.addCurrentVertex(currentVertex, this.distance, joinNormal, 0, 0, false, segment, lineDistances); this.addCurrentVertex(currentVertex, this.distance, joinNormal.mult(-1), 0, 0, false, segment, lineDistances); } else if (currentJoin === 'bevel' || currentJoin === 'fakeround') { var lineTurnsLeft = (prevNormal.x * nextNormal.y - prevNormal.y * nextNormal.x) > 0; var offset = -Math.sqrt(miterLength * miterLength - 1); if (lineTurnsLeft) { offsetB = 0; offsetA = offset; } else { offsetA = 0; offsetB = offset; } // Close previous segment with a bevel if (!startOfLine) { this.addCurrentVertex(currentVertex, this.distance, prevNormal, offsetA, offsetB, false, segment, lineDistances); } if (currentJoin === 'fakeround') { // The join angle is sharp enough that a round join would be visible. // Bevel joins fill the gap between segments with a single pie slice triangle. // Create a round join by adding multiple pie slices. The join isn't actually round, but // it looks like it is at the sizes we render lines at. // Add more triangles for sharper angles. // This math is just a good enough approximation. It isn't "correct". var n = Math.floor((0.5 - (cosHalfAngle - 0.5)) * 8); var approxFractionalJoinNormal = (void 0); for (var m = 0; m < n; m++) { approxFractionalJoinNormal = nextNormal.mult((m + 1) / (n + 1))._add(prevNormal)._unit(); this.addPieSliceVertex(currentVertex, this.distance, approxFractionalJoinNormal, lineTurnsLeft, segment, lineDistances); } this.addPieSliceVertex(currentVertex, this.distance, joinNormal, lineTurnsLeft, segment, lineDistances); for (var k = n - 1; k >= 0; k--) { approxFractionalJoinNormal = prevNormal.mult((k + 1) / (n + 1))._add(nextNormal)._unit(); this.addPieSliceVertex(currentVertex, this.distance, approxFractionalJoinNormal, lineTurnsLeft, segment, lineDistances); } } // Start next segment if (nextVertex) { this.addCurrentVertex(currentVertex, this.distance, nextNormal, -offsetA, -offsetB, false, segment, lineDistances); } } else if (currentJoin === 'butt') { if (!startOfLine) { // Close previous segment with a butt this.addCurrentVertex(currentVertex, this.distance, prevNormal, 0, 0, false, segment, lineDistances); } // Start next segment with a butt if (nextVertex) { this.addCurrentVertex(currentVertex, this.distance, nextNormal, 0, 0, false, segment, lineDistances); } } else if (currentJoin === 'square') { if (!startOfLine) { // Close previous segment with a square cap this.addCurrentVertex(currentVertex, this.distance, prevNormal, 1, 1, false, segment, lineDistances); // The segment is done. Unset vertices to disconnect segments. this.e1 = this.e2 = -1; } // Start next segment if (nextVertex) { this.addCurrentVertex(currentVertex, this.distance, nextNormal, -1, -1, false, segment, lineDistances); } } else if (currentJoin === 'round') { if (!startOfLine) { // Close previous segment with butt this.addCurrentVertex(currentVertex, this.distance, prevNormal, 0, 0, false, segment, lineDistances); // Add round cap or linejoin at end of segment this.addCurrentVertex(currentVertex, this.distance, prevNormal, 1, 1, true, segment, lineDistances); // The segment is done. Unset vertices to disconnect segments. this.e1 = this.e2 = -1; } // Start next segment with a butt if (nextVertex) { // Add round cap before first segment this.addCurrentVertex(currentVertex, this.distance, nextNormal, -1, -1, true, segment, lineDistances); this.addCurrentVertex(currentVertex, this.distance, nextNormal, 0, 0, false, segment, lineDistances); } } if (isSharpCorner && i < len - 1) { var nextSegmentLength = currentVertex.dist(nextVertex); if (nextSegmentLength > 2 * sharpCornerOffset) { var newCurrentVertex = currentVertex.add(nextVertex.sub(currentVertex)._mult(sharpCornerOffset / nextSegmentLength)._round()); this.distance += newCurrentVertex.dist(currentVertex); this.addCurrentVertex(newCurrentVertex, this.distance, nextNormal.mult(1), 0, 0, false, segment, lineDistances); currentVertex = newCurrentVertex; } } startOfLine = false; } this.programConfigurations.populatePaintArrays(this.layoutVertexArray.length, feature, index, imagePositions); }; /** * Add two vertices to the buffers. * * @param {Object} currentVertex the line vertex to add buffer vertices for * @param {number} distance the distance from the beginning of the line to the vertex * @param {number} endLeft extrude to shift the left vertex along the line * @param {number} endRight extrude to shift the left vertex along the line * @param {boolean} round whether this is a round cap * @private */ LineBucket.prototype.addCurrentVertex = function addCurrentVertex (currentVertex , distance , normal , endLeft , endRight , round , segment , distancesForScaling ) { var extrude; var layoutVertexArray = this.layoutVertexArray; var indexArray = this.indexArray; if (distancesForScaling) { // For gradient lines, scale distance from tile units to [0, 2^15) distance = scaleDistance(distance, distancesForScaling); } extrude = normal.clone(); if (endLeft) { extrude._sub(normal.perp()._mult(endLeft)); } addLineVertex(layoutVertexArray, currentVertex, extrude, round, false, endLeft, distance); this.e3 = segment.vertexLength++; if (this.e1 >= 0 && this.e2 >= 0) { indexArray.emplaceBack(this.e1, this.e2, this.e3); segment.primitiveLength++; } this.e1 = this.e2; this.e2 = this.e3; extrude = normal.mult(-1); if (endRight) { extrude._sub(normal.perp()._mult(endRight)); } addLineVertex(layoutVertexArray, currentVertex, extrude, round, true, -endRight, distance); this.e3 = segment.vertexLength++; if (this.e1 >= 0 && this.e2 >= 0) { indexArray.emplaceBack(this.e1, this.e2, this.e3); segment.primitiveLength++; } this.e1 = this.e2; this.e2 = this.e3; // There is a maximum "distance along the line" that we can store in the buffers. // When we get close to the distance, reset it to zero and add the vertex again with // a distance of zero. The max distance is determined by the number of bits we allocate // to `linesofar`. if (distance > MAX_LINE_DISTANCE / 2 && !distancesForScaling) { this.distance = 0; this.addCurrentVertex(currentVertex, this.distance, normal, endLeft, endRight, round, segment); } }; /** * Add a single new vertex and a triangle using two previous vertices. * This adds a pie slice triangle near a join to simulate round joins * * @param currentVertex the line vertex to add buffer vertices for * @param distance the distance from the beginning of the line to the vertex * @param extrude the offset of the new vertex from the currentVertex * @param lineTurnsLeft whether the line is turning left or right at this angle * @private */ LineBucket.prototype.addPieSliceVertex = function addPieSliceVertex (currentVertex , distance , extrude , lineTurnsLeft , segment , distancesForScaling ) { extrude = extrude.mult(lineTurnsLeft ? -1 : 1); var layoutVertexArray = this.layoutVertexArray; var indexArray = this.indexArray; if (distancesForScaling) { distance = scaleDistance(distance, distancesForScaling); } addLineVertex(layoutVertexArray, currentVertex, extrude, false, lineTurnsLeft, 0, distance); this.e3 = segment.vertexLength++; if (this.e1 >= 0 && this.e2 >= 0) { indexArray.emplaceBack(this.e1, this.e2, this.e3); segment.primitiveLength++; } if (lineTurnsLeft) { this.e2 = this.e3; } else { this.e1 = this.e3; } }; /** * Knowing the ratio of the full linestring covered by this tiled feature, as well * as the total distance (in tile units) of this tiled feature, and the distance * (in tile units) of the current vertex, we can determine the relative distance * of this vertex along the full linestring feature and scale it to [0, 2^15) * * @param {number} tileDistance the distance from the beginning of the tiled line to this vertex * @param {Object} stats * @param {number} stats.start the ratio (0-1) along a full original linestring feature of the start of this tiled line feature * @param {number} stats.end the ratio (0-1) along a full original linestring feature of the end of this tiled line feature * @param {number} stats.tileTotal the total distance, in tile units, of this tiled line feature * * @private */ function scaleDistance(tileDistance , stats ) { return ((tileDistance / stats.tileTotal) * (stats.end - stats.start) + stats.start) * (MAX_LINE_DISTANCE - 1); } /** * Calculate the total distance, in tile units, of this tiled line feature * * @param {Array} vertices the full geometry of this tiled line feature * @param {number} first the index in the vertices array representing the first vertex we should consider * @param {number} len the count of vertices we should consider from `first` * * @private */ function calculateFullDistance(vertices , first , len ) { var currentVertex, nextVertex; var total = 0; for (var i = first; i < len - 1; i++) { currentVertex = vertices[i]; nextVertex = vertices[i + 1]; total += currentVertex.dist(nextVertex); } return total; } register('LineBucket', LineBucket, {omit: ['layers', 'features']}); // This file is generated. Edit build/generate-style-code.js, then run `yarn run codegen`. var layout$4 = new Properties({ "line-cap": new DataConstantProperty(spec["layout_line"]["line-cap"]), "line-join": new DataDrivenProperty(spec["layout_line"]["line-join"]), "line-miter-limit": new DataConstantProperty(spec["layout_line"]["line-miter-limit"]), "line-round-limit": new DataConstantProperty(spec["layout_line"]["line-round-limit"]), }); var paint$6 = new Properties({ "line-opacity": new DataDrivenProperty(spec["paint_line"]["line-opacity"]), "line-color": new DataDrivenProperty(spec["paint_line"]["line-color"]), "line-translate": new DataConstantProperty(spec["paint_line"]["line-translate"]), "line-translate-anchor": new DataConstantProperty(spec["paint_line"]["line-translate-anchor"]), "line-width": new DataDrivenProperty(spec["paint_line"]["line-width"]), "line-gap-width": new DataDrivenProperty(spec["paint_line"]["line-gap-width"]), "line-offset": new DataDrivenProperty(spec["paint_line"]["line-offset"]), "line-blur": new DataDrivenProperty(spec["paint_line"]["line-blur"]), "line-dasharray": new CrossFadedProperty(spec["paint_line"]["line-dasharray"]), "line-pattern": new CrossFadedDataDrivenProperty(spec["paint_line"]["line-pattern"]), "line-gradient": new ColorRampProperty(spec["paint_line"]["line-gradient"]), }); // Note: without adding the explicit type annotation, Flow infers weaker types // for these objects from their use in the constructor to StyleLayer, as // {layout?: Properties<...>, paint: Properties<...>} var properties$5 = ({ paint: paint$6, layout: layout$4 } ); // var LineFloorwidthProperty = /*@__PURE__*/(function (DataDrivenProperty) { function LineFloorwidthProperty () { DataDrivenProperty.apply(this, arguments); } if ( DataDrivenProperty ) LineFloorwidthProperty.__proto__ = DataDrivenProperty; LineFloorwidthProperty.prototype = Object.create( DataDrivenProperty && DataDrivenProperty.prototype ); LineFloorwidthProperty.prototype.constructor = LineFloorwidthProperty; LineFloorwidthProperty.prototype.possiblyEvaluate = function possiblyEvaluate (value, parameters) { parameters = new EvaluationParameters(Math.floor(parameters.zoom), { now: parameters.now, fadeDuration: parameters.fadeDuration, zoomHistory: parameters.zoomHistory, transition: parameters.transition }); return DataDrivenProperty.prototype.possiblyEvaluate.call(this, value, parameters); }; LineFloorwidthProperty.prototype.evaluate = function evaluate (value, globals, feature, featureState) { globals = extend({}, globals, {zoom: Math.floor(globals.zoom)}); return DataDrivenProperty.prototype.evaluate.call(this, value, globals, feature, featureState); }; return LineFloorwidthProperty; }(DataDrivenProperty)); var lineFloorwidthProperty = new LineFloorwidthProperty(properties$5.paint.properties['line-width'].specification); lineFloorwidthProperty.useIntegerZoom = true; var LineStyleLayer = /*@__PURE__*/(function (StyleLayer) { function LineStyleLayer(layer ) { StyleLayer.call(this, layer, properties$5); } if ( StyleLayer ) LineStyleLayer.__proto__ = StyleLayer; LineStyleLayer.prototype = Object.create( StyleLayer && StyleLayer.prototype ); LineStyleLayer.prototype.constructor = LineStyleLayer; LineStyleLayer.prototype._handleSpecialPaintPropertyUpdate = function _handleSpecialPaintPropertyUpdate (name ) { if (name === 'line-gradient') { this._updateGradient(); } }; LineStyleLayer.prototype._updateGradient = function _updateGradient () { var expression = this._transitionablePaint._values['line-gradient'].value.expression; this.gradient = renderColorRamp(expression, 'lineProgress'); this.gradientTexture = null; }; LineStyleLayer.prototype.recalculate = function recalculate (parameters ) { StyleLayer.prototype.recalculate.call(this, parameters); (this.paint._values )['line-floorwidth'] = lineFloorwidthProperty.possiblyEvaluate(this._transitioningPaint._values['line-width'].value, parameters); }; LineStyleLayer.prototype.createBucket = function createBucket (parameters ) { return new LineBucket(parameters); }; LineStyleLayer.prototype.queryRadius = function queryRadius (bucket ) { var lineBucket = (bucket ); var width = getLineWidth( getMaximumPaintValue('line-width', this, lineBucket), getMaximumPaintValue('line-gap-width', this, lineBucket)); var offset = getMaximumPaintValue('line-offset', this, lineBucket); return width / 2 + Math.abs(offset) + translateDistance(this.paint.get('line-translate')); }; LineStyleLayer.prototype.queryIntersectsFeature = function queryIntersectsFeature (queryGeometry , feature , featureState , geometry , zoom , transform , pixelsToTileUnits ) { var translatedPolygon = translate(queryGeometry, this.paint.get('line-translate'), this.paint.get('line-translate-anchor'), transform.angle, pixelsToTileUnits); var halfWidth = pixelsToTileUnits / 2 * getLineWidth( this.paint.get('line-width').evaluate(feature, featureState), this.paint.get('line-gap-width').evaluate(feature, featureState)); var lineOffset = this.paint.get('line-offset').evaluate(feature, featureState); if (lineOffset) { geometry = offsetLine(geometry, lineOffset * pixelsToTileUnits); } return polygonIntersectsBufferedMultiLine(translatedPolygon, geometry, halfWidth); }; LineStyleLayer.prototype.isTileClipped = function isTileClipped () { return true; }; return LineStyleLayer; }(StyleLayer)); function getLineWidth(lineWidth, lineGapWidth) { if (lineGapWidth > 0) { return lineGapWidth + 2 * lineWidth; } else { return lineWidth; } } function offsetLine(rings, offset) { var newRings = []; var zero = new pointGeometry(0, 0); for (var k = 0; k < rings.length; k++) { var ring = rings[k]; var newRing = []; for (var i = 0; i < ring.length; i++) { var a = ring[i - 1]; var b = ring[i]; var c = ring[i + 1]; var aToB = i === 0 ? zero : b.sub(a)._unit()._perp(); var bToC = i === ring.length - 1 ? zero : c.sub(b)._unit()._perp(); var extrude = aToB._add(bToC)._unit(); var cosHalfAngle = extrude.x * bToC.x + extrude.y * bToC.y; extrude._mult(1 / cosHalfAngle); newRing.push(extrude._mult(offset)._add(b)); } newRings.push(newRing); } return newRings; } // var symbolLayoutAttributes = createLayout([ {name: 'a_pos_offset', components: 4, type: 'Int16'}, {name: 'a_data', components: 4, type: 'Uint16'} ]); var dynamicLayoutAttributes = createLayout([ { name: 'a_projected_pos', components: 3, type: 'Float32' } ], 4); var placementOpacityAttributes = createLayout([ { name: 'a_fade_opacity', components: 1, type: 'Uint32' } ], 4); var collisionVertexAttributes = createLayout([ { name: 'a_placed', components: 2, type: 'Uint8' }, { name: 'a_shift', components: 2, type: 'Float32'} ]); var collisionBox = createLayout([ // the box is centered around the anchor point { type: 'Int16', name: 'anchorPointX' }, { type: 'Int16', name: 'anchorPointY' }, // distances to the edges from the anchor { type: 'Int16', name: 'x1' }, { type: 'Int16', name: 'y1' }, { type: 'Int16', name: 'x2' }, { type: 'Int16', name: 'y2' }, // the index of the feature in the original vectortile { type: 'Uint32', name: 'featureIndex' }, // the source layer the feature appears in { type: 'Uint16', name: 'sourceLayerIndex' }, // the bucket the feature appears in { type: 'Uint16', name: 'bucketIndex' }, // collision circles for lines store their distance to the anchor in tile units // so that they can be ignored if the projected label doesn't extend into // the box area { type: 'Int16', name: 'radius' }, { type: 'Int16', name: 'signedDistanceFromAnchor' } ]); var collisionBoxLayout = createLayout([ // used to render collision boxes for debugging purposes {name: 'a_pos', components: 2, type: 'Int16'}, {name: 'a_anchor_pos', components: 2, type: 'Int16'}, {name: 'a_extrude', components: 2, type: 'Int16'} ], 4); var collisionCircleLayout = createLayout([ // used to render collision circles for debugging purposes {name: 'a_pos', components: 2, type: 'Int16'}, {name: 'a_anchor_pos', components: 2, type: 'Int16'}, {name: 'a_extrude', components: 2, type: 'Int16'} ], 4); var placement = createLayout([ { type: 'Int16', name: 'anchorX' }, { type: 'Int16', name: 'anchorY' }, { type: 'Uint16', name: 'glyphStartIndex' }, { type: 'Uint16', name: 'numGlyphs' }, { type: 'Uint32', name: 'vertexStartIndex' }, { type: 'Uint32', name: 'lineStartIndex' }, { type: 'Uint32', name: 'lineLength' }, { type: 'Uint16', name: 'segment' }, { type: 'Uint16', name: 'lowerSize' }, { type: 'Uint16', name: 'upperSize' }, { type: 'Float32', name: 'lineOffsetX' }, { type: 'Float32', name: 'lineOffsetY' }, { type: 'Uint8', name: 'writingMode' }, { type: 'Uint8', name: 'hidden' }, { type: 'Uint32', name: 'crossTileID'} ]); var symbolInstance = createLayout([ { type: 'Int16', name: 'anchorX' }, { type: 'Int16', name: 'anchorY' }, { type: 'Int16', name: 'rightJustifiedTextSymbolIndex' }, { type: 'Int16', name: 'centerJustifiedTextSymbolIndex' }, { type: 'Int16', name: 'leftJustifiedTextSymbolIndex' }, { type: 'Int16', name: 'verticalPlacedTextSymbolIndex' }, { type: 'Uint16', name: 'key' }, { type: 'Uint16', name: 'textBoxStartIndex' }, { type: 'Uint16', name: 'textBoxEndIndex' }, { type: 'Uint16', name: 'iconBoxStartIndex' }, { type: 'Uint16', name: 'iconBoxEndIndex' }, { type: 'Uint16', name: 'featureIndex' }, { type: 'Uint16', name: 'numHorizontalGlyphVertices' }, { type: 'Uint16', name: 'numVerticalGlyphVertices' }, { type: 'Uint16', name: 'numIconVertices' }, { type: 'Uint32', name: 'crossTileID' }, { type: 'Float32', name: 'textBoxScale'}, { type: 'Float32', name: 'radialTextOffset'} ]); var glyphOffset = createLayout([ { type: 'Float32', name: 'offsetX' } ]); var lineVertex = createLayout([ { type: 'Int16', name: 'x' }, { type: 'Int16', name: 'y' }, { type: 'Int16', name: 'tileUnitDistanceFromAnchor' } ]); // function transformText(text , layer , feature ) { var transform = layer.layout.get('text-transform').evaluate(feature, {}); if (transform === 'uppercase') { text = text.toLocaleUpperCase(); } else if (transform === 'lowercase') { text = text.toLocaleLowerCase(); } if (plugin.applyArabicShaping) { text = plugin.applyArabicShaping(text); } return text; } function transformText$1(text , layer , feature ) { text.sections.forEach(function (section) { section.text = transformText(section.text, layer, feature); }); return text; } // function mergeLines (features ) { var leftIndex = {}; var rightIndex = {}; var mergedFeatures = []; var mergedIndex = 0; function add(k) { mergedFeatures.push(features[k]); mergedIndex++; } function mergeFromRight(leftKey , rightKey , geom) { var i = rightIndex[leftKey]; delete rightIndex[leftKey]; rightIndex[rightKey] = i; mergedFeatures[i].geometry[0].pop(); mergedFeatures[i].geometry[0] = mergedFeatures[i].geometry[0].concat(geom[0]); return i; } function mergeFromLeft(leftKey , rightKey , geom) { var i = leftIndex[rightKey]; delete leftIndex[rightKey]; leftIndex[leftKey] = i; mergedFeatures[i].geometry[0].shift(); mergedFeatures[i].geometry[0] = geom[0].concat(mergedFeatures[i].geometry[0]); return i; } function getKey(text, geom, onRight) { var point = onRight ? geom[0][geom[0].length - 1] : geom[0][0]; return (text + ":" + (point.x) + ":" + (point.y)); } for (var k = 0; k < features.length; k++) { var feature = features[k]; var geom = feature.geometry; var text = feature.text ? feature.text.toString() : null; if (!text) { add(k); continue; } var leftKey = getKey(text, geom), rightKey = getKey(text, geom, true); if ((leftKey in rightIndex) && (rightKey in leftIndex) && (rightIndex[leftKey] !== leftIndex[rightKey])) { // found lines with the same text adjacent to both ends of the current line, merge all three var j = mergeFromLeft(leftKey, rightKey, geom); var i = mergeFromRight(leftKey, rightKey, mergedFeatures[j].geometry); delete leftIndex[leftKey]; delete rightIndex[rightKey]; rightIndex[getKey(text, mergedFeatures[i].geometry, true)] = i; mergedFeatures[j].geometry = (null ); } else if (leftKey in rightIndex) { // found mergeable line adjacent to the start of the current line, merge mergeFromRight(leftKey, rightKey, geom); } else if (rightKey in leftIndex) { // found mergeable line adjacent to the end of the current line, merge mergeFromLeft(leftKey, rightKey, geom); } else { // no adjacent lines, add as a new item add(k); leftIndex[leftKey] = mergedIndex - 1; rightIndex[rightKey] = mergedIndex - 1; } } return mergedFeatures.filter(function (f) { return f.geometry; }); } // var verticalizedCharacterMap = { '!': '︕', '#': '#', '$': '$', '%': '%', '&': '&', '(': '︵', ')': '︶', '*': '*', '+': '+', ',': '︐', '-': '︲', '.': '・', '/': '/', ':': '︓', ';': '︔', '<': '︿', '=': '=', '>': '﹀', '?': '︖', '@': '@', '[': '﹇', '\\': '\', ']': '﹈', '^': '^', '_': '︳', '`': '`', '{': '︷', '|': '―', '}': '︸', '~': '~', '¢': '¢', '£': '£', '¥': '¥', '¦': '¦', '¬': '¬', '¯': ' ̄', '–': '︲', '—': '︱', '‘': '﹃', '’': '﹄', '“': '﹁', '”': '﹂', '…': '︙', '‧': '・', '₩': '₩', '、': '︑', '。': '︒', '〈': '︿', '〉': '﹀', '《': '︽', '》': '︾', '「': '﹁', '」': '﹂', '『': '﹃', '』': '﹄', '【': '︻', '】': '︼', '〔': '︹', '〕': '︺', '〖': '︗', '〗': '︘', '!': '︕', '(': '︵', ')': '︶', ',': '︐', '-': '︲', '.': '・', ':': '︓', ';': '︔', '<': '︿', '>': '﹀', '?': '︖', '[': '﹇', ']': '﹈', '_': '︳', '{': '︷', '|': '―', '}': '︸', '⦅': '︵', '⦆': '︶', '。': '︒', '「': '﹁', '」': '﹂' }; function verticalizePunctuation(input ) { var output = ''; for (var i = 0; i < input.length; i++) { var nextCharCode = input.charCodeAt(i + 1) || null; var prevCharCode = input.charCodeAt(i - 1) || null; var canReplacePunctuation = ( (!nextCharCode || !charHasRotatedVerticalOrientation(nextCharCode) || verticalizedCharacterMap[input[i + 1]]) && (!prevCharCode || !charHasRotatedVerticalOrientation(prevCharCode) || verticalizedCharacterMap[input[i - 1]]) ); if (canReplacePunctuation && verticalizedCharacterMap[input[i]]) { output += verticalizedCharacterMap[input[i]]; } else { output += input[i]; } } return output; } // var Anchor = /*@__PURE__*/(function (Point) { function Anchor(x , y , angle , segment ) { Point.call(this, x, y); this.angle = angle; if (segment !== undefined) { this.segment = segment; } } if ( Point ) Anchor.__proto__ = Point; Anchor.prototype = Object.create( Point && Point.prototype ); Anchor.prototype.constructor = Anchor; Anchor.prototype.clone = function clone () { return new Anchor(this.x, this.y, this.angle, this.segment); }; return Anchor; }(pointGeometry)); register('Anchor', Anchor); // var SIZE_PACK_FACTOR = 256; // For {text,icon}-size, get the bucket-level data that will be needed by // the painter to set symbol-size-related uniforms function getSizeData(tileZoom , value ) { var expression = value.expression; if (expression.kind === 'constant') { return { functionType: 'constant', layoutSize: expression.evaluate(new EvaluationParameters(tileZoom + 1)) }; } else if (expression.kind === 'source') { return { functionType: 'source' }; } else { // calculate covering zoom stops for zoom-dependent values var levels = expression.zoomStops; var lower = 0; while (lower < levels.length && levels[lower] <= tileZoom) { lower++; } lower = Math.max(0, lower - 1); var upper = lower; while (upper < levels.length && levels[upper] < tileZoom + 1) { upper++; } upper = Math.min(levels.length - 1, upper); var zoomRange = { min: levels[lower], max: levels[upper] }; // We'd like to be able to use CameraExpression or CompositeExpression in these // return types rather than ExpressionSpecification, but the former are not // transferrable across Web Worker boundaries. if (expression.kind === 'composite') { return { functionType: 'composite', zoomRange: zoomRange, propertyValue: (value.value ) }; } else { // for camera functions, also save off the function values // evaluated at the covering zoom levels return { functionType: 'camera', layoutSize: expression.evaluate(new EvaluationParameters(tileZoom + 1)), zoomRange: zoomRange, sizeRange: { min: expression.evaluate(new EvaluationParameters(zoomRange.min)), max: expression.evaluate(new EvaluationParameters(zoomRange.max)) }, propertyValue: (value.value ) }; } } } function evaluateSizeForFeature(sizeData , partiallyEvaluatedSize , symbol ) { var part = partiallyEvaluatedSize; if (sizeData.functionType === 'source') { return symbol.lowerSize / SIZE_PACK_FACTOR; } else if (sizeData.functionType === 'composite') { return number(symbol.lowerSize / SIZE_PACK_FACTOR, symbol.upperSize / SIZE_PACK_FACTOR, part.uSizeT); } else { return part.uSize; } } function evaluateSizeForZoom(sizeData , currentZoom , property ) { if (sizeData.functionType === 'constant') { return { uSizeT: 0, uSize: sizeData.layoutSize }; } else if (sizeData.functionType === 'source') { return { uSizeT: 0, uSize: 0 }; } else if (sizeData.functionType === 'camera') { var propertyValue = sizeData.propertyValue; var zoomRange = sizeData.zoomRange; var sizeRange = sizeData.sizeRange; var expression = ((normalizePropertyExpression(propertyValue, property.specification) ) ); // Even though we could get the exact value of the camera function // at z = tr.zoom, we intentionally do not: instead, we interpolate // between the camera function values at a pair of zoom stops covering // [tileZoom, tileZoom + 1] in order to be consistent with this // restriction on composite functions var t = clamp( expression.interpolationFactor(currentZoom, zoomRange.min, zoomRange.max), 0, 1 ); return { uSizeT: 0, uSize: sizeRange.min + t * (sizeRange.max - sizeRange.min) }; } else { var propertyValue$1 = sizeData.propertyValue; var zoomRange$1 = sizeData.zoomRange; var expression$1 = ((normalizePropertyExpression(propertyValue$1, property.specification) ) ); return { uSizeT: clamp( expression$1.interpolationFactor(currentZoom, zoomRange$1.min, zoomRange$1.max), 0, 1 ), uSize: 0 }; } } var symbolSize = /*#__PURE__*/Object.freeze({ getSizeData: getSizeData, evaluateSizeForFeature: evaluateSizeForFeature, evaluateSizeForZoom: evaluateSizeForZoom, SIZE_PACK_FACTOR: SIZE_PACK_FACTOR }); // var vectorTileFeatureTypes$2 = vectorTile.VectorTileFeature.types; // Opacity arrays are frequently updated but don't contain a lot of information, so we pack them // tight. Each Uint32 is actually four duplicate Uint8s for the four corners of a glyph // 7 bits are for the current opacity, and the lowest bit is the target opacity // actually defined in symbol_attributes.js // const placementOpacityAttributes = [ // { name: 'a_fade_opacity', components: 1, type: 'Uint32' } // ]; var shaderOpacityAttributes = [ { name: 'a_fade_opacity', components: 1, type: 'Uint8', offset: 0 } ]; function addVertex$1(array, anchorX, anchorY, ox, oy, tx, ty, sizeVertex) { array.emplaceBack( // a_pos_offset anchorX, anchorY, Math.round(ox * 32), Math.round(oy * 32), // a_data tx, // x coordinate of symbol on glyph atlas texture ty, // y coordinate of symbol on glyph atlas texture sizeVertex ? sizeVertex[0] : 0, sizeVertex ? sizeVertex[1] : 0 ); } function addDynamicAttributes(dynamicLayoutVertexArray , p , angle ) { dynamicLayoutVertexArray.emplaceBack(p.x, p.y, angle); dynamicLayoutVertexArray.emplaceBack(p.x, p.y, angle); dynamicLayoutVertexArray.emplaceBack(p.x, p.y, angle); dynamicLayoutVertexArray.emplaceBack(p.x, p.y, angle); } var SymbolBuffers = function SymbolBuffers(programConfigurations ) { this.layoutVertexArray = new StructArrayLayout4i4ui16(); this.indexArray = new StructArrayLayout3ui6(); this.programConfigurations = programConfigurations; this.segments = new SegmentVector(); this.dynamicLayoutVertexArray = new StructArrayLayout3f12(); this.opacityVertexArray = new StructArrayLayout1ul4(); this.placedSymbolArray = new PlacedSymbolArray(); }; SymbolBuffers.prototype.upload = function upload (context , dynamicIndexBuffer , upload$1 , update ) { if (upload$1) { this.layoutVertexBuffer = context.createVertexBuffer(this.layoutVertexArray, symbolLayoutAttributes.members); this.indexBuffer = context.createIndexBuffer(this.indexArray, dynamicIndexBuffer); this.dynamicLayoutVertexBuffer = context.createVertexBuffer(this.dynamicLayoutVertexArray, dynamicLayoutAttributes.members, true); this.opacityVertexBuffer = context.createVertexBuffer(this.opacityVertexArray, shaderOpacityAttributes, true); // This is a performance hack so that we can write to opacityVertexArray with uint32s // even though the shaders read uint8s this.opacityVertexBuffer.itemSize = 1; } if (upload$1 || update) { this.programConfigurations.upload(context); } }; SymbolBuffers.prototype.destroy = function destroy () { if (!this.layoutVertexBuffer) { return; } this.layoutVertexBuffer.destroy(); this.indexBuffer.destroy(); this.programConfigurations.destroy(); this.segments.destroy(); this.dynamicLayoutVertexBuffer.destroy(); this.opacityVertexBuffer.destroy(); }; register('SymbolBuffers', SymbolBuffers); var CollisionBuffers = function CollisionBuffers(LayoutArray , layoutAttributes , IndexArray ) { this.layoutVertexArray = new LayoutArray(); this.layoutAttributes = layoutAttributes; this.indexArray = new IndexArray(); this.segments = new SegmentVector(); this.collisionVertexArray = new StructArrayLayout2ub2f12(); }; CollisionBuffers.prototype.upload = function upload (context ) { this.layoutVertexBuffer = context.createVertexBuffer(this.layoutVertexArray, this.layoutAttributes); this.indexBuffer = context.createIndexBuffer(this.indexArray); this.collisionVertexBuffer = context.createVertexBuffer(this.collisionVertexArray, collisionVertexAttributes.members, true); }; CollisionBuffers.prototype.destroy = function destroy () { if (!this.layoutVertexBuffer) { return; } this.layoutVertexBuffer.destroy(); this.indexBuffer.destroy(); this.segments.destroy(); this.collisionVertexBuffer.destroy(); }; register('CollisionBuffers', CollisionBuffers); /** * Unlike other buckets, which simply implement #addFeature with type-specific * logic for (essentially) triangulating feature geometries, SymbolBucket * requires specialized behavior: * * 1. WorkerTile#parse(), the logical owner of the bucket creation process, * calls SymbolBucket#populate(), which resolves text and icon tokens on * each feature, adds each glyphs and symbols needed to the passed-in * collections options.glyphDependencies and options.iconDependencies, and * stores the feature data for use in subsequent step (this.features). * * 2. WorkerTile asynchronously requests from the main thread all of the glyphs * and icons needed (by this bucket and any others). When glyphs and icons * have been received, the WorkerTile creates a CollisionIndex and invokes: * * 3. performSymbolLayout(bucket, stacks, icons) perform texts shaping and * layout on a Symbol Bucket. This step populates: * `this.symbolInstances`: metadata on generated symbols * `this.collisionBoxArray`: collision data for use by foreground * `this.text`: SymbolBuffers for text symbols * `this.icons`: SymbolBuffers for icons * `this.collisionBox`: Debug SymbolBuffers for collision boxes * `this.collisionCircle`: Debug SymbolBuffers for collision circles * The results are sent to the foreground for rendering * * 4. performSymbolPlacement(bucket, collisionIndex) is run on the foreground, * and uses the CollisionIndex along with current camera settings to determine * which symbols can actually show on the map. Collided symbols are hidden * using a dynamic "OpacityVertexArray". * * @private */ var SymbolBucket = function SymbolBucket(options ) { this.collisionBoxArray = options.collisionBoxArray; this.zoom = options.zoom; this.overscaling = options.overscaling; this.layers = options.layers; this.layerIds = this.layers.map(function (layer) { return layer.id; }); this.index = options.index; this.pixelRatio = options.pixelRatio; this.sourceLayerIndex = options.sourceLayerIndex; this.hasPattern = false; var layer = this.layers[0]; var unevaluatedLayoutValues = layer._unevaluatedLayout._values; this.textSizeData = getSizeData(this.zoom, unevaluatedLayoutValues['text-size']); this.iconSizeData = getSizeData(this.zoom, unevaluatedLayoutValues['icon-size']); var layout = this.layers[0].layout; var sortKey = layout.get('symbol-sort-key'); var zOrder = layout.get('symbol-z-order'); this.sortFeaturesByKey = zOrder !== 'viewport-y' && sortKey.constantOr(1) !== undefined; var zOrderByViewportY = zOrder === 'viewport-y' || (zOrder === 'auto' && !this.sortFeaturesByKey); this.sortFeaturesByY = zOrderByViewportY && (layout.get('text-allow-overlap') || layout.get('icon-allow-overlap') || layout.get('text-ignore-placement') || layout.get('icon-ignore-placement')); this.stateDependentLayerIds = this.layers.filter(function (l) { return l.isStateDependent(); }).map(function (l) { return l.id; }); this.sourceID = options.sourceID; }; SymbolBucket.prototype.createArrays = function createArrays () { this.text = new SymbolBuffers(new ProgramConfigurationSet(symbolLayoutAttributes.members, this.layers, this.zoom, function (property) { return /^text/.test(property); })); this.icon = new SymbolBuffers(new ProgramConfigurationSet(symbolLayoutAttributes.members, this.layers, this.zoom, function (property) { return /^icon/.test(property); })); this.collisionBox = new CollisionBuffers(StructArrayLayout2i2i2i12, collisionBoxLayout.members, StructArrayLayout2ui4); this.collisionCircle = new CollisionBuffers(StructArrayLayout2i2i2i12, collisionCircleLayout.members, StructArrayLayout3ui6); this.glyphOffsetArray = new GlyphOffsetArray(); this.lineVertexArray = new SymbolLineVertexArray(); this.symbolInstances = new SymbolInstanceArray(); }; SymbolBucket.prototype.calculateGlyphDependencies = function calculateGlyphDependencies (text , stack , textAlongLine , doesAllowVerticalWritingMode ) { for (var i = 0; i < text.length; i++) { stack[text.charCodeAt(i)] = true; if (textAlongLine && doesAllowVerticalWritingMode) { var verticalChar = verticalizedCharacterMap[text.charAt(i)]; if (verticalChar) { stack[verticalChar.charCodeAt(0)] = true; } } } }; SymbolBucket.prototype.populate = function populate (features , options ) { var layer = this.layers[0]; var layout = layer.layout; var textFont = layout.get('text-font'); var textField = layout.get('text-field'); var iconImage = layout.get('icon-image'); var hasText = (textField.value.kind !== 'constant' || textField.value.value.toString().length > 0) && (textFont.value.kind !== 'constant' || textFont.value.value.length > 0); var hasIcon = iconImage.value.kind !== 'constant' || iconImage.value.value && iconImage.value.value.length > 0; var symbolSortKey = layout.get('symbol-sort-key'); this.features = []; if (!hasText && !hasIcon) { return; } var icons = options.iconDependencies; var stacks = options.glyphDependencies; var globalProperties = new EvaluationParameters(this.zoom); for (var i$1 = 0, list$1 = features; i$1 < list$1.length; i$1 += 1) { var ref = list$1[i$1]; var feature = ref.feature; var index = ref.index; var sourceLayerIndex = ref.sourceLayerIndex; if (!layer._featureFilter(globalProperties, feature)) { continue; } var text = (void 0) ; if (hasText) { // Expression evaluation will automatically coerce to Formatted // but plain string token evaluation skips that pathway so do the // conversion here. var resolvedTokens = layer.getValueAndResolveTokens('text-field', feature); text = transformText$1(resolvedTokens instanceof Formatted ? resolvedTokens : Formatted.fromString(resolvedTokens), layer, feature); } var icon = (void 0); if (hasIcon) { icon = layer.getValueAndResolveTokens('icon-image', feature); } if (!text && !icon) { continue; } var sortKey = this.sortFeaturesByKey ? symbolSortKey.evaluate(feature, {}) : undefined; var symbolFeature = { text: text, icon: icon, index: index, sourceLayerIndex: sourceLayerIndex, geometry: loadGeometry(feature), properties: feature.properties, type: vectorTileFeatureTypes$2[feature.type], sortKey: sortKey }; if (typeof feature.id !== 'undefined') { symbolFeature.id = feature.id; } this.features.push(symbolFeature); if (icon) { icons[icon] = true; } if (text) { var fontStack = textFont.evaluate(feature, {}).join(','); var textAlongLine = layout.get('text-rotation-alignment') === 'map' && layout.get('symbol-placement') !== 'point'; for (var i = 0, list = text.sections; i < list.length; i += 1) { var section = list[i]; var doesAllowVerticalWritingMode = allowsVerticalWritingMode(text.toString()); var sectionFont = section.fontStack || fontStack; var sectionStack = stacks[sectionFont] = stacks[sectionFont] || {}; this.calculateGlyphDependencies(section.text, sectionStack, textAlongLine, doesAllowVerticalWritingMode); } } } if (layout.get('symbol-placement') === 'line') { // Merge adjacent lines with the same text to improve labelling. // It's better to place labels on one long line than on many short segments. this.features = mergeLines(this.features); } if (this.sortFeaturesByKey) { this.features.sort(function (a, b) { // a.sortKey is always a number when sortFeaturesByKey is true return ((a.sortKey ) ) - ((b.sortKey ) ); }); } }; SymbolBucket.prototype.update = function update (states , vtLayer , imagePositions ) { if (!this.stateDependentLayers.length) { return; } this.text.programConfigurations.updatePaintArrays(states, vtLayer, this.layers, imagePositions); this.icon.programConfigurations.updatePaintArrays(states, vtLayer, this.layers, imagePositions); }; SymbolBucket.prototype.isEmpty = function isEmpty () { return this.symbolInstances.length === 0; }; SymbolBucket.prototype.uploadPending = function uploadPending () { return !this.uploaded || this.text.programConfigurations.needsUpload || this.icon.programConfigurations.needsUpload; }; SymbolBucket.prototype.upload = function upload (context ) { if (!this.uploaded) { this.collisionBox.upload(context); this.collisionCircle.upload(context); } this.text.upload(context, this.sortFeaturesByY, !this.uploaded, this.text.programConfigurations.needsUpload); this.icon.upload(context, this.sortFeaturesByY, !this.uploaded, this.icon.programConfigurations.needsUpload); this.uploaded = true; }; SymbolBucket.prototype.destroy = function destroy () { this.text.destroy(); this.icon.destroy(); this.collisionBox.destroy(); this.collisionCircle.destroy(); }; SymbolBucket.prototype.addToLineVertexArray = function addToLineVertexArray (anchor , line ) { var lineStartIndex = this.lineVertexArray.length; if (anchor.segment !== undefined) { var sumForwardLength = anchor.dist(line[anchor.segment + 1]); var sumBackwardLength = anchor.dist(line[anchor.segment]); var vertices = {}; for (var i = anchor.segment + 1; i < line.length; i++) { vertices[i] = { x: line[i].x, y: line[i].y, tileUnitDistanceFromAnchor: sumForwardLength }; if (i < line.length - 1) { sumForwardLength += line[i + 1].dist(line[i]); } } for (var i$1 = anchor.segment || 0; i$1 >= 0; i$1--) { vertices[i$1] = { x: line[i$1].x, y: line[i$1].y, tileUnitDistanceFromAnchor: sumBackwardLength }; if (i$1 > 0) { sumBackwardLength += line[i$1 - 1].dist(line[i$1]); } } for (var i$2 = 0; i$2 < line.length; i$2++) { var vertex = vertices[i$2]; this.lineVertexArray.emplaceBack(vertex.x, vertex.y, vertex.tileUnitDistanceFromAnchor); } } return { lineStartIndex: lineStartIndex, lineLength: this.lineVertexArray.length - lineStartIndex }; }; SymbolBucket.prototype.addSymbols = function addSymbols (arrays , quads , sizeVertex , lineOffset , alongLine , feature , writingMode , labelAnchor , lineStartIndex , lineLength ) { var indexArray = arrays.indexArray; var layoutVertexArray = arrays.layoutVertexArray; var dynamicLayoutVertexArray = arrays.dynamicLayoutVertexArray; var segment = arrays.segments.prepareSegment(4 * quads.length, arrays.layoutVertexArray, arrays.indexArray, feature.sortKey); var glyphOffsetArrayStart = this.glyphOffsetArray.length; var vertexStartIndex = segment.vertexLength; for (var i = 0, list = quads; i < list.length; i += 1) { var symbol = list[i]; var tl = symbol.tl, tr = symbol.tr, bl = symbol.bl, br = symbol.br, tex = symbol.tex; var index = segment.vertexLength; var y = symbol.glyphOffset[1]; addVertex$1(layoutVertexArray, labelAnchor.x, labelAnchor.y, tl.x, y + tl.y, tex.x, tex.y, sizeVertex); addVertex$1(layoutVertexArray, labelAnchor.x, labelAnchor.y, tr.x, y + tr.y, tex.x + tex.w, tex.y, sizeVertex); addVertex$1(layoutVertexArray, labelAnchor.x, labelAnchor.y, bl.x, y + bl.y, tex.x, tex.y + tex.h, sizeVertex); addVertex$1(layoutVertexArray, labelAnchor.x, labelAnchor.y, br.x, y + br.y, tex.x + tex.w, tex.y + tex.h, sizeVertex); addDynamicAttributes(dynamicLayoutVertexArray, labelAnchor, 0); indexArray.emplaceBack(index, index + 1, index + 2); indexArray.emplaceBack(index + 1, index + 2, index + 3); segment.vertexLength += 4; segment.primitiveLength += 2; this.glyphOffsetArray.emplaceBack(symbol.glyphOffset[0]); } arrays.placedSymbolArray.emplaceBack(labelAnchor.x, labelAnchor.y, glyphOffsetArrayStart, this.glyphOffsetArray.length - glyphOffsetArrayStart, vertexStartIndex, lineStartIndex, lineLength, (labelAnchor.segment ), sizeVertex ? sizeVertex[0] : 0, sizeVertex ? sizeVertex[1] : 0, lineOffset[0], lineOffset[1], writingMode, (false ), // The crossTileID is only filled/used on the foreground for dynamic text anchors 0); arrays.programConfigurations.populatePaintArrays(arrays.layoutVertexArray.length, feature, feature.index, {}); }; SymbolBucket.prototype._addCollisionDebugVertex = function _addCollisionDebugVertex (layoutVertexArray , collisionVertexArray , point , anchorX , anchorY , extrude ) { collisionVertexArray.emplaceBack(0, 0); return layoutVertexArray.emplaceBack( // pos point.x, point.y, // a_anchor_pos anchorX, anchorY, // extrude Math.round(extrude.x), Math.round(extrude.y)); }; SymbolBucket.prototype.addCollisionDebugVertices = function addCollisionDebugVertices (x1 , y1 , x2 , y2 , arrays , boxAnchorPoint , symbolInstance , isCircle ) { var segment = arrays.segments.prepareSegment(4, arrays.layoutVertexArray, arrays.indexArray); var index = segment.vertexLength; var layoutVertexArray = arrays.layoutVertexArray; var collisionVertexArray = arrays.collisionVertexArray; var anchorX = symbolInstance.anchorX; var anchorY = symbolInstance.anchorY; this._addCollisionDebugVertex(layoutVertexArray, collisionVertexArray, boxAnchorPoint, anchorX, anchorY, new pointGeometry(x1, y1)); this._addCollisionDebugVertex(layoutVertexArray, collisionVertexArray, boxAnchorPoint, anchorX, anchorY, new pointGeometry(x2, y1)); this._addCollisionDebugVertex(layoutVertexArray, collisionVertexArray, boxAnchorPoint, anchorX, anchorY, new pointGeometry(x2, y2)); this._addCollisionDebugVertex(layoutVertexArray, collisionVertexArray, boxAnchorPoint, anchorX, anchorY, new pointGeometry(x1, y2)); segment.vertexLength += 4; if (isCircle) { var indexArray = (arrays.indexArray ); indexArray.emplaceBack(index, index + 1, index + 2); indexArray.emplaceBack(index, index + 2, index + 3); segment.primitiveLength += 2; } else { var indexArray$1 = (arrays.indexArray ); indexArray$1.emplaceBack(index, index + 1); indexArray$1.emplaceBack(index + 1, index + 2); indexArray$1.emplaceBack(index + 2, index + 3); indexArray$1.emplaceBack(index + 3, index); segment.primitiveLength += 4; } }; SymbolBucket.prototype.addDebugCollisionBoxes = function addDebugCollisionBoxes (startIndex , endIndex , symbolInstance ) { for (var b = startIndex; b < endIndex; b++) { var box = (this.collisionBoxArray.get(b) ); var x1 = box.x1; var y1 = box.y1; var x2 = box.x2; var y2 = box.y2; // If the radius > 0, this collision box is actually a circle // The data we add to the buffers is exactly the same, but we'll render with a different shader. var isCircle = box.radius > 0; this.addCollisionDebugVertices(x1, y1, x2, y2, isCircle ? this.collisionCircle : this.collisionBox, box.anchorPoint, symbolInstance, isCircle); } }; SymbolBucket.prototype.generateCollisionDebugBuffers = function generateCollisionDebugBuffers () { for (var i = 0; i < this.symbolInstances.length; i++) { var symbolInstance = this.symbolInstances.get(i); this.addDebugCollisionBoxes(symbolInstance.textBoxStartIndex, symbolInstance.textBoxEndIndex, symbolInstance); this.addDebugCollisionBoxes(symbolInstance.iconBoxStartIndex, symbolInstance.iconBoxEndIndex, symbolInstance); } }; // These flat arrays are meant to be quicker to iterate over than the source // CollisionBoxArray SymbolBucket.prototype._deserializeCollisionBoxesForSymbol = function _deserializeCollisionBoxesForSymbol (collisionBoxArray , textStartIndex , textEndIndex , iconStartIndex , iconEndIndex ) { var collisionArrays = {}; for (var k = textStartIndex; k < textEndIndex; k++) { var box = (collisionBoxArray.get(k) ); if (box.radius === 0) { collisionArrays.textBox = { x1: box.x1, y1: box.y1, x2: box.x2, y2: box.y2, anchorPointX: box.anchorPointX, anchorPointY: box.anchorPointY }; collisionArrays.textFeatureIndex = box.featureIndex; break; // Only one box allowed per instance } else { if (!collisionArrays.textCircles) { collisionArrays.textCircles = []; collisionArrays.textFeatureIndex = box.featureIndex; } var used = 1; // May be updated at collision detection time collisionArrays.textCircles.push(box.anchorPointX, box.anchorPointY, box.radius, box.signedDistanceFromAnchor, used); } } for (var k$1 = iconStartIndex; k$1 < iconEndIndex; k$1++) { // An icon can only have one box now, so this indexing is a bit vestigial... var box$1 = (collisionBoxArray.get(k$1) ); if (box$1.radius === 0) { collisionArrays.iconBox = { x1: box$1.x1, y1: box$1.y1, x2: box$1.x2, y2: box$1.y2, anchorPointX: box$1.anchorPointX, anchorPointY: box$1.anchorPointY }; collisionArrays.iconFeatureIndex = box$1.featureIndex; break; // Only one box allowed per instance } } return collisionArrays; }; SymbolBucket.prototype.deserializeCollisionBoxes = function deserializeCollisionBoxes (collisionBoxArray ) { this.collisionArrays = []; for (var i = 0; i < this.symbolInstances.length; i++) { var symbolInstance = this.symbolInstances.get(i); this.collisionArrays.push(this._deserializeCollisionBoxesForSymbol( collisionBoxArray, symbolInstance.textBoxStartIndex, symbolInstance.textBoxEndIndex, symbolInstance.iconBoxStartIndex, symbolInstance.iconBoxEndIndex )); } }; SymbolBucket.prototype.hasTextData = function hasTextData () { return this.text.segments.get().length > 0; }; SymbolBucket.prototype.hasIconData = function hasIconData () { return this.icon.segments.get().length > 0; }; SymbolBucket.prototype.hasCollisionBoxData = function hasCollisionBoxData () { return this.collisionBox.segments.get().length > 0; }; SymbolBucket.prototype.hasCollisionCircleData = function hasCollisionCircleData () { return this.collisionCircle.segments.get().length > 0; }; SymbolBucket.prototype.addIndicesForPlacedTextSymbol = function addIndicesForPlacedTextSymbol (placedTextSymbolIndex ) { var placedSymbol = this.text.placedSymbolArray.get(placedTextSymbolIndex); var endIndex = placedSymbol.vertexStartIndex + placedSymbol.numGlyphs * 4; for (var vertexIndex = placedSymbol.vertexStartIndex; vertexIndex < endIndex; vertexIndex += 4) { this.text.indexArray.emplaceBack(vertexIndex, vertexIndex + 1, vertexIndex + 2); this.text.indexArray.emplaceBack(vertexIndex + 1, vertexIndex + 2, vertexIndex + 3); } }; SymbolBucket.prototype.sortFeatures = function sortFeatures (angle ) { var this$1 = this; if (!this.sortFeaturesByY) { return; } if (this.sortedAngle === angle) { return; } this.sortedAngle = angle; // The current approach to sorting doesn't sort across segments so don't try. // Sorting within segments separately seemed not to be worth the complexity. if (this.text.segments.get().length > 1 || this.icon.segments.get().length > 1) { return; } // If the symbols are allowed to overlap sort them by their vertical screen position. // The index array buffer is rewritten to reference the (unchanged) vertices in the // sorted order. // To avoid sorting the actual symbolInstance array we sort an array of indexes. var symbolInstanceIndexes = []; for (var i = 0; i < this.symbolInstances.length; i++) { symbolInstanceIndexes.push(i); } var sin = Math.sin(angle), cos = Math.cos(angle); var rotatedYs = []; var featureIndexes = []; for (var i$1 = 0; i$1 < this.symbolInstances.length; i$1++) { var symbolInstance = this.symbolInstances.get(i$1); rotatedYs.push(Math.round(sin * symbolInstance.anchorX + cos * symbolInstance.anchorY) | 0); featureIndexes.push(symbolInstance.featureIndex); } symbolInstanceIndexes.sort(function (aIndex, bIndex) { return (rotatedYs[aIndex] - rotatedYs[bIndex]) || (featureIndexes[bIndex] - featureIndexes[aIndex]); }); this.text.indexArray.clear(); this.icon.indexArray.clear(); this.featureSortOrder = []; for (var i$3 = 0, list = symbolInstanceIndexes; i$3 < list.length; i$3 += 1) { var i$2 = list[i$3]; var symbolInstance$1 = this.symbolInstances.get(i$2); this.featureSortOrder.push(symbolInstance$1.featureIndex); [ symbolInstance$1.rightJustifiedTextSymbolIndex, symbolInstance$1.centerJustifiedTextSymbolIndex, symbolInstance$1.leftJustifiedTextSymbolIndex ].forEach(function (index, i, array) { // Only add a given index the first time it shows up, // to avoid duplicate opacity entries when multiple justifications // share the same glyphs. if (index >= 0 && array.indexOf(index) === i) { this$1.addIndicesForPlacedTextSymbol(index); } }); if (symbolInstance$1.verticalPlacedTextSymbolIndex >= 0) { this.addIndicesForPlacedTextSymbol(symbolInstance$1.verticalPlacedTextSymbolIndex); } var placedIcon = this.icon.placedSymbolArray.get(i$2); if (placedIcon.numGlyphs) { var vertexIndex = placedIcon.vertexStartIndex; this.icon.indexArray.emplaceBack(vertexIndex, vertexIndex + 1, vertexIndex + 2); this.icon.indexArray.emplaceBack(vertexIndex + 1, vertexIndex + 2, vertexIndex + 3); } } if (this.text.indexBuffer) { this.text.indexBuffer.updateData(this.text.indexArray); } if (this.icon.indexBuffer) { this.icon.indexBuffer.updateData(this.icon.indexArray); } }; register('SymbolBucket', SymbolBucket, { omit: ['layers', 'collisionBoxArray', 'features', 'compareText'] }); // this constant is based on the size of StructArray indexes used in a symbol // bucket--namely, glyphOffsetArrayStart // eg the max valid UInt16 is 65,535 // See https://github.com/mapbox/mapbox-gl-js/issues/2907 for motivation // lineStartIndex and textBoxStartIndex could potentially be concerns // but we expect there to be many fewer boxes/lines than glyphs SymbolBucket.MAX_GLYPHS = 65535; SymbolBucket.addDynamicAttributes = addDynamicAttributes; // /** * Replace tokens in a string template with values in an object * * @param properties a key/value relationship between tokens and replacements * @param text the template string * @returns the template with tokens replaced * @private */ function resolveTokens(properties , text ) { return text.replace(/{([^{}]+)}/g, function (match, key ) { return key in properties ? String(properties[key]) : ''; }); } // This file is generated. Edit build/generate-style-code.js, then run `yarn run codegen`. var layout$5 = new Properties({ "symbol-placement": new DataConstantProperty(spec["layout_symbol"]["symbol-placement"]), "symbol-spacing": new DataConstantProperty(spec["layout_symbol"]["symbol-spacing"]), "symbol-avoid-edges": new DataConstantProperty(spec["layout_symbol"]["symbol-avoid-edges"]), "symbol-sort-key": new DataDrivenProperty(spec["layout_symbol"]["symbol-sort-key"]), "symbol-z-order": new DataConstantProperty(spec["layout_symbol"]["symbol-z-order"]), "icon-allow-overlap": new DataConstantProperty(spec["layout_symbol"]["icon-allow-overlap"]), "icon-ignore-placement": new DataConstantProperty(spec["layout_symbol"]["icon-ignore-placement"]), "icon-optional": new DataConstantProperty(spec["layout_symbol"]["icon-optional"]), "icon-rotation-alignment": new DataConstantProperty(spec["layout_symbol"]["icon-rotation-alignment"]), "icon-size": new DataDrivenProperty(spec["layout_symbol"]["icon-size"]), "icon-text-fit": new DataConstantProperty(spec["layout_symbol"]["icon-text-fit"]), "icon-text-fit-padding": new DataConstantProperty(spec["layout_symbol"]["icon-text-fit-padding"]), "icon-image": new DataDrivenProperty(spec["layout_symbol"]["icon-image"]), "icon-rotate": new DataDrivenProperty(spec["layout_symbol"]["icon-rotate"]), "icon-padding": new DataConstantProperty(spec["layout_symbol"]["icon-padding"]), "icon-keep-upright": new DataConstantProperty(spec["layout_symbol"]["icon-keep-upright"]), "icon-offset": new DataDrivenProperty(spec["layout_symbol"]["icon-offset"]), "icon-anchor": new DataDrivenProperty(spec["layout_symbol"]["icon-anchor"]), "icon-pitch-alignment": new DataConstantProperty(spec["layout_symbol"]["icon-pitch-alignment"]), "text-pitch-alignment": new DataConstantProperty(spec["layout_symbol"]["text-pitch-alignment"]), "text-rotation-alignment": new DataConstantProperty(spec["layout_symbol"]["text-rotation-alignment"]), "text-field": new DataDrivenProperty(spec["layout_symbol"]["text-field"]), "text-font": new DataDrivenProperty(spec["layout_symbol"]["text-font"]), "text-size": new DataDrivenProperty(spec["layout_symbol"]["text-size"]), "text-max-width": new DataDrivenProperty(spec["layout_symbol"]["text-max-width"]), "text-line-height": new DataConstantProperty(spec["layout_symbol"]["text-line-height"]), "text-letter-spacing": new DataDrivenProperty(spec["layout_symbol"]["text-letter-spacing"]), "text-justify": new DataDrivenProperty(spec["layout_symbol"]["text-justify"]), "text-radial-offset": new DataDrivenProperty(spec["layout_symbol"]["text-radial-offset"]), "text-variable-anchor": new DataConstantProperty(spec["layout_symbol"]["text-variable-anchor"]), "text-anchor": new DataDrivenProperty(spec["layout_symbol"]["text-anchor"]), "text-max-angle": new DataConstantProperty(spec["layout_symbol"]["text-max-angle"]), "text-rotate": new DataDrivenProperty(spec["layout_symbol"]["text-rotate"]), "text-padding": new DataConstantProperty(spec["layout_symbol"]["text-padding"]), "text-keep-upright": new DataConstantProperty(spec["layout_symbol"]["text-keep-upright"]), "text-transform": new DataDrivenProperty(spec["layout_symbol"]["text-transform"]), "text-offset": new DataDrivenProperty(spec["layout_symbol"]["text-offset"]), "text-allow-overlap": new DataConstantProperty(spec["layout_symbol"]["text-allow-overlap"]), "text-ignore-placement": new DataConstantProperty(spec["layout_symbol"]["text-ignore-placement"]), "text-optional": new DataConstantProperty(spec["layout_symbol"]["text-optional"]), }); var paint$7 = new Properties({ "icon-opacity": new DataDrivenProperty(spec["paint_symbol"]["icon-opacity"]), "icon-color": new DataDrivenProperty(spec["paint_symbol"]["icon-color"]), "icon-halo-color": new DataDrivenProperty(spec["paint_symbol"]["icon-halo-color"]), "icon-halo-width": new DataDrivenProperty(spec["paint_symbol"]["icon-halo-width"]), "icon-halo-blur": new DataDrivenProperty(spec["paint_symbol"]["icon-halo-blur"]), "icon-translate": new DataConstantProperty(spec["paint_symbol"]["icon-translate"]), "icon-translate-anchor": new DataConstantProperty(spec["paint_symbol"]["icon-translate-anchor"]), "text-opacity": new DataDrivenProperty(spec["paint_symbol"]["text-opacity"]), "text-color": new DataDrivenProperty(spec["paint_symbol"]["text-color"]), "text-halo-color": new DataDrivenProperty(spec["paint_symbol"]["text-halo-color"]), "text-halo-width": new DataDrivenProperty(spec["paint_symbol"]["text-halo-width"]), "text-halo-blur": new DataDrivenProperty(spec["paint_symbol"]["text-halo-blur"]), "text-translate": new DataConstantProperty(spec["paint_symbol"]["text-translate"]), "text-translate-anchor": new DataConstantProperty(spec["paint_symbol"]["text-translate-anchor"]), }); // Note: without adding the explicit type annotation, Flow infers weaker types // for these objects from their use in the constructor to StyleLayer, as // {layout?: Properties<...>, paint: Properties<...>} var properties$6 = ({ paint: paint$7, layout: layout$5 } ); // var SymbolStyleLayer = /*@__PURE__*/(function (StyleLayer) { function SymbolStyleLayer(layer ) { StyleLayer.call(this, layer, properties$6); } if ( StyleLayer ) SymbolStyleLayer.__proto__ = StyleLayer; SymbolStyleLayer.prototype = Object.create( StyleLayer && StyleLayer.prototype ); SymbolStyleLayer.prototype.constructor = SymbolStyleLayer; SymbolStyleLayer.prototype.recalculate = function recalculate (parameters ) { StyleLayer.prototype.recalculate.call(this, parameters); if (this.layout.get('icon-rotation-alignment') === 'auto') { if (this.layout.get('symbol-placement') !== 'point') { this.layout._values['icon-rotation-alignment'] = 'map'; } else { this.layout._values['icon-rotation-alignment'] = 'viewport'; } } if (this.layout.get('text-rotation-alignment') === 'auto') { if (this.layout.get('symbol-placement') !== 'point') { this.layout._values['text-rotation-alignment'] = 'map'; } else { this.layout._values['text-rotation-alignment'] = 'viewport'; } } // If unspecified, `*-pitch-alignment` inherits `*-rotation-alignment` if (this.layout.get('text-pitch-alignment') === 'auto') { this.layout._values['text-pitch-alignment'] = this.layout.get('text-rotation-alignment'); } if (this.layout.get('icon-pitch-alignment') === 'auto') { this.layout._values['icon-pitch-alignment'] = this.layout.get('icon-rotation-alignment'); } }; SymbolStyleLayer.prototype.getValueAndResolveTokens = function getValueAndResolveTokens (name , feature ) { var value = this.layout.get(name).evaluate(feature, {}); var unevaluated = this._unevaluatedLayout._values[name]; if (!unevaluated.isDataDriven() && !isExpression(unevaluated.value)) { return resolveTokens(feature.properties, value); } return value; }; SymbolStyleLayer.prototype.createBucket = function createBucket (parameters ) { return new SymbolBucket(parameters); }; SymbolStyleLayer.prototype.queryRadius = function queryRadius () { return 0; }; SymbolStyleLayer.prototype.queryIntersectsFeature = function queryIntersectsFeature () { assert_1(false); // Should take a different path in FeatureIndex return false; }; return SymbolStyleLayer; }(StyleLayer)); // This file is generated. Edit build/generate-style-code.js, then run `yarn run codegen`. var paint$8 = new Properties({ "background-color": new DataConstantProperty(spec["paint_background"]["background-color"]), "background-pattern": new CrossFadedProperty(spec["paint_background"]["background-pattern"]), "background-opacity": new DataConstantProperty(spec["paint_background"]["background-opacity"]), }); // Note: without adding the explicit type annotation, Flow infers weaker types // for these objects from their use in the constructor to StyleLayer, as // {layout?: Properties<...>, paint: Properties<...>} var properties$7 = ({ paint: paint$8 } ); // var BackgroundStyleLayer = /*@__PURE__*/(function (StyleLayer) { function BackgroundStyleLayer(layer ) { StyleLayer.call(this, layer, properties$7); } if ( StyleLayer ) BackgroundStyleLayer.__proto__ = StyleLayer; BackgroundStyleLayer.prototype = Object.create( StyleLayer && StyleLayer.prototype ); BackgroundStyleLayer.prototype.constructor = BackgroundStyleLayer; return BackgroundStyleLayer; }(StyleLayer)); // This file is generated. Edit build/generate-style-code.js, then run `yarn run codegen`. var paint$9 = new Properties({ "raster-opacity": new DataConstantProperty(spec["paint_raster"]["raster-opacity"]), "raster-hue-rotate": new DataConstantProperty(spec["paint_raster"]["raster-hue-rotate"]), "raster-brightness-min": new DataConstantProperty(spec["paint_raster"]["raster-brightness-min"]), "raster-brightness-max": new DataConstantProperty(spec["paint_raster"]["raster-brightness-max"]), "raster-saturation": new DataConstantProperty(spec["paint_raster"]["raster-saturation"]), "raster-contrast": new DataConstantProperty(spec["paint_raster"]["raster-contrast"]), "raster-resampling": new DataConstantProperty(spec["paint_raster"]["raster-resampling"]), "raster-fade-duration": new DataConstantProperty(spec["paint_raster"]["raster-fade-duration"]), }); // Note: without adding the explicit type annotation, Flow infers weaker types // for these objects from their use in the constructor to StyleLayer, as // {layout?: Properties<...>, paint: Properties<...>} var properties$8 = ({ paint: paint$9 } ); // var RasterStyleLayer = /*@__PURE__*/(function (StyleLayer) { function RasterStyleLayer(layer ) { StyleLayer.call(this, layer, properties$8); } if ( StyleLayer ) RasterStyleLayer.__proto__ = StyleLayer; RasterStyleLayer.prototype = Object.create( StyleLayer && StyleLayer.prototype ); RasterStyleLayer.prototype.constructor = RasterStyleLayer; return RasterStyleLayer; }(StyleLayer)); // /** * Interface for custom style layers. This is a specification for * implementers to model: it is not an exported method or class. * * Custom layers allow a user to render directly into the map's GL context using the map's camera. * These layers can be added between any regular layers using {@link Map#addLayer}. * * Custom layers must have a unique `id` and must have the `type` of `"custom"`. * They must implement `render` and may implement `prerender`, `onAdd` and `onRemove`. * They can trigger rendering using {@link Map#triggerRepaint} * and they should appropriately handle {@link Map.event:webglcontextlost} and * {@link Map.event:webglcontextrestored}. * * The `renderingMode` property controls whether the layer is treated as a `"2d"` or `"3d"` map layer. Use: * - `"renderingMode": "3d"` to use the depth buffer and share it with other layers * - `"renderingMode": "2d"` to add a layer with no depth. If you need to use the depth buffer for a `"2d"` layer you must use an offscreen * framebuffer and {@link CustomLayerInterface#prerender} * * @interface CustomLayerInterface * @property {string} id A unique layer id. * @property {string} type The layer's type. Must be `"custom"`. * @property {string} renderingMode Either `"2d"` or `"3d"`. Defaults to `"2d"`. * @example * // Custom layer implemented as ES6 class * class NullIslandLayer { * constructor() { * this.id = 'null-island'; * this.type = 'custom'; * this.renderingMode = '2d'; * } * * onAdd(map, gl) { * const vertexSource = ` * uniform mat4 u_matrix; * void main() { * gl_Position = u_matrix * vec4(0.5, 0.5, 0.0, 1.0); * gl_PointSize = 20.0; * }`; * * const fragmentSource = ` * void main() { * gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); * }`; * * const vertexShader = gl.createShader(gl.VERTEX_SHADER); * gl.shaderSource(vertexShader, vertexSource); * gl.compileShader(vertexShader); * const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER); * gl.shaderSource(fragmentShader, fragmentSource); * gl.compileShader(fragmentShader); * * this.program = gl.createProgram(); * gl.attachShader(this.program, vertexShader); * gl.attachShader(this.program, fragmentShader); * gl.linkProgram(this.program); * } * * render(gl, matrix) { * gl.useProgram(this.program); * gl.uniformMatrix4fv(gl.getUniformLocation(this.program, "u_matrix"), false, matrix); * gl.drawArrays(gl.POINTS, 0, 1); * } * } * * map.on('load', function() { * map.addLayer(new NullIslandLayer()); * }); */ /** * Optional method called when the layer has been added to the Map with {@link Map#addLayer}. This * gives the layer a chance to initialize gl resources and register event listeners. * * @function * @memberof CustomLayerInterface * @instance * @name onAdd * @param {Map} map The Map this custom layer was just added to. * @param {WebGLRenderingContext} gl The gl context for the map. */ /** * Optional method called when the layer has been removed from the Map with {@link Map#removeLayer}. This * gives the layer a chance to clean up gl resources and event listeners. * * @function * @memberof CustomLayerInterface * @instance * @name onRemove * @param {Map} map The Map this custom layer was just added to. */ /** * Optional method called during a render frame to allow a layer to prepare resources or render into a texture. * * The layer cannot make any assumptions about the current GL state and must bind a framebuffer before rendering. * * @function * @memberof CustomLayerInterface * @instance * @name prerender * @param {WebGLRenderingContext} gl The map's gl context. * @param {Array} matrix The map's camera matrix. It projects spherical mercator * coordinates to gl coordinates. The mercator coordinate `[0, 0]` represents the * top left corner of the mercator world and `[1, 1]` represents the bottom right corner. When * the `renderingMode` is `"3d"`, the z coordinate is conformal. A box with identical x, y, and z * lengths in mercator units would be rendered as a cube. {@link MercatorCoordinate}.fromLatLng * can be used to project a `LngLat` to a mercator coordinate. */ /** * Called during a render frame allowing the layer to draw into the GL context. * * The layer can assume blending and depth state is set to allow the layer to properly * blend and clip other layers. The layer cannot make any other assumptions about the * current GL state. * * If the layer needs to render to a texture, it should implement the `prerender` method * to do this and only use the `render` method for drawing directly into the main framebuffer. * * The blend function is set to `gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA)`. This expects * colors to be provided in premultiplied alpha form where the `r`, `g` and `b` values are already * multiplied by the `a` value. If you are unable to provide colors in premultiplied form you * may want to change the blend function to * `gl.blendFuncSeparate(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA)`. * * @function * @memberof CustomLayerInterface * @instance * @name render * @param {WebGLRenderingContext} gl The map's gl context. * @param {Array} matrix The map's camera matrix. It projects spherical mercator * coordinates to gl coordinates. The spherical mercator coordinate `[0, 0]` represents the * top left corner of the mercator world and `[1, 1]` represents the bottom right corner. When * the `renderingMode` is `"3d"`, the z coordinate is conformal. A box with identical x, y, and z * lengths in mercator units would be rendered as a cube. {@link MercatorCoordinate}.fromLatLng * can be used to project a `LngLat` to a mercator coordinate. */ function validateCustomStyleLayer(layerObject ) { var errors = []; var id = layerObject.id; if (id === undefined) { errors.push({ message: ("layers." + id + ": missing required property \"id\"") }); } if (layerObject.render === undefined) { errors.push({ message: ("layers." + id + ": missing required method \"render\"") }); } if (layerObject.renderingMode && layerObject.renderingMode !== '2d' && layerObject.renderingMode !== '3d') { errors.push({ message: ("layers." + id + ": property \"renderingMode\" must be either \"2d\" or \"3d\"") }); } return errors; } var CustomStyleLayer = /*@__PURE__*/(function (StyleLayer) { function CustomStyleLayer(implementation ) { StyleLayer.call(this, implementation, {}); this.implementation = implementation; } if ( StyleLayer ) CustomStyleLayer.__proto__ = StyleLayer; CustomStyleLayer.prototype = Object.create( StyleLayer && StyleLayer.prototype ); CustomStyleLayer.prototype.constructor = CustomStyleLayer; CustomStyleLayer.prototype.is3D = function is3D () { return this.implementation.renderingMode === '3d'; }; CustomStyleLayer.prototype.hasOffscreenPass = function hasOffscreenPass () { return this.implementation.prerender !== undefined; }; CustomStyleLayer.prototype.recalculate = function recalculate () {}; CustomStyleLayer.prototype.updateTransitions = function updateTransitions () {}; CustomStyleLayer.prototype.hasTransition = function hasTransition () {}; CustomStyleLayer.prototype.serialize = function serialize () { assert_1(false, "Custom layers cannot be serialized"); }; CustomStyleLayer.prototype.onAdd = function onAdd (map ) { if (this.implementation.onAdd) { this.implementation.onAdd(map, map.painter.context.gl); } }; CustomStyleLayer.prototype.onRemove = function onRemove (map ) { if (this.implementation.onRemove) { this.implementation.onRemove(map); } }; return CustomStyleLayer; }(StyleLayer)); // var subclasses = { circle: CircleStyleLayer, heatmap: HeatmapStyleLayer, hillshade: HillshadeStyleLayer, fill: FillStyleLayer, 'fill-extrusion': FillExtrusionStyleLayer, line: LineStyleLayer, symbol: SymbolStyleLayer, background: BackgroundStyleLayer, raster: RasterStyleLayer }; function createStyleLayer(layer ) { if (layer.type === 'custom') { return new CustomStyleLayer(layer); } else { return new subclasses[layer.type](layer); } } function potpack(boxes) { // calculate total box area and maximum box width var area = 0; var maxWidth = 0; for (var i$1 = 0, list = boxes; i$1 < list.length; i$1 += 1) { var box = list[i$1]; area += box.w * box.h; maxWidth = Math.max(maxWidth, box.w); } // sort the boxes for insertion by height, descending boxes.sort(function (a, b) { return b.h - a.h; }); // aim for a squarish resulting container, // slightly adjusted for sub-100% space utilization var startWidth = Math.max(Math.ceil(Math.sqrt(area / 0.95)), maxWidth); // start with a single empty space, unbounded at the bottom var spaces = [{x: 0, y: 0, w: startWidth, h: Infinity}]; var width = 0; var height = 0; for (var i$2 = 0, list$1 = boxes; i$2 < list$1.length; i$2 += 1) { // look through spaces backwards so that we check smaller spaces first var box$1 = list$1[i$2]; for (var i = spaces.length - 1; i >= 0; i--) { var space = spaces[i]; // look for empty spaces that can accommodate the current box if (box$1.w > space.w || box$1.h > space.h) { continue; } // found the space; add the box to its top-left corner // |-------|-------| // | box | | // |_______| | // | space | // |_______________| box$1.x = space.x; box$1.y = space.y; height = Math.max(height, box$1.y + box$1.h); width = Math.max(width, box$1.x + box$1.w); if (box$1.w === space.w && box$1.h === space.h) { // space matches the box exactly; remove it var last = spaces.pop(); if (i < spaces.length) { spaces[i] = last; } } else if (box$1.h === space.h) { // space matches the box height; update it accordingly // |-------|---------------| // | box | updated space | // |_______|_______________| space.x += box$1.w; space.w -= box$1.w; } else if (box$1.w === space.w) { // space matches the box width; update it accordingly // |---------------| // | box | // |_______________| // | updated space | // |_______________| space.y += box$1.h; space.h -= box$1.h; } else { // otherwise the box splits the space into two spaces // |-------|-----------| // | box | new space | // |_______|___________| // | updated space | // |___________________| spaces.push({ x: space.x + box$1.w, y: space.y, w: space.w - box$1.w, h: box$1.h }); space.y += box$1.h; space.h -= box$1.h; } break; } } return { w: width, // container width h: height, // container height fill: (area / (width * height)) || 0 // space utilization }; } // var padding = 1; var ImagePosition = function ImagePosition(paddedRect , ref ) { var pixelRatio = ref.pixelRatio; var version = ref.version; this.paddedRect = paddedRect; this.pixelRatio = pixelRatio; this.version = version; }; var prototypeAccessors = { tl: { configurable: true },br: { configurable: true },tlbr: { configurable: true },displaySize: { configurable: true } }; prototypeAccessors.tl.get = function () { return [ this.paddedRect.x + padding, this.paddedRect.y + padding ]; }; prototypeAccessors.br.get = function () { return [ this.paddedRect.x + this.paddedRect.w - padding, this.paddedRect.y + this.paddedRect.h - padding ]; }; prototypeAccessors.tlbr.get = function () { return this.tl.concat(this.br); }; prototypeAccessors.displaySize.get = function () { return [ (this.paddedRect.w - padding * 2) / this.pixelRatio, (this.paddedRect.h - padding * 2) / this.pixelRatio ]; }; Object.defineProperties( ImagePosition.prototype, prototypeAccessors ); var ImageAtlas = function ImageAtlas(icons , patterns ) { var iconPositions = {}, patternPositions = {}; this.haveRenderCallbacks = []; var bins = []; this.addImages(icons, iconPositions, bins); this.addImages(patterns, patternPositions, bins); var ref = potpack(bins); var w = ref.w; var h = ref.h; var image = new RGBAImage({width: w || 1, height: h || 1}); for (var id in icons) { var src = icons[id]; var bin = iconPositions[id].paddedRect; RGBAImage.copy(src.data, image, {x: 0, y: 0}, {x: bin.x + padding, y: bin.y + padding}, src.data); } for (var id$1 in patterns) { var src$1 = patterns[id$1]; var bin$1 = patternPositions[id$1].paddedRect; var x = bin$1.x + padding, y = bin$1.y + padding, w$1 = src$1.data.width, h$1 = src$1.data.height; RGBAImage.copy(src$1.data, image, {x: 0, y: 0}, {x: x, y: y}, src$1.data); // Add 1 pixel wrapped padding on each side of the image. RGBAImage.copy(src$1.data, image, { x: 0, y: h$1 - 1 }, { x: x, y: y - 1 }, { width: w$1, height: 1 }); // T RGBAImage.copy(src$1.data, image, { x: 0, y: 0 }, { x: x, y: y + h$1 }, { width: w$1, height: 1 }); // B RGBAImage.copy(src$1.data, image, { x: w$1 - 1, y: 0 }, { x: x - 1, y: y }, { width: 1, height: h$1 }); // L RGBAImage.copy(src$1.data, image, { x: 0, y: 0 }, { x: x + w$1, y: y }, { width: 1, height: h$1 }); // R } this.image = image; this.iconPositions = iconPositions; this.patternPositions = patternPositions; }; ImageAtlas.prototype.addImages = function addImages (images , positions , bins ) { for (var id in images) { var src = images[id]; var bin = { x: 0, y: 0, w: src.data.width + 2 * padding, h: src.data.height + 2 * padding, }; bins.push(bin); positions[id] = new ImagePosition(bin, src); if (src.hasRenderCallback) { this.haveRenderCallbacks.push(id); } } }; ImageAtlas.prototype.patchUpdatedImages = function patchUpdatedImages (imageManager , texture ) { imageManager.dispatchRenderCallbacks(this.haveRenderCallbacks); for (var name in imageManager.updatedImages) { this.patchUpdatedImage(this.iconPositions[name], imageManager.getImage(name), texture); this.patchUpdatedImage(this.patternPositions[name], imageManager.getImage(name), texture); } }; ImageAtlas.prototype.patchUpdatedImage = function patchUpdatedImage (position , image , texture ) { if (!position || !image) { return; } if (position.version === image.version) { return; } position.version = image.version; var ref = position.tl; var x = ref[0]; var y = ref[1]; texture.update(image.data, undefined, {x: x, y: y}); }; register('ImagePosition', ImagePosition); register('ImageAtlas', ImageAtlas); // var HTMLImageElement = self.HTMLImageElement; var HTMLCanvasElement = self.HTMLCanvasElement; var HTMLVideoElement = self.HTMLVideoElement; var ImageData$1 = self.ImageData; var Texture = function Texture(context , image , format , options ) { this.context = context; this.format = format; this.texture = context.gl.createTexture(); this.update(image, options); }; Texture.prototype.update = function update (image , options , position ) { var width = image.width; var height = image.height; var resize = (!this.size || this.size[0] !== width || this.size[1] !== height) && !position; var ref = this; var context = ref.context; var gl = context.gl; this.useMipmap = Boolean(options && options.useMipmap); gl.bindTexture(gl.TEXTURE_2D, this.texture); context.pixelStoreUnpackFlipY.set(false); context.pixelStoreUnpack.set(1); context.pixelStoreUnpackPremultiplyAlpha.set(this.format === gl.RGBA && (!options || options.premultiply !== false)); if (resize) { this.size = [width, height]; if (image instanceof HTMLImageElement || image instanceof HTMLCanvasElement || image instanceof HTMLVideoElement || image instanceof ImageData$1) { gl.texImage2D(gl.TEXTURE_2D, 0, this.format, this.format, gl.UNSIGNED_BYTE, image); } else { gl.texImage2D(gl.TEXTURE_2D, 0, this.format, width, height, 0, this.format, gl.UNSIGNED_BYTE, image.data); } } else { var ref$1 = position || { x: 0, y: 0}; var x = ref$1.x; var y = ref$1.y; if (image instanceof HTMLImageElement || image instanceof HTMLCanvasElement || image instanceof HTMLVideoElement || image instanceof ImageData$1) { gl.texSubImage2D(gl.TEXTURE_2D, 0, x, y, gl.RGBA, gl.UNSIGNED_BYTE, image); } else { gl.texSubImage2D(gl.TEXTURE_2D, 0, x, y, width, height, gl.RGBA, gl.UNSIGNED_BYTE, image.data); } } if (this.useMipmap && this.isSizePowerOfTwo()) { gl.generateMipmap(gl.TEXTURE_2D); } }; Texture.prototype.bind = function bind (filter , wrap , minFilter ) { var ref = this; var context = ref.context; var gl = context.gl; gl.bindTexture(gl.TEXTURE_2D, this.texture); if (minFilter === gl.LINEAR_MIPMAP_NEAREST && !this.isSizePowerOfTwo()) { minFilter = gl.LINEAR; } if (filter !== this.filter) { gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, filter); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, minFilter || filter); this.filter = filter; } if (wrap !== this.wrap) { gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, wrap); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, wrap); this.wrap = wrap; } }; Texture.prototype.isSizePowerOfTwo = function isSizePowerOfTwo () { return this.size[0] === this.size[1] && (Math.log(this.size[0]) / Math.LN2) % 1 === 0; }; Texture.prototype.destroy = function destroy () { var ref = this.context; var gl = ref.gl; gl.deleteTexture(this.texture); this.texture = (null ); }; var read = function (buffer, offset, isLE, mLen, nBytes) { var e, m; var eLen = nBytes * 8 - mLen - 1; var eMax = (1 << eLen) - 1; var eBias = eMax >> 1; var nBits = -7; var i = isLE ? (nBytes - 1) : 0; var d = isLE ? -1 : 1; var s = buffer[offset + i]; i += d; e = s & ((1 << (-nBits)) - 1); s >>= (-nBits); nBits += eLen; for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) {} m = e & ((1 << (-nBits)) - 1); e >>= (-nBits); nBits += mLen; for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) {} if (e === 0) { e = 1 - eBias; } else if (e === eMax) { return m ? NaN : ((s ? -1 : 1) * Infinity) } else { m = m + Math.pow(2, mLen); e = e - eBias; } return (s ? -1 : 1) * m * Math.pow(2, e - mLen) }; var write = function (buffer, value, offset, isLE, mLen, nBytes) { var e, m, c; var eLen = nBytes * 8 - mLen - 1; var eMax = (1 << eLen) - 1; var eBias = eMax >> 1; var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0); var i = isLE ? 0 : (nBytes - 1); var d = isLE ? 1 : -1; var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0; value = Math.abs(value); if (isNaN(value) || value === Infinity) { m = isNaN(value) ? 1 : 0; e = eMax; } else { e = Math.floor(Math.log(value) / Math.LN2); if (value * (c = Math.pow(2, -e)) < 1) { e--; c *= 2; } if (e + eBias >= 1) { value += rt / c; } else { value += rt * Math.pow(2, 1 - eBias); } if (value * c >= 2) { e++; c /= 2; } if (e + eBias >= eMax) { m = 0; e = eMax; } else if (e + eBias >= 1) { m = (value * c - 1) * Math.pow(2, mLen); e = e + eBias; } else { m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen); e = 0; } } for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {} e = (e << mLen) | m; eLen += mLen; for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {} buffer[offset + i - d] |= s * 128; }; var ieee754 = { read: read, write: write }; 'use strict'; var pbf = Pbf; function Pbf(buf) { this.buf = ArrayBuffer.isView && ArrayBuffer.isView(buf) ? buf : new Uint8Array(buf || 0); this.pos = 0; this.type = 0; this.length = this.buf.length; } Pbf.Varint = 0; // varint: int32, int64, uint32, uint64, sint32, sint64, bool, enum Pbf.Fixed64 = 1; // 64-bit: double, fixed64, sfixed64 Pbf.Bytes = 2; // length-delimited: string, bytes, embedded messages, packed repeated fields Pbf.Fixed32 = 5; // 32-bit: float, fixed32, sfixed32 var SHIFT_LEFT_32 = (1 << 16) * (1 << 16), SHIFT_RIGHT_32 = 1 / SHIFT_LEFT_32; Pbf.prototype = { destroy: function() { this.buf = null; }, // === READING ================================================================= readFields: function(readField, result, end) { end = end || this.length; while (this.pos < end) { var val = this.readVarint(), tag = val >> 3, startPos = this.pos; this.type = val & 0x7; readField(tag, result, this); if (this.pos === startPos) { this.skip(val); } } return result; }, readMessage: function(readField, result) { return this.readFields(readField, result, this.readVarint() + this.pos); }, readFixed32: function() { var val = readUInt32(this.buf, this.pos); this.pos += 4; return val; }, readSFixed32: function() { var val = readInt32(this.buf, this.pos); this.pos += 4; return val; }, // 64-bit int handling is based on github.com/dpw/node-buffer-more-ints (MIT-licensed) readFixed64: function() { var val = readUInt32(this.buf, this.pos) + readUInt32(this.buf, this.pos + 4) * SHIFT_LEFT_32; this.pos += 8; return val; }, readSFixed64: function() { var val = readUInt32(this.buf, this.pos) + readInt32(this.buf, this.pos + 4) * SHIFT_LEFT_32; this.pos += 8; return val; }, readFloat: function() { var val = ieee754.read(this.buf, this.pos, true, 23, 4); this.pos += 4; return val; }, readDouble: function() { var val = ieee754.read(this.buf, this.pos, true, 52, 8); this.pos += 8; return val; }, readVarint: function(isSigned) { var buf = this.buf, val, b; b = buf[this.pos++]; val = b & 0x7f; if (b < 0x80) { return val; } b = buf[this.pos++]; val |= (b & 0x7f) << 7; if (b < 0x80) { return val; } b = buf[this.pos++]; val |= (b & 0x7f) << 14; if (b < 0x80) { return val; } b = buf[this.pos++]; val |= (b & 0x7f) << 21; if (b < 0x80) { return val; } b = buf[this.pos]; val |= (b & 0x0f) << 28; return readVarintRemainder(val, isSigned, this); }, readVarint64: function() { // for compatibility with v2.0.1 return this.readVarint(true); }, readSVarint: function() { var num = this.readVarint(); return num % 2 === 1 ? (num + 1) / -2 : num / 2; // zigzag encoding }, readBoolean: function() { return Boolean(this.readVarint()); }, readString: function() { var end = this.readVarint() + this.pos, str = readUtf8(this.buf, this.pos, end); this.pos = end; return str; }, readBytes: function() { var end = this.readVarint() + this.pos, buffer = this.buf.subarray(this.pos, end); this.pos = end; return buffer; }, // verbose for performance reasons; doesn't affect gzipped size readPackedVarint: function(arr, isSigned) { var end = readPackedEnd(this); arr = arr || []; while (this.pos < end) { arr.push(this.readVarint(isSigned)); } return arr; }, readPackedSVarint: function(arr) { var end = readPackedEnd(this); arr = arr || []; while (this.pos < end) { arr.push(this.readSVarint()); } return arr; }, readPackedBoolean: function(arr) { var end = readPackedEnd(this); arr = arr || []; while (this.pos < end) { arr.push(this.readBoolean()); } return arr; }, readPackedFloat: function(arr) { var end = readPackedEnd(this); arr = arr || []; while (this.pos < end) { arr.push(this.readFloat()); } return arr; }, readPackedDouble: function(arr) { var end = readPackedEnd(this); arr = arr || []; while (this.pos < end) { arr.push(this.readDouble()); } return arr; }, readPackedFixed32: function(arr) { var end = readPackedEnd(this); arr = arr || []; while (this.pos < end) { arr.push(this.readFixed32()); } return arr; }, readPackedSFixed32: function(arr) { var end = readPackedEnd(this); arr = arr || []; while (this.pos < end) { arr.push(this.readSFixed32()); } return arr; }, readPackedFixed64: function(arr) { var end = readPackedEnd(this); arr = arr || []; while (this.pos < end) { arr.push(this.readFixed64()); } return arr; }, readPackedSFixed64: function(arr) { var end = readPackedEnd(this); arr = arr || []; while (this.pos < end) { arr.push(this.readSFixed64()); } return arr; }, skip: function(val) { var type = val & 0x7; if (type === Pbf.Varint) { while (this.buf[this.pos++] > 0x7f) {} } else if (type === Pbf.Bytes) { this.pos = this.readVarint() + this.pos; } else if (type === Pbf.Fixed32) { this.pos += 4; } else if (type === Pbf.Fixed64) { this.pos += 8; } else { throw new Error('Unimplemented type: ' + type); } }, // === WRITING ================================================================= writeTag: function(tag, type) { this.writeVarint((tag << 3) | type); }, realloc: function(min) { var length = this.length || 16; while (length < this.pos + min) { length *= 2; } if (length !== this.length) { var buf = new Uint8Array(length); buf.set(this.buf); this.buf = buf; this.length = length; } }, finish: function() { this.length = this.pos; this.pos = 0; return this.buf.subarray(0, this.length); }, writeFixed32: function(val) { this.realloc(4); writeInt32(this.buf, val, this.pos); this.pos += 4; }, writeSFixed32: function(val) { this.realloc(4); writeInt32(this.buf, val, this.pos); this.pos += 4; }, writeFixed64: function(val) { this.realloc(8); writeInt32(this.buf, val & -1, this.pos); writeInt32(this.buf, Math.floor(val * SHIFT_RIGHT_32), this.pos + 4); this.pos += 8; }, writeSFixed64: function(val) { this.realloc(8); writeInt32(this.buf, val & -1, this.pos); writeInt32(this.buf, Math.floor(val * SHIFT_RIGHT_32), this.pos + 4); this.pos += 8; }, writeVarint: function(val) { val = +val || 0; if (val > 0xfffffff || val < 0) { writeBigVarint(val, this); return; } this.realloc(4); this.buf[this.pos++] = val & 0x7f | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) { return; } this.buf[this.pos++] = ((val >>>= 7) & 0x7f) | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) { return; } this.buf[this.pos++] = ((val >>>= 7) & 0x7f) | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) { return; } this.buf[this.pos++] = (val >>> 7) & 0x7f; }, writeSVarint: function(val) { this.writeVarint(val < 0 ? -val * 2 - 1 : val * 2); }, writeBoolean: function(val) { this.writeVarint(Boolean(val)); }, writeString: function(str) { str = String(str); this.realloc(str.length * 4); this.pos++; // reserve 1 byte for short string length var startPos = this.pos; // write the string directly to the buffer and see how much was written this.pos = writeUtf8(this.buf, str, this.pos); var len = this.pos - startPos; if (len >= 0x80) { makeRoomForExtraLength(startPos, len, this); } // finally, write the message length in the reserved place and restore the position this.pos = startPos - 1; this.writeVarint(len); this.pos += len; }, writeFloat: function(val) { this.realloc(4); ieee754.write(this.buf, val, this.pos, true, 23, 4); this.pos += 4; }, writeDouble: function(val) { this.realloc(8); ieee754.write(this.buf, val, this.pos, true, 52, 8); this.pos += 8; }, writeBytes: function(buffer) { var len = buffer.length; this.writeVarint(len); this.realloc(len); for (var i = 0; i < len; i++) { this.buf[this.pos++] = buffer[i]; } }, writeRawMessage: function(fn, obj) { this.pos++; // reserve 1 byte for short message length // write the message directly to the buffer and see how much was written var startPos = this.pos; fn(obj, this); var len = this.pos - startPos; if (len >= 0x80) { makeRoomForExtraLength(startPos, len, this); } // finally, write the message length in the reserved place and restore the position this.pos = startPos - 1; this.writeVarint(len); this.pos += len; }, writeMessage: function(tag, fn, obj) { this.writeTag(tag, Pbf.Bytes); this.writeRawMessage(fn, obj); }, writePackedVarint: function(tag, arr) { this.writeMessage(tag, writePackedVarint, arr); }, writePackedSVarint: function(tag, arr) { this.writeMessage(tag, writePackedSVarint, arr); }, writePackedBoolean: function(tag, arr) { this.writeMessage(tag, writePackedBoolean, arr); }, writePackedFloat: function(tag, arr) { this.writeMessage(tag, writePackedFloat, arr); }, writePackedDouble: function(tag, arr) { this.writeMessage(tag, writePackedDouble, arr); }, writePackedFixed32: function(tag, arr) { this.writeMessage(tag, writePackedFixed32, arr); }, writePackedSFixed32: function(tag, arr) { this.writeMessage(tag, writePackedSFixed32, arr); }, writePackedFixed64: function(tag, arr) { this.writeMessage(tag, writePackedFixed64, arr); }, writePackedSFixed64: function(tag, arr) { this.writeMessage(tag, writePackedSFixed64, arr); }, writeBytesField: function(tag, buffer) { this.writeTag(tag, Pbf.Bytes); this.writeBytes(buffer); }, writeFixed32Field: function(tag, val) { this.writeTag(tag, Pbf.Fixed32); this.writeFixed32(val); }, writeSFixed32Field: function(tag, val) { this.writeTag(tag, Pbf.Fixed32); this.writeSFixed32(val); }, writeFixed64Field: function(tag, val) { this.writeTag(tag, Pbf.Fixed64); this.writeFixed64(val); }, writeSFixed64Field: function(tag, val) { this.writeTag(tag, Pbf.Fixed64); this.writeSFixed64(val); }, writeVarintField: function(tag, val) { this.writeTag(tag, Pbf.Varint); this.writeVarint(val); }, writeSVarintField: function(tag, val) { this.writeTag(tag, Pbf.Varint); this.writeSVarint(val); }, writeStringField: function(tag, str) { this.writeTag(tag, Pbf.Bytes); this.writeString(str); }, writeFloatField: function(tag, val) { this.writeTag(tag, Pbf.Fixed32); this.writeFloat(val); }, writeDoubleField: function(tag, val) { this.writeTag(tag, Pbf.Fixed64); this.writeDouble(val); }, writeBooleanField: function(tag, val) { this.writeVarintField(tag, Boolean(val)); } }; function readVarintRemainder(l, s, p) { var buf = p.buf, h, b; b = buf[p.pos++]; h = (b & 0x70) >> 4; if (b < 0x80) { return toNum(l, h, s); } b = buf[p.pos++]; h |= (b & 0x7f) << 3; if (b < 0x80) { return toNum(l, h, s); } b = buf[p.pos++]; h |= (b & 0x7f) << 10; if (b < 0x80) { return toNum(l, h, s); } b = buf[p.pos++]; h |= (b & 0x7f) << 17; if (b < 0x80) { return toNum(l, h, s); } b = buf[p.pos++]; h |= (b & 0x7f) << 24; if (b < 0x80) { return toNum(l, h, s); } b = buf[p.pos++]; h |= (b & 0x01) << 31; if (b < 0x80) { return toNum(l, h, s); } throw new Error('Expected varint not more than 10 bytes'); } function readPackedEnd(pbf) { return pbf.type === Pbf.Bytes ? pbf.readVarint() + pbf.pos : pbf.pos + 1; } function toNum(low, high, isSigned) { if (isSigned) { return high * 0x100000000 + (low >>> 0); } return ((high >>> 0) * 0x100000000) + (low >>> 0); } function writeBigVarint(val, pbf) { var low, high; if (val >= 0) { low = (val % 0x100000000) | 0; high = (val / 0x100000000) | 0; } else { low = ~(-val % 0x100000000); high = ~(-val / 0x100000000); if (low ^ 0xffffffff) { low = (low + 1) | 0; } else { low = 0; high = (high + 1) | 0; } } if (val >= 0x10000000000000000 || val < -0x10000000000000000) { throw new Error('Given varint doesn\'t fit into 10 bytes'); } pbf.realloc(10); writeBigVarintLow(low, high, pbf); writeBigVarintHigh(high, pbf); } function writeBigVarintLow(low, high, pbf) { pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7; pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7; pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7; pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7; pbf.buf[pbf.pos] = low & 0x7f; } function writeBigVarintHigh(high, pbf) { var lsb = (high & 0x07) << 4; pbf.buf[pbf.pos++] |= lsb | ((high >>>= 3) ? 0x80 : 0); if (!high) { return; } pbf.buf[pbf.pos++] = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) { return; } pbf.buf[pbf.pos++] = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) { return; } pbf.buf[pbf.pos++] = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) { return; } pbf.buf[pbf.pos++] = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) { return; } pbf.buf[pbf.pos++] = high & 0x7f; } function makeRoomForExtraLength(startPos, len, pbf) { var extraLen = len <= 0x3fff ? 1 : len <= 0x1fffff ? 2 : len <= 0xfffffff ? 3 : Math.ceil(Math.log(len) / (Math.LN2 * 7)); // if 1 byte isn't enough for encoding message length, shift the data to the right pbf.realloc(extraLen); for (var i = pbf.pos - 1; i >= startPos; i--) { pbf.buf[i + extraLen] = pbf.buf[i]; } } function writePackedVarint(arr, pbf) { for (var i = 0; i < arr.length; i++) { pbf.writeVarint(arr[i]); } } function writePackedSVarint(arr, pbf) { for (var i = 0; i < arr.length; i++) { pbf.writeSVarint(arr[i]); } } function writePackedFloat(arr, pbf) { for (var i = 0; i < arr.length; i++) { pbf.writeFloat(arr[i]); } } function writePackedDouble(arr, pbf) { for (var i = 0; i < arr.length; i++) { pbf.writeDouble(arr[i]); } } function writePackedBoolean(arr, pbf) { for (var i = 0; i < arr.length; i++) { pbf.writeBoolean(arr[i]); } } function writePackedFixed32(arr, pbf) { for (var i = 0; i < arr.length; i++) { pbf.writeFixed32(arr[i]); } } function writePackedSFixed32(arr, pbf) { for (var i = 0; i < arr.length; i++) { pbf.writeSFixed32(arr[i]); } } function writePackedFixed64(arr, pbf) { for (var i = 0; i < arr.length; i++) { pbf.writeFixed64(arr[i]); } } function writePackedSFixed64(arr, pbf) { for (var i = 0; i < arr.length; i++) { pbf.writeSFixed64(arr[i]); } } // Buffer code below from https://github.com/feross/buffer, MIT-licensed function readUInt32(buf, pos) { return ((buf[pos]) | (buf[pos + 1] << 8) | (buf[pos + 2] << 16)) + (buf[pos + 3] * 0x1000000); } function writeInt32(buf, val, pos) { buf[pos] = val; buf[pos + 1] = (val >>> 8); buf[pos + 2] = (val >>> 16); buf[pos + 3] = (val >>> 24); } function readInt32(buf, pos) { return ((buf[pos]) | (buf[pos + 1] << 8) | (buf[pos + 2] << 16)) + (buf[pos + 3] << 24); } function readUtf8(buf, pos, end) { var str = ''; var i = pos; while (i < end) { var b0 = buf[i]; var c = null; // codepoint var bytesPerSequence = b0 > 0xEF ? 4 : b0 > 0xDF ? 3 : b0 > 0xBF ? 2 : 1; if (i + bytesPerSequence > end) { break; } var b1, b2, b3; if (bytesPerSequence === 1) { if (b0 < 0x80) { c = b0; } } else if (bytesPerSequence === 2) { b1 = buf[i + 1]; if ((b1 & 0xC0) === 0x80) { c = (b0 & 0x1F) << 0x6 | (b1 & 0x3F); if (c <= 0x7F) { c = null; } } } else if (bytesPerSequence === 3) { b1 = buf[i + 1]; b2 = buf[i + 2]; if ((b1 & 0xC0) === 0x80 && (b2 & 0xC0) === 0x80) { c = (b0 & 0xF) << 0xC | (b1 & 0x3F) << 0x6 | (b2 & 0x3F); if (c <= 0x7FF || (c >= 0xD800 && c <= 0xDFFF)) { c = null; } } } else if (bytesPerSequence === 4) { b1 = buf[i + 1]; b2 = buf[i + 2]; b3 = buf[i + 3]; if ((b1 & 0xC0) === 0x80 && (b2 & 0xC0) === 0x80 && (b3 & 0xC0) === 0x80) { c = (b0 & 0xF) << 0x12 | (b1 & 0x3F) << 0xC | (b2 & 0x3F) << 0x6 | (b3 & 0x3F); if (c <= 0xFFFF || c >= 0x110000) { c = null; } } } if (c === null) { c = 0xFFFD; bytesPerSequence = 1; } else if (c > 0xFFFF) { c -= 0x10000; str += String.fromCharCode(c >>> 10 & 0x3FF | 0xD800); c = 0xDC00 | c & 0x3FF; } str += String.fromCharCode(c); i += bytesPerSequence; } return str; } function writeUtf8(buf, str, pos) { for (var i = 0, c, lead; i < str.length; i++) { c = str.charCodeAt(i); // code point if (c > 0xD7FF && c < 0xE000) { if (lead) { if (c < 0xDC00) { buf[pos++] = 0xEF; buf[pos++] = 0xBF; buf[pos++] = 0xBD; lead = c; continue; } else { c = lead - 0xD800 << 10 | c - 0xDC00 | 0x10000; lead = null; } } else { if (c > 0xDBFF || (i + 1 === str.length)) { buf[pos++] = 0xEF; buf[pos++] = 0xBF; buf[pos++] = 0xBD; } else { lead = c; } continue; } } else if (lead) { buf[pos++] = 0xEF; buf[pos++] = 0xBF; buf[pos++] = 0xBD; lead = null; } if (c < 0x80) { buf[pos++] = c; } else { if (c < 0x800) { buf[pos++] = c >> 0x6 | 0xC0; } else { if (c < 0x10000) { buf[pos++] = c >> 0xC | 0xE0; } else { buf[pos++] = c >> 0x12 | 0xF0; buf[pos++] = c >> 0xC & 0x3F | 0x80; } buf[pos++] = c >> 0x6 & 0x3F | 0x80; } buf[pos++] = c & 0x3F | 0x80; } } return pos; } // var border = 3; function readFontstacks(tag , glyphs , pbf ) { if (tag === 1) { pbf.readMessage(readFontstack, glyphs); } } function readFontstack(tag , glyphs , pbf ) { if (tag === 3) { var ref = pbf.readMessage(readGlyph, {}); var id = ref.id; var bitmap = ref.bitmap; var width = ref.width; var height = ref.height; var left = ref.left; var top = ref.top; var advance = ref.advance; glyphs.push({ id: id, bitmap: new AlphaImage({ width: width + 2 * border, height: height + 2 * border }, bitmap), metrics: {width: width, height: height, left: left, top: top, advance: advance} }); } } function readGlyph(tag , glyph , pbf ) { if (tag === 1) { glyph.id = pbf.readVarint(); } else if (tag === 2) { glyph.bitmap = pbf.readBytes(); } else if (tag === 3) { glyph.width = pbf.readVarint(); } else if (tag === 4) { glyph.height = pbf.readVarint(); } else if (tag === 5) { glyph.left = pbf.readSVarint(); } else if (tag === 6) { glyph.top = pbf.readSVarint(); } else if (tag === 7) { glyph.advance = pbf.readVarint(); } } function parseGlyphPBF (data ) { return new pbf(data).readFields(readFontstacks, []); } var GLYPH_PBF_BORDER = border; // /** * An implementation of the [Actor design pattern](http://en.wikipedia.org/wiki/Actor_model) * that maintains the relationship between asynchronous tasks and the objects * that spin them off - in this case, tasks like parsing parts of styles, * owned by the styles * * @param {WebWorker} target * @param {WebWorker} parent * @param {string|number} mapId A unique identifier for the Map instance using this Actor. * @private */ var Actor = function Actor(target , parent , mapId ) { this.target = target; this.parent = parent; this.mapId = mapId; this.callbacks = {}; this.callbackID = 0; bindAll(['receive'], this); this.target.addEventListener('message', this.receive, false); }; /** * Sends a message from a main-thread map to a Worker or from a Worker back to * a main-thread map instance. * * @param type The name of the target method to invoke or '[source-type].[source-name].name' for a method on a WorkerSource. * @param targetMapId A particular mapId to which to send this message. * @private */ Actor.prototype.send = function send (type , data , callback , targetMapId ) { var this$1 = this; var id = callback ? ((this.mapId) + ":" + (this.callbackID++)) : null; if (callback) { this.callbacks[id] = callback; } var buffers = []; this.target.postMessage({ targetMapId: targetMapId, sourceMapId: this.mapId, type: type, id: String(id), data: serialize(data, buffers) }, buffers); if (callback) { return { cancel: function () { return this$1.target.postMessage({ targetMapId: targetMapId, sourceMapId: this$1.mapId, type: '', id: String(id) }); } }; } }; Actor.prototype.receive = function receive (message ) { var this$1 = this; var data = message.data, id = data.id; var callback; if (data.targetMapId && this.mapId !== data.targetMapId) { return; } var done = function (err, data) { delete this$1.callbacks[id]; var buffers = []; this$1.target.postMessage({ sourceMapId: this$1.mapId, type: '', id: String(id), error: err ? serialize(err) : null, data: serialize(data, buffers) }, buffers); }; if (data.type === '' || data.type === '') { callback = this.callbacks[data.id]; delete this.callbacks[data.id]; if (callback && data.error) { callback(deserialize(data.error)); } else if (callback) { callback(null, deserialize(data.data)); } } else if (typeof data.id !== 'undefined' && this.parent[data.type]) { // data.type == 'loadTile', 'removeTile', etc. // Add a placeholder so that we can discover when the done callback was called already. this.callbacks[data.id] = null; var cancelable = this.parent[data.type](data.sourceMapId, deserialize(data.data), done); if (cancelable && this.callbacks[data.id] === null) { // Only add the cancelable callback if the done callback wasn't already called. // Otherwise we will never be able to delete it. this.callbacks[data.id] = cancelable.cancel; } } else if (typeof data.id !== 'undefined' && this.parent.getWorkerSource) { // data.type == sourcetype.method var keys = data.type.split('.'); var params = (deserialize(data.data) ); var workerSource = (this.parent ).getWorkerSource(data.sourceMapId, keys[0], params.source); workerSource[keys[1]](params, done); } else { this.parent[data.type](deserialize(data.data)); } }; Actor.prototype.remove = function remove () { this.target.removeEventListener('message', this.receive, false); }; /** * getURL * * @param {String} baseUrl Base url of the WMS server * @param {String} layer Layer name * @param {Number} x Tile coordinate x * @param {Number} y Tile coordinate y * @param {Number} z Tile zoom * @param {Object} [options] * @param {String} [options.format='image/png'] * @param {String} [options.service='WMS'] * @param {String} [options.version='1.1.1'] * @param {String} [options.request='GetMap'] * @param {String} [options.srs='EPSG:3857'] * @param {Number} [options.width='256'] * @param {Number} [options.height='256'] * @returns {String} url * @example * var baseUrl = 'http://geodata.state.nj.us/imagerywms/Natural2015'; * var layer = 'Natural2015'; * var url = whoots.getURL(baseUrl, layer, 154308, 197167, 19); */ function getURL(baseUrl, layer, x, y, z, options) { options = options || {}; var url = baseUrl + '?' + [ 'bbox=' + getTileBBox(x, y, z), 'format=' + (options.format || 'image/png'), 'service=' + (options.service || 'WMS'), 'version=' + (options.version || '1.1.1'), 'request=' + (options.request || 'GetMap'), 'srs=' + (options.srs || 'EPSG:3857'), 'width=' + (options.width || 256), 'height=' + (options.height || 256), 'layers=' + layer ].join('&'); return url; } /** * getTileBBox * * @param {Number} x Tile coordinate x * @param {Number} y Tile coordinate y * @param {Number} z Tile zoom * @returns {String} String of the bounding box */ function getTileBBox(x, y, z) { // for Google/OSM tile scheme we need to alter the y y = (Math.pow(2, z) - y - 1); var min = getMercCoords(x * 256, y * 256, z), max = getMercCoords((x + 1) * 256, (y + 1) * 256, z); return min[0] + ',' + min[1] + ',' + max[0] + ',' + max[1]; } /** * getMercCoords * * @param {Number} x Pixel coordinate x * @param {Number} y Pixel coordinate y * @param {Number} z Tile zoom * @returns {Array} [x, y] */ function getMercCoords(x, y, z) { var resolution = (2 * Math.PI * 6378137 / 256) / Math.pow(2, z), merc_x = (x * resolution - 2 * Math.PI * 6378137 / 2.0), merc_y = (y * resolution - 2 * Math.PI * 6378137 / 2.0); return [merc_x, merc_y]; } // /** * A `LngLatBounds` object represents a geographical bounding box, * defined by its southwest and northeast points in longitude and latitude. * * If no arguments are provided to the constructor, a `null` bounding box is created. * * Note that any Mapbox GL method that accepts a `LngLatBounds` object as an argument or option * can also accept an `Array` of two {@link LngLatLike} constructs and will perform an implicit conversion. * This flexible type is documented as {@link LngLatBoundsLike}. * * @param {LngLatLike} [sw] The southwest corner of the bounding box. * @param {LngLatLike} [ne] The northeast corner of the bounding box. * @example * var sw = new mapboxgl.LngLat(-73.9876, 40.7661); * var ne = new mapboxgl.LngLat(-73.9397, 40.8002); * var llb = new mapboxgl.LngLatBounds(sw, ne); */ var LngLatBounds = function LngLatBounds(sw , ne ) { if (!sw) { // noop } else if (ne) { this.setSouthWest(sw).setNorthEast(ne); } else if (sw.length === 4) { this.setSouthWest([sw[0], sw[1]]).setNorthEast([sw[2], sw[3]]); } else { this.setSouthWest(sw[0]).setNorthEast(sw[1]); } }; /** * Set the northeast corner of the bounding box * * @param {LngLatLike} ne * @returns {LngLatBounds} `this` */ LngLatBounds.prototype.setNorthEast = function setNorthEast (ne ) { this._ne = ne instanceof LngLat ? new LngLat(ne.lng, ne.lat) : LngLat.convert(ne); return this; }; /** * Set the southwest corner of the bounding box * * @param {LngLatLike} sw * @returns {LngLatBounds} `this` */ LngLatBounds.prototype.setSouthWest = function setSouthWest (sw ) { this._sw = sw instanceof LngLat ? new LngLat(sw.lng, sw.lat) : LngLat.convert(sw); return this; }; /** * Extend the bounds to include a given LngLat or LngLatBounds. * * @param {LngLat|LngLatBounds} obj object to extend to * @returns {LngLatBounds} `this` */ LngLatBounds.prototype.extend = function extend (obj ) { var sw = this._sw, ne = this._ne; var sw2, ne2; if (obj instanceof LngLat) { sw2 = obj; ne2 = obj; } else if (obj instanceof LngLatBounds) { sw2 = obj._sw; ne2 = obj._ne; if (!sw2 || !ne2) { return this; } } else { if (Array.isArray(obj)) { if (obj.every(Array.isArray)) { return this.extend(LngLatBounds.convert(obj)); } else { return this.extend(LngLat.convert(obj)); } } return this; } if (!sw && !ne) { this._sw = new LngLat(sw2.lng, sw2.lat); this._ne = new LngLat(ne2.lng, ne2.lat); } else { sw.lng = Math.min(sw2.lng, sw.lng); sw.lat = Math.min(sw2.lat, sw.lat); ne.lng = Math.max(ne2.lng, ne.lng); ne.lat = Math.max(ne2.lat, ne.lat); } return this; }; /** * Returns the geographical coordinate equidistant from the bounding box's corners. * * @returns {LngLat} The bounding box's center. * @example * var llb = new mapboxgl.LngLatBounds([-73.9876, 40.7661], [-73.9397, 40.8002]); * llb.getCenter(); // = LngLat {lng: -73.96365, lat: 40.78315} */ LngLatBounds.prototype.getCenter = function getCenter () { return new LngLat((this._sw.lng + this._ne.lng) / 2, (this._sw.lat + this._ne.lat) / 2); }; /** * Returns the southwest corner of the bounding box. * * @returns {LngLat} The southwest corner of the bounding box. */ LngLatBounds.prototype.getSouthWest = function getSouthWest () { return this._sw; }; /** * Returns the northeast corner of the bounding box. * * @returns {LngLat} The northeast corner of the bounding box. */ LngLatBounds.prototype.getNorthEast = function getNorthEast () { return this._ne; }; /** * Returns the northwest corner of the bounding box. * * @returns {LngLat} The northwest corner of the bounding box. */ LngLatBounds.prototype.getNorthWest = function getNorthWest () { return new LngLat(this.getWest(), this.getNorth()); }; /** * Returns the southeast corner of the bounding box. * * @returns {LngLat} The southeast corner of the bounding box. */ LngLatBounds.prototype.getSouthEast = function getSouthEast () { return new LngLat(this.getEast(), this.getSouth()); }; /** * Returns the west edge of the bounding box. * * @returns {number} The west edge of the bounding box. */ LngLatBounds.prototype.getWest = function getWest () { return this._sw.lng; }; /** * Returns the south edge of the bounding box. * * @returns {number} The south edge of the bounding box. */ LngLatBounds.prototype.getSouth = function getSouth () { return this._sw.lat; }; /** * Returns the east edge of the bounding box. * * @returns {number} The east edge of the bounding box. */ LngLatBounds.prototype.getEast = function getEast () { return this._ne.lng; }; /** * Returns the north edge of the bounding box. * * @returns {number} The north edge of the bounding box. */ LngLatBounds.prototype.getNorth = function getNorth () { return this._ne.lat; }; /** * Returns the bounding box represented as an array. * * @returns {Array>} The bounding box represented as an array, consisting of the * southwest and northeast coordinates of the bounding represented as arrays of numbers. * @example * var llb = new mapboxgl.LngLatBounds([-73.9876, 40.7661], [-73.9397, 40.8002]); * llb.toArray(); // = [[-73.9876, 40.7661], [-73.9397, 40.8002]] */ LngLatBounds.prototype.toArray = function toArray () { return [this._sw.toArray(), this._ne.toArray()]; }; /** * Return the bounding box represented as a string. * * @returns {string} The bounding box represents as a string of the format * `'LngLatBounds(LngLat(lng, lat), LngLat(lng, lat))'`. * @example * var llb = new mapboxgl.LngLatBounds([-73.9876, 40.7661], [-73.9397, 40.8002]); * llb.toString(); // = "LngLatBounds(LngLat(-73.9876, 40.7661), LngLat(-73.9397, 40.8002))" */ LngLatBounds.prototype.toString = function toString () { return ("LngLatBounds(" + (this._sw.toString()) + ", " + (this._ne.toString()) + ")"); }; /** * Check if the bounding box is an empty/`null`-type box. * * @returns {boolean} True if bounds have been defined, otherwise false. */ LngLatBounds.prototype.isEmpty = function isEmpty () { return !(this._sw && this._ne); }; /** * Converts an array to a `LngLatBounds` object. * * If a `LngLatBounds` object is passed in, the function returns it unchanged. * * Internally, the function calls `LngLat#convert` to convert arrays to `LngLat` values. * * @param {LngLatBoundsLike} input An array of two coordinates to convert, or a `LngLatBounds` object to return. * @returns {LngLatBounds} A new `LngLatBounds` object, if a conversion occurred, or the original `LngLatBounds` object. * @example * var arr = [[-73.9876, 40.7661], [-73.9397, 40.8002]]; * var llb = mapboxgl.LngLatBounds.convert(arr); * llb; // = LngLatBounds {_sw: LngLat {lng: -73.9876, lat: 40.7661}, _ne: LngLat {lng: -73.9397, lat: 40.8002}} */ LngLatBounds.convert = function convert (input ) { if (!input || input instanceof LngLatBounds) { return input; } return new LngLatBounds(input); }; // /** * A `LngLat` object represents a given longitude and latitude coordinate, measured in degrees. * * Mapbox GL uses longitude, latitude coordinate order (as opposed to latitude, longitude) to match GeoJSON. * * Note that any Mapbox GL method that accepts a `LngLat` object as an argument or option * can also accept an `Array` of two numbers and will perform an implicit conversion. * This flexible type is documented as {@link LngLatLike}. * * @param {number} lng Longitude, measured in degrees. * @param {number} lat Latitude, measured in degrees. * @example * var ll = new mapboxgl.LngLat(-73.9749, 40.7736); * @see [Get coordinates of the mouse pointer](https://www.mapbox.com/mapbox-gl-js/example/mouse-position/) * @see [Display a popup](https://www.mapbox.com/mapbox-gl-js/example/popup/) * @see [Highlight features within a bounding box](https://www.mapbox.com/mapbox-gl-js/example/using-box-queryrenderedfeatures/) * @see [Create a timeline animation](https://www.mapbox.com/mapbox-gl-js/example/timeline-animation/) */ var LngLat = function LngLat(lng , lat ) { if (isNaN(lng) || isNaN(lat)) { throw new Error(("Invalid LngLat object: (" + lng + ", " + lat + ")")); } this.lng = +lng; this.lat = +lat; if (this.lat > 90 || this.lat < -90) { throw new Error('Invalid LngLat latitude value: must be between -90 and 90'); } }; /** * Returns a new `LngLat` object whose longitude is wrapped to the range (-180, 180). * * @returns {LngLat} The wrapped `LngLat` object. * @example * var ll = new mapboxgl.LngLat(286.0251, 40.7736); * var wrapped = ll.wrap(); * wrapped.lng; // = -73.9749 */ LngLat.prototype.wrap = function wrap$1 () { return new LngLat(wrap(this.lng, -180, 180), this.lat); }; /** * Returns the coordinates represented as an array of two numbers. * * @returns {Array} The coordinates represeted as an array of longitude and latitude. * @example * var ll = new mapboxgl.LngLat(-73.9749, 40.7736); * ll.toArray(); // = [-73.9749, 40.7736] */ LngLat.prototype.toArray = function toArray () { return [this.lng, this.lat]; }; /** * Returns the coordinates represent as a string. * * @returns {string} The coordinates represented as a string of the format `'LngLat(lng, lat)'`. * @example * var ll = new mapboxgl.LngLat(-73.9749, 40.7736); * ll.toString(); // = "LngLat(-73.9749, 40.7736)" */ LngLat.prototype.toString = function toString () { return ("LngLat(" + (this.lng) + ", " + (this.lat) + ")"); }; /** * Returns a `LngLatBounds` from the coordinates extended by a given `radius`. * * @param {number} [radius=0] Distance in meters from the coordinates to extend the bounds. * @returns {LngLatBounds} A new `LngLatBounds` object representing the coordinates extended by the `radius`. * @example * var ll = new mapboxgl.LngLat(-73.9749, 40.7736); * ll.toBounds(100).toArray(); // = [[-73.97501862141328, 40.77351016847229], [-73.97478137858673, 40.77368983152771]] */ LngLat.prototype.toBounds = function toBounds (radius) { if ( radius === void 0 ) radius = 0; var earthCircumferenceInMetersAtEquator = 40075017; var latAccuracy = 360 * radius / earthCircumferenceInMetersAtEquator, lngAccuracy = latAccuracy / Math.cos((Math.PI / 180) * this.lat); return new LngLatBounds(new LngLat(this.lng - lngAccuracy, this.lat - latAccuracy), new LngLat(this.lng + lngAccuracy, this.lat + latAccuracy)); }; /** * Converts an array of two numbers or an object with `lng` and `lat` or `lon` and `lat` properties * to a `LngLat` object. * * If a `LngLat` object is passed in, the function returns it unchanged. * * @param {LngLatLike} input An array of two numbers or object to convert, or a `LngLat` object to return. * @returns {LngLat} A new `LngLat` object, if a conversion occurred, or the original `LngLat` object. * @example * var arr = [-73.9749, 40.7736]; * var ll = mapboxgl.LngLat.convert(arr); * ll; // = LngLat {lng: -73.9749, lat: 40.7736} */ LngLat.convert = function convert (input ) { if (input instanceof LngLat) { return input; } if (Array.isArray(input) && (input.length === 2 || input.length === 3)) { return new LngLat(Number(input[0]), Number(input[1])); } if (!Array.isArray(input) && typeof input === 'object' && input !== null) { return new LngLat( // flow can't refine this to have one of lng or lat, so we have to cast to any Number('lng' in input ? (input ).lng : (input ).lon), Number(input.lat) ); } throw new Error("`LngLatLike` argument must be specified as a LngLat instance, an object {lng: , lat: }, an object {lon: , lat: }, or an array of [, ]"); }; // /* * The circumference of the world in meters at the given latitude. */ function circumferenceAtLatitude(latitude ) { var circumference = 2 * Math.PI * 6378137; return circumference * Math.cos(latitude * Math.PI / 180); } function mercatorXfromLng(lng ) { return (180 + lng) / 360; } function mercatorYfromLat(lat ) { return (180 - (180 / Math.PI * Math.log(Math.tan(Math.PI / 4 + lat * Math.PI / 360)))) / 360; } function mercatorZfromAltitude(altitude , lat ) { return altitude / circumferenceAtLatitude(lat); } function lngFromMercatorX(x ) { return x * 360 - 180; } function latFromMercatorY(y ) { var y2 = 180 - y * 360; return 360 / Math.PI * Math.atan(Math.exp(y2 * Math.PI / 180)) - 90; } function altitudeFromMercatorZ(z , y ) { return z * circumferenceAtLatitude(latFromMercatorY(y)); } /** * A `MercatorCoordinate` object represents a projected three dimensional position. * * `MercatorCoordinate` uses the web mercator projection ([EPSG:3857](https://epsg.io/3857)) with slightly different units: * - the size of 1 unit is the width of the projected world instead of the "mercator meter" * - the origin of the coordinate space is at the north-west corner instead of the middle * * For example, `MercatorCoordinate(0, 0, 0)` is the north-west corner of the mercator world and * `MercatorCoordinate(1, 1, 0)` is the south-east corner. If you are familiar with * [vector tiles](https://github.com/mapbox/vector-tile-spec) it may be helpful to think * of the coordinate space as the `0/0/0` tile with an extent of `1`. * * The `z` dimension of `MercatorCoordinate` is conformal. A cube in the mercator coordinate space would be rendered as a cube. * * @param {number} x The x component of the position. * @param {number} y The y component of the position. * @param {number} z The z component of the position. * @example * var nullIsland = new mapboxgl.MercatorCoordinate(0.5, 0.5, 0); * * @see [Add a custom style layer](https://www.mapbox.com/mapbox-gl-js/example/custom-style-layer/) */ var MercatorCoordinate = function MercatorCoordinate(x , y , z) { if ( z === void 0 ) z = 0; this.x = +x; this.y = +y; this.z = +z; }; /** * Project a `LngLat` to a `MercatorCoordinate`. * * @param {LngLatLike} lngLatLike The location to project. * @param {number} altitude The altitude in meters of the position. * @returns {MercatorCoordinate} The projected mercator coordinate. * @example * var coord = mapboxgl.MercatorCoordinate.fromLngLat({ lng: 0, lat: 0}, 0); * coord; // MercatorCoordinate(0.5, 0.5, 0) */ MercatorCoordinate.fromLngLat = function fromLngLat (lngLatLike , altitude) { if ( altitude === void 0 ) altitude = 0; var lngLat = LngLat.convert(lngLatLike); return new MercatorCoordinate( mercatorXfromLng(lngLat.lng), mercatorYfromLat(lngLat.lat), mercatorZfromAltitude(altitude, lngLat.lat)); }; /** * Returns the `LngLat` for the coordinate. * * @returns {LngLat} The `LngLat` object. * @example * var coord = new mapboxgl.MercatorCoordinate(0.5, 0.5, 0); * var latLng = coord.toLngLat(); // LngLat(0, 0) */ MercatorCoordinate.prototype.toLngLat = function toLngLat () { return new LngLat( lngFromMercatorX(this.x), latFromMercatorY(this.y)); }; /** * Returns the altitude in meters of the coordinate. * * @returns {number} The altitude in meters. * @example * var coord = new mapboxgl.MercatorCoordinate(0, 0, 0.02); * coord.toAltitude(); // 6914.281956295339 */ MercatorCoordinate.prototype.toAltitude = function toAltitude () { return altitudeFromMercatorZ(this.z, this.y); }; // var CanonicalTileID = function CanonicalTileID(z , x , y ) { assert_1(z >= 0 && z <= 25); assert_1(x >= 0 && x < Math.pow(2, z)); assert_1(y >= 0 && y < Math.pow(2, z)); this.z = z; this.x = x; this.y = y; this.key = calculateKey(0, z, x, y); }; CanonicalTileID.prototype.equals = function equals (id ) { return this.z === id.z && this.x === id.x && this.y === id.y; }; // given a list of urls, choose a url template and return a tile URL CanonicalTileID.prototype.url = function url (urls , scheme ) { var bbox = getTileBBox(this.x, this.y, this.z); var quadkey = getQuadkey(this.z, this.x, this.y); return urls[(this.x + this.y) % urls.length] .replace('{prefix}', (this.x % 16).toString(16) + (this.y % 16).toString(16)) .replace('{z}', String(this.z)) .replace('{x}', String(this.x)) .replace('{y}', String(scheme === 'tms' ? (Math.pow(2, this.z) - this.y - 1) : this.y)) .replace('{quadkey}', quadkey) .replace('{bbox-epsg-3857}', bbox); }; CanonicalTileID.prototype.getTilePoint = function getTilePoint (coord ) { var tilesAtZoom = Math.pow(2, this.z); return new pointGeometry( (coord.x * tilesAtZoom - this.x) * EXTENT, (coord.y * tilesAtZoom - this.y) * EXTENT); }; var UnwrappedTileID = function UnwrappedTileID(wrap , canonical ) { this.wrap = wrap; this.canonical = canonical; this.key = calculateKey(wrap, canonical.z, canonical.x, canonical.y); }; var OverscaledTileID = function OverscaledTileID(overscaledZ , wrap , z , x , y ) { assert_1(overscaledZ >= z); this.overscaledZ = overscaledZ; this.wrap = wrap; this.canonical = new CanonicalTileID(z, +x, +y); this.key = calculateKey(wrap, overscaledZ, x, y); }; OverscaledTileID.prototype.equals = function equals (id ) { return this.overscaledZ === id.overscaledZ && this.wrap === id.wrap && this.canonical.equals(id.canonical); }; OverscaledTileID.prototype.scaledTo = function scaledTo (targetZ ) { assert_1(targetZ <= this.overscaledZ); var zDifference = this.canonical.z - targetZ; if (targetZ > this.canonical.z) { return new OverscaledTileID(targetZ, this.wrap, this.canonical.z, this.canonical.x, this.canonical.y); } else { return new OverscaledTileID(targetZ, this.wrap, targetZ, this.canonical.x >> zDifference, this.canonical.y >> zDifference); } }; OverscaledTileID.prototype.isChildOf = function isChildOf (parent ) { if (parent.wrap !== this.wrap) { // We can't be a child if we're in a different world copy return false; } var zDifference = this.canonical.z - parent.canonical.z; // We're first testing for z == 0, to avoid a 32 bit shift, which is undefined. return parent.overscaledZ === 0 || ( parent.overscaledZ < this.overscaledZ && parent.canonical.x === (this.canonical.x >> zDifference) && parent.canonical.y === (this.canonical.y >> zDifference)); }; OverscaledTileID.prototype.children = function children (sourceMaxZoom ) { if (this.overscaledZ >= sourceMaxZoom) { // return a single tile coord representing a an overscaled tile return [new OverscaledTileID(this.overscaledZ + 1, this.wrap, this.canonical.z, this.canonical.x, this.canonical.y)]; } var z = this.canonical.z + 1; var x = this.canonical.x * 2; var y = this.canonical.y * 2; return [ new OverscaledTileID(z, this.wrap, z, x, y), new OverscaledTileID(z, this.wrap, z, x + 1, y), new OverscaledTileID(z, this.wrap, z, x, y + 1), new OverscaledTileID(z, this.wrap, z, x + 1, y + 1) ]; }; OverscaledTileID.prototype.isLessThan = function isLessThan (rhs ) { if (this.wrap < rhs.wrap) { return true; } if (this.wrap > rhs.wrap) { return false; } if (this.overscaledZ < rhs.overscaledZ) { return true; } if (this.overscaledZ > rhs.overscaledZ) { return false; } if (this.canonical.x < rhs.canonical.x) { return true; } if (this.canonical.x > rhs.canonical.x) { return false; } if (this.canonical.y < rhs.canonical.y) { return true; } return false; }; OverscaledTileID.prototype.wrapped = function wrapped () { return new OverscaledTileID(this.overscaledZ, 0, this.canonical.z, this.canonical.x, this.canonical.y); }; OverscaledTileID.prototype.unwrapTo = function unwrapTo (wrap ) { return new OverscaledTileID(this.overscaledZ, wrap, this.canonical.z, this.canonical.x, this.canonical.y); }; OverscaledTileID.prototype.overscaleFactor = function overscaleFactor () { return Math.pow(2, this.overscaledZ - this.canonical.z); }; OverscaledTileID.prototype.toUnwrapped = function toUnwrapped () { return new UnwrappedTileID(this.wrap, this.canonical); }; OverscaledTileID.prototype.toString = function toString () { return ((this.overscaledZ) + "/" + (this.canonical.x) + "/" + (this.canonical.y)); }; OverscaledTileID.prototype.getTilePoint = function getTilePoint (coord ) { return this.canonical.getTilePoint(new MercatorCoordinate(coord.x - this.wrap, coord.y)); }; function calculateKey(wrap , z , x , y ) { wrap *= 2; if (wrap < 0) { wrap = wrap * -1 - 1; } var dim = 1 << z; return ((dim * dim * wrap + dim * y + x) * 32) + z; } function getQuadkey(z, x, y) { var quadkey = '', mask; for (var i = z; i > 0; i--) { mask = 1 << (i - 1); quadkey += ((x & mask ? 1 : 0) + (y & mask ? 2 : 0)); } return quadkey; } register('CanonicalTileID', CanonicalTileID); register('OverscaledTileID', OverscaledTileID, {omit: ['posMatrix']}); // // DEMData is a data structure for decoding, backfilling, and storing elevation data for processing in the hillshade shaders // data can be populated either from a pngraw image tile or from serliazed data sent back from a worker. When data is initially // loaded from a image tile, we decode the pixel values using the appropriate decoding formula, but we store the // elevation data as an Int32 value. we add 65536 (2^16) to eliminate negative values and enable the use of // integer overflow when creating the texture used in the hillshadePrepare step. // DEMData also handles the backfilling of data from a tile's neighboring tiles. This is necessary because we use a pixel's 8 // surrounding pixel values to compute the slope at that pixel, and we cannot accurately calculate the slope at pixels on a // tile's edge without backfilling from neighboring tiles. var DEMData = function DEMData(uid , data , encoding ) { this.uid = uid; if (data.height !== data.width) { throw new RangeError('DEM tiles must be square'); } if (encoding && encoding !== "mapbox" && encoding !== "terrarium") { return warnOnce( ("\"" + encoding + "\" is not a valid encoding type. Valid types include \"mapbox\" and \"terrarium\".") ); } var dim = this.dim = data.height; this.stride = this.dim + 2; this.data = new Int32Array(this.stride * this.stride); var pixels = data.data; var unpack = encoding === "terrarium" ? this._unpackTerrarium : this._unpackMapbox; for (var y = 0; y < dim; y++) { for (var x = 0; x < dim; x++) { var i = y * dim + x; var j = i * 4; this.set(x, y, unpack(pixels[j], pixels[j + 1], pixels[j + 2])); } } // in order to avoid flashing seams between tiles, here we are initially populating a 1px border of pixels around the image // with the data of the nearest pixel from the image. this data is eventually replaced when the tile's neighboring // tiles are loaded and the accurate data can be backfilled using DEMData#backfillBorder for (var x$1 = 0; x$1 < dim; x$1++) { // left vertical border this.set(-1, x$1, this.get(0, x$1)); // right vertical border this.set(dim, x$1, this.get(dim - 1, x$1)); // left horizontal border this.set(x$1, -1, this.get(x$1, 0)); // right horizontal border this.set(x$1, dim, this.get(x$1, dim - 1)); } // corners this.set(-1, -1, this.get(0, 0)); this.set(dim, -1, this.get(dim - 1, 0)); this.set(-1, dim, this.get(0, dim - 1)); this.set(dim, dim, this.get(dim - 1, dim - 1)); }; DEMData.prototype.set = function set (x , y , value ) { this.data[this._idx(x, y)] = value + 65536; }; DEMData.prototype.get = function get (x , y ) { return this.data[this._idx(x, y)] - 65536; }; DEMData.prototype._idx = function _idx (x , y ) { if (x < -1 || x >= this.dim + 1 || y < -1 || y >= this.dim + 1) { throw new RangeError('out of range source coordinates for DEM data'); } return (y + 1) * this.stride + (x + 1); }; DEMData.prototype._unpackMapbox = function _unpackMapbox (r , g , b ) { // unpacking formula for mapbox.terrain-rgb: // https://www.mapbox.com/help/access-elevation-data/#mapbox-terrain-rgb return ((r * 256 * 256 + g * 256.0 + b) / 10.0 - 10000.0); }; DEMData.prototype._unpackTerrarium = function _unpackTerrarium (r , g , b ) { // unpacking formula for mapzen terrarium: // https://aws.amazon.com/public-datasets/terrain/ return ((r * 256 + g + b / 256) - 32768.0); }; DEMData.prototype.getPixels = function getPixels () { return new RGBAImage({width: this.stride, height: this.stride}, new Uint8Array(this.data.buffer)); }; DEMData.prototype.backfillBorder = function backfillBorder (borderTile , dx , dy ) { if (this.dim !== borderTile.dim) { throw new Error('dem dimension mismatch'); } var xMin = dx * this.dim, xMax = dx * this.dim + this.dim, yMin = dy * this.dim, yMax = dy * this.dim + this.dim; switch (dx) { case -1: xMin = xMax - 1; break; case 1: xMax = xMin + 1; break; } switch (dy) { case -1: yMin = yMax - 1; break; case 1: yMax = yMin + 1; break; } var ox = -dx * this.dim; var oy = -dy * this.dim; for (var y = yMin; y < yMax; y++) { for (var x = xMin; x < xMax; x++) { this.set(x, y, borderTile.get(x + ox, y + oy)); } } }; register('DEMData', DEMData); // var rasterBoundsAttributes = createLayout([ { name: 'a_pos', type: 'Int16', components: 2 }, { name: 'a_texture_pos', type: 'Int16', components: 2 } ]); // /** * The `Bucket` interface is the single point of knowledge about turning vector * tiles into WebGL buffers. * * `Bucket` is an abstract interface. An implementation exists for each style layer type. * Create a bucket via the `StyleLayer#createBucket` method. * * The concrete bucket types, using layout options from the style layer, * transform feature geometries into vertex and index data for use by the * vertex shader. They also (via `ProgramConfiguration`) use feature * properties and the zoom level to populate the attributes needed for * data-driven styling. * * Buckets are designed to be built on a worker thread and then serialized and * transferred back to the main thread for rendering. On the worker side, a * bucket's vertex, index, and attribute data is stored in `bucket.arrays: * ArrayGroup`. When a bucket's data is serialized and sent back to the main * thread, is gets deserialized (using `new Bucket(serializedBucketData)`, with * the array data now stored in `bucket.buffers: BufferGroup`. BufferGroups * hold the same data as ArrayGroups, but are tuned for consumption by WebGL. * * @private */ function deserialize$1(input , style ) { var output = {}; // Guard against the case where the map's style has been set to null while // this bucket has been parsing. if (!style) { return output; } var loop = function () { var bucket = list$1[i$1]; var layers = bucket.layerIds .map(function (id) { return style.getLayer(id); }) .filter(Boolean); if (layers.length === 0) { return; } // look up StyleLayer objects from layer ids (since we don't // want to waste time serializing/copying them from the worker) (bucket ).layers = layers; if ((bucket ).stateDependentLayerIds) { (bucket ).stateDependentLayers = (bucket ).stateDependentLayerIds.map(function (lId) { return layers.filter(function (l) { return l.id === lId; })[0]; }); } for (var i = 0, list = layers; i < list.length; i += 1) { var layer = list[i]; output[layer.id] = bucket; } }; for (var i$1 = 0, list$1 = input; i$1 < list$1.length; i$1 += 1) loop(); return output; } // var DictionaryCoder = function DictionaryCoder(strings ) { this._stringToNumber = {}; this._numberToString = []; for (var i = 0; i < strings.length; i++) { var string = strings[i]; this._stringToNumber[string] = i; this._numberToString[i] = string; } }; DictionaryCoder.prototype.encode = function encode (string ) { assert_1(string in this._stringToNumber); return this._stringToNumber[string]; }; DictionaryCoder.prototype.decode = function decode (n ) { assert_1(n < this._numberToString.length); return this._numberToString[n]; }; // var Feature = function Feature(vectorTileFeature , z , x , y ) { this.type = 'Feature'; this._vectorTileFeature = vectorTileFeature; (vectorTileFeature )._z = z; (vectorTileFeature )._x = x; (vectorTileFeature )._y = y; this.properties = vectorTileFeature.properties; if (vectorTileFeature.id != null) { this.id = vectorTileFeature.id; } }; var prototypeAccessors$1 = { geometry: { configurable: true } }; prototypeAccessors$1.geometry.get = function () { if (this._geometry === undefined) { this._geometry = this._vectorTileFeature.toGeoJSON( (this._vectorTileFeature )._x, (this._vectorTileFeature )._y, (this._vectorTileFeature )._z).geometry; } return this._geometry; }; prototypeAccessors$1.geometry.set = function (g ) { this._geometry = g; }; Feature.prototype.toJSON = function toJSON () { var json = { geometry: this.geometry }; for (var i in this) { if (i === '_geometry' || i === '_vectorTileFeature') { continue; } json[i] = (this )[i]; } return json; }; Object.defineProperties( Feature.prototype, prototypeAccessors$1 ); // /** * SourceFeatureState manages the state and pending changes * to features in a source, separated by source layer. * stateChanges and deletedStates batch all changes to the tile (updates and removes, respectively) * between coalesce() events. addFeatureState() and removeFeatureState() also update their counterpart's * list of changes, such that coalesce() can apply the proper state changes while agnostic to the order of operations. * In deletedStates, all null's denote complete removal of state at that scope * @private */ var SourceFeatureState = function SourceFeatureState() { this.state = {}; this.stateChanges = {}; this.deletedStates = {}; }; SourceFeatureState.prototype.updateState = function updateState (sourceLayer , featureId , newState ) { var feature = String(featureId); this.stateChanges[sourceLayer] = this.stateChanges[sourceLayer] || {}; this.stateChanges[sourceLayer][feature] = this.stateChanges[sourceLayer][feature] || {}; extend(this.stateChanges[sourceLayer][feature], newState); if (this.deletedStates[sourceLayer] === null) { this.deletedStates[sourceLayer] = {}; for (var ft in this.state[sourceLayer]) { if (ft !== feature) { this.deletedStates[sourceLayer][ft] = null; } } } else { var featureDeletionQueued = this.deletedStates[sourceLayer] && this.deletedStates[sourceLayer][feature] === null; if (featureDeletionQueued) { this.deletedStates[sourceLayer][feature] = {}; for (var prop in this.state[sourceLayer][feature]) { if (!newState[prop]) { this.deletedStates[sourceLayer][feature][prop] = null; } } } else { for (var key in newState) { var deletionInQueue = this.deletedStates[sourceLayer] && this.deletedStates[sourceLayer][feature] && this.deletedStates[sourceLayer][feature][key] === null; if (deletionInQueue) { delete this.deletedStates[sourceLayer][feature][key]; } } } } }; SourceFeatureState.prototype.removeFeatureState = function removeFeatureState (sourceLayer , featureId , key ) { var sourceLayerDeleted = this.deletedStates[sourceLayer] === null; if (sourceLayerDeleted) { return; } var feature = String(featureId); this.deletedStates[sourceLayer] = this.deletedStates[sourceLayer] || {}; if (key && featureId) { if (this.deletedStates[sourceLayer][feature] !== null) { this.deletedStates[sourceLayer][feature] = this.deletedStates[sourceLayer][feature] || {}; this.deletedStates[sourceLayer][feature][key] = null; } } else if (featureId) { var updateInQueue = this.stateChanges[sourceLayer] && this.stateChanges[sourceLayer][feature]; if (updateInQueue) { this.deletedStates[sourceLayer][feature] = {}; for (key in this.stateChanges[sourceLayer][feature]) { this.deletedStates[sourceLayer][feature][key] = null; } } else { this.deletedStates[sourceLayer][feature] = null; } } else { this.deletedStates[sourceLayer] = null; } }; SourceFeatureState.prototype.getState = function getState (sourceLayer , featureId ) { var feature = String(featureId); var base = this.state[sourceLayer] || {}; var changes = this.stateChanges[sourceLayer] || {}; var reconciledState = extend({}, base[feature], changes[feature]); //return empty object if the whole source layer is awaiting deletion if (this.deletedStates[sourceLayer] === null) { return {}; } else if (this.deletedStates[sourceLayer]) { var featureDeletions = this.deletedStates[sourceLayer][featureId]; if (featureDeletions === null) { return {}; } for (var prop in featureDeletions) { delete reconciledState[prop]; } } return reconciledState; }; SourceFeatureState.prototype.initializeTileState = function initializeTileState (tile , painter ) { tile.setFeatureState(this.state, painter); }; SourceFeatureState.prototype.coalesceChanges = function coalesceChanges (tiles , painter ) { //track changes with full state objects, but only for features that got modified var featuresChanged = {}; for (var sourceLayer in this.stateChanges) { this.state[sourceLayer] = this.state[sourceLayer] || {}; var layerStates = {}; for (var feature in this.stateChanges[sourceLayer]) { if (!this.state[sourceLayer][feature]) { this.state[sourceLayer][feature] = {}; } extend(this.state[sourceLayer][feature], this.stateChanges[sourceLayer][feature]); layerStates[feature] = this.state[sourceLayer][feature]; } featuresChanged[sourceLayer] = layerStates; } for (var sourceLayer$1 in this.deletedStates) { this.state[sourceLayer$1] = this.state[sourceLayer$1] || {}; var layerStates$1 = {}; if (this.deletedStates[sourceLayer$1] === null) { for (var ft in this.state[sourceLayer$1]) { layerStates$1[ft] = {}; this.state[sourceLayer$1][ft] = {}; } } else { for (var feature$1 in this.deletedStates[sourceLayer$1]) { var deleteWholeFeatureState = this.deletedStates[sourceLayer$1][feature$1] === null; if (deleteWholeFeatureState) { this.state[sourceLayer$1][feature$1] = {}; } else { for (var i = 0, list = Object.keys(this.deletedStates[sourceLayer$1][feature$1]); i < list.length; i += 1) { var key = list[i]; delete this.state[sourceLayer$1][feature$1][key]; } } layerStates$1[feature$1] = this.state[sourceLayer$1][feature$1]; } } featuresChanged[sourceLayer$1] = featuresChanged[sourceLayer$1] || {}; extend(featuresChanged[sourceLayer$1], layerStates$1); } this.stateChanges = {}; this.deletedStates = {}; if (Object.keys(featuresChanged).length === 0) { return; } for (var id in tiles) { var tile = tiles[id]; tile.setFeatureState(featuresChanged, painter); } }; // var FeatureIndex = function FeatureIndex(tileID , grid , featureIndexArray ) { this.tileID = tileID; this.x = tileID.canonical.x; this.y = tileID.canonical.y; this.z = tileID.canonical.z; this.grid = grid || new gridIndex(EXTENT, 16, 0); this.grid3D = new gridIndex(EXTENT, 16, 0); this.featureIndexArray = featureIndexArray || new FeatureIndexArray(); }; FeatureIndex.prototype.insert = function insert (feature , geometry , featureIndex , sourceLayerIndex , bucketIndex , is3D ) { var key = this.featureIndexArray.length; this.featureIndexArray.emplaceBack(featureIndex, sourceLayerIndex, bucketIndex); var grid = is3D ? this.grid3D : this.grid; for (var r = 0; r < geometry.length; r++) { var ring = geometry[r]; var bbox = [Infinity, Infinity, -Infinity, -Infinity]; for (var i = 0; i < ring.length; i++) { var p = ring[i]; bbox[0] = Math.min(bbox[0], p.x); bbox[1] = Math.min(bbox[1], p.y); bbox[2] = Math.max(bbox[2], p.x); bbox[3] = Math.max(bbox[3], p.y); } if (bbox[0] < EXTENT && bbox[1] < EXTENT && bbox[2] >= 0 && bbox[3] >= 0) { grid.insert(key, bbox[0], bbox[1], bbox[2], bbox[3]); } } }; FeatureIndex.prototype.loadVTLayers = function loadVTLayers () { if (!this.vtLayers) { this.vtLayers = new vectorTile.VectorTile(new pbf(this.rawTileData)).layers; this.sourceLayerCoder = new DictionaryCoder(this.vtLayers ? Object.keys(this.vtLayers).sort() : ['_geojsonTileLayer']); } return this.vtLayers; }; // Finds non-symbol features in this tile at a particular position. FeatureIndex.prototype.query = function query (args , styleLayers , sourceFeatureState ) { var this$1 = this; this.loadVTLayers(); var params = args.params || {}, pixelsToTileUnits = EXTENT / args.tileSize / args.scale, filter = createFilter(params.filter); var queryGeometry = args.queryGeometry; var queryPadding = args.queryPadding * pixelsToTileUnits; var bounds = getBounds(queryGeometry); var matching = this.grid.query(bounds.minX - queryPadding, bounds.minY - queryPadding, bounds.maxX + queryPadding, bounds.maxY + queryPadding); var cameraBounds = getBounds(args.cameraQueryGeometry); var matching3D = this.grid3D.query( cameraBounds.minX - queryPadding, cameraBounds.minY - queryPadding, cameraBounds.maxX + queryPadding, cameraBounds.maxY + queryPadding, function (bx1, by1, bx2, by2) { return polygonIntersectsBox(args.cameraQueryGeometry, bx1 - queryPadding, by1 - queryPadding, bx2 + queryPadding, by2 + queryPadding); }); for (var i = 0, list = matching3D; i < list.length; i += 1) { var key = list[i]; matching.push(key); } matching.sort(topDownFeatureComparator); var result = {}; var previousIndex; var loop = function ( k ) { var index = matching[k]; // don't check the same feature more than once if (index === previousIndex) { return; } previousIndex = index; var match = this$1.featureIndexArray.get(index); var featureGeometry = null; this$1.loadMatchingFeature( result, match.bucketIndex, match.sourceLayerIndex, match.featureIndex, filter, params.layers, styleLayers, function (feature , styleLayer ) { if (!featureGeometry) { featureGeometry = loadGeometry(feature); } var featureState = {}; if (feature.id) { // `feature-state` expression evaluation requires feature state to be available featureState = sourceFeatureState.getState(styleLayer.sourceLayer || '_geojsonTileLayer', feature.id); } return styleLayer.queryIntersectsFeature(queryGeometry, feature, featureState, featureGeometry, this$1.z, args.transform, pixelsToTileUnits, args.pixelPosMatrix); } ); }; for (var k = 0; k < matching.length; k++) loop( k ); return result; }; FeatureIndex.prototype.loadMatchingFeature = function loadMatchingFeature ( result , bucketIndex , sourceLayerIndex , featureIndex , filter , filterLayerIDs , styleLayers , intersectionTest ) { var layerIDs = this.bucketLayerIDs[bucketIndex]; if (filterLayerIDs && !arraysIntersect(filterLayerIDs, layerIDs)) { return; } var sourceLayerName = this.sourceLayerCoder.decode(sourceLayerIndex); var sourceLayer = this.vtLayers[sourceLayerName]; var feature = sourceLayer.feature(featureIndex); if (!filter(new EvaluationParameters(this.tileID.overscaledZ), feature)) { return; } for (var l = 0; l < layerIDs.length; l++) { var layerID = layerIDs[l]; if (filterLayerIDs && filterLayerIDs.indexOf(layerID) < 0) { continue; } var styleLayer = styleLayers[layerID]; if (!styleLayer) { continue; } var intersectionZ = !intersectionTest || intersectionTest(feature, styleLayer); if (!intersectionZ) { // Only applied for non-symbol features continue; } var geojsonFeature = new Feature(feature, this.z, this.x, this.y); (geojsonFeature ).layer = styleLayer.serialize(); var layerResult = result[layerID]; if (layerResult === undefined) { layerResult = result[layerID] = []; } layerResult.push({ featureIndex: featureIndex, feature: geojsonFeature, intersectionZ: intersectionZ }); } }; // Given a set of symbol indexes that have already been looked up, // return a matching set of GeoJSONFeatures FeatureIndex.prototype.lookupSymbolFeatures = function lookupSymbolFeatures (symbolFeatureIndexes , bucketIndex , sourceLayerIndex , filterSpec , filterLayerIDs , styleLayers ) { var result = {}; this.loadVTLayers(); var filter = createFilter(filterSpec); for (var i = 0, list = symbolFeatureIndexes; i < list.length; i += 1) { var symbolFeatureIndex = list[i]; this.loadMatchingFeature( result, bucketIndex, sourceLayerIndex, symbolFeatureIndex, filter, filterLayerIDs, styleLayers ); } return result; }; FeatureIndex.prototype.hasLayer = function hasLayer (id ) { for (var i$1 = 0, list$1 = this.bucketLayerIDs; i$1 < list$1.length; i$1 += 1) { var layerIDs = list$1[i$1]; for (var i = 0, list = layerIDs; i < list.length; i += 1) { var layerID = list[i]; if (id === layerID) { return true; } } } return false; }; register( 'FeatureIndex', FeatureIndex, { omit: ['rawTileData', 'sourceLayerCoder'] } ); function getBounds(geometry ) { var minX = Infinity; var minY = Infinity; var maxX = -Infinity; var maxY = -Infinity; for (var i = 0, list = geometry; i < list.length; i += 1) { var p = list[i]; minX = Math.min(minX, p.x); minY = Math.min(minY, p.y); maxX = Math.max(maxX, p.x); maxY = Math.max(maxY, p.y); } return { minX: minX, minY: minY, maxX: maxX, maxY: maxY }; } function topDownFeatureComparator(a, b) { return b - a; } // var CLOCK_SKEW_RETRY_TIMEOUT = 30000; /* Tile data was previously loaded, but has expired per its * HTTP headers and is in the process of refreshing. */ /** * A tile object is the combination of a Coordinate, which defines * its place, as well as a unique ID and data tracking for its content * * @private */ var Tile = function Tile(tileID , size ) { this.tileID = tileID; this.uid = uniqueId(); this.uses = 0; this.tileSize = size; this.buckets = {}; this.expirationTime = null; this.queryPadding = 0; this.hasSymbolBuckets = false; // Counts the number of times a response was already expired when // received. We're using this to add a delay when making a new request // so we don't have to keep retrying immediately in case of a server // serving expired tiles. this.expiredRequestCount = 0; this.state = 'loading'; }; Tile.prototype.registerFadeDuration = function registerFadeDuration (duration ) { var fadeEndTime = duration + this.timeAdded; if (fadeEndTime < exported.now()) { return; } if (this.fadeEndTime && fadeEndTime < this.fadeEndTime) { return; } this.fadeEndTime = fadeEndTime; }; Tile.prototype.wasRequested = function wasRequested () { return this.state === 'errored' || this.state === 'loaded' || this.state === 'reloading'; }; /** * Given a data object with a 'buffers' property, load it into * this tile's elementGroups and buffers properties and set loaded * to true. If the data is null, like in the case of an empty * GeoJSON tile, no-op but still set loaded to true. * @param {Object} data * @param painter * @returns {undefined} * @private */ Tile.prototype.loadVectorData = function loadVectorData (data , painter , justReloaded ) { if (this.hasData()) { this.unloadVectorData(); } this.state = 'loaded'; // empty GeoJSON tile if (!data) { this.collisionBoxArray = new CollisionBoxArray(); return; } if (data.featureIndex) { this.latestFeatureIndex = data.featureIndex; if (data.rawTileData) { // Only vector tiles have rawTileData, and they won't update it for // 'reloadTile' this.latestRawTileData = data.rawTileData; this.latestFeatureIndex.rawTileData = data.rawTileData; } else if (this.latestRawTileData) { // If rawTileData hasn't updated, hold onto a pointer to the last // one we received this.latestFeatureIndex.rawTileData = this.latestRawTileData; } } this.collisionBoxArray = data.collisionBoxArray; this.buckets = deserialize$1(data.buckets, painter.style); this.hasSymbolBuckets = false; for (var id in this.buckets) { var bucket = this.buckets[id]; if (bucket instanceof SymbolBucket) { this.hasSymbolBuckets = true; if (justReloaded) { bucket.justReloaded = true; } else { break; } } } this.queryPadding = 0; for (var id$1 in this.buckets) { var bucket$1 = this.buckets[id$1]; this.queryPadding = Math.max(this.queryPadding, painter.style.getLayer(id$1).queryRadius(bucket$1)); } if (data.imageAtlas) { this.imageAtlas = data.imageAtlas; } if (data.glyphAtlasImage) { this.glyphAtlasImage = data.glyphAtlasImage; } }; /** * Release any data or WebGL resources referenced by this tile. * @returns {undefined} * @private */ Tile.prototype.unloadVectorData = function unloadVectorData () { for (var id in this.buckets) { this.buckets[id].destroy(); } this.buckets = {}; if (this.imageAtlasTexture) { this.imageAtlasTexture.destroy(); } if (this.imageAtlas) { this.imageAtlas = null; } if (this.glyphAtlasTexture) { this.glyphAtlasTexture.destroy(); } this.latestFeatureIndex = null; this.state = 'unloaded'; }; Tile.prototype.unloadDEMData = function unloadDEMData () { this.dem = null; this.neighboringTiles = null; this.state = 'unloaded'; }; Tile.prototype.getBucket = function getBucket (layer ) { return this.buckets[layer.id]; }; Tile.prototype.upload = function upload (context ) { for (var id in this.buckets) { var bucket = this.buckets[id]; if (bucket.uploadPending()) { bucket.upload(context); } } var gl = context.gl; if (this.imageAtlas && !this.imageAtlas.uploaded) { this.imageAtlasTexture = new Texture(context, this.imageAtlas.image, gl.RGBA); this.imageAtlas.uploaded = true; } if (this.glyphAtlasImage) { this.glyphAtlasTexture = new Texture(context, this.glyphAtlasImage, gl.ALPHA); this.glyphAtlasImage = null; } }; Tile.prototype.prepare = function prepare (imageManager ) { if (this.imageAtlas) { this.imageAtlas.patchUpdatedImages(imageManager, this.imageAtlasTexture); } }; // Queries non-symbol features rendered for this tile. // Symbol features are queried globally Tile.prototype.queryRenderedFeatures = function queryRenderedFeatures (layers , sourceFeatureState , queryGeometry , cameraQueryGeometry , scale , params , transform , maxPitchScaleFactor , pixelPosMatrix ) { if (!this.latestFeatureIndex || !this.latestFeatureIndex.rawTileData) { return {}; } return this.latestFeatureIndex.query({ queryGeometry: queryGeometry, cameraQueryGeometry: cameraQueryGeometry, scale: scale, tileSize: this.tileSize, pixelPosMatrix: pixelPosMatrix, transform: transform, params: params, queryPadding: this.queryPadding * maxPitchScaleFactor }, layers, sourceFeatureState); }; Tile.prototype.querySourceFeatures = function querySourceFeatures (result , params ) { if (!this.latestFeatureIndex || !this.latestFeatureIndex.rawTileData) { return; } var vtLayers = this.latestFeatureIndex.loadVTLayers(); var sourceLayer = params ? params.sourceLayer : ''; var layer = vtLayers._geojsonTileLayer || vtLayers[sourceLayer]; if (!layer) { return; } var filter = createFilter(params && params.filter); var ref = this.tileID.canonical; var z = ref.z; var x = ref.x; var y = ref.y; var coord = {z: z, x: x, y: y}; for (var i = 0; i < layer.length; i++) { var feature = layer.feature(i); if (filter(new EvaluationParameters(this.tileID.overscaledZ), feature)) { var geojsonFeature = new Feature(feature, z, x, y); (geojsonFeature ).tile = coord; result.push(geojsonFeature); } } }; Tile.prototype.clearMask = function clearMask () { if (this.segments) { this.segments.destroy(); delete this.segments; } if (this.maskedBoundsBuffer) { this.maskedBoundsBuffer.destroy(); delete this.maskedBoundsBuffer; } if (this.maskedIndexBuffer) { this.maskedIndexBuffer.destroy(); delete this.maskedIndexBuffer; } }; Tile.prototype.setMask = function setMask (mask , context ) { // don't redo buffer work if the mask is the same; if (deepEqual(this.mask, mask)) { return; } this.mask = mask; this.clearMask(); // We want to render the full tile, and keeping the segments/vertices/indices empty means // using the global shared buffers for covering the entire tile. if (deepEqual(mask, {'0': true})) { return; } var maskedBoundsArray = new StructArrayLayout4i8(); var indexArray = new StructArrayLayout3ui6(); this.segments = new SegmentVector(); // Create a new segment so that we will upload (empty) buffers even when there is nothing to // draw for this tile. this.segments.prepareSegment(0, maskedBoundsArray, indexArray); var maskArray = Object.keys(mask); for (var i = 0; i < maskArray.length; i++) { var maskCoord = mask[maskArray[i]]; var vertexExtent = EXTENT >> maskCoord.z; var tlVertex = new pointGeometry(maskCoord.x * vertexExtent, maskCoord.y * vertexExtent); var brVertex = new pointGeometry(tlVertex.x + vertexExtent, tlVertex.y + vertexExtent); // not sure why flow is complaining here because it doesn't complain at L401 var segment = (this.segments ).prepareSegment(4, maskedBoundsArray, indexArray); maskedBoundsArray.emplaceBack(tlVertex.x, tlVertex.y, tlVertex.x, tlVertex.y); maskedBoundsArray.emplaceBack(brVertex.x, tlVertex.y, brVertex.x, tlVertex.y); maskedBoundsArray.emplaceBack(tlVertex.x, brVertex.y, tlVertex.x, brVertex.y); maskedBoundsArray.emplaceBack(brVertex.x, brVertex.y, brVertex.x, brVertex.y); var offset = segment.vertexLength; // 0, 1, 2 // 1, 2, 3 indexArray.emplaceBack(offset, offset + 1, offset + 2); indexArray.emplaceBack(offset + 1, offset + 2, offset + 3); segment.vertexLength += 4; segment.primitiveLength += 2; } this.maskedBoundsBuffer = context.createVertexBuffer(maskedBoundsArray, rasterBoundsAttributes.members); this.maskedIndexBuffer = context.createIndexBuffer(indexArray); }; Tile.prototype.hasData = function hasData () { return this.state === 'loaded' || this.state === 'reloading' || this.state === 'expired'; }; Tile.prototype.patternsLoaded = function patternsLoaded () { return this.imageAtlas && !!Object.keys(this.imageAtlas.patternPositions).length; }; Tile.prototype.setExpiryData = function setExpiryData (data ) { var prior = this.expirationTime; if (data.cacheControl) { var parsedCC = parseCacheControl(data.cacheControl); if (parsedCC['max-age']) { this.expirationTime = Date.now() + parsedCC['max-age'] * 1000; } } else if (data.expires) { this.expirationTime = new Date(data.expires).getTime(); } if (this.expirationTime) { var now = Date.now(); var isExpired = false; if (this.expirationTime > now) { isExpired = false; } else if (!prior) { isExpired = true; } else if (this.expirationTime < prior) { // Expiring date is going backwards: // fall back to exponential backoff isExpired = true; } else { var delta = this.expirationTime - prior; if (!delta) { // Server is serving the same expired resource over and over: fall // back to exponential backoff. isExpired = true; } else { // Assume that either the client or the server clock is wrong and // try to interpolate a valid expiration date (from the client POV) // observing a minimum timeout. this.expirationTime = now + Math.max(delta, CLOCK_SKEW_RETRY_TIMEOUT); } } if (isExpired) { this.expiredRequestCount++; this.state = 'expired'; } else { this.expiredRequestCount = 0; } } }; Tile.prototype.getExpiryTimeout = function getExpiryTimeout () { if (this.expirationTime) { if (this.expiredRequestCount) { return 1000 * (1 << Math.min(this.expiredRequestCount - 1, 31)); } else { // Max value for `setTimeout` implementations is a 32 bit integer; cap this accordingly return Math.min(this.expirationTime - new Date().getTime(), Math.pow(2, 31) - 1); } } }; Tile.prototype.setFeatureState = function setFeatureState (states , painter ) { if (!this.latestFeatureIndex || !this.latestFeatureIndex.rawTileData || Object.keys(states).length === 0) { return; } var vtLayers = this.latestFeatureIndex.loadVTLayers(); for (var id in this.buckets) { var bucket = this.buckets[id]; // Buckets are grouped by common source-layer var sourceLayerId = bucket.layers[0]['sourceLayer'] || '_geojsonTileLayer'; var sourceLayer = vtLayers[sourceLayerId]; var sourceLayerStates = states[sourceLayerId]; if (!sourceLayer || !sourceLayerStates || Object.keys(sourceLayerStates).length === 0) { continue; } bucket.update(sourceLayerStates, sourceLayer, this.imageAtlas && this.imageAtlas.patternPositions || {}); if (painter && painter.style) { this.queryPadding = Math.max(this.queryPadding, painter.style.getLayer(id).queryRadius(bucket)); } } }; Tile.prototype.holdingForFade = function holdingForFade () { return this.symbolFadeHoldUntil !== undefined; }; Tile.prototype.symbolFadeFinished = function symbolFadeFinished () { return !this.symbolFadeHoldUntil || this.symbolFadeHoldUntil < exported.now(); }; Tile.prototype.clearFadeHold = function clearFadeHold () { this.symbolFadeHoldUntil = undefined; }; Tile.prototype.setHoldDuration = function setHoldDuration (duration ) { this.symbolFadeHoldUntil = exported.now() + duration; }; var refProperties = ['type', 'source', 'source-layer', 'minzoom', 'maxzoom', 'filter', 'layout']; // // ONE_EM constant used to go between "em" units used in style spec and "points" used internally for layout var ONE_EM = 24; // var WritingMode = { horizontal: 1, vertical: 2, horizontalOnly: 3 }; // The position of a glyph relative to the text's anchor point. // A collection of positioned glyphs and some metadata var TaggedString = function TaggedString() { this.text = ""; this.sectionIndex = []; this.sections = []; }; TaggedString.fromFeature = function fromFeature (text , defaultFontStack ) { var result = new TaggedString(); for (var i = 0; i < text.sections.length; i++) { var section = text.sections[i]; result.sections.push({ scale: section.scale || 1, fontStack: section.fontStack || defaultFontStack }); result.text += section.text; for (var j = 0; j < section.text.length; j++) { result.sectionIndex.push(i); } } return result; }; TaggedString.prototype.length = function length () { return this.text.length; }; TaggedString.prototype.getSection = function getSection (index ) { return this.sections[this.sectionIndex[index]]; }; TaggedString.prototype.getCharCode = function getCharCode (index ) { return this.text.charCodeAt(index); }; TaggedString.prototype.verticalizePunctuation = function verticalizePunctuation$1 () { this.text = verticalizePunctuation(this.text); }; TaggedString.prototype.trim = function trim () { var beginningWhitespace = 0; for (var i = 0; i < this.text.length && whitespace[this.text.charCodeAt(i)]; i++) { beginningWhitespace++; } var trailingWhitespace = this.text.length; for (var i$1 = this.text.length - 1; i$1 >= 0 && i$1 >= beginningWhitespace && whitespace[this.text.charCodeAt(i$1)]; i$1--) { trailingWhitespace--; } this.text = this.text.substring(beginningWhitespace, trailingWhitespace); this.sectionIndex = this.sectionIndex.slice(beginningWhitespace, trailingWhitespace); }; TaggedString.prototype.substring = function substring (start , end ) { var substring = new TaggedString(); substring.text = this.text.substring(start, end); substring.sectionIndex = this.sectionIndex.slice(start, end); substring.sections = this.sections; return substring; }; TaggedString.prototype.toString = function toString () { return this.text; }; TaggedString.prototype.getMaxScale = function getMaxScale () { var this$1 = this; return this.sectionIndex.reduce(function (max, index) { return Math.max(max, this$1.sections[index].scale); }, 0); }; function breakLines(input , lineBreakPoints ) { var lines = []; var text = input.text; var start = 0; for (var i = 0, list = lineBreakPoints; i < list.length; i += 1) { var lineBreak = list[i]; lines.push(input.substring(start, lineBreak)); start = lineBreak; } if (start < text.length) { lines.push(input.substring(start, text.length)); } return lines; } function shapeText(text , glyphs , defaultFontStack , maxWidth , lineHeight , textAnchor , textJustify , spacing , translate , writingMode ) { var logicalInput = TaggedString.fromFeature(text, defaultFontStack); if (writingMode === WritingMode.vertical) { logicalInput.verticalizePunctuation(); } var lines ; var processBidirectionalText = plugin.processBidirectionalText; var processStyledBidirectionalText = plugin.processStyledBidirectionalText; if (processBidirectionalText && logicalInput.sections.length === 1) { // Bidi doesn't have to be style-aware lines = []; var untaggedLines = processBidirectionalText(logicalInput.toString(), determineLineBreaks(logicalInput, spacing, maxWidth, glyphs)); for (var i$1 = 0, list = untaggedLines; i$1 < list.length; i$1 += 1) { var line = list[i$1]; var taggedLine = new TaggedString(); taggedLine.text = line; taggedLine.sections = logicalInput.sections; for (var i = 0; i < line.length; i++) { taggedLine.sectionIndex.push(0); } lines.push(taggedLine); } } else if (processStyledBidirectionalText) { // Need version of mapbox-gl-rtl-text with style support for combining RTL text // with formatting lines = []; var processedLines = processStyledBidirectionalText(logicalInput.text, logicalInput.sectionIndex, determineLineBreaks(logicalInput, spacing, maxWidth, glyphs)); for (var i$2 = 0, list$1 = processedLines; i$2 < list$1.length; i$2 += 1) { var line$1 = list$1[i$2]; var taggedLine$1 = new TaggedString(); taggedLine$1.text = line$1[0]; taggedLine$1.sectionIndex = line$1[1]; taggedLine$1.sections = logicalInput.sections; lines.push(taggedLine$1); } } else { lines = breakLines(logicalInput, determineLineBreaks(logicalInput, spacing, maxWidth, glyphs)); } var positionedGlyphs = []; var shaping = { positionedGlyphs: positionedGlyphs, text: logicalInput.toString(), top: translate[1], bottom: translate[1], left: translate[0], right: translate[0], writingMode: writingMode, lineCount: lines.length }; shapeLines(shaping, glyphs, lines, lineHeight, textAnchor, textJustify, writingMode, spacing); if (!positionedGlyphs.length) { return false; } return shaping; } // using computed properties due to https://github.com/facebook/flow/issues/380 /* eslint no-useless-computed-key: 0 */ var whitespace = {}; whitespace[0x09] = true; whitespace[0x0a] = true; whitespace[0x0b] = true; whitespace[0x0c] = true; whitespace[0x0d] = true; whitespace[0x20] = true; var breakable = {}; breakable[0x0a] = true; breakable[0x20] = true; breakable[0x26] = true; breakable[0x28] = true; breakable[0x29] = true; breakable[0x2b] = true; breakable[0x2d] = true; breakable[0x2f] = true; breakable[0xad] = true; breakable[0xb7] = true; breakable[0x200b] = true; breakable[0x2010] = true; breakable[0x2013] = true; breakable[0x2027] = true; function determineAverageLineWidth(logicalInput , spacing , maxWidth , glyphMap ) { var totalWidth = 0; for (var index = 0; index < logicalInput.length(); index++) { var section = logicalInput.getSection(index); var positions = glyphMap[section.fontStack]; var glyph = positions && positions[logicalInput.getCharCode(index)]; if (!glyph) { continue; } totalWidth += glyph.metrics.advance * section.scale + spacing; } var lineCount = Math.max(1, Math.ceil(totalWidth / maxWidth)); return totalWidth / lineCount; } function calculateBadness(lineWidth , targetWidth , penalty , isLastBreak ) { var raggedness = Math.pow(lineWidth - targetWidth, 2); if (isLastBreak) { // Favor finals lines shorter than average over longer than average if (lineWidth < targetWidth) { return raggedness / 2; } else { return raggedness * 2; } } return raggedness + Math.abs(penalty) * penalty; } function calculatePenalty(codePoint , nextCodePoint ) { var penalty = 0; // Force break on newline if (codePoint === 0x0a) { penalty -= 10000; } // Penalize open parenthesis at end of line if (codePoint === 0x28 || codePoint === 0xff08) { penalty += 50; } // Penalize close parenthesis at beginning of line if (nextCodePoint === 0x29 || nextCodePoint === 0xff09) { penalty += 50; } return penalty; } function evaluateBreak(breakIndex , breakX , targetWidth , potentialBreaks , penalty , isLastBreak ) { // We could skip evaluating breaks where the line length (breakX - priorBreak.x) > maxWidth // ...but in fact we allow lines longer than maxWidth (if there's no break points) // ...and when targetWidth and maxWidth are close, strictly enforcing maxWidth can give // more lopsided results. var bestPriorBreak = null; var bestBreakBadness = calculateBadness(breakX, targetWidth, penalty, isLastBreak); for (var i = 0, list = potentialBreaks; i < list.length; i += 1) { var potentialBreak = list[i]; var lineWidth = breakX - potentialBreak.x; var breakBadness = calculateBadness(lineWidth, targetWidth, penalty, isLastBreak) + potentialBreak.badness; if (breakBadness <= bestBreakBadness) { bestPriorBreak = potentialBreak; bestBreakBadness = breakBadness; } } return { index: breakIndex, x: breakX, priorBreak: bestPriorBreak, badness: bestBreakBadness }; } function leastBadBreaks(lastLineBreak ) { if (!lastLineBreak) { return []; } return leastBadBreaks(lastLineBreak.priorBreak).concat(lastLineBreak.index); } function determineLineBreaks(logicalInput , spacing , maxWidth , glyphMap ) { if (!maxWidth) { return []; } if (!logicalInput) { return []; } var potentialLineBreaks = []; var targetWidth = determineAverageLineWidth(logicalInput, spacing, maxWidth, glyphMap); var currentX = 0; for (var i = 0; i < logicalInput.length(); i++) { var section = logicalInput.getSection(i); var codePoint = logicalInput.getCharCode(i); var positions = glyphMap[section.fontStack]; var glyph = positions && positions[codePoint]; if (glyph && !whitespace[codePoint]) { currentX += glyph.metrics.advance * section.scale + spacing; } // Ideographic characters, spaces, and word-breaking punctuation that often appear without // surrounding spaces. if ((i < logicalInput.length() - 1) && (breakable[codePoint] || charAllowsIdeographicBreaking(codePoint))) { potentialLineBreaks.push( evaluateBreak( i + 1, currentX, targetWidth, potentialLineBreaks, calculatePenalty(codePoint, logicalInput.getCharCode(i + 1)), false)); } } return leastBadBreaks( evaluateBreak( logicalInput.length(), currentX, targetWidth, potentialLineBreaks, 0, true)); } function getAnchorAlignment(anchor ) { var horizontalAlign = 0.5, verticalAlign = 0.5; switch (anchor) { case 'right': case 'top-right': case 'bottom-right': horizontalAlign = 1; break; case 'left': case 'top-left': case 'bottom-left': horizontalAlign = 0; break; } switch (anchor) { case 'bottom': case 'bottom-right': case 'bottom-left': verticalAlign = 1; break; case 'top': case 'top-right': case 'top-left': verticalAlign = 0; break; } return { horizontalAlign: horizontalAlign, verticalAlign: verticalAlign }; } function shapeLines(shaping , glyphMap , lines , lineHeight , textAnchor , textJustify , writingMode , spacing ) { // the y offset *should* be part of the font metadata var yOffset = -17; var x = 0; var y = yOffset; var maxLineLength = 0; var positionedGlyphs = shaping.positionedGlyphs; var justify = textJustify === 'right' ? 1 : textJustify === 'left' ? 0 : 0.5; for (var i$1 = 0, list = lines; i$1 < list.length; i$1 += 1) { var line = list[i$1]; line.trim(); var lineMaxScale = line.getMaxScale(); if (!line.length()) { y += lineHeight; // Still need a line feed after empty line continue; } var lineStartIndex = positionedGlyphs.length; for (var i = 0; i < line.length(); i++) { var section = line.getSection(i); var codePoint = line.getCharCode(i); // We don't know the baseline, but since we're laying out // at 24 points, we can calculate how much it will move when // we scale up or down. var baselineOffset = (lineMaxScale - section.scale) * 24; var positions = glyphMap[section.fontStack]; var glyph = positions && positions[codePoint]; if (!glyph) { continue; } if (!charHasUprightVerticalOrientation(codePoint) || writingMode === WritingMode.horizontal) { positionedGlyphs.push({glyph: codePoint, x: x, y: y + baselineOffset, vertical: false, scale: section.scale, fontStack: section.fontStack}); x += glyph.metrics.advance * section.scale + spacing; } else { positionedGlyphs.push({glyph: codePoint, x: x, y: baselineOffset, vertical: true, scale: section.scale, fontStack: section.fontStack}); x += ONE_EM * section.scale + spacing; } } // Only justify if we placed at least one glyph if (positionedGlyphs.length !== lineStartIndex) { var lineLength = x - spacing; maxLineLength = Math.max(lineLength, maxLineLength); justifyLine(positionedGlyphs, glyphMap, lineStartIndex, positionedGlyphs.length - 1, justify); } x = 0; y += lineHeight * lineMaxScale; } var ref = getAnchorAlignment(textAnchor); var horizontalAlign = ref.horizontalAlign; var verticalAlign = ref.verticalAlign; align$1(positionedGlyphs, justify, horizontalAlign, verticalAlign, maxLineLength, lineHeight, lines.length); // Calculate the bounding box var height = y - yOffset; shaping.top += -verticalAlign * height; shaping.bottom = shaping.top + height; shaping.left += -horizontalAlign * maxLineLength; shaping.right = shaping.left + maxLineLength; } // justify right = 1, left = 0, center = 0.5 function justifyLine(positionedGlyphs , glyphMap , start , end , justify ) { if (!justify) { return; } var lastPositionedGlyph = positionedGlyphs[end]; var positions = glyphMap[lastPositionedGlyph.fontStack]; var glyph = positions && positions[lastPositionedGlyph.glyph]; if (glyph) { var lastAdvance = glyph.metrics.advance * lastPositionedGlyph.scale; var lineIndent = (positionedGlyphs[end].x + lastAdvance) * justify; for (var j = start; j <= end; j++) { positionedGlyphs[j].x -= lineIndent; } } } function align$1(positionedGlyphs , justify , horizontalAlign , verticalAlign , maxLineLength , lineHeight , lineCount ) { var shiftX = (justify - horizontalAlign) * maxLineLength; var shiftY = (-verticalAlign * lineCount + 0.5) * lineHeight; for (var j = 0; j < positionedGlyphs.length; j++) { positionedGlyphs[j].x += shiftX; positionedGlyphs[j].y += shiftY; } } function shapeIcon(image , iconOffset , iconAnchor ) { var ref = getAnchorAlignment(iconAnchor); var horizontalAlign = ref.horizontalAlign; var verticalAlign = ref.verticalAlign; var dx = iconOffset[0]; var dy = iconOffset[1]; var x1 = dx - image.displaySize[0] * horizontalAlign; var x2 = x1 + image.displaySize[0]; var y1 = dy - image.displaySize[1] * verticalAlign; var y2 = y1 + image.displaySize[1]; return {image: image, top: y1, bottom: y2, left: x1, right: x2}; } // /** * Labels placed around really sharp angles aren't readable. Check if any * part of the potential label has a combined angle that is too big. * * @param line * @param anchor The point on the line around which the label is anchored. * @param labelLength The length of the label in geometry units. * @param windowSize The check fails if the combined angles within a part of the line that is `windowSize` long is too big. * @param maxAngle The maximum combined angle that any window along the label is allowed to have. * * @returns {boolean} whether the label should be placed * @private */ function checkMaxAngle(line , anchor , labelLength , windowSize , maxAngle ) { // horizontal labels always pass if (anchor.segment === undefined) { return true; } var p = anchor; var index = anchor.segment + 1; var anchorDistance = 0; // move backwards along the line to the first segment the label appears on while (anchorDistance > -labelLength / 2) { index--; // there isn't enough room for the label after the beginning of the line if (index < 0) { return false; } anchorDistance -= line[index].dist(p); p = line[index]; } anchorDistance += line[index].dist(line[index + 1]); index++; // store recent corners and their total angle difference var recentCorners = []; var recentAngleDelta = 0; // move forwards by the length of the label and check angles along the way while (anchorDistance < labelLength / 2) { var prev = line[index - 1]; var current = line[index]; var next = line[index + 1]; // there isn't enough room for the label before the end of the line if (!next) { return false; } var angleDelta = prev.angleTo(current) - current.angleTo(next); // restrict angle to -pi..pi range angleDelta = Math.abs(((angleDelta + 3 * Math.PI) % (Math.PI * 2)) - Math.PI); recentCorners.push({ distance: anchorDistance, angleDelta: angleDelta }); recentAngleDelta += angleDelta; // remove corners that are far enough away from the list of recent anchors while (anchorDistance - recentCorners[0].distance > windowSize) { recentAngleDelta -= recentCorners.shift().angleDelta; } // the sum of angles within the window area exceeds the maximum allowed value. check fails. if (recentAngleDelta > maxAngle) { return false; } index++; anchorDistance += current.dist(next); } // no part of the line had an angle greater than the maximum allowed. check passes. return true; } // function getLineLength(line ) { var lineLength = 0; for (var k = 0; k < line.length - 1; k++) { lineLength += line[k].dist(line[k + 1]); } return lineLength; } function getAngleWindowSize(shapedText , glyphSize , boxScale ) { return shapedText ? 3 / 5 * glyphSize * boxScale : 0; } function getShapedLabelLength(shapedText , shapedIcon ) { return Math.max( shapedText ? shapedText.right - shapedText.left : 0, shapedIcon ? shapedIcon.right - shapedIcon.left : 0); } function getCenterAnchor(line , maxAngle , shapedText , shapedIcon , glyphSize , boxScale ) { var angleWindowSize = getAngleWindowSize(shapedText, glyphSize, boxScale); var labelLength = getShapedLabelLength(shapedText, shapedIcon) * boxScale; var prevDistance = 0; var centerDistance = getLineLength(line) / 2; for (var i = 0; i < line.length - 1; i++) { var a = line[i], b = line[i + 1]; var segmentDistance = a.dist(b); if (prevDistance + segmentDistance > centerDistance) { // The center is on this segment var t = (centerDistance - prevDistance) / segmentDistance, x = number(a.x, b.x, t), y = number(a.y, b.y, t); var anchor = new Anchor(x, y, b.angleTo(a), i); anchor._round(); if (!angleWindowSize || checkMaxAngle(line, anchor, labelLength, angleWindowSize, maxAngle)) { return anchor; } else { return; } } prevDistance += segmentDistance; } } function getAnchors(line , spacing , maxAngle , shapedText , shapedIcon , glyphSize , boxScale , overscaling , tileExtent ) { // Resample a line to get anchor points for labels and check that each // potential label passes text-max-angle check and has enough froom to fit // on the line. var angleWindowSize = getAngleWindowSize(shapedText, glyphSize, boxScale); var shapedLabelLength = getShapedLabelLength(shapedText, shapedIcon); var labelLength = shapedLabelLength * boxScale; // Is the line continued from outside the tile boundary? var isLineContinued = line[0].x === 0 || line[0].x === tileExtent || line[0].y === 0 || line[0].y === tileExtent; // Is the label long, relative to the spacing? // If so, adjust the spacing so there is always a minimum space of `spacing / 4` between label edges. if (spacing - labelLength < spacing / 4) { spacing = labelLength + spacing / 4; } // Offset the first anchor by: // Either half the label length plus a fixed extra offset if the line is not continued // Or half the spacing if the line is continued. // For non-continued lines, add a bit of fixed extra offset to avoid collisions at T intersections. var fixedExtraOffset = glyphSize * 2; var offset = !isLineContinued ? ((shapedLabelLength / 2 + fixedExtraOffset) * boxScale * overscaling) % spacing : (spacing / 2 * overscaling) % spacing; return resample(line, offset, spacing, angleWindowSize, maxAngle, labelLength, isLineContinued, false, tileExtent); } function resample(line, offset, spacing, angleWindowSize, maxAngle, labelLength, isLineContinued, placeAtMiddle, tileExtent) { var halfLabelLength = labelLength / 2; var lineLength = getLineLength(line); var distance = 0, markedDistance = offset - spacing; var anchors = []; for (var i = 0; i < line.length - 1; i++) { var a = line[i], b = line[i + 1]; var segmentDist = a.dist(b), angle = b.angleTo(a); while (markedDistance + spacing < distance + segmentDist) { markedDistance += spacing; var t = (markedDistance - distance) / segmentDist, x = number(a.x, b.x, t), y = number(a.y, b.y, t); // Check that the point is within the tile boundaries and that // the label would fit before the beginning and end of the line // if placed at this point. if (x >= 0 && x < tileExtent && y >= 0 && y < tileExtent && markedDistance - halfLabelLength >= 0 && markedDistance + halfLabelLength <= lineLength) { var anchor = new Anchor(x, y, angle, i); anchor._round(); if (!angleWindowSize || checkMaxAngle(line, anchor, labelLength, angleWindowSize, maxAngle)) { anchors.push(anchor); } } } distance += segmentDist; } if (!placeAtMiddle && !anchors.length && !isLineContinued) { // The first attempt at finding anchors at which labels can be placed failed. // Try again, but this time just try placing one anchor at the middle of the line. // This has the most effect for short lines in overscaled tiles, since the // initial offset used in overscaled tiles is calculated to align labels with positions in // parent tiles instead of placing the label as close to the beginning as possible. anchors = resample(line, distance / 2, spacing, angleWindowSize, maxAngle, labelLength, isLineContinued, true, tileExtent); } return anchors; } // /** * Returns the part of a multiline that intersects with the provided rectangular box. * * @param lines * @param x1 the left edge of the box * @param y1 the top edge of the box * @param x2 the right edge of the box * @param y2 the bottom edge of the box * @returns lines * @private */ function clipLine(lines , x1 , y1 , x2 , y2 ) { var clippedLines = []; for (var l = 0; l < lines.length; l++) { var line = lines[l]; var clippedLine = (void 0); for (var i = 0; i < line.length - 1; i++) { var p0 = line[i]; var p1 = line[i + 1]; if (p0.x < x1 && p1.x < x1) { continue; } else if (p0.x < x1) { p0 = new pointGeometry(x1, p0.y + (p1.y - p0.y) * ((x1 - p0.x) / (p1.x - p0.x)))._round(); } else if (p1.x < x1) { p1 = new pointGeometry(x1, p0.y + (p1.y - p0.y) * ((x1 - p0.x) / (p1.x - p0.x)))._round(); } if (p0.y < y1 && p1.y < y1) { continue; } else if (p0.y < y1) { p0 = new pointGeometry(p0.x + (p1.x - p0.x) * ((y1 - p0.y) / (p1.y - p0.y)), y1)._round(); } else if (p1.y < y1) { p1 = new pointGeometry(p0.x + (p1.x - p0.x) * ((y1 - p0.y) / (p1.y - p0.y)), y1)._round(); } if (p0.x >= x2 && p1.x >= x2) { continue; } else if (p0.x >= x2) { p0 = new pointGeometry(x2, p0.y + (p1.y - p0.y) * ((x2 - p0.x) / (p1.x - p0.x)))._round(); } else if (p1.x >= x2) { p1 = new pointGeometry(x2, p0.y + (p1.y - p0.y) * ((x2 - p0.x) / (p1.x - p0.x)))._round(); } if (p0.y >= y2 && p1.y >= y2) { continue; } else if (p0.y >= y2) { p0 = new pointGeometry(p0.x + (p1.x - p0.x) * ((y2 - p0.y) / (p1.y - p0.y)), y2)._round(); } else if (p1.y >= y2) { p1 = new pointGeometry(p0.x + (p1.x - p0.x) * ((y2 - p0.y) / (p1.y - p0.y)), y2)._round(); } if (!clippedLine || !p0.equals(clippedLine[clippedLine.length - 1])) { clippedLine = [p0]; clippedLines.push(clippedLine); } clippedLine.push(p1); } } return clippedLines; } // /** * A textured quad for rendering a single icon or glyph. * * The zoom range the glyph can be shown is defined by minScale and maxScale. * * @param tl The offset of the top left corner from the anchor. * @param tr The offset of the top right corner from the anchor. * @param bl The offset of the bottom left corner from the anchor. * @param br The offset of the bottom right corner from the anchor. * @param tex The texture coordinates. * * @private */ /** * Create the quads used for rendering an icon. * @private */ function getIconQuads(anchor , shapedIcon , layer , alongLine , shapedText , feature ) { var image = shapedIcon.image; var layout = layer.layout; // If you have a 10px icon that isn't perfectly aligned to the pixel grid it will cover 11 actual // pixels. The quad needs to be padded to account for this, otherwise they'll look slightly clipped // on one edge in some cases. var border = 1; var top = shapedIcon.top - border / image.pixelRatio; var left = shapedIcon.left - border / image.pixelRatio; var bottom = shapedIcon.bottom + border / image.pixelRatio; var right = shapedIcon.right + border / image.pixelRatio; var tl, tr, br, bl; // text-fit mode if (layout.get('icon-text-fit') !== 'none' && shapedText) { var iconWidth = (right - left), iconHeight = (bottom - top), size = layout.get('text-size').evaluate(feature, {}) / 24, textLeft = shapedText.left * size, textRight = shapedText.right * size, textTop = shapedText.top * size, textBottom = shapedText.bottom * size, textWidth = textRight - textLeft, textHeight = textBottom - textTop, padT = layout.get('icon-text-fit-padding')[0], padR = layout.get('icon-text-fit-padding')[1], padB = layout.get('icon-text-fit-padding')[2], padL = layout.get('icon-text-fit-padding')[3], offsetY = layout.get('icon-text-fit') === 'width' ? (textHeight - iconHeight) * 0.5 : 0, offsetX = layout.get('icon-text-fit') === 'height' ? (textWidth - iconWidth) * 0.5 : 0, width = layout.get('icon-text-fit') === 'width' || layout.get('icon-text-fit') === 'both' ? textWidth : iconWidth, height = layout.get('icon-text-fit') === 'height' || layout.get('icon-text-fit') === 'both' ? textHeight : iconHeight; tl = new pointGeometry(textLeft + offsetX - padL, textTop + offsetY - padT); tr = new pointGeometry(textLeft + offsetX + padR + width, textTop + offsetY - padT); br = new pointGeometry(textLeft + offsetX + padR + width, textTop + offsetY + padB + height); bl = new pointGeometry(textLeft + offsetX - padL, textTop + offsetY + padB + height); // Normal icon size mode } else { tl = new pointGeometry(left, top); tr = new pointGeometry(right, top); br = new pointGeometry(right, bottom); bl = new pointGeometry(left, bottom); } var angle = layer.layout.get('icon-rotate').evaluate(feature, {}) * Math.PI / 180; if (angle) { var sin = Math.sin(angle), cos = Math.cos(angle), matrix = [cos, -sin, sin, cos]; tl._matMult(matrix); tr._matMult(matrix); bl._matMult(matrix); br._matMult(matrix); } // Icon quad is padded, so texture coordinates also need to be padded. return [{tl: tl, tr: tr, bl: bl, br: br, tex: image.paddedRect, writingMode: undefined, glyphOffset: [0, 0]}]; } /** * Create the quads used for rendering a text label. * @private */ function getGlyphQuads(anchor , shaping , textOffset , layer , alongLine , feature , positions ) { var textRotate = layer.layout.get('text-rotate').evaluate(feature, {}) * Math.PI / 180; var positionedGlyphs = shaping.positionedGlyphs; var quads = []; for (var k = 0; k < positionedGlyphs.length; k++) { var positionedGlyph = positionedGlyphs[k]; var glyphPositions = positions[positionedGlyph.fontStack]; var glyph = glyphPositions && glyphPositions[positionedGlyph.glyph]; if (!glyph) { continue; } var rect = glyph.rect; if (!rect) { continue; } // The rects have an addditional buffer that is not included in their size. var glyphPadding = 1.0; var rectBuffer = GLYPH_PBF_BORDER + glyphPadding; var halfAdvance = glyph.metrics.advance * positionedGlyph.scale / 2; var glyphOffset = alongLine ? [positionedGlyph.x + halfAdvance, positionedGlyph.y] : [0, 0]; var builtInOffset = alongLine ? [0, 0] : [positionedGlyph.x + halfAdvance + textOffset[0], positionedGlyph.y + textOffset[1]]; var x1 = (glyph.metrics.left - rectBuffer) * positionedGlyph.scale - halfAdvance + builtInOffset[0]; var y1 = (-glyph.metrics.top - rectBuffer) * positionedGlyph.scale + builtInOffset[1]; var x2 = x1 + rect.w * positionedGlyph.scale; var y2 = y1 + rect.h * positionedGlyph.scale; var tl = new pointGeometry(x1, y1); var tr = new pointGeometry(x2, y1); var bl = new pointGeometry(x1, y2); var br = new pointGeometry(x2, y2); if (alongLine && positionedGlyph.vertical) { // Vertical-supporting glyphs are laid out in 24x24 point boxes (1 square em) // In horizontal orientation, the y values for glyphs are below the midline // and we use a "yOffset" of -17 to pull them up to the middle. // By rotating counter-clockwise around the point at the center of the left // edge of a 24x24 layout box centered below the midline, we align the center // of the glyphs with the horizontal midline, so the yOffset is no longer // necessary, but we also pull the glyph to the left along the x axis var center = new pointGeometry(-halfAdvance, halfAdvance); var verticalRotation = -Math.PI / 2; var xOffsetCorrection = new pointGeometry(5, 0); tl._rotateAround(verticalRotation, center)._add(xOffsetCorrection); tr._rotateAround(verticalRotation, center)._add(xOffsetCorrection); bl._rotateAround(verticalRotation, center)._add(xOffsetCorrection); br._rotateAround(verticalRotation, center)._add(xOffsetCorrection); } if (textRotate) { var sin = Math.sin(textRotate), cos = Math.cos(textRotate), matrix = [cos, -sin, sin, cos]; tl._matMult(matrix); tr._matMult(matrix); bl._matMult(matrix); br._matMult(matrix); } quads.push({tl: tl, tr: tr, bl: bl, br: br, tex: rect, writingMode: shaping.writingMode, glyphOffset: glyphOffset}); } return quads; } // /** * A CollisionFeature represents the area of the tile covered by a single label. * It is used with CollisionIndex to check if the label overlaps with any * previous labels. A CollisionFeature is mostly just a set of CollisionBox * objects. * * @private */ var CollisionFeature = function CollisionFeature(collisionBoxArray , line , anchor , featureIndex , sourceLayerIndex , bucketIndex , shaped , boxScale , padding , alignLine , overscaling , rotate ) { var y1 = shaped.top * boxScale - padding; var y2 = shaped.bottom * boxScale + padding; var x1 = shaped.left * boxScale - padding; var x2 = shaped.right * boxScale + padding; this.boxStartIndex = collisionBoxArray.length; if (alignLine) { var height = y2 - y1; var length = x2 - x1; if (height > 0) { // set minimum box height to avoid very many small labels height = Math.max(10 * boxScale, height); this._addLineCollisionCircles(collisionBoxArray, line, anchor, (anchor.segment ), length, height, featureIndex, sourceLayerIndex, bucketIndex, overscaling); } } else { if (rotate) { // Account for *-rotate in point collision boxes // See https://github.com/mapbox/mapbox-gl-js/issues/6075 // Doesn't account for icon-text-fit var tl = new pointGeometry(x1, y1); var tr = new pointGeometry(x2, y1); var bl = new pointGeometry(x1, y2); var br = new pointGeometry(x2, y2); var rotateRadians = rotate * Math.PI / 180; tl._rotate(rotateRadians); tr._rotate(rotateRadians); bl._rotate(rotateRadians); br._rotate(rotateRadians); // Collision features require an "on-axis" geometry, // so take the envelope of the rotated geometry // (may be quite large for wide labels rotated 45 degrees) x1 = Math.min(tl.x, tr.x, bl.x, br.x); x2 = Math.max(tl.x, tr.x, bl.x, br.x); y1 = Math.min(tl.y, tr.y, bl.y, br.y); y2 = Math.max(tl.y, tr.y, bl.y, br.y); } collisionBoxArray.emplaceBack(anchor.x, anchor.y, x1, y1, x2, y2, featureIndex, sourceLayerIndex, bucketIndex, 0, 0); } this.boxEndIndex = collisionBoxArray.length; }; /** * Create a set of CollisionBox objects for a line. * * @param labelLength The length of the label in geometry units. * @param anchor The point along the line around which the label is anchored. * @param boxSize The size of the collision boxes that will be created. * @private */ CollisionFeature.prototype._addLineCollisionCircles = function _addLineCollisionCircles (collisionBoxArray , line , anchor , segment , labelLength , boxSize , featureIndex , sourceLayerIndex , bucketIndex , overscaling ) { var step = boxSize / 2; var nBoxes = Math.floor(labelLength / step) || 1; // We calculate line collision circles out to 300% of what would normally be our // max size, to allow collision detection to work on labels that expand as // they move into the distance // Vertically oriented labels in the distant field can extend past this padding // This is a noticeable problem in overscaled tiles where the pitch 0-based // symbol spacing will put labels very close together in a pitched map. // To reduce the cost of adding extra collision circles, we slowly increase // them for overscaled tiles. var overscalingPaddingFactor = 1 + .4 * Math.log(overscaling) / Math.LN2; var nPitchPaddingBoxes = Math.floor(nBoxes * overscalingPaddingFactor / 2); // offset the center of the first box by half a box so that the edge of the // box is at the edge of the label. var firstBoxOffset = -boxSize / 2; var p = anchor; var index = segment + 1; var anchorDistance = firstBoxOffset; var labelStartDistance = -labelLength / 2; var paddingStartDistance = labelStartDistance - labelLength / 4; // move backwards along the line to the first segment the label appears on do { index--; if (index < 0) { if (anchorDistance > labelStartDistance) { // there isn't enough room for the label after the beginning of the line // checkMaxAngle should have already caught this return; } else { // The line doesn't extend far enough back for all of our padding, // but we got far enough to show the label under most conditions. index = 0; break; } } else { anchorDistance -= line[index].dist(p); p = line[index]; } } while (anchorDistance > paddingStartDistance); var segmentLength = line[index].dist(line[index + 1]); for (var i = -nPitchPaddingBoxes; i < nBoxes + nPitchPaddingBoxes; i++) { // the distance the box will be from the anchor var boxOffset = i * step; var boxDistanceToAnchor = labelStartDistance + boxOffset; // make the distance between pitch padding boxes bigger if (boxOffset < 0) { boxDistanceToAnchor += boxOffset; } if (boxOffset > labelLength) { boxDistanceToAnchor += boxOffset - labelLength; } if (boxDistanceToAnchor < anchorDistance) { // The line doesn't extend far enough back for this box, skip it // (This could allow for line collisions on distant tiles) continue; } // the box is not on the current segment. Move to the next segment. while (anchorDistance + segmentLength < boxDistanceToAnchor) { anchorDistance += segmentLength; index++; // There isn't enough room before the end of the line. if (index + 1 >= line.length) { return; } segmentLength = line[index].dist(line[index + 1]); } // the distance the box will be from the beginning of the segment var segmentBoxDistance = boxDistanceToAnchor - anchorDistance; var p0 = line[index]; var p1 = line[index + 1]; var boxAnchorPoint = p1.sub(p0)._unit()._mult(segmentBoxDistance)._add(p0)._round(); // If the box is within boxSize of the anchor, force the box to be used // (so even 0-width labels use at least one box) // Otherwise, the .8 multiplication gives us a little bit of conservative // padding in choosing which boxes to use (see CollisionIndex#placedCollisionCircles) var paddedAnchorDistance = Math.abs(boxDistanceToAnchor - firstBoxOffset) < step ? 0 : (boxDistanceToAnchor - firstBoxOffset) * 0.8; collisionBoxArray.emplaceBack(boxAnchorPoint.x, boxAnchorPoint.y, -boxSize / 2, -boxSize / 2, boxSize / 2, boxSize / 2, featureIndex, sourceLayerIndex, bucketIndex, boxSize / 2, paddedAnchorDistance); } }; var TinyQueue = function TinyQueue(data, compare) { if ( data === void 0 ) data = []; if ( compare === void 0 ) compare = defaultCompare$1; this.data = data; this.length = this.data.length; this.compare = compare; if (this.length > 0) { for (var i = (this.length >> 1) - 1; i >= 0; i--) { this._down(i); } } }; TinyQueue.prototype.push = function push (item) { this.data.push(item); this.length++; this._up(this.length - 1); }; TinyQueue.prototype.pop = function pop () { if (this.length === 0) { return undefined; } var top = this.data[0]; this.length--; if (this.length > 0) { this.data[0] = this.data[this.length]; this._down(0); } this.data.pop(); return top; }; TinyQueue.prototype.peek = function peek () { return this.data[0]; }; TinyQueue.prototype._up = function _up (pos) { var ref = this; var data = ref.data; var compare = ref.compare; var item = data[pos]; while (pos > 0) { var parent = (pos - 1) >> 1; var current = data[parent]; if (compare(item, current) >= 0) { break; } data[pos] = current; pos = parent; } data[pos] = item; }; TinyQueue.prototype._down = function _down (pos) { var ref = this; var data = ref.data; var compare = ref.compare; var halfLength = this.length >> 1; var item = data[pos]; while (pos < halfLength) { var left = (pos << 1) + 1; var best = data[left]; var right = left + 1; if (right < this.length && compare(data[right], best) < 0) { left = right; best = data[right]; } if (compare(best, item) >= 0) { break; } data[pos] = best; pos = left; } data[pos] = item; }; function defaultCompare$1(a, b) { return a < b ? -1 : a > b ? 1 : 0; } // /** * Finds an approximation of a polygon's Pole Of Inaccessibiliy https://en.wikipedia.org/wiki/Pole_of_inaccessibility * This is a copy of http://github.com/mapbox/polylabel adapted to use Points * * @param polygonRings first item in array is the outer ring followed optionally by the list of holes, should be an element of the result of util/classify_rings * @param precision Specified in input coordinate units. If 0 returns after first run, if > 0 repeatedly narrows the search space until the radius of the area searched for the best pole is less than precision * @param debug Print some statistics to the console during execution * @returns Pole of Inaccessibiliy. * @private */ function findPoleOfInaccessibility (polygonRings , precision, debug) { if ( precision === void 0 ) precision = 1; if ( debug === void 0 ) debug = false; // find the bounding box of the outer ring var minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity; var outerRing = polygonRings[0]; for (var i = 0; i < outerRing.length; i++) { var p = outerRing[i]; if (!i || p.x < minX) { minX = p.x; } if (!i || p.y < minY) { minY = p.y; } if (!i || p.x > maxX) { maxX = p.x; } if (!i || p.y > maxY) { maxY = p.y; } } var width = maxX - minX; var height = maxY - minY; var cellSize = Math.min(width, height); var h = cellSize / 2; // a priority queue of cells in order of their "potential" (max distance to polygon) var cellQueue = new TinyQueue([], compareMax); if (cellSize === 0) { return new pointGeometry(minX, minY); } // cover polygon with initial cells for (var x = minX; x < maxX; x += cellSize) { for (var y = minY; y < maxY; y += cellSize) { cellQueue.push(new Cell(x + h, y + h, h, polygonRings)); } } // take centroid as the first best guess var bestCell = getCentroidCell(polygonRings); var numProbes = cellQueue.length; while (cellQueue.length) { // pick the most promising cell from the queue var cell = cellQueue.pop(); // update the best cell if we found a better one if (cell.d > bestCell.d || !bestCell.d) { bestCell = cell; if (debug) { console.log('found best %d after %d probes', Math.round(1e4 * cell.d) / 1e4, numProbes); } } // do not drill down further if there's no chance of a better solution if (cell.max - bestCell.d <= precision) { continue; } // split the cell into four cells h = cell.h / 2; cellQueue.push(new Cell(cell.p.x - h, cell.p.y - h, h, polygonRings)); cellQueue.push(new Cell(cell.p.x + h, cell.p.y - h, h, polygonRings)); cellQueue.push(new Cell(cell.p.x - h, cell.p.y + h, h, polygonRings)); cellQueue.push(new Cell(cell.p.x + h, cell.p.y + h, h, polygonRings)); numProbes += 4; } if (debug) { console.log(("num probes: " + numProbes)); console.log(("best distance: " + (bestCell.d))); } return bestCell.p; } function compareMax(a, b) { return b.max - a.max; } function Cell(x, y, h, polygon) { this.p = new pointGeometry(x, y); this.h = h; // half the cell size this.d = pointToPolygonDist(this.p, polygon); // distance from cell center to polygon this.max = this.d + this.h * Math.SQRT2; // max distance to polygon within a cell } // signed distance from point to polygon outline (negative if point is outside) function pointToPolygonDist(p, polygon) { var inside = false; var minDistSq = Infinity; for (var k = 0; k < polygon.length; k++) { var ring = polygon[k]; for (var i = 0, len = ring.length, j = len - 1; i < len; j = i++) { var a = ring[i]; var b = ring[j]; if ((a.y > p.y !== b.y > p.y) && (p.x < (b.x - a.x) * (p.y - a.y) / (b.y - a.y) + a.x)) { inside = !inside; } minDistSq = Math.min(minDistSq, distToSegmentSquared(p, a, b)); } } return (inside ? 1 : -1) * Math.sqrt(minDistSq); } // get polygon centroid function getCentroidCell(polygon) { var area = 0; var x = 0; var y = 0; var points = polygon[0]; for (var i = 0, len = points.length, j = len - 1; i < len; j = i++) { var a = points[i]; var b = points[j]; var f = a.x * b.y - b.x * a.y; x += (a.x + b.x) * f; y += (a.y + b.y) * f; area += f * 3; } return new Cell(x / area, y / area, 0, polygon); } var murmurhash3_gc = createCommonjsModule(function (module) { /** * JS Implementation of MurmurHash3 (r136) (as of May 20, 2011) * * @author Gary Court * @see http://github.com/garycourt/murmurhash-js * @author Austin Appleby * @see http://sites.google.com/site/murmurhash/ * * @param {string} key ASCII only * @param {number} seed Positive integer only * @return {number} 32-bit positive integer hash */ function murmurhash3_32_gc(key, seed) { var remainder, bytes, h1, h1b, c1, c1b, c2, c2b, k1, i; remainder = key.length & 3; // key.length % 4 bytes = key.length - remainder; h1 = seed; c1 = 0xcc9e2d51; c2 = 0x1b873593; i = 0; while (i < bytes) { k1 = ((key.charCodeAt(i) & 0xff)) | ((key.charCodeAt(++i) & 0xff) << 8) | ((key.charCodeAt(++i) & 0xff) << 16) | ((key.charCodeAt(++i) & 0xff) << 24); ++i; k1 = ((((k1 & 0xffff) * c1) + ((((k1 >>> 16) * c1) & 0xffff) << 16))) & 0xffffffff; k1 = (k1 << 15) | (k1 >>> 17); k1 = ((((k1 & 0xffff) * c2) + ((((k1 >>> 16) * c2) & 0xffff) << 16))) & 0xffffffff; h1 ^= k1; h1 = (h1 << 13) | (h1 >>> 19); h1b = ((((h1 & 0xffff) * 5) + ((((h1 >>> 16) * 5) & 0xffff) << 16))) & 0xffffffff; h1 = (((h1b & 0xffff) + 0x6b64) + ((((h1b >>> 16) + 0xe654) & 0xffff) << 16)); } k1 = 0; switch (remainder) { case 3: k1 ^= (key.charCodeAt(i + 2) & 0xff) << 16; case 2: k1 ^= (key.charCodeAt(i + 1) & 0xff) << 8; case 1: k1 ^= (key.charCodeAt(i) & 0xff); k1 = (((k1 & 0xffff) * c1) + ((((k1 >>> 16) * c1) & 0xffff) << 16)) & 0xffffffff; k1 = (k1 << 15) | (k1 >>> 17); k1 = (((k1 & 0xffff) * c2) + ((((k1 >>> 16) * c2) & 0xffff) << 16)) & 0xffffffff; h1 ^= k1; } h1 ^= key.length; h1 ^= h1 >>> 16; h1 = (((h1 & 0xffff) * 0x85ebca6b) + ((((h1 >>> 16) * 0x85ebca6b) & 0xffff) << 16)) & 0xffffffff; h1 ^= h1 >>> 13; h1 = ((((h1 & 0xffff) * 0xc2b2ae35) + ((((h1 >>> 16) * 0xc2b2ae35) & 0xffff) << 16))) & 0xffffffff; h1 ^= h1 >>> 16; return h1 >>> 0; } if('object' !== "undefined") { module.exports = murmurhash3_32_gc; } }); var murmurhash2_gc = createCommonjsModule(function (module) { /** * JS Implementation of MurmurHash2 * * @author Gary Court * @see http://github.com/garycourt/murmurhash-js * @author Austin Appleby * @see http://sites.google.com/site/murmurhash/ * * @param {string} str ASCII only * @param {number} seed Positive integer only * @return {number} 32-bit positive integer hash */ function murmurhash2_32_gc(str, seed) { var l = str.length, h = seed ^ l, i = 0, k; while (l >= 4) { k = ((str.charCodeAt(i) & 0xff)) | ((str.charCodeAt(++i) & 0xff) << 8) | ((str.charCodeAt(++i) & 0xff) << 16) | ((str.charCodeAt(++i) & 0xff) << 24); k = (((k & 0xffff) * 0x5bd1e995) + ((((k >>> 16) * 0x5bd1e995) & 0xffff) << 16)); k ^= k >>> 24; k = (((k & 0xffff) * 0x5bd1e995) + ((((k >>> 16) * 0x5bd1e995) & 0xffff) << 16)); h = (((h & 0xffff) * 0x5bd1e995) + ((((h >>> 16) * 0x5bd1e995) & 0xffff) << 16)) ^ k; l -= 4; ++i; } switch (l) { case 3: h ^= (str.charCodeAt(i + 2) & 0xff) << 16; case 2: h ^= (str.charCodeAt(i + 1) & 0xff) << 8; case 1: h ^= (str.charCodeAt(i) & 0xff); h = (((h & 0xffff) * 0x5bd1e995) + ((((h >>> 16) * 0x5bd1e995) & 0xffff) << 16)); } h ^= h >>> 13; h = (((h & 0xffff) * 0x5bd1e995) + ((((h >>> 16) * 0x5bd1e995) & 0xffff) << 16)); h ^= h >>> 15; return h >>> 0; } if('object' !== undefined) { module.exports = murmurhash2_32_gc; } }); var murmurhashJs = murmurhash3_gc; var murmur3_1 = murmurhash3_gc; var murmur2_1 = murmurhash2_gc; murmurhashJs.murmur3 = murmur3_1; murmurhashJs.murmur2 = murmur2_1; // // The symbol layout process needs `text-size` evaluated at up to five different zoom levels, and // `icon-size` at up to three: // // 1. `text-size` at the zoom level of the bucket. Used to calculate a per-feature size for source `text-size` // expressions, and to calculate the box dimensions for icon-text-fit. // 2. `icon-size` at the zoom level of the bucket. Used to calculate a per-feature size for source `icon-size` // expressions. // 3. `text-size` and `icon-size` at the zoom level of the bucket, plus one. Used to calculate collision boxes. // 4. `text-size` at zoom level 18. Used for something line-symbol-placement-related. // 5. For composite `*-size` expressions: two zoom levels of curve stops that "cover" the zoom level of the // bucket. These go into a vertex buffer and are used by the shader to interpolate the size at render time. // // (1) and (2) are stored in `bucket.layers[0].layout`. The remainder are below. // // The radial offset is to the edge of the text box // In the horizontal direction, the edge of the text box is where glyphs start // But in the vertical direction, the glyphs appear to "start" at the baseline // We don't actually load baseline data, but we assume an offset of ONE_EM - 17 // (see "yOffset" in shaping.js) var baselineOffset = 7; function evaluateRadialOffset(anchor , radialOffset ) { var x = 0, y = 0; // solve for r where r^2 + r^2 = radialOffset^2 var hypotenuse = radialOffset / Math.sqrt(2); switch (anchor) { case 'top-right': case 'top-left': y = hypotenuse - baselineOffset; break; case 'bottom-right': case 'bottom-left': y = -hypotenuse + baselineOffset; break; case 'bottom': y = -radialOffset + baselineOffset; break; case 'top': y = radialOffset - baselineOffset; break; } switch (anchor) { case 'top-right': case 'bottom-right': x = -hypotenuse; break; case 'top-left': case 'bottom-left': x = hypotenuse; break; case 'left': x = radialOffset; break; case 'right': x = -radialOffset; break; } return [x, y]; } function performSymbolLayout(bucket , glyphMap , glyphPositions , imageMap , imagePositions , showCollisionBoxes ) { bucket.createArrays(); var tileSize = 512 * bucket.overscaling; bucket.tilePixelRatio = EXTENT / tileSize; bucket.compareText = {}; bucket.iconsNeedLinear = false; var layout = bucket.layers[0].layout; var unevaluatedLayoutValues = bucket.layers[0]._unevaluatedLayout._values; var sizes = {}; if (bucket.textSizeData.functionType === 'composite') { var ref = bucket.textSizeData.zoomRange; var min = ref.min; var max = ref.max; sizes.compositeTextSizes = [ unevaluatedLayoutValues['text-size'].possiblyEvaluate(new EvaluationParameters(min)), unevaluatedLayoutValues['text-size'].possiblyEvaluate(new EvaluationParameters(max)) ]; } if (bucket.iconSizeData.functionType === 'composite') { var ref$1 = bucket.iconSizeData.zoomRange; var min$1 = ref$1.min; var max$1 = ref$1.max; sizes.compositeIconSizes = [ unevaluatedLayoutValues['icon-size'].possiblyEvaluate(new EvaluationParameters(min$1)), unevaluatedLayoutValues['icon-size'].possiblyEvaluate(new EvaluationParameters(max$1)) ]; } sizes.layoutTextSize = unevaluatedLayoutValues['text-size'].possiblyEvaluate(new EvaluationParameters(bucket.zoom + 1)); sizes.layoutIconSize = unevaluatedLayoutValues['icon-size'].possiblyEvaluate(new EvaluationParameters(bucket.zoom + 1)); sizes.textMaxSize = unevaluatedLayoutValues['text-size'].possiblyEvaluate(new EvaluationParameters(18)); var lineHeight = layout.get('text-line-height') * ONE_EM; var textAlongLine = layout.get('text-rotation-alignment') === 'map' && layout.get('symbol-placement') !== 'point'; var keepUpright = layout.get('text-keep-upright'); for (var i$1 = 0, list = bucket.features; i$1 < list.length; i$1 += 1) { var feature = list[i$1]; var fontstack = layout.get('text-font').evaluate(feature, {}).join(','); var glyphPositionMap = glyphPositions; var shapedTextOrientations = { horizontal: {}, vertical: undefined }; var text = feature.text; var textOffset = [0, 0]; if (text) { var unformattedText = text.toString(); var spacing = layout.get('text-letter-spacing').evaluate(feature, {}) * ONE_EM; var spacingIfAllowed = allowsLetterSpacing(unformattedText) ? spacing : 0; var textAnchor = layout.get('text-anchor').evaluate(feature, {}); var variableTextAnchor = layout.get('text-variable-anchor'); var radialOffset = layout.get('text-radial-offset').evaluate(feature, {}); if (!variableTextAnchor) { // Layers with variable anchors use the `text-radial-offset` property and the [x, y] offset vector // is calculated at placement time instead of layout time if (radialOffset) { // The style spec says don't use `text-offset` and `text-radial-offset` together // but doesn't actually specify what happens if you use both. We go with the radial offset. textOffset = evaluateRadialOffset(textAnchor, radialOffset * ONE_EM); } else { textOffset = (layout.get('text-offset').evaluate(feature, {}).map(function (t) { return t * ONE_EM; }) ); } } var textJustify = textAlongLine ? "center" : layout.get('text-justify').evaluate(feature, {}); var maxWidth = layout.get('symbol-placement') === 'point' ? layout.get('text-max-width').evaluate(feature, {}) * ONE_EM : 0; // If this layer uses text-variable-anchor, generate shapings for all justification possibilities. if (!textAlongLine && variableTextAnchor) { var justifications = textJustify === "auto" ? variableTextAnchor.map(function (a) { return getAnchorJustification(a); }) : [textJustify]; var singleLine = false; for (var i = 0; i < justifications.length; i++) { var justification = justifications[i]; if (shapedTextOrientations.horizontal[justification]) { continue; } if (singleLine) { // If the shaping for the first justification was only a single line, we // can re-use it for the other justifications shapedTextOrientations.horizontal[justification] = shapedTextOrientations.horizontal[0]; } else { // If using text-variable-anchor for the layer, we use a center anchor for all shapings and apply // the offsets for the anchor in the placement step. var shaping = shapeText(text, glyphMap, fontstack, maxWidth, lineHeight, 'center', justification, spacingIfAllowed, textOffset, WritingMode.horizontal); if (shaping) { shapedTextOrientations.horizontal[justification] = shaping; singleLine = shaping.lineCount === 1; } } } } else { if (textJustify === "auto") { textJustify = getAnchorJustification(textAnchor); } var shaping$1 = shapeText(text, glyphMap, fontstack, maxWidth, lineHeight, textAnchor, textJustify, spacingIfAllowed, textOffset, WritingMode.horizontal); if (shaping$1) { shapedTextOrientations.horizontal[textJustify] = shaping$1; } if (allowsVerticalWritingMode(unformattedText) && textAlongLine && keepUpright) { shapedTextOrientations.vertical = shapeText(text, glyphMap, fontstack, maxWidth, lineHeight, textAnchor, textJustify, spacingIfAllowed, textOffset, WritingMode.vertical); } } } var shapedIcon = (void 0); if (feature.icon) { var image = imageMap[feature.icon]; if (image) { shapedIcon = shapeIcon( imagePositions[feature.icon], layout.get('icon-offset').evaluate(feature, {}), layout.get('icon-anchor').evaluate(feature, {})); if (bucket.sdfIcons === undefined) { bucket.sdfIcons = image.sdf; } else if (bucket.sdfIcons !== image.sdf) { warnOnce('Style sheet warning: Cannot mix SDF and non-SDF icons in one buffer'); } if (image.pixelRatio !== bucket.pixelRatio) { bucket.iconsNeedLinear = true; } else if (layout.get('icon-rotate').constantOr(1) !== 0) { bucket.iconsNeedLinear = true; } } } if (Object.keys(shapedTextOrientations.horizontal).length || shapedIcon) { addFeature(bucket, feature, shapedTextOrientations, shapedIcon, glyphPositionMap, sizes, textOffset); } } if (showCollisionBoxes) { bucket.generateCollisionDebugBuffers(); } } // Choose the justification that matches the direction of the TextAnchor function getAnchorJustification(anchor ) { switch (anchor) { case 'right': case 'top-right': case 'bottom-right': return 'right'; case 'left': case 'top-left': case 'bottom-left': return 'left'; } return 'center'; } /** * Given a feature and its shaped text and icon data, add a 'symbol * instance' for each _possible_ placement of the symbol feature. * (At render timePlaceSymbols#place() selects which of these instances to * show or hide based on collisions with symbols in other layers.) * @private */ function addFeature(bucket , feature , shapedTextOrientations , shapedIcon , glyphPositionMap , sizes , textOffset ) { var layoutTextSize = sizes.layoutTextSize.evaluate(feature, {}); var layoutIconSize = sizes.layoutIconSize.evaluate(feature, {}); // To reduce the number of labels that jump around when zooming we need // to use a text-size value that is the same for all zoom levels. // bucket calculates text-size at a high zoom level so that all tiles can // use the same value when calculating anchor positions. var textMaxSize = sizes.textMaxSize.evaluate(feature, {}); if (textMaxSize === undefined) { textMaxSize = layoutTextSize; } var layout = bucket.layers[0].layout; var iconOffset = layout.get('icon-offset').evaluate(feature, {}); var defaultHorizontalShaping = getDefaultHorizontalShaping(shapedTextOrientations.horizontal); var glyphSize = 24, fontScale = layoutTextSize / glyphSize, textBoxScale = bucket.tilePixelRatio * fontScale, textMaxBoxScale = bucket.tilePixelRatio * textMaxSize / glyphSize, iconBoxScale = bucket.tilePixelRatio * layoutIconSize, symbolMinDistance = bucket.tilePixelRatio * layout.get('symbol-spacing'), textPadding = layout.get('text-padding') * bucket.tilePixelRatio, iconPadding = layout.get('icon-padding') * bucket.tilePixelRatio, textMaxAngle = layout.get('text-max-angle') / 180 * Math.PI, textAlongLine = layout.get('text-rotation-alignment') === 'map' && layout.get('symbol-placement') !== 'point', iconAlongLine = layout.get('icon-rotation-alignment') === 'map' && layout.get('symbol-placement') !== 'point', symbolPlacement = layout.get('symbol-placement'), textRepeatDistance = symbolMinDistance / 2; var addSymbolAtAnchor = function (line, anchor) { if (anchor.x < 0 || anchor.x >= EXTENT || anchor.y < 0 || anchor.y >= EXTENT) { // Symbol layers are drawn across tile boundaries, We filter out symbols // outside our tile boundaries (which may be included in vector tile buffers) // to prevent double-drawing symbols. return; } addSymbol(bucket, anchor, line, shapedTextOrientations, shapedIcon, bucket.layers[0], bucket.collisionBoxArray, feature.index, feature.sourceLayerIndex, bucket.index, textBoxScale, textPadding, textAlongLine, textOffset, iconBoxScale, iconPadding, iconAlongLine, iconOffset, feature, glyphPositionMap, sizes); }; if (symbolPlacement === 'line') { for (var i$1 = 0, list$1 = clipLine(feature.geometry, 0, 0, EXTENT, EXTENT); i$1 < list$1.length; i$1 += 1) { var line = list$1[i$1]; var anchors = getAnchors( line, symbolMinDistance, textMaxAngle, shapedTextOrientations.vertical || defaultHorizontalShaping, shapedIcon, glyphSize, textMaxBoxScale, bucket.overscaling, EXTENT ); for (var i = 0, list = anchors; i < list.length; i += 1) { var anchor = list[i]; var shapedText = defaultHorizontalShaping; if (!shapedText || !anchorIsTooClose(bucket, shapedText.text, textRepeatDistance, anchor)) { addSymbolAtAnchor(line, anchor); } } } } else if (symbolPlacement === 'line-center') { // No clipping, multiple lines per feature are allowed // "lines" with only one point are ignored as in clipLines for (var i$2 = 0, list$2 = feature.geometry; i$2 < list$2.length; i$2 += 1) { var line$1 = list$2[i$2]; if (line$1.length > 1) { var anchor$1 = getCenterAnchor( line$1, textMaxAngle, shapedTextOrientations.vertical || defaultHorizontalShaping, shapedIcon, glyphSize, textMaxBoxScale); if (anchor$1) { addSymbolAtAnchor(line$1, anchor$1); } } } } else if (feature.type === 'Polygon') { for (var i$3 = 0, list$3 = classifyRings(feature.geometry, 0); i$3 < list$3.length; i$3 += 1) { // 16 here represents 2 pixels var polygon = list$3[i$3]; var poi = findPoleOfInaccessibility(polygon, 16); addSymbolAtAnchor(polygon[0], new Anchor(poi.x, poi.y, 0)); } } else if (feature.type === 'LineString') { // https://github.com/mapbox/mapbox-gl-js/issues/3808 for (var i$4 = 0, list$4 = feature.geometry; i$4 < list$4.length; i$4 += 1) { var line$2 = list$4[i$4]; addSymbolAtAnchor(line$2, new Anchor(line$2[0].x, line$2[0].y, 0)); } } else if (feature.type === 'Point') { for (var i$6 = 0, list$6 = feature.geometry; i$6 < list$6.length; i$6 += 1) { var points = list$6[i$6]; for (var i$5 = 0, list$5 = points; i$5 < list$5.length; i$5 += 1) { var point = list$5[i$5]; addSymbolAtAnchor([point], new Anchor(point.x, point.y, 0)); } } } } var MAX_PACKED_SIZE = 65535; function addTextVertices(bucket , anchor , shapedText , layer , textAlongLine , feature , textOffset , lineArray , writingMode , placementTypes , placedTextSymbolIndices , glyphPositionMap , sizes ) { var glyphQuads = getGlyphQuads(anchor, shapedText, textOffset, layer, textAlongLine, feature, glyphPositionMap); var sizeData = bucket.textSizeData; var textSizeData = null; if (sizeData.functionType === 'source') { textSizeData = [ SIZE_PACK_FACTOR * layer.layout.get('text-size').evaluate(feature, {}) ]; if (textSizeData[0] > MAX_PACKED_SIZE) { warnOnce(((bucket.layerIds[0]) + ": Value for \"text-size\" is >= 256. Reduce your \"text-size\".")); } } else if (sizeData.functionType === 'composite') { textSizeData = [ SIZE_PACK_FACTOR * sizes.compositeTextSizes[0].evaluate(feature, {}), SIZE_PACK_FACTOR * sizes.compositeTextSizes[1].evaluate(feature, {}) ]; if (textSizeData[0] > MAX_PACKED_SIZE || textSizeData[1] > MAX_PACKED_SIZE) { warnOnce(((bucket.layerIds[0]) + ": Value for \"text-size\" is >= 256. Reduce your \"text-size\".")); } } bucket.addSymbols( bucket.text, glyphQuads, textSizeData, textOffset, textAlongLine, feature, writingMode, anchor, lineArray.lineStartIndex, lineArray.lineLength); // The placedSymbolArray is used at render time in drawTileSymbols // These indices allow access to the array at collision detection time for (var i = 0, list = placementTypes; i < list.length; i += 1) { var placementType = list[i]; placedTextSymbolIndices[placementType] = bucket.text.placedSymbolArray.length - 1; } return glyphQuads.length * 4; } function getDefaultHorizontalShaping(horizontalShaping ) { // We don't care which shaping we get because this is used for collision purposes // and all the justifications have the same collision box for (var justification in horizontalShaping) { return horizontalShaping[justification]; } return null; } /** * Add a single label & icon placement. * * @private */ function addSymbol(bucket , anchor , line , shapedTextOrientations , shapedIcon , layer , collisionBoxArray , featureIndex , sourceLayerIndex , bucketIndex , textBoxScale , textPadding , textAlongLine , textOffset , iconBoxScale , iconPadding , iconAlongLine , iconOffset , feature , glyphPositionMap , sizes ) { var lineArray = bucket.addToLineVertexArray(anchor, line); var textCollisionFeature, iconCollisionFeature; var numIconVertices = 0; var numHorizontalGlyphVertices = 0; var numVerticalGlyphVertices = 0; var placedTextSymbolIndices = {}; var key = murmurhashJs(''); var radialTextOffset = (layer.layout.get('text-radial-offset').evaluate(feature, {}) || 0) * ONE_EM; for (var justification in shapedTextOrientations.horizontal) { var shaping = shapedTextOrientations.horizontal[justification]; if (!textCollisionFeature) { key = murmurhashJs(shaping.text); var textRotate = layer.layout.get('text-rotate').evaluate(feature, {}); // As a collision approximation, we can use either the vertical or any of the horizontal versions of the feature // We're counting on all versions having similar dimensions textCollisionFeature = new CollisionFeature(collisionBoxArray, line, anchor, featureIndex, sourceLayerIndex, bucketIndex, shaping, textBoxScale, textPadding, textAlongLine, bucket.overscaling, textRotate); } var singleLine = shaping.lineCount === 1; numHorizontalGlyphVertices += addTextVertices( bucket, anchor, shaping, layer, textAlongLine, feature, textOffset, lineArray, shapedTextOrientations.vertical ? WritingMode.horizontal : WritingMode.horizontalOnly, singleLine ? (Object.keys(shapedTextOrientations.horizontal) ) : [justification], placedTextSymbolIndices, glyphPositionMap, sizes); if (singleLine) { break; } } if (shapedTextOrientations.vertical) { numVerticalGlyphVertices += addTextVertices( bucket, anchor, shapedTextOrientations.vertical, layer, textAlongLine, feature, textOffset, lineArray, WritingMode.vertical, ['vertical'], placedTextSymbolIndices, glyphPositionMap, sizes); } var textBoxStartIndex = textCollisionFeature ? textCollisionFeature.boxStartIndex : bucket.collisionBoxArray.length; var textBoxEndIndex = textCollisionFeature ? textCollisionFeature.boxEndIndex : bucket.collisionBoxArray.length; if (shapedIcon) { var iconQuads = getIconQuads(anchor, shapedIcon, layer, iconAlongLine, getDefaultHorizontalShaping(shapedTextOrientations.horizontal), feature); var iconRotate = layer.layout.get('icon-rotate').evaluate(feature, {}); iconCollisionFeature = new CollisionFeature(collisionBoxArray, line, anchor, featureIndex, sourceLayerIndex, bucketIndex, shapedIcon, iconBoxScale, iconPadding, /*align boxes to line*/false, bucket.overscaling, iconRotate); numIconVertices = iconQuads.length * 4; var sizeData = bucket.iconSizeData; var iconSizeData = null; if (sizeData.functionType === 'source') { iconSizeData = [ SIZE_PACK_FACTOR * layer.layout.get('icon-size').evaluate(feature, {}) ]; if (iconSizeData[0] > MAX_PACKED_SIZE) { warnOnce(((bucket.layerIds[0]) + ": Value for \"icon-size\" is >= 256. Reduce your \"icon-size\".")); } } else if (sizeData.functionType === 'composite') { iconSizeData = [ SIZE_PACK_FACTOR * sizes.compositeIconSizes[0].evaluate(feature, {}), SIZE_PACK_FACTOR * sizes.compositeIconSizes[1].evaluate(feature, {}) ]; if (iconSizeData[0] > MAX_PACKED_SIZE || iconSizeData[1] > MAX_PACKED_SIZE) { warnOnce(((bucket.layerIds[0]) + ": Value for \"icon-size\" is >= 256. Reduce your \"icon-size\".")); } } bucket.addSymbols( bucket.icon, iconQuads, iconSizeData, iconOffset, iconAlongLine, feature, false, anchor, lineArray.lineStartIndex, lineArray.lineLength); } var iconBoxStartIndex = iconCollisionFeature ? iconCollisionFeature.boxStartIndex : bucket.collisionBoxArray.length; var iconBoxEndIndex = iconCollisionFeature ? iconCollisionFeature.boxEndIndex : bucket.collisionBoxArray.length; if (bucket.glyphOffsetArray.length >= SymbolBucket.MAX_GLYPHS) { warnOnce( "Too many glyphs being rendered in a tile. See https://github.com/mapbox/mapbox-gl-js/issues/2907" ); } bucket.symbolInstances.emplaceBack( anchor.x, anchor.y, placedTextSymbolIndices.right >= 0 ? placedTextSymbolIndices.right : -1, placedTextSymbolIndices.center >= 0 ? placedTextSymbolIndices.center : -1, placedTextSymbolIndices.left >= 0 ? placedTextSymbolIndices.left : -1, placedTextSymbolIndices.vertical || -1, key, textBoxStartIndex, textBoxEndIndex, iconBoxStartIndex, iconBoxEndIndex, featureIndex, numHorizontalGlyphVertices, numVerticalGlyphVertices, numIconVertices, 0, textBoxScale, radialTextOffset); } function anchorIsTooClose(bucket , text , repeatDistance , anchor ) { var compareText = bucket.compareText; if (!(text in compareText)) { compareText[text] = []; } else { var otherAnchors = compareText[text]; for (var k = otherAnchors.length - 1; k >= 0; k--) { if (anchor.dist(otherAnchors[k]) < repeatDistance) { // If it's within repeatDistance of one anchor, stop looking return true; } } } // If anchor is not within repeatDistance of any other anchor, add to array compareText[text].push(anchor); return false; } exports.Actor = Actor; exports.AlphaImage = AlphaImage; exports.CanonicalTileID = CanonicalTileID; exports.CollisionBoxArray = CollisionBoxArray; exports.Color = Color; exports.DEMData = DEMData; exports.DataConstantProperty = DataConstantProperty; exports.DictionaryCoder = DictionaryCoder; exports.EXTENT = EXTENT; exports.ErrorEvent = ErrorEvent; exports.EvaluationParameters = EvaluationParameters; exports.Event = Event; exports.Evented = Evented; exports.FeatureIndex = FeatureIndex; exports.FillBucket = FillBucket; exports.FillExtrusionBucket = FillExtrusionBucket; exports.ImageAtlas = ImageAtlas; exports.ImagePosition = ImagePosition; exports.LineBucket = LineBucket; exports.LngLat = LngLat; exports.LngLatBounds = LngLatBounds; exports.MercatorCoordinate = MercatorCoordinate; exports.ONE_EM = ONE_EM; exports.OverscaledTileID = OverscaledTileID; exports.Point = pointGeometry; exports.Point$1 = pointGeometry; exports.ProgramConfiguration = ProgramConfiguration; exports.Properties = Properties; exports.Protobuf = pbf; exports.RGBAImage = RGBAImage; exports.RequestManager = RequestManager; exports.ResourceType = ResourceType; exports.SegmentVector = SegmentVector; exports.SourceFeatureState = SourceFeatureState; exports.StructArrayLayout1ui2 = StructArrayLayout1ui2; exports.StructArrayLayout2i4 = StructArrayLayout2i4; exports.StructArrayLayout2ui4 = StructArrayLayout2ui4; exports.StructArrayLayout3ui6 = StructArrayLayout3ui6; exports.StructArrayLayout4i8 = StructArrayLayout4i8; exports.SymbolBucket = SymbolBucket; exports.Texture = Texture; exports.Tile = Tile; exports.Transitionable = Transitionable; exports.Uniform1f = Uniform1f; exports.Uniform1i = Uniform1i; exports.Uniform2f = Uniform2f; exports.Uniform3f = Uniform3f; exports.Uniform4f = Uniform4f; exports.UniformColor = UniformColor; exports.UniformMatrix4f = UniformMatrix4f; exports.UnwrappedTileID = UnwrappedTileID; exports.ValidationError = ValidationError; exports.WritingMode = WritingMode; exports.ZoomHistory = ZoomHistory; exports.addDynamicAttributes = addDynamicAttributes; exports.assert = assert_1; exports.asyncAll = asyncAll; exports.bezier = bezier; exports.bindAll = bindAll; exports.browser = exported; exports.clamp = clamp; exports.clone = clone$4; exports.clone$1 = clone; exports.config = config; exports.create = create$3; exports.create$1 = create$2; exports.create$2 = create; exports.createCommonjsModule = createCommonjsModule; exports.createExpression = createExpression; exports.createLayout = createLayout; exports.createStyleLayer = createStyleLayer; exports.deepEqual = deepEqual; exports.ease = ease; exports.emitValidationErrors = emitValidationErrors; exports.endsWith = endsWith; exports.evaluateRadialOffset = evaluateRadialOffset; exports.evaluateSizeForFeature = evaluateSizeForFeature; exports.evaluateSizeForZoom = evaluateSizeForZoom; exports.evented = evented; exports.extend = extend; exports.featureFilter = createFilter; exports.filterObject = filterObject; exports.fromRotation = fromRotation$2; exports.getAnchorAlignment = getAnchorAlignment; exports.getAnchorJustification = getAnchorJustification; exports.getArrayBuffer = getArrayBuffer; exports.getImage = getImage; exports.getJSON = getJSON; exports.getReferrer = getReferrer; exports.getVideo = getVideo; exports.identity = identity$3; exports.invert = invert$3; exports.isChar = unicodeBlockLookup; exports.isMapboxURL = isMapboxURL; exports.keysDifference = keysDifference; exports.makeRequest = makeRequest; exports.mapObject = mapObject; exports.mercatorXfromLng = mercatorXfromLng; exports.mercatorYfromLat = mercatorYfromLat; exports.mercatorZfromAltitude = mercatorZfromAltitude; exports.multiply = multiply$3; exports.mvt = vectorTile; exports.number = number; exports.ortho = ortho; exports.parseGlyphPBF = parseGlyphPBF; exports.pbf = pbf; exports.performSymbolLayout = performSymbolLayout; exports.perspective = perspective; exports.pick = pick; exports.plugin = plugin; exports.polygonIntersectsPolygon = polygonIntersectsPolygon; exports.postMapLoadEvent = postMapLoadEvent; exports.postTurnstileEvent = postTurnstileEvent; exports.potpack = potpack; exports.properties = properties$6; exports.rasterBoundsAttributes = rasterBoundsAttributes; exports.refProperties = refProperties; exports.register = register; exports.registerForPluginAvailability = registerForPluginAvailability; exports.rotate = rotate; exports.rotateX = rotateX; exports.rotateZ = rotateZ; exports.scale = scale$3; exports.setRTLTextPlugin = setRTLTextPlugin; exports.sphericalToCartesian = sphericalToCartesian; exports.styleSpec = spec; exports.symbolSize = symbolSize; exports.transformMat3 = transformMat3; exports.transformMat4 = transformMat4$1; exports.translate = translate$3; exports.uniqueId = uniqueId; exports.validateCustomStyleLayer = validateCustomStyleLayer; exports.validateLight = validateLight$1; exports.validateStyle = validateStyle; exports.values = values; exports.vectorTile = vectorTile; exports.version = version; exports.warnOnce = warnOnce; exports.webpSupported = exported$1; exports.window = self; exports.wrap = wrap; }); define(['./shared.js'], function (__chunk_1) { 'use strict'; function stringify(obj) { var type = typeof obj; if (type === 'number' || type === 'boolean' || type === 'string' || obj === undefined || obj === null) { return JSON.stringify(obj); } if (Array.isArray(obj)) { var str$1 = '['; for (var i$1 = 0, list = obj; i$1 < list.length; i$1 += 1) { var val = list[i$1]; str$1 += (stringify(val)) + ","; } return (str$1 + "]"); } var keys = Object.keys(obj).sort(); var str = '{'; for (var i = 0; i < keys.length; i++) { str += (JSON.stringify(keys[i])) + ":" + (stringify(obj[keys[i]])) + ","; } return (str + "}"); } function getKey(layer) { var key = ''; for (var i = 0, list = __chunk_1.refProperties; i < list.length; i += 1) { var k = list[i]; key += "/" + (stringify(layer[k])); } return key; } /** * Given an array of layers, return an array of arrays of layers where all * layers in each group have identical layout-affecting properties. These * are the properties that were formerly used by explicit `ref` mechanism * for layers: 'type', 'source', 'source-layer', 'minzoom', 'maxzoom', * 'filter', and 'layout'. * * The input is not modified. The output layers are references to the * input layers. * * @private * @param {Array} layers * @returns {Array>} */ function groupByLayout(layers) { var groups = {}; for (var i = 0; i < layers.length; i++) { var k = getKey(layers[i]); var group = groups[k]; if (!group) { group = groups[k] = []; } group.push(layers[i]); } var result = []; for (var k$1 in groups) { result.push(groups[k$1]); } return result; } // var StyleLayerIndex = function StyleLayerIndex(layerConfigs ) { if (layerConfigs) { this.replace(layerConfigs); } }; StyleLayerIndex.prototype.replace = function replace (layerConfigs ) { this._layerConfigs = {}; this._layers = {}; this.update(layerConfigs, []); }; StyleLayerIndex.prototype.update = function update (layerConfigs , removedIds ) { var this$1 = this; for (var i = 0, list = layerConfigs; i < list.length; i += 1) { var layerConfig = list[i]; this._layerConfigs[layerConfig.id] = layerConfig; var layer = this._layers[layerConfig.id] = __chunk_1.createStyleLayer(layerConfig); layer._featureFilter = __chunk_1.featureFilter(layer.filter); } for (var i$1 = 0, list$1 = removedIds; i$1 < list$1.length; i$1 += 1) { var id = list$1[i$1]; delete this._layerConfigs[id]; delete this._layers[id]; } this.familiesBySource = {}; var groups = groupByLayout(__chunk_1.values(this._layerConfigs)); for (var i$2 = 0, list$2 = groups; i$2 < list$2.length; i$2 += 1) { var layerConfigs$1 = list$2[i$2]; var layers = layerConfigs$1.map(function (layerConfig) { return this$1._layers[layerConfig.id]; }); var layer$1 = layers[0]; if (layer$1.visibility === 'none') { continue; } var sourceId = layer$1.source || ''; var sourceGroup = this.familiesBySource[sourceId]; if (!sourceGroup) { sourceGroup = this.familiesBySource[sourceId] = {}; } var sourceLayerId = layer$1.sourceLayer || '_geojsonTileLayer'; var sourceLayerFamilies = sourceGroup[sourceLayerId]; if (!sourceLayerFamilies) { sourceLayerFamilies = sourceGroup[sourceLayerId] = []; } sourceLayerFamilies.push(layers); } }; // var padding = 1; var GlyphAtlas = function GlyphAtlas(stacks ) { var positions = {}; var bins = []; for (var stack in stacks) { var glyphs = stacks[stack]; var stackPositions = positions[stack] = {}; for (var id in glyphs) { var src = glyphs[+id]; if (!src || src.bitmap.width === 0 || src.bitmap.height === 0) { continue; } var bin = { x: 0, y: 0, w: src.bitmap.width + 2 * padding, h: src.bitmap.height + 2 * padding }; bins.push(bin); stackPositions[id] = {rect: bin, metrics: src.metrics}; } } var ref = __chunk_1.potpack(bins); var w = ref.w; var h = ref.h; var image = new __chunk_1.AlphaImage({width: w || 1, height: h || 1}); for (var stack$1 in stacks) { var glyphs$1 = stacks[stack$1]; for (var id$1 in glyphs$1) { var src$1 = glyphs$1[+id$1]; if (!src$1 || src$1.bitmap.width === 0 || src$1.bitmap.height === 0) { continue; } var bin$1 = positions[stack$1][id$1].rect; __chunk_1.AlphaImage.copy(src$1.bitmap, image, {x: 0, y: 0}, {x: bin$1.x + padding, y: bin$1.y + padding}, src$1.bitmap); } } this.image = image; this.positions = positions; }; __chunk_1.register('GlyphAtlas', GlyphAtlas); // var WorkerTile = function WorkerTile(params ) { this.tileID = new __chunk_1.OverscaledTileID(params.tileID.overscaledZ, params.tileID.wrap, params.tileID.canonical.z, params.tileID.canonical.x, params.tileID.canonical.y); this.uid = params.uid; this.zoom = params.zoom; this.pixelRatio = params.pixelRatio; this.tileSize = params.tileSize; this.source = params.source; this.overscaling = this.tileID.overscaleFactor(); this.showCollisionBoxes = params.showCollisionBoxes; this.collectResourceTiming = !!params.collectResourceTiming; this.returnDependencies = !!params.returnDependencies; }; WorkerTile.prototype.parse = function parse (data , layerIndex , actor , callback ) { var this$1 = this; this.status = 'parsing'; this.data = data; this.collisionBoxArray = new __chunk_1.CollisionBoxArray(); var sourceLayerCoder = new __chunk_1.DictionaryCoder(Object.keys(data.layers).sort()); var featureIndex = new __chunk_1.FeatureIndex(this.tileID); featureIndex.bucketLayerIDs = []; var buckets = {}; var options = { featureIndex: featureIndex, iconDependencies: {}, patternDependencies: {}, glyphDependencies: {} }; var layerFamilies = layerIndex.familiesBySource[this.source]; for (var sourceLayerId in layerFamilies) { var sourceLayer = data.layers[sourceLayerId]; if (!sourceLayer) { continue; } if (sourceLayer.version === 1) { __chunk_1.warnOnce("Vector tile source \"" + (this.source) + "\" layer \"" + sourceLayerId + "\" " + "does not use vector tile spec v2 and therefore may have some rendering errors."); } var sourceLayerIndex = sourceLayerCoder.encode(sourceLayerId); var features = []; for (var index = 0; index < sourceLayer.length; index++) { var feature = sourceLayer.feature(index); features.push({ feature: feature, index: index, sourceLayerIndex: sourceLayerIndex }); } for (var i = 0, list = layerFamilies[sourceLayerId]; i < list.length; i += 1) { var family = list[i]; var layer = family[0]; __chunk_1.assert(layer.source === this.source); if (layer.minzoom && this.zoom < Math.floor(layer.minzoom)) { continue; } if (layer.maxzoom && this.zoom >= layer.maxzoom) { continue; } if (layer.visibility === 'none') { continue; } recalculateLayers(family, this.zoom); var bucket = buckets[layer.id] = layer.createBucket({ index: featureIndex.bucketLayerIDs.length, layers: family, zoom: this.zoom, pixelRatio: this.pixelRatio, overscaling: this.overscaling, collisionBoxArray: this.collisionBoxArray, sourceLayerIndex: sourceLayerIndex, sourceID: this.source }); bucket.populate(features, options); featureIndex.bucketLayerIDs.push(family.map(function (l) { return l.id; })); } } var error ; var glyphMap ; var iconMap ; var patternMap ; var stacks = __chunk_1.mapObject(options.glyphDependencies, function (glyphs) { return Object.keys(glyphs).map(Number); }); if (Object.keys(stacks).length) { actor.send('getGlyphs', {uid: this.uid, stacks: stacks}, function (err, result) { if (!error) { error = err; glyphMap = result; maybePrepare.call(this$1); } }); } else { glyphMap = {}; } var icons = Object.keys(options.iconDependencies); if (icons.length) { actor.send('getImages', {icons: icons}, function (err, result) { if (!error) { error = err; iconMap = result; maybePrepare.call(this$1); } }); } else { iconMap = {}; } var patterns = Object.keys(options.patternDependencies); if (patterns.length) { actor.send('getImages', {icons: patterns}, function (err, result) { if (!error) { error = err; patternMap = result; maybePrepare.call(this$1); } }); } else { patternMap = {}; } maybePrepare.call(this); function maybePrepare() { if (error) { return callback(error); } else if (glyphMap && iconMap && patternMap) { var glyphAtlas = new GlyphAtlas(glyphMap); var imageAtlas = new __chunk_1.ImageAtlas(iconMap, patternMap); for (var key in buckets) { var bucket = buckets[key]; if (bucket instanceof __chunk_1.SymbolBucket) { recalculateLayers(bucket.layers, this.zoom); __chunk_1.performSymbolLayout(bucket, glyphMap, glyphAtlas.positions, iconMap, imageAtlas.iconPositions, this.showCollisionBoxes); } else if (bucket.hasPattern && (bucket instanceof __chunk_1.LineBucket || bucket instanceof __chunk_1.FillBucket || bucket instanceof __chunk_1.FillExtrusionBucket)) { recalculateLayers(bucket.layers, this.zoom); bucket.addFeatures(options, imageAtlas.patternPositions); } } this.status = 'done'; callback(null, { buckets: __chunk_1.values(buckets).filter(function (b) { return !b.isEmpty(); }), featureIndex: featureIndex, collisionBoxArray: this.collisionBoxArray, glyphAtlasImage: glyphAtlas.image, imageAtlas: imageAtlas, // Only used for benchmarking: glyphMap: this.returnDependencies ? glyphMap : null, iconMap: this.returnDependencies ? iconMap : null, glyphPositions: this.returnDependencies ? glyphAtlas.positions : null }); } } }; function recalculateLayers(layers , zoom ) { // Layers are shared and may have been used by a WorkerTile with a different zoom. var parameters = new __chunk_1.EvaluationParameters(zoom); for (var i = 0, list = layers; i < list.length; i += 1) { var layer = list[i]; layer.recalculate(parameters); } } // // Wraps performance to facilitate testing // Not incorporated into browser.js because the latter is poisonous when used outside the main thread var performanceExists = typeof performance !== 'undefined'; var wrapper = {}; wrapper.getEntriesByName = function (url ) { if (performanceExists && performance && performance.getEntriesByName) { return performance.getEntriesByName(url); } else { return false; } }; wrapper.mark = function (name ) { if (performanceExists && performance && performance.mark) { return performance.mark(name); } else { return false; } }; wrapper.measure = function (name , startMark , endMark ) { if (performanceExists && performance && performance.measure) { return performance.measure(name, startMark, endMark); } else { return false; } }; wrapper.clearMarks = function (name ) { if (performanceExists && performance && performance.clearMarks) { return performance.clearMarks(name); } else { return false; } }; wrapper.clearMeasures = function (name ) { if (performanceExists && performance && performance.clearMeasures) { return performance.clearMeasures(name); } else { return false; } }; /** * Safe wrapper for the performance resource timing API in web workers with graceful degradation * * @param {RequestParameters} request * @private */ var Performance = function Performance (request ) { this._marks = { start: [request.url, 'start'].join('#'), end: [request.url, 'end'].join('#'), measure: request.url.toString() }; wrapper.mark(this._marks.start); }; Performance.prototype.finish = function finish () { wrapper.mark(this._marks.end); var resourceTimingData = wrapper.getEntriesByName(this._marks.measure); // fallback if web worker implementation of perf.getEntriesByName returns empty if (resourceTimingData.length === 0) { wrapper.measure(this._marks.measure, this._marks.start, this._marks.end); resourceTimingData = wrapper.getEntriesByName(this._marks.measure); // cleanup wrapper.clearMarks(this._marks.start); wrapper.clearMarks(this._marks.end); wrapper.clearMeasures(this._marks.measure); } return resourceTimingData; }; wrapper.Performance = Performance; // /** * @callback LoadVectorDataCallback * @param error * @param vectorTile * @private */ /** * @private */ function loadVectorTile(params , callback ) { var request = __chunk_1.getArrayBuffer(params.request, function (err , data , cacheControl , expires ) { if (err) { callback(err); } else if (data) { callback(null, { vectorTile: new __chunk_1.vectorTile.VectorTile(new __chunk_1.pbf(data)), rawData: data, cacheControl: cacheControl, expires: expires }); } }); return function () { request.cancel(); callback(); }; } /** * The {@link WorkerSource} implementation that supports {@link VectorTileSource}. * This class is designed to be easily reused to support custom source types * for data formats that can be parsed/converted into an in-memory VectorTile * representation. To do so, create it with * `new VectorTileWorkerSource(actor, styleLayers, customLoadVectorDataFunction)`. * * @private */ var VectorTileWorkerSource = function VectorTileWorkerSource(actor , layerIndex , loadVectorData ) { this.actor = actor; this.layerIndex = layerIndex; this.loadVectorData = loadVectorData || loadVectorTile; this.loading = {}; this.loaded = {}; }; /** * Implements {@link WorkerSource#loadTile}. Delegates to * {@link VectorTileWorkerSource#loadVectorData} (which by default expects * a `params.url` property) for fetching and producing a VectorTile object. */ VectorTileWorkerSource.prototype.loadTile = function loadTile (params , callback ) { var this$1 = this; var uid = params.uid; if (!this.loading) { this.loading = {}; } var perf = (params && params.request && params.request.collectResourceTiming) ? new wrapper.Performance(params.request) : false; var workerTile = this.loading[uid] = new WorkerTile(params); workerTile.abort = this.loadVectorData(params, function (err, response) { delete this$1.loading[uid]; if (err || !response) { workerTile.status = 'done'; this$1.loaded[uid] = workerTile; return callback(err); } var rawTileData = response.rawData; var cacheControl = {}; if (response.expires) { cacheControl.expires = response.expires; } if (response.cacheControl) { cacheControl.cacheControl = response.cacheControl; } var resourceTiming = {}; if (perf) { var resourceTimingData = perf.finish(); // it's necessary to eval the result of getEntriesByName() here via parse/stringify // late evaluation in the main thread causes TypeError: illegal invocation if (resourceTimingData) { resourceTiming.resourceTiming = JSON.parse(JSON.stringify(resourceTimingData)); } } workerTile.vectorTile = response.vectorTile; workerTile.parse(response.vectorTile, this$1.layerIndex, this$1.actor, function (err, result) { if (err || !result) { return callback(err); } // Transferring a copy of rawTileData because the worker needs to retain its copy. callback(null, __chunk_1.extend({rawTileData: rawTileData.slice(0)}, result, cacheControl, resourceTiming)); }); this$1.loaded = this$1.loaded || {}; this$1.loaded[uid] = workerTile; }); }; /** * Implements {@link WorkerSource#reloadTile}. */ VectorTileWorkerSource.prototype.reloadTile = function reloadTile (params , callback ) { var loaded = this.loaded, uid = params.uid, vtSource = this; if (loaded && loaded[uid]) { var workerTile = loaded[uid]; workerTile.showCollisionBoxes = params.showCollisionBoxes; var done = function (err, data) { var reloadCallback = workerTile.reloadCallback; if (reloadCallback) { delete workerTile.reloadCallback; workerTile.parse(workerTile.vectorTile, vtSource.layerIndex, vtSource.actor, reloadCallback); } callback(err, data); }; if (workerTile.status === 'parsing') { workerTile.reloadCallback = done; } else if (workerTile.status === 'done') { // if there was no vector tile data on the initial load, don't try and re-parse tile if (workerTile.vectorTile) { workerTile.parse(workerTile.vectorTile, this.layerIndex, this.actor, done); } else { done(); } } } }; /** * Implements {@link WorkerSource#abortTile}. * * @param params * @param params.uid The UID for this tile. */ VectorTileWorkerSource.prototype.abortTile = function abortTile (params , callback ) { var loading = this.loading, uid = params.uid; if (loading && loading[uid] && loading[uid].abort) { loading[uid].abort(); delete loading[uid]; } callback(); }; /** * Implements {@link WorkerSource#removeTile}. * * @param params * @param params.uid The UID for this tile. */ VectorTileWorkerSource.prototype.removeTile = function removeTile (params , callback ) { var loaded = this.loaded, uid = params.uid; if (loaded && loaded[uid]) { delete loaded[uid]; } callback(); }; // var RasterDEMTileWorkerSource = function RasterDEMTileWorkerSource() { this.loaded = {}; }; RasterDEMTileWorkerSource.prototype.loadTile = function loadTile (params , callback ) { var uid = params.uid; var encoding = params.encoding; var rawImageData = params.rawImageData; var dem = new __chunk_1.DEMData(uid, rawImageData, encoding); this.loaded = this.loaded || {}; this.loaded[uid] = dem; callback(null, dem); }; RasterDEMTileWorkerSource.prototype.removeTile = function removeTile (params ) { var loaded = this.loaded, uid = params.uid; if (loaded && loaded[uid]) { delete loaded[uid]; } }; var RADIUS = 6378137; var FLATTENING = 1/298.257223563; var POLAR_RADIUS = 6356752.3142; var wgs84 = { RADIUS: RADIUS, FLATTENING: FLATTENING, POLAR_RADIUS: POLAR_RADIUS }; var geometry_1 = geometry; var ring = ringArea; function geometry(_) { var area = 0, i; switch (_.type) { case 'Polygon': return polygonArea(_.coordinates); case 'MultiPolygon': for (i = 0; i < _.coordinates.length; i++) { area += polygonArea(_.coordinates[i]); } return area; case 'Point': case 'MultiPoint': case 'LineString': case 'MultiLineString': return 0; case 'GeometryCollection': for (i = 0; i < _.geometries.length; i++) { area += geometry(_.geometries[i]); } return area; } } function polygonArea(coords) { var area = 0; if (coords && coords.length > 0) { area += Math.abs(ringArea(coords[0])); for (var i = 1; i < coords.length; i++) { area -= Math.abs(ringArea(coords[i])); } } return area; } /** * Calculate the approximate area of the polygon were it projected onto * the earth. Note that this area will be positive if ring is oriented * clockwise, otherwise it will be negative. * * Reference: * Robert. G. Chamberlain and William H. Duquette, "Some Algorithms for * Polygons on a Sphere", JPL Publication 07-03, Jet Propulsion * Laboratory, Pasadena, CA, June 2007 http://trs-new.jpl.nasa.gov/dspace/handle/2014/40409 * * Returns: * {float} The approximate signed geodesic area of the polygon in square * meters. */ function ringArea(coords) { var p1, p2, p3, lowerIndex, middleIndex, upperIndex, i, area = 0, coordsLength = coords.length; if (coordsLength > 2) { for (i = 0; i < coordsLength; i++) { if (i === coordsLength - 2) {// i = N-2 lowerIndex = coordsLength - 2; middleIndex = coordsLength -1; upperIndex = 0; } else if (i === coordsLength - 1) {// i = N-1 lowerIndex = coordsLength - 1; middleIndex = 0; upperIndex = 1; } else { // i = 0 to N-3 lowerIndex = i; middleIndex = i+1; upperIndex = i+2; } p1 = coords[lowerIndex]; p2 = coords[middleIndex]; p3 = coords[upperIndex]; area += ( rad(p3[0]) - rad(p1[0]) ) * Math.sin( rad(p2[1])); } area = area * wgs84.RADIUS * wgs84.RADIUS / 2; } return area; } function rad(_) { return _ * Math.PI / 180; } var geojsonArea = { geometry: geometry_1, ring: ring }; var geojsonRewind = rewind; function rewind(gj, outer) { switch ((gj && gj.type) || null) { case 'FeatureCollection': gj.features = gj.features.map(curryOuter(rewind, outer)); return gj; case 'GeometryCollection': gj.geometries = gj.geometries.map(curryOuter(rewind, outer)); return gj; case 'Feature': gj.geometry = rewind(gj.geometry, outer); return gj; case 'Polygon': case 'MultiPolygon': return correct(gj, outer); default: return gj; } } function curryOuter(a, b) { return function(_) { return a(_, b); }; } function correct(_, outer) { if (_.type === 'Polygon') { _.coordinates = correctRings(_.coordinates, outer); } else if (_.type === 'MultiPolygon') { _.coordinates = _.coordinates.map(curryOuter(correctRings, outer)); } return _; } function correctRings(_, outer) { outer = !!outer; _[0] = wind(_[0], outer); for (var i = 1; i < _.length; i++) { _[i] = wind(_[i], !outer); } return _; } function wind(_, dir) { return cw(_) === dir ? _ : _.reverse(); } function cw(_) { return geojsonArea.ring(_) >= 0; } // var toGeoJSON = __chunk_1.vectorTile.VectorTileFeature.prototype.toGeoJSON; // The feature type used by geojson-vt and supercluster. Should be extracted to // global type and used in module definitions for those two modules. var FeatureWrapper = function FeatureWrapper(feature ) { this._feature = feature; this.extent = __chunk_1.EXTENT; this.type = feature.type; this.properties = feature.tags; // If the feature has a top-level `id` property, copy it over, but only // if it can be coerced to an integer, because this wrapper is used for // serializing geojson feature data into vector tile PBF data, and the // vector tile spec only supports integer values for feature ids -- // allowing non-integer values here results in a non-compliant PBF // that causes an exception when it is parsed with vector-tile-js if ('id' in feature && !isNaN(feature.id)) { this.id = parseInt(feature.id, 10); } }; FeatureWrapper.prototype.loadGeometry = function loadGeometry () { if (this._feature.type === 1) { var geometry = []; for (var i = 0, list = this._feature.geometry; i < list.length; i += 1) { var point = list[i]; geometry.push([new __chunk_1.Point$1(point[0], point[1])]); } return geometry; } else { var geometry$1 = []; for (var i$2 = 0, list$2 = this._feature.geometry; i$2 < list$2.length; i$2 += 1) { var ring = list$2[i$2]; var newRing = []; for (var i$1 = 0, list$1 = ring; i$1 < list$1.length; i$1 += 1) { var point$1 = list$1[i$1]; newRing.push(new __chunk_1.Point$1(point$1[0], point$1[1])); } geometry$1.push(newRing); } return geometry$1; } }; FeatureWrapper.prototype.toGeoJSON = function toGeoJSON$1 (x , y , z ) { return toGeoJSON.call(this, x, y, z); }; var GeoJSONWrapper = function GeoJSONWrapper(features ) { this.layers = { '_geojsonTileLayer': this }; this.name = '_geojsonTileLayer'; this.extent = __chunk_1.EXTENT; this.length = features.length; this._features = features; }; GeoJSONWrapper.prototype.feature = function feature (i ) { return new FeatureWrapper(this._features[i]); }; 'use strict'; var VectorTileFeature = __chunk_1.vectorTile.VectorTileFeature; var geojson_wrapper = GeoJSONWrapper$1; // conform to vectortile api function GeoJSONWrapper$1 (features, options) { this.options = options || {}; this.features = features; this.length = features.length; } GeoJSONWrapper$1.prototype.feature = function (i) { return new FeatureWrapper$1(this.features[i], this.options.extent) }; function FeatureWrapper$1 (feature, extent) { this.id = typeof feature.id === 'number' ? feature.id : undefined; this.type = feature.type; this.rawGeometry = feature.type === 1 ? [feature.geometry] : feature.geometry; this.properties = feature.tags; this.extent = extent || 4096; } FeatureWrapper$1.prototype.loadGeometry = function () { var rings = this.rawGeometry; this.geometry = []; for (var i = 0; i < rings.length; i++) { var ring = rings[i]; var newRing = []; for (var j = 0; j < ring.length; j++) { newRing.push(new __chunk_1.Point$1(ring[j][0], ring[j][1])); } this.geometry.push(newRing); } return this.geometry }; FeatureWrapper$1.prototype.bbox = function () { if (!this.geometry) { this.loadGeometry(); } var rings = this.geometry; var x1 = Infinity; var x2 = -Infinity; var y1 = Infinity; var y2 = -Infinity; for (var i = 0; i < rings.length; i++) { var ring = rings[i]; for (var j = 0; j < ring.length; j++) { var coord = ring[j]; x1 = Math.min(x1, coord.x); x2 = Math.max(x2, coord.x); y1 = Math.min(y1, coord.y); y2 = Math.max(y2, coord.y); } } return [x1, y1, x2, y2] }; FeatureWrapper$1.prototype.toGeoJSON = VectorTileFeature.prototype.toGeoJSON; var vtPbf = fromVectorTileJs; var fromVectorTileJs_1 = fromVectorTileJs; var fromGeojsonVt_1 = fromGeojsonVt; var GeoJSONWrapper_1 = geojson_wrapper; /** * Serialize a vector-tile-js-created tile to pbf * * @param {Object} tile * @return {Buffer} uncompressed, pbf-serialized tile data */ function fromVectorTileJs (tile) { var out = new __chunk_1.pbf(); writeTile(tile, out); return out.finish() } /** * Serialized a geojson-vt-created tile to pbf. * * @param {Object} layers - An object mapping layer names to geojson-vt-created vector tile objects * @param {Object} [options] - An object specifying the vector-tile specification version and extent that were used to create `layers`. * @param {Number} [options.version=1] - Version of vector-tile spec used * @param {Number} [options.extent=4096] - Extent of the vector tile * @return {Buffer} uncompressed, pbf-serialized tile data */ function fromGeojsonVt (layers, options) { options = options || {}; var l = {}; for (var k in layers) { l[k] = new geojson_wrapper(layers[k].features, options); l[k].name = k; l[k].version = options.version; l[k].extent = options.extent; } return fromVectorTileJs({layers: l}) } function writeTile (tile, pbf) { for (var key in tile.layers) { pbf.writeMessage(3, writeLayer, tile.layers[key]); } } function writeLayer (layer, pbf) { pbf.writeVarintField(15, layer.version || 1); pbf.writeStringField(1, layer.name || ''); pbf.writeVarintField(5, layer.extent || 4096); var i; var context = { keys: [], values: [], keycache: {}, valuecache: {} }; for (i = 0; i < layer.length; i++) { context.feature = layer.feature(i); pbf.writeMessage(2, writeFeature, context); } var keys = context.keys; for (i = 0; i < keys.length; i++) { pbf.writeStringField(3, keys[i]); } var values = context.values; for (i = 0; i < values.length; i++) { pbf.writeMessage(4, writeValue, values[i]); } } function writeFeature (context, pbf) { var feature = context.feature; if (feature.id !== undefined) { pbf.writeVarintField(1, feature.id); } pbf.writeMessage(2, writeProperties, context); pbf.writeVarintField(3, feature.type); pbf.writeMessage(4, writeGeometry, feature); } function writeProperties (context, pbf) { var feature = context.feature; var keys = context.keys; var values = context.values; var keycache = context.keycache; var valuecache = context.valuecache; for (var key in feature.properties) { var keyIndex = keycache[key]; if (typeof keyIndex === 'undefined') { keys.push(key); keyIndex = keys.length - 1; keycache[key] = keyIndex; } pbf.writeVarint(keyIndex); var value = feature.properties[key]; var type = typeof value; if (type !== 'string' && type !== 'boolean' && type !== 'number') { value = JSON.stringify(value); } var valueKey = type + ':' + value; var valueIndex = valuecache[valueKey]; if (typeof valueIndex === 'undefined') { values.push(value); valueIndex = values.length - 1; valuecache[valueKey] = valueIndex; } pbf.writeVarint(valueIndex); } } function command (cmd, length) { return (length << 3) + (cmd & 0x7) } function zigzag (num) { return (num << 1) ^ (num >> 31) } function writeGeometry (feature, pbf) { var geometry = feature.loadGeometry(); var type = feature.type; var x = 0; var y = 0; var rings = geometry.length; for (var r = 0; r < rings; r++) { var ring = geometry[r]; var count = 1; if (type === 1) { count = ring.length; } pbf.writeVarint(command(1, count)); // moveto // do not write polygon closing path as lineto var lineCount = type === 3 ? ring.length - 1 : ring.length; for (var i = 0; i < lineCount; i++) { if (i === 1 && type !== 1) { pbf.writeVarint(command(2, lineCount - 1)); // lineto } var dx = ring[i].x - x; var dy = ring[i].y - y; pbf.writeVarint(zigzag(dx)); pbf.writeVarint(zigzag(dy)); x += dx; y += dy; } if (type === 3) { pbf.writeVarint(command(7, 1)); // closepath } } } function writeValue (value, pbf) { var type = typeof value; if (type === 'string') { pbf.writeStringField(1, value); } else if (type === 'boolean') { pbf.writeBooleanField(7, value); } else if (type === 'number') { if (value % 1 !== 0) { pbf.writeDoubleField(3, value); } else if (value < 0) { pbf.writeSVarintField(6, value); } else { pbf.writeVarintField(5, value); } } } vtPbf.fromVectorTileJs = fromVectorTileJs_1; vtPbf.fromGeojsonVt = fromGeojsonVt_1; vtPbf.GeoJSONWrapper = GeoJSONWrapper_1; function sortKD(ids, coords, nodeSize, left, right, depth) { if (right - left <= nodeSize) { return; } var m = (left + right) >> 1; select(ids, coords, m, left, right, depth % 2); sortKD(ids, coords, nodeSize, left, m - 1, depth + 1); sortKD(ids, coords, nodeSize, m + 1, right, depth + 1); } function select(ids, coords, k, left, right, inc) { while (right > left) { if (right - left > 600) { var n = right - left + 1; var m = k - left + 1; var z = Math.log(n); var s = 0.5 * Math.exp(2 * z / 3); var sd = 0.5 * Math.sqrt(z * s * (n - s) / n) * (m - n / 2 < 0 ? -1 : 1); var newLeft = Math.max(left, Math.floor(k - m * s / n + sd)); var newRight = Math.min(right, Math.floor(k + (n - m) * s / n + sd)); select(ids, coords, k, newLeft, newRight, inc); } var t = coords[2 * k + inc]; var i = left; var j = right; swapItem(ids, coords, left, k); if (coords[2 * right + inc] > t) { swapItem(ids, coords, left, right); } while (i < j) { swapItem(ids, coords, i, j); i++; j--; while (coords[2 * i + inc] < t) { i++; } while (coords[2 * j + inc] > t) { j--; } } if (coords[2 * left + inc] === t) { swapItem(ids, coords, left, j); } else { j++; swapItem(ids, coords, j, right); } if (j <= k) { left = j + 1; } if (k <= j) { right = j - 1; } } } function swapItem(ids, coords, i, j) { swap(ids, i, j); swap(coords, 2 * i, 2 * j); swap(coords, 2 * i + 1, 2 * j + 1); } function swap(arr, i, j) { var tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; } function range(ids, coords, minX, minY, maxX, maxY, nodeSize) { var stack = [0, ids.length - 1, 0]; var result = []; var x, y; while (stack.length) { var axis = stack.pop(); var right = stack.pop(); var left = stack.pop(); if (right - left <= nodeSize) { for (var i = left; i <= right; i++) { x = coords[2 * i]; y = coords[2 * i + 1]; if (x >= minX && x <= maxX && y >= minY && y <= maxY) { result.push(ids[i]); } } continue; } var m = Math.floor((left + right) / 2); x = coords[2 * m]; y = coords[2 * m + 1]; if (x >= minX && x <= maxX && y >= minY && y <= maxY) { result.push(ids[m]); } var nextAxis = (axis + 1) % 2; if (axis === 0 ? minX <= x : minY <= y) { stack.push(left); stack.push(m - 1); stack.push(nextAxis); } if (axis === 0 ? maxX >= x : maxY >= y) { stack.push(m + 1); stack.push(right); stack.push(nextAxis); } } return result; } function within(ids, coords, qx, qy, r, nodeSize) { var stack = [0, ids.length - 1, 0]; var result = []; var r2 = r * r; while (stack.length) { var axis = stack.pop(); var right = stack.pop(); var left = stack.pop(); if (right - left <= nodeSize) { for (var i = left; i <= right; i++) { if (sqDist(coords[2 * i], coords[2 * i + 1], qx, qy) <= r2) { result.push(ids[i]); } } continue; } var m = Math.floor((left + right) / 2); var x = coords[2 * m]; var y = coords[2 * m + 1]; if (sqDist(x, y, qx, qy) <= r2) { result.push(ids[m]); } var nextAxis = (axis + 1) % 2; if (axis === 0 ? qx - r <= x : qy - r <= y) { stack.push(left); stack.push(m - 1); stack.push(nextAxis); } if (axis === 0 ? qx + r >= x : qy + r >= y) { stack.push(m + 1); stack.push(right); stack.push(nextAxis); } } return result; } function sqDist(ax, ay, bx, by) { var dx = ax - bx; var dy = ay - by; return dx * dx + dy * dy; } var defaultGetX = function (p) { return p[0]; }; var defaultGetY = function (p) { return p[1]; }; var KDBush = function KDBush(points, getX, getY, nodeSize, ArrayType) { if ( getX === void 0 ) getX = defaultGetX; if ( getY === void 0 ) getY = defaultGetY; if ( nodeSize === void 0 ) nodeSize = 64; if ( ArrayType === void 0 ) ArrayType = Float64Array; this.nodeSize = nodeSize; this.points = points; var IndexArrayType = points.length < 65536 ? Uint16Array : Uint32Array; var ids = this.ids = new IndexArrayType(points.length); var coords = this.coords = new ArrayType(points.length * 2); for (var i = 0; i < points.length; i++) { ids[i] = i; coords[2 * i] = getX(points[i]); coords[2 * i + 1] = getY(points[i]); } sortKD(ids, coords, nodeSize, 0, ids.length - 1, 0); }; KDBush.prototype.range = function range$1 (minX, minY, maxX, maxY) { return range(this.ids, this.coords, minX, minY, maxX, maxY, this.nodeSize); }; KDBush.prototype.within = function within$1 (x, y, r) { return within(this.ids, this.coords, x, y, r, this.nodeSize); }; var defaultOptions = { minZoom: 0, // min zoom to generate clusters on maxZoom: 16, // max zoom level to cluster the points on radius: 40, // cluster radius in pixels extent: 512, // tile extent (radius is calculated relative to it) nodeSize: 64, // size of the KD-tree leaf node, affects performance log: false, // whether to log timing info // a reduce function for calculating custom cluster properties reduce: null, // (accumulated, props) => { accumulated.sum += props.sum; } // properties to use for individual points when running the reducer map: function (props) { return props; } // props => ({sum: props.my_value}) }; var Supercluster = function Supercluster(options) { this.options = extend(Object.create(defaultOptions), options); this.trees = new Array(this.options.maxZoom + 1); }; Supercluster.prototype.load = function load (points) { var ref = this.options; var log = ref.log; var minZoom = ref.minZoom; var maxZoom = ref.maxZoom; var nodeSize = ref.nodeSize; if (log) { console.time('total time'); } var timerId = "prepare " + (points.length) + " points"; if (log) { console.time(timerId); } this.points = points; // generate a cluster object for each point and index input points into a KD-tree var clusters = []; for (var i = 0; i < points.length; i++) { if (!points[i].geometry) { continue; } clusters.push(createPointCluster(points[i], i)); } this.trees[maxZoom + 1] = new KDBush(clusters, getX, getY, nodeSize, Float32Array); if (log) { console.timeEnd(timerId); } // cluster points on max zoom, then cluster the results on previous zoom, etc.; // results in a cluster hierarchy across zoom levels for (var z = maxZoom; z >= minZoom; z--) { var now = +Date.now(); // create a new set of clusters for the zoom and index them with a KD-tree clusters = this._cluster(clusters, z); this.trees[z] = new KDBush(clusters, getX, getY, nodeSize, Float32Array); if (log) { console.log('z%d: %d clusters in %dms', z, clusters.length, +Date.now() - now); } } if (log) { console.timeEnd('total time'); } return this; }; Supercluster.prototype.getClusters = function getClusters (bbox, zoom) { var minLng = ((bbox[0] + 180) % 360 + 360) % 360 - 180; var minLat = Math.max(-90, Math.min(90, bbox[1])); var maxLng = bbox[2] === 180 ? 180 : ((bbox[2] + 180) % 360 + 360) % 360 - 180; var maxLat = Math.max(-90, Math.min(90, bbox[3])); if (bbox[2] - bbox[0] >= 360) { minLng = -180; maxLng = 180; } else if (minLng > maxLng) { var easternHem = this.getClusters([minLng, minLat, 180, maxLat], zoom); var westernHem = this.getClusters([-180, minLat, maxLng, maxLat], zoom); return easternHem.concat(westernHem); } var tree = this.trees[this._limitZoom(zoom)]; var ids = tree.range(lngX(minLng), latY(maxLat), lngX(maxLng), latY(minLat)); var clusters = []; for (var i = 0, list = ids; i < list.length; i += 1) { var id = list[i]; var c = tree.points[id]; clusters.push(c.numPoints ? getClusterJSON(c) : this.points[c.index]); } return clusters; }; Supercluster.prototype.getChildren = function getChildren (clusterId) { var originId = clusterId >> 5; var originZoom = clusterId % 32; var errorMsg = 'No cluster with the specified id.'; var index = this.trees[originZoom]; if (!index) { throw new Error(errorMsg); } var origin = index.points[originId]; if (!origin) { throw new Error(errorMsg); } var r = this.options.radius / (this.options.extent * Math.pow(2, originZoom - 1)); var ids = index.within(origin.x, origin.y, r); var children = []; for (var i = 0, list = ids; i < list.length; i += 1) { var id = list[i]; var c = index.points[id]; if (c.parentId === clusterId) { children.push(c.numPoints ? getClusterJSON(c) : this.points[c.index]); } } if (children.length === 0) { throw new Error(errorMsg); } return children; }; Supercluster.prototype.getLeaves = function getLeaves (clusterId, limit, offset) { limit = limit || 10; offset = offset || 0; var leaves = []; this._appendLeaves(leaves, clusterId, limit, offset, 0); return leaves; }; Supercluster.prototype.getTile = function getTile (z, x, y) { var tree = this.trees[this._limitZoom(z)]; var z2 = Math.pow(2, z); var ref = this.options; var extent = ref.extent; var radius = ref.radius; var p = radius / extent; var top = (y - p) / z2; var bottom = (y + 1 + p) / z2; var tile = { features: [] }; this._addTileFeatures( tree.range((x - p) / z2, top, (x + 1 + p) / z2, bottom), tree.points, x, y, z2, tile); if (x === 0) { this._addTileFeatures( tree.range(1 - p / z2, top, 1, bottom), tree.points, z2, y, z2, tile); } if (x === z2 - 1) { this._addTileFeatures( tree.range(0, top, p / z2, bottom), tree.points, -1, y, z2, tile); } return tile.features.length ? tile : null; }; Supercluster.prototype.getClusterExpansionZoom = function getClusterExpansionZoom (clusterId) { var clusterZoom = (clusterId % 32) - 1; while (clusterZoom <= this.options.maxZoom) { var children = this.getChildren(clusterId); clusterZoom++; if (children.length !== 1) { break; } clusterId = children[0].properties.cluster_id; } return clusterZoom; }; Supercluster.prototype._appendLeaves = function _appendLeaves (result, clusterId, limit, offset, skipped) { var children = this.getChildren(clusterId); for (var i = 0, list = children; i < list.length; i += 1) { var child = list[i]; var props = child.properties; if (props && props.cluster) { if (skipped + props.point_count <= offset) { // skip the whole cluster skipped += props.point_count; } else { // enter the cluster skipped = this._appendLeaves(result, props.cluster_id, limit, offset, skipped); // exit the cluster } } else if (skipped < offset) { // skip a single point skipped++; } else { // add a single point result.push(child); } if (result.length === limit) { break; } } return skipped; }; Supercluster.prototype._addTileFeatures = function _addTileFeatures (ids, points, x, y, z2, tile) { for (var i$1 = 0, list = ids; i$1 < list.length; i$1 += 1) { var i = list[i$1]; var c = points[i]; var f = { type: 1, geometry: [[ Math.round(this.options.extent * (c.x * z2 - x)), Math.round(this.options.extent * (c.y * z2 - y)) ]], tags: c.numPoints ? getClusterProperties(c) : this.points[c.index].properties }; var id = c.numPoints ? c.id : this.points[c.index].id; if (id !== undefined) { f.id = id; } tile.features.push(f); } }; Supercluster.prototype._limitZoom = function _limitZoom (z) { return Math.max(this.options.minZoom, Math.min(z, this.options.maxZoom + 1)); }; Supercluster.prototype._cluster = function _cluster (points, zoom) { var clusters = []; var ref = this.options; var radius = ref.radius; var extent = ref.extent; var reduce = ref.reduce; var r = radius / (extent * Math.pow(2, zoom)); // loop through each point for (var i = 0; i < points.length; i++) { var p = points[i]; // if we've already visited the point at this zoom level, skip it if (p.zoom <= zoom) { continue; } p.zoom = zoom; // find all nearby points var tree = this.trees[zoom + 1]; var neighborIds = tree.within(p.x, p.y, r); var numPoints = p.numPoints || 1; var wx = p.x * numPoints; var wy = p.y * numPoints; var clusterProperties = reduce ? this._map(p, true) : null; // encode both zoom and point index on which the cluster originated var id = (i << 5) + (zoom + 1); for (var i$1 = 0, list = neighborIds; i$1 < list.length; i$1 += 1) { var neighborId = list[i$1]; var b = tree.points[neighborId]; // filter out neighbors that are already processed if (b.zoom <= zoom) { continue; } b.zoom = zoom; // save the zoom (so it doesn't get processed twice) var numPoints2 = b.numPoints || 1; wx += b.x * numPoints2; // accumulate coordinates for calculating weighted center wy += b.y * numPoints2; numPoints += numPoints2; b.parentId = id; if (reduce) { reduce(clusterProperties, this._map(b)); } } if (numPoints === 1) { clusters.push(p); } else { p.parentId = id; clusters.push(createCluster(wx / numPoints, wy / numPoints, id, numPoints, clusterProperties)); } } return clusters; }; Supercluster.prototype._map = function _map (point, clone) { if (point.numPoints) { return clone ? extend({}, point.properties) : point.properties; } var original = this.points[point.index].properties; var result = this.options.map(original); return clone && result === original ? extend({}, result) : result; }; function createCluster(x, y, id, numPoints, properties) { return { x: x, // weighted cluster center y: y, zoom: Infinity, // the last zoom the cluster was processed at id: id, // encodes index of the first child of the cluster and its zoom level parentId: -1, // parent cluster id numPoints: numPoints, properties: properties }; } function createPointCluster(p, id) { var ref = p.geometry.coordinates; var x = ref[0]; var y = ref[1]; return { x: lngX(x), // projected point coordinates y: latY(y), zoom: Infinity, // the last zoom the point was processed at index: id, // index of the source feature in the original input array, parentId: -1 // parent cluster id }; } function getClusterJSON(cluster) { return { type: 'Feature', id: cluster.id, properties: getClusterProperties(cluster), geometry: { type: 'Point', coordinates: [xLng(cluster.x), yLat(cluster.y)] } }; } function getClusterProperties(cluster) { var count = cluster.numPoints; var abbrev = count >= 10000 ? ((Math.round(count / 1000)) + "k") : count >= 1000 ? ((Math.round(count / 100) / 10) + "k") : count; return extend(extend({}, cluster.properties), { cluster: true, cluster_id: cluster.id, point_count: count, point_count_abbreviated: abbrev }); } // longitude/latitude to spherical mercator in [0..1] range function lngX(lng) { return lng / 360 + 0.5; } function latY(lat) { var sin = Math.sin(lat * Math.PI / 180); var y = (0.5 - 0.25 * Math.log((1 + sin) / (1 - sin)) / Math.PI); return y < 0 ? 0 : y > 1 ? 1 : y; } // spherical mercator to longitude/latitude function xLng(x) { return (x - 0.5) * 360; } function yLat(y) { var y2 = (180 - y * 360) * Math.PI / 180; return 360 * Math.atan(Math.exp(y2)) / Math.PI - 90; } function extend(dest, src) { for (var id in src) { dest[id] = src[id]; } return dest; } function getX(p) { return p.x; } function getY(p) { return p.y; } // calculate simplification data using optimized Douglas-Peucker algorithm function simplify(coords, first, last, sqTolerance) { var maxSqDist = sqTolerance; var mid = (last - first) >> 1; var minPosToMid = last - first; var index; var ax = coords[first]; var ay = coords[first + 1]; var bx = coords[last]; var by = coords[last + 1]; for (var i = first + 3; i < last; i += 3) { var d = getSqSegDist(coords[i], coords[i + 1], ax, ay, bx, by); if (d > maxSqDist) { index = i; maxSqDist = d; } else if (d === maxSqDist) { // a workaround to ensure we choose a pivot close to the middle of the list, // reducing recursion depth, for certain degenerate inputs // https://github.com/mapbox/geojson-vt/issues/104 var posToMid = Math.abs(i - mid); if (posToMid < minPosToMid) { index = i; minPosToMid = posToMid; } } } if (maxSqDist > sqTolerance) { if (index - first > 3) { simplify(coords, first, index, sqTolerance); } coords[index + 2] = maxSqDist; if (last - index > 3) { simplify(coords, index, last, sqTolerance); } } } // square distance from a point to a segment function getSqSegDist(px, py, x, y, bx, by) { var dx = bx - x; var dy = by - y; if (dx !== 0 || dy !== 0) { var t = ((px - x) * dx + (py - y) * dy) / (dx * dx + dy * dy); if (t > 1) { x = bx; y = by; } else if (t > 0) { x += dx * t; y += dy * t; } } dx = px - x; dy = py - y; return dx * dx + dy * dy; } function createFeature(id, type, geom, tags) { var feature = { id: typeof id === 'undefined' ? null : id, type: type, geometry: geom, tags: tags, minX: Infinity, minY: Infinity, maxX: -Infinity, maxY: -Infinity }; calcBBox(feature); return feature; } function calcBBox(feature) { var geom = feature.geometry; var type = feature.type; if (type === 'Point' || type === 'MultiPoint' || type === 'LineString') { calcLineBBox(feature, geom); } else if (type === 'Polygon' || type === 'MultiLineString') { for (var i = 0; i < geom.length; i++) { calcLineBBox(feature, geom[i]); } } else if (type === 'MultiPolygon') { for (i = 0; i < geom.length; i++) { for (var j = 0; j < geom[i].length; j++) { calcLineBBox(feature, geom[i][j]); } } } } function calcLineBBox(feature, geom) { for (var i = 0; i < geom.length; i += 3) { feature.minX = Math.min(feature.minX, geom[i]); feature.minY = Math.min(feature.minY, geom[i + 1]); feature.maxX = Math.max(feature.maxX, geom[i]); feature.maxY = Math.max(feature.maxY, geom[i + 1]); } } // converts GeoJSON feature into an intermediate projected JSON vector format with simplification data function convert(data, options) { var features = []; if (data.type === 'FeatureCollection') { for (var i = 0; i < data.features.length; i++) { convertFeature(features, data.features[i], options, i); } } else if (data.type === 'Feature') { convertFeature(features, data, options); } else { // single geometry or a geometry collection convertFeature(features, {geometry: data}, options); } return features; } function convertFeature(features, geojson, options, index) { if (!geojson.geometry) { return; } var coords = geojson.geometry.coordinates; var type = geojson.geometry.type; var tolerance = Math.pow(options.tolerance / ((1 << options.maxZoom) * options.extent), 2); var geometry = []; var id = geojson.id; if (options.promoteId) { id = geojson.properties[options.promoteId]; } else if (options.generateId) { id = index || 0; } if (type === 'Point') { convertPoint(coords, geometry); } else if (type === 'MultiPoint') { for (var i = 0; i < coords.length; i++) { convertPoint(coords[i], geometry); } } else if (type === 'LineString') { convertLine(coords, geometry, tolerance, false); } else if (type === 'MultiLineString') { if (options.lineMetrics) { // explode into linestrings to be able to track metrics for (i = 0; i < coords.length; i++) { geometry = []; convertLine(coords[i], geometry, tolerance, false); features.push(createFeature(id, 'LineString', geometry, geojson.properties)); } return; } else { convertLines(coords, geometry, tolerance, false); } } else if (type === 'Polygon') { convertLines(coords, geometry, tolerance, true); } else if (type === 'MultiPolygon') { for (i = 0; i < coords.length; i++) { var polygon = []; convertLines(coords[i], polygon, tolerance, true); geometry.push(polygon); } } else if (type === 'GeometryCollection') { for (i = 0; i < geojson.geometry.geometries.length; i++) { convertFeature(features, { id: id, geometry: geojson.geometry.geometries[i], properties: geojson.properties }, options, index); } return; } else { throw new Error('Input data is not a valid GeoJSON object.'); } features.push(createFeature(id, type, geometry, geojson.properties)); } function convertPoint(coords, out) { out.push(projectX(coords[0])); out.push(projectY(coords[1])); out.push(0); } function convertLine(ring, out, tolerance, isPolygon) { var x0, y0; var size = 0; for (var j = 0; j < ring.length; j++) { var x = projectX(ring[j][0]); var y = projectY(ring[j][1]); out.push(x); out.push(y); out.push(0); if (j > 0) { if (isPolygon) { size += (x0 * y - x * y0) / 2; // area } else { size += Math.sqrt(Math.pow(x - x0, 2) + Math.pow(y - y0, 2)); // length } } x0 = x; y0 = y; } var last = out.length - 3; out[2] = 1; simplify(out, 0, last, tolerance); out[last + 2] = 1; out.size = Math.abs(size); out.start = 0; out.end = out.size; } function convertLines(rings, out, tolerance, isPolygon) { for (var i = 0; i < rings.length; i++) { var geom = []; convertLine(rings[i], geom, tolerance, isPolygon); out.push(geom); } } function projectX(x) { return x / 360 + 0.5; } function projectY(y) { var sin = Math.sin(y * Math.PI / 180); var y2 = 0.5 - 0.25 * Math.log((1 + sin) / (1 - sin)) / Math.PI; return y2 < 0 ? 0 : y2 > 1 ? 1 : y2; } /* clip features between two axis-parallel lines: * | | * ___|___ | / * / | \____|____/ * | | */ function clip(features, scale, k1, k2, axis, minAll, maxAll, options) { k1 /= scale; k2 /= scale; if (minAll >= k1 && maxAll < k2) { return features; } // trivial accept else if (maxAll < k1 || minAll >= k2) { return null; } // trivial reject var clipped = []; for (var i = 0; i < features.length; i++) { var feature = features[i]; var geometry = feature.geometry; var type = feature.type; var min = axis === 0 ? feature.minX : feature.minY; var max = axis === 0 ? feature.maxX : feature.maxY; if (min >= k1 && max < k2) { // trivial accept clipped.push(feature); continue; } else if (max < k1 || min >= k2) { // trivial reject continue; } var newGeometry = []; if (type === 'Point' || type === 'MultiPoint') { clipPoints(geometry, newGeometry, k1, k2, axis); } else if (type === 'LineString') { clipLine(geometry, newGeometry, k1, k2, axis, false, options.lineMetrics); } else if (type === 'MultiLineString') { clipLines(geometry, newGeometry, k1, k2, axis, false); } else if (type === 'Polygon') { clipLines(geometry, newGeometry, k1, k2, axis, true); } else if (type === 'MultiPolygon') { for (var j = 0; j < geometry.length; j++) { var polygon = []; clipLines(geometry[j], polygon, k1, k2, axis, true); if (polygon.length) { newGeometry.push(polygon); } } } if (newGeometry.length) { if (options.lineMetrics && type === 'LineString') { for (j = 0; j < newGeometry.length; j++) { clipped.push(createFeature(feature.id, type, newGeometry[j], feature.tags)); } continue; } if (type === 'LineString' || type === 'MultiLineString') { if (newGeometry.length === 1) { type = 'LineString'; newGeometry = newGeometry[0]; } else { type = 'MultiLineString'; } } if (type === 'Point' || type === 'MultiPoint') { type = newGeometry.length === 3 ? 'Point' : 'MultiPoint'; } clipped.push(createFeature(feature.id, type, newGeometry, feature.tags)); } } return clipped.length ? clipped : null; } function clipPoints(geom, newGeom, k1, k2, axis) { for (var i = 0; i < geom.length; i += 3) { var a = geom[i + axis]; if (a >= k1 && a <= k2) { newGeom.push(geom[i]); newGeom.push(geom[i + 1]); newGeom.push(geom[i + 2]); } } } function clipLine(geom, newGeom, k1, k2, axis, isPolygon, trackMetrics) { var slice = newSlice(geom); var intersect = axis === 0 ? intersectX : intersectY; var len = geom.start; var segLen, t; for (var i = 0; i < geom.length - 3; i += 3) { var ax = geom[i]; var ay = geom[i + 1]; var az = geom[i + 2]; var bx = geom[i + 3]; var by = geom[i + 4]; var a = axis === 0 ? ax : ay; var b = axis === 0 ? bx : by; var exited = false; if (trackMetrics) { segLen = Math.sqrt(Math.pow(ax - bx, 2) + Math.pow(ay - by, 2)); } if (a < k1) { // ---|--> | (line enters the clip region from the left) if (b > k1) { t = intersect(slice, ax, ay, bx, by, k1); if (trackMetrics) { slice.start = len + segLen * t; } } } else if (a > k2) { // | <--|--- (line enters the clip region from the right) if (b < k2) { t = intersect(slice, ax, ay, bx, by, k2); if (trackMetrics) { slice.start = len + segLen * t; } } } else { addPoint(slice, ax, ay, az); } if (b < k1 && a >= k1) { // <--|--- | or <--|-----|--- (line exits the clip region on the left) t = intersect(slice, ax, ay, bx, by, k1); exited = true; } if (b > k2 && a <= k2) { // | ---|--> or ---|-----|--> (line exits the clip region on the right) t = intersect(slice, ax, ay, bx, by, k2); exited = true; } if (!isPolygon && exited) { if (trackMetrics) { slice.end = len + segLen * t; } newGeom.push(slice); slice = newSlice(geom); } if (trackMetrics) { len += segLen; } } // add the last point var last = geom.length - 3; ax = geom[last]; ay = geom[last + 1]; az = geom[last + 2]; a = axis === 0 ? ax : ay; if (a >= k1 && a <= k2) { addPoint(slice, ax, ay, az); } // close the polygon if its endpoints are not the same after clipping last = slice.length - 3; if (isPolygon && last >= 3 && (slice[last] !== slice[0] || slice[last + 1] !== slice[1])) { addPoint(slice, slice[0], slice[1], slice[2]); } // add the final slice if (slice.length) { newGeom.push(slice); } } function newSlice(line) { var slice = []; slice.size = line.size; slice.start = line.start; slice.end = line.end; return slice; } function clipLines(geom, newGeom, k1, k2, axis, isPolygon) { for (var i = 0; i < geom.length; i++) { clipLine(geom[i], newGeom, k1, k2, axis, isPolygon, false); } } function addPoint(out, x, y, z) { out.push(x); out.push(y); out.push(z); } function intersectX(out, ax, ay, bx, by, x) { var t = (x - ax) / (bx - ax); out.push(x); out.push(ay + (by - ay) * t); out.push(1); return t; } function intersectY(out, ax, ay, bx, by, y) { var t = (y - ay) / (by - ay); out.push(ax + (bx - ax) * t); out.push(y); out.push(1); return t; } function wrap(features, options) { var buffer = options.buffer / options.extent; var merged = features; var left = clip(features, 1, -1 - buffer, buffer, 0, -1, 2, options); // left world copy var right = clip(features, 1, 1 - buffer, 2 + buffer, 0, -1, 2, options); // right world copy if (left || right) { merged = clip(features, 1, -buffer, 1 + buffer, 0, -1, 2, options) || []; // center world copy if (left) { merged = shiftFeatureCoords(left, 1).concat(merged); } // merge left into center if (right) { merged = merged.concat(shiftFeatureCoords(right, -1)); } // merge right into center } return merged; } function shiftFeatureCoords(features, offset) { var newFeatures = []; for (var i = 0; i < features.length; i++) { var feature = features[i], type = feature.type; var newGeometry; if (type === 'Point' || type === 'MultiPoint' || type === 'LineString') { newGeometry = shiftCoords(feature.geometry, offset); } else if (type === 'MultiLineString' || type === 'Polygon') { newGeometry = []; for (var j = 0; j < feature.geometry.length; j++) { newGeometry.push(shiftCoords(feature.geometry[j], offset)); } } else if (type === 'MultiPolygon') { newGeometry = []; for (j = 0; j < feature.geometry.length; j++) { var newPolygon = []; for (var k = 0; k < feature.geometry[j].length; k++) { newPolygon.push(shiftCoords(feature.geometry[j][k], offset)); } newGeometry.push(newPolygon); } } newFeatures.push(createFeature(feature.id, type, newGeometry, feature.tags)); } return newFeatures; } function shiftCoords(points, offset) { var newPoints = []; newPoints.size = points.size; if (points.start !== undefined) { newPoints.start = points.start; newPoints.end = points.end; } for (var i = 0; i < points.length; i += 3) { newPoints.push(points[i] + offset, points[i + 1], points[i + 2]); } return newPoints; } // Transforms the coordinates of each feature in the given tile from // mercator-projected space into (extent x extent) tile space. function transformTile(tile, extent) { if (tile.transformed) { return tile; } var z2 = 1 << tile.z, tx = tile.x, ty = tile.y, i, j, k; for (i = 0; i < tile.features.length; i++) { var feature = tile.features[i], geom = feature.geometry, type = feature.type; feature.geometry = []; if (type === 1) { for (j = 0; j < geom.length; j += 2) { feature.geometry.push(transformPoint(geom[j], geom[j + 1], extent, z2, tx, ty)); } } else { for (j = 0; j < geom.length; j++) { var ring = []; for (k = 0; k < geom[j].length; k += 2) { ring.push(transformPoint(geom[j][k], geom[j][k + 1], extent, z2, tx, ty)); } feature.geometry.push(ring); } } } tile.transformed = true; return tile; } function transformPoint(x, y, extent, z2, tx, ty) { return [ Math.round(extent * (x * z2 - tx)), Math.round(extent * (y * z2 - ty))]; } function createTile(features, z, tx, ty, options) { var tolerance = z === options.maxZoom ? 0 : options.tolerance / ((1 << z) * options.extent); var tile = { features: [], numPoints: 0, numSimplified: 0, numFeatures: 0, source: null, x: tx, y: ty, z: z, transformed: false, minX: 2, minY: 1, maxX: -1, maxY: 0 }; for (var i = 0; i < features.length; i++) { tile.numFeatures++; addFeature(tile, features[i], tolerance, options); var minX = features[i].minX; var minY = features[i].minY; var maxX = features[i].maxX; var maxY = features[i].maxY; if (minX < tile.minX) { tile.minX = minX; } if (minY < tile.minY) { tile.minY = minY; } if (maxX > tile.maxX) { tile.maxX = maxX; } if (maxY > tile.maxY) { tile.maxY = maxY; } } return tile; } function addFeature(tile, feature, tolerance, options) { var geom = feature.geometry, type = feature.type, simplified = []; if (type === 'Point' || type === 'MultiPoint') { for (var i = 0; i < geom.length; i += 3) { simplified.push(geom[i]); simplified.push(geom[i + 1]); tile.numPoints++; tile.numSimplified++; } } else if (type === 'LineString') { addLine(simplified, geom, tile, tolerance, false, false); } else if (type === 'MultiLineString' || type === 'Polygon') { for (i = 0; i < geom.length; i++) { addLine(simplified, geom[i], tile, tolerance, type === 'Polygon', i === 0); } } else if (type === 'MultiPolygon') { for (var k = 0; k < geom.length; k++) { var polygon = geom[k]; for (i = 0; i < polygon.length; i++) { addLine(simplified, polygon[i], tile, tolerance, true, i === 0); } } } if (simplified.length) { var tags = feature.tags || null; if (type === 'LineString' && options.lineMetrics) { tags = {}; for (var key in feature.tags) { tags[key] = feature.tags[key]; } tags['mapbox_clip_start'] = geom.start / geom.size; tags['mapbox_clip_end'] = geom.end / geom.size; } var tileFeature = { geometry: simplified, type: type === 'Polygon' || type === 'MultiPolygon' ? 3 : type === 'LineString' || type === 'MultiLineString' ? 2 : 1, tags: tags }; if (feature.id !== null) { tileFeature.id = feature.id; } tile.features.push(tileFeature); } } function addLine(result, geom, tile, tolerance, isPolygon, isOuter) { var sqTolerance = tolerance * tolerance; if (tolerance > 0 && (geom.size < (isPolygon ? sqTolerance : tolerance))) { tile.numPoints += geom.length / 3; return; } var ring = []; for (var i = 0; i < geom.length; i += 3) { if (tolerance === 0 || geom[i + 2] > sqTolerance) { tile.numSimplified++; ring.push(geom[i]); ring.push(geom[i + 1]); } tile.numPoints++; } if (isPolygon) { rewind$1(ring, isOuter); } result.push(ring); } function rewind$1(ring, clockwise) { var area = 0; for (var i = 0, len = ring.length, j = len - 2; i < len; j = i, i += 2) { area += (ring[i] - ring[j]) * (ring[i + 1] + ring[j + 1]); } if (area > 0 === clockwise) { for (i = 0, len = ring.length; i < len / 2; i += 2) { var x = ring[i]; var y = ring[i + 1]; ring[i] = ring[len - 2 - i]; ring[i + 1] = ring[len - 1 - i]; ring[len - 2 - i] = x; ring[len - 1 - i] = y; } } } function geojsonvt(data, options) { return new GeoJSONVT(data, options); } function GeoJSONVT(data, options) { options = this.options = extend$1(Object.create(this.options), options); var debug = options.debug; if (debug) { console.time('preprocess data'); } if (options.maxZoom < 0 || options.maxZoom > 24) { throw new Error('maxZoom should be in the 0-24 range'); } if (options.promoteId && options.generateId) { throw new Error('promoteId and generateId cannot be used together.'); } var features = convert(data, options); this.tiles = {}; this.tileCoords = []; if (debug) { console.timeEnd('preprocess data'); console.log('index: maxZoom: %d, maxPoints: %d', options.indexMaxZoom, options.indexMaxPoints); console.time('generate tiles'); this.stats = {}; this.total = 0; } features = wrap(features, options); // start slicing from the top tile down if (features.length) { this.splitTile(features, 0, 0, 0); } if (debug) { if (features.length) { console.log('features: %d, points: %d', this.tiles[0].numFeatures, this.tiles[0].numPoints); } console.timeEnd('generate tiles'); console.log('tiles generated:', this.total, JSON.stringify(this.stats)); } } GeoJSONVT.prototype.options = { maxZoom: 14, // max zoom to preserve detail on indexMaxZoom: 5, // max zoom in the tile index indexMaxPoints: 100000, // max number of points per tile in the tile index tolerance: 3, // simplification tolerance (higher means simpler) extent: 4096, // tile extent buffer: 64, // tile buffer on each side lineMetrics: false, // whether to calculate line metrics promoteId: null, // name of a feature property to be promoted to feature.id generateId: false, // whether to generate feature ids. Cannot be used with promoteId debug: 0 // logging level (0, 1 or 2) }; GeoJSONVT.prototype.splitTile = function (features, z, x, y, cz, cx, cy) { var stack = [features, z, x, y], options = this.options, debug = options.debug; // avoid recursion by using a processing queue while (stack.length) { y = stack.pop(); x = stack.pop(); z = stack.pop(); features = stack.pop(); var z2 = 1 << z, id = toID(z, x, y), tile = this.tiles[id]; if (!tile) { if (debug > 1) { console.time('creation'); } tile = this.tiles[id] = createTile(features, z, x, y, options); this.tileCoords.push({z: z, x: x, y: y}); if (debug) { if (debug > 1) { console.log('tile z%d-%d-%d (features: %d, points: %d, simplified: %d)', z, x, y, tile.numFeatures, tile.numPoints, tile.numSimplified); console.timeEnd('creation'); } var key = 'z' + z; this.stats[key] = (this.stats[key] || 0) + 1; this.total++; } } // save reference to original geometry in tile so that we can drill down later if we stop now tile.source = features; // if it's the first-pass tiling if (!cz) { // stop tiling if we reached max zoom, or if the tile is too simple if (z === options.indexMaxZoom || tile.numPoints <= options.indexMaxPoints) { continue; } // if a drilldown to a specific tile } else { // stop tiling if we reached base zoom or our target tile zoom if (z === options.maxZoom || z === cz) { continue; } // stop tiling if it's not an ancestor of the target tile var m = 1 << (cz - z); if (x !== Math.floor(cx / m) || y !== Math.floor(cy / m)) { continue; } } // if we slice further down, no need to keep source geometry tile.source = null; if (features.length === 0) { continue; } if (debug > 1) { console.time('clipping'); } // values we'll use for clipping var k1 = 0.5 * options.buffer / options.extent, k2 = 0.5 - k1, k3 = 0.5 + k1, k4 = 1 + k1, tl, bl, tr, br, left, right; tl = bl = tr = br = null; left = clip(features, z2, x - k1, x + k3, 0, tile.minX, tile.maxX, options); right = clip(features, z2, x + k2, x + k4, 0, tile.minX, tile.maxX, options); features = null; if (left) { tl = clip(left, z2, y - k1, y + k3, 1, tile.minY, tile.maxY, options); bl = clip(left, z2, y + k2, y + k4, 1, tile.minY, tile.maxY, options); left = null; } if (right) { tr = clip(right, z2, y - k1, y + k3, 1, tile.minY, tile.maxY, options); br = clip(right, z2, y + k2, y + k4, 1, tile.minY, tile.maxY, options); right = null; } if (debug > 1) { console.timeEnd('clipping'); } stack.push(tl || [], z + 1, x * 2, y * 2); stack.push(bl || [], z + 1, x * 2, y * 2 + 1); stack.push(tr || [], z + 1, x * 2 + 1, y * 2); stack.push(br || [], z + 1, x * 2 + 1, y * 2 + 1); } }; GeoJSONVT.prototype.getTile = function (z, x, y) { var options = this.options, extent = options.extent, debug = options.debug; if (z < 0 || z > 24) { return null; } var z2 = 1 << z; x = ((x % z2) + z2) % z2; // wrap tile x coordinate var id = toID(z, x, y); if (this.tiles[id]) { return transformTile(this.tiles[id], extent); } if (debug > 1) { console.log('drilling down to z%d-%d-%d', z, x, y); } var z0 = z, x0 = x, y0 = y, parent; while (!parent && z0 > 0) { z0--; x0 = Math.floor(x0 / 2); y0 = Math.floor(y0 / 2); parent = this.tiles[toID(z0, x0, y0)]; } if (!parent || !parent.source) { return null; } // if we found a parent tile containing the original geometry, we can drill down from it if (debug > 1) { console.log('found parent tile z%d-%d-%d', z0, x0, y0); } if (debug > 1) { console.time('drilling down'); } this.splitTile(parent.source, z0, x0, y0, z, x, y); if (debug > 1) { console.timeEnd('drilling down'); } return this.tiles[id] ? transformTile(this.tiles[id], extent) : null; }; function toID(z, x, y) { return (((1 << z) * y + x) * 32) + z; } function extend$1(dest, src) { for (var i in src) { dest[i] = src[i]; } return dest; } // function loadGeoJSONTile(params , callback ) { var canonical = params.tileID.canonical; if (!this._geoJSONIndex) { return callback(null, null); // we couldn't load the file } var geoJSONTile = this._geoJSONIndex.getTile(canonical.z, canonical.x, canonical.y); if (!geoJSONTile) { return callback(null, null); // nothing in the given tile } var geojsonWrapper = new GeoJSONWrapper(geoJSONTile.features); // Encode the geojson-vt tile into binary vector tile form. This // is a convenience that allows `FeatureIndex` to operate the same way // across `VectorTileSource` and `GeoJSONSource` data. var pbf = vtPbf(geojsonWrapper); if (pbf.byteOffset !== 0 || pbf.byteLength !== pbf.buffer.byteLength) { // Compatibility with node Buffer (https://github.com/mapbox/pbf/issues/35) pbf = new Uint8Array(pbf); } callback(null, { vectorTile: geojsonWrapper, rawData: pbf.buffer }); } // 'loadData' received while coalescing, trigger one more 'loadData' on receiving 'coalesced' /** * The {@link WorkerSource} implementation that supports {@link GeoJSONSource}. * This class is designed to be easily reused to support custom source types * for data formats that can be parsed/converted into an in-memory GeoJSON * representation. To do so, create it with * `new GeoJSONWorkerSource(actor, layerIndex, customLoadGeoJSONFunction)`. * For a full example, see [mapbox-gl-topojson](https://github.com/developmentseed/mapbox-gl-topojson). * * @private */ var GeoJSONWorkerSource = /*@__PURE__*/(function (VectorTileWorkerSource) { function GeoJSONWorkerSource(actor , layerIndex , loadGeoJSON ) { VectorTileWorkerSource.call(this, actor, layerIndex, loadGeoJSONTile); if (loadGeoJSON) { this.loadGeoJSON = loadGeoJSON; } } if ( VectorTileWorkerSource ) GeoJSONWorkerSource.__proto__ = VectorTileWorkerSource; GeoJSONWorkerSource.prototype = Object.create( VectorTileWorkerSource && VectorTileWorkerSource.prototype ); GeoJSONWorkerSource.prototype.constructor = GeoJSONWorkerSource; /** * Fetches (if appropriate), parses, and index geojson data into tiles. This * preparatory method must be called before {@link GeoJSONWorkerSource#loadTile} * can correctly serve up tiles. * * Defers to {@link GeoJSONWorkerSource#loadGeoJSON} for the fetching/parsing, * expecting `callback(error, data)` to be called with either an error or a * parsed GeoJSON object. * * When `loadData` requests come in faster than they can be processed, * they are coalesced into a single request using the latest data. * See {@link GeoJSONWorkerSource#coalesce} * * @param params * @param callback */ GeoJSONWorkerSource.prototype.loadData = function loadData (params , callback ) { if (this._pendingCallback) { // Tell the foreground the previous call has been abandoned this._pendingCallback(null, { abandoned: true }); } this._pendingCallback = callback; this._pendingLoadDataParams = params; if (this._state && this._state !== 'Idle') { this._state = 'NeedsLoadData'; } else { this._state = 'Coalescing'; this._loadData(); } }; /** * Internal implementation: called directly by `loadData` * or by `coalesce` using stored parameters. */ GeoJSONWorkerSource.prototype._loadData = function _loadData () { var this$1 = this; if (!this._pendingCallback || !this._pendingLoadDataParams) { __chunk_1.assert(false); return; } var callback = this._pendingCallback; var params = this._pendingLoadDataParams; delete this._pendingCallback; delete this._pendingLoadDataParams; var perf = (params && params.request && params.request.collectResourceTiming) ? new wrapper.Performance(params.request) : false; this.loadGeoJSON(params, function (err , data ) { if (err || !data) { return callback(err); } else if (typeof data !== 'object') { return callback(new Error("Input data is not a valid GeoJSON object.")); } else { geojsonRewind(data, true); try { this$1._geoJSONIndex = params.cluster ? new Supercluster(getSuperclusterOptions(params)).load(data.features) : geojsonvt(data, params.geojsonVtOptions); } catch (err) { return callback(err); } this$1.loaded = {}; var result = {}; if (perf) { var resourceTimingData = perf.finish(); // it's necessary to eval the result of getEntriesByName() here via parse/stringify // late evaluation in the main thread causes TypeError: illegal invocation if (resourceTimingData) { result.resourceTiming = {}; result.resourceTiming[params.source] = JSON.parse(JSON.stringify(resourceTimingData)); } } callback(null, result); } }); }; /** * While processing `loadData`, we coalesce all further * `loadData` messages into a single call to _loadData * that will happen once we've finished processing the * first message. {@link GeoJSONSource#_updateWorkerData} * is responsible for sending us the `coalesce` message * at the time it receives a response from `loadData` * * State: Idle * ↑ | * 'coalesce' 'loadData' * | (triggers load) * | ↓ * State: Coalescing * ↑ | * (triggers load) | * 'coalesce' 'loadData' * | ↓ * State: NeedsLoadData */ GeoJSONWorkerSource.prototype.coalesce = function coalesce () { if (this._state === 'Coalescing') { this._state = 'Idle'; } else if (this._state === 'NeedsLoadData') { this._state = 'Coalescing'; this._loadData(); } }; /** * Implements {@link WorkerSource#reloadTile}. * * If the tile is loaded, uses the implementation in VectorTileWorkerSource. * Otherwise, such as after a setData() call, we load the tile fresh. * * @param params * @param params.uid The UID for this tile. */ GeoJSONWorkerSource.prototype.reloadTile = function reloadTile (params , callback ) { var loaded = this.loaded, uid = params.uid; if (loaded && loaded[uid]) { return VectorTileWorkerSource.prototype.reloadTile.call(this, params, callback); } else { return this.loadTile(params, callback); } }; /** * Fetch and parse GeoJSON according to the given params. Calls `callback` * with `(err, data)`, where `data` is a parsed GeoJSON object. * * GeoJSON is loaded and parsed from `params.url` if it exists, or else * expected as a literal (string or object) `params.data`. * * @param params * @param [params.url] A URL to the remote GeoJSON data. * @param [params.data] Literal GeoJSON data. Must be provided if `params.url` is not. */ GeoJSONWorkerSource.prototype.loadGeoJSON = function loadGeoJSON (params , callback ) { // Because of same origin issues, urls must either include an explicit // origin or absolute path. // ie: /foo/bar.json or http://example.com/bar.json // but not ../foo/bar.json if (params.request) { __chunk_1.getJSON(params.request, callback); } else if (typeof params.data === 'string') { try { return callback(null, JSON.parse(params.data)); } catch (e) { return callback(new Error("Input data is not a valid GeoJSON object.")); } } else { return callback(new Error("Input data is not a valid GeoJSON object.")); } }; GeoJSONWorkerSource.prototype.removeSource = function removeSource (params , callback ) { if (this._pendingCallback) { // Don't leak callbacks this._pendingCallback(null, { abandoned: true }); } callback(); }; GeoJSONWorkerSource.prototype.getClusterExpansionZoom = function getClusterExpansionZoom (params , callback ) { callback(null, this._geoJSONIndex.getClusterExpansionZoom(params.clusterId)); }; GeoJSONWorkerSource.prototype.getClusterChildren = function getClusterChildren (params , callback ) { callback(null, this._geoJSONIndex.getChildren(params.clusterId)); }; GeoJSONWorkerSource.prototype.getClusterLeaves = function getClusterLeaves (params , callback ) { callback(null, this._geoJSONIndex.getLeaves(params.clusterId, params.limit, params.offset)); }; return GeoJSONWorkerSource; }(VectorTileWorkerSource)); function getSuperclusterOptions(ref) { var superclusterOptions = ref.superclusterOptions; var clusterProperties = ref.clusterProperties; if (!clusterProperties || !superclusterOptions) { return superclusterOptions; } var mapExpressions = {}; var reduceExpressions = {}; var globals = {accumulated: null, zoom: 0}; var feature = {properties: null}; var propertyNames = Object.keys(clusterProperties); for (var i = 0, list = propertyNames; i < list.length; i += 1) { var key = list[i]; var ref$1 = clusterProperties[key]; var operator = ref$1[0]; var mapExpression = ref$1[1]; var mapExpressionParsed = __chunk_1.createExpression(mapExpression); var reduceExpressionParsed = __chunk_1.createExpression( typeof operator === 'string' ? [operator, ['accumulated'], ['get', key]] : operator); __chunk_1.assert(mapExpressionParsed.result === 'success'); __chunk_1.assert(reduceExpressionParsed.result === 'success'); mapExpressions[key] = mapExpressionParsed.value; reduceExpressions[key] = reduceExpressionParsed.value; } superclusterOptions.map = function (pointProperties) { feature.properties = pointProperties; var properties = {}; for (var i = 0, list = propertyNames; i < list.length; i += 1) { var key = list[i]; properties[key] = mapExpressions[key].evaluate(globals, feature); } return properties; }; superclusterOptions.reduce = function (accumulated, clusterProperties) { feature.properties = clusterProperties; for (var i = 0, list = propertyNames; i < list.length; i += 1) { var key = list[i]; globals.accumulated = accumulated[key]; accumulated[key] = reduceExpressions[key].evaluate(globals, feature); } }; return superclusterOptions; } // /** * @private */ var Worker = function Worker(self ) { var this$1 = this; this.self = self; this.actor = new __chunk_1.Actor(self, this); this.layerIndexes = {}; this.workerSourceTypes = { vector: VectorTileWorkerSource, geojson: GeoJSONWorkerSource }; // [mapId][sourceType][sourceName] => worker source instance this.workerSources = {}; this.demWorkerSources = {}; this.self.registerWorkerSource = function (name , WorkerSource ) { if (this$1.workerSourceTypes[name]) { throw new Error(("Worker source with name \"" + name + "\" already registered.")); } this$1.workerSourceTypes[name] = WorkerSource; }; this.self.registerRTLTextPlugin = function (rtlTextPlugin ) { if (__chunk_1.plugin.isLoaded()) { throw new Error('RTL text plugin already registered.'); } __chunk_1.plugin['applyArabicShaping'] = rtlTextPlugin.applyArabicShaping; __chunk_1.plugin['processBidirectionalText'] = rtlTextPlugin.processBidirectionalText; __chunk_1.plugin['processStyledBidirectionalText'] = rtlTextPlugin.processStyledBidirectionalText; }; }; Worker.prototype.setReferrer = function setReferrer (mapID , referrer ) { this.referrer = referrer; }; Worker.prototype.setLayers = function setLayers (mapId , layers , callback ) { this.getLayerIndex(mapId).replace(layers); callback(); }; Worker.prototype.updateLayers = function updateLayers (mapId , params , callback ) { this.getLayerIndex(mapId).update(params.layers, params.removedIds); callback(); }; Worker.prototype.loadTile = function loadTile (mapId , params , callback ) { __chunk_1.assert(params.type); this.getWorkerSource(mapId, params.type, params.source).loadTile(params, callback); }; Worker.prototype.loadDEMTile = function loadDEMTile (mapId , params , callback ) { this.getDEMWorkerSource(mapId, params.source).loadTile(params, callback); }; Worker.prototype.reloadTile = function reloadTile (mapId , params , callback ) { __chunk_1.assert(params.type); this.getWorkerSource(mapId, params.type, params.source).reloadTile(params, callback); }; Worker.prototype.abortTile = function abortTile (mapId , params , callback ) { __chunk_1.assert(params.type); this.getWorkerSource(mapId, params.type, params.source).abortTile(params, callback); }; Worker.prototype.removeTile = function removeTile (mapId , params , callback ) { __chunk_1.assert(params.type); this.getWorkerSource(mapId, params.type, params.source).removeTile(params, callback); }; Worker.prototype.removeDEMTile = function removeDEMTile (mapId , params ) { this.getDEMWorkerSource(mapId, params.source).removeTile(params); }; Worker.prototype.removeSource = function removeSource (mapId , params , callback ) { __chunk_1.assert(params.type); __chunk_1.assert(params.source); if (!this.workerSources[mapId] || !this.workerSources[mapId][params.type] || !this.workerSources[mapId][params.type][params.source]) { return; } var worker = this.workerSources[mapId][params.type][params.source]; delete this.workerSources[mapId][params.type][params.source]; if (worker.removeSource !== undefined) { worker.removeSource(params, callback); } else { callback(); } }; /** * Load a {@link WorkerSource} script at params.url. The script is run * (using importScripts) with `registerWorkerSource` in scope, which is a * function taking `(name, workerSourceObject)`. * @private */ Worker.prototype.loadWorkerSource = function loadWorkerSource (map , params , callback ) { try { this.self.importScripts(params.url); callback(); } catch (e) { callback(e.toString()); } }; Worker.prototype.loadRTLTextPlugin = function loadRTLTextPlugin (map , pluginURL , callback ) { try { if (!__chunk_1.plugin.isLoaded()) { this.self.importScripts(pluginURL); callback(__chunk_1.plugin.isLoaded() ? null : new Error(("RTL Text Plugin failed to import scripts from " + pluginURL))); } } catch (e) { callback(e.toString()); } }; Worker.prototype.getLayerIndex = function getLayerIndex (mapId ) { var layerIndexes = this.layerIndexes[mapId]; if (!layerIndexes) { layerIndexes = this.layerIndexes[mapId] = new StyleLayerIndex(); } return layerIndexes; }; Worker.prototype.getWorkerSource = function getWorkerSource (mapId , type , source ) { var this$1 = this; if (!this.workerSources[mapId]) { this.workerSources[mapId] = {}; } if (!this.workerSources[mapId][type]) { this.workerSources[mapId][type] = {}; } if (!this.workerSources[mapId][type][source]) { // use a wrapped actor so that we can attach a target mapId param // to any messages invoked by the WorkerSource var actor = { send: function (type, data, callback) { this$1.actor.send(type, data, callback, mapId); } }; this.workerSources[mapId][type][source] = new (this.workerSourceTypes[type] )((actor ), this.getLayerIndex(mapId)); } return this.workerSources[mapId][type][source]; }; Worker.prototype.getDEMWorkerSource = function getDEMWorkerSource (mapId , source ) { if (!this.demWorkerSources[mapId]) { this.demWorkerSources[mapId] = {}; } if (!this.demWorkerSources[mapId][source]) { this.demWorkerSources[mapId][source] = new RasterDEMTileWorkerSource(); } return this.demWorkerSources[mapId][source]; }; /* global self, WorkerGlobalScope */ if (typeof WorkerGlobalScope !== 'undefined' && typeof __chunk_1.window !== 'undefined' && __chunk_1.window instanceof WorkerGlobalScope) { __chunk_1.window.worker = new Worker(__chunk_1.window); } return Worker; }); define(['./shared.js'], function (__chunk_1) { 'use strict'; var mapboxGlSupported = __chunk_1.createCommonjsModule(function (module) { 'use strict'; if ('object' !== 'undefined' && module.exports) { module.exports = isSupported; } else if (window) { window.mapboxgl = window.mapboxgl || {}; window.mapboxgl.supported = isSupported; } /** * Test whether the current browser supports Mapbox GL JS * @param {Object} options * @param {boolean} [options.failIfMajorPerformanceCaveat=false] Return `false` * if the performance of Mapbox GL JS would be dramatically worse than * expected (i.e. a software renderer is would be used) * @return {boolean} */ function isSupported(options) { return !!( isBrowser() && isArraySupported() && isFunctionSupported() && isObjectSupported() && isJSONSupported() && isWorkerSupported() && isUint8ClampedArraySupported() && isArrayBufferSupported() && isWebGLSupportedCached(options && options.failIfMajorPerformanceCaveat) ); } function isBrowser() { return typeof window !== 'undefined' && typeof document !== 'undefined'; } function isArraySupported() { return ( Array.prototype && Array.prototype.every && Array.prototype.filter && Array.prototype.forEach && Array.prototype.indexOf && Array.prototype.lastIndexOf && Array.prototype.map && Array.prototype.some && Array.prototype.reduce && Array.prototype.reduceRight && Array.isArray ); } function isFunctionSupported() { return Function.prototype && Function.prototype.bind; } function isObjectSupported() { return ( Object.keys && Object.create && Object.getPrototypeOf && Object.getOwnPropertyNames && Object.isSealed && Object.isFrozen && Object.isExtensible && Object.getOwnPropertyDescriptor && Object.defineProperty && Object.defineProperties && Object.seal && Object.freeze && Object.preventExtensions ); } function isJSONSupported() { return 'JSON' in window && 'parse' in JSON && 'stringify' in JSON; } function isWorkerSupported() { if (!('Worker' in window && 'Blob' in window && 'URL' in window)) { return false; } var blob = new Blob([''], { type: 'text/javascript' }); var workerURL = URL.createObjectURL(blob); var supported; var worker; try { worker = new Worker(workerURL); supported = true; } catch (e) { supported = false; } if (worker) { worker.terminate(); } URL.revokeObjectURL(workerURL); return supported; } // IE11 only supports `Uint8ClampedArray` as of version // [KB2929437](https://support.microsoft.com/en-us/kb/2929437) function isUint8ClampedArraySupported() { return 'Uint8ClampedArray' in window; } // https://github.com/mapbox/mapbox-gl-supported/issues/19 function isArrayBufferSupported() { return ArrayBuffer.isView; } var isWebGLSupportedCache = {}; function isWebGLSupportedCached(failIfMajorPerformanceCaveat) { if (isWebGLSupportedCache[failIfMajorPerformanceCaveat] === undefined) { isWebGLSupportedCache[failIfMajorPerformanceCaveat] = isWebGLSupported(failIfMajorPerformanceCaveat); } return isWebGLSupportedCache[failIfMajorPerformanceCaveat]; } isSupported.webGLContextAttributes = { antialias: false, alpha: true, stencil: true, depth: true }; function isWebGLSupported(failIfMajorPerformanceCaveat) { var canvas = document.createElement('canvas'); var attributes = Object.create(isSupported.webGLContextAttributes); attributes.failIfMajorPerformanceCaveat = failIfMajorPerformanceCaveat; if (canvas.probablySupportsContext) { return ( canvas.probablySupportsContext('webgl', attributes) || canvas.probablySupportsContext('experimental-webgl', attributes) ); } else if (canvas.supportsContext) { return ( canvas.supportsContext('webgl', attributes) || canvas.supportsContext('experimental-webgl', attributes) ); } else { return ( canvas.getContext('webgl', attributes) || canvas.getContext('experimental-webgl', attributes) ); } } }); // var DOM = {}; DOM.create = function (tagName , className , container ) { var el = __chunk_1.window.document.createElement(tagName); if (className) { el.className = className; } if (container) { container.appendChild(el); } return el; }; DOM.createNS = function (namespaceURI , tagName ) { var el = __chunk_1.window.document.createElementNS(namespaceURI, tagName); return el; }; var docStyle = __chunk_1.window.document ? (__chunk_1.window.document.documentElement ).style : null; function testProp(props) { if (!docStyle) { return null; } for (var i = 0; i < props.length; i++) { if (props[i] in docStyle) { return props[i]; } } return props[0]; } var selectProp = testProp(['userSelect', 'MozUserSelect', 'WebkitUserSelect', 'msUserSelect']); var userSelect; DOM.disableDrag = function () { if (docStyle && selectProp) { userSelect = docStyle[selectProp]; docStyle[selectProp] = 'none'; } }; DOM.enableDrag = function () { if (docStyle && selectProp) { docStyle[selectProp] = userSelect; } }; var transformProp = testProp(['transform', 'WebkitTransform']); DOM.setTransform = function(el , value ) { (el.style )[transformProp] = value; }; // Feature detection for {passive: false} support in add/removeEventListener. var passiveSupported = false; try { var options$1 = (Object.defineProperty )({}, "passive", { get: function get() { passiveSupported = true; } }); (__chunk_1.window.addEventListener )("test", options$1, options$1); (__chunk_1.window.removeEventListener )("test", options$1, options$1); } catch (err) { passiveSupported = false; } DOM.addEventListener = function(target , type , callback , options) { if ( options === void 0 ) options = {}; if ('passive' in options && passiveSupported) { target.addEventListener(type, callback, (options )); } else { target.addEventListener(type, callback, options.capture); } }; DOM.removeEventListener = function(target , type , callback , options) { if ( options === void 0 ) options = {}; if ('passive' in options && passiveSupported) { target.removeEventListener(type, callback, (options )); } else { target.removeEventListener(type, callback, options.capture); } }; // Suppress the next click, but only if it's immediate. var suppressClick = function (e) { e.preventDefault(); e.stopPropagation(); __chunk_1.window.removeEventListener('click', suppressClick, true); }; DOM.suppressClick = function() { __chunk_1.window.addEventListener('click', suppressClick, true); __chunk_1.window.setTimeout(function () { __chunk_1.window.removeEventListener('click', suppressClick, true); }, 0); }; DOM.mousePos = function (el , e ) { var rect = el.getBoundingClientRect(); e = e.touches ? e.touches[0] : e; return new __chunk_1.Point( e.clientX - rect.left - el.clientLeft, e.clientY - rect.top - el.clientTop ); }; DOM.touchPos = function (el , e ) { var rect = el.getBoundingClientRect(), points = []; var touches = (e.type === 'touchend') ? e.changedTouches : e.touches; for (var i = 0; i < touches.length; i++) { points.push(new __chunk_1.Point( touches[i].clientX - rect.left - el.clientLeft, touches[i].clientY - rect.top - el.clientTop )); } return points; }; DOM.mouseButton = function (e ) { __chunk_1.assert(e.type === 'mousedown' || e.type === 'mouseup'); if (typeof __chunk_1.window.InstallTrigger !== 'undefined' && e.button === 2 && e.ctrlKey && __chunk_1.window.navigator.platform.toUpperCase().indexOf('MAC') >= 0) { // Fix for https://github.com/mapbox/mapbox-gl-js/issues/3131: // Firefox (detected by InstallTrigger) on Mac determines e.button = 2 when // using Control + left click return 0; } return e.button; }; DOM.remove = function(node ) { if (node.parentNode) { node.parentNode.removeChild(node); } }; // function loadSprite(baseURL , requestManager , callback ) { var json , image, error; var format = __chunk_1.browser.devicePixelRatio > 1 ? '@2x' : ''; var jsonRequest = __chunk_1.getJSON(requestManager.transformRequest(requestManager.normalizeSpriteURL(baseURL, format, '.json'), __chunk_1.ResourceType.SpriteJSON), function (err , data ) { jsonRequest = null; if (!error) { error = err; json = data; maybeComplete(); } }); var imageRequest = __chunk_1.getImage(requestManager.transformRequest(requestManager.normalizeSpriteURL(baseURL, format, '.png'), __chunk_1.ResourceType.SpriteImage), function (err, img) { imageRequest = null; if (!error) { error = err; image = img; maybeComplete(); } }); function maybeComplete() { if (error) { callback(error); } else if (json && image) { var imageData = __chunk_1.browser.getImageData(image); var result = {}; for (var id in json) { var ref = json[id]; var width = ref.width; var height = ref.height; var x = ref.x; var y = ref.y; var sdf = ref.sdf; var pixelRatio = ref.pixelRatio; var data = new __chunk_1.RGBAImage({width: width, height: height}); __chunk_1.RGBAImage.copy(imageData, data, {x: x, y: y}, {x: 0, y: 0}, {width: width, height: height}); result[id] = {data: data, pixelRatio: pixelRatio, sdf: sdf}; } callback(null, result); } } return { cancel: function cancel() { if (jsonRequest) { jsonRequest.cancel(); jsonRequest = null; } if (imageRequest) { imageRequest.cancel(); imageRequest = null; } } }; } // function renderStyleImage(image ) { var userImage = image.userImage; if (userImage && userImage.render) { var updated = userImage.render(); if (updated) { image.data.replace(new Uint8Array(userImage.data.buffer)); return true; } } return false; } /** * Interface for dynamically generated style images. This is a specification for * implementers to model: it is not an exported method or class. * * Images implementing this interface can be redrawn for every frame. They can be used to animate * icons and patterns or make them respond to user input. Style images can implement a * {@link StyleImageInterface#render} method. The method is called every frame and * can be used to update the image. * * @interface StyleImageInterface * @property {number} width * @property {number} height * @property {Uint8Array | Uint8ClampedArray} data * * @see [Add an animated icon to the map.](https://docs.mapbox.com/mapbox-gl-js/example/add-image-animated/) * * @example * var flashingSquare = { * width: 64, * height: 64, * data: new Uint8Array(64 * 64 * 4), * * onAdd: function(map) { * this.map = map; * }, * * render: function() { * // keep repainting while the icon is on the map * this.map.triggerRepaint(); * * // alternate between black and white based on the time * var value = Math.round(Date.now() / 1000) % 2 === 0 ? 255 : 0; * * // check if image needs to be changed * if (value !== this.previousValue) { * this.previousValue = value; * * var bytesPerPixel = 4; * for (var x = 0; x < this.width; x++) { * for (var y = 0; y < this.height; y++) { * var offset = (y * this.width + x) * bytesPerPixel; * this.data[offset + 0] = value; * this.data[offset + 1] = value; * this.data[offset + 2] = value; * this.data[offset + 3] = 255; * } * } * * // return true to indicate that the image changed * return true; * } * } * } * * map.addImage('flashing_square', flashingSquare); */ /** * This method is called once before every frame where the icon will be used. * The method can optionally update the image's `data` member with a new image. * * If the method updates the image it must return `true` to commit the change. * If the method returns `false` or nothing the image is assumed to not have changed. * * If updates are infrequent it maybe easier to use {@link Map#updateImage} to update * the image instead of implementing this method. * * @function * @memberof StyleImageInterface * @instance * @name render * @return {boolean} `true` if this method updated the image. `false` if the image was not changed. */ /** * Optional method called when the layer has been added to the Map with {@link Map#addImage}. * * @function * @memberof StyleImageInterface * @instance * @name onAdd * @param {Map} map The Map this custom layer was just added to. */ /** * Optional method called when the icon is removed from the map with {@link Map#removeImage}. * This gives the image a chance to clean up resources and event listeners. * * @function * @memberof StyleImageInterface * @instance * @name onRemove */ // // When copied into the atlas texture, image data is padded by one pixel on each side. Icon // images are padded with fully transparent pixels, while pattern images are padded with a // copy of the image data wrapped from the opposite side. In both cases, this ensures the // correct behavior of GL_LINEAR texture sampling mode. var padding = 1; /* ImageManager does three things: 1. Tracks requests for icon images from tile workers and sends responses when the requests are fulfilled. 2. Builds a texture atlas for pattern images. 3. Rerenders renderable images once per frame These are disparate responsibilities and should eventually be handled by different classes. When we implement data-driven support for `*-pattern`, we'll likely use per-bucket pattern atlases, and that would be a good time to refactor this. */ var ImageManager = /*@__PURE__*/(function (Evented) { function ImageManager() { Evented.call(this); this.images = {}; this.updatedImages = {}; this.callbackDispatchedThisFrame = {}; this.loaded = false; this.requestors = []; this.patterns = {}; this.atlasImage = new __chunk_1.RGBAImage({width: 1, height: 1}); this.dirty = true; } if ( Evented ) ImageManager.__proto__ = Evented; ImageManager.prototype = Object.create( Evented && Evented.prototype ); ImageManager.prototype.constructor = ImageManager; ImageManager.prototype.isLoaded = function isLoaded () { return this.loaded; }; ImageManager.prototype.setLoaded = function setLoaded (loaded ) { if (this.loaded === loaded) { return; } this.loaded = loaded; if (loaded) { for (var i = 0, list = this.requestors; i < list.length; i += 1) { var ref = list[i]; var ids = ref.ids; var callback = ref.callback; this._notify(ids, callback); } this.requestors = []; } }; ImageManager.prototype.getImage = function getImage (id ) { return this.images[id]; }; ImageManager.prototype.addImage = function addImage (id , image ) { __chunk_1.assert(!this.images[id]); this.images[id] = image; }; ImageManager.prototype.updateImage = function updateImage (id , image ) { var oldImage = this.images[id]; __chunk_1.assert(oldImage); __chunk_1.assert(oldImage.data.width === image.data.width); __chunk_1.assert(oldImage.data.height === image.data.height); image.version = oldImage.version + 1; this.images[id] = image; this.updatedImages[id] = true; }; ImageManager.prototype.removeImage = function removeImage (id ) { __chunk_1.assert(this.images[id]); var image = this.images[id]; delete this.images[id]; delete this.patterns[id]; if (image.userImage && image.userImage.onRemove) { image.userImage.onRemove(); } }; ImageManager.prototype.listImages = function listImages () { return Object.keys(this.images); }; ImageManager.prototype.getImages = function getImages (ids , callback ) { // If the sprite has been loaded, or if all the icon dependencies are already present // (i.e. if they've been addeded via runtime styling), then notify the requestor immediately. // Otherwise, delay notification until the sprite is loaded. At that point, if any of the // dependencies are still unavailable, we'll just assume they are permanently missing. var hasAllDependencies = true; if (!this.isLoaded()) { for (var i = 0, list = ids; i < list.length; i += 1) { var id = list[i]; if (!this.images[id]) { hasAllDependencies = false; } } } if (this.isLoaded() || hasAllDependencies) { this._notify(ids, callback); } else { this.requestors.push({ids: ids, callback: callback}); } }; ImageManager.prototype._notify = function _notify (ids , callback ) { var response = {}; for (var i = 0, list = ids; i < list.length; i += 1) { var id = list[i]; if (!this.images[id]) { this.fire(new __chunk_1.Event('styleimagemissing', { id: id })); } var image = this.images[id]; if (image) { // Clone the image so that our own copy of its ArrayBuffer doesn't get transferred. response[id] = { data: image.data.clone(), pixelRatio: image.pixelRatio, sdf: image.sdf, version: image.version, hasRenderCallback: Boolean(image.userImage && image.userImage.render) }; } else { __chunk_1.warnOnce(("Image \"" + id + "\" could not be loaded. Please make sure you have added the image with map.addImage() or a \"sprite\" property in your style. You can provide missing images by listening for the \"styleimagemissing\" map event.")); } } callback(null, response); }; // Pattern stuff ImageManager.prototype.getPixelSize = function getPixelSize () { var ref = this.atlasImage; var width = ref.width; var height = ref.height; return {width: width, height: height}; }; ImageManager.prototype.getPattern = function getPattern (id ) { var pattern = this.patterns[id]; var image = this.getImage(id); if (!image) { return null; } if (pattern && pattern.position.version === image.version) { return pattern.position; } if (!pattern) { var w = image.data.width + padding * 2; var h = image.data.height + padding * 2; var bin = {w: w, h: h, x: 0, y: 0}; var position = new __chunk_1.ImagePosition(bin, image); this.patterns[id] = {bin: bin, position: position}; } else { pattern.position.version = image.version; } this._updatePatternAtlas(); return this.patterns[id].position; }; ImageManager.prototype.bind = function bind (context ) { var gl = context.gl; if (!this.atlasTexture) { this.atlasTexture = new __chunk_1.Texture(context, this.atlasImage, gl.RGBA); } else if (this.dirty) { this.atlasTexture.update(this.atlasImage); this.dirty = false; } this.atlasTexture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE); }; ImageManager.prototype._updatePatternAtlas = function _updatePatternAtlas () { var bins = []; for (var id in this.patterns) { bins.push(this.patterns[id].bin); } var ref = __chunk_1.potpack(bins); var w = ref.w; var h = ref.h; var dst = this.atlasImage; dst.resize({width: w || 1, height: h || 1}); for (var id$1 in this.patterns) { var ref$1 = this.patterns[id$1]; var bin = ref$1.bin; var x = bin.x + padding; var y = bin.y + padding; var src = this.images[id$1].data; var w$1 = src.width; var h$1 = src.height; __chunk_1.RGBAImage.copy(src, dst, { x: 0, y: 0 }, { x: x, y: y }, { width: w$1, height: h$1 }); // Add 1 pixel wrapped padding on each side of the image. __chunk_1.RGBAImage.copy(src, dst, { x: 0, y: h$1 - 1 }, { x: x, y: y - 1 }, { width: w$1, height: 1 }); // T __chunk_1.RGBAImage.copy(src, dst, { x: 0, y: 0 }, { x: x, y: y + h$1 }, { width: w$1, height: 1 }); // B __chunk_1.RGBAImage.copy(src, dst, { x: w$1 - 1, y: 0 }, { x: x - 1, y: y }, { width: 1, height: h$1 }); // L __chunk_1.RGBAImage.copy(src, dst, { x: 0, y: 0 }, { x: x + w$1, y: y }, { width: 1, height: h$1 }); // R } this.dirty = true; }; ImageManager.prototype.beginFrame = function beginFrame () { this.callbackDispatchedThisFrame = {}; }; ImageManager.prototype.dispatchRenderCallbacks = function dispatchRenderCallbacks (ids ) { for (var i = 0, list = ids; i < list.length; i += 1) { // the callback for the image was already dispatched for a different frame var id = list[i]; if (this.callbackDispatchedThisFrame[id]) { continue; } this.callbackDispatchedThisFrame[id] = true; var image = this.images[id]; __chunk_1.assert(image); var updated = renderStyleImage(image); if (updated) { this.updateImage(id, image); } } }; return ImageManager; }(__chunk_1.Evented)); // function loadGlyphRange (fontstack , range , urlTemplate , requestManager , callback ) { var begin = range * 256; var end = begin + 255; var request = requestManager.transformRequest( requestManager.normalizeGlyphsURL(urlTemplate) .replace('{fontstack}', fontstack) .replace('{range}', (begin + "-" + end)), __chunk_1.ResourceType.Glyphs); __chunk_1.getArrayBuffer(request, function (err , data ) { if (err) { callback(err); } else if (data) { var glyphs = {}; for (var i = 0, list = __chunk_1.parseGlyphPBF(data); i < list.length; i += 1) { var glyph = list[i]; glyphs[glyph.id] = glyph; } callback(null, glyphs); } }); } 'use strict'; var tinySdf = TinySDF; var INF = 1e20; function TinySDF(fontSize, buffer, radius, cutoff, fontFamily, fontWeight) { this.fontSize = fontSize || 24; this.buffer = buffer === undefined ? 3 : buffer; this.cutoff = cutoff || 0.25; this.fontFamily = fontFamily || 'sans-serif'; this.fontWeight = fontWeight || 'normal'; this.radius = radius || 8; var size = this.size = this.fontSize + this.buffer * 2; this.canvas = document.createElement('canvas'); this.canvas.width = this.canvas.height = size; this.ctx = this.canvas.getContext('2d'); this.ctx.font = this.fontWeight + ' ' + this.fontSize + 'px ' + this.fontFamily; this.ctx.textBaseline = 'middle'; this.ctx.fillStyle = 'black'; // temporary arrays for the distance transform this.gridOuter = new Float64Array(size * size); this.gridInner = new Float64Array(size * size); this.f = new Float64Array(size); this.d = new Float64Array(size); this.z = new Float64Array(size + 1); this.v = new Int16Array(size); // hack around https://bugzilla.mozilla.org/show_bug.cgi?id=737852 this.middle = Math.round((size / 2) * (navigator.userAgent.indexOf('Gecko/') >= 0 ? 1.2 : 1)); } TinySDF.prototype.draw = function (char) { this.ctx.clearRect(0, 0, this.size, this.size); this.ctx.fillText(char, this.buffer, this.middle); var imgData = this.ctx.getImageData(0, 0, this.size, this.size); var alphaChannel = new Uint8ClampedArray(this.size * this.size); for (var i = 0; i < this.size * this.size; i++) { var a = imgData.data[i * 4 + 3] / 255; // alpha value this.gridOuter[i] = a === 1 ? 0 : a === 0 ? INF : Math.pow(Math.max(0, 0.5 - a), 2); this.gridInner[i] = a === 1 ? INF : a === 0 ? 0 : Math.pow(Math.max(0, a - 0.5), 2); } edt(this.gridOuter, this.size, this.size, this.f, this.d, this.v, this.z); edt(this.gridInner, this.size, this.size, this.f, this.d, this.v, this.z); for (i = 0; i < this.size * this.size; i++) { var d = this.gridOuter[i] - this.gridInner[i]; alphaChannel[i] = Math.max(0, Math.min(255, Math.round(255 - 255 * (d / this.radius + this.cutoff)))); } return alphaChannel; }; // 2D Euclidean distance transform by Felzenszwalb & Huttenlocher https://cs.brown.edu/~pff/dt/ function edt(data, width, height, f, d, v, z) { for (var x = 0; x < width; x++) { for (var y = 0; y < height; y++) { f[y] = data[y * width + x]; } edt1d(f, d, v, z, height); for (y = 0; y < height; y++) { data[y * width + x] = d[y]; } } for (y = 0; y < height; y++) { for (x = 0; x < width; x++) { f[x] = data[y * width + x]; } edt1d(f, d, v, z, width); for (x = 0; x < width; x++) { data[y * width + x] = Math.sqrt(d[x]); } } } // 1D squared distance transform function edt1d(f, d, v, z, n) { v[0] = 0; z[0] = -INF; z[1] = +INF; for (var q = 1, k = 0; q < n; q++) { var s = ((f[q] + q * q) - (f[v[k]] + v[k] * v[k])) / (2 * q - 2 * v[k]); while (s <= z[k]) { k--; s = ((f[q] + q * q) - (f[v[k]] + v[k] * v[k])) / (2 * q - 2 * v[k]); } k++; v[k] = q; z[k] = s; z[k + 1] = +INF; } for (q = 0, k = 0; q < n; q++) { while (z[k + 1] < q) { k++; } d[q] = (q - v[k]) * (q - v[k]) + f[v[k]]; } } // var GlyphManager = function GlyphManager(requestManager , localIdeographFontFamily ) { this.requestManager = requestManager; this.localIdeographFontFamily = localIdeographFontFamily; this.entries = {}; }; GlyphManager.prototype.setURL = function setURL (url ) { this.url = url; }; GlyphManager.prototype.getGlyphs = function getGlyphs (glyphs , callback ) { var this$1 = this; var all = []; for (var stack in glyphs) { for (var i = 0, list = glyphs[stack]; i < list.length; i += 1) { var id = list[i]; all.push({stack: stack, id: id}); } } __chunk_1.asyncAll(all, function (ref, callback ) { var stack = ref.stack; var id = ref.id; var entry = this$1.entries[stack]; if (!entry) { entry = this$1.entries[stack] = { glyphs: {}, requests: {} }; } var glyph = entry.glyphs[id]; if (glyph !== undefined) { callback(null, {stack: stack, id: id, glyph: glyph}); return; } glyph = this$1._tinySDF(entry, stack, id); if (glyph) { callback(null, {stack: stack, id: id, glyph: glyph}); return; } var range = Math.floor(id / 256); if (range * 256 > 65535) { callback(new Error('glyphs > 65535 not supported')); return; } var requests = entry.requests[range]; if (!requests) { requests = entry.requests[range] = []; GlyphManager.loadGlyphRange(stack, range, (this$1.url ), this$1.requestManager, function (err, response ) { if (response) { for (var id in response) { entry.glyphs[+id] = response[+id]; } } for (var i = 0, list = requests; i < list.length; i += 1) { var cb = list[i]; cb(err, response); } delete entry.requests[range]; }); } requests.push(function (err, result ) { if (err) { callback(err); } else if (result) { callback(null, {stack: stack, id: id, glyph: result[id] || null}); } }); }, function (err, glyphs ) { if (err) { callback(err); } else if (glyphs) { var result = {}; for (var i = 0, list = glyphs; i < list.length; i += 1) { // Clone the glyph so that our own copy of its ArrayBuffer doesn't get transferred. var ref = list[i]; var stack = ref.stack; var id = ref.id; var glyph = ref.glyph; (result[stack] || (result[stack] = {}))[id] = glyph && { id: glyph.id, bitmap: glyph.bitmap.clone(), metrics: glyph.metrics }; } callback(null, result); } }); }; GlyphManager.prototype._tinySDF = function _tinySDF (entry , stack , id ) { var family = this.localIdeographFontFamily; if (!family) { return; } if (!__chunk_1.isChar['CJK Unified Ideographs'](id) && !__chunk_1.isChar['Hangul Syllables'](id)) { // eslint-disable-line new-cap return; } var tinySDF = entry.tinySDF; if (!tinySDF) { var fontWeight = '400'; if (/bold/i.test(stack)) { fontWeight = '900'; } else if (/medium/i.test(stack)) { fontWeight = '500'; } else if (/light/i.test(stack)) { fontWeight = '200'; } tinySDF = entry.tinySDF = new GlyphManager.TinySDF(24, 3, 8, .25, family, fontWeight); } return { id: id, bitmap: new __chunk_1.AlphaImage({width: 30, height: 30}, tinySDF.draw(String.fromCharCode(id))), metrics: { width: 24, height: 24, left: 0, top: -8, advance: 24 } }; }; GlyphManager.loadGlyphRange = loadGlyphRange; GlyphManager.TinySDF = tinySdf; // var LightPositionProperty = function LightPositionProperty() { this.specification = __chunk_1.styleSpec.light.position; }; LightPositionProperty.prototype.possiblyEvaluate = function possiblyEvaluate (value , parameters ) { return __chunk_1.sphericalToCartesian(value.expression.evaluate(parameters)); }; LightPositionProperty.prototype.interpolate = function interpolate$1 (a , b , t ) { return { x: __chunk_1.number(a.x, b.x, t), y: __chunk_1.number(a.y, b.y, t), z: __chunk_1.number(a.z, b.z, t), }; }; var properties = new __chunk_1.Properties({ "anchor": new __chunk_1.DataConstantProperty(__chunk_1.styleSpec.light.anchor), "position": new LightPositionProperty(), "color": new __chunk_1.DataConstantProperty(__chunk_1.styleSpec.light.color), "intensity": new __chunk_1.DataConstantProperty(__chunk_1.styleSpec.light.intensity), }); var TRANSITION_SUFFIX = '-transition'; /* * Represents the light used to light extruded features. */ var Light = /*@__PURE__*/(function (Evented) { function Light(lightOptions ) { Evented.call(this); this._transitionable = new __chunk_1.Transitionable(properties); this.setLight(lightOptions); this._transitioning = this._transitionable.untransitioned(); } if ( Evented ) Light.__proto__ = Evented; Light.prototype = Object.create( Evented && Evented.prototype ); Light.prototype.constructor = Light; Light.prototype.getLight = function getLight () { return this._transitionable.serialize(); }; Light.prototype.setLight = function setLight (light , options) { if ( options === void 0 ) options = {}; if (this._validate(__chunk_1.validateLight, light, options)) { return; } for (var name in light) { var value = light[name]; if (__chunk_1.endsWith(name, TRANSITION_SUFFIX)) { this._transitionable.setTransition(name.slice(0, -TRANSITION_SUFFIX.length), value); } else { this._transitionable.setValue(name, value); } } }; Light.prototype.updateTransitions = function updateTransitions (parameters ) { this._transitioning = this._transitionable.transitioned(parameters, this._transitioning); }; Light.prototype.hasTransition = function hasTransition () { return this._transitioning.hasTransition(); }; Light.prototype.recalculate = function recalculate (parameters ) { this.properties = this._transitioning.possiblyEvaluate(parameters); }; Light.prototype._validate = function _validate (validate , value , options ) { if (options && options.validate === false) { return false; } return __chunk_1.emitValidationErrors(this, validate.call(__chunk_1.validateStyle, __chunk_1.extend({ value: value, // Workaround for https://github.com/mapbox/mapbox-gl-js/issues/2407 style: {glyphs: true, sprite: true}, styleSpec: __chunk_1.styleSpec }))); }; return Light; }(__chunk_1.Evented)); // /** * A LineAtlas lets us reuse rendered dashed lines * by writing many of them to a texture and then fetching their positions * using .getDash. * * @param {number} width * @param {number} height * @private */ var LineAtlas = function LineAtlas(width , height ) { this.width = width; this.height = height; this.nextRow = 0; this.bytes = 4; this.data = new Uint8Array(this.width * this.height * this.bytes); this.positions = {}; }; /** * Get or create a dash line pattern. * * @param {Array} dasharray * @param {boolean} round whether to add circle caps in between dash segments * @returns {Object} position of dash texture in { y, height, width } * @private */ LineAtlas.prototype.getDash = function getDash (dasharray , round ) { var key = dasharray.join(",") + String(round); if (!this.positions[key]) { this.positions[key] = this.addDash(dasharray, round); } return this.positions[key]; }; LineAtlas.prototype.addDash = function addDash (dasharray , round ) { var n = round ? 7 : 0; var height = 2 * n + 1; var offset = 128; if (this.nextRow + height > this.height) { __chunk_1.warnOnce('LineAtlas out of space'); return null; } var length = 0; for (var i = 0; i < dasharray.length; i++) { length += dasharray[i]; } var stretch = this.width / length; var halfWidth = stretch / 2; // If dasharray has an odd length, both the first and last parts // are dashes and should be joined seamlessly. var oddLength = dasharray.length % 2 === 1; for (var y = -n; y <= n; y++) { var row = this.nextRow + n + y; var index = this.width * row; var left = oddLength ? -dasharray[dasharray.length - 1] : 0; var right = dasharray[0]; var partIndex = 1; for (var x = 0; x < this.width; x++) { while (right < x / stretch) { left = right; right = right + dasharray[partIndex]; if (oddLength && partIndex === dasharray.length - 1) { right += dasharray[0]; } partIndex++; } var distLeft = Math.abs(x - left * stretch); var distRight = Math.abs(x - right * stretch); var dist = Math.min(distLeft, distRight); var inside = (partIndex % 2) === 1; var signedDistance = (void 0); if (round) { // Add circle caps var distMiddle = n ? y / n * (halfWidth + 1) : 0; if (inside) { var distEdge = halfWidth - Math.abs(distMiddle); signedDistance = Math.sqrt(dist * dist + distEdge * distEdge); } else { signedDistance = halfWidth - Math.sqrt(dist * dist + distMiddle * distMiddle); } } else { signedDistance = (inside ? 1 : -1) * dist; } this.data[3 + (index + x) * 4] = Math.max(0, Math.min(255, signedDistance + offset)); } } var pos = { y: (this.nextRow + n + 0.5) / this.height, height: 2 * n / this.height, width: length }; this.nextRow += height; this.dirty = true; return pos; }; LineAtlas.prototype.bind = function bind (context ) { var gl = context.gl; if (!this.texture) { this.texture = gl.createTexture(); gl.bindTexture(gl.TEXTURE_2D, this.texture); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, this.data); } else { gl.bindTexture(gl.TEXTURE_2D, this.texture); if (this.dirty) { this.dirty = false; gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, this.width, this.height, gl.RGBA, gl.UNSIGNED_BYTE, this.data); } } }; // /** * Responsible for sending messages from a {@link Source} to an associated * {@link WorkerSource}. * * @private */ var Dispatcher = function Dispatcher(workerPool , parent ) { this.workerPool = workerPool; this.actors = []; this.currentActor = 0; this.id = __chunk_1.uniqueId(); var workers = this.workerPool.acquire(this.id); for (var i = 0; i < workers.length; i++) { var worker = workers[i]; var actor = new Dispatcher.Actor(worker, parent, this.id); actor.name = "Worker " + i; this.actors.push(actor); } }; /** * Broadcast a message to all Workers. */ Dispatcher.prototype.broadcast = function broadcast (type , data , cb ) { cb = cb || function () {}; __chunk_1.asyncAll(this.actors, function (actor, done) { actor.send(type, data, done); }, cb); }; /** * Send a message to a Worker. * @param targetID The ID of the Worker to which to send this message. Omit to allow the dispatcher to choose. * @returns The ID of the worker to which the message was sent. */ Dispatcher.prototype.send = function send (type , data , callback , targetID ) { if (typeof targetID !== 'number' || isNaN(targetID)) { // Use round robin to send requests to web workers. targetID = this.currentActor = (this.currentActor + 1) % this.actors.length; } this.actors[targetID].send(type, data, callback); return targetID; }; Dispatcher.prototype.remove = function remove () { this.actors.forEach(function (actor) { actor.remove(); }); this.actors = []; this.workerPool.release(this.id); }; Dispatcher.Actor = __chunk_1.Actor; // function loadTileJSON(options , requestManager , callback ) { var loaded = function(err , tileJSON ) { if (err) { return callback(err); } else if (tileJSON) { var result = __chunk_1.pick( tileJSON, ['tiles', 'minzoom', 'maxzoom', 'attribution', 'mapbox_logo', 'bounds'] ); if (tileJSON.vector_layers) { result.vectorLayers = tileJSON.vector_layers; result.vectorLayerIds = result.vectorLayers.map(function (layer) { return layer.id; }); } // only canonicalize tile tileset if source is declared using a tilejson url if (options.url) { result.tiles = requestManager.canonicalizeTileset(result, options.url); } callback(null, result); } }; if (options.url) { return __chunk_1.getJSON(requestManager.transformRequest(requestManager.normalizeSourceURL(options.url), __chunk_1.ResourceType.Source), loaded); } else { return __chunk_1.browser.frame(function () { return loaded(null, options); }); } } // var TileBounds = function TileBounds(bounds , minzoom , maxzoom ) { this.bounds = __chunk_1.LngLatBounds.convert(this.validateBounds(bounds)); this.minzoom = minzoom || 0; this.maxzoom = maxzoom || 24; }; TileBounds.prototype.validateBounds = function validateBounds (bounds ) { // make sure the bounds property contains valid longitude and latitudes if (!Array.isArray(bounds) || bounds.length !== 4) { return [-180, -90, 180, 90]; } return [Math.max(-180, bounds[0]), Math.max(-90, bounds[1]), Math.min(180, bounds[2]), Math.min(90, bounds[3])]; }; TileBounds.prototype.contains = function contains (tileID ) { var worldSize = Math.pow(2, tileID.z); var level = { minX: Math.floor(__chunk_1.mercatorXfromLng(this.bounds.getWest()) * worldSize), minY: Math.floor(__chunk_1.mercatorYfromLat(this.bounds.getNorth()) * worldSize), maxX: Math.ceil(__chunk_1.mercatorXfromLng(this.bounds.getEast()) * worldSize), maxY: Math.ceil(__chunk_1.mercatorYfromLat(this.bounds.getSouth()) * worldSize) }; var hit = tileID.x >= level.minX && tileID.x < level.maxX && tileID.y >= level.minY && tileID.y < level.maxY; return hit; }; // var VectorTileSource = /*@__PURE__*/(function (Evented) { function VectorTileSource(id , options , dispatcher , eventedParent ) { Evented.call(this); this.id = id; this.dispatcher = dispatcher; this.type = 'vector'; this.minzoom = 0; this.maxzoom = 22; this.scheme = 'xyz'; this.tileSize = 512; this.reparseOverscaled = true; this.isTileClipped = true; __chunk_1.extend(this, __chunk_1.pick(options, ['url', 'scheme', 'tileSize'])); this._options = __chunk_1.extend({ type: 'vector' }, options); this._collectResourceTiming = options.collectResourceTiming; if (this.tileSize !== 512) { throw new Error('vector tile sources must have a tileSize of 512'); } this.setEventedParent(eventedParent); } if ( Evented ) VectorTileSource.__proto__ = Evented; VectorTileSource.prototype = Object.create( Evented && Evented.prototype ); VectorTileSource.prototype.constructor = VectorTileSource; VectorTileSource.prototype.load = function load () { var this$1 = this; this.fire(new __chunk_1.Event('dataloading', {dataType: 'source'})); this._tileJSONRequest = loadTileJSON(this._options, this.map._requestManager, function (err, tileJSON) { this$1._tileJSONRequest = null; if (err) { this$1.fire(new __chunk_1.ErrorEvent(err)); } else if (tileJSON) { __chunk_1.extend(this$1, tileJSON); if (tileJSON.bounds) { this$1.tileBounds = new TileBounds(tileJSON.bounds, this$1.minzoom, this$1.maxzoom); } __chunk_1.postTurnstileEvent(tileJSON.tiles); __chunk_1.postMapLoadEvent(tileJSON.tiles, this$1.map._getMapId(), this$1.map._requestManager._skuToken); // `content` is included here to prevent a race condition where `Style#_updateSources` is called // before the TileJSON arrives. this makes sure the tiles needed are loaded once TileJSON arrives // ref: https://github.com/mapbox/mapbox-gl-js/pull/4347#discussion_r104418088 this$1.fire(new __chunk_1.Event('data', {dataType: 'source', sourceDataType: 'metadata'})); this$1.fire(new __chunk_1.Event('data', {dataType: 'source', sourceDataType: 'content'})); } }); }; VectorTileSource.prototype.hasTile = function hasTile (tileID ) { return !this.tileBounds || this.tileBounds.contains(tileID.canonical); }; VectorTileSource.prototype.onAdd = function onAdd (map ) { this.map = map; this.load(); }; VectorTileSource.prototype.onRemove = function onRemove () { if (this._tileJSONRequest) { this._tileJSONRequest.cancel(); this._tileJSONRequest = null; } }; VectorTileSource.prototype.serialize = function serialize () { return __chunk_1.extend({}, this._options); }; VectorTileSource.prototype.loadTile = function loadTile (tile , callback ) { var url = this.map._requestManager.normalizeTileURL(tile.tileID.canonical.url(this.tiles, this.scheme), this.url, null); var params = { request: this.map._requestManager.transformRequest(url, __chunk_1.ResourceType.Tile), uid: tile.uid, tileID: tile.tileID, zoom: tile.tileID.overscaledZ, tileSize: this.tileSize * tile.tileID.overscaleFactor(), type: this.type, source: this.id, pixelRatio: __chunk_1.browser.devicePixelRatio, showCollisionBoxes: this.map.showCollisionBoxes, }; params.request.collectResourceTiming = this._collectResourceTiming; if (tile.workerID === undefined || tile.state === 'expired') { tile.workerID = this.dispatcher.send('loadTile', params, done.bind(this)); } else if (tile.state === 'loading') { // schedule tile reloading after it has been loaded tile.reloadCallback = callback; } else { this.dispatcher.send('reloadTile', params, done.bind(this), tile.workerID); } function done(err, data) { if (tile.aborted) { return callback(null); } if (err && err.status !== 404) { return callback(err); } if (data && data.resourceTiming) { tile.resourceTiming = data.resourceTiming; } if (this.map._refreshExpiredTiles && data) { tile.setExpiryData(data); } tile.loadVectorData(data, this.map.painter); callback(null); if (tile.reloadCallback) { this.loadTile(tile, tile.reloadCallback); tile.reloadCallback = null; } } }; VectorTileSource.prototype.abortTile = function abortTile (tile ) { this.dispatcher.send('abortTile', { uid: tile.uid, type: this.type, source: this.id }, undefined, tile.workerID); }; VectorTileSource.prototype.unloadTile = function unloadTile (tile ) { tile.unloadVectorData(); this.dispatcher.send('removeTile', { uid: tile.uid, type: this.type, source: this.id }, undefined, tile.workerID); }; VectorTileSource.prototype.hasTransition = function hasTransition () { return false; }; return VectorTileSource; }(__chunk_1.Evented)); // var RasterTileSource = /*@__PURE__*/(function (Evented) { function RasterTileSource(id , options , dispatcher , eventedParent ) { Evented.call(this); this.id = id; this.dispatcher = dispatcher; this.setEventedParent(eventedParent); this.type = 'raster'; this.minzoom = 0; this.maxzoom = 22; this.roundZoom = true; this.scheme = 'xyz'; this.tileSize = 512; this._loaded = false; this._options = __chunk_1.extend({}, options); __chunk_1.extend(this, __chunk_1.pick(options, ['url', 'scheme', 'tileSize'])); } if ( Evented ) RasterTileSource.__proto__ = Evented; RasterTileSource.prototype = Object.create( Evented && Evented.prototype ); RasterTileSource.prototype.constructor = RasterTileSource; RasterTileSource.prototype.load = function load () { var this$1 = this; this.fire(new __chunk_1.Event('dataloading', {dataType: 'source'})); this._tileJSONRequest = loadTileJSON(this._options, this.map._requestManager, function (err, tileJSON) { this$1._tileJSONRequest = null; if (err) { this$1.fire(new __chunk_1.ErrorEvent(err)); } else if (tileJSON) { __chunk_1.extend(this$1, tileJSON); if (tileJSON.bounds) { this$1.tileBounds = new TileBounds(tileJSON.bounds, this$1.minzoom, this$1.maxzoom); } __chunk_1.postTurnstileEvent(tileJSON.tiles); __chunk_1.postMapLoadEvent(tileJSON.tiles, this$1.map._getMapId(), this$1.map._requestManager._skuToken); // `content` is included here to prevent a race condition where `Style#_updateSources` is called // before the TileJSON arrives. this makes sure the tiles needed are loaded once TileJSON arrives // ref: https://github.com/mapbox/mapbox-gl-js/pull/4347#discussion_r104418088 this$1.fire(new __chunk_1.Event('data', {dataType: 'source', sourceDataType: 'metadata'})); this$1.fire(new __chunk_1.Event('data', {dataType: 'source', sourceDataType: 'content'})); } }); }; RasterTileSource.prototype.onAdd = function onAdd (map ) { this.map = map; this.load(); }; RasterTileSource.prototype.onRemove = function onRemove () { if (this._tileJSONRequest) { this._tileJSONRequest.cancel(); this._tileJSONRequest = null; } }; RasterTileSource.prototype.serialize = function serialize () { return __chunk_1.extend({}, this._options); }; RasterTileSource.prototype.hasTile = function hasTile (tileID ) { return !this.tileBounds || this.tileBounds.contains(tileID.canonical); }; RasterTileSource.prototype.loadTile = function loadTile (tile , callback ) { var this$1 = this; var url = this.map._requestManager.normalizeTileURL(tile.tileID.canonical.url(this.tiles, this.scheme), this.url, this.tileSize); tile.request = __chunk_1.getImage(this.map._requestManager.transformRequest(url, __chunk_1.ResourceType.Tile), function (err, img) { delete tile.request; if (tile.aborted) { tile.state = 'unloaded'; callback(null); } else if (err) { tile.state = 'errored'; callback(err); } else if (img) { if (this$1.map._refreshExpiredTiles) { tile.setExpiryData(img); } delete (img ).cacheControl; delete (img ).expires; var context = this$1.map.painter.context; var gl = context.gl; tile.texture = this$1.map.painter.getTileTexture(img.width); if (tile.texture) { tile.texture.update(img, { useMipmap: true }); } else { tile.texture = new __chunk_1.Texture(context, img, gl.RGBA, { useMipmap: true }); tile.texture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE, gl.LINEAR_MIPMAP_NEAREST); if (context.extTextureFilterAnisotropic) { gl.texParameterf(gl.TEXTURE_2D, context.extTextureFilterAnisotropic.TEXTURE_MAX_ANISOTROPY_EXT, context.extTextureFilterAnisotropicMax); } } tile.state = 'loaded'; callback(null); } }); }; RasterTileSource.prototype.abortTile = function abortTile (tile , callback ) { if (tile.request) { tile.request.cancel(); delete tile.request; } callback(); }; RasterTileSource.prototype.unloadTile = function unloadTile (tile , callback ) { if (tile.texture) { this.map.painter.saveTileTexture(tile.texture); } callback(); }; RasterTileSource.prototype.hasTransition = function hasTransition () { return false; }; return RasterTileSource; }(__chunk_1.Evented)); // var RasterDEMTileSource = /*@__PURE__*/(function (RasterTileSource) { function RasterDEMTileSource(id , options , dispatcher , eventedParent ) { RasterTileSource.call(this, id, options, dispatcher, eventedParent); this.type = 'raster-dem'; this.maxzoom = 22; this._options = __chunk_1.extend({}, options); this.encoding = options.encoding || "mapbox"; } if ( RasterTileSource ) RasterDEMTileSource.__proto__ = RasterTileSource; RasterDEMTileSource.prototype = Object.create( RasterTileSource && RasterTileSource.prototype ); RasterDEMTileSource.prototype.constructor = RasterDEMTileSource; RasterDEMTileSource.prototype.serialize = function serialize () { return { type: 'raster-dem', url: this.url, tileSize: this.tileSize, tiles: this.tiles, bounds: this.bounds, encoding: this.encoding }; }; RasterDEMTileSource.prototype.loadTile = function loadTile (tile , callback ) { var url = this.map._requestManager.normalizeTileURL(tile.tileID.canonical.url(this.tiles, this.scheme), this.url, this.tileSize); tile.request = __chunk_1.getImage(this.map._requestManager.transformRequest(url, __chunk_1.ResourceType.Tile), imageLoaded.bind(this)); tile.neighboringTiles = this._getNeighboringTiles(tile.tileID); function imageLoaded(err, img) { delete tile.request; if (tile.aborted) { tile.state = 'unloaded'; callback(null); } else if (err) { tile.state = 'errored'; callback(err); } else if (img) { if (this.map._refreshExpiredTiles) { tile.setExpiryData(img); } delete (img ).cacheControl; delete (img ).expires; var rawImageData = __chunk_1.browser.getImageData(img); var params = { uid: tile.uid, coord: tile.tileID, source: this.id, rawImageData: rawImageData, encoding: this.encoding }; if (!tile.workerID || tile.state === 'expired') { tile.workerID = this.dispatcher.send('loadDEMTile', params, done.bind(this)); } } } function done(err, dem) { if (err) { tile.state = 'errored'; callback(err); } if (dem) { tile.dem = dem; tile.needsHillshadePrepare = true; tile.state = 'loaded'; callback(null); } } }; RasterDEMTileSource.prototype._getNeighboringTiles = function _getNeighboringTiles (tileID ) { var canonical = tileID.canonical; var dim = Math.pow(2, canonical.z); var px = (canonical.x - 1 + dim) % dim; var pxw = canonical.x === 0 ? tileID.wrap - 1 : tileID.wrap; var nx = (canonical.x + 1 + dim) % dim; var nxw = canonical.x + 1 === dim ? tileID.wrap + 1 : tileID.wrap; var neighboringTiles = {}; // add adjacent tiles neighboringTiles[new __chunk_1.OverscaledTileID(tileID.overscaledZ, pxw, canonical.z, px, canonical.y).key] = {backfilled: false}; neighboringTiles[new __chunk_1.OverscaledTileID(tileID.overscaledZ, nxw, canonical.z, nx, canonical.y).key] = {backfilled: false}; // Add upper neighboringTiles if (canonical.y > 0) { neighboringTiles[new __chunk_1.OverscaledTileID(tileID.overscaledZ, pxw, canonical.z, px, canonical.y - 1).key] = {backfilled: false}; neighboringTiles[new __chunk_1.OverscaledTileID(tileID.overscaledZ, tileID.wrap, canonical.z, canonical.x, canonical.y - 1).key] = {backfilled: false}; neighboringTiles[new __chunk_1.OverscaledTileID(tileID.overscaledZ, nxw, canonical.z, nx, canonical.y - 1).key] = {backfilled: false}; } // Add lower neighboringTiles if (canonical.y + 1 < dim) { neighboringTiles[new __chunk_1.OverscaledTileID(tileID.overscaledZ, pxw, canonical.z, px, canonical.y + 1).key] = {backfilled: false}; neighboringTiles[new __chunk_1.OverscaledTileID(tileID.overscaledZ, tileID.wrap, canonical.z, canonical.x, canonical.y + 1).key] = {backfilled: false}; neighboringTiles[new __chunk_1.OverscaledTileID(tileID.overscaledZ, nxw, canonical.z, nx, canonical.y + 1).key] = {backfilled: false}; } return neighboringTiles; }; RasterDEMTileSource.prototype.unloadTile = function unloadTile (tile ) { if (tile.demTexture) { this.map.painter.saveTileTexture(tile.demTexture); } if (tile.fbo) { tile.fbo.destroy(); delete tile.fbo; } if (tile.dem) { delete tile.dem; } delete tile.neighboringTiles; tile.state = 'unloaded'; this.dispatcher.send('removeDEMTile', { uid: tile.uid, source: this.id }, undefined, tile.workerID); }; return RasterDEMTileSource; }(RasterTileSource)); // /** * A source containing GeoJSON. * (See the [Style Specification](https://www.mapbox.com/mapbox-gl-style-spec/#sources-geojson) for detailed documentation of options.) * * @example * map.addSource('some id', { * type: 'geojson', * data: 'https://d2ad6b4ur7yvpq.cloudfront.net/naturalearth-3.3.0/ne_10m_ports.geojson' * }); * * @example * map.addSource('some id', { * type: 'geojson', * data: { * "type": "FeatureCollection", * "features": [{ * "type": "Feature", * "properties": {}, * "geometry": { * "type": "Point", * "coordinates": [ * -76.53063297271729, * 39.18174077994108 * ] * } * }] * } * }); * * @example * map.getSource('some id').setData({ * "type": "FeatureCollection", * "features": [{ * "type": "Feature", * "properties": { "name": "Null Island" }, * "geometry": { * "type": "Point", * "coordinates": [ 0, 0 ] * } * }] * }); * @see [Draw GeoJSON points](https://www.mapbox.com/mapbox-gl-js/example/geojson-markers/) * @see [Add a GeoJSON line](https://www.mapbox.com/mapbox-gl-js/example/geojson-line/) * @see [Create a heatmap from points](https://www.mapbox.com/mapbox-gl-js/example/heatmap/) * @see [Create and style clusters](https://www.mapbox.com/mapbox-gl-js/example/cluster/) */ var GeoJSONSource = /*@__PURE__*/(function (Evented) { function GeoJSONSource(id , options , dispatcher , eventedParent ) { Evented.call(this); this.id = id; // `type` is a property rather than a constant to make it easy for 3rd // parties to use GeoJSONSource to build their own source types. this.type = 'geojson'; this.minzoom = 0; this.maxzoom = 18; this.tileSize = 512; this.isTileClipped = true; this.reparseOverscaled = true; this._removed = false; this.dispatcher = dispatcher; this.setEventedParent(eventedParent); this._data = (options.data ); this._options = __chunk_1.extend({}, options); this._collectResourceTiming = options.collectResourceTiming; this._resourceTiming = []; if (options.maxzoom !== undefined) { this.maxzoom = options.maxzoom; } if (options.type) { this.type = options.type; } if (options.attribution) { this.attribution = options.attribution; } var scale = __chunk_1.EXTENT / this.tileSize; // sent to the worker, along with `url: ...` or `data: literal geojson`, // so that it can load/parse/index the geojson data // extending with `options.workerOptions` helps to make it easy for // third-party sources to hack/reuse GeoJSONSource. this.workerOptions = __chunk_1.extend({ source: this.id, cluster: options.cluster || false, geojsonVtOptions: { buffer: (options.buffer !== undefined ? options.buffer : 128) * scale, tolerance: (options.tolerance !== undefined ? options.tolerance : 0.375) * scale, extent: __chunk_1.EXTENT, maxZoom: this.maxzoom, lineMetrics: options.lineMetrics || false, generateId: options.generateId || false }, superclusterOptions: { maxZoom: options.clusterMaxZoom !== undefined ? Math.min(options.clusterMaxZoom, this.maxzoom - 1) : (this.maxzoom - 1), extent: __chunk_1.EXTENT, radius: (options.clusterRadius || 50) * scale, log: false }, clusterProperties: options.clusterProperties }, options.workerOptions); } if ( Evented ) GeoJSONSource.__proto__ = Evented; GeoJSONSource.prototype = Object.create( Evented && Evented.prototype ); GeoJSONSource.prototype.constructor = GeoJSONSource; GeoJSONSource.prototype.load = function load () { var this$1 = this; this.fire(new __chunk_1.Event('dataloading', {dataType: 'source'})); this._updateWorkerData(function (err) { if (err) { this$1.fire(new __chunk_1.ErrorEvent(err)); return; } var data = { dataType: 'source', sourceDataType: 'metadata' }; if (this$1._collectResourceTiming && this$1._resourceTiming && (this$1._resourceTiming.length > 0)) { data.resourceTiming = this$1._resourceTiming; this$1._resourceTiming = []; } // although GeoJSON sources contain no metadata, we fire this event to let the SourceCache // know its ok to start requesting tiles. this$1.fire(new __chunk_1.Event('data', data)); }); }; GeoJSONSource.prototype.onAdd = function onAdd (map ) { this.map = map; this.load(); }; /** * Sets the GeoJSON data and re-renders the map. * * @param {Object|string} data A GeoJSON data object or a URL to one. The latter is preferable in the case of large GeoJSON files. * @returns {GeoJSONSource} this */ GeoJSONSource.prototype.setData = function setData (data ) { var this$1 = this; this._data = data; this.fire(new __chunk_1.Event('dataloading', {dataType: 'source'})); this._updateWorkerData(function (err) { if (err) { this$1.fire(new __chunk_1.ErrorEvent(err)); return; } var data = { dataType: 'source', sourceDataType: 'content' }; if (this$1._collectResourceTiming && this$1._resourceTiming && (this$1._resourceTiming.length > 0)) { data.resourceTiming = this$1._resourceTiming; this$1._resourceTiming = []; } this$1.fire(new __chunk_1.Event('data', data)); }); return this; }; /** * For clustered sources, fetches the zoom at which the given cluster expands. * * @param clusterId The value of the cluster's `cluster_id` property. * @param callback A callback to be called when the zoom value is retrieved (`(error, zoom) => { ... }`). * @returns {GeoJSONSource} this */ GeoJSONSource.prototype.getClusterExpansionZoom = function getClusterExpansionZoom (clusterId , callback ) { this.dispatcher.send('geojson.getClusterExpansionZoom', { clusterId: clusterId, source: this.id }, callback, this.workerID); return this; }; /** * For clustered sources, fetches the children of the given cluster on the next zoom level (as an array of GeoJSON features). * * @param clusterId The value of the cluster's `cluster_id` property. * @param callback A callback to be called when the features are retrieved (`(error, features) => { ... }`). * @returns {GeoJSONSource} this */ GeoJSONSource.prototype.getClusterChildren = function getClusterChildren (clusterId , callback ) { this.dispatcher.send('geojson.getClusterChildren', { clusterId: clusterId, source: this.id }, callback, this.workerID); return this; }; /** * For clustered sources, fetches the original points that belong to the cluster (as an array of GeoJSON features). * * @param clusterId The value of the cluster's `cluster_id` property. * @param limit The maximum number of features to return. * @param offset The number of features to skip (e.g. for pagination). * @param callback A callback to be called when the features are retrieved (`(error, features) => { ... }`). * @returns {GeoJSONSource} this */ GeoJSONSource.prototype.getClusterLeaves = function getClusterLeaves (clusterId , limit , offset , callback ) { this.dispatcher.send('geojson.getClusterLeaves', { source: this.id, clusterId: clusterId, limit: limit, offset: offset }, callback, this.workerID); return this; }; /* * Responsible for invoking WorkerSource's geojson.loadData target, which * handles loading the geojson data and preparing to serve it up as tiles, * using geojson-vt or supercluster as appropriate. */ GeoJSONSource.prototype._updateWorkerData = function _updateWorkerData (callback ) { var this$1 = this; var options = __chunk_1.extend({}, this.workerOptions); var data = this._data; if (typeof data === 'string') { options.request = this.map._requestManager.transformRequest(__chunk_1.browser.resolveURL(data), __chunk_1.ResourceType.Source); options.request.collectResourceTiming = this._collectResourceTiming; } else { options.data = JSON.stringify(data); } // target {this.type}.loadData rather than literally geojson.loadData, // so that other geojson-like source types can easily reuse this // implementation this.workerID = this.dispatcher.send(((this.type) + ".loadData"), options, function (err, result) { if (this$1._removed || (result && result.abandoned)) { return; } this$1._loaded = true; if (result && result.resourceTiming && result.resourceTiming[this$1.id]) { this$1._resourceTiming = result.resourceTiming[this$1.id].slice(0); } // Any `loadData` calls that piled up while we were processing // this one will get coalesced into a single call when this // 'coalesce' message is processed. // We would self-send from the worker if we had access to its // message queue. Waiting instead for the 'coalesce' to round-trip // through the foreground just means we're throttling the worker // to run at a little less than full-throttle. this$1.dispatcher.send(((this$1.type) + ".coalesce"), { source: options.source }, null, this$1.workerID); callback(err); }, this.workerID); }; GeoJSONSource.prototype.loadTile = function loadTile (tile , callback ) { var this$1 = this; var message = tile.workerID === undefined ? 'loadTile' : 'reloadTile'; var params = { type: this.type, uid: tile.uid, tileID: tile.tileID, zoom: tile.tileID.overscaledZ, maxZoom: this.maxzoom, tileSize: this.tileSize, source: this.id, pixelRatio: __chunk_1.browser.devicePixelRatio, showCollisionBoxes: this.map.showCollisionBoxes }; tile.workerID = this.dispatcher.send(message, params, function (err, data) { tile.unloadVectorData(); if (tile.aborted) { return callback(null); } if (err) { return callback(err); } tile.loadVectorData(data, this$1.map.painter, message === 'reloadTile'); return callback(null); }, this.workerID); }; GeoJSONSource.prototype.abortTile = function abortTile (tile ) { tile.aborted = true; }; GeoJSONSource.prototype.unloadTile = function unloadTile (tile ) { tile.unloadVectorData(); this.dispatcher.send('removeTile', { uid: tile.uid, type: this.type, source: this.id }, null, tile.workerID); }; GeoJSONSource.prototype.onRemove = function onRemove () { this._removed = true; this.dispatcher.send('removeSource', { type: this.type, source: this.id }, null, this.workerID); }; GeoJSONSource.prototype.serialize = function serialize () { return __chunk_1.extend({}, this._options, { type: this.type, data: this._data }); }; GeoJSONSource.prototype.hasTransition = function hasTransition () { return false; }; return GeoJSONSource; }(__chunk_1.Evented)); // /** * A data source containing an image. * (See the [Style Specification](https://www.mapbox.com/mapbox-gl-style-spec/#sources-image) for detailed documentation of options.) * * @example * // add to map * map.addSource('some id', { * type: 'image', * url: 'https://www.mapbox.com/images/foo.png', * coordinates: [ * [-76.54, 39.18], * [-76.52, 39.18], * [-76.52, 39.17], * [-76.54, 39.17] * ] * }); * * // update coordinates * var mySource = map.getSource('some id'); * mySource.setCoordinates([ * [-76.54335737228394, 39.18579907229748], * [-76.52803659439087, 39.1838364847587], * [-76.5295386314392, 39.17683392507606], * [-76.54520273208618, 39.17876344106642] * ]); * * // update url and coordinates simultaneously * mySource.updateImage({ * url: 'https://www.mapbox.com/images/bar.png', * coordinates: [ * [-76.54335737228394, 39.18579907229748], * [-76.52803659439087, 39.1838364847587], * [-76.5295386314392, 39.17683392507606], * [-76.54520273208618, 39.17876344106642] * ] * }) * * map.removeSource('some id'); // remove * @see [Add an image](https://www.mapbox.com/mapbox-gl-js/example/image-on-a-map/) */ var ImageSource = /*@__PURE__*/(function (Evented) { function ImageSource(id , options , dispatcher , eventedParent ) { Evented.call(this); this.id = id; this.dispatcher = dispatcher; this.coordinates = options.coordinates; this.type = 'image'; this.minzoom = 0; this.maxzoom = 22; this.tileSize = 512; this.tiles = {}; this.setEventedParent(eventedParent); this.options = options; } if ( Evented ) ImageSource.__proto__ = Evented; ImageSource.prototype = Object.create( Evented && Evented.prototype ); ImageSource.prototype.constructor = ImageSource; ImageSource.prototype.load = function load (newCoordinates , successCallback ) { var this$1 = this; this.fire(new __chunk_1.Event('dataloading', {dataType: 'source'})); this.url = this.options.url; __chunk_1.getImage(this.map._requestManager.transformRequest(this.url, __chunk_1.ResourceType.Image), function (err, image) { if (err) { this$1.fire(new __chunk_1.ErrorEvent(err)); } else if (image) { this$1.image = image; if (newCoordinates) { this$1.coordinates = newCoordinates; } if (successCallback) { successCallback(); } this$1._finishLoading(); } }); }; /** * Updates the image URL and, optionally, the coordinates. To avoid having the image flash after changing, * set the `raster-fade-duration` paint property on the raster layer to 0. * * @param {Object} options * @param {string} [options.url] Required image URL. * @param {Array>} [options.coordinates] Four geographical coordinates, * represented as arrays of longitude and latitude numbers, which define the corners of the image. * The coordinates start at the top left corner of the image and proceed in clockwise order. * They do not have to represent a rectangle. * @returns {ImageSource} this */ ImageSource.prototype.updateImage = function updateImage (options ) { var this$1 = this; if (!this.image || !options.url) { return this; } this.options.url = options.url; this.load(options.coordinates, function () { this$1.texture = null; }); return this; }; ImageSource.prototype._finishLoading = function _finishLoading () { if (this.map) { this.setCoordinates(this.coordinates); this.fire(new __chunk_1.Event('data', {dataType: 'source', sourceDataType: 'metadata'})); } }; ImageSource.prototype.onAdd = function onAdd (map ) { this.map = map; this.load(); }; /** * Sets the image's coordinates and re-renders the map. * * @param {Array>} coordinates Four geographical coordinates, * represented as arrays of longitude and latitude numbers, which define the corners of the image. * The coordinates start at the top left corner of the image and proceed in clockwise order. * They do not have to represent a rectangle. * @returns {ImageSource} this */ ImageSource.prototype.setCoordinates = function setCoordinates (coordinates ) { var this$1 = this; this.coordinates = coordinates; // Calculate which mercator tile is suitable for rendering the video in // and create a buffer with the corner coordinates. These coordinates // may be outside the tile, because raster tiles aren't clipped when rendering. // transform the geo coordinates into (zoom 0) tile space coordinates var cornerCoords = coordinates.map(__chunk_1.MercatorCoordinate.fromLngLat); // Compute the coordinates of the tile we'll use to hold this image's // render data this.tileID = getCoordinatesCenterTileID(cornerCoords); // Constrain min/max zoom to our tile's zoom level in order to force // SourceCache to request this tile (no matter what the map's zoom // level) this.minzoom = this.maxzoom = this.tileID.z; // Transform the corner coordinates into the coordinate space of our // tile. var tileCoords = cornerCoords.map(function (coord) { return this$1.tileID.getTilePoint(coord)._round(); }); this._boundsArray = new __chunk_1.StructArrayLayout4i8(); this._boundsArray.emplaceBack(tileCoords[0].x, tileCoords[0].y, 0, 0); this._boundsArray.emplaceBack(tileCoords[1].x, tileCoords[1].y, __chunk_1.EXTENT, 0); this._boundsArray.emplaceBack(tileCoords[3].x, tileCoords[3].y, 0, __chunk_1.EXTENT); this._boundsArray.emplaceBack(tileCoords[2].x, tileCoords[2].y, __chunk_1.EXTENT, __chunk_1.EXTENT); if (this.boundsBuffer) { this.boundsBuffer.destroy(); delete this.boundsBuffer; } this.fire(new __chunk_1.Event('data', {dataType:'source', sourceDataType: 'content'})); return this; }; ImageSource.prototype.prepare = function prepare () { if (Object.keys(this.tiles).length === 0 || !this.image) { return; } var context = this.map.painter.context; var gl = context.gl; if (!this.boundsBuffer) { this.boundsBuffer = context.createVertexBuffer(this._boundsArray, __chunk_1.rasterBoundsAttributes.members); } if (!this.boundsSegments) { this.boundsSegments = __chunk_1.SegmentVector.simpleSegment(0, 0, 4, 2); } if (!this.texture) { this.texture = new __chunk_1.Texture(context, this.image, gl.RGBA); this.texture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE); } for (var w in this.tiles) { var tile = this.tiles[w]; if (tile.state !== 'loaded') { tile.state = 'loaded'; tile.texture = this.texture; } } }; ImageSource.prototype.loadTile = function loadTile (tile , callback ) { // We have a single tile -- whoose coordinates are this.tileID -- that // covers the image we want to render. If that's the one being // requested, set it up with the image; otherwise, mark the tile as // `errored` to indicate that we have no data for it. // If the world wraps, we may have multiple "wrapped" copies of the // single tile. if (this.tileID && this.tileID.equals(tile.tileID.canonical)) { this.tiles[String(tile.tileID.wrap)] = tile; tile.buckets = {}; callback(null); } else { tile.state = 'errored'; callback(null); } }; ImageSource.prototype.serialize = function serialize () { return { type: 'image', url: this.options.url, coordinates: this.coordinates }; }; ImageSource.prototype.hasTransition = function hasTransition () { return false; }; return ImageSource; }(__chunk_1.Evented)); /** * Given a list of coordinates, get their center as a coordinate. * * @returns centerpoint * @private */ function getCoordinatesCenterTileID(coords ) { var minX = Infinity; var minY = Infinity; var maxX = -Infinity; var maxY = -Infinity; for (var i = 0, list = coords; i < list.length; i += 1) { var coord = list[i]; minX = Math.min(minX, coord.x); minY = Math.min(minY, coord.y); maxX = Math.max(maxX, coord.x); maxY = Math.max(maxY, coord.y); } var dx = maxX - minX; var dy = maxY - minY; var dMax = Math.max(dx, dy); var zoom = Math.max(0, Math.floor(-Math.log(dMax) / Math.LN2)); var tilesAtZoom = Math.pow(2, zoom); return new __chunk_1.CanonicalTileID( zoom, Math.floor((minX + maxX) / 2 * tilesAtZoom), Math.floor((minY + maxY) / 2 * tilesAtZoom)); } // /** * A data source containing video. * (See the [Style Specification](https://www.mapbox.com/mapbox-gl-style-spec/#sources-video) for detailed documentation of options.) * * @example * // add to map * map.addSource('some id', { * type: 'video', * url: [ * 'https://www.mapbox.com/blog/assets/baltimore-smoke.mp4', * 'https://www.mapbox.com/blog/assets/baltimore-smoke.webm' * ], * coordinates: [ * [-76.54, 39.18], * [-76.52, 39.18], * [-76.52, 39.17], * [-76.54, 39.17] * ] * }); * * // update * var mySource = map.getSource('some id'); * mySource.setCoordinates([ * [-76.54335737228394, 39.18579907229748], * [-76.52803659439087, 39.1838364847587], * [-76.5295386314392, 39.17683392507606], * [-76.54520273208618, 39.17876344106642] * ]); * * map.removeSource('some id'); // remove * @see [Add a video](https://www.mapbox.com/mapbox-gl-js/example/video-on-a-map/) */ var VideoSource = /*@__PURE__*/(function (ImageSource) { function VideoSource(id , options , dispatcher , eventedParent ) { ImageSource.call(this, id, options, dispatcher, eventedParent); this.roundZoom = true; this.type = 'video'; this.options = options; } if ( ImageSource ) VideoSource.__proto__ = ImageSource; VideoSource.prototype = Object.create( ImageSource && ImageSource.prototype ); VideoSource.prototype.constructor = VideoSource; VideoSource.prototype.load = function load () { var this$1 = this; var options = this.options; this.urls = []; for (var i = 0, list = options.urls; i < list.length; i += 1) { var url = list[i]; this.urls.push(this.map._requestManager.transformRequest(url, __chunk_1.ResourceType.Source).url); } __chunk_1.getVideo(this.urls, function (err, video) { if (err) { this$1.fire(new __chunk_1.ErrorEvent(err)); } else if (video) { this$1.video = video; this$1.video.loop = true; // Start repainting when video starts playing. hasTransition() will then return // true to trigger additional frames as long as the videos continues playing. this$1.video.addEventListener('playing', function () { this$1.map.triggerRepaint(); }); if (this$1.map) { this$1.video.play(); } this$1._finishLoading(); } }); }; /** * Returns the HTML `video` element. * * @returns {HTMLVideoElement} The HTML `video` element. */ VideoSource.prototype.getVideo = function getVideo () { return this.video; }; VideoSource.prototype.onAdd = function onAdd (map ) { if (this.map) { return; } this.map = map; this.load(); if (this.video) { this.video.play(); this.setCoordinates(this.coordinates); } }; /** * Sets the video's coordinates and re-renders the map. * * @method setCoordinates * @instance * @memberof VideoSource * @param {Array>} coordinates Four geographical coordinates, * represented as arrays of longitude and latitude numbers, which define the corners of the video. * The coordinates start at the top left corner of the video and proceed in clockwise order. * They do not have to represent a rectangle. * @returns {VideoSource} this */ // setCoordinates inherited from ImageSource VideoSource.prototype.prepare = function prepare () { if (Object.keys(this.tiles).length === 0 || this.video.readyState < 2) { return; // not enough data for current position } var context = this.map.painter.context; var gl = context.gl; if (!this.boundsBuffer) { this.boundsBuffer = context.createVertexBuffer(this._boundsArray, __chunk_1.rasterBoundsAttributes.members); } if (!this.boundsSegments) { this.boundsSegments = __chunk_1.SegmentVector.simpleSegment(0, 0, 4, 2); } if (!this.texture) { this.texture = new __chunk_1.Texture(context, this.video, gl.RGBA); this.texture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE); } else if (!this.video.paused) { this.texture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE); gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, gl.RGBA, gl.UNSIGNED_BYTE, this.video); } for (var w in this.tiles) { var tile = this.tiles[w]; if (tile.state !== 'loaded') { tile.state = 'loaded'; tile.texture = this.texture; } } }; VideoSource.prototype.serialize = function serialize () { return { type: 'video', urls: this.urls, coordinates: this.coordinates }; }; VideoSource.prototype.hasTransition = function hasTransition () { return this.video && !this.video.paused; }; return VideoSource; }(ImageSource)); // /** * Options to add a canvas source type to the map. * * @typedef {Object} CanvasSourceOptions * @property {string} type Source type. Must be `"canvas"`. * @property {string|HTMLCanvasElement} canvas Canvas source from which to read pixels. Can be a string representing the ID of the canvas element, or the `HTMLCanvasElement` itself. * @property {Array>} coordinates Four geographical coordinates denoting where to place the corners of the canvas, specified in `[longitude, latitude]` pairs. * @property {boolean} [animate=true] Whether the canvas source is animated. If the canvas is static (i.e. pixels do not need to be re-read on every frame), `animate` should be set to `false` to improve performance. */ /** * A data source containing the contents of an HTML canvas. See {@link CanvasSourceOptions} for detailed documentation of options. * * @example * // add to map * map.addSource('some id', { * type: 'canvas', * canvas: 'idOfMyHTMLCanvas', * animate: true, * coordinates: [ * [-76.54, 39.18], * [-76.52, 39.18], * [-76.52, 39.17], * [-76.54, 39.17] * ] * }); * * // update * var mySource = map.getSource('some id'); * mySource.setCoordinates([ * [-76.54335737228394, 39.18579907229748], * [-76.52803659439087, 39.1838364847587], * [-76.5295386314392, 39.17683392507606], * [-76.54520273208618, 39.17876344106642] * ]); * * map.removeSource('some id'); // remove */ var CanvasSource = /*@__PURE__*/(function (ImageSource) { function CanvasSource(id , options , dispatcher , eventedParent ) { ImageSource.call(this, id, options, dispatcher, eventedParent); // We build in some validation here, since canvas sources aren't included in the style spec: if (!options.coordinates) { this.fire(new __chunk_1.ErrorEvent(new __chunk_1.ValidationError(("sources." + id), null, 'missing required property "coordinates"'))); } else if (!Array.isArray(options.coordinates) || options.coordinates.length !== 4 || options.coordinates.some(function (c) { return !Array.isArray(c) || c.length !== 2 || c.some(function (l) { return typeof l !== 'number'; }); })) { this.fire(new __chunk_1.ErrorEvent(new __chunk_1.ValidationError(("sources." + id), null, '"coordinates" property must be an array of 4 longitude/latitude array pairs'))); } if (options.animate && typeof options.animate !== 'boolean') { this.fire(new __chunk_1.ErrorEvent(new __chunk_1.ValidationError(("sources." + id), null, 'optional "animate" property must be a boolean value'))); } if (!options.canvas) { this.fire(new __chunk_1.ErrorEvent(new __chunk_1.ValidationError(("sources." + id), null, 'missing required property "canvas"'))); } else if (typeof options.canvas !== 'string' && !(options.canvas instanceof __chunk_1.window.HTMLCanvasElement)) { this.fire(new __chunk_1.ErrorEvent(new __chunk_1.ValidationError(("sources." + id), null, '"canvas" must be either a string representing the ID of the canvas element from which to read, or an HTMLCanvasElement instance'))); } this.options = options; this.animate = options.animate !== undefined ? options.animate : true; } if ( ImageSource ) CanvasSource.__proto__ = ImageSource; CanvasSource.prototype = Object.create( ImageSource && ImageSource.prototype ); CanvasSource.prototype.constructor = CanvasSource; /** * Enables animation. The image will be copied from the canvas to the map on each frame. * @method play * @instance * @memberof CanvasSource */ /** * Disables animation. The map will display a static copy of the canvas image. * @method pause * @instance * @memberof CanvasSource */ CanvasSource.prototype.load = function load () { if (!this.canvas) { this.canvas = (this.options.canvas instanceof __chunk_1.window.HTMLCanvasElement) ? this.options.canvas : __chunk_1.window.document.getElementById(this.options.canvas); } this.width = this.canvas.width; this.height = this.canvas.height; if (this._hasInvalidDimensions()) { this.fire(new __chunk_1.ErrorEvent(new Error('Canvas dimensions cannot be less than or equal to zero.'))); return; } this.play = function() { this._playing = true; this.map.triggerRepaint(); }; this.pause = function() { if (this._playing) { this.prepare(); this._playing = false; } }; this._finishLoading(); }; /** * Returns the HTML `canvas` element. * * @returns {HTMLCanvasElement} The HTML `canvas` element. */ CanvasSource.prototype.getCanvas = function getCanvas () { return this.canvas; }; CanvasSource.prototype.onAdd = function onAdd (map ) { this.map = map; this.load(); if (this.canvas) { if (this.animate) { this.play(); } } }; CanvasSource.prototype.onRemove = function onRemove () { this.pause(); }; /** * Sets the canvas's coordinates and re-renders the map. * * @method setCoordinates * @instance * @memberof CanvasSource * @param {Array>} coordinates Four geographical coordinates, * represented as arrays of longitude and latitude numbers, which define the corners of the canvas. * The coordinates start at the top left corner of the canvas and proceed in clockwise order. * They do not have to represent a rectangle. * @returns {CanvasSource} this */ // setCoordinates inherited from ImageSource CanvasSource.prototype.prepare = function prepare () { var resize = false; if (this.canvas.width !== this.width) { this.width = this.canvas.width; resize = true; } if (this.canvas.height !== this.height) { this.height = this.canvas.height; resize = true; } if (this._hasInvalidDimensions()) { return; } if (Object.keys(this.tiles).length === 0) { return; } // not enough data for current position var context = this.map.painter.context; var gl = context.gl; if (!this.boundsBuffer) { this.boundsBuffer = context.createVertexBuffer(this._boundsArray, __chunk_1.rasterBoundsAttributes.members); } if (!this.boundsSegments) { this.boundsSegments = __chunk_1.SegmentVector.simpleSegment(0, 0, 4, 2); } if (!this.texture) { this.texture = new __chunk_1.Texture(context, this.canvas, gl.RGBA, { premultiply: true }); } else if (resize || this._playing) { this.texture.update(this.canvas, { premultiply: true }); } for (var w in this.tiles) { var tile = this.tiles[w]; if (tile.state !== 'loaded') { tile.state = 'loaded'; tile.texture = this.texture; } } }; CanvasSource.prototype.serialize = function serialize () { return { type: 'canvas', coordinates: this.coordinates }; }; CanvasSource.prototype.hasTransition = function hasTransition () { return this._playing; }; CanvasSource.prototype._hasInvalidDimensions = function _hasInvalidDimensions () { for (var i = 0, list = [this.canvas.width, this.canvas.height]; i < list.length; i += 1) { var x = list[i]; if (isNaN(x) || x <= 0) { return true; } } return false; }; return CanvasSource; }(ImageSource)); // var sourceTypes = { vector: VectorTileSource, raster: RasterTileSource, 'raster-dem': RasterDEMTileSource, geojson: GeoJSONSource, video: VideoSource, image: ImageSource, canvas: CanvasSource }; /* * Creates a tiled data source instance given an options object. * * @param id * @param {Object} source A source definition object compliant with * [`mapbox-gl-style-spec`](https://www.mapbox.com/mapbox-gl-style-spec/#sources) or, for a third-party source type, * with that type's requirements. * @param {Dispatcher} dispatcher * @returns {Source} */ var create = function(id , specification , dispatcher , eventedParent ) { var source = new sourceTypes[specification.type](id, (specification ), dispatcher, eventedParent); if (source.id !== id) { throw new Error(("Expected Source id to be " + id + " instead of " + (source.id))); } __chunk_1.bindAll(['load', 'abort', 'unload', 'serialize', 'prepare'], source); return source; }; var getType = function (name ) { return sourceTypes[name]; }; var setType = function (name , type ) { sourceTypes[name] = type; }; // /* * Returns a matrix that can be used to convert from tile coordinates to viewport pixel coordinates. */ function getPixelPosMatrix(transform, tileID) { var t = __chunk_1.identity([]); __chunk_1.translate(t, t, [1, 1, 0]); __chunk_1.scale(t, t, [transform.width * 0.5, transform.height * 0.5, 1]); return __chunk_1.multiply(t, t, transform.calculatePosMatrix(tileID.toUnwrapped())); } function queryIncludes3DLayer(layers , styleLayers , sourceID ) { if (layers) { for (var i = 0, list = layers; i < list.length; i += 1) { var layerID = list[i]; var layer = styleLayers[layerID]; if (layer && layer.source === sourceID && layer.type === 'fill-extrusion') { return true; } } } else { for (var key in styleLayers) { var layer$1 = styleLayers[key]; if (layer$1.source === sourceID && layer$1.type === 'fill-extrusion') { return true; } } } return false; } function queryRenderedFeatures(sourceCache , styleLayers , queryGeometry , params , transform ) { var has3DLayer = queryIncludes3DLayer(params && params.layers, styleLayers, sourceCache.id); var maxPitchScaleFactor = transform.maxPitchScaleFactor(); var tilesIn = sourceCache.tilesIn(queryGeometry, maxPitchScaleFactor, has3DLayer); tilesIn.sort(sortTilesIn); var renderedFeatureLayers = []; for (var i = 0, list = tilesIn; i < list.length; i += 1) { var tileIn = list[i]; renderedFeatureLayers.push({ wrappedTileID: tileIn.tileID.wrapped().key, queryResults: tileIn.tile.queryRenderedFeatures( styleLayers, sourceCache._state, tileIn.queryGeometry, tileIn.cameraQueryGeometry, tileIn.scale, params, transform, maxPitchScaleFactor, getPixelPosMatrix(sourceCache.transform, tileIn.tileID)) }); } var result = mergeRenderedFeatureLayers(renderedFeatureLayers); // Merge state from SourceCache into the results for (var layerID in result) { result[layerID].forEach(function (featureWrapper) { var feature = featureWrapper.feature; var state = sourceCache.getFeatureState(feature.layer['source-layer'], feature.id); feature.source = feature.layer.source; if (feature.layer['source-layer']) { feature.sourceLayer = feature.layer['source-layer']; } feature.state = state; }); } return result; } function queryRenderedSymbols(styleLayers , sourceCaches , queryGeometry , params , collisionIndex , retainedQueryData ) { var result = {}; var renderedSymbols = collisionIndex.queryRenderedSymbols(queryGeometry); var bucketQueryData = []; for (var i = 0, list = Object.keys(renderedSymbols).map(Number); i < list.length; i += 1) { var bucketInstanceId = list[i]; bucketQueryData.push(retainedQueryData[bucketInstanceId]); } bucketQueryData.sort(sortTilesIn); var loop = function () { var queryData = list$2[i$2]; var bucketSymbols = queryData.featureIndex.lookupSymbolFeatures( renderedSymbols[queryData.bucketInstanceId], queryData.bucketIndex, queryData.sourceLayerIndex, params.filter, params.layers, styleLayers); for (var layerID in bucketSymbols) { var resultFeatures = result[layerID] = result[layerID] || []; var layerSymbols = bucketSymbols[layerID]; layerSymbols.sort(function (a, b) { // Match topDownFeatureComparator from FeatureIndex, but using // most recent sorting of features from bucket.sortFeatures var featureSortOrder = queryData.featureSortOrder; if (featureSortOrder) { // queryRenderedSymbols documentation says we'll return features in // "top-to-bottom" rendering order (aka last-to-first). // Actually there can be multiple symbol instances per feature, so // we sort each feature based on the first matching symbol instance. var sortedA = featureSortOrder.indexOf(a.featureIndex); var sortedB = featureSortOrder.indexOf(b.featureIndex); __chunk_1.assert(sortedA >= 0); __chunk_1.assert(sortedB >= 0); return sortedB - sortedA; } else { // Bucket hasn't been re-sorted based on angle, so use the // reverse of the order the features appeared in the data. return b.featureIndex - a.featureIndex; } }); for (var i$1 = 0, list$1 = layerSymbols; i$1 < list$1.length; i$1 += 1) { var symbolFeature = list$1[i$1]; resultFeatures.push(symbolFeature); } } }; for (var i$2 = 0, list$2 = bucketQueryData; i$2 < list$2.length; i$2 += 1) loop(); // Merge state from SourceCache into the results var loop$1 = function ( layerName ) { result[layerName].forEach(function (featureWrapper) { var feature = featureWrapper.feature; var layer = styleLayers[layerName]; var sourceCache = sourceCaches[layer.source]; var state = sourceCache.getFeatureState(feature.layer['source-layer'], feature.id); feature.source = feature.layer.source; if (feature.layer['source-layer']) { feature.sourceLayer = feature.layer['source-layer']; } feature.state = state; }); }; for (var layerName in result) loop$1( layerName ); return result; } function querySourceFeatures(sourceCache , params ) { var tiles = sourceCache.getRenderableIds().map(function (id) { return sourceCache.getTileByID(id); }); var result = []; var dataTiles = {}; for (var i = 0; i < tiles.length; i++) { var tile = tiles[i]; var dataID = tile.tileID.canonical.key; if (!dataTiles[dataID]) { dataTiles[dataID] = true; tile.querySourceFeatures(result, params); } } return result; } function sortTilesIn(a, b) { var idA = a.tileID; var idB = b.tileID; return (idA.overscaledZ - idB.overscaledZ) || (idA.canonical.y - idB.canonical.y) || (idA.wrap - idB.wrap) || (idA.canonical.x - idB.canonical.x); } function mergeRenderedFeatureLayers(tiles) { // Merge results from all tiles, but if two tiles share the same // wrapped ID, don't duplicate features between the two tiles var result = {}; var wrappedIDLayerMap = {}; for (var i$1 = 0, list$1 = tiles; i$1 < list$1.length; i$1 += 1) { var tile = list$1[i$1]; var queryResults = tile.queryResults; var wrappedID = tile.wrappedTileID; var wrappedIDLayers = wrappedIDLayerMap[wrappedID] = wrappedIDLayerMap[wrappedID] || {}; for (var layerID in queryResults) { var tileFeatures = queryResults[layerID]; var wrappedIDFeatures = wrappedIDLayers[layerID] = wrappedIDLayers[layerID] || {}; var resultFeatures = result[layerID] = result[layerID] || []; for (var i = 0, list = tileFeatures; i < list.length; i += 1) { var tileFeature = list[i]; if (!wrappedIDFeatures[tileFeature.featureIndex]) { wrappedIDFeatures[tileFeature.featureIndex] = true; resultFeatures.push(tileFeature); } } } } return result; } // /** * A [least-recently-used cache](http://en.wikipedia.org/wiki/Cache_algorithms) * with hash lookup made possible by keeping a list of keys in parallel to * an array of dictionary of values * * @private */ var TileCache = function TileCache(max , onRemove ) { this.max = max; this.onRemove = onRemove; this.reset(); }; /** * Clear the cache * * @returns {TileCache} this cache * @private */ TileCache.prototype.reset = function reset () { for (var key in this.data) { for (var i = 0, list = this.data[key]; i < list.length; i += 1) { var removedData = list[i]; if (removedData.timeout) { clearTimeout(removedData.timeout); } this.onRemove(removedData.value); } } this.data = {}; this.order = []; return this; }; /** * Add a key, value combination to the cache, trimming its size if this pushes * it over max length. * * @param {OverscaledTileID} tileID lookup key for the item * @param {*} data any value * * @returns {TileCache} this cache * @private */ TileCache.prototype.add = function add (tileID , data , expiryTimeout ) { var this$1 = this; var key = tileID.wrapped().key; if (this.data[key] === undefined) { this.data[key] = []; } var dataWrapper = { value: data, timeout: undefined }; if (expiryTimeout !== undefined) { dataWrapper.timeout = setTimeout(function () { this$1.remove(tileID, dataWrapper); }, expiryTimeout); } this.data[key].push(dataWrapper); this.order.push(key); if (this.order.length > this.max) { var removedData = this._getAndRemoveByKey(this.order[0]); if (removedData) { this.onRemove(removedData); } } return this; }; /** * Determine whether the value attached to `key` is present * * @param {OverscaledTileID} tileID the key to be looked-up * @returns {boolean} whether the cache has this value * @private */ TileCache.prototype.has = function has (tileID ) { return tileID.wrapped().key in this.data; }; /** * Get the value attached to a specific key and remove data from cache. * If the key is not found, returns `null` * * @param {OverscaledTileID} tileID the key to look up * @returns {*} the data, or null if it isn't found * @private */ TileCache.prototype.getAndRemove = function getAndRemove (tileID ) { if (!this.has(tileID)) { return null; } return this._getAndRemoveByKey(tileID.wrapped().key); }; /* * Get and remove the value with the specified key. */ TileCache.prototype._getAndRemoveByKey = function _getAndRemoveByKey (key ) { var data = this.data[key].shift(); if (data.timeout) { clearTimeout(data.timeout); } if (this.data[key].length === 0) { delete this.data[key]; } this.order.splice(this.order.indexOf(key), 1); return data.value; }; /** * Get the value attached to a specific key without removing data * from the cache. If the key is not found, returns `null` * * @param {OverscaledTileID} tileID the key to look up * @returns {*} the data, or null if it isn't found * @private */ TileCache.prototype.get = function get (tileID ) { if (!this.has(tileID)) { return null; } var data = this.data[tileID.wrapped().key][0]; return data.value; }; /** * Remove a key/value combination from the cache. * * @param {OverscaledTileID} tileID the key for the pair to delete * @param {Tile} value If a value is provided, remove that exact version of the value. * @returns {TileCache} this cache * @private */ TileCache.prototype.remove = function remove (tileID , value ) { if (!this.has(tileID)) { return this; } var key = tileID.wrapped().key; var dataIndex = value === undefined ? 0 : this.data[key].indexOf(value); var data = this.data[key][dataIndex]; this.data[key].splice(dataIndex, 1); if (data.timeout) { clearTimeout(data.timeout); } if (this.data[key].length === 0) { delete this.data[key]; } this.onRemove(data.value); this.order.splice(this.order.indexOf(key), 1); return this; }; /** * Change the max size of the cache. * * @param {number} max the max size of the cache * @returns {TileCache} this cache * @private */ TileCache.prototype.setMaxSize = function setMaxSize (max ) { this.max = max; while (this.order.length > this.max) { var removedData = this._getAndRemoveByKey(this.order[0]); if (removedData) { this.onRemove(removedData); } } return this; }; // var IndexBuffer = function IndexBuffer(context , array , dynamicDraw ) { this.context = context; var gl = context.gl; this.buffer = gl.createBuffer(); this.dynamicDraw = Boolean(dynamicDraw); // The bound index buffer is part of vertex array object state. We don't want to // modify whatever VAO happens to be currently bound, so make sure the default // vertex array provided by the context is bound instead. this.context.unbindVAO(); context.bindElementBuffer.set(this.buffer); gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, array.arrayBuffer, this.dynamicDraw ? gl.DYNAMIC_DRAW : gl.STATIC_DRAW); if (!this.dynamicDraw) { delete array.arrayBuffer; } }; IndexBuffer.prototype.bind = function bind () { this.context.bindElementBuffer.set(this.buffer); }; IndexBuffer.prototype.updateData = function updateData (array ) { var gl = this.context.gl; __chunk_1.assert(this.dynamicDraw); // The right VAO will get this buffer re-bound later in VertexArrayObject#bind // See https://github.com/mapbox/mapbox-gl-js/issues/5620 this.context.unbindVAO(); this.bind(); gl.bufferSubData(gl.ELEMENT_ARRAY_BUFFER, 0, array.arrayBuffer); }; IndexBuffer.prototype.destroy = function destroy () { var gl = this.context.gl; if (this.buffer) { gl.deleteBuffer(this.buffer); delete this.buffer; } }; // /** * @enum {string} AttributeType * @private * @readonly */ var AttributeType = { Int8: 'BYTE', Uint8: 'UNSIGNED_BYTE', Int16: 'SHORT', Uint16: 'UNSIGNED_SHORT', Int32: 'INT', Uint32: 'UNSIGNED_INT', Float32: 'FLOAT' }; /** * The `VertexBuffer` class turns a `StructArray` into a WebGL buffer. Each member of the StructArray's * Struct type is converted to a WebGL atribute. * @private */ var VertexBuffer = function VertexBuffer(context , array , attributes , dynamicDraw ) { this.length = array.length; this.attributes = attributes; this.itemSize = array.bytesPerElement; this.dynamicDraw = dynamicDraw; this.context = context; var gl = context.gl; this.buffer = gl.createBuffer(); context.bindVertexBuffer.set(this.buffer); gl.bufferData(gl.ARRAY_BUFFER, array.arrayBuffer, this.dynamicDraw ? gl.DYNAMIC_DRAW : gl.STATIC_DRAW); if (!this.dynamicDraw) { delete array.arrayBuffer; } }; VertexBuffer.prototype.bind = function bind () { this.context.bindVertexBuffer.set(this.buffer); }; VertexBuffer.prototype.updateData = function updateData (array ) { __chunk_1.assert(array.length === this.length); var gl = this.context.gl; this.bind(); gl.bufferSubData(gl.ARRAY_BUFFER, 0, array.arrayBuffer); }; VertexBuffer.prototype.enableAttributes = function enableAttributes (gl , program ) { for (var j = 0; j < this.attributes.length; j++) { var member = this.attributes[j]; var attribIndex = program.attributes[member.name]; if (attribIndex !== undefined) { gl.enableVertexAttribArray(attribIndex); } } }; /** * Set the attribute pointers in a WebGL context * @param gl The WebGL context * @param program The active WebGL program * @param vertexOffset Index of the starting vertex of the segment */ VertexBuffer.prototype.setVertexAttribPointers = function setVertexAttribPointers (gl , program , vertexOffset ) { for (var j = 0; j < this.attributes.length; j++) { var member = this.attributes[j]; var attribIndex = program.attributes[member.name]; if (attribIndex !== undefined) { gl.vertexAttribPointer( attribIndex, member.components, (gl )[AttributeType[member.type]], false, this.itemSize, member.offset + (this.itemSize * (vertexOffset || 0)) ); } } }; /** * Destroy the GL buffer bound to the given WebGL context */ VertexBuffer.prototype.destroy = function destroy () { var gl = this.context.gl; if (this.buffer) { gl.deleteBuffer(this.buffer); delete this.buffer; } }; // var BaseValue = function BaseValue(context ) { this.gl = context.gl; this.default = this.getDefault(); this.current = this.default; this.dirty = false; }; BaseValue.prototype.get = function get (){ return this.current; }; BaseValue.prototype.set = function set (value ) { // eslint-disable-line // overridden in child classes; }; BaseValue.prototype.getDefault = function getDefault (){ return this.default; // overriden in child classes }; BaseValue.prototype.setDefault = function setDefault () { this.set(this.default); }; var ClearColor = /*@__PURE__*/(function (BaseValue) { function ClearColor () { BaseValue.apply(this, arguments); } if ( BaseValue ) ClearColor.__proto__ = BaseValue; ClearColor.prototype = Object.create( BaseValue && BaseValue.prototype ); ClearColor.prototype.constructor = ClearColor; ClearColor.prototype.getDefault = function getDefault () { return __chunk_1.Color.transparent; }; ClearColor.prototype.set = function set (v ) { var c = this.current; if (v.r === c.r && v.g === c.g && v.b === c.b && v.a === c.a && !this.dirty) { return; } this.gl.clearColor(v.r, v.g, v.b, v.a); this.current = v; this.dirty = false; }; return ClearColor; }(BaseValue)); var ClearDepth = /*@__PURE__*/(function (BaseValue) { function ClearDepth () { BaseValue.apply(this, arguments); } if ( BaseValue ) ClearDepth.__proto__ = BaseValue; ClearDepth.prototype = Object.create( BaseValue && BaseValue.prototype ); ClearDepth.prototype.constructor = ClearDepth; ClearDepth.prototype.getDefault = function getDefault () { return 1; }; ClearDepth.prototype.set = function set (v ) { if (v === this.current && !this.dirty) { return; } this.gl.clearDepth(v); this.current = v; this.dirty = false; }; return ClearDepth; }(BaseValue)); var ClearStencil = /*@__PURE__*/(function (BaseValue) { function ClearStencil () { BaseValue.apply(this, arguments); } if ( BaseValue ) ClearStencil.__proto__ = BaseValue; ClearStencil.prototype = Object.create( BaseValue && BaseValue.prototype ); ClearStencil.prototype.constructor = ClearStencil; ClearStencil.prototype.getDefault = function getDefault () { return 0; }; ClearStencil.prototype.set = function set (v ) { if (v === this.current && !this.dirty) { return; } this.gl.clearStencil(v); this.current = v; this.dirty = false; }; return ClearStencil; }(BaseValue)); var ColorMask = /*@__PURE__*/(function (BaseValue) { function ColorMask () { BaseValue.apply(this, arguments); } if ( BaseValue ) ColorMask.__proto__ = BaseValue; ColorMask.prototype = Object.create( BaseValue && BaseValue.prototype ); ColorMask.prototype.constructor = ColorMask; ColorMask.prototype.getDefault = function getDefault () { return [true, true, true, true]; }; ColorMask.prototype.set = function set (v ) { var c = this.current; if (v[0] === c[0] && v[1] === c[1] && v[2] === c[2] && v[3] === c[3] && !this.dirty) { return; } this.gl.colorMask(v[0], v[1], v[2], v[3]); this.current = v; this.dirty = false; }; return ColorMask; }(BaseValue)); var DepthMask = /*@__PURE__*/(function (BaseValue) { function DepthMask () { BaseValue.apply(this, arguments); } if ( BaseValue ) DepthMask.__proto__ = BaseValue; DepthMask.prototype = Object.create( BaseValue && BaseValue.prototype ); DepthMask.prototype.constructor = DepthMask; DepthMask.prototype.getDefault = function getDefault () { return true; }; DepthMask.prototype.set = function set (v ) { if (v === this.current && !this.dirty) { return; } this.gl.depthMask(v); this.current = v; this.dirty = false; }; return DepthMask; }(BaseValue)); var StencilMask = /*@__PURE__*/(function (BaseValue) { function StencilMask () { BaseValue.apply(this, arguments); } if ( BaseValue ) StencilMask.__proto__ = BaseValue; StencilMask.prototype = Object.create( BaseValue && BaseValue.prototype ); StencilMask.prototype.constructor = StencilMask; StencilMask.prototype.getDefault = function getDefault () { return 0xFF; }; StencilMask.prototype.set = function set (v ) { if (v === this.current && !this.dirty) { return; } this.gl.stencilMask(v); this.current = v; this.dirty = false; }; return StencilMask; }(BaseValue)); var StencilFunc = /*@__PURE__*/(function (BaseValue) { function StencilFunc () { BaseValue.apply(this, arguments); } if ( BaseValue ) StencilFunc.__proto__ = BaseValue; StencilFunc.prototype = Object.create( BaseValue && BaseValue.prototype ); StencilFunc.prototype.constructor = StencilFunc; StencilFunc.prototype.getDefault = function getDefault () { return { func: this.gl.ALWAYS, ref: 0, mask: 0xFF }; }; StencilFunc.prototype.set = function set (v ) { var c = this.current; if (v.func === c.func && v.ref === c.ref && v.mask === c.mask && !this.dirty) { return; } this.gl.stencilFunc(v.func, v.ref, v.mask); this.current = v; this.dirty = false; }; return StencilFunc; }(BaseValue)); var StencilOp = /*@__PURE__*/(function (BaseValue) { function StencilOp () { BaseValue.apply(this, arguments); } if ( BaseValue ) StencilOp.__proto__ = BaseValue; StencilOp.prototype = Object.create( BaseValue && BaseValue.prototype ); StencilOp.prototype.constructor = StencilOp; StencilOp.prototype.getDefault = function getDefault () { var gl = this.gl; return [gl.KEEP, gl.KEEP, gl.KEEP]; }; StencilOp.prototype.set = function set (v ) { var c = this.current; if (v[0] === c[0] && v[1] === c[1] && v[2] === c[2] && !this.dirty) { return; } this.gl.stencilOp(v[0], v[1], v[2]); this.current = v; this.dirty = false; }; return StencilOp; }(BaseValue)); var StencilTest = /*@__PURE__*/(function (BaseValue) { function StencilTest () { BaseValue.apply(this, arguments); } if ( BaseValue ) StencilTest.__proto__ = BaseValue; StencilTest.prototype = Object.create( BaseValue && BaseValue.prototype ); StencilTest.prototype.constructor = StencilTest; StencilTest.prototype.getDefault = function getDefault () { return false; }; StencilTest.prototype.set = function set (v ) { if (v === this.current && !this.dirty) { return; } var gl = this.gl; if (v) { gl.enable(gl.STENCIL_TEST); } else { gl.disable(gl.STENCIL_TEST); } this.current = v; this.dirty = false; }; return StencilTest; }(BaseValue)); var DepthRange = /*@__PURE__*/(function (BaseValue) { function DepthRange () { BaseValue.apply(this, arguments); } if ( BaseValue ) DepthRange.__proto__ = BaseValue; DepthRange.prototype = Object.create( BaseValue && BaseValue.prototype ); DepthRange.prototype.constructor = DepthRange; DepthRange.prototype.getDefault = function getDefault () { return [0, 1]; }; DepthRange.prototype.set = function set (v ) { var c = this.current; if (v[0] === c[0] && v[1] === c[1] && !this.dirty) { return; } this.gl.depthRange(v[0], v[1]); this.current = v; this.dirty = false; }; return DepthRange; }(BaseValue)); var DepthTest = /*@__PURE__*/(function (BaseValue) { function DepthTest () { BaseValue.apply(this, arguments); } if ( BaseValue ) DepthTest.__proto__ = BaseValue; DepthTest.prototype = Object.create( BaseValue && BaseValue.prototype ); DepthTest.prototype.constructor = DepthTest; DepthTest.prototype.getDefault = function getDefault () { return false; }; DepthTest.prototype.set = function set (v ) { if (v === this.current && !this.dirty) { return; } var gl = this.gl; if (v) { gl.enable(gl.DEPTH_TEST); } else { gl.disable(gl.DEPTH_TEST); } this.current = v; this.dirty = false; }; return DepthTest; }(BaseValue)); var DepthFunc = /*@__PURE__*/(function (BaseValue) { function DepthFunc () { BaseValue.apply(this, arguments); } if ( BaseValue ) DepthFunc.__proto__ = BaseValue; DepthFunc.prototype = Object.create( BaseValue && BaseValue.prototype ); DepthFunc.prototype.constructor = DepthFunc; DepthFunc.prototype.getDefault = function getDefault () { return this.gl.LESS; }; DepthFunc.prototype.set = function set (v ) { if (v === this.current && !this.dirty) { return; } this.gl.depthFunc(v); this.current = v; this.dirty = false; }; return DepthFunc; }(BaseValue)); var Blend = /*@__PURE__*/(function (BaseValue) { function Blend () { BaseValue.apply(this, arguments); } if ( BaseValue ) Blend.__proto__ = BaseValue; Blend.prototype = Object.create( BaseValue && BaseValue.prototype ); Blend.prototype.constructor = Blend; Blend.prototype.getDefault = function getDefault () { return false; }; Blend.prototype.set = function set (v ) { if (v === this.current && !this.dirty) { return; } var gl = this.gl; if (v) { gl.enable(gl.BLEND); } else { gl.disable(gl.BLEND); } this.current = v; this.dirty = false; }; return Blend; }(BaseValue)); var BlendFunc = /*@__PURE__*/(function (BaseValue) { function BlendFunc () { BaseValue.apply(this, arguments); } if ( BaseValue ) BlendFunc.__proto__ = BaseValue; BlendFunc.prototype = Object.create( BaseValue && BaseValue.prototype ); BlendFunc.prototype.constructor = BlendFunc; BlendFunc.prototype.getDefault = function getDefault () { var gl = this.gl; return [gl.ONE, gl.ZERO]; }; BlendFunc.prototype.set = function set (v ) { var c = this.current; if (v[0] === c[0] && v[1] === c[1] && !this.dirty) { return; } this.gl.blendFunc(v[0], v[1]); this.current = v; this.dirty = false; }; return BlendFunc; }(BaseValue)); var BlendColor = /*@__PURE__*/(function (BaseValue) { function BlendColor () { BaseValue.apply(this, arguments); } if ( BaseValue ) BlendColor.__proto__ = BaseValue; BlendColor.prototype = Object.create( BaseValue && BaseValue.prototype ); BlendColor.prototype.constructor = BlendColor; BlendColor.prototype.getDefault = function getDefault () { return __chunk_1.Color.transparent; }; BlendColor.prototype.set = function set (v ) { var c = this.current; if (v.r === c.r && v.g === c.g && v.b === c.b && v.a === c.a && !this.dirty) { return; } this.gl.blendColor(v.r, v.g, v.b, v.a); this.current = v; this.dirty = false; }; return BlendColor; }(BaseValue)); var BlendEquation = /*@__PURE__*/(function (BaseValue) { function BlendEquation () { BaseValue.apply(this, arguments); } if ( BaseValue ) BlendEquation.__proto__ = BaseValue; BlendEquation.prototype = Object.create( BaseValue && BaseValue.prototype ); BlendEquation.prototype.constructor = BlendEquation; BlendEquation.prototype.getDefault = function getDefault () { return this.gl.FUNC_ADD; }; BlendEquation.prototype.set = function set (v ) { if (v === this.current && !this.dirty) { return; } this.gl.blendEquation(v); this.current = v; this.dirty = false; }; return BlendEquation; }(BaseValue)); var CullFace = /*@__PURE__*/(function (BaseValue) { function CullFace () { BaseValue.apply(this, arguments); } if ( BaseValue ) CullFace.__proto__ = BaseValue; CullFace.prototype = Object.create( BaseValue && BaseValue.prototype ); CullFace.prototype.constructor = CullFace; CullFace.prototype.getDefault = function getDefault () { return false; }; CullFace.prototype.set = function set (v ) { if (v === this.current && !this.dirty) { return; } var gl = this.gl; if (v) { gl.enable(gl.CULL_FACE); } else { gl.disable(gl.CULL_FACE); } this.current = v; this.dirty = false; }; return CullFace; }(BaseValue)); var CullFaceSide = /*@__PURE__*/(function (BaseValue) { function CullFaceSide () { BaseValue.apply(this, arguments); } if ( BaseValue ) CullFaceSide.__proto__ = BaseValue; CullFaceSide.prototype = Object.create( BaseValue && BaseValue.prototype ); CullFaceSide.prototype.constructor = CullFaceSide; CullFaceSide.prototype.getDefault = function getDefault () { return this.gl.BACK; }; CullFaceSide.prototype.set = function set (v ) { if (v === this.current && !this.dirty) { return; } this.gl.cullFace(v); this.current = v; this.dirty = false; }; return CullFaceSide; }(BaseValue)); var FrontFace = /*@__PURE__*/(function (BaseValue) { function FrontFace () { BaseValue.apply(this, arguments); } if ( BaseValue ) FrontFace.__proto__ = BaseValue; FrontFace.prototype = Object.create( BaseValue && BaseValue.prototype ); FrontFace.prototype.constructor = FrontFace; FrontFace.prototype.getDefault = function getDefault () { return this.gl.CCW; }; FrontFace.prototype.set = function set (v ) { if (v === this.current && !this.dirty) { return; } this.gl.frontFace(v); this.current = v; this.dirty = false; }; return FrontFace; }(BaseValue)); var Program = /*@__PURE__*/(function (BaseValue) { function Program () { BaseValue.apply(this, arguments); } if ( BaseValue ) Program.__proto__ = BaseValue; Program.prototype = Object.create( BaseValue && BaseValue.prototype ); Program.prototype.constructor = Program; Program.prototype.getDefault = function getDefault () { return null; }; Program.prototype.set = function set (v ) { if (v === this.current && !this.dirty) { return; } this.gl.useProgram(v); this.current = v; this.dirty = false; }; return Program; }(BaseValue)); var ActiveTextureUnit = /*@__PURE__*/(function (BaseValue) { function ActiveTextureUnit () { BaseValue.apply(this, arguments); } if ( BaseValue ) ActiveTextureUnit.__proto__ = BaseValue; ActiveTextureUnit.prototype = Object.create( BaseValue && BaseValue.prototype ); ActiveTextureUnit.prototype.constructor = ActiveTextureUnit; ActiveTextureUnit.prototype.getDefault = function getDefault () { return this.gl.TEXTURE0; }; ActiveTextureUnit.prototype.set = function set (v ) { if (v === this.current && !this.dirty) { return; } this.gl.activeTexture(v); this.current = v; this.dirty = false; }; return ActiveTextureUnit; }(BaseValue)); var Viewport = /*@__PURE__*/(function (BaseValue) { function Viewport () { BaseValue.apply(this, arguments); } if ( BaseValue ) Viewport.__proto__ = BaseValue; Viewport.prototype = Object.create( BaseValue && BaseValue.prototype ); Viewport.prototype.constructor = Viewport; Viewport.prototype.getDefault = function getDefault () { var gl = this.gl; return [0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight]; }; Viewport.prototype.set = function set (v ) { var c = this.current; if (v[0] === c[0] && v[1] === c[1] && v[2] === c[2] && v[3] === c[3] && !this.dirty) { return; } this.gl.viewport(v[0], v[1], v[2], v[3]); this.current = v; this.dirty = false; }; return Viewport; }(BaseValue)); var BindFramebuffer = /*@__PURE__*/(function (BaseValue) { function BindFramebuffer () { BaseValue.apply(this, arguments); } if ( BaseValue ) BindFramebuffer.__proto__ = BaseValue; BindFramebuffer.prototype = Object.create( BaseValue && BaseValue.prototype ); BindFramebuffer.prototype.constructor = BindFramebuffer; BindFramebuffer.prototype.getDefault = function getDefault () { return null; }; BindFramebuffer.prototype.set = function set (v ) { if (v === this.current && !this.dirty) { return; } var gl = this.gl; gl.bindFramebuffer(gl.FRAMEBUFFER, v); this.current = v; this.dirty = false; }; return BindFramebuffer; }(BaseValue)); var BindRenderbuffer = /*@__PURE__*/(function (BaseValue) { function BindRenderbuffer () { BaseValue.apply(this, arguments); } if ( BaseValue ) BindRenderbuffer.__proto__ = BaseValue; BindRenderbuffer.prototype = Object.create( BaseValue && BaseValue.prototype ); BindRenderbuffer.prototype.constructor = BindRenderbuffer; BindRenderbuffer.prototype.getDefault = function getDefault () { return null; }; BindRenderbuffer.prototype.set = function set (v ) { if (v === this.current && !this.dirty) { return; } var gl = this.gl; gl.bindRenderbuffer(gl.RENDERBUFFER, v); this.current = v; this.dirty = false; }; return BindRenderbuffer; }(BaseValue)); var BindTexture = /*@__PURE__*/(function (BaseValue) { function BindTexture () { BaseValue.apply(this, arguments); } if ( BaseValue ) BindTexture.__proto__ = BaseValue; BindTexture.prototype = Object.create( BaseValue && BaseValue.prototype ); BindTexture.prototype.constructor = BindTexture; BindTexture.prototype.getDefault = function getDefault () { return null; }; BindTexture.prototype.set = function set (v ) { if (v === this.current && !this.dirty) { return; } var gl = this.gl; gl.bindTexture(gl.TEXTURE_2D, v); this.current = v; this.dirty = false; }; return BindTexture; }(BaseValue)); var BindVertexBuffer = /*@__PURE__*/(function (BaseValue) { function BindVertexBuffer () { BaseValue.apply(this, arguments); } if ( BaseValue ) BindVertexBuffer.__proto__ = BaseValue; BindVertexBuffer.prototype = Object.create( BaseValue && BaseValue.prototype ); BindVertexBuffer.prototype.constructor = BindVertexBuffer; BindVertexBuffer.prototype.getDefault = function getDefault () { return null; }; BindVertexBuffer.prototype.set = function set (v ) { if (v === this.current && !this.dirty) { return; } var gl = this.gl; gl.bindBuffer(gl.ARRAY_BUFFER, v); this.current = v; this.dirty = false; }; return BindVertexBuffer; }(BaseValue)); var BindElementBuffer = /*@__PURE__*/(function (BaseValue) { function BindElementBuffer () { BaseValue.apply(this, arguments); } if ( BaseValue ) BindElementBuffer.__proto__ = BaseValue; BindElementBuffer.prototype = Object.create( BaseValue && BaseValue.prototype ); BindElementBuffer.prototype.constructor = BindElementBuffer; BindElementBuffer.prototype.getDefault = function getDefault () { return null; }; BindElementBuffer.prototype.set = function set (v ) { // Always rebind var gl = this.gl; gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, v); this.current = v; this.dirty = false; }; return BindElementBuffer; }(BaseValue)); var BindVertexArrayOES = /*@__PURE__*/(function (BaseValue) { function BindVertexArrayOES(context ) { BaseValue.call(this, context); this.vao = context.extVertexArrayObject; } if ( BaseValue ) BindVertexArrayOES.__proto__ = BaseValue; BindVertexArrayOES.prototype = Object.create( BaseValue && BaseValue.prototype ); BindVertexArrayOES.prototype.constructor = BindVertexArrayOES; BindVertexArrayOES.prototype.getDefault = function getDefault () { return null; }; BindVertexArrayOES.prototype.set = function set (v ) { if (!this.vao || v === this.current && !this.dirty) { return; } this.vao.bindVertexArrayOES(v); this.current = v; this.dirty = false; }; return BindVertexArrayOES; }(BaseValue)); var PixelStoreUnpack = /*@__PURE__*/(function (BaseValue) { function PixelStoreUnpack () { BaseValue.apply(this, arguments); } if ( BaseValue ) PixelStoreUnpack.__proto__ = BaseValue; PixelStoreUnpack.prototype = Object.create( BaseValue && BaseValue.prototype ); PixelStoreUnpack.prototype.constructor = PixelStoreUnpack; PixelStoreUnpack.prototype.getDefault = function getDefault () { return 4; }; PixelStoreUnpack.prototype.set = function set (v ) { if (v === this.current && !this.dirty) { return; } var gl = this.gl; gl.pixelStorei(gl.UNPACK_ALIGNMENT, v); this.current = v; this.dirty = false; }; return PixelStoreUnpack; }(BaseValue)); var PixelStoreUnpackPremultiplyAlpha = /*@__PURE__*/(function (BaseValue) { function PixelStoreUnpackPremultiplyAlpha () { BaseValue.apply(this, arguments); } if ( BaseValue ) PixelStoreUnpackPremultiplyAlpha.__proto__ = BaseValue; PixelStoreUnpackPremultiplyAlpha.prototype = Object.create( BaseValue && BaseValue.prototype ); PixelStoreUnpackPremultiplyAlpha.prototype.constructor = PixelStoreUnpackPremultiplyAlpha; PixelStoreUnpackPremultiplyAlpha.prototype.getDefault = function getDefault () { return false; }; PixelStoreUnpackPremultiplyAlpha.prototype.set = function set (v ) { if (v === this.current && !this.dirty) { return; } var gl = this.gl; gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, (v )); this.current = v; this.dirty = false; }; return PixelStoreUnpackPremultiplyAlpha; }(BaseValue)); var PixelStoreUnpackFlipY = /*@__PURE__*/(function (BaseValue) { function PixelStoreUnpackFlipY () { BaseValue.apply(this, arguments); } if ( BaseValue ) PixelStoreUnpackFlipY.__proto__ = BaseValue; PixelStoreUnpackFlipY.prototype = Object.create( BaseValue && BaseValue.prototype ); PixelStoreUnpackFlipY.prototype.constructor = PixelStoreUnpackFlipY; PixelStoreUnpackFlipY.prototype.getDefault = function getDefault () { return false; }; PixelStoreUnpackFlipY.prototype.set = function set (v ) { if (v === this.current && !this.dirty) { return; } var gl = this.gl; gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, (v )); this.current = v; this.dirty = false; }; return PixelStoreUnpackFlipY; }(BaseValue)); var FramebufferAttachment = /*@__PURE__*/(function (BaseValue) { function FramebufferAttachment(context , parent ) { BaseValue.call(this, context); this.context = context; this.parent = parent; } if ( BaseValue ) FramebufferAttachment.__proto__ = BaseValue; FramebufferAttachment.prototype = Object.create( BaseValue && BaseValue.prototype ); FramebufferAttachment.prototype.constructor = FramebufferAttachment; FramebufferAttachment.prototype.getDefault = function getDefault () { return null; }; return FramebufferAttachment; }(BaseValue)); var ColorAttachment = /*@__PURE__*/(function (FramebufferAttachment) { function ColorAttachment () { FramebufferAttachment.apply(this, arguments); } if ( FramebufferAttachment ) ColorAttachment.__proto__ = FramebufferAttachment; ColorAttachment.prototype = Object.create( FramebufferAttachment && FramebufferAttachment.prototype ); ColorAttachment.prototype.constructor = ColorAttachment; ColorAttachment.prototype.setDirty = function setDirty () { this.dirty = true; }; ColorAttachment.prototype.set = function set (v ) { if (v === this.current && !this.dirty) { return; } this.context.bindFramebuffer.set(this.parent); // note: it's possible to attach a renderbuffer to the color // attachment point, but thus far MBGL only uses textures for color var gl = this.gl; gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, v, 0); this.current = v; this.dirty = false; }; return ColorAttachment; }(FramebufferAttachment)); var DepthAttachment = /*@__PURE__*/(function (FramebufferAttachment) { function DepthAttachment () { FramebufferAttachment.apply(this, arguments); } if ( FramebufferAttachment ) DepthAttachment.__proto__ = FramebufferAttachment; DepthAttachment.prototype = Object.create( FramebufferAttachment && FramebufferAttachment.prototype ); DepthAttachment.prototype.constructor = DepthAttachment; DepthAttachment.prototype.set = function set (v ) { if (v === this.current && !this.dirty) { return; } this.context.bindFramebuffer.set(this.parent); // note: it's possible to attach a texture to the depth attachment // point, but thus far MBGL only uses renderbuffers for depth var gl = this.gl; gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.RENDERBUFFER, v); this.current = v; this.dirty = false; }; return DepthAttachment; }(FramebufferAttachment)); // var Framebuffer = function Framebuffer(context , width , height ) { this.context = context; this.width = width; this.height = height; var gl = context.gl; var fbo = this.framebuffer = gl.createFramebuffer(); this.colorAttachment = new ColorAttachment(context, fbo); this.depthAttachment = new DepthAttachment(context, fbo); }; Framebuffer.prototype.destroy = function destroy () { var gl = this.context.gl; var texture = this.colorAttachment.get(); if (texture) { gl.deleteTexture(texture); } var renderbuffer = this.depthAttachment.get(); if (renderbuffer) { gl.deleteRenderbuffer(renderbuffer); } gl.deleteFramebuffer(this.framebuffer); }; // var ALWAYS = 0x0207; var DepthMode = function DepthMode(depthFunc , depthMask , depthRange ) { this.func = depthFunc; this.mask = depthMask; this.range = depthRange; }; DepthMode.ReadOnly = false; DepthMode.ReadWrite = true; DepthMode.disabled = new DepthMode(ALWAYS, DepthMode.ReadOnly, [0, 1]); // var ALWAYS$1 = 0x0207; var KEEP = 0x1E00; var StencilMode = function StencilMode(test , ref , mask , fail , depthFail , pass ) { this.test = test; this.ref = ref; this.mask = mask; this.fail = fail; this.depthFail = depthFail; this.pass = pass; }; StencilMode.disabled = new StencilMode({ func: ALWAYS$1, mask: 0 }, 0, 0, KEEP, KEEP, KEEP); // var ZERO = 0x0000; var ONE = 0x0001; var ONE_MINUS_SRC_ALPHA = 0x0303; var ColorMode = function ColorMode(blendFunction , blendColor , mask ) { this.blendFunction = blendFunction; this.blendColor = blendColor; this.mask = mask; }; ColorMode.Replace = [ONE, ZERO]; ColorMode.disabled = new ColorMode(ColorMode.Replace, __chunk_1.Color.transparent, [false, false, false, false]); ColorMode.unblended = new ColorMode(ColorMode.Replace, __chunk_1.Color.transparent, [true, true, true, true]); ColorMode.alphaBlended = new ColorMode([ONE, ONE_MINUS_SRC_ALPHA], __chunk_1.Color.transparent, [true, true, true, true]); // var BACK = 0x0405; var CCW = 0x0901; var CullFaceMode = function CullFaceMode(enable , mode , frontFace ) { this.enable = enable; this.mode = mode; this.frontFace = frontFace; }; CullFaceMode.disabled = new CullFaceMode(false, BACK, CCW); CullFaceMode.backCCW = new CullFaceMode(true, BACK, CCW); // var Context = function Context(gl ) { this.gl = gl; this.extVertexArrayObject = this.gl.getExtension('OES_vertex_array_object'); this.clearColor = new ClearColor(this); this.clearDepth = new ClearDepth(this); this.clearStencil = new ClearStencil(this); this.colorMask = new ColorMask(this); this.depthMask = new DepthMask(this); this.stencilMask = new StencilMask(this); this.stencilFunc = new StencilFunc(this); this.stencilOp = new StencilOp(this); this.stencilTest = new StencilTest(this); this.depthRange = new DepthRange(this); this.depthTest = new DepthTest(this); this.depthFunc = new DepthFunc(this); this.blend = new Blend(this); this.blendFunc = new BlendFunc(this); this.blendColor = new BlendColor(this); this.blendEquation = new BlendEquation(this); this.cullFace = new CullFace(this); this.cullFaceSide = new CullFaceSide(this); this.frontFace = new FrontFace(this); this.program = new Program(this); this.activeTexture = new ActiveTextureUnit(this); this.viewport = new Viewport(this); this.bindFramebuffer = new BindFramebuffer(this); this.bindRenderbuffer = new BindRenderbuffer(this); this.bindTexture = new BindTexture(this); this.bindVertexBuffer = new BindVertexBuffer(this); this.bindElementBuffer = new BindElementBuffer(this); this.bindVertexArrayOES = this.extVertexArrayObject && new BindVertexArrayOES(this); this.pixelStoreUnpack = new PixelStoreUnpack(this); this.pixelStoreUnpackPremultiplyAlpha = new PixelStoreUnpackPremultiplyAlpha(this); this.pixelStoreUnpackFlipY = new PixelStoreUnpackFlipY(this); this.extTextureFilterAnisotropic = ( gl.getExtension('EXT_texture_filter_anisotropic') || gl.getExtension('MOZ_EXT_texture_filter_anisotropic') || gl.getExtension('WEBKIT_EXT_texture_filter_anisotropic') ); if (this.extTextureFilterAnisotropic) { this.extTextureFilterAnisotropicMax = gl.getParameter(this.extTextureFilterAnisotropic.MAX_TEXTURE_MAX_ANISOTROPY_EXT); } this.extTextureHalfFloat = gl.getExtension('OES_texture_half_float'); if (this.extTextureHalfFloat) { gl.getExtension('OES_texture_half_float_linear'); } }; Context.prototype.setDirty = function setDirty () { this.clearColor.dirty = true; this.clearDepth.dirty = true; this.clearStencil.dirty = true; this.colorMask.dirty = true; this.depthMask.dirty = true; this.stencilMask.dirty = true; this.stencilFunc.dirty = true; this.stencilOp.dirty = true; this.stencilTest.dirty = true; this.depthRange.dirty = true; this.depthTest.dirty = true; this.depthFunc.dirty = true; this.blend.dirty = true; this.blendFunc.dirty = true; this.blendColor.dirty = true; this.blendEquation.dirty = true; this.cullFace.dirty = true; this.cullFaceSide.dirty = true; this.frontFace.dirty = true; this.program.dirty = true; this.activeTexture.dirty = true; this.viewport.dirty = true; this.bindFramebuffer.dirty = true; this.bindRenderbuffer.dirty = true; this.bindTexture.dirty = true; this.bindVertexBuffer.dirty = true; this.bindElementBuffer.dirty = true; if (this.extVertexArrayObject) { this.bindVertexArrayOES.dirty = true; } this.pixelStoreUnpack.dirty = true; this.pixelStoreUnpackPremultiplyAlpha.dirty = true; this.pixelStoreUnpackFlipY.dirty = true; }; Context.prototype.createIndexBuffer = function createIndexBuffer (array , dynamicDraw ) { return new IndexBuffer(this, array, dynamicDraw); }; Context.prototype.createVertexBuffer = function createVertexBuffer (array , attributes , dynamicDraw ) { return new VertexBuffer(this, array, attributes, dynamicDraw); }; Context.prototype.createRenderbuffer = function createRenderbuffer (storageFormat , width , height ) { var gl = this.gl; var rbo = gl.createRenderbuffer(); this.bindRenderbuffer.set(rbo); gl.renderbufferStorage(gl.RENDERBUFFER, storageFormat, width, height); this.bindRenderbuffer.set(null); return rbo; }; Context.prototype.createFramebuffer = function createFramebuffer (width , height ) { return new Framebuffer(this, width, height); }; Context.prototype.clear = function clear (ref ) { var color = ref.color; var depth = ref.depth; var gl = this.gl; var mask = 0; if (color) { mask |= gl.COLOR_BUFFER_BIT; this.clearColor.set(color); this.colorMask.set([true, true, true, true]); } if (typeof depth !== 'undefined') { mask |= gl.DEPTH_BUFFER_BIT; // Workaround for platforms where clearDepth doesn't seem to work // without reseting the depthRange. See https://github.com/mapbox/mapbox-gl-js/issues/3437 this.depthRange.set([0, 1]); this.clearDepth.set(depth); this.depthMask.set(true); } // See note in Painter#clearStencil: implement this the easy way once GPU bug/workaround is fixed upstream // if (typeof stencil !== 'undefined') { // mask |= gl.STENCIL_BUFFER_BIT; // this.clearStencil.set(stencil); // this.stencilMask.set(0xFF); // } gl.clear(mask); }; Context.prototype.setCullFace = function setCullFace (cullFaceMode ) { if (cullFaceMode.enable === false) { this.cullFace.set(false); } else { this.cullFace.set(true); this.cullFaceSide.set(cullFaceMode.mode); this.frontFace.set(cullFaceMode.frontFace); } }; Context.prototype.setDepthMode = function setDepthMode (depthMode ) { if (depthMode.func === this.gl.ALWAYS && !depthMode.mask) { this.depthTest.set(false); } else { this.depthTest.set(true); this.depthFunc.set(depthMode.func); this.depthMask.set(depthMode.mask); this.depthRange.set(depthMode.range); } }; Context.prototype.setStencilMode = function setStencilMode (stencilMode ) { if (stencilMode.test.func === this.gl.ALWAYS && !stencilMode.mask) { this.stencilTest.set(false); } else { this.stencilTest.set(true); this.stencilMask.set(stencilMode.mask); this.stencilOp.set([stencilMode.fail, stencilMode.depthFail, stencilMode.pass]); this.stencilFunc.set({ func: stencilMode.test.func, ref: stencilMode.ref, mask: stencilMode.test.mask }); } }; Context.prototype.setColorMode = function setColorMode (colorMode ) { if (__chunk_1.deepEqual(colorMode.blendFunction, ColorMode.Replace)) { this.blend.set(false); } else { this.blend.set(true); this.blendFunc.set(colorMode.blendFunction); this.blendColor.set(colorMode.blendColor); } this.colorMask.set(colorMode.mask); }; Context.prototype.unbindVAO = function unbindVAO () { // Unbinding the VAO prevents other things (custom layers, new buffer creation) from // unintentionally changing the state of the last VAO used. if (this.extVertexArrayObject) { this.bindVertexArrayOES.set(null); } }; // /** * `SourceCache` is responsible for * * - creating an instance of `Source` * - forwarding events from `Source` * - caching tiles loaded from an instance of `Source` * - loading the tiles needed to render a given viewport * - unloading the cached tiles not needed to render a given viewport * * @private */ var SourceCache = /*@__PURE__*/(function (Evented) { function SourceCache(id , options , dispatcher ) { var this$1 = this; Evented.call(this); this.id = id; this.dispatcher = dispatcher; this.on('data', function (e) { // this._sourceLoaded signifies that the TileJSON is loaded if applicable. // if the source type does not come with a TileJSON, the flag signifies the // source data has loaded (i.e geojson has been tiled on the worker and is ready) if (e.dataType === 'source' && e.sourceDataType === 'metadata') { this$1._sourceLoaded = true; } // for sources with mutable data, this event fires when the underlying data // to a source is changed. (i.e. GeoJSONSource#setData and ImageSource#serCoordinates) if (this$1._sourceLoaded && !this$1._paused && e.dataType === "source" && e.sourceDataType === 'content') { this$1.reload(); if (this$1.transform) { this$1.update(this$1.transform); } } }); this.on('error', function () { this$1._sourceErrored = true; }); this._source = create(id, options, dispatcher, this); this._tiles = {}; this._cache = new TileCache(0, this._unloadTile.bind(this)); this._timers = {}; this._cacheTimers = {}; this._maxTileCacheSize = null; this._coveredTiles = {}; this._state = new __chunk_1.SourceFeatureState(); } if ( Evented ) SourceCache.__proto__ = Evented; SourceCache.prototype = Object.create( Evented && Evented.prototype ); SourceCache.prototype.constructor = SourceCache; SourceCache.prototype.onAdd = function onAdd (map ) { this.map = map; this._maxTileCacheSize = map ? map._maxTileCacheSize : null; if (this._source && this._source.onAdd) { this._source.onAdd(map); } }; SourceCache.prototype.onRemove = function onRemove (map ) { if (this._source && this._source.onRemove) { this._source.onRemove(map); } }; /** * Return true if no tile data is pending, tiles will not change unless * an additional API call is received. */ SourceCache.prototype.loaded = function loaded () { if (this._sourceErrored) { return true; } if (!this._sourceLoaded) { return false; } for (var t in this._tiles) { var tile = this._tiles[t]; if (tile.state !== 'loaded' && tile.state !== 'errored') { return false; } } return true; }; SourceCache.prototype.getSource = function getSource () { return this._source; }; SourceCache.prototype.pause = function pause () { this._paused = true; }; SourceCache.prototype.resume = function resume () { if (!this._paused) { return; } var shouldReload = this._shouldReloadOnResume; this._paused = false; this._shouldReloadOnResume = false; if (shouldReload) { this.reload(); } if (this.transform) { this.update(this.transform); } }; SourceCache.prototype._loadTile = function _loadTile (tile , callback ) { return this._source.loadTile(tile, callback); }; SourceCache.prototype._unloadTile = function _unloadTile (tile ) { if (this._source.unloadTile) { return this._source.unloadTile(tile, function () {}); } }; SourceCache.prototype._abortTile = function _abortTile (tile ) { if (this._source.abortTile) { return this._source.abortTile(tile, function () {}); } }; SourceCache.prototype.serialize = function serialize () { return this._source.serialize(); }; SourceCache.prototype.prepare = function prepare (context ) { if (this._source.prepare) { this._source.prepare(); } this._state.coalesceChanges(this._tiles, this.map ? this.map.painter : null); for (var i in this._tiles) { var tile = this._tiles[i]; tile.upload(context); tile.prepare(this.map.style.imageManager); } }; /** * Return all tile ids ordered with z-order, and cast to numbers */ SourceCache.prototype.getIds = function getIds () { return Object.keys(this._tiles).map(Number).sort(compareKeyZoom); }; SourceCache.prototype.getRenderableIds = function getRenderableIds (symbolLayer ) { var this$1 = this; var ids = []; for (var id in this._tiles) { if (this._isIdRenderable(+id, symbolLayer)) { ids.push(+id); } } if (symbolLayer) { return ids.sort(function (a_, b_) { var a = this$1._tiles[a_].tileID; var b = this$1._tiles[b_].tileID; var rotatedA = (new __chunk_1.Point(a.canonical.x, a.canonical.y))._rotate(this$1.transform.angle); var rotatedB = (new __chunk_1.Point(b.canonical.x, b.canonical.y))._rotate(this$1.transform.angle); return a.overscaledZ - b.overscaledZ || rotatedB.y - rotatedA.y || rotatedB.x - rotatedA.x; }); } return ids.sort(compareKeyZoom); }; SourceCache.prototype.hasRenderableParent = function hasRenderableParent (tileID ) { var parentTile = this.findLoadedParent(tileID, 0); if (parentTile) { return this._isIdRenderable(parentTile.tileID.key); } return false; }; SourceCache.prototype._isIdRenderable = function _isIdRenderable (id , symbolLayer ) { return this._tiles[id] && this._tiles[id].hasData() && !this._coveredTiles[id] && (symbolLayer || !this._tiles[id].holdingForFade()); }; SourceCache.prototype.reload = function reload () { if (this._paused) { this._shouldReloadOnResume = true; return; } this._cache.reset(); for (var i in this._tiles) { if (this._tiles[i].state !== "errored") { this._reloadTile(i, 'reloading'); } } }; SourceCache.prototype._reloadTile = function _reloadTile (id , state ) { var tile = this._tiles[id]; // this potentially does not address all underlying // issues https://github.com/mapbox/mapbox-gl-js/issues/4252 // - hard to tell without repro steps if (!tile) { return; } // The difference between "loading" tiles and "reloading" or "expired" // tiles is that "reloading"/"expired" tiles are "renderable". // Therefore, a "loading" tile cannot become a "reloading" tile without // first becoming a "loaded" tile. if (tile.state !== 'loading') { tile.state = state; } this._loadTile(tile, this._tileLoaded.bind(this, tile, id, state)); }; SourceCache.prototype._tileLoaded = function _tileLoaded (tile , id , previousState , err ) { if (err) { tile.state = 'errored'; if ((err ).status !== 404) { this._source.fire(new __chunk_1.ErrorEvent(err, {tile: tile})); } // continue to try loading parent/children tiles if a tile doesn't exist (404) else { this.update(this.transform); } return; } tile.timeAdded = __chunk_1.browser.now(); if (previousState === 'expired') { tile.refreshedUponExpiration = true; } this._setTileReloadTimer(id, tile); if (this.getSource().type === 'raster-dem' && tile.dem) { this._backfillDEM(tile); } this._state.initializeTileState(tile, this.map ? this.map.painter : null); this._source.fire(new __chunk_1.Event('data', {dataType: 'source', tile: tile, coord: tile.tileID})); }; /** * For raster terrain source, backfill DEM to eliminate visible tile boundaries * @private */ SourceCache.prototype._backfillDEM = function _backfillDEM (tile ) { var renderables = this.getRenderableIds(); for (var i = 0; i < renderables.length; i++) { var borderId = renderables[i]; if (tile.neighboringTiles && tile.neighboringTiles[borderId]) { var borderTile = this.getTileByID(borderId); fillBorder(tile, borderTile); fillBorder(borderTile, tile); } } function fillBorder(tile, borderTile) { tile.needsHillshadePrepare = true; var dx = borderTile.tileID.canonical.x - tile.tileID.canonical.x; var dy = borderTile.tileID.canonical.y - tile.tileID.canonical.y; var dim = Math.pow(2, tile.tileID.canonical.z); var borderId = borderTile.tileID.key; if (dx === 0 && dy === 0) { return; } if (Math.abs(dy) > 1) { return; } if (Math.abs(dx) > 1) { // Adjust the delta coordinate for world wraparound. if (Math.abs(dx + dim) === 1) { dx += dim; } else if (Math.abs(dx - dim) === 1) { dx -= dim; } } if (!borderTile.dem || !tile.dem) { return; } tile.dem.backfillBorder(borderTile.dem, dx, dy); if (tile.neighboringTiles && tile.neighboringTiles[borderId]) { tile.neighboringTiles[borderId].backfilled = true; } } }; /** * Get a specific tile by TileID */ SourceCache.prototype.getTile = function getTile (tileID ) { return this.getTileByID(tileID.key); }; /** * Get a specific tile by id */ SourceCache.prototype.getTileByID = function getTileByID (id ) { return this._tiles[id]; }; /** * get the zoom level adjusted for the difference in map and source tilesizes */ SourceCache.prototype.getZoom = function getZoom (transform ) { return transform.zoom + transform.scaleZoom(transform.tileSize / this._source.tileSize); }; /** * For a given set of tiles, retain children that are loaded and have a zoom * between `zoom` (exclusive) and `maxCoveringZoom` (inclusive) */ SourceCache.prototype._retainLoadedChildren = function _retainLoadedChildren ( idealTiles , zoom , maxCoveringZoom , retain ) { for (var id in this._tiles) { var tile = this._tiles[id]; // only consider renderable tiles up to maxCoveringZoom if (retain[id] || !tile.hasData() || tile.tileID.overscaledZ <= zoom || tile.tileID.overscaledZ > maxCoveringZoom ) { continue; } // loop through parents and retain the topmost loaded one if found var topmostLoadedID = tile.tileID; while (tile && tile.tileID.overscaledZ > zoom + 1) { var parentID = tile.tileID.scaledTo(tile.tileID.overscaledZ - 1); tile = this._tiles[parentID.key]; if (tile && tile.hasData()) { topmostLoadedID = parentID; } } // loop through ancestors of the topmost loaded child to see if there's one that needed it var tileID = topmostLoadedID; while (tileID.overscaledZ > zoom) { tileID = tileID.scaledTo(tileID.overscaledZ - 1); if (idealTiles[tileID.key]) { // found a parent that needed a loaded child; retain that child retain[topmostLoadedID.key] = topmostLoadedID; break; } } } }; /** * Find a loaded parent of the given tile (up to minCoveringZoom) */ SourceCache.prototype.findLoadedParent = function findLoadedParent (tileID , minCoveringZoom ) { for (var z = tileID.overscaledZ - 1; z >= minCoveringZoom; z--) { var parent = tileID.scaledTo(z); if (!parent) { return; } var id = String(parent.key); var tile = this._tiles[id]; if (tile && tile.hasData()) { return tile; } if (this._cache.has(parent)) { return this._cache.get(parent); } } }; /** * Resizes the tile cache based on the current viewport's size * or the maxTileCacheSize option passed during map creation * * Larger viewports use more tiles and need larger caches. Larger viewports * are more likely to be found on devices with more memory and on pages where * the map is more important. */ SourceCache.prototype.updateCacheSize = function updateCacheSize (transform ) { var widthInTiles = Math.ceil(transform.width / this._source.tileSize) + 1; var heightInTiles = Math.ceil(transform.height / this._source.tileSize) + 1; var approxTilesInView = widthInTiles * heightInTiles; var commonZoomRange = 5; var viewDependentMaxSize = Math.floor(approxTilesInView * commonZoomRange); var maxSize = typeof this._maxTileCacheSize === 'number' ? Math.min(this._maxTileCacheSize, viewDependentMaxSize) : viewDependentMaxSize; this._cache.setMaxSize(maxSize); }; SourceCache.prototype.handleWrapJump = function handleWrapJump (lng ) { // On top of the regular z/x/y values, TileIDs have a `wrap` value that specify // which cppy of the world the tile belongs to. For example, at `lng: 10` you // might render z/x/y/0 while at `lng: 370` you would render z/x/y/1. // // When lng values get wrapped (going from `lng: 370` to `long: 10`) you expect // to see the same thing on the screen (370 degrees and 10 degrees is the same // place in the world) but all the TileIDs will have different wrap values. // // In order to make this transition seamless, we calculate the rounded difference of // "worlds" between the last frame and the current frame. If the map panned by // a world, then we can assign all the tiles new TileIDs with updated wrap values. // For example, assign z/x/y/1 a new id: z/x/y/0. It is the same tile, just rendered // in a different position. // // This enables us to reuse the tiles at more ideal locations and prevent flickering. var prevLng = this._prevLng === undefined ? lng : this._prevLng; var lngDifference = lng - prevLng; var worldDifference = lngDifference / 360; var wrapDelta = Math.round(worldDifference); this._prevLng = lng; if (wrapDelta) { var tiles = {}; for (var key in this._tiles) { var tile = this._tiles[key]; tile.tileID = tile.tileID.unwrapTo(tile.tileID.wrap + wrapDelta); tiles[tile.tileID.key] = tile; } this._tiles = tiles; // Reset tile reload timers for (var id in this._timers) { clearTimeout(this._timers[id]); delete this._timers[id]; } for (var id$1 in this._tiles) { var tile$1 = this._tiles[id$1]; this._setTileReloadTimer(id$1, tile$1); } } }; /** * Removes tiles that are outside the viewport and adds new tiles that * are inside the viewport. */ SourceCache.prototype.update = function update (transform ) { var this$1 = this; this.transform = transform; if (!this._sourceLoaded || this._paused) { return; } this.updateCacheSize(transform); this.handleWrapJump(this.transform.center.lng); // Covered is a list of retained tiles who's areas are fully covered by other, // better, retained tiles. They are not drawn separately. this._coveredTiles = {}; var idealTileIDs; if (!this.used) { idealTileIDs = []; } else if (this._source.tileID) { idealTileIDs = transform.getVisibleUnwrappedCoordinates(this._source.tileID) .map(function (unwrapped) { return new __chunk_1.OverscaledTileID(unwrapped.canonical.z, unwrapped.wrap, unwrapped.canonical.z, unwrapped.canonical.x, unwrapped.canonical.y); }); } else { idealTileIDs = transform.coveringTiles({ tileSize: this._source.tileSize, minzoom: this._source.minzoom, maxzoom: this._source.maxzoom, roundZoom: this._source.roundZoom, reparseOverscaled: this._source.reparseOverscaled }); if (this._source.hasTile) { idealTileIDs = idealTileIDs.filter(function (coord) { return (this$1._source.hasTile )(coord); }); } } // Determine the overzooming/underzooming amounts. var zoom = (this._source.roundZoom ? Math.round : Math.floor)(this.getZoom(transform)); var minCoveringZoom = Math.max(zoom - SourceCache.maxOverzooming, this._source.minzoom); var maxCoveringZoom = Math.max(zoom + SourceCache.maxUnderzooming, this._source.minzoom); // Retain is a list of tiles that we shouldn't delete, even if they are not // the most ideal tile for the current viewport. This may include tiles like // parent or child tiles that are *already* loaded. var retain = this._updateRetainedTiles(idealTileIDs, zoom); if (isRasterType(this._source.type)) { var parentsForFading = {}; var fadingTiles = {}; var ids = Object.keys(retain); for (var i = 0, list = ids; i < list.length; i += 1) { var id = list[i]; var tileID = retain[id]; __chunk_1.assert(tileID.key === +id); var tile = this._tiles[id]; if (!tile || tile.fadeEndTime && tile.fadeEndTime <= __chunk_1.browser.now()) { continue; } // if the tile is loaded but still fading in, find parents to cross-fade with it var parentTile = this.findLoadedParent(tileID, minCoveringZoom); if (parentTile) { this._addTile(parentTile.tileID); parentsForFading[parentTile.tileID.key] = parentTile.tileID; } fadingTiles[id] = tileID; } // for tiles that are still fading in, also find children to cross-fade with this._retainLoadedChildren(fadingTiles, zoom, maxCoveringZoom, retain); for (var id$1 in parentsForFading) { if (!retain[id$1]) { // If a tile is only needed for fading, mark it as covered so that it isn't rendered on it's own. this._coveredTiles[id$1] = true; retain[id$1] = parentsForFading[id$1]; } } } for (var retainedId in retain) { // Make sure retained tiles always clear any existing fade holds // so that if they're removed again their fade timer starts fresh. this._tiles[retainedId].clearFadeHold(); } // Remove the tiles we don't need anymore. var remove = __chunk_1.keysDifference(this._tiles, retain); for (var i$1 = 0, list$1 = remove; i$1 < list$1.length; i$1 += 1) { var tileID$1 = list$1[i$1]; var tile$1 = this._tiles[tileID$1]; if (tile$1.hasSymbolBuckets && !tile$1.holdingForFade()) { tile$1.setHoldDuration(this.map._fadeDuration); } else if (!tile$1.hasSymbolBuckets || tile$1.symbolFadeFinished()) { this._removeTile(tileID$1); } } }; SourceCache.prototype.releaseSymbolFadeTiles = function releaseSymbolFadeTiles () { for (var id in this._tiles) { if (this._tiles[id].holdingForFade()) { this._removeTile(id); } } }; SourceCache.prototype._updateRetainedTiles = function _updateRetainedTiles (idealTileIDs , zoom ) { var retain = {}; var checked = {}; var minCoveringZoom = Math.max(zoom - SourceCache.maxOverzooming, this._source.minzoom); var maxCoveringZoom = Math.max(zoom + SourceCache.maxUnderzooming, this._source.minzoom); var missingTiles = {}; for (var i = 0, list = idealTileIDs; i < list.length; i += 1) { var tileID = list[i]; var tile = this._addTile(tileID); // retain the tile even if it's not loaded because it's an ideal tile. retain[tileID.key] = tileID; if (tile.hasData()) { continue; } if (zoom < this._source.maxzoom) { // save missing tiles that potentially have loaded children missingTiles[tileID.key] = tileID; } } // retain any loaded children of ideal tiles up to maxCoveringZoom this._retainLoadedChildren(missingTiles, zoom, maxCoveringZoom, retain); for (var i$1 = 0, list$1 = idealTileIDs; i$1 < list$1.length; i$1 += 1) { var tileID$1 = list$1[i$1]; var tile$1 = this._tiles[tileID$1.key]; if (tile$1.hasData()) { continue; } // The tile we require is not yet loaded or does not exist; // Attempt to find children that fully cover it. if (zoom + 1 > this._source.maxzoom) { // We're looking for an overzoomed child tile. var childCoord = tileID$1.children(this._source.maxzoom)[0]; var childTile = this.getTile(childCoord); if (!!childTile && childTile.hasData()) { retain[childCoord.key] = childCoord; continue; // tile is covered by overzoomed child } } else { // check if all 4 immediate children are loaded (i.e. the missing ideal tile is covered) var children = tileID$1.children(this._source.maxzoom); if (retain[children[0].key] && retain[children[1].key] && retain[children[2].key] && retain[children[3].key]) { continue; } // tile is covered by children } // We couldn't find child tiles that entirely cover the ideal tile; look for parents now. // As we ascend up the tile pyramid of the ideal tile, we check whether the parent // tile has been previously requested (and errored because we only loop over tiles with no data) // in order to determine if we need to request its parent. var parentWasRequested = tile$1.wasRequested(); for (var overscaledZ = tileID$1.overscaledZ - 1; overscaledZ >= minCoveringZoom; --overscaledZ) { var parentId = tileID$1.scaledTo(overscaledZ); // Break parent tile ascent if this route has been previously checked by another child. if (checked[parentId.key]) { break; } checked[parentId.key] = true; tile$1 = this.getTile(parentId); if (!tile$1 && parentWasRequested) { tile$1 = this._addTile(parentId); } if (tile$1) { retain[parentId.key] = parentId; // Save the current values, since they're the parent of the next iteration // of the parent tile ascent loop. parentWasRequested = tile$1.wasRequested(); if (tile$1.hasData()) { break; } } } } return retain; }; /** * Add a tile, given its coordinate, to the pyramid. * @private */ SourceCache.prototype._addTile = function _addTile (tileID ) { var tile = this._tiles[tileID.key]; if (tile) { return tile; } tile = this._cache.getAndRemove(tileID); if (tile) { this._setTileReloadTimer(tileID.key, tile); // set the tileID because the cached tile could have had a different wrap value tile.tileID = tileID; this._state.initializeTileState(tile, this.map ? this.map.painter : null); if (this._cacheTimers[tileID.key]) { clearTimeout(this._cacheTimers[tileID.key]); delete this._cacheTimers[tileID.key]; this._setTileReloadTimer(tileID.key, tile); } } var cached = Boolean(tile); if (!cached) { tile = new __chunk_1.Tile(tileID, this._source.tileSize * tileID.overscaleFactor()); this._loadTile(tile, this._tileLoaded.bind(this, tile, tileID.key, tile.state)); } // Impossible, but silence flow. if (!tile) { return (null ); } tile.uses++; this._tiles[tileID.key] = tile; if (!cached) { this._source.fire(new __chunk_1.Event('dataloading', {tile: tile, coord: tile.tileID, dataType: 'source'})); } return tile; }; SourceCache.prototype._setTileReloadTimer = function _setTileReloadTimer (id , tile ) { var this$1 = this; if (id in this._timers) { clearTimeout(this._timers[id]); delete this._timers[id]; } var expiryTimeout = tile.getExpiryTimeout(); if (expiryTimeout) { this._timers[id] = setTimeout(function () { this$1._reloadTile(id, 'expired'); delete this$1._timers[id]; }, expiryTimeout); } }; /** * Remove a tile, given its id, from the pyramid * @private */ SourceCache.prototype._removeTile = function _removeTile (id ) { var tile = this._tiles[id]; if (!tile) { return; } tile.uses--; delete this._tiles[id]; if (this._timers[id]) { clearTimeout(this._timers[id]); delete this._timers[id]; } if (tile.uses > 0) { return; } if (tile.hasData()) { this._cache.add(tile.tileID, tile, tile.getExpiryTimeout()); } else { tile.aborted = true; this._abortTile(tile); this._unloadTile(tile); } }; /** * Remove all tiles from this pyramid */ SourceCache.prototype.clearTiles = function clearTiles () { this._shouldReloadOnResume = false; this._paused = false; for (var id in this._tiles) { this._removeTile(id); } this._cache.reset(); }; /** * Search through our current tiles and attempt to find the tiles that * cover the given bounds. * @param pointQueryGeometry coordinates of the corners of bounding rectangle * @returns {Array} result items have {tile, minX, maxX, minY, maxY}, where min/max bounding values are the given bounds transformed in into the coordinate space of this tile. */ SourceCache.prototype.tilesIn = function tilesIn (pointQueryGeometry , maxPitchScaleFactor , has3DLayer ) { var this$1 = this; var tileResults = []; var transform = this.transform; if (!transform) { return tileResults; } var cameraPointQueryGeometry = has3DLayer ? transform.getCameraQueryGeometry(pointQueryGeometry) : pointQueryGeometry; var queryGeometry = pointQueryGeometry.map(function (p) { return transform.pointCoordinate(p); }); var cameraQueryGeometry = cameraPointQueryGeometry.map(function (p) { return transform.pointCoordinate(p); }); var ids = this.getIds(); var minX = Infinity; var minY = Infinity; var maxX = -Infinity; var maxY = -Infinity; for (var i$1 = 0, list = cameraQueryGeometry; i$1 < list.length; i$1 += 1) { var p = list[i$1]; minX = Math.min(minX, p.x); minY = Math.min(minY, p.y); maxX = Math.max(maxX, p.x); maxY = Math.max(maxY, p.y); } var loop = function ( i ) { var tile = this$1._tiles[ids[i]]; if (tile.holdingForFade()) { // Tiles held for fading are covered by tiles that are closer to ideal return; } var tileID = tile.tileID; var scale = Math.pow(2, transform.zoom - tile.tileID.overscaledZ); var queryPadding = maxPitchScaleFactor * tile.queryPadding * __chunk_1.EXTENT / tile.tileSize / scale; var tileSpaceBounds = [ tileID.getTilePoint(new __chunk_1.MercatorCoordinate(minX, minY)), tileID.getTilePoint(new __chunk_1.MercatorCoordinate(maxX, maxY)) ]; if (tileSpaceBounds[0].x - queryPadding < __chunk_1.EXTENT && tileSpaceBounds[0].y - queryPadding < __chunk_1.EXTENT && tileSpaceBounds[1].x + queryPadding >= 0 && tileSpaceBounds[1].y + queryPadding >= 0) { var tileSpaceQueryGeometry = queryGeometry.map(function (c) { return tileID.getTilePoint(c); }); var tileSpaceCameraQueryGeometry = cameraQueryGeometry.map(function (c) { return tileID.getTilePoint(c); }); tileResults.push({ tile: tile, tileID: tileID, queryGeometry: tileSpaceQueryGeometry, cameraQueryGeometry: tileSpaceCameraQueryGeometry, scale: scale }); } }; for (var i = 0; i < ids.length; i++) loop( i ); return tileResults; }; SourceCache.prototype.getVisibleCoordinates = function getVisibleCoordinates (symbolLayer ) { var this$1 = this; var coords = this.getRenderableIds(symbolLayer).map(function (id) { return this$1._tiles[id].tileID; }); for (var i = 0, list = coords; i < list.length; i += 1) { var coord = list[i]; coord.posMatrix = this.transform.calculatePosMatrix(coord.toUnwrapped()); } return coords; }; SourceCache.prototype.hasTransition = function hasTransition () { if (this._source.hasTransition()) { return true; } if (isRasterType(this._source.type)) { for (var id in this._tiles) { var tile = this._tiles[id]; if (tile.fadeEndTime !== undefined && tile.fadeEndTime >= __chunk_1.browser.now()) { return true; } } } return false; }; /** * Set the value of a particular state for a feature * @private */ SourceCache.prototype.setFeatureState = function setFeatureState (sourceLayer , feature , state ) { sourceLayer = sourceLayer || '_geojsonTileLayer'; this._state.updateState(sourceLayer, feature, state); }; /** * Resets the value of a particular state key for a feature * @private */ SourceCache.prototype.removeFeatureState = function removeFeatureState (sourceLayer , feature , key ) { sourceLayer = sourceLayer || '_geojsonTileLayer'; this._state.removeFeatureState(sourceLayer, feature, key); }; /** * Get the entire state object for a feature * @private */ SourceCache.prototype.getFeatureState = function getFeatureState (sourceLayer , feature ) { sourceLayer = sourceLayer || '_geojsonTileLayer'; return this._state.getState(sourceLayer, feature); }; return SourceCache; }(__chunk_1.Evented)); SourceCache.maxOverzooming = 10; SourceCache.maxUnderzooming = 3; function compareKeyZoom(a, b) { return ((a % 32) - (b % 32)) || (b - a); } function isRasterType(type) { return type === 'raster' || type === 'image' || type === 'video'; } // function WebWorker () { return (new __chunk_1.window.Worker(exported.workerUrl) ); } // /** * Constructs a worker pool. * @private */ var WorkerPool = function WorkerPool() { this.active = {}; }; WorkerPool.prototype.acquire = function acquire (mapId ) { if (!this.workers) { // Lazily look up the value of mapboxgl.workerCount so that // client code has had a chance to set it. this.workers = []; while (this.workers.length < WorkerPool.workerCount) { this.workers.push(new WebWorker()); } } this.active[mapId] = true; return this.workers.slice(); }; WorkerPool.prototype.release = function release (mapId ) { delete this.active[mapId]; if (Object.keys(this.active).length === 0) { this.workers.forEach(function (w) { w.terminate(); }); this.workers = (null ); } }; var availableLogicalProcessors = Math.floor(__chunk_1.browser.hardwareConcurrency / 2); WorkerPool.workerCount = Math.max(Math.min(availableLogicalProcessors, 6), 1); // var globalWorkerPool; /** * Creates (if necessary) and returns the single, global WorkerPool instance * to be shared across each Map * @private */ function getGlobalWorkerPool () { if (!globalWorkerPool) { globalWorkerPool = new WorkerPool(); } return globalWorkerPool; } function deref(layer, parent) { var result = {}; for (var k in layer) { if (k !== 'ref') { result[k] = layer[k]; } } __chunk_1.refProperties.forEach(function (k) { if (k in parent) { result[k] = parent[k]; } }); return result; } /** * Given an array of layers, some of which may contain `ref` properties * whose value is the `id` of another property, return a new array where * such layers have been augmented with the 'type', 'source', etc. properties * from the parent layer, and the `ref` property has been removed. * * The input is not modified. The output may contain references to portions * of the input. * * @private * @param {Array} layers * @returns {Array} */ function derefLayers(layers) { layers = layers.slice(); var map = Object.create(null); for (var i = 0; i < layers.length; i++) { map[layers[i].id] = layers[i]; } for (var i$1 = 0; i$1 < layers.length; i$1++) { if ('ref' in layers[i$1]) { layers[i$1] = deref(layers[i$1], map[layers[i$1].ref]); } } return layers; } var operations = { /* * { command: 'setStyle', args: [stylesheet] } */ setStyle: 'setStyle', /* * { command: 'addLayer', args: [layer, 'beforeLayerId'] } */ addLayer: 'addLayer', /* * { command: 'removeLayer', args: ['layerId'] } */ removeLayer: 'removeLayer', /* * { command: 'setPaintProperty', args: ['layerId', 'prop', value] } */ setPaintProperty: 'setPaintProperty', /* * { command: 'setLayoutProperty', args: ['layerId', 'prop', value] } */ setLayoutProperty: 'setLayoutProperty', /* * { command: 'setFilter', args: ['layerId', filter] } */ setFilter: 'setFilter', /* * { command: 'addSource', args: ['sourceId', source] } */ addSource: 'addSource', /* * { command: 'removeSource', args: ['sourceId'] } */ removeSource: 'removeSource', /* * { command: 'setGeoJSONSourceData', args: ['sourceId', data] } */ setGeoJSONSourceData: 'setGeoJSONSourceData', /* * { command: 'setLayerZoomRange', args: ['layerId', 0, 22] } */ setLayerZoomRange: 'setLayerZoomRange', /* * { command: 'setLayerProperty', args: ['layerId', 'prop', value] } */ setLayerProperty: 'setLayerProperty', /* * { command: 'setCenter', args: [[lon, lat]] } */ setCenter: 'setCenter', /* * { command: 'setZoom', args: [zoom] } */ setZoom: 'setZoom', /* * { command: 'setBearing', args: [bearing] } */ setBearing: 'setBearing', /* * { command: 'setPitch', args: [pitch] } */ setPitch: 'setPitch', /* * { command: 'setSprite', args: ['spriteUrl'] } */ setSprite: 'setSprite', /* * { command: 'setGlyphs', args: ['glyphsUrl'] } */ setGlyphs: 'setGlyphs', /* * { command: 'setTransition', args: [transition] } */ setTransition: 'setTransition', /* * { command: 'setLighting', args: [lightProperties] } */ setLight: 'setLight' }; function addSource(sourceId, after, commands) { commands.push({ command: operations.addSource, args: [sourceId, after[sourceId]] }); } function removeSource(sourceId, commands, sourcesRemoved) { commands.push({ command: operations.removeSource, args: [sourceId] }); sourcesRemoved[sourceId] = true; } function updateSource(sourceId, after, commands, sourcesRemoved) { removeSource(sourceId, commands, sourcesRemoved); addSource(sourceId, after, commands); } function canUpdateGeoJSON(before, after, sourceId) { var prop; for (prop in before[sourceId]) { if (!before[sourceId].hasOwnProperty(prop)) { continue; } if (prop !== 'data' && !__chunk_1.deepEqual(before[sourceId][prop], after[sourceId][prop])) { return false; } } for (prop in after[sourceId]) { if (!after[sourceId].hasOwnProperty(prop)) { continue; } if (prop !== 'data' && !__chunk_1.deepEqual(before[sourceId][prop], after[sourceId][prop])) { return false; } } return true; } function diffSources(before, after, commands, sourcesRemoved) { before = before || {}; after = after || {}; var sourceId; // look for sources to remove for (sourceId in before) { if (!before.hasOwnProperty(sourceId)) { continue; } if (!after.hasOwnProperty(sourceId)) { removeSource(sourceId, commands, sourcesRemoved); } } // look for sources to add/update for (sourceId in after) { if (!after.hasOwnProperty(sourceId)) { continue; } if (!before.hasOwnProperty(sourceId)) { addSource(sourceId, after, commands); } else if (!__chunk_1.deepEqual(before[sourceId], after[sourceId])) { if (before[sourceId].type === 'geojson' && after[sourceId].type === 'geojson' && canUpdateGeoJSON(before, after, sourceId)) { commands.push({ command: operations.setGeoJSONSourceData, args: [sourceId, after[sourceId].data] }); } else { // no update command, must remove then add updateSource(sourceId, after, commands, sourcesRemoved); } } } } function diffLayerPropertyChanges(before, after, commands, layerId, klass, command) { before = before || {}; after = after || {}; var prop; for (prop in before) { if (!before.hasOwnProperty(prop)) { continue; } if (!__chunk_1.deepEqual(before[prop], after[prop])) { commands.push({ command: command, args: [layerId, prop, after[prop], klass] }); } } for (prop in after) { if (!after.hasOwnProperty(prop) || before.hasOwnProperty(prop)) { continue; } if (!__chunk_1.deepEqual(before[prop], after[prop])) { commands.push({ command: command, args: [layerId, prop, after[prop], klass] }); } } } function pluckId(layer) { return layer.id; } function indexById(group, layer) { group[layer.id] = layer; return group; } function diffLayers(before, after, commands) { before = before || []; after = after || []; // order of layers by id var beforeOrder = before.map(pluckId); var afterOrder = after.map(pluckId); // index of layer by id var beforeIndex = before.reduce(indexById, {}); var afterIndex = after.reduce(indexById, {}); // track order of layers as if they have been mutated var tracker = beforeOrder.slice(); // layers that have been added do not need to be diffed var clean = Object.create(null); var i, d, layerId, beforeLayer, afterLayer, insertBeforeLayerId, prop; // remove layers for (i = 0, d = 0; i < beforeOrder.length; i++) { layerId = beforeOrder[i]; if (!afterIndex.hasOwnProperty(layerId)) { commands.push({ command: operations.removeLayer, args: [layerId] }); tracker.splice(tracker.indexOf(layerId, d), 1); } else { // limit where in tracker we need to look for a match d++; } } // add/reorder layers for (i = 0, d = 0; i < afterOrder.length; i++) { // work backwards as insert is before an existing layer layerId = afterOrder[afterOrder.length - 1 - i]; if (tracker[tracker.length - 1 - i] === layerId) { continue; } if (beforeIndex.hasOwnProperty(layerId)) { // remove the layer before we insert at the correct position commands.push({ command: operations.removeLayer, args: [layerId] }); tracker.splice(tracker.lastIndexOf(layerId, tracker.length - d), 1); } else { // limit where in tracker we need to look for a match d++; } // add layer at correct position insertBeforeLayerId = tracker[tracker.length - i]; commands.push({ command: operations.addLayer, args: [afterIndex[layerId], insertBeforeLayerId] }); tracker.splice(tracker.length - i, 0, layerId); clean[layerId] = true; } // update layers for (i = 0; i < afterOrder.length; i++) { layerId = afterOrder[i]; beforeLayer = beforeIndex[layerId]; afterLayer = afterIndex[layerId]; // no need to update if previously added (new or moved) if (clean[layerId] || __chunk_1.deepEqual(beforeLayer, afterLayer)) { continue; } // If source, source-layer, or type have changes, then remove the layer // and add it back 'from scratch'. if (!__chunk_1.deepEqual(beforeLayer.source, afterLayer.source) || !__chunk_1.deepEqual(beforeLayer['source-layer'], afterLayer['source-layer']) || !__chunk_1.deepEqual(beforeLayer.type, afterLayer.type)) { commands.push({ command: operations.removeLayer, args: [layerId] }); // we add the layer back at the same position it was already in, so // there's no need to update the `tracker` insertBeforeLayerId = tracker[tracker.lastIndexOf(layerId) + 1]; commands.push({ command: operations.addLayer, args: [afterLayer, insertBeforeLayerId] }); continue; } // layout, paint, filter, minzoom, maxzoom diffLayerPropertyChanges(beforeLayer.layout, afterLayer.layout, commands, layerId, null, operations.setLayoutProperty); diffLayerPropertyChanges(beforeLayer.paint, afterLayer.paint, commands, layerId, null, operations.setPaintProperty); if (!__chunk_1.deepEqual(beforeLayer.filter, afterLayer.filter)) { commands.push({ command: operations.setFilter, args: [layerId, afterLayer.filter] }); } if (!__chunk_1.deepEqual(beforeLayer.minzoom, afterLayer.minzoom) || !__chunk_1.deepEqual(beforeLayer.maxzoom, afterLayer.maxzoom)) { commands.push({ command: operations.setLayerZoomRange, args: [layerId, afterLayer.minzoom, afterLayer.maxzoom] }); } // handle all other layer props, including paint.* for (prop in beforeLayer) { if (!beforeLayer.hasOwnProperty(prop)) { continue; } if (prop === 'layout' || prop === 'paint' || prop === 'filter' || prop === 'metadata' || prop === 'minzoom' || prop === 'maxzoom') { continue; } if (prop.indexOf('paint.') === 0) { diffLayerPropertyChanges(beforeLayer[prop], afterLayer[prop], commands, layerId, prop.slice(6), operations.setPaintProperty); } else if (!__chunk_1.deepEqual(beforeLayer[prop], afterLayer[prop])) { commands.push({ command: operations.setLayerProperty, args: [layerId, prop, afterLayer[prop]] }); } } for (prop in afterLayer) { if (!afterLayer.hasOwnProperty(prop) || beforeLayer.hasOwnProperty(prop)) { continue; } if (prop === 'layout' || prop === 'paint' || prop === 'filter' || prop === 'metadata' || prop === 'minzoom' || prop === 'maxzoom') { continue; } if (prop.indexOf('paint.') === 0) { diffLayerPropertyChanges(beforeLayer[prop], afterLayer[prop], commands, layerId, prop.slice(6), operations.setPaintProperty); } else if (!__chunk_1.deepEqual(beforeLayer[prop], afterLayer[prop])) { commands.push({ command: operations.setLayerProperty, args: [layerId, prop, afterLayer[prop]] }); } } } } /** * Diff two stylesheet * * Creates semanticly aware diffs that can easily be applied at runtime. * Operations produced by the diff closely resemble the mapbox-gl-js API. Any * error creating the diff will fall back to the 'setStyle' operation. * * Example diff: * [ * { command: 'setConstant', args: ['@water', '#0000FF'] }, * { command: 'setPaintProperty', args: ['background', 'background-color', 'black'] } * ] * * @private * @param {*} [before] stylesheet to compare from * @param {*} after stylesheet to compare to * @returns Array list of changes */ function diffStyles(before, after) { if (!before) { return [{ command: operations.setStyle, args: [after] }]; } var commands = []; try { // Handle changes to top-level properties if (!__chunk_1.deepEqual(before.version, after.version)) { return [{ command: operations.setStyle, args: [after] }]; } if (!__chunk_1.deepEqual(before.center, after.center)) { commands.push({ command: operations.setCenter, args: [after.center] }); } if (!__chunk_1.deepEqual(before.zoom, after.zoom)) { commands.push({ command: operations.setZoom, args: [after.zoom] }); } if (!__chunk_1.deepEqual(before.bearing, after.bearing)) { commands.push({ command: operations.setBearing, args: [after.bearing] }); } if (!__chunk_1.deepEqual(before.pitch, after.pitch)) { commands.push({ command: operations.setPitch, args: [after.pitch] }); } if (!__chunk_1.deepEqual(before.sprite, after.sprite)) { commands.push({ command: operations.setSprite, args: [after.sprite] }); } if (!__chunk_1.deepEqual(before.glyphs, after.glyphs)) { commands.push({ command: operations.setGlyphs, args: [after.glyphs] }); } if (!__chunk_1.deepEqual(before.transition, after.transition)) { commands.push({ command: operations.setTransition, args: [after.transition] }); } if (!__chunk_1.deepEqual(before.light, after.light)) { commands.push({ command: operations.setLight, args: [after.light] }); } // Handle changes to `sources` // If a source is to be removed, we also--before the removeSource // command--need to remove all the style layers that depend on it. var sourcesRemoved = {}; // First collect the {add,remove}Source commands var removeOrAddSourceCommands = []; diffSources(before.sources, after.sources, removeOrAddSourceCommands, sourcesRemoved); // Push a removeLayer command for each style layer that depends on a // source that's being removed. // Also, exclude any such layers them from the input to `diffLayers` // below, so that diffLayers produces the appropriate `addLayers` // command var beforeLayers = []; if (before.layers) { before.layers.forEach(function (layer) { if (sourcesRemoved[layer.source]) { commands.push({ command: operations.removeLayer, args: [layer.id] }); } else { beforeLayers.push(layer); } }); } commands = commands.concat(removeOrAddSourceCommands); // Handle changes to `layers` diffLayers(beforeLayers, after.layers, commands); } catch (e) { // fall back to setStyle console.warn('Unable to compute style diff:', e); commands = [{ command: operations.setStyle, args: [after] }]; } return commands; } // /** * GridIndex is a data structure for testing the intersection of * circles and rectangles in a 2d plane. * It is optimized for rapid insertion and querying. * GridIndex splits the plane into a set of "cells" and keeps track * of which geometries intersect with each cell. At query time, * full geometry comparisons are only done for items that share * at least one cell. As long as the geometries are relatively * uniformly distributed across the plane, this greatly reduces * the number of comparisons necessary. * * @private */ var GridIndex = function GridIndex (width , height , cellSize ) { var boxCells = this.boxCells = []; var circleCells = this.circleCells = []; // More cells -> fewer geometries to check per cell, but items tend // to be split across more cells. // Sweet spot allows most small items to fit in one cell this.xCellCount = Math.ceil(width / cellSize); this.yCellCount = Math.ceil(height / cellSize); for (var i = 0; i < this.xCellCount * this.yCellCount; i++) { boxCells.push([]); circleCells.push([]); } this.circleKeys = []; this.boxKeys = []; this.bboxes = []; this.circles = []; this.width = width; this.height = height; this.xScale = this.xCellCount / width; this.yScale = this.yCellCount / height; this.boxUid = 0; this.circleUid = 0; }; GridIndex.prototype.keysLength = function keysLength () { return this.boxKeys.length + this.circleKeys.length; }; GridIndex.prototype.insert = function insert (key , x1 , y1 , x2 , y2 ) { this._forEachCell(x1, y1, x2, y2, this._insertBoxCell, this.boxUid++); this.boxKeys.push(key); this.bboxes.push(x1); this.bboxes.push(y1); this.bboxes.push(x2); this.bboxes.push(y2); }; GridIndex.prototype.insertCircle = function insertCircle (key , x , y , radius ) { // Insert circle into grid for all cells in the circumscribing square // It's more than necessary (by a factor of 4/PI), but fast to insert this._forEachCell(x - radius, y - radius, x + radius, y + radius, this._insertCircleCell, this.circleUid++); this.circleKeys.push(key); this.circles.push(x); this.circles.push(y); this.circles.push(radius); }; GridIndex.prototype._insertBoxCell = function _insertBoxCell (x1 , y1 , x2 , y2 , cellIndex , uid ) { this.boxCells[cellIndex].push(uid); }; GridIndex.prototype._insertCircleCell = function _insertCircleCell (x1 , y1 , x2 , y2 , cellIndex , uid ) { this.circleCells[cellIndex].push(uid); }; GridIndex.prototype._query = function _query (x1 , y1 , x2 , y2 , hitTest , predicate ) { if (x2 < 0 || x1 > this.width || y2 < 0 || y1 > this.height) { return hitTest ? false : []; } var result = []; if (x1 <= 0 && y1 <= 0 && this.width <= x2 && this.height <= y2) { if (hitTest) { return true; } for (var boxUid = 0; boxUid < this.boxKeys.length; boxUid++) { result.push({ key: this.boxKeys[boxUid], x1: this.bboxes[boxUid * 4], y1: this.bboxes[boxUid * 4 + 1], x2: this.bboxes[boxUid * 4 + 2], y2: this.bboxes[boxUid * 4 + 3] }); } for (var circleUid = 0; circleUid < this.circleKeys.length; circleUid++) { var x = this.circles[circleUid * 3]; var y = this.circles[circleUid * 3 + 1]; var radius = this.circles[circleUid * 3 + 2]; result.push({ key: this.circleKeys[circleUid], x1: x - radius, y1: y - radius, x2: x + radius, y2: y + radius }); } return predicate ? result.filter(predicate) : result; } else { var queryArgs = { hitTest: hitTest, seenUids: { box: {}, circle: {} } }; this._forEachCell(x1, y1, x2, y2, this._queryCell, result, queryArgs, predicate); return hitTest ? result.length > 0 : result; } }; GridIndex.prototype._queryCircle = function _queryCircle (x , y , radius , hitTest , predicate ) { // Insert circle into grid for all cells in the circumscribing square // It's more than necessary (by a factor of 4/PI), but fast to insert var x1 = x - radius; var x2 = x + radius; var y1 = y - radius; var y2 = y + radius; if (x2 < 0 || x1 > this.width || y2 < 0 || y1 > this.height) { return hitTest ? false : []; } // Box query early exits if the bounding box is larger than the grid, but we don't do // the equivalent calculation for circle queries because early exit is less likely // and the calculation is more expensive var result = []; var queryArgs = { hitTest: hitTest, circle: { x: x, y: y, radius: radius }, seenUids: { box: {}, circle: {} } }; this._forEachCell(x1, y1, x2, y2, this._queryCellCircle, result, queryArgs, predicate); return hitTest ? result.length > 0 : result; }; GridIndex.prototype.query = function query (x1 , y1 , x2 , y2 , predicate ) { return (this._query(x1, y1, x2, y2, false, predicate) ); }; GridIndex.prototype.hitTest = function hitTest (x1 , y1 , x2 , y2 , predicate ) { return (this._query(x1, y1, x2, y2, true, predicate) ); }; GridIndex.prototype.hitTestCircle = function hitTestCircle (x , y , radius , predicate ) { return (this._queryCircle(x, y, radius, true, predicate) ); }; GridIndex.prototype._queryCell = function _queryCell (x1 , y1 , x2 , y2 , cellIndex , result , queryArgs , predicate ) { var seenUids = queryArgs.seenUids; var boxCell = this.boxCells[cellIndex]; if (boxCell !== null) { var bboxes = this.bboxes; for (var i = 0, list = boxCell; i < list.length; i += 1) { var boxUid = list[i]; if (!seenUids.box[boxUid]) { seenUids.box[boxUid] = true; var offset = boxUid * 4; if ((x1 <= bboxes[offset + 2]) && (y1 <= bboxes[offset + 3]) && (x2 >= bboxes[offset + 0]) && (y2 >= bboxes[offset + 1]) && (!predicate || predicate(this.boxKeys[boxUid]))) { if (queryArgs.hitTest) { result.push(true); return true; } else { result.push({ key: this.boxKeys[boxUid], x1: bboxes[offset], y1: bboxes[offset + 1], x2: bboxes[offset + 2], y2: bboxes[offset + 3] }); } } } } } var circleCell = this.circleCells[cellIndex]; if (circleCell !== null) { var circles = this.circles; for (var i$1 = 0, list$1 = circleCell; i$1 < list$1.length; i$1 += 1) { var circleUid = list$1[i$1]; if (!seenUids.circle[circleUid]) { seenUids.circle[circleUid] = true; var offset$1 = circleUid * 3; if (this._circleAndRectCollide( circles[offset$1], circles[offset$1 + 1], circles[offset$1 + 2], x1, y1, x2, y2) && (!predicate || predicate(this.circleKeys[circleUid]))) { if (queryArgs.hitTest) { result.push(true); return true; } else { var x = circles[offset$1]; var y = circles[offset$1 + 1]; var radius = circles[offset$1 + 2]; result.push({ key: this.circleKeys[circleUid], x1: x - radius, y1: y - radius, x2: x + radius, y2: y + radius }); } } } } } }; GridIndex.prototype._queryCellCircle = function _queryCellCircle (x1 , y1 , x2 , y2 , cellIndex , result , queryArgs , predicate ) { var circle = queryArgs.circle; var seenUids = queryArgs.seenUids; var boxCell = this.boxCells[cellIndex]; if (boxCell !== null) { var bboxes = this.bboxes; for (var i = 0, list = boxCell; i < list.length; i += 1) { var boxUid = list[i]; if (!seenUids.box[boxUid]) { seenUids.box[boxUid] = true; var offset = boxUid * 4; if (this._circleAndRectCollide( circle.x, circle.y, circle.radius, bboxes[offset + 0], bboxes[offset + 1], bboxes[offset + 2], bboxes[offset + 3]) && (!predicate || predicate(this.boxKeys[boxUid]))) { result.push(true); return true; } } } } var circleCell = this.circleCells[cellIndex]; if (circleCell !== null) { var circles = this.circles; for (var i$1 = 0, list$1 = circleCell; i$1 < list$1.length; i$1 += 1) { var circleUid = list$1[i$1]; if (!seenUids.circle[circleUid]) { seenUids.circle[circleUid] = true; var offset$1 = circleUid * 3; if (this._circlesCollide( circles[offset$1], circles[offset$1 + 1], circles[offset$1 + 2], circle.x, circle.y, circle.radius) && (!predicate || predicate(this.circleKeys[circleUid]))) { result.push(true); return true; } } } } }; GridIndex.prototype._forEachCell = function _forEachCell (x1 , y1 , x2 , y2 , fn , arg1 , arg2 , predicate ) { var cx1 = this._convertToXCellCoord(x1); var cy1 = this._convertToYCellCoord(y1); var cx2 = this._convertToXCellCoord(x2); var cy2 = this._convertToYCellCoord(y2); for (var x = cx1; x <= cx2; x++) { for (var y = cy1; y <= cy2; y++) { var cellIndex = this.xCellCount * y + x; if (fn.call(this, x1, y1, x2, y2, cellIndex, arg1, arg2, predicate)) { return; } } } }; GridIndex.prototype._convertToXCellCoord = function _convertToXCellCoord (x ) { return Math.max(0, Math.min(this.xCellCount - 1, Math.floor(x * this.xScale))); }; GridIndex.prototype._convertToYCellCoord = function _convertToYCellCoord (y ) { return Math.max(0, Math.min(this.yCellCount - 1, Math.floor(y * this.yScale))); }; GridIndex.prototype._circlesCollide = function _circlesCollide (x1 , y1 , r1 , x2 , y2 , r2 ) { var dx = x2 - x1; var dy = y2 - y1; var bothRadii = r1 + r2; return (bothRadii * bothRadii) > (dx * dx + dy * dy); }; GridIndex.prototype._circleAndRectCollide = function _circleAndRectCollide (circleX , circleY , radius , x1 , y1 , x2 , y2 ) { var halfRectWidth = (x2 - x1) / 2; var distX = Math.abs(circleX - (x1 + halfRectWidth)); if (distX > (halfRectWidth + radius)) { return false; } var halfRectHeight = (y2 - y1) / 2; var distY = Math.abs(circleY - (y1 + halfRectHeight)); if (distY > (halfRectHeight + radius)) { return false; } if (distX <= halfRectWidth || distY <= halfRectHeight) { return true; } var dx = distX - halfRectWidth; var dy = distY - halfRectHeight; return (dx * dx + dy * dy <= (radius * radius)); }; // var symbolLayoutProperties = __chunk_1.properties.layout; /* * # Overview of coordinate spaces * * ## Tile coordinate spaces * Each label has an anchor. Some labels have corresponding line geometries. * The points for both anchors and lines are stored in tile units. Each tile has it's own * coordinate space going from (0, 0) at the top left to (EXTENT, EXTENT) at the bottom right. * * ## GL coordinate space * At the end of everything, the vertex shader needs to produce a position in GL coordinate space, * which is (-1, 1) at the top left and (1, -1) in the bottom right. * * ## Map pixel coordinate spaces * Each tile has a pixel coordinate space. It's just the tile units scaled so that one unit is * whatever counts as 1 pixel at the current zoom. * This space is used for pitch-alignment=map, rotation-alignment=map * * ## Rotated map pixel coordinate spaces * Like the above, but rotated so axis of the space are aligned with the viewport instead of the tile. * This space is used for pitch-alignment=map, rotation-alignment=viewport * * ## Viewport pixel coordinate space * (0, 0) is at the top left of the canvas and (pixelWidth, pixelHeight) is at the bottom right corner * of the canvas. This space is used for pitch-alignment=viewport * * * # Vertex projection * It goes roughly like this: * 1. project the anchor and line from tile units into the correct label coordinate space * - map pixel space pitch-alignment=map rotation-alignment=map * - rotated map pixel space pitch-alignment=map rotation-alignment=viewport * - viewport pixel space pitch-alignment=viewport rotation-alignment=* * 2. if the label follows a line, find the point along the line that is the correct distance from the anchor. * 3. add the glyph's corner offset to the point from step 3 * 4. convert from the label coordinate space to gl coordinates * * For horizontal labels we want to do step 1 in the shader for performance reasons (no cpu work). * This is what `u_label_plane_matrix` is used for. * For labels aligned with lines we have to steps 1 and 2 on the cpu since we need access to the line geometry. * This is what `updateLineLabels(...)` does. * Since the conversion is handled on the cpu we just set `u_label_plane_matrix` to an identity matrix. * * Steps 3 and 4 are done in the shaders for all labels. */ /* * Returns a matrix for converting from tile units to the correct label coordinate space. */ function getLabelPlaneMatrix(posMatrix , pitchWithMap , rotateWithMap , transform , pixelsToTileUnits ) { var m = __chunk_1.create(); if (pitchWithMap) { __chunk_1.scale(m, m, [1 / pixelsToTileUnits, 1 / pixelsToTileUnits, 1]); if (!rotateWithMap) { __chunk_1.rotateZ(m, m, transform.angle); } } else { __chunk_1.multiply(m, transform.labelPlaneMatrix, posMatrix); } return m; } /* * Returns a matrix for converting from the correct label coordinate space to gl coords. */ function getGlCoordMatrix(posMatrix , pitchWithMap , rotateWithMap , transform , pixelsToTileUnits ) { if (pitchWithMap) { var m = __chunk_1.clone(posMatrix); __chunk_1.scale(m, m, [pixelsToTileUnits, pixelsToTileUnits, 1]); if (!rotateWithMap) { __chunk_1.rotateZ(m, m, -transform.angle); } return m; } else { return transform.glCoordMatrix; } } function project(point , matrix ) { var pos = [point.x, point.y, 0, 1]; xyTransformMat4(pos, pos, matrix); var w = pos[3]; return { point: new __chunk_1.Point(pos[0] / w, pos[1] / w), signedDistanceFromCamera: w }; } function isVisible(anchorPos , clippingBuffer ) { var x = anchorPos[0] / anchorPos[3]; var y = anchorPos[1] / anchorPos[3]; var inPaddedViewport = ( x >= -clippingBuffer[0] && x <= clippingBuffer[0] && y >= -clippingBuffer[1] && y <= clippingBuffer[1]); return inPaddedViewport; } /* * Update the `dynamicLayoutVertexBuffer` for the buffer with the correct glyph positions for the current map view. * This is only run on labels that are aligned with lines. Horizontal labels are handled entirely in the shader. */ function updateLineLabels(bucket , posMatrix , painter , isText , labelPlaneMatrix , glCoordMatrix , pitchWithMap , keepUpright ) { var sizeData = isText ? bucket.textSizeData : bucket.iconSizeData; var partiallyEvaluatedSize = __chunk_1.evaluateSizeForZoom(sizeData, painter.transform.zoom, symbolLayoutProperties.properties[isText ? 'text-size' : 'icon-size']); var clippingBuffer = [256 / painter.width * 2 + 1, 256 / painter.height * 2 + 1]; var dynamicLayoutVertexArray = isText ? bucket.text.dynamicLayoutVertexArray : bucket.icon.dynamicLayoutVertexArray; dynamicLayoutVertexArray.clear(); var lineVertexArray = bucket.lineVertexArray; var placedSymbols = isText ? bucket.text.placedSymbolArray : bucket.icon.placedSymbolArray; var aspectRatio = painter.transform.width / painter.transform.height; var useVertical = false; for (var s = 0; s < placedSymbols.length; s++) { var symbol = placedSymbols.get(s); // Don't do calculations for vertical glyphs unless the previous symbol was horizontal // and we determined that vertical glyphs were necessary. // Also don't do calculations for symbols that are collided and fully faded out if (symbol.hidden || symbol.writingMode === __chunk_1.WritingMode.vertical && !useVertical) { hideGlyphs(symbol.numGlyphs, dynamicLayoutVertexArray); continue; } // Awkward... but we're counting on the paired "vertical" symbol coming immediately after its horizontal counterpart useVertical = false; var anchorPos = [symbol.anchorX, symbol.anchorY, 0, 1]; __chunk_1.transformMat4(anchorPos, anchorPos, posMatrix); // Don't bother calculating the correct point for invisible labels. if (!isVisible(anchorPos, clippingBuffer)) { hideGlyphs(symbol.numGlyphs, dynamicLayoutVertexArray); continue; } var cameraToAnchorDistance = anchorPos[3]; var perspectiveRatio = 0.5 + 0.5 * (cameraToAnchorDistance / painter.transform.cameraToCenterDistance); var fontSize = __chunk_1.evaluateSizeForFeature(sizeData, partiallyEvaluatedSize, symbol); var pitchScaledFontSize = pitchWithMap ? fontSize * perspectiveRatio : fontSize / perspectiveRatio; var tileAnchorPoint = new __chunk_1.Point(symbol.anchorX, symbol.anchorY); var anchorPoint = project(tileAnchorPoint, labelPlaneMatrix).point; var projectionCache = {}; var placeUnflipped = placeGlyphsAlongLine(symbol, pitchScaledFontSize, false /*unflipped*/, keepUpright, posMatrix, labelPlaneMatrix, glCoordMatrix, bucket.glyphOffsetArray, lineVertexArray, dynamicLayoutVertexArray, anchorPoint, tileAnchorPoint, projectionCache, aspectRatio); useVertical = placeUnflipped.useVertical; if (placeUnflipped.notEnoughRoom || useVertical || (placeUnflipped.needsFlipping && placeGlyphsAlongLine(symbol, pitchScaledFontSize, true /*flipped*/, keepUpright, posMatrix, labelPlaneMatrix, glCoordMatrix, bucket.glyphOffsetArray, lineVertexArray, dynamicLayoutVertexArray, anchorPoint, tileAnchorPoint, projectionCache, aspectRatio).notEnoughRoom)) { hideGlyphs(symbol.numGlyphs, dynamicLayoutVertexArray); } } if (isText) { bucket.text.dynamicLayoutVertexBuffer.updateData(dynamicLayoutVertexArray); } else { bucket.icon.dynamicLayoutVertexBuffer.updateData(dynamicLayoutVertexArray); } } function placeFirstAndLastGlyph(fontScale , glyphOffsetArray , lineOffsetX , lineOffsetY , flip , anchorPoint , tileAnchorPoint , symbol , lineVertexArray , labelPlaneMatrix , projectionCache , returnTileDistance ) { var glyphEndIndex = symbol.glyphStartIndex + symbol.numGlyphs; var lineStartIndex = symbol.lineStartIndex; var lineEndIndex = symbol.lineStartIndex + symbol.lineLength; var firstGlyphOffset = glyphOffsetArray.getoffsetX(symbol.glyphStartIndex); var lastGlyphOffset = glyphOffsetArray.getoffsetX(glyphEndIndex - 1); var firstPlacedGlyph = placeGlyphAlongLine(fontScale * firstGlyphOffset, lineOffsetX, lineOffsetY, flip, anchorPoint, tileAnchorPoint, symbol.segment, lineStartIndex, lineEndIndex, lineVertexArray, labelPlaneMatrix, projectionCache, returnTileDistance); if (!firstPlacedGlyph) { return null; } var lastPlacedGlyph = placeGlyphAlongLine(fontScale * lastGlyphOffset, lineOffsetX, lineOffsetY, flip, anchorPoint, tileAnchorPoint, symbol.segment, lineStartIndex, lineEndIndex, lineVertexArray, labelPlaneMatrix, projectionCache, returnTileDistance); if (!lastPlacedGlyph) { return null; } return { first: firstPlacedGlyph, last: lastPlacedGlyph }; } function requiresOrientationChange(writingMode, firstPoint, lastPoint, aspectRatio) { if (writingMode === __chunk_1.WritingMode.horizontal) { // On top of choosing whether to flip, choose whether to render this version of the glyphs or the alternate // vertical glyphs. We can't just filter out vertical glyphs in the horizontal range because the horizontal // and vertical versions can have slightly different projections which could lead to angles where both or // neither showed. var rise = Math.abs(lastPoint.y - firstPoint.y); var run = Math.abs(lastPoint.x - firstPoint.x) * aspectRatio; if (rise > run) { return { useVertical: true }; } } if (writingMode === __chunk_1.WritingMode.vertical ? firstPoint.y < lastPoint.y : firstPoint.x > lastPoint.x) { // Includes "horizontalOnly" case for labels without vertical glyphs return { needsFlipping: true }; } return null; } function placeGlyphsAlongLine(symbol, fontSize, flip, keepUpright, posMatrix, labelPlaneMatrix, glCoordMatrix, glyphOffsetArray, lineVertexArray, dynamicLayoutVertexArray, anchorPoint, tileAnchorPoint, projectionCache, aspectRatio) { var fontScale = fontSize / 24; var lineOffsetX = symbol.lineOffsetX * fontScale; var lineOffsetY = symbol.lineOffsetY * fontScale; var placedGlyphs; if (symbol.numGlyphs > 1) { var glyphEndIndex = symbol.glyphStartIndex + symbol.numGlyphs; var lineStartIndex = symbol.lineStartIndex; var lineEndIndex = symbol.lineStartIndex + symbol.lineLength; // Place the first and the last glyph in the label first, so we can figure out // the overall orientation of the label and determine whether it needs to be flipped in keepUpright mode var firstAndLastGlyph = placeFirstAndLastGlyph(fontScale, glyphOffsetArray, lineOffsetX, lineOffsetY, flip, anchorPoint, tileAnchorPoint, symbol, lineVertexArray, labelPlaneMatrix, projectionCache, false); if (!firstAndLastGlyph) { return { notEnoughRoom: true }; } var firstPoint = project(firstAndLastGlyph.first.point, glCoordMatrix).point; var lastPoint = project(firstAndLastGlyph.last.point, glCoordMatrix).point; if (keepUpright && !flip) { var orientationChange = requiresOrientationChange(symbol.writingMode, firstPoint, lastPoint, aspectRatio); if (orientationChange) { return orientationChange; } } placedGlyphs = [firstAndLastGlyph.first]; for (var glyphIndex = symbol.glyphStartIndex + 1; glyphIndex < glyphEndIndex - 1; glyphIndex++) { // Since first and last glyph fit on the line, we're sure that the rest of the glyphs can be placed // $FlowFixMe placedGlyphs.push(placeGlyphAlongLine(fontScale * glyphOffsetArray.getoffsetX(glyphIndex), lineOffsetX, lineOffsetY, flip, anchorPoint, tileAnchorPoint, symbol.segment, lineStartIndex, lineEndIndex, lineVertexArray, labelPlaneMatrix, projectionCache, false)); } placedGlyphs.push(firstAndLastGlyph.last); } else { // Only a single glyph to place // So, determine whether to flip based on projected angle of the line segment it's on if (keepUpright && !flip) { var a = project(tileAnchorPoint, posMatrix).point; var tileVertexIndex = (symbol.lineStartIndex + symbol.segment + 1); // $FlowFixMe var tileSegmentEnd = new __chunk_1.Point(lineVertexArray.getx(tileVertexIndex), lineVertexArray.gety(tileVertexIndex)); var projectedVertex = project(tileSegmentEnd, posMatrix); // We know the anchor will be in the viewport, but the end of the line segment may be // behind the plane of the camera, in which case we can use a point at any arbitrary (closer) // point on the segment. var b = (projectedVertex.signedDistanceFromCamera > 0) ? projectedVertex.point : projectTruncatedLineSegment(tileAnchorPoint, tileSegmentEnd, a, 1, posMatrix); var orientationChange$1 = requiresOrientationChange(symbol.writingMode, a, b, aspectRatio); if (orientationChange$1) { return orientationChange$1; } } // $FlowFixMe var singleGlyph = placeGlyphAlongLine(fontScale * glyphOffsetArray.getoffsetX(symbol.glyphStartIndex), lineOffsetX, lineOffsetY, flip, anchorPoint, tileAnchorPoint, symbol.segment, symbol.lineStartIndex, symbol.lineStartIndex + symbol.lineLength, lineVertexArray, labelPlaneMatrix, projectionCache, false); if (!singleGlyph) { return { notEnoughRoom: true }; } placedGlyphs = [singleGlyph]; } for (var i = 0, list = placedGlyphs; i < list.length; i += 1) { var glyph = list[i]; __chunk_1.addDynamicAttributes(dynamicLayoutVertexArray, glyph.point, glyph.angle); } return {}; } function projectTruncatedLineSegment(previousTilePoint , currentTilePoint , previousProjectedPoint , minimumLength , projectionMatrix ) { // We are assuming "previousTilePoint" won't project to a point within one unit of the camera plane // If it did, that would mean our label extended all the way out from within the viewport to a (very distant) // point near the plane of the camera. We wouldn't be able to render the label anyway once it crossed the // plane of the camera. var projectedUnitVertex = project(previousTilePoint.add(previousTilePoint.sub(currentTilePoint)._unit()), projectionMatrix).point; var projectedUnitSegment = previousProjectedPoint.sub(projectedUnitVertex); return previousProjectedPoint.add(projectedUnitSegment._mult(minimumLength / projectedUnitSegment.mag())); } function placeGlyphAlongLine(offsetX , lineOffsetX , lineOffsetY , flip , anchorPoint , tileAnchorPoint , anchorSegment , lineStartIndex , lineEndIndex , lineVertexArray , labelPlaneMatrix , projectionCache , returnTileDistance ) { var combinedOffsetX = flip ? offsetX - lineOffsetX : offsetX + lineOffsetX; var dir = combinedOffsetX > 0 ? 1 : -1; var angle = 0; if (flip) { // The label needs to be flipped to keep text upright. // Iterate in the reverse direction. dir *= -1; angle = Math.PI; } if (dir < 0) { angle += Math.PI; } var currentIndex = dir > 0 ? lineStartIndex + anchorSegment : lineStartIndex + anchorSegment + 1; var initialIndex = currentIndex; var current = anchorPoint; var prev = anchorPoint; var distanceToPrev = 0; var currentSegmentDistance = 0; var absOffsetX = Math.abs(combinedOffsetX); while (distanceToPrev + currentSegmentDistance <= absOffsetX) { currentIndex += dir; // offset does not fit on the projected line if (currentIndex < lineStartIndex || currentIndex >= lineEndIndex) { return null; } prev = current; current = projectionCache[currentIndex]; if (current === undefined) { var currentVertex = new __chunk_1.Point(lineVertexArray.getx(currentIndex), lineVertexArray.gety(currentIndex)); var projection = project(currentVertex, labelPlaneMatrix); if (projection.signedDistanceFromCamera > 0) { current = projectionCache[currentIndex] = projection.point; } else { // The vertex is behind the plane of the camera, so we can't project it // Instead, we'll create a vertex along the line that's far enough to include the glyph var previousLineVertexIndex = currentIndex - dir; var previousTilePoint = distanceToPrev === 0 ? tileAnchorPoint : new __chunk_1.Point(lineVertexArray.getx(previousLineVertexIndex), lineVertexArray.gety(previousLineVertexIndex)); // Don't cache because the new vertex might not be far enough out for future glyphs on the same segment current = projectTruncatedLineSegment(previousTilePoint, currentVertex, prev, absOffsetX - distanceToPrev + 1, labelPlaneMatrix); } } distanceToPrev += currentSegmentDistance; currentSegmentDistance = prev.dist(current); } // The point is on the current segment. Interpolate to find it. var segmentInterpolationT = (absOffsetX - distanceToPrev) / currentSegmentDistance; var prevToCurrent = current.sub(prev); var p = prevToCurrent.mult(segmentInterpolationT)._add(prev); // offset the point from the line to text-offset and icon-offset p._add(prevToCurrent._unit()._perp()._mult(lineOffsetY * dir)); var segmentAngle = angle + Math.atan2(current.y - prev.y, current.x - prev.x); return { point: p, angle: segmentAngle, tileDistance: returnTileDistance ? { prevTileDistance: (currentIndex - dir) === initialIndex ? 0 : lineVertexArray.gettileUnitDistanceFromAnchor(currentIndex - dir), lastSegmentViewportDistance: absOffsetX - distanceToPrev } : null }; } var hiddenGlyphAttributes = new Float32Array([-Infinity, -Infinity, 0, -Infinity, -Infinity, 0, -Infinity, -Infinity, 0, -Infinity, -Infinity, 0]); // Hide them by moving them offscreen. We still need to add them to the buffer // because the dynamic buffer is paired with a static buffer that doesn't get updated. function hideGlyphs(num , dynamicLayoutVertexArray ) { for (var i = 0; i < num; i++) { var offset = dynamicLayoutVertexArray.length; dynamicLayoutVertexArray.resize(offset + 4); // Since all hidden glyphs have the same attributes, we can build up the array faster with a single call to Float32Array.set // for each set of four vertices, instead of calling addDynamicAttributes for each vertex. dynamicLayoutVertexArray.float32.set(hiddenGlyphAttributes, offset * 3); } } // For line label layout, we're not using z output and our w input is always 1 // This custom matrix transformation ignores those components to make projection faster function xyTransformMat4(out , a , m ) { var x = a[0], y = a[1]; out[0] = m[0] * x + m[4] * y + m[12]; out[1] = m[1] * x + m[5] * y + m[13]; out[3] = m[3] * x + m[7] * y + m[15]; return out; } // // When a symbol crosses the edge that causes it to be included in // collision detection, it will cause changes in the symbols around // it. This constant specifies how many pixels to pad the edge of // the viewport for collision detection so that the bulk of the changes // occur offscreen. Making this constant greater increases label // stability, but it's expensive. var viewportPadding = 100; /** * A collision index used to prevent symbols from overlapping. It keep tracks of * where previous symbols have been placed and is used to check if a new * symbol overlaps with any previously added symbols. * * There are two steps to insertion: first placeCollisionBox/Circles checks if * there's room for a symbol, then insertCollisionBox/Circles actually puts the * symbol in the index. The two step process allows paired symbols to be inserted * together even if they overlap. * * @private */ var CollisionIndex = function CollisionIndex( transform , grid, ignoredGrid ) { if ( grid === void 0 ) grid = new GridIndex(transform.width + 2 * viewportPadding, transform.height + 2 * viewportPadding, 25); if ( ignoredGrid === void 0 ) ignoredGrid = new GridIndex(transform.width + 2 * viewportPadding, transform.height + 2 * viewportPadding, 25); this.transform = transform; this.grid = grid; this.ignoredGrid = ignoredGrid; this.pitchfactor = Math.cos(transform._pitch) * transform.cameraToCenterDistance; this.screenRightBoundary = transform.width + viewportPadding; this.screenBottomBoundary = transform.height + viewportPadding; this.gridRightBoundary = transform.width + 2 * viewportPadding; this.gridBottomBoundary = transform.height + 2 * viewportPadding; }; CollisionIndex.prototype.placeCollisionBox = function placeCollisionBox (collisionBox , allowOverlap , textPixelRatio , posMatrix , collisionGroupPredicate ) { var projectedPoint = this.projectAndGetPerspectiveRatio(posMatrix, collisionBox.anchorPointX, collisionBox.anchorPointY); var tileToViewport = textPixelRatio * projectedPoint.perspectiveRatio; var tlX = collisionBox.x1 * tileToViewport + projectedPoint.point.x; var tlY = collisionBox.y1 * tileToViewport + projectedPoint.point.y; var brX = collisionBox.x2 * tileToViewport + projectedPoint.point.x; var brY = collisionBox.y2 * tileToViewport + projectedPoint.point.y; if (!this.isInsideGrid(tlX, tlY, brX, brY) || (!allowOverlap && this.grid.hitTest(tlX, tlY, brX, brY, collisionGroupPredicate))) { return { box: [], offscreen: false }; } return { box: [tlX, tlY, brX, brY], offscreen: this.isOffscreen(tlX, tlY, brX, brY) }; }; CollisionIndex.prototype.approximateTileDistance = function approximateTileDistance (tileDistance , lastSegmentAngle , pixelsToTileUnits , cameraToAnchorDistance , pitchWithMap ) { // This is a quick and dirty solution for chosing which collision circles to use (since collision circles are // laid out in tile units). Ideally, I think we should generate collision circles on the fly in viewport coordinates // at the time we do collision detection. // See https://github.com/mapbox/mapbox-gl-js/issues/5474 // incidenceStretch is the ratio of how much y space a label takes up on a tile while drawn perpendicular to the viewport vs // how much space it would take up if it were drawn flat on the tile // Using law of sines, camera_to_anchor/sin(ground_angle) = camera_to_center/sin(incidence_angle) // Incidence angle 90 -> head on, sin(incidence_angle) = 1, no stretch // Incidence angle 1 -> very oblique, sin(incidence_angle) =~ 0, lots of stretch // ground_angle = u_pitch + PI/2 -> sin(ground_angle) = cos(u_pitch) // incidenceStretch = 1 / sin(incidenceAngle) var incidenceStretch = pitchWithMap ? 1 : cameraToAnchorDistance / this.pitchfactor; var lastSegmentTile = tileDistance.lastSegmentViewportDistance * pixelsToTileUnits; return tileDistance.prevTileDistance + lastSegmentTile + (incidenceStretch - 1) * lastSegmentTile * Math.abs(Math.sin(lastSegmentAngle)); }; CollisionIndex.prototype.placeCollisionCircles = function placeCollisionCircles (collisionCircles , allowOverlap , scale , textPixelRatio , symbol , lineVertexArray , glyphOffsetArray , fontSize , posMatrix , labelPlaneMatrix , showCollisionCircles , pitchWithMap , collisionGroupPredicate ) { var placedCollisionCircles = []; var projectedAnchor = this.projectAnchor(posMatrix, symbol.anchorX, symbol.anchorY); var projectionCache = {}; var fontScale = fontSize / 24; var lineOffsetX = symbol.lineOffsetX * fontSize; var lineOffsetY = symbol.lineOffsetY * fontSize; var tileUnitAnchorPoint = new __chunk_1.Point(symbol.anchorX, symbol.anchorY); // projection.project generates NDC coordinates, as opposed to the // pixel-based grid coordinates generated by this.projectPoint var labelPlaneAnchorPoint = project(tileUnitAnchorPoint, labelPlaneMatrix).point; var firstAndLastGlyph = placeFirstAndLastGlyph( fontScale, glyphOffsetArray, lineOffsetX, lineOffsetY, /*flip*/ false, labelPlaneAnchorPoint, tileUnitAnchorPoint, symbol, lineVertexArray, labelPlaneMatrix, projectionCache, /*return tile distance*/ true); var collisionDetected = false; var inGrid = false; var entirelyOffscreen = true; var tileToViewport = projectedAnchor.perspectiveRatio * textPixelRatio; // pixelsToTileUnits is used for translating line geometry to tile units // ... so we care about 'scale' but not 'perspectiveRatio' // equivalent to pixel_to_tile_units var pixelsToTileUnits = 1 / (textPixelRatio * scale); var firstTileDistance = 0, lastTileDistance = 0; if (firstAndLastGlyph) { firstTileDistance = this.approximateTileDistance(firstAndLastGlyph.first.tileDistance, firstAndLastGlyph.first.angle, pixelsToTileUnits, projectedAnchor.cameraDistance, pitchWithMap); lastTileDistance = this.approximateTileDistance(firstAndLastGlyph.last.tileDistance, firstAndLastGlyph.last.angle, pixelsToTileUnits, projectedAnchor.cameraDistance, pitchWithMap); } for (var k = 0; k < collisionCircles.length; k += 5) { var anchorPointX = collisionCircles[k]; var anchorPointY = collisionCircles[k + 1]; var tileUnitRadius = collisionCircles[k + 2]; var boxSignedDistanceFromAnchor = collisionCircles[k + 3]; if (!firstAndLastGlyph || (boxSignedDistanceFromAnchor < -firstTileDistance) || (boxSignedDistanceFromAnchor > lastTileDistance)) { // The label either doesn't fit on its line or we // don't need to use this circle because the label // doesn't extend this far. Either way, mark the circle unused. markCollisionCircleUsed(collisionCircles, k, false); continue; } var projectedPoint = this.projectPoint(posMatrix, anchorPointX, anchorPointY); var radius = tileUnitRadius * tileToViewport; var atLeastOneCirclePlaced = placedCollisionCircles.length > 0; if (atLeastOneCirclePlaced) { var dx = projectedPoint.x - placedCollisionCircles[placedCollisionCircles.length - 4]; var dy = projectedPoint.y - placedCollisionCircles[placedCollisionCircles.length - 3]; // The circle edges touch when the distance between their centers is 2x the radius // When the distance is 1x the radius, they're doubled up, and we could remove // every other circle while keeping them all in touch. // We actually start removing circles when the distance is √2x the radius: // thinning the number of circles as much as possible is a major performance win, // and the small gaps introduced don't make a very noticeable difference. var placedTooDensely = radius * radius * 2 > dx * dx + dy * dy; if (placedTooDensely) { var atLeastOneMoreCircle = (k + 8) < collisionCircles.length; if (atLeastOneMoreCircle) { var nextBoxDistanceToAnchor = collisionCircles[k + 8]; if ((nextBoxDistanceToAnchor > -firstTileDistance) && (nextBoxDistanceToAnchor < lastTileDistance)) { // Hide significantly overlapping circles, unless this is the last one we can // use, in which case we want to keep it in place even if it's tightly packed // with the one before it. markCollisionCircleUsed(collisionCircles, k, false); continue; } } } } var collisionBoxArrayIndex = k / 5; placedCollisionCircles.push(projectedPoint.x, projectedPoint.y, radius, collisionBoxArrayIndex); markCollisionCircleUsed(collisionCircles, k, true); var x1 = projectedPoint.x - radius; var y1 = projectedPoint.y - radius; var x2 = projectedPoint.x + radius; var y2 = projectedPoint.y + radius; entirelyOffscreen = entirelyOffscreen && this.isOffscreen(x1, y1, x2, y2); inGrid = inGrid || this.isInsideGrid(x1, y1, x2, y2); if (!allowOverlap) { if (this.grid.hitTestCircle(projectedPoint.x, projectedPoint.y, radius, collisionGroupPredicate)) { if (!showCollisionCircles) { return { circles: [], offscreen: false }; } else { // Don't early exit if we're showing the debug circles because we still want to calculate // which circles are in use collisionDetected = true; } } } } return { circles: (collisionDetected || !inGrid) ? [] : placedCollisionCircles, offscreen: entirelyOffscreen }; }; /** * Because the geometries in the CollisionIndex are an approximation of the shape of * symbols on the map, we use the CollisionIndex to look up the symbol part of * `queryRenderedFeatures`. * * @private */ CollisionIndex.prototype.queryRenderedSymbols = function queryRenderedSymbols (viewportQueryGeometry ) { if (viewportQueryGeometry.length === 0 || (this.grid.keysLength() === 0 && this.ignoredGrid.keysLength() === 0)) { return {}; } var query = []; var minX = Infinity; var minY = Infinity; var maxX = -Infinity; var maxY = -Infinity; for (var i = 0, list = viewportQueryGeometry; i < list.length; i += 1) { var point = list[i]; var gridPoint = new __chunk_1.Point(point.x + viewportPadding, point.y + viewportPadding); minX = Math.min(minX, gridPoint.x); minY = Math.min(minY, gridPoint.y); maxX = Math.max(maxX, gridPoint.x); maxY = Math.max(maxY, gridPoint.y); query.push(gridPoint); } var features = this.grid.query(minX, minY, maxX, maxY) .concat(this.ignoredGrid.query(minX, minY, maxX, maxY)); var seenFeatures = {}; var result = {}; for (var i$1 = 0, list$1 = features; i$1 < list$1.length; i$1 += 1) { var feature = list$1[i$1]; var featureKey = feature.key; // Skip already seen features. if (seenFeatures[featureKey.bucketInstanceId] === undefined) { seenFeatures[featureKey.bucketInstanceId] = {}; } if (seenFeatures[featureKey.bucketInstanceId][featureKey.featureIndex]) { continue; } // Check if query intersects with the feature box // "Collision Circles" for line labels are treated as boxes here // Since there's no actual collision taking place, the circle vs. square // distinction doesn't matter as much, and box geometry is easier // to work with. var bbox = [ new __chunk_1.Point(feature.x1, feature.y1), new __chunk_1.Point(feature.x2, feature.y1), new __chunk_1.Point(feature.x2, feature.y2), new __chunk_1.Point(feature.x1, feature.y2) ]; if (!__chunk_1.polygonIntersectsPolygon(query, bbox)) { continue; } seenFeatures[featureKey.bucketInstanceId][featureKey.featureIndex] = true; if (result[featureKey.bucketInstanceId] === undefined) { result[featureKey.bucketInstanceId] = []; } result[featureKey.bucketInstanceId].push(featureKey.featureIndex); } return result; }; CollisionIndex.prototype.insertCollisionBox = function insertCollisionBox (collisionBox , ignorePlacement , bucketInstanceId , featureIndex , collisionGroupID ) { var grid = ignorePlacement ? this.ignoredGrid : this.grid; var key = { bucketInstanceId: bucketInstanceId, featureIndex: featureIndex, collisionGroupID: collisionGroupID }; grid.insert(key, collisionBox[0], collisionBox[1], collisionBox[2], collisionBox[3]); }; CollisionIndex.prototype.insertCollisionCircles = function insertCollisionCircles (collisionCircles , ignorePlacement , bucketInstanceId , featureIndex , collisionGroupID ) { var grid = ignorePlacement ? this.ignoredGrid : this.grid; var key = { bucketInstanceId: bucketInstanceId, featureIndex: featureIndex, collisionGroupID: collisionGroupID }; for (var k = 0; k < collisionCircles.length; k += 4) { grid.insertCircle(key, collisionCircles[k], collisionCircles[k + 1], collisionCircles[k + 2]); } }; CollisionIndex.prototype.projectAnchor = function projectAnchor (posMatrix , x , y ) { var p = [x, y, 0, 1]; xyTransformMat4(p, p, posMatrix); return { perspectiveRatio: 0.5 + 0.5 * (this.transform.cameraToCenterDistance / p[3]), cameraDistance: p[3] }; }; CollisionIndex.prototype.projectPoint = function projectPoint (posMatrix , x , y ) { var p = [x, y, 0, 1]; xyTransformMat4(p, p, posMatrix); return new __chunk_1.Point( (((p[0] / p[3] + 1) / 2) * this.transform.width) + viewportPadding, (((-p[1] / p[3] + 1) / 2) * this.transform.height) + viewportPadding ); }; CollisionIndex.prototype.projectAndGetPerspectiveRatio = function projectAndGetPerspectiveRatio (posMatrix , x , y ) { var p = [x, y, 0, 1]; xyTransformMat4(p, p, posMatrix); var a = new __chunk_1.Point( (((p[0] / p[3] + 1) / 2) * this.transform.width) + viewportPadding, (((-p[1] / p[3] + 1) / 2) * this.transform.height) + viewportPadding ); return { point: a, // See perspective ratio comment in symbol_sdf.vertex // We're doing collision detection in viewport space so we need // to scale down boxes in the distance perspectiveRatio: 0.5 + 0.5 * (this.transform.cameraToCenterDistance / p[3]) }; }; CollisionIndex.prototype.isOffscreen = function isOffscreen (x1 , y1 , x2 , y2 ) { return x2 < viewportPadding || x1 >= this.screenRightBoundary || y2 < viewportPadding || y1 > this.screenBottomBoundary; }; CollisionIndex.prototype.isInsideGrid = function isInsideGrid (x1 , y1 , x2 , y2 ) { return x2 >= 0 && x1 < this.gridRightBoundary && y2 >= 0 && y1 < this.gridBottomBoundary; }; function markCollisionCircleUsed(collisionCircles , index , used ) { collisionCircles[index + 4] = used ? 1 : 0; } // /** * Converts a pixel value at a the given zoom level to tile units. * * The shaders mostly calculate everything in tile units so style * properties need to be converted from pixels to tile units using this. * * For example, a translation by 30 pixels at zoom 6.5 will be a * translation by pixelsToTileUnits(30, 6.5) tile units. * * @returns value in tile units * @private */ function pixelsToTileUnits(tile , pixelValue , z ) { return pixelValue * (__chunk_1.EXTENT / (tile.tileSize * Math.pow(2, z - tile.tileID.overscaledZ))); } // var OpacityState = function OpacityState(prevState , increment , placed , skipFade ) { if (prevState) { this.opacity = Math.max(0, Math.min(1, prevState.opacity + (prevState.placed ? increment : -increment))); } else { this.opacity = (skipFade && placed) ? 1 : 0; } this.placed = placed; }; OpacityState.prototype.isHidden = function isHidden () { return this.opacity === 0 && !this.placed; }; var JointOpacityState = function JointOpacityState(prevState , increment , placedText , placedIcon , skipFade ) { this.text = new OpacityState(prevState ? prevState.text : null, increment, placedText, skipFade); this.icon = new OpacityState(prevState ? prevState.icon : null, increment, placedIcon, skipFade); }; JointOpacityState.prototype.isHidden = function isHidden () { return this.text.isHidden() && this.icon.isHidden(); }; var JointPlacement = function JointPlacement(text , icon , skipFade ) { this.text = text; this.icon = icon; this.skipFade = skipFade; }; var RetainedQueryData = function RetainedQueryData(bucketInstanceId , featureIndex , sourceLayerIndex , bucketIndex , tileID ) { this.bucketInstanceId = bucketInstanceId; this.featureIndex = featureIndex; this.sourceLayerIndex = sourceLayerIndex; this.bucketIndex = bucketIndex; this.tileID = tileID; }; var CollisionGroups = function CollisionGroups(crossSourceCollisions ) { this.crossSourceCollisions = crossSourceCollisions; this.maxGroupID = 0; this.collisionGroups = {}; }; CollisionGroups.prototype.get = function get (sourceID ) { // The predicate/groupID mechanism allows for arbitrary grouping, // but the current interface defines one source == one group when // crossSourceCollisions == true. if (!this.crossSourceCollisions) { if (!this.collisionGroups[sourceID]) { var nextGroupID = ++this.maxGroupID; this.collisionGroups[sourceID] = { ID: nextGroupID, predicate: function (key) { return key.collisionGroupID === nextGroupID; } }; } return this.collisionGroups[sourceID]; } else { return { ID: 0, predicate: null }; } }; function calculateVariableLayoutOffset(anchor , width , height , radialOffset , textBoxScale ) { var ref = __chunk_1.getAnchorAlignment(anchor); var horizontalAlign = ref.horizontalAlign; var verticalAlign = ref.verticalAlign; var shiftX = -(horizontalAlign - 0.5) * width; var shiftY = -(verticalAlign - 0.5) * height; var offset = __chunk_1.evaluateRadialOffset(anchor, radialOffset); return new __chunk_1.Point( shiftX + offset[0] * textBoxScale, shiftY + offset[1] * textBoxScale ); } function shiftVariableCollisionBox(collisionBox , shiftX , shiftY , rotateWithMap , pitchWithMap , angle ) { var x1 = collisionBox.x1; var x2 = collisionBox.x2; var y1 = collisionBox.y1; var y2 = collisionBox.y2; var anchorPointX = collisionBox.anchorPointX; var anchorPointY = collisionBox.anchorPointY; var rotatedOffset = new __chunk_1.Point(shiftX, shiftY); if (rotateWithMap) { rotatedOffset._rotate(pitchWithMap ? angle : -angle); } return { x1: x1 + rotatedOffset.x, y1: y1 + rotatedOffset.y, x2: x2 + rotatedOffset.x, y2: y2 + rotatedOffset.y, // symbol anchor point stays the same regardless of text-anchor anchorPointX: anchorPointX, anchorPointY: anchorPointY }; } var Placement = function Placement(transform , fadeDuration , crossSourceCollisions , prevPlacement ) { this.transform = transform.clone(); this.collisionIndex = new CollisionIndex(this.transform); this.placements = {}; this.opacities = {}; this.variableOffsets = {}; this.stale = false; this.commitTime = 0; this.fadeDuration = fadeDuration; this.retainedQueryData = {}; this.collisionGroups = new CollisionGroups(crossSourceCollisions); this.prevPlacement = prevPlacement; if (prevPlacement) { prevPlacement.prevPlacement = undefined; // Only hold on to one placement back } }; Placement.prototype.placeLayerTile = function placeLayerTile (styleLayer , tile , showCollisionBoxes , seenCrossTileIDs ) { var symbolBucket = ((tile.getBucket(styleLayer) ) ); var bucketFeatureIndex = tile.latestFeatureIndex; if (!symbolBucket || !bucketFeatureIndex || styleLayer.id !== symbolBucket.layerIds[0]) { return; } var collisionBoxArray = tile.collisionBoxArray; var layout = symbolBucket.layers[0].layout; var scale = Math.pow(2, this.transform.zoom - tile.tileID.overscaledZ); var textPixelRatio = tile.tileSize / __chunk_1.EXTENT; var posMatrix = this.transform.calculatePosMatrix(tile.tileID.toUnwrapped()); var textLabelPlaneMatrix = getLabelPlaneMatrix(posMatrix, layout.get('text-pitch-alignment') === 'map', layout.get('text-rotation-alignment') === 'map', this.transform, pixelsToTileUnits(tile, 1, this.transform.zoom)); var iconLabelPlaneMatrix = getLabelPlaneMatrix(posMatrix, layout.get('icon-pitch-alignment') === 'map', layout.get('icon-rotation-alignment') === 'map', this.transform, pixelsToTileUnits(tile, 1, this.transform.zoom)); // As long as this placement lives, we have to hold onto this bucket's // matching FeatureIndex/data for querying purposes this.retainedQueryData[symbolBucket.bucketInstanceId] = new RetainedQueryData( symbolBucket.bucketInstanceId, bucketFeatureIndex, symbolBucket.sourceLayerIndex, symbolBucket.index, tile.tileID ); this.placeLayerBucket(symbolBucket, posMatrix, textLabelPlaneMatrix, iconLabelPlaneMatrix, scale, textPixelRatio, showCollisionBoxes, tile.holdingForFade(), seenCrossTileIDs, collisionBoxArray); }; Placement.prototype.attemptAnchorPlacement = function attemptAnchorPlacement (anchor , textBox , width , height , radialTextOffset , textBoxScale , rotateWithMap , pitchWithMap , textPixelRatio , posMatrix , collisionGroup , textAllowOverlap , symbolInstance , bucket ) { var shift = calculateVariableLayoutOffset(anchor, width, height, radialTextOffset, textBoxScale); var placedGlyphBoxes = this.collisionIndex.placeCollisionBox( shiftVariableCollisionBox( textBox, shift.x, shift.y, rotateWithMap, pitchWithMap, this.transform.angle), textAllowOverlap, textPixelRatio, posMatrix, collisionGroup.predicate); if (placedGlyphBoxes.box.length > 0) { var prevAnchor; // If this label was placed in the previous placement, record the anchor position // to allow us to animate the transition if (this.prevPlacement && this.prevPlacement.variableOffsets[symbolInstance.crossTileID] && this.prevPlacement.placements[symbolInstance.crossTileID] && this.prevPlacement.placements[symbolInstance.crossTileID].text) { prevAnchor = this.prevPlacement.variableOffsets[symbolInstance.crossTileID].anchor; } __chunk_1.assert(symbolInstance.crossTileID !== 0); this.variableOffsets[symbolInstance.crossTileID] = { radialOffset: radialTextOffset, width: width, height: height, anchor: anchor, textBoxScale: textBoxScale, prevAnchor: prevAnchor }; this.markUsedJustification(bucket, anchor, symbolInstance); return placedGlyphBoxes; } }; Placement.prototype.placeLayerBucket = function placeLayerBucket (bucket , posMatrix , textLabelPlaneMatrix , iconLabelPlaneMatrix , scale , textPixelRatio , showCollisionBoxes , holdingForFade , seenCrossTileIDs , collisionBoxArray ) { var layout = bucket.layers[0].layout; var partiallyEvaluatedTextSize = __chunk_1.evaluateSizeForZoom(bucket.textSizeData, this.transform.zoom, __chunk_1.properties.layout.properties['text-size']); var textOptional = layout.get('text-optional'); var iconOptional = layout.get('icon-optional'); var textAllowOverlap = layout.get('text-allow-overlap'); var iconAllowOverlap = layout.get('icon-allow-overlap'); // This logic is similar to the "defaultOpacityState" logic below in updateBucketOpacities // If we know a symbol is always supposed to show, force it to be marked visible even if // it wasn't placed into the collision index (because some or all of it was outside the range // of the collision grid). // There is a subtle edge case here we're accepting: //Symbol A has text-allow-overlap: true, icon-allow-overlap: true, icon-optional: false //A's icon is outside the grid, so doesn't get placed //A's text would be inside grid, but doesn't get placed because of icon-optional: false //We still show A because of the allow-overlap settings. //Symbol B has allow-overlap: false, and gets placed where A's text would be //On panning in, there is a short period when Symbol B and Symbol A will overlap //This is the reverse of our normal policy of "fade in on pan", but should look like any other //collision and hopefully not be too noticeable. // See https://github.com/mapbox/mapbox-gl-js/issues/7172 var alwaysShowText = textAllowOverlap && (iconAllowOverlap || !bucket.hasIconData() || iconOptional); var alwaysShowIcon = iconAllowOverlap && (textAllowOverlap || !bucket.hasTextData() || textOptional); var collisionGroup = this.collisionGroups.get(bucket.sourceID); var rotateWithMap = layout.get('text-rotation-alignment') === 'map'; var pitchWithMap = layout.get('text-pitch-alignment') === 'map'; if (!bucket.collisionArrays && collisionBoxArray) { bucket.deserializeCollisionBoxes(collisionBoxArray); } for (var i = 0; i < bucket.symbolInstances.length; i++) { var symbolInstance = bucket.symbolInstances.get(i); if (!seenCrossTileIDs[symbolInstance.crossTileID]) { if (holdingForFade) { // Mark all symbols from this tile as "not placed", but don't add to seenCrossTileIDs, because we don't // know yet if we have a duplicate in a parent tile that _should_ be placed. this.placements[symbolInstance.crossTileID] = new JointPlacement(false, false, false); continue; } var placeText = false; var placeIcon = false; var offscreen = true; var placedGlyphBoxes = null; var placedGlyphCircles = null; var placedIconBoxes = null; var textFeatureIndex = 0; var iconFeatureIndex = 0; var collisionArrays = bucket.collisionArrays[i]; if (collisionArrays.textFeatureIndex) { textFeatureIndex = collisionArrays.textFeatureIndex; } var textBox = collisionArrays.textBox; if (textBox) { if (!layout.get('text-variable-anchor')) { placedGlyphBoxes = this.collisionIndex.placeCollisionBox(textBox, layout.get('text-allow-overlap'), textPixelRatio, posMatrix, collisionGroup.predicate); placeText = placedGlyphBoxes.box.length > 0; } else { var width = textBox.x2 - textBox.x1; var height = textBox.y2 - textBox.y1; var textBoxScale = symbolInstance.textBoxScale; var anchors = layout.get('text-variable-anchor'); // If we this symbol was in the last placement, shift the previously used // anchor to the front of the anchor list. if (this.prevPlacement && this.prevPlacement.variableOffsets[symbolInstance.crossTileID]) { var prevOffsets = this.prevPlacement.variableOffsets[symbolInstance.crossTileID]; if (anchors[0] !== prevOffsets.anchor) { anchors = anchors.filter(function (anchor) { return anchor !== prevOffsets.anchor; }); anchors.unshift(prevOffsets.anchor); } } for (var i$1 = 0, list = anchors; i$1 < list.length; i$1 += 1) { var anchor = list[i$1]; placedGlyphBoxes = this.attemptAnchorPlacement( anchor, textBox, width, height, symbolInstance.radialTextOffset, textBoxScale, rotateWithMap, pitchWithMap, textPixelRatio, posMatrix, collisionGroup, textAllowOverlap, symbolInstance, bucket); if (placedGlyphBoxes) { placeText = true; break; } } // If we didn't get placed, we still need to copy our position from the last placement for // fade animations if (!this.variableOffsets[symbolInstance.crossTileID] && this.prevPlacement) { var prevOffset = this.prevPlacement.variableOffsets[symbolInstance.crossTileID]; if (prevOffset) { this.variableOffsets[symbolInstance.crossTileID] = prevOffset; this.markUsedJustification(bucket, prevOffset.anchor, symbolInstance); } } } } offscreen = placedGlyphBoxes && placedGlyphBoxes.offscreen; var textCircles = collisionArrays.textCircles; if (textCircles) { var placedSymbol = bucket.text.placedSymbolArray.get(symbolInstance.centerJustifiedTextSymbolIndex); var fontSize = __chunk_1.evaluateSizeForFeature(bucket.textSizeData, partiallyEvaluatedTextSize, placedSymbol); placedGlyphCircles = this.collisionIndex.placeCollisionCircles(textCircles, layout.get('text-allow-overlap'), scale, textPixelRatio, placedSymbol, bucket.lineVertexArray, bucket.glyphOffsetArray, fontSize, posMatrix, textLabelPlaneMatrix, showCollisionBoxes, pitchWithMap, collisionGroup.predicate); // If text-allow-overlap is set, force "placedCircles" to true // In theory there should always be at least one circle placed // in this case, but for now quirks in text-anchor // and text-offset may prevent that from being true. placeText = layout.get('text-allow-overlap') || placedGlyphCircles.circles.length > 0; offscreen = offscreen && placedGlyphCircles.offscreen; } if (collisionArrays.iconFeatureIndex) { iconFeatureIndex = collisionArrays.iconFeatureIndex; } if (collisionArrays.iconBox) { placedIconBoxes = this.collisionIndex.placeCollisionBox(collisionArrays.iconBox, layout.get('icon-allow-overlap'), textPixelRatio, posMatrix, collisionGroup.predicate); placeIcon = placedIconBoxes.box.length > 0; offscreen = offscreen && placedIconBoxes.offscreen; } var iconWithoutText = textOptional || (symbolInstance.numHorizontalGlyphVertices === 0 && symbolInstance.numVerticalGlyphVertices === 0); var textWithoutIcon = iconOptional || symbolInstance.numIconVertices === 0; // Combine the scales for icons and text. if (!iconWithoutText && !textWithoutIcon) { placeIcon = placeText = placeIcon && placeText; } else if (!textWithoutIcon) { placeText = placeIcon && placeText; } else if (!iconWithoutText) { placeIcon = placeIcon && placeText; } if (placeText && placedGlyphBoxes) { this.collisionIndex.insertCollisionBox(placedGlyphBoxes.box, layout.get('text-ignore-placement'), bucket.bucketInstanceId, textFeatureIndex, collisionGroup.ID); } if (placeIcon && placedIconBoxes) { this.collisionIndex.insertCollisionBox(placedIconBoxes.box, layout.get('icon-ignore-placement'), bucket.bucketInstanceId, iconFeatureIndex, collisionGroup.ID); } if (placeText && placedGlyphCircles) { this.collisionIndex.insertCollisionCircles(placedGlyphCircles.circles, layout.get('text-ignore-placement'), bucket.bucketInstanceId, textFeatureIndex, collisionGroup.ID); } __chunk_1.assert(symbolInstance.crossTileID !== 0); __chunk_1.assert(bucket.bucketInstanceId !== 0); this.placements[symbolInstance.crossTileID] = new JointPlacement(placeText || alwaysShowText, placeIcon || alwaysShowIcon, offscreen || bucket.justReloaded); seenCrossTileIDs[symbolInstance.crossTileID] = true; } } bucket.justReloaded = false; }; Placement.prototype.markUsedJustification = function markUsedJustification (bucket , placedAnchor , symbolInstance ) { var justifications = { "left": symbolInstance.leftJustifiedTextSymbolIndex, "center": symbolInstance.centerJustifiedTextSymbolIndex, "right": symbolInstance.rightJustifiedTextSymbolIndex }; var autoIndex = justifications[__chunk_1.getAnchorJustification(placedAnchor)]; for (var justification in justifications) { var index = justifications[justification]; if (index >= 0) { if (autoIndex >= 0 && index !== autoIndex) { // There are multiple justifications and this one isn't it: shift offscreen bucket.text.placedSymbolArray.get(index).crossTileID = 0; } else { // Either this is the chosen justification or the justification is hardwired: use this one bucket.text.placedSymbolArray.get(index).crossTileID = symbolInstance.crossTileID; } } } }; Placement.prototype.commit = function commit (now ) { this.commitTime = now; var prevPlacement = this.prevPlacement; var placementChanged = false; var increment = (prevPlacement && this.fadeDuration !== 0) ? (this.commitTime - prevPlacement.commitTime) / this.fadeDuration : 1; var prevOpacities = prevPlacement ? prevPlacement.opacities : {}; var prevOffsets = prevPlacement ? prevPlacement.variableOffsets : {}; // add the opacities from the current placement, and copy their current values from the previous placement for (var crossTileID in this.placements) { var jointPlacement = this.placements[crossTileID]; var prevOpacity = prevOpacities[crossTileID]; if (prevOpacity) { this.opacities[crossTileID] = new JointOpacityState(prevOpacity, increment, jointPlacement.text, jointPlacement.icon); placementChanged = placementChanged || jointPlacement.text !== prevOpacity.text.placed || jointPlacement.icon !== prevOpacity.icon.placed; } else { this.opacities[crossTileID] = new JointOpacityState(null, increment, jointPlacement.text, jointPlacement.icon, jointPlacement.skipFade); placementChanged = placementChanged || jointPlacement.text || jointPlacement.icon; } } // copy and update values from the previous placement that aren't in the current placement but haven't finished fading for (var crossTileID$1 in prevOpacities) { var prevOpacity$1 = prevOpacities[crossTileID$1]; if (!this.opacities[crossTileID$1]) { var jointOpacity = new JointOpacityState(prevOpacity$1, increment, false, false); if (!jointOpacity.isHidden()) { this.opacities[crossTileID$1] = jointOpacity; placementChanged = placementChanged || prevOpacity$1.text.placed || prevOpacity$1.icon.placed; } } } for (var crossTileID$2 in prevOffsets) { if (!this.variableOffsets[crossTileID$2] && this.opacities[crossTileID$2] && !this.opacities[crossTileID$2].isHidden()) { this.variableOffsets[crossTileID$2] = prevOffsets[crossTileID$2]; } } // this.lastPlacementChangeTime is the time of the last commit() that // resulted in a placement change -- in other words, the start time of // the last symbol fade animation __chunk_1.assert(!prevPlacement || prevPlacement.lastPlacementChangeTime !== undefined); if (placementChanged) { this.lastPlacementChangeTime = now; } else if (typeof this.lastPlacementChangeTime !== 'number') { this.lastPlacementChangeTime = prevPlacement ? prevPlacement.lastPlacementChangeTime : now; } }; Placement.prototype.updateLayerOpacities = function updateLayerOpacities (styleLayer , tiles ) { var seenCrossTileIDs = {}; for (var i = 0, list = tiles; i < list.length; i += 1) { var tile = list[i]; var symbolBucket = ((tile.getBucket(styleLayer) ) ); if (symbolBucket && tile.latestFeatureIndex && styleLayer.id === symbolBucket.layerIds[0]) { this.updateBucketOpacities(symbolBucket, seenCrossTileIDs, tile.collisionBoxArray); } } }; Placement.prototype.updateBucketOpacities = function updateBucketOpacities (bucket , seenCrossTileIDs , collisionBoxArray ) { if (bucket.hasTextData()) { bucket.text.opacityVertexArray.clear(); } if (bucket.hasIconData()) { bucket.icon.opacityVertexArray.clear(); } if (bucket.hasCollisionBoxData()) { bucket.collisionBox.collisionVertexArray.clear(); } if (bucket.hasCollisionCircleData()) { bucket.collisionCircle.collisionVertexArray.clear(); } var layout = bucket.layers[0].layout; var duplicateOpacityState = new JointOpacityState(null, 0, false, false, true); var textAllowOverlap = layout.get('text-allow-overlap'); var iconAllowOverlap = layout.get('icon-allow-overlap'); var variablePlacement = layout.get('text-variable-anchor'); var rotateWithMap = layout.get('text-rotation-alignment') === 'map'; var pitchWithMap = layout.get('text-pitch-alignment') === 'map'; // If allow-overlap is true, we can show symbols before placement runs on them // But we have to wait for placement if we potentially depend on a paired icon/text // with allow-overlap: false. // See https://github.com/mapbox/mapbox-gl-js/issues/7032 var defaultOpacityState = new JointOpacityState(null, 0, textAllowOverlap && (iconAllowOverlap || !bucket.hasIconData() || layout.get('icon-optional')), iconAllowOverlap && (textAllowOverlap || !bucket.hasTextData() || layout.get('text-optional')), true); if (!bucket.collisionArrays && collisionBoxArray && (bucket.hasCollisionBoxData() || bucket.hasCollisionCircleData())) { bucket.deserializeCollisionBoxes(collisionBoxArray); } for (var s = 0; s < bucket.symbolInstances.length; s++) { var symbolInstance = bucket.symbolInstances.get(s); var numHorizontalGlyphVertices = symbolInstance.numHorizontalGlyphVertices; var numVerticalGlyphVertices = symbolInstance.numVerticalGlyphVertices; var crossTileID = symbolInstance.crossTileID; var isDuplicate = seenCrossTileIDs[crossTileID]; var opacityState = this.opacities[crossTileID]; if (isDuplicate) { opacityState = duplicateOpacityState; } else if (!opacityState) { opacityState = defaultOpacityState; // store the state so that future placements use it as a starting point this.opacities[crossTileID] = opacityState; } seenCrossTileIDs[crossTileID] = true; var hasText = numHorizontalGlyphVertices > 0 || numVerticalGlyphVertices > 0; var hasIcon = symbolInstance.numIconVertices > 0; if (hasText) { var packedOpacity = packOpacity(opacityState.text); // Vertical text fades in/out on collision the same way as corresponding // horizontal text. Switch between vertical/horizontal should be instantaneous var opacityEntryCount = (numHorizontalGlyphVertices + numVerticalGlyphVertices) / 4; for (var i = 0; i < opacityEntryCount; i++) { bucket.text.opacityVertexArray.emplaceBack(packedOpacity); } // If this label is completely faded, mark it so that we don't have to calculate // its position at render time. If this layer has variable placement, shift the various // symbol instances appropriately so that symbols from buckets that have yet to be placed // offset appropriately. var hidden = opacityState.text.isHidden() ? 1 : 0; [ symbolInstance.rightJustifiedTextSymbolIndex, symbolInstance.centerJustifiedTextSymbolIndex, symbolInstance.leftJustifiedTextSymbolIndex, symbolInstance.verticalPlacedTextSymbolIndex ].forEach(function (index) { if (index >= 0) { bucket.text.placedSymbolArray.get(index).hidden = hidden; } }); var prevOffset = this.variableOffsets[symbolInstance.crossTileID]; if (prevOffset) { this.markUsedJustification(bucket, prevOffset.anchor, symbolInstance); } } if (hasIcon) { var packedOpacity$1 = packOpacity(opacityState.icon); for (var i$1 = 0; i$1 < symbolInstance.numIconVertices / 4; i$1++) { bucket.icon.opacityVertexArray.emplaceBack(packedOpacity$1); } bucket.icon.placedSymbolArray.get(s).hidden = (opacityState.icon.isHidden() ); } if (bucket.hasCollisionBoxData() || bucket.hasCollisionCircleData()) { var collisionArrays = bucket.collisionArrays[s]; if (collisionArrays) { if (collisionArrays.textBox) { var shift = new __chunk_1.Point(0, 0); var used = true; if (variablePlacement) { var variableOffset = this.variableOffsets[crossTileID]; if (variableOffset) { // This will show either the currently placed position or the last // successfully placed position (so you can visualize what collision // just made the symbol disappear, and the most likely place for the // symbol to come back) shift = calculateVariableLayoutOffset(variableOffset.anchor, variableOffset.width, variableOffset.height, variableOffset.radialOffset, variableOffset.textBoxScale); if (rotateWithMap) { shift._rotate(pitchWithMap ? this.transform.angle : -this.transform.angle); } } else { // No offset -> this symbol hasn't been placed since coming on-screen // No single box is particularly meaningful and all of them would be too noisy // Use the center box just to show something's there, but mark it "not used" used = false; } } updateCollisionVertices(bucket.collisionBox.collisionVertexArray, opacityState.text.placed, !used, shift.x, shift.y); } if (collisionArrays.iconBox) { updateCollisionVertices(bucket.collisionBox.collisionVertexArray, opacityState.icon.placed, false); } var textCircles = collisionArrays.textCircles; if (textCircles && bucket.hasCollisionCircleData()) { for (var k = 0; k < textCircles.length; k += 5) { var notUsed = isDuplicate || textCircles[k + 4] === 0; updateCollisionVertices(bucket.collisionCircle.collisionVertexArray, opacityState.text.placed, notUsed); } } } } } bucket.sortFeatures(this.transform.angle); if (this.retainedQueryData[bucket.bucketInstanceId]) { this.retainedQueryData[bucket.bucketInstanceId].featureSortOrder = bucket.featureSortOrder; } if (bucket.hasTextData() && bucket.text.opacityVertexBuffer) { bucket.text.opacityVertexBuffer.updateData(bucket.text.opacityVertexArray); } if (bucket.hasIconData() && bucket.icon.opacityVertexBuffer) { bucket.icon.opacityVertexBuffer.updateData(bucket.icon.opacityVertexArray); } if (bucket.hasCollisionBoxData() && bucket.collisionBox.collisionVertexBuffer) { bucket.collisionBox.collisionVertexBuffer.updateData(bucket.collisionBox.collisionVertexArray); } if (bucket.hasCollisionCircleData() && bucket.collisionCircle.collisionVertexBuffer) { bucket.collisionCircle.collisionVertexBuffer.updateData(bucket.collisionCircle.collisionVertexArray); } __chunk_1.assert(bucket.text.opacityVertexArray.length === bucket.text.layoutVertexArray.length / 4); __chunk_1.assert(bucket.icon.opacityVertexArray.length === bucket.icon.layoutVertexArray.length / 4); }; Placement.prototype.symbolFadeChange = function symbolFadeChange (now ) { return this.fadeDuration === 0 ? 1 : (now - this.commitTime) / this.fadeDuration; }; Placement.prototype.hasTransitions = function hasTransitions (now ) { return this.stale || now - this.lastPlacementChangeTime < this.fadeDuration; }; Placement.prototype.stillRecent = function stillRecent (now ) { return this.commitTime + this.fadeDuration > now; }; Placement.prototype.setStale = function setStale () { this.stale = true; }; function updateCollisionVertices(collisionVertexArray , placed , notUsed , shiftX , shiftY ) { collisionVertexArray.emplaceBack(placed ? 1 : 0, notUsed ? 1 : 0, shiftX || 0, shiftY || 0); collisionVertexArray.emplaceBack(placed ? 1 : 0, notUsed ? 1 : 0, shiftX || 0, shiftY || 0); collisionVertexArray.emplaceBack(placed ? 1 : 0, notUsed ? 1 : 0, shiftX || 0, shiftY || 0); collisionVertexArray.emplaceBack(placed ? 1 : 0, notUsed ? 1 : 0, shiftX || 0, shiftY || 0); } // All four vertices for a glyph will have the same opacity state // So we pack the opacity into a uint8, and then repeat it four times // to make a single uint32 that we can upload for each glyph in the // label. var shift25 = Math.pow(2, 25); var shift24 = Math.pow(2, 24); var shift17 = Math.pow(2, 17); var shift16 = Math.pow(2, 16); var shift9 = Math.pow(2, 9); var shift8 = Math.pow(2, 8); var shift1 = Math.pow(2, 1); function packOpacity(opacityState ) { if (opacityState.opacity === 0 && !opacityState.placed) { return 0; } else if (opacityState.opacity === 1 && opacityState.placed) { return 4294967295; } var targetBit = opacityState.placed ? 1 : 0; var opacityBits = Math.floor(opacityState.opacity * 127); return opacityBits * shift25 + targetBit * shift24 + opacityBits * shift17 + targetBit * shift16 + opacityBits * shift9 + targetBit * shift8 + opacityBits * shift1 + targetBit; } // var LayerPlacement = function LayerPlacement() { this._currentTileIndex = 0; this._seenCrossTileIDs = {}; }; LayerPlacement.prototype.continuePlacement = function continuePlacement (tiles , placement , showCollisionBoxes , styleLayer , shouldPausePlacement) { while (this._currentTileIndex < tiles.length) { var tile = tiles[this._currentTileIndex]; placement.placeLayerTile(styleLayer, tile, showCollisionBoxes, this._seenCrossTileIDs); this._currentTileIndex++; if (shouldPausePlacement()) { return true; } } }; var PauseablePlacement = function PauseablePlacement(transform , order , forceFullPlacement , showCollisionBoxes , fadeDuration , crossSourceCollisions , prevPlacement ) { this.placement = new Placement(transform, fadeDuration, crossSourceCollisions, prevPlacement); this._currentPlacementIndex = order.length - 1; this._forceFullPlacement = forceFullPlacement; this._showCollisionBoxes = showCollisionBoxes; this._done = false; }; PauseablePlacement.prototype.isDone = function isDone () { return this._done; }; PauseablePlacement.prototype.continuePlacement = function continuePlacement (order , layers , layerTiles ) { var this$1 = this; var startTime = __chunk_1.browser.now(); var shouldPausePlacement = function () { var elapsedTime = __chunk_1.browser.now() - startTime; return this$1._forceFullPlacement ? false : elapsedTime > 2; }; while (this._currentPlacementIndex >= 0) { var layerId = order[this._currentPlacementIndex]; var layer = layers[layerId]; var placementZoom = this.placement.collisionIndex.transform.zoom; if (layer.type === 'symbol' && (!layer.minzoom || layer.minzoom <= placementZoom) && (!layer.maxzoom || layer.maxzoom > placementZoom)) { if (!this._inProgressLayer) { this._inProgressLayer = new LayerPlacement(); } var pausePlacement = this._inProgressLayer.continuePlacement(layerTiles[layer.source], this.placement, this._showCollisionBoxes, layer, shouldPausePlacement); if (pausePlacement) { // We didn't finish placing all layers within 2ms, // but we can keep rendering with a partial placement // We'll resume here on the next frame return; } delete this._inProgressLayer; } this._currentPlacementIndex--; } this._done = true; }; PauseablePlacement.prototype.commit = function commit (now ) { this.placement.commit(now); return this.placement; }; // /* The CrossTileSymbolIndex generally works on the assumption that a conceptual "unique symbol" can be identified by the text of the label combined with the anchor point. The goal is to assign these conceptual "unique symbols" a shared crossTileID that can be used by Placement to keep fading opacity states consistent and to deduplicate labels. The CrossTileSymbolIndex indexes all the current symbol instances and their crossTileIDs. When a symbol bucket gets added or updated, the index assigns a crossTileID to each of it's symbol instances by either matching it with an existing id or assigning a new one. */ // Round anchor positions to roughly 4 pixel grid var roundingFactor = 512 / __chunk_1.EXTENT / 2; var TileLayerIndex = function TileLayerIndex(tileID , symbolInstances , bucketInstanceId ) { this.tileID = tileID; this.indexedSymbolInstances = {}; this.bucketInstanceId = bucketInstanceId; for (var i = 0; i < symbolInstances.length; i++) { var symbolInstance = symbolInstances.get(i); var key = symbolInstance.key; if (!this.indexedSymbolInstances[key]) { this.indexedSymbolInstances[key] = []; } // This tile may have multiple symbol instances with the same key // Store each one along with its coordinates this.indexedSymbolInstances[key].push({ crossTileID: symbolInstance.crossTileID, coord: this.getScaledCoordinates(symbolInstance, tileID) }); } }; // Converts the coordinates of the input symbol instance into coordinates that be can compared // against other symbols in this index. Coordinates are: // (1) world-based (so after conversion the source tile is irrelevant) // (2) converted to the z-scale of this TileLayerIndex // (3) down-sampled by "roundingFactor" from tile coordinate precision in order to be // more tolerant of small differences between tiles. TileLayerIndex.prototype.getScaledCoordinates = function getScaledCoordinates (symbolInstance , childTileID ) { var zDifference = childTileID.canonical.z - this.tileID.canonical.z; var scale = roundingFactor / Math.pow(2, zDifference); return { x: Math.floor((childTileID.canonical.x * __chunk_1.EXTENT + symbolInstance.anchorX) * scale), y: Math.floor((childTileID.canonical.y * __chunk_1.EXTENT + symbolInstance.anchorY) * scale) }; }; TileLayerIndex.prototype.findMatches = function findMatches (symbolInstances , newTileID , zoomCrossTileIDs ) { var tolerance = this.tileID.canonical.z < newTileID.canonical.z ? 1 : Math.pow(2, this.tileID.canonical.z - newTileID.canonical.z); for (var i = 0; i < symbolInstances.length; i++) { var symbolInstance = symbolInstances.get(i); if (symbolInstance.crossTileID) { // already has a match, skip continue; } var indexedInstances = this.indexedSymbolInstances[symbolInstance.key]; if (!indexedInstances) { // No symbol with this key in this bucket continue; } var scaledSymbolCoord = this.getScaledCoordinates(symbolInstance, newTileID); for (var i$1 = 0, list = indexedInstances; i$1 < list.length; i$1 += 1) { // Return any symbol with the same keys whose coordinates are within 1 // grid unit. (with a 4px grid, this covers a 12px by 12px area) var thisTileSymbol = list[i$1]; if (Math.abs(thisTileSymbol.coord.x - scaledSymbolCoord.x) <= tolerance && Math.abs(thisTileSymbol.coord.y - scaledSymbolCoord.y) <= tolerance && !zoomCrossTileIDs[thisTileSymbol.crossTileID]) { // Once we've marked ourselves duplicate against this parent symbol, // don't let any other symbols at the same zoom level duplicate against // the same parent (see issue #5993) zoomCrossTileIDs[thisTileSymbol.crossTileID] = true; symbolInstance.crossTileID = thisTileSymbol.crossTileID; break; } } } }; var CrossTileIDs = function CrossTileIDs() { this.maxCrossTileID = 0; }; CrossTileIDs.prototype.generate = function generate () { return ++this.maxCrossTileID; }; var CrossTileSymbolLayerIndex = function CrossTileSymbolLayerIndex() { this.indexes = {}; this.usedCrossTileIDs = {}; this.lng = 0; }; /* * Sometimes when a user pans across the antimeridian the longitude value gets wrapped. * To prevent labels from flashing out and in we adjust the tileID values in the indexes * so that they match the new wrapped version of the map. */ CrossTileSymbolLayerIndex.prototype.handleWrapJump = function handleWrapJump (lng ) { var wrapDelta = Math.round((lng - this.lng) / 360); if (wrapDelta !== 0) { for (var zoom in this.indexes) { var zoomIndexes = this.indexes[zoom]; var newZoomIndex = {}; for (var key in zoomIndexes) { // change the tileID's wrap and add it to a new index var index = zoomIndexes[key]; index.tileID = index.tileID.unwrapTo(index.tileID.wrap + wrapDelta); newZoomIndex[index.tileID.key] = index; } this.indexes[zoom] = newZoomIndex; } } this.lng = lng; }; CrossTileSymbolLayerIndex.prototype.addBucket = function addBucket (tileID , bucket , crossTileIDs ) { if (this.indexes[tileID.overscaledZ] && this.indexes[tileID.overscaledZ][tileID.key]) { if (this.indexes[tileID.overscaledZ][tileID.key].bucketInstanceId === bucket.bucketInstanceId) { return false; } else { // We're replacing this bucket with an updated version // Remove the old bucket's "used crossTileIDs" now so that // the new bucket can claim them. // The old index entries themselves stick around until // 'removeStaleBuckets' is called. this.removeBucketCrossTileIDs(tileID.overscaledZ, this.indexes[tileID.overscaledZ][tileID.key]); } } for (var i = 0; i < bucket.symbolInstances.length; i++) { var symbolInstance = bucket.symbolInstances.get(i); symbolInstance.crossTileID = 0; } if (!this.usedCrossTileIDs[tileID.overscaledZ]) { this.usedCrossTileIDs[tileID.overscaledZ] = {}; } var zoomCrossTileIDs = this.usedCrossTileIDs[tileID.overscaledZ]; for (var zoom in this.indexes) { var zoomIndexes = this.indexes[zoom]; if (Number(zoom) > tileID.overscaledZ) { for (var id in zoomIndexes) { var childIndex = zoomIndexes[id]; if (childIndex.tileID.isChildOf(tileID)) { childIndex.findMatches(bucket.symbolInstances, tileID, zoomCrossTileIDs); } } } else { var parentCoord = tileID.scaledTo(Number(zoom)); var parentIndex = zoomIndexes[parentCoord.key]; if (parentIndex) { parentIndex.findMatches(bucket.symbolInstances, tileID, zoomCrossTileIDs); } } } for (var i$1 = 0; i$1 < bucket.symbolInstances.length; i$1++) { var symbolInstance$1 = bucket.symbolInstances.get(i$1); if (!symbolInstance$1.crossTileID) { // symbol did not match any known symbol, assign a new id symbolInstance$1.crossTileID = crossTileIDs.generate(); zoomCrossTileIDs[symbolInstance$1.crossTileID] = true; } } if (this.indexes[tileID.overscaledZ] === undefined) { this.indexes[tileID.overscaledZ] = {}; } this.indexes[tileID.overscaledZ][tileID.key] = new TileLayerIndex(tileID, bucket.symbolInstances, bucket.bucketInstanceId); return true; }; CrossTileSymbolLayerIndex.prototype.removeBucketCrossTileIDs = function removeBucketCrossTileIDs (zoom , removedBucket ) { for (var key in removedBucket.indexedSymbolInstances) { for (var i = 0, list = removedBucket.indexedSymbolInstances[(key )]; i < list.length; i += 1) { var symbolInstance = list[i]; delete this.usedCrossTileIDs[zoom][symbolInstance.crossTileID]; } } }; CrossTileSymbolLayerIndex.prototype.removeStaleBuckets = function removeStaleBuckets (currentIDs ) { var tilesChanged = false; for (var z in this.indexes) { var zoomIndexes = this.indexes[z]; for (var tileKey in zoomIndexes) { if (!currentIDs[zoomIndexes[tileKey].bucketInstanceId]) { this.removeBucketCrossTileIDs(z, zoomIndexes[tileKey]); delete zoomIndexes[tileKey]; tilesChanged = true; } } } return tilesChanged; }; var CrossTileSymbolIndex = function CrossTileSymbolIndex() { this.layerIndexes = {}; this.crossTileIDs = new CrossTileIDs(); this.maxBucketInstanceId = 0; this.bucketsInCurrentPlacement = {}; }; CrossTileSymbolIndex.prototype.addLayer = function addLayer (styleLayer , tiles , lng ) { var layerIndex = this.layerIndexes[styleLayer.id]; if (layerIndex === undefined) { layerIndex = this.layerIndexes[styleLayer.id] = new CrossTileSymbolLayerIndex(); } var symbolBucketsChanged = false; var currentBucketIDs = {}; layerIndex.handleWrapJump(lng); for (var i = 0, list = tiles; i < list.length; i += 1) { var tile = list[i]; var symbolBucket = ((tile.getBucket(styleLayer) ) ); if (!symbolBucket || styleLayer.id !== symbolBucket.layerIds[0]) { continue; } if (!symbolBucket.bucketInstanceId) { symbolBucket.bucketInstanceId = ++this.maxBucketInstanceId; } if (layerIndex.addBucket(tile.tileID, symbolBucket, this.crossTileIDs)) { symbolBucketsChanged = true; } currentBucketIDs[symbolBucket.bucketInstanceId] = true; } if (layerIndex.removeStaleBuckets(currentBucketIDs)) { symbolBucketsChanged = true; } return symbolBucketsChanged; }; CrossTileSymbolIndex.prototype.pruneUnusedLayers = function pruneUnusedLayers (usedLayers ) { var usedLayerMap = {}; usedLayers.forEach(function (usedLayer) { usedLayerMap[usedLayer] = true; }); for (var layerId in this.layerIndexes) { if (!usedLayerMap[layerId]) { delete this.layerIndexes[layerId]; } } }; // // We're skipping validation errors with the `source.canvas` identifier in order // to continue to allow canvas sources to be added at runtime/updated in // smart setStyle (see https://github.com/mapbox/mapbox-gl-js/pull/6424): var emitValidationErrors = function (evented , errors ) { return __chunk_1.emitValidationErrors(evented, errors && errors.filter(function (error) { return error.identifier !== 'source.canvas'; })); }; var supportedDiffOperations = __chunk_1.pick(operations, [ 'addLayer', 'removeLayer', 'setPaintProperty', 'setLayoutProperty', 'setFilter', 'addSource', 'removeSource', 'setLayerZoomRange', 'setLight', 'setTransition', 'setGeoJSONSourceData' ]); var ignoredDiffOperations = __chunk_1.pick(operations, [ 'setCenter', 'setZoom', 'setBearing', 'setPitch' ]); /** * @private */ var Style = /*@__PURE__*/(function (Evented) { function Style(map , options) { var this$1 = this; if ( options === void 0 ) options = {}; Evented.call(this); this.map = map; this.dispatcher = new Dispatcher(getGlobalWorkerPool(), this); this.imageManager = new ImageManager(); this.imageManager.setEventedParent(this); this.glyphManager = new GlyphManager(map._requestManager, options.localIdeographFontFamily); this.lineAtlas = new LineAtlas(256, 512); this.crossTileSymbolIndex = new CrossTileSymbolIndex(); this._layers = {}; this._order = []; this.sourceCaches = {}; this.zoomHistory = new __chunk_1.ZoomHistory(); this._loaded = false; this._resetUpdates(); this.dispatcher.broadcast('setReferrer', __chunk_1.getReferrer()); var self = this; this._rtlTextPluginCallback = Style.registerForPluginAvailability(function (args) { self.dispatcher.broadcast('loadRTLTextPlugin', args.pluginURL, args.completionCallback); for (var id in self.sourceCaches) { self.sourceCaches[id].reload(); // Should be a no-op if the plugin loads before any tiles load } }); this.on('data', function (event) { if (event.dataType !== 'source' || event.sourceDataType !== 'metadata') { return; } var sourceCache = this$1.sourceCaches[event.sourceId]; if (!sourceCache) { return; } var source = sourceCache.getSource(); if (!source || !source.vectorLayerIds) { return; } for (var layerId in this$1._layers) { var layer = this$1._layers[layerId]; if (layer.source === source.id) { this$1._validateLayer(layer); } } }); } if ( Evented ) Style.__proto__ = Evented; Style.prototype = Object.create( Evented && Evented.prototype ); Style.prototype.constructor = Style; Style.prototype.loadURL = function loadURL (url , options) { var this$1 = this; if ( options === void 0 ) options = {}; this.fire(new __chunk_1.Event('dataloading', {dataType: 'style'})); var validate = typeof options.validate === 'boolean' ? options.validate : !__chunk_1.isMapboxURL(url); url = this.map._requestManager.normalizeStyleURL(url, options.accessToken); var request = this.map._requestManager.transformRequest(url, __chunk_1.ResourceType.Style); this._request = __chunk_1.getJSON(request, function (error , json ) { this$1._request = null; if (error) { this$1.fire(new __chunk_1.ErrorEvent(error)); } else if (json) { this$1._load(json, validate); } }); }; Style.prototype.loadJSON = function loadJSON (json , options) { var this$1 = this; if ( options === void 0 ) options = {}; this.fire(new __chunk_1.Event('dataloading', {dataType: 'style'})); this._request = __chunk_1.browser.frame(function () { this$1._request = null; this$1._load(json, options.validate !== false); }); }; Style.prototype._load = function _load (json , validate ) { var this$1 = this; if (validate && emitValidationErrors(this, __chunk_1.validateStyle(json))) { return; } this._loaded = true; this.stylesheet = json; for (var id in json.sources) { this.addSource(id, json.sources[id], {validate: false}); } if (json.sprite) { this._spriteRequest = loadSprite(json.sprite, this.map._requestManager, function (err, images) { this$1._spriteRequest = null; if (err) { this$1.fire(new __chunk_1.ErrorEvent(err)); } else if (images) { for (var id in images) { this$1.imageManager.addImage(id, images[id]); } } this$1.imageManager.setLoaded(true); this$1.fire(new __chunk_1.Event('data', {dataType: 'style'})); }); } else { this.imageManager.setLoaded(true); } this.glyphManager.setURL(json.glyphs); var layers = derefLayers(this.stylesheet.layers); this._order = layers.map(function (layer) { return layer.id; }); this._layers = {}; for (var i = 0, list = layers; i < list.length; i += 1) { var layer = list[i]; layer = __chunk_1.createStyleLayer(layer); layer.setEventedParent(this, {layer: {id: layer.id}}); this._layers[layer.id] = layer; } this.dispatcher.broadcast('setLayers', this._serializeLayers(this._order)); this.light = new Light(this.stylesheet.light); this.fire(new __chunk_1.Event('data', {dataType: 'style'})); this.fire(new __chunk_1.Event('style.load')); }; Style.prototype._validateLayer = function _validateLayer (layer ) { var sourceCache = this.sourceCaches[layer.source]; if (!sourceCache) { return; } var sourceLayer = layer.sourceLayer; if (!sourceLayer) { return; } var source = sourceCache.getSource(); if (source.type === 'geojson' || (source.vectorLayerIds && source.vectorLayerIds.indexOf(sourceLayer) === -1)) { this.fire(new __chunk_1.ErrorEvent(new Error( "Source layer \"" + sourceLayer + "\" " + "does not exist on source \"" + (source.id) + "\" " + "as specified by style layer \"" + (layer.id) + "\"" ))); } }; Style.prototype.loaded = function loaded () { if (!this._loaded) { return false; } if (Object.keys(this._updatedSources).length) { return false; } for (var id in this.sourceCaches) { if (!this.sourceCaches[id].loaded()) { return false; } } if (!this.imageManager.isLoaded()) { return false; } return true; }; Style.prototype._serializeLayers = function _serializeLayers (ids ) { var serializedLayers = []; for (var i = 0, list = ids; i < list.length; i += 1) { var id = list[i]; var layer = this._layers[id]; if (layer.type !== 'custom') { serializedLayers.push(layer.serialize()); } } return serializedLayers; }; Style.prototype.hasTransitions = function hasTransitions () { if (this.light && this.light.hasTransition()) { return true; } for (var id in this.sourceCaches) { if (this.sourceCaches[id].hasTransition()) { return true; } } for (var id$1 in this._layers) { if (this._layers[id$1].hasTransition()) { return true; } } return false; }; Style.prototype._checkLoaded = function _checkLoaded () { if (!this._loaded) { throw new Error('Style is not done loading'); } }; /** * Apply queued style updates in a batch and recalculate zoom-dependent paint properties. */ Style.prototype.update = function update (parameters ) { if (!this._loaded) { return; } var changed = this._changed; if (this._changed) { var updatedIds = Object.keys(this._updatedLayers); var removedIds = Object.keys(this._removedLayers); if (updatedIds.length || removedIds.length) { this._updateWorkerLayers(updatedIds, removedIds); } for (var id in this._updatedSources) { var action = this._updatedSources[id]; __chunk_1.assert(action === 'reload' || action === 'clear'); if (action === 'reload') { this._reloadSource(id); } else if (action === 'clear') { this._clearSource(id); } } for (var id$1 in this._updatedPaintProps) { this._layers[id$1].updateTransitions(parameters); } this.light.updateTransitions(parameters); this._resetUpdates(); } for (var sourceId in this.sourceCaches) { this.sourceCaches[sourceId].used = false; } for (var i = 0, list = this._order; i < list.length; i += 1) { var layerId = list[i]; var layer = this._layers[layerId]; layer.recalculate(parameters); if (!layer.isHidden(parameters.zoom) && layer.source) { this.sourceCaches[layer.source].used = true; } } this.light.recalculate(parameters); this.z = parameters.zoom; if (changed) { this.fire(new __chunk_1.Event('data', {dataType: 'style'})); } }; Style.prototype._updateWorkerLayers = function _updateWorkerLayers (updatedIds , removedIds ) { this.dispatcher.broadcast('updateLayers', { layers: this._serializeLayers(updatedIds), removedIds: removedIds }); }; Style.prototype._resetUpdates = function _resetUpdates () { this._changed = false; this._updatedLayers = {}; this._removedLayers = {}; this._updatedSources = {}; this._updatedPaintProps = {}; }; /** * Update this style's state to match the given style JSON, performing only * the necessary mutations. * * May throw an Error ('Unimplemented: METHOD') if the mapbox-gl-style-spec * diff algorithm produces an operation that is not supported. * * @returns {boolean} true if any changes were made; false otherwise * @private */ Style.prototype.setState = function setState (nextState ) { var this$1 = this; this._checkLoaded(); if (emitValidationErrors(this, __chunk_1.validateStyle(nextState))) { return false; } nextState = __chunk_1.clone$1(nextState); nextState.layers = derefLayers(nextState.layers); var changes = diffStyles(this.serialize(), nextState) .filter(function (op) { return !(op.command in ignoredDiffOperations); }); if (changes.length === 0) { return false; } var unimplementedOps = changes.filter(function (op) { return !(op.command in supportedDiffOperations); }); if (unimplementedOps.length > 0) { throw new Error(("Unimplemented: " + (unimplementedOps.map(function (op) { return op.command; }).join(', ')) + ".")); } changes.forEach(function (op) { if (op.command === 'setTransition') { // `transition` is always read directly off of // `this.stylesheet`, which we update below return; } (this$1 )[op.command].apply(this$1, op.args); }); this.stylesheet = nextState; return true; }; Style.prototype.addImage = function addImage (id , image ) { if (this.getImage(id)) { return this.fire(new __chunk_1.ErrorEvent(new Error('An image with this name already exists.'))); } this.imageManager.addImage(id, image); this.fire(new __chunk_1.Event('data', {dataType: 'style'})); }; Style.prototype.updateImage = function updateImage (id , image ) { this.imageManager.updateImage(id, image); }; Style.prototype.getImage = function getImage (id ) { return this.imageManager.getImage(id); }; Style.prototype.removeImage = function removeImage (id ) { if (!this.getImage(id)) { return this.fire(new __chunk_1.ErrorEvent(new Error('No image with this name exists.'))); } this.imageManager.removeImage(id); this.fire(new __chunk_1.Event('data', {dataType: 'style'})); }; Style.prototype.listImages = function listImages () { this._checkLoaded(); return this.imageManager.listImages(); }; Style.prototype.addSource = function addSource (id , source , options) { var this$1 = this; if ( options === void 0 ) options = {}; this._checkLoaded(); if (this.sourceCaches[id] !== undefined) { throw new Error('There is already a source with this ID'); } if (!source.type) { throw new Error(("The type property must be defined, but the only the following properties were given: " + (Object.keys(source).join(', ')) + ".")); } var builtIns = ['vector', 'raster', 'geojson', 'video', 'image']; var shouldValidate = builtIns.indexOf(source.type) >= 0; if (shouldValidate && this._validate(__chunk_1.validateStyle.source, ("sources." + id), source, null, options)) { return; } if (this.map && this.map._collectResourceTiming) { (source ).collectResourceTiming = true; } var sourceCache = this.sourceCaches[id] = new SourceCache(id, source, this.dispatcher); sourceCache.style = this; sourceCache.setEventedParent(this, function () { return ({ isSourceLoaded: this$1.loaded(), source: sourceCache.serialize(), sourceId: id }); }); sourceCache.onAdd(this.map); this._changed = true; }; /** * Remove a source from this stylesheet, given its id. * @param {string} id id of the source to remove * @throws {Error} if no source is found with the given ID */ Style.prototype.removeSource = function removeSource (id ) { this._checkLoaded(); if (this.sourceCaches[id] === undefined) { throw new Error('There is no source with this ID'); } for (var layerId in this._layers) { if (this._layers[layerId].source === id) { return this.fire(new __chunk_1.ErrorEvent(new Error(("Source \"" + id + "\" cannot be removed while layer \"" + layerId + "\" is using it.")))); } } var sourceCache = this.sourceCaches[id]; delete this.sourceCaches[id]; delete this._updatedSources[id]; sourceCache.fire(new __chunk_1.Event('data', {sourceDataType: 'metadata', dataType:'source', sourceId: id})); sourceCache.setEventedParent(null); sourceCache.clearTiles(); if (sourceCache.onRemove) { sourceCache.onRemove(this.map); } this._changed = true; }; /** * Set the data of a GeoJSON source, given its id. * @param {string} id id of the source * @param {GeoJSON|string} data GeoJSON source */ Style.prototype.setGeoJSONSourceData = function setGeoJSONSourceData (id , data ) { this._checkLoaded(); __chunk_1.assert(this.sourceCaches[id] !== undefined, 'There is no source with this ID'); var geojsonSource = (this.sourceCaches[id].getSource() ); __chunk_1.assert(geojsonSource.type === 'geojson'); geojsonSource.setData(data); this._changed = true; }; /** * Get a source by id. * @param {string} id id of the desired source * @returns {Object} source */ Style.prototype.getSource = function getSource (id ) { return this.sourceCaches[id] && this.sourceCaches[id].getSource(); }; /** * Add a layer to the map style. The layer will be inserted before the layer with * ID `before`, or appended if `before` is omitted. * @param {string} [before] ID of an existing layer to insert before */ Style.prototype.addLayer = function addLayer (layerObject , before , options) { if ( options === void 0 ) options = {}; this._checkLoaded(); var id = layerObject.id; if (this.getLayer(id)) { this.fire(new __chunk_1.ErrorEvent(new Error(("Layer with id \"" + id + "\" already exists on this map")))); return; } var layer; if (layerObject.type === 'custom') { if (emitValidationErrors(this, __chunk_1.validateCustomStyleLayer(layerObject))) { return; } layer = __chunk_1.createStyleLayer(layerObject); } else { if (typeof layerObject.source === 'object') { this.addSource(id, layerObject.source); layerObject = __chunk_1.clone$1(layerObject); layerObject = (__chunk_1.extend(layerObject, {source: id}) ); } // this layer is not in the style.layers array, so we pass an impossible array index if (this._validate(__chunk_1.validateStyle.layer, ("layers." + id), layerObject, {arrayIndex: -1}, options)) { return; } layer = __chunk_1.createStyleLayer(layerObject); this._validateLayer(layer); layer.setEventedParent(this, {layer: {id: id}}); } var index = before ? this._order.indexOf(before) : this._order.length; if (before && index === -1) { this.fire(new __chunk_1.ErrorEvent(new Error(("Layer with id \"" + before + "\" does not exist on this map.")))); return; } this._order.splice(index, 0, id); this._layerOrderChanged = true; this._layers[id] = layer; if (this._removedLayers[id] && layer.source && layer.type !== 'custom') { // If, in the current batch, we have already removed this layer // and we are now re-adding it with a different `type`, then we // need to clear (rather than just reload) the underyling source's // tiles. Otherwise, tiles marked 'reloading' will have buckets / // buffers that are set up for the _previous_ version of this // layer, causing, e.g.: // https://github.com/mapbox/mapbox-gl-js/issues/3633 var removed = this._removedLayers[id]; delete this._removedLayers[id]; if (removed.type !== layer.type) { this._updatedSources[layer.source] = 'clear'; } else { this._updatedSources[layer.source] = 'reload'; this.sourceCaches[layer.source].pause(); } } this._updateLayer(layer); if (layer.onAdd) { layer.onAdd(this.map); } }; /** * Moves a layer to a different z-position. The layer will be inserted before the layer with * ID `before`, or appended if `before` is omitted. * @param {string} id ID of the layer to move * @param {string} [before] ID of an existing layer to insert before */ Style.prototype.moveLayer = function moveLayer (id , before ) { this._checkLoaded(); this._changed = true; var layer = this._layers[id]; if (!layer) { this.fire(new __chunk_1.ErrorEvent(new Error(("The layer '" + id + "' does not exist in the map's style and cannot be moved.")))); return; } if (id === before) { return; } var index = this._order.indexOf(id); this._order.splice(index, 1); var newIndex = before ? this._order.indexOf(before) : this._order.length; if (before && newIndex === -1) { this.fire(new __chunk_1.ErrorEvent(new Error(("Layer with id \"" + before + "\" does not exist on this map.")))); return; } this._order.splice(newIndex, 0, id); this._layerOrderChanged = true; }; /** * Remove the layer with the given id from the style. * * If no such layer exists, an `error` event is fired. * * @param {string} id id of the layer to remove * @fires error */ Style.prototype.removeLayer = function removeLayer (id ) { this._checkLoaded(); var layer = this._layers[id]; if (!layer) { this.fire(new __chunk_1.ErrorEvent(new Error(("The layer '" + id + "' does not exist in the map's style and cannot be removed.")))); return; } layer.setEventedParent(null); var index = this._order.indexOf(id); this._order.splice(index, 1); this._layerOrderChanged = true; this._changed = true; this._removedLayers[id] = layer; delete this._layers[id]; delete this._updatedLayers[id]; delete this._updatedPaintProps[id]; if (layer.onRemove) { layer.onRemove(this.map); } }; /** * Return the style layer object with the given `id`. * * @param {string} id - id of the desired layer * @returns {?Object} a layer, if one with the given `id` exists */ Style.prototype.getLayer = function getLayer (id ) { return this._layers[id]; }; Style.prototype.setLayerZoomRange = function setLayerZoomRange (layerId , minzoom , maxzoom ) { this._checkLoaded(); var layer = this.getLayer(layerId); if (!layer) { this.fire(new __chunk_1.ErrorEvent(new Error(("The layer '" + layerId + "' does not exist in the map's style and cannot have zoom extent.")))); return; } if (layer.minzoom === minzoom && layer.maxzoom === maxzoom) { return; } if (minzoom != null) { layer.minzoom = minzoom; } if (maxzoom != null) { layer.maxzoom = maxzoom; } this._updateLayer(layer); }; Style.prototype.setFilter = function setFilter (layerId , filter , options) { if ( options === void 0 ) options = {}; this._checkLoaded(); var layer = this.getLayer(layerId); if (!layer) { this.fire(new __chunk_1.ErrorEvent(new Error(("The layer '" + layerId + "' does not exist in the map's style and cannot be filtered.")))); return; } if (__chunk_1.deepEqual(layer.filter, filter)) { return; } if (filter === null || filter === undefined) { layer.filter = undefined; this._updateLayer(layer); return; } if (this._validate(__chunk_1.validateStyle.filter, ("layers." + (layer.id) + ".filter"), filter, null, options)) { return; } layer.filter = __chunk_1.clone$1(filter); this._updateLayer(layer); }; /** * Get a layer's filter object * @param {string} layer the layer to inspect * @returns {*} the layer's filter, if any */ Style.prototype.getFilter = function getFilter (layer ) { return __chunk_1.clone$1(this.getLayer(layer).filter); }; Style.prototype.setLayoutProperty = function setLayoutProperty (layerId , name , value , options) { if ( options === void 0 ) options = {}; this._checkLoaded(); var layer = this.getLayer(layerId); if (!layer) { this.fire(new __chunk_1.ErrorEvent(new Error(("The layer '" + layerId + "' does not exist in the map's style and cannot be styled.")))); return; } if (__chunk_1.deepEqual(layer.getLayoutProperty(name), value)) { return; } layer.setLayoutProperty(name, value, options); this._updateLayer(layer); }; /** * Get a layout property's value from a given layer * @param {string} layerId the layer to inspect * @param {string} name the name of the layout property * @returns {*} the property value */ Style.prototype.getLayoutProperty = function getLayoutProperty (layerId , name ) { var layer = this.getLayer(layerId); if (!layer) { this.fire(new __chunk_1.ErrorEvent(new Error(("The layer '" + layerId + "' does not exist in the map's style.")))); return; } return layer.getLayoutProperty(name); }; Style.prototype.setPaintProperty = function setPaintProperty (layerId , name , value , options) { if ( options === void 0 ) options = {}; this._checkLoaded(); var layer = this.getLayer(layerId); if (!layer) { this.fire(new __chunk_1.ErrorEvent(new Error(("The layer '" + layerId + "' does not exist in the map's style and cannot be styled.")))); return; } if (__chunk_1.deepEqual(layer.getPaintProperty(name), value)) { return; } var requiresRelayout = layer.setPaintProperty(name, value, options); if (requiresRelayout) { this._updateLayer(layer); } this._changed = true; this._updatedPaintProps[layerId] = true; }; Style.prototype.getPaintProperty = function getPaintProperty (layer , name ) { return this.getLayer(layer).getPaintProperty(name); }; Style.prototype.setFeatureState = function setFeatureState (feature , state ) { this._checkLoaded(); var sourceId = feature.source; var sourceLayer = feature.sourceLayer; var sourceCache = this.sourceCaches[sourceId]; var featureId = parseInt(feature.id, 10); if (sourceCache === undefined) { this.fire(new __chunk_1.ErrorEvent(new Error(("The source '" + sourceId + "' does not exist in the map's style.")))); return; } var sourceType = sourceCache.getSource().type; if (sourceType === 'geojson' && sourceLayer) { this.fire(new __chunk_1.ErrorEvent(new Error("GeoJSON sources cannot have a sourceLayer parameter."))); return; } if (sourceType === 'vector' && !sourceLayer) { this.fire(new __chunk_1.ErrorEvent(new Error("The sourceLayer parameter must be provided for vector source types."))); return; } if (isNaN(featureId) || featureId < 0) { this.fire(new __chunk_1.ErrorEvent(new Error("The feature id parameter must be provided and non-negative."))); return; } sourceCache.setFeatureState(sourceLayer, featureId, state); }; Style.prototype.removeFeatureState = function removeFeatureState (target , key ) { this._checkLoaded(); var sourceId = target.source; var sourceCache = this.sourceCaches[sourceId]; if (sourceCache === undefined) { this.fire(new __chunk_1.ErrorEvent(new Error(("The source '" + sourceId + "' does not exist in the map's style.")))); return; } var sourceType = sourceCache.getSource().type; var sourceLayer = sourceType === 'vector' ? target.sourceLayer : undefined; var featureId = parseInt(target.id, 10); if (sourceType === 'vector' && !sourceLayer) { this.fire(new __chunk_1.ErrorEvent(new Error("The sourceLayer parameter must be provided for vector source types."))); return; } if (target.id !== undefined && isNaN(featureId) || featureId < 0) { this.fire(new __chunk_1.ErrorEvent(new Error("The feature id parameter must be non-negative."))); return; } if (key && (typeof target.id !== 'string' && typeof target.id !== 'number')) { this.fire(new __chunk_1.ErrorEvent(new Error("A feature id is requred to remove its specific state property."))); return; } sourceCache.removeFeatureState(sourceLayer, featureId, key); }; Style.prototype.getFeatureState = function getFeatureState (feature ) { this._checkLoaded(); var sourceId = feature.source; var sourceLayer = feature.sourceLayer; var sourceCache = this.sourceCaches[sourceId]; var featureId = parseInt(feature.id, 10); if (sourceCache === undefined) { this.fire(new __chunk_1.ErrorEvent(new Error(("The source '" + sourceId + "' does not exist in the map's style.")))); return; } var sourceType = sourceCache.getSource().type; if (sourceType === 'vector' && !sourceLayer) { this.fire(new __chunk_1.ErrorEvent(new Error("The sourceLayer parameter must be provided for vector source types."))); return; } if (isNaN(featureId) || featureId < 0) { this.fire(new __chunk_1.ErrorEvent(new Error("The feature id parameter must be provided and non-negative."))); return; } return sourceCache.getFeatureState(sourceLayer, featureId); }; Style.prototype.getTransition = function getTransition () { return __chunk_1.extend({ duration: 300, delay: 0 }, this.stylesheet && this.stylesheet.transition); }; Style.prototype.serialize = function serialize () { return __chunk_1.filterObject({ version: this.stylesheet.version, name: this.stylesheet.name, metadata: this.stylesheet.metadata, light: this.stylesheet.light, center: this.stylesheet.center, zoom: this.stylesheet.zoom, bearing: this.stylesheet.bearing, pitch: this.stylesheet.pitch, sprite: this.stylesheet.sprite, glyphs: this.stylesheet.glyphs, transition: this.stylesheet.transition, sources: __chunk_1.mapObject(this.sourceCaches, function (source) { return source.serialize(); }), layers: this._serializeLayers(this._order) }, function (value) { return value !== undefined; }); }; Style.prototype._updateLayer = function _updateLayer (layer ) { this._updatedLayers[layer.id] = true; if (layer.source && !this._updatedSources[layer.source]) { this._updatedSources[layer.source] = 'reload'; this.sourceCaches[layer.source].pause(); } this._changed = true; }; Style.prototype._flattenAndSortRenderedFeatures = function _flattenAndSortRenderedFeatures (sourceResults ) { var this$1 = this; // Feature order is complicated. // The order between features in two 2D layers is always determined by layer order. // The order between features in two 3D layers is always determined by depth. // The order between a feature in a 2D layer and a 3D layer is tricky: // Most often layer order determines the feature order in this case. If // a line layer is above a extrusion layer the line feature will be rendered // above the extrusion. If the line layer is below the extrusion layer, // it will be rendered below it. // // There is a weird case though. // You have layers in this order: extrusion_layer_a, line_layer, extrusion_layer_b // Each layer has a feature that overlaps the other features. // The feature in extrusion_layer_a is closer than the feature in extrusion_layer_b so it is rendered above. // The feature in line_layer is rendered above extrusion_layer_a. // This means that that the line_layer feature is above the extrusion_layer_b feature despite // it being in an earlier layer. var isLayer3D = function (layerId) { return this$1._layers[layerId].type === 'fill-extrusion'; }; var layerIndex = {}; var features3D = []; for (var l = this._order.length - 1; l >= 0; l--) { var layerId = this._order[l]; if (isLayer3D(layerId)) { layerIndex[layerId] = l; for (var i$2 = 0, list$1 = sourceResults; i$2 < list$1.length; i$2 += 1) { var sourceResult = list$1[i$2]; var layerFeatures = sourceResult[layerId]; if (layerFeatures) { for (var i$1 = 0, list = layerFeatures; i$1 < list.length; i$1 += 1) { var featureWrapper = list[i$1]; features3D.push(featureWrapper); } } } } } features3D.sort(function (a, b) { return b.intersectionZ - a.intersectionZ; }); var features = []; for (var l$1 = this._order.length - 1; l$1 >= 0; l$1--) { var layerId$1 = this._order[l$1]; if (isLayer3D(layerId$1)) { // add all 3D features that are in or above the current layer for (var i = features3D.length - 1; i >= 0; i--) { var topmost3D = features3D[i].feature; if (layerIndex[topmost3D.layer.id] < l$1) { break; } features.push(topmost3D); features3D.pop(); } } else { for (var i$4 = 0, list$3 = sourceResults; i$4 < list$3.length; i$4 += 1) { var sourceResult$1 = list$3[i$4]; var layerFeatures$1 = sourceResult$1[layerId$1]; if (layerFeatures$1) { for (var i$3 = 0, list$2 = layerFeatures$1; i$3 < list$2.length; i$3 += 1) { var featureWrapper$1 = list$2[i$3]; features.push(featureWrapper$1.feature); } } } } } return features; }; Style.prototype.queryRenderedFeatures = function queryRenderedFeatures$1 (queryGeometry , params , transform ) { if (params && params.filter) { this._validate(__chunk_1.validateStyle.filter, 'queryRenderedFeatures.filter', params.filter); } var includedSources = {}; if (params && params.layers) { if (!Array.isArray(params.layers)) { this.fire(new __chunk_1.ErrorEvent(new Error('parameters.layers must be an Array.'))); return []; } for (var i = 0, list = params.layers; i < list.length; i += 1) { var layerId = list[i]; var layer = this._layers[layerId]; if (!layer) { // this layer is not in the style.layers array this.fire(new __chunk_1.ErrorEvent(new Error(("The layer '" + layerId + "' does not exist in the map's style and cannot be queried for features.")))); return []; } includedSources[layer.source] = true; } } var sourceResults = []; for (var id in this.sourceCaches) { if (params.layers && !includedSources[id]) { continue; } sourceResults.push( queryRenderedFeatures( this.sourceCaches[id], this._layers, queryGeometry, params, transform) ); } if (this.placement) { // If a placement has run, query against its CollisionIndex // for symbol results, and treat it as an extra source to merge sourceResults.push( queryRenderedSymbols( this._layers, this.sourceCaches, queryGeometry, params, this.placement.collisionIndex, this.placement.retainedQueryData) ); } return this._flattenAndSortRenderedFeatures(sourceResults); }; Style.prototype.querySourceFeatures = function querySourceFeatures$1 (sourceID , params ) { if (params && params.filter) { this._validate(__chunk_1.validateStyle.filter, 'querySourceFeatures.filter', params.filter); } var sourceCache = this.sourceCaches[sourceID]; return sourceCache ? querySourceFeatures(sourceCache, params) : []; }; Style.prototype.addSourceType = function addSourceType (name , SourceType , callback ) { if (Style.getSourceType(name)) { return callback(new Error(("A source type called \"" + name + "\" already exists."))); } Style.setSourceType(name, SourceType); if (!SourceType.workerSourceURL) { return callback(null, null); } this.dispatcher.broadcast('loadWorkerSource', { name: name, url: SourceType.workerSourceURL }, callback); }; Style.prototype.getLight = function getLight () { return this.light.getLight(); }; Style.prototype.setLight = function setLight (lightOptions , options) { if ( options === void 0 ) options = {}; this._checkLoaded(); var light = this.light.getLight(); var _update = false; for (var key in lightOptions) { if (!__chunk_1.deepEqual(lightOptions[key], light[key])) { _update = true; break; } } if (!_update) { return; } var parameters = { now: __chunk_1.browser.now(), transition: __chunk_1.extend({ duration: 300, delay: 0 }, this.stylesheet.transition) }; this.light.setLight(lightOptions, options); this.light.updateTransitions(parameters); }; Style.prototype._validate = function _validate (validate , key , value , props , options) { if ( options === void 0 ) options = {}; if (options && options.validate === false) { return false; } return emitValidationErrors(this, validate.call(__chunk_1.validateStyle, __chunk_1.extend({ key: key, style: this.serialize(), value: value, styleSpec: __chunk_1.styleSpec }, props))); }; Style.prototype._remove = function _remove () { if (this._request) { this._request.cancel(); this._request = null; } if (this._spriteRequest) { this._spriteRequest.cancel(); this._spriteRequest = null; } __chunk_1.evented.off('pluginAvailable', this._rtlTextPluginCallback); for (var id in this.sourceCaches) { this.sourceCaches[id].clearTiles(); } this.dispatcher.remove(); }; Style.prototype._clearSource = function _clearSource (id ) { this.sourceCaches[id].clearTiles(); }; Style.prototype._reloadSource = function _reloadSource (id ) { this.sourceCaches[id].resume(); this.sourceCaches[id].reload(); }; Style.prototype._updateSources = function _updateSources (transform ) { for (var id in this.sourceCaches) { this.sourceCaches[id].update(transform); } }; Style.prototype._generateCollisionBoxes = function _generateCollisionBoxes () { for (var id in this.sourceCaches) { this._reloadSource(id); } }; Style.prototype._updatePlacement = function _updatePlacement (transform , showCollisionBoxes , fadeDuration , crossSourceCollisions ) { var symbolBucketsChanged = false; var placementCommitted = false; var layerTiles = {}; for (var i = 0, list = this._order; i < list.length; i += 1) { var layerID = list[i]; var styleLayer = this._layers[layerID]; if (styleLayer.type !== 'symbol') { continue; } if (!layerTiles[styleLayer.source]) { var sourceCache = this.sourceCaches[styleLayer.source]; layerTiles[styleLayer.source] = sourceCache.getRenderableIds(true) .map(function (id) { return sourceCache.getTileByID(id); }) .sort(function (a, b) { return (b.tileID.overscaledZ - a.tileID.overscaledZ) || (a.tileID.isLessThan(b.tileID) ? -1 : 1); }); } var layerBucketsChanged = this.crossTileSymbolIndex.addLayer(styleLayer, layerTiles[styleLayer.source], transform.center.lng); symbolBucketsChanged = symbolBucketsChanged || layerBucketsChanged; } this.crossTileSymbolIndex.pruneUnusedLayers(this._order); // Anything that changes our "in progress" layer and tile indices requires us // to start over. When we start over, we do a full placement instead of incremental // to prevent starvation. // We need to restart placement to keep layer indices in sync. // Also force full placement when fadeDuration === 0 to ensure that newly loaded // tiles will fully display symbols in their first frame var forceFullPlacement = this._layerOrderChanged || fadeDuration === 0; if (forceFullPlacement || !this.pauseablePlacement || (this.pauseablePlacement.isDone() && !this.placement.stillRecent(__chunk_1.browser.now()))) { this.pauseablePlacement = new PauseablePlacement(transform, this._order, forceFullPlacement, showCollisionBoxes, fadeDuration, crossSourceCollisions, this.placement); this._layerOrderChanged = false; } if (this.pauseablePlacement.isDone()) { // the last placement finished running, but the next one hasn’t // started yet because of the `stillRecent` check immediately // above, so mark it stale to ensure that we request another // render frame this.placement.setStale(); } else { this.pauseablePlacement.continuePlacement(this._order, this._layers, layerTiles); if (this.pauseablePlacement.isDone()) { this.placement = this.pauseablePlacement.commit(__chunk_1.browser.now()); placementCommitted = true; } if (symbolBucketsChanged) { // since the placement gets split over multiple frames it is possible // these buckets were processed before they were changed and so the // placement is already stale while it is in progress this.pauseablePlacement.placement.setStale(); } } if (placementCommitted || symbolBucketsChanged) { for (var i$1 = 0, list$1 = this._order; i$1 < list$1.length; i$1 += 1) { var layerID$1 = list$1[i$1]; var styleLayer$1 = this._layers[layerID$1]; if (styleLayer$1.type !== 'symbol') { continue; } this.placement.updateLayerOpacities(styleLayer$1, layerTiles[styleLayer$1.source]); } } // needsRender is false when we have just finished a placement that didn't change the visibility of any symbols var needsRerender = !this.pauseablePlacement.isDone() || this.placement.hasTransitions(__chunk_1.browser.now()); return needsRerender; }; Style.prototype._releaseSymbolFadeTiles = function _releaseSymbolFadeTiles () { for (var id in this.sourceCaches) { this.sourceCaches[id].releaseSymbolFadeTiles(); } }; // Callbacks from web workers Style.prototype.getImages = function getImages (mapId , params , callback ) { this.imageManager.getImages(params.icons, callback); }; Style.prototype.getGlyphs = function getGlyphs (mapId , params , callback ) { this.glyphManager.getGlyphs(params.stacks, callback); }; Style.prototype.getResource = function getResource (mapId , params , callback ) { return __chunk_1.makeRequest(params, callback); }; return Style; }(__chunk_1.Evented)); Style.getSourceType = getType; Style.setSourceType = setType; Style.registerForPluginAvailability = __chunk_1.registerForPluginAvailability; // var posAttributes = __chunk_1.createLayout([ { name: 'a_pos', type: 'Int16', components: 2 } ]); var preludeFrag = "#ifdef GL_ES\nprecision mediump float;\n#else\n\n#if !defined(lowp)\n#define lowp\n#endif\n\n#if !defined(mediump)\n#define mediump\n#endif\n\n#if !defined(highp)\n#define highp\n#endif\n\n#endif\n"; var preludeVert = "#ifdef GL_ES\nprecision highp float;\n#else\n\n#if !defined(lowp)\n#define lowp\n#endif\n\n#if !defined(mediump)\n#define mediump\n#endif\n\n#if !defined(highp)\n#define highp\n#endif\n\n#endif\n\n// Unpack a pair of values that have been packed into a single float.\n// The packed values are assumed to be 8-bit unsigned integers, and are\n// packed like so:\n// packedValue = floor(input[0]) * 256 + input[1],\nvec2 unpack_float(const float packedValue) {\n int packedIntValue = int(packedValue);\n int v0 = packedIntValue / 256;\n return vec2(v0, packedIntValue - v0 * 256);\n}\n\nvec2 unpack_opacity(const float packedOpacity) {\n int intOpacity = int(packedOpacity) / 2;\n return vec2(float(intOpacity) / 127.0, mod(packedOpacity, 2.0));\n}\n\n// To minimize the number of attributes needed, we encode a 4-component\n// color into a pair of floats (i.e. a vec2) as follows:\n// [ floor(color.r * 255) * 256 + color.g * 255,\n// floor(color.b * 255) * 256 + color.g * 255 ]\nvec4 decode_color(const vec2 encodedColor) {\n return vec4(\n unpack_float(encodedColor[0]) / 255.0,\n unpack_float(encodedColor[1]) / 255.0\n );\n}\n\n// Unpack a pair of paint values and interpolate between them.\nfloat unpack_mix_vec2(const vec2 packedValue, const float t) {\n return mix(packedValue[0], packedValue[1], t);\n}\n\n// Unpack a pair of paint values and interpolate between them.\nvec4 unpack_mix_color(const vec4 packedColors, const float t) {\n vec4 minColor = decode_color(vec2(packedColors[0], packedColors[1]));\n vec4 maxColor = decode_color(vec2(packedColors[2], packedColors[3]));\n return mix(minColor, maxColor, t);\n}\n\n// The offset depends on how many pixels are between the world origin and the edge of the tile:\n// vec2 offset = mod(pixel_coord, size)\n//\n// At high zoom levels there are a ton of pixels between the world origin and the edge of the tile.\n// The glsl spec only guarantees 16 bits of precision for highp floats. We need more than that.\n//\n// The pixel_coord is passed in as two 16 bit values:\n// pixel_coord_upper = floor(pixel_coord / 2^16)\n// pixel_coord_lower = mod(pixel_coord, 2^16)\n//\n// The offset is calculated in a series of steps that should preserve this precision:\nvec2 get_pattern_pos(const vec2 pixel_coord_upper, const vec2 pixel_coord_lower,\n const vec2 pattern_size, const float tile_units_to_pixels, const vec2 pos) {\n\n vec2 offset = mod(mod(mod(pixel_coord_upper, pattern_size) * 256.0, pattern_size) * 256.0 + pixel_coord_lower, pattern_size);\n return (tile_units_to_pixels * pos + offset) / pattern_size;\n}\n"; var backgroundFrag = "uniform vec4 u_color;\nuniform float u_opacity;\n\nvoid main() {\n gl_FragColor = u_color * u_opacity;\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n"; var backgroundVert = "attribute vec2 a_pos;\n\nuniform mat4 u_matrix;\n\nvoid main() {\n gl_Position = u_matrix * vec4(a_pos, 0, 1);\n}\n"; var backgroundPatternFrag = "uniform vec2 u_pattern_tl_a;\nuniform vec2 u_pattern_br_a;\nuniform vec2 u_pattern_tl_b;\nuniform vec2 u_pattern_br_b;\nuniform vec2 u_texsize;\nuniform float u_mix;\nuniform float u_opacity;\n\nuniform sampler2D u_image;\n\nvarying vec2 v_pos_a;\nvarying vec2 v_pos_b;\n\nvoid main() {\n vec2 imagecoord = mod(v_pos_a, 1.0);\n vec2 pos = mix(u_pattern_tl_a / u_texsize, u_pattern_br_a / u_texsize, imagecoord);\n vec4 color1 = texture2D(u_image, pos);\n\n vec2 imagecoord_b = mod(v_pos_b, 1.0);\n vec2 pos2 = mix(u_pattern_tl_b / u_texsize, u_pattern_br_b / u_texsize, imagecoord_b);\n vec4 color2 = texture2D(u_image, pos2);\n\n gl_FragColor = mix(color1, color2, u_mix) * u_opacity;\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n"; var backgroundPatternVert = "uniform mat4 u_matrix;\nuniform vec2 u_pattern_size_a;\nuniform vec2 u_pattern_size_b;\nuniform vec2 u_pixel_coord_upper;\nuniform vec2 u_pixel_coord_lower;\nuniform float u_scale_a;\nuniform float u_scale_b;\nuniform float u_tile_units_to_pixels;\n\nattribute vec2 a_pos;\n\nvarying vec2 v_pos_a;\nvarying vec2 v_pos_b;\n\nvoid main() {\n gl_Position = u_matrix * vec4(a_pos, 0, 1);\n\n v_pos_a = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, u_scale_a * u_pattern_size_a, u_tile_units_to_pixels, a_pos);\n v_pos_b = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, u_scale_b * u_pattern_size_b, u_tile_units_to_pixels, a_pos);\n}\n"; var circleFrag = "#pragma mapbox: define highp vec4 color\n#pragma mapbox: define mediump float radius\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define highp vec4 stroke_color\n#pragma mapbox: define mediump float stroke_width\n#pragma mapbox: define lowp float stroke_opacity\n\nvarying vec3 v_data;\n\nvoid main() {\n #pragma mapbox: initialize highp vec4 color\n #pragma mapbox: initialize mediump float radius\n #pragma mapbox: initialize lowp float blur\n #pragma mapbox: initialize lowp float opacity\n #pragma mapbox: initialize highp vec4 stroke_color\n #pragma mapbox: initialize mediump float stroke_width\n #pragma mapbox: initialize lowp float stroke_opacity\n\n vec2 extrude = v_data.xy;\n float extrude_length = length(extrude);\n\n lowp float antialiasblur = v_data.z;\n float antialiased_blur = -max(blur, antialiasblur);\n\n float opacity_t = smoothstep(0.0, antialiased_blur, extrude_length - 1.0);\n\n float color_t = stroke_width < 0.01 ? 0.0 : smoothstep(\n antialiased_blur,\n 0.0,\n extrude_length - radius / (radius + stroke_width)\n );\n\n gl_FragColor = opacity_t * mix(color * opacity, stroke_color * stroke_opacity, color_t);\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n"; var circleVert = "uniform mat4 u_matrix;\nuniform bool u_scale_with_map;\nuniform bool u_pitch_with_map;\nuniform vec2 u_extrude_scale;\nuniform highp float u_camera_to_center_distance;\n\nattribute vec2 a_pos;\n\n#pragma mapbox: define highp vec4 color\n#pragma mapbox: define mediump float radius\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define highp vec4 stroke_color\n#pragma mapbox: define mediump float stroke_width\n#pragma mapbox: define lowp float stroke_opacity\n\nvarying vec3 v_data;\n\nvoid main(void) {\n #pragma mapbox: initialize highp vec4 color\n #pragma mapbox: initialize mediump float radius\n #pragma mapbox: initialize lowp float blur\n #pragma mapbox: initialize lowp float opacity\n #pragma mapbox: initialize highp vec4 stroke_color\n #pragma mapbox: initialize mediump float stroke_width\n #pragma mapbox: initialize lowp float stroke_opacity\n\n // unencode the extrusion vector that we snuck into the a_pos vector\n vec2 extrude = vec2(mod(a_pos, 2.0) * 2.0 - 1.0);\n\n // multiply a_pos by 0.5, since we had it * 2 in order to sneak\n // in extrusion data\n vec2 circle_center = floor(a_pos * 0.5);\n if (u_pitch_with_map) {\n vec2 corner_position = circle_center;\n if (u_scale_with_map) {\n corner_position += extrude * (radius + stroke_width) * u_extrude_scale;\n } else {\n // Pitching the circle with the map effectively scales it with the map\n // To counteract the effect for pitch-scale: viewport, we rescale the\n // whole circle based on the pitch scaling effect at its central point\n vec4 projected_center = u_matrix * vec4(circle_center, 0, 1);\n corner_position += extrude * (radius + stroke_width) * u_extrude_scale * (projected_center.w / u_camera_to_center_distance);\n }\n\n gl_Position = u_matrix * vec4(corner_position, 0, 1);\n } else {\n gl_Position = u_matrix * vec4(circle_center, 0, 1);\n\n if (u_scale_with_map) {\n gl_Position.xy += extrude * (radius + stroke_width) * u_extrude_scale * u_camera_to_center_distance;\n } else {\n gl_Position.xy += extrude * (radius + stroke_width) * u_extrude_scale * gl_Position.w;\n }\n }\n\n // This is a minimum blur distance that serves as a faux-antialiasing for\n // the circle. since blur is a ratio of the circle's size and the intent is\n // to keep the blur at roughly 1px, the two are inversely related.\n lowp float antialiasblur = 1.0 / DEVICE_PIXEL_RATIO / (radius + stroke_width);\n\n v_data = vec3(extrude.x, extrude.y, antialiasblur);\n}\n"; var clippingMaskFrag = "void main() {\n gl_FragColor = vec4(1.0);\n}\n"; var clippingMaskVert = "attribute vec2 a_pos;\n\nuniform mat4 u_matrix;\n\nvoid main() {\n gl_Position = u_matrix * vec4(a_pos, 0, 1);\n}\n"; var heatmapFrag = "#pragma mapbox: define highp float weight\n\nuniform highp float u_intensity;\nvarying vec2 v_extrude;\n\n// Gaussian kernel coefficient: 1 / sqrt(2 * PI)\n#define GAUSS_COEF 0.3989422804014327\n\nvoid main() {\n #pragma mapbox: initialize highp float weight\n\n // Kernel density estimation with a Gaussian kernel of size 5x5\n float d = -0.5 * 3.0 * 3.0 * dot(v_extrude, v_extrude);\n float val = weight * u_intensity * GAUSS_COEF * exp(d);\n\n gl_FragColor = vec4(val, 1.0, 1.0, 1.0);\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n"; var heatmapVert = "#pragma mapbox: define highp float weight\n#pragma mapbox: define mediump float radius\n\nuniform mat4 u_matrix;\nuniform float u_extrude_scale;\nuniform float u_opacity;\nuniform float u_intensity;\n\nattribute vec2 a_pos;\n\nvarying vec2 v_extrude;\n\n// Effective \"0\" in the kernel density texture to adjust the kernel size to;\n// this empirically chosen number minimizes artifacts on overlapping kernels\n// for typical heatmap cases (assuming clustered source)\nconst highp float ZERO = 1.0 / 255.0 / 16.0;\n\n// Gaussian kernel coefficient: 1 / sqrt(2 * PI)\n#define GAUSS_COEF 0.3989422804014327\n\nvoid main(void) {\n #pragma mapbox: initialize highp float weight\n #pragma mapbox: initialize mediump float radius\n\n // unencode the extrusion vector that we snuck into the a_pos vector\n vec2 unscaled_extrude = vec2(mod(a_pos, 2.0) * 2.0 - 1.0);\n\n // This 'extrude' comes in ranging from [-1, -1], to [1, 1]. We'll use\n // it to produce the vertices of a square mesh framing the point feature\n // we're adding to the kernel density texture. We'll also pass it as\n // a varying, so that the fragment shader can determine the distance of\n // each fragment from the point feature.\n // Before we do so, we need to scale it up sufficiently so that the\n // kernel falls effectively to zero at the edge of the mesh.\n // That is, we want to know S such that\n // weight * u_intensity * GAUSS_COEF * exp(-0.5 * 3.0^2 * S^2) == ZERO\n // Which solves to:\n // S = sqrt(-2.0 * log(ZERO / (weight * u_intensity * GAUSS_COEF))) / 3.0\n float S = sqrt(-2.0 * log(ZERO / weight / u_intensity / GAUSS_COEF)) / 3.0;\n\n // Pass the varying in units of radius\n v_extrude = S * unscaled_extrude;\n\n // Scale by radius and the zoom-based scale factor to produce actual\n // mesh position\n vec2 extrude = v_extrude * radius * u_extrude_scale;\n\n // multiply a_pos by 0.5, since we had it * 2 in order to sneak\n // in extrusion data\n vec4 pos = vec4(floor(a_pos * 0.5) + extrude, 0, 1);\n\n gl_Position = u_matrix * pos;\n}\n"; var heatmapTextureFrag = "uniform sampler2D u_image;\nuniform sampler2D u_color_ramp;\nuniform float u_opacity;\nvarying vec2 v_pos;\n\nvoid main() {\n float t = texture2D(u_image, v_pos).r;\n vec4 color = texture2D(u_color_ramp, vec2(t, 0.5));\n gl_FragColor = color * u_opacity;\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(0.0);\n#endif\n}\n"; var heatmapTextureVert = "uniform mat4 u_matrix;\nuniform vec2 u_world;\nattribute vec2 a_pos;\nvarying vec2 v_pos;\n\nvoid main() {\n gl_Position = u_matrix * vec4(a_pos * u_world, 0, 1);\n\n v_pos.x = a_pos.x;\n v_pos.y = 1.0 - a_pos.y;\n}\n"; var collisionBoxFrag = "\nvarying float v_placed;\nvarying float v_notUsed;\n\nvoid main() {\n\n float alpha = 0.5;\n\n // Red = collision, hide label\n gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0) * alpha;\n\n // Blue = no collision, label is showing\n if (v_placed > 0.5) {\n gl_FragColor = vec4(0.0, 0.0, 1.0, 0.5) * alpha;\n }\n\n if (v_notUsed > 0.5) {\n // This box not used, fade it out\n gl_FragColor *= .1;\n }\n}"; var collisionBoxVert = "attribute vec2 a_pos;\nattribute vec2 a_anchor_pos;\nattribute vec2 a_extrude;\nattribute vec2 a_placed;\nattribute vec2 a_shift;\n\nuniform mat4 u_matrix;\nuniform vec2 u_extrude_scale;\nuniform float u_camera_to_center_distance;\n\nvarying float v_placed;\nvarying float v_notUsed;\n\nvoid main() {\n vec4 projectedPoint = u_matrix * vec4(a_anchor_pos, 0, 1);\n highp float camera_to_anchor_distance = projectedPoint.w;\n highp float collision_perspective_ratio = clamp(\n 0.5 + 0.5 * (u_camera_to_center_distance / camera_to_anchor_distance),\n 0.0, // Prevents oversized near-field boxes in pitched/overzoomed tiles\n 4.0);\n\n gl_Position = u_matrix * vec4(a_pos, 0.0, 1.0);\n gl_Position.xy += (a_extrude + a_shift) * u_extrude_scale * gl_Position.w * collision_perspective_ratio;\n\n v_placed = a_placed.x;\n v_notUsed = a_placed.y;\n}\n"; var collisionCircleFrag = "uniform float u_overscale_factor;\n\nvarying float v_placed;\nvarying float v_notUsed;\nvarying float v_radius;\nvarying vec2 v_extrude;\nvarying vec2 v_extrude_scale;\n\nvoid main() {\n float alpha = 0.5;\n\n // Red = collision, hide label\n vec4 color = vec4(1.0, 0.0, 0.0, 1.0) * alpha;\n\n // Blue = no collision, label is showing\n if (v_placed > 0.5) {\n color = vec4(0.0, 0.0, 1.0, 0.5) * alpha;\n }\n\n if (v_notUsed > 0.5) {\n // This box not used, fade it out\n color *= .2;\n }\n\n float extrude_scale_length = length(v_extrude_scale);\n float extrude_length = length(v_extrude) * extrude_scale_length;\n float stroke_width = 15.0 * extrude_scale_length / u_overscale_factor;\n float radius = v_radius * extrude_scale_length;\n\n float distance_to_edge = abs(extrude_length - radius);\n float opacity_t = smoothstep(-stroke_width, 0.0, -distance_to_edge);\n\n gl_FragColor = opacity_t * color;\n}\n"; var collisionCircleVert = "attribute vec2 a_pos;\nattribute vec2 a_anchor_pos;\nattribute vec2 a_extrude;\nattribute vec2 a_placed;\n\nuniform mat4 u_matrix;\nuniform vec2 u_extrude_scale;\nuniform float u_camera_to_center_distance;\n\nvarying float v_placed;\nvarying float v_notUsed;\nvarying float v_radius;\n\nvarying vec2 v_extrude;\nvarying vec2 v_extrude_scale;\n\nvoid main() {\n vec4 projectedPoint = u_matrix * vec4(a_anchor_pos, 0, 1);\n highp float camera_to_anchor_distance = projectedPoint.w;\n highp float collision_perspective_ratio = clamp(\n 0.5 + 0.5 * (u_camera_to_center_distance / camera_to_anchor_distance),\n 0.0, // Prevents oversized near-field circles in pitched/overzoomed tiles\n 4.0);\n\n gl_Position = u_matrix * vec4(a_pos, 0.0, 1.0);\n\n highp float padding_factor = 1.2; // Pad the vertices slightly to make room for anti-alias blur\n gl_Position.xy += a_extrude * u_extrude_scale * padding_factor * gl_Position.w * collision_perspective_ratio;\n\n v_placed = a_placed.x;\n v_notUsed = a_placed.y;\n v_radius = abs(a_extrude.y); // We don't pitch the circles, so both units of the extrusion vector are equal in magnitude to the radius\n\n v_extrude = a_extrude * padding_factor;\n v_extrude_scale = u_extrude_scale * u_camera_to_center_distance * collision_perspective_ratio;\n}\n"; var debugFrag = "uniform highp vec4 u_color;\n\nvoid main() {\n gl_FragColor = u_color;\n}\n"; var debugVert = "attribute vec2 a_pos;\n\nuniform mat4 u_matrix;\n\nvoid main() {\n gl_Position = u_matrix * vec4(a_pos, 0, 1);\n}\n"; var fillFrag = "#pragma mapbox: define highp vec4 color\n#pragma mapbox: define lowp float opacity\n\nvoid main() {\n #pragma mapbox: initialize highp vec4 color\n #pragma mapbox: initialize lowp float opacity\n\n gl_FragColor = color * opacity;\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n"; var fillVert = "attribute vec2 a_pos;\n\nuniform mat4 u_matrix;\n\n#pragma mapbox: define highp vec4 color\n#pragma mapbox: define lowp float opacity\n\nvoid main() {\n #pragma mapbox: initialize highp vec4 color\n #pragma mapbox: initialize lowp float opacity\n\n gl_Position = u_matrix * vec4(a_pos, 0, 1);\n}\n"; var fillOutlineFrag = "#pragma mapbox: define highp vec4 outline_color\n#pragma mapbox: define lowp float opacity\n\nvarying vec2 v_pos;\n\nvoid main() {\n #pragma mapbox: initialize highp vec4 outline_color\n #pragma mapbox: initialize lowp float opacity\n\n float dist = length(v_pos - gl_FragCoord.xy);\n float alpha = 1.0 - smoothstep(0.0, 1.0, dist);\n gl_FragColor = outline_color * (alpha * opacity);\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n"; var fillOutlineVert = "attribute vec2 a_pos;\n\nuniform mat4 u_matrix;\nuniform vec2 u_world;\n\nvarying vec2 v_pos;\n\n#pragma mapbox: define highp vec4 outline_color\n#pragma mapbox: define lowp float opacity\n\nvoid main() {\n #pragma mapbox: initialize highp vec4 outline_color\n #pragma mapbox: initialize lowp float opacity\n\n gl_Position = u_matrix * vec4(a_pos, 0, 1);\n v_pos = (gl_Position.xy / gl_Position.w + 1.0) / 2.0 * u_world;\n}\n"; var fillOutlinePatternFrag = "\nuniform vec2 u_texsize;\nuniform sampler2D u_image;\nuniform float u_fade;\n\nvarying vec2 v_pos_a;\nvarying vec2 v_pos_b;\nvarying vec2 v_pos;\n\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define lowp vec4 pattern_from\n#pragma mapbox: define lowp vec4 pattern_to\n\nvoid main() {\n #pragma mapbox: initialize lowp float opacity\n #pragma mapbox: initialize mediump vec4 pattern_from\n #pragma mapbox: initialize mediump vec4 pattern_to\n\n vec2 pattern_tl_a = pattern_from.xy;\n vec2 pattern_br_a = pattern_from.zw;\n vec2 pattern_tl_b = pattern_to.xy;\n vec2 pattern_br_b = pattern_to.zw;\n\n vec2 imagecoord = mod(v_pos_a, 1.0);\n vec2 pos = mix(pattern_tl_a / u_texsize, pattern_br_a / u_texsize, imagecoord);\n vec4 color1 = texture2D(u_image, pos);\n\n vec2 imagecoord_b = mod(v_pos_b, 1.0);\n vec2 pos2 = mix(pattern_tl_b / u_texsize, pattern_br_b / u_texsize, imagecoord_b);\n vec4 color2 = texture2D(u_image, pos2);\n\n // find distance to outline for alpha interpolation\n\n float dist = length(v_pos - gl_FragCoord.xy);\n float alpha = 1.0 - smoothstep(0.0, 1.0, dist);\n\n\n gl_FragColor = mix(color1, color2, u_fade) * alpha * opacity;\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n"; var fillOutlinePatternVert = "uniform mat4 u_matrix;\nuniform vec2 u_world;\nuniform vec2 u_pixel_coord_upper;\nuniform vec2 u_pixel_coord_lower;\nuniform vec4 u_scale;\n\nattribute vec2 a_pos;\n\nvarying vec2 v_pos_a;\nvarying vec2 v_pos_b;\nvarying vec2 v_pos;\n\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define lowp vec4 pattern_from\n#pragma mapbox: define lowp vec4 pattern_to\n\nvoid main() {\n #pragma mapbox: initialize lowp float opacity\n #pragma mapbox: initialize mediump vec4 pattern_from\n #pragma mapbox: initialize mediump vec4 pattern_to\n\n vec2 pattern_tl_a = pattern_from.xy;\n vec2 pattern_br_a = pattern_from.zw;\n vec2 pattern_tl_b = pattern_to.xy;\n vec2 pattern_br_b = pattern_to.zw;\n\n float pixelRatio = u_scale.x;\n float tileRatio = u_scale.y;\n float fromScale = u_scale.z;\n float toScale = u_scale.w;\n\n gl_Position = u_matrix * vec4(a_pos, 0, 1);\n\n vec2 display_size_a = vec2((pattern_br_a.x - pattern_tl_a.x) / pixelRatio, (pattern_br_a.y - pattern_tl_a.y) / pixelRatio);\n vec2 display_size_b = vec2((pattern_br_b.x - pattern_tl_b.x) / pixelRatio, (pattern_br_b.y - pattern_tl_b.y) / pixelRatio);\n\n v_pos_a = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, fromScale * display_size_a, tileRatio, a_pos);\n v_pos_b = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, toScale * display_size_b, tileRatio, a_pos);\n\n v_pos = (gl_Position.xy / gl_Position.w + 1.0) / 2.0 * u_world;\n}\n"; var fillPatternFrag = "uniform vec2 u_texsize;\nuniform float u_fade;\n\nuniform sampler2D u_image;\n\nvarying vec2 v_pos_a;\nvarying vec2 v_pos_b;\n\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define lowp vec4 pattern_from\n#pragma mapbox: define lowp vec4 pattern_to\n\nvoid main() {\n #pragma mapbox: initialize lowp float opacity\n #pragma mapbox: initialize mediump vec4 pattern_from\n #pragma mapbox: initialize mediump vec4 pattern_to\n\n vec2 pattern_tl_a = pattern_from.xy;\n vec2 pattern_br_a = pattern_from.zw;\n vec2 pattern_tl_b = pattern_to.xy;\n vec2 pattern_br_b = pattern_to.zw;\n\n vec2 imagecoord = mod(v_pos_a, 1.0);\n vec2 pos = mix(pattern_tl_a / u_texsize, pattern_br_a / u_texsize, imagecoord);\n vec4 color1 = texture2D(u_image, pos);\n\n vec2 imagecoord_b = mod(v_pos_b, 1.0);\n vec2 pos2 = mix(pattern_tl_b / u_texsize, pattern_br_b / u_texsize, imagecoord_b);\n vec4 color2 = texture2D(u_image, pos2);\n\n gl_FragColor = mix(color1, color2, u_fade) * opacity;\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n"; var fillPatternVert = "uniform mat4 u_matrix;\nuniform vec2 u_pixel_coord_upper;\nuniform vec2 u_pixel_coord_lower;\nuniform vec4 u_scale;\n\nattribute vec2 a_pos;\n\nvarying vec2 v_pos_a;\nvarying vec2 v_pos_b;\n\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define lowp vec4 pattern_from\n#pragma mapbox: define lowp vec4 pattern_to\n\nvoid main() {\n #pragma mapbox: initialize lowp float opacity\n #pragma mapbox: initialize mediump vec4 pattern_from\n #pragma mapbox: initialize mediump vec4 pattern_to\n\n vec2 pattern_tl_a = pattern_from.xy;\n vec2 pattern_br_a = pattern_from.zw;\n vec2 pattern_tl_b = pattern_to.xy;\n vec2 pattern_br_b = pattern_to.zw;\n\n float pixelRatio = u_scale.x;\n float tileZoomRatio = u_scale.y;\n float fromScale = u_scale.z;\n float toScale = u_scale.w;\n\n vec2 display_size_a = vec2((pattern_br_a.x - pattern_tl_a.x) / pixelRatio, (pattern_br_a.y - pattern_tl_a.y) / pixelRatio);\n vec2 display_size_b = vec2((pattern_br_b.x - pattern_tl_b.x) / pixelRatio, (pattern_br_b.y - pattern_tl_b.y) / pixelRatio);\n gl_Position = u_matrix * vec4(a_pos, 0, 1);\n\n v_pos_a = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, fromScale * display_size_a, tileZoomRatio, a_pos);\n v_pos_b = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, toScale * display_size_b, tileZoomRatio, a_pos);\n}\n"; var fillExtrusionFrag = "varying vec4 v_color;\n\nvoid main() {\n gl_FragColor = v_color;\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n"; var fillExtrusionVert = "uniform mat4 u_matrix;\nuniform vec3 u_lightcolor;\nuniform lowp vec3 u_lightpos;\nuniform lowp float u_lightintensity;\nuniform float u_vertical_gradient;\nuniform lowp float u_opacity;\n\nattribute vec2 a_pos;\nattribute vec4 a_normal_ed;\n\nvarying vec4 v_color;\n\n#pragma mapbox: define highp float base\n#pragma mapbox: define highp float height\n\n#pragma mapbox: define highp vec4 color\n\nvoid main() {\n #pragma mapbox: initialize highp float base\n #pragma mapbox: initialize highp float height\n #pragma mapbox: initialize highp vec4 color\n\n vec3 normal = a_normal_ed.xyz;\n\n base = max(0.0, base);\n height = max(0.0, height);\n\n float t = mod(normal.x, 2.0);\n\n gl_Position = u_matrix * vec4(a_pos, t > 0.0 ? height : base, 1);\n\n // Relative luminance (how dark/bright is the surface color?)\n float colorvalue = color.r * 0.2126 + color.g * 0.7152 + color.b * 0.0722;\n\n v_color = vec4(0.0, 0.0, 0.0, 1.0);\n\n // Add slight ambient lighting so no extrusions are totally black\n vec4 ambientlight = vec4(0.03, 0.03, 0.03, 1.0);\n color += ambientlight;\n\n // Calculate cos(theta), where theta is the angle between surface normal and diffuse light ray\n float directional = clamp(dot(normal / 16384.0, u_lightpos), 0.0, 1.0);\n\n // Adjust directional so that\n // the range of values for highlight/shading is narrower\n // with lower light intensity\n // and with lighter/brighter surface colors\n directional = mix((1.0 - u_lightintensity), max((1.0 - colorvalue + u_lightintensity), 1.0), directional);\n\n // Add gradient along z axis of side surfaces\n if (normal.y != 0.0) {\n // This avoids another branching statement, but multiplies by a constant of 0.84 if no vertical gradient,\n // and otherwise calculates the gradient based on base + height\n directional *= (\n (1.0 - u_vertical_gradient) +\n (u_vertical_gradient * clamp((t + base) * pow(height / 150.0, 0.5), mix(0.7, 0.98, 1.0 - u_lightintensity), 1.0)));\n }\n\n // Assign final color based on surface + ambient light color, diffuse light directional, and light color\n // with lower bounds adjusted to hue of light\n // so that shading is tinted with the complementary (opposite) color to the light color\n v_color.r += clamp(color.r * directional * u_lightcolor.r, mix(0.0, 0.3, 1.0 - u_lightcolor.r), 1.0);\n v_color.g += clamp(color.g * directional * u_lightcolor.g, mix(0.0, 0.3, 1.0 - u_lightcolor.g), 1.0);\n v_color.b += clamp(color.b * directional * u_lightcolor.b, mix(0.0, 0.3, 1.0 - u_lightcolor.b), 1.0);\n v_color *= u_opacity;\n}\n"; var fillExtrusionPatternFrag = "uniform vec2 u_texsize;\nuniform float u_fade;\n\nuniform sampler2D u_image;\n\nvarying vec2 v_pos_a;\nvarying vec2 v_pos_b;\nvarying vec4 v_lighting;\n\n#pragma mapbox: define lowp float base\n#pragma mapbox: define lowp float height\n#pragma mapbox: define lowp vec4 pattern_from\n#pragma mapbox: define lowp vec4 pattern_to\n\nvoid main() {\n #pragma mapbox: initialize lowp float base\n #pragma mapbox: initialize lowp float height\n #pragma mapbox: initialize mediump vec4 pattern_from\n #pragma mapbox: initialize mediump vec4 pattern_to\n\n vec2 pattern_tl_a = pattern_from.xy;\n vec2 pattern_br_a = pattern_from.zw;\n vec2 pattern_tl_b = pattern_to.xy;\n vec2 pattern_br_b = pattern_to.zw;\n\n vec2 imagecoord = mod(v_pos_a, 1.0);\n vec2 pos = mix(pattern_tl_a / u_texsize, pattern_br_a / u_texsize, imagecoord);\n vec4 color1 = texture2D(u_image, pos);\n\n vec2 imagecoord_b = mod(v_pos_b, 1.0);\n vec2 pos2 = mix(pattern_tl_b / u_texsize, pattern_br_b / u_texsize, imagecoord_b);\n vec4 color2 = texture2D(u_image, pos2);\n\n vec4 mixedColor = mix(color1, color2, u_fade);\n\n gl_FragColor = mixedColor * v_lighting;\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n"; var fillExtrusionPatternVert = "uniform mat4 u_matrix;\nuniform vec2 u_pixel_coord_upper;\nuniform vec2 u_pixel_coord_lower;\nuniform float u_height_factor;\nuniform vec4 u_scale;\nuniform float u_vertical_gradient;\nuniform lowp float u_opacity;\n\nuniform vec3 u_lightcolor;\nuniform lowp vec3 u_lightpos;\nuniform lowp float u_lightintensity;\n\nattribute vec2 a_pos;\nattribute vec4 a_normal_ed;\n\nvarying vec2 v_pos_a;\nvarying vec2 v_pos_b;\nvarying vec4 v_lighting;\n\n#pragma mapbox: define lowp float base\n#pragma mapbox: define lowp float height\n#pragma mapbox: define lowp vec4 pattern_from\n#pragma mapbox: define lowp vec4 pattern_to\n\nvoid main() {\n #pragma mapbox: initialize lowp float base\n #pragma mapbox: initialize lowp float height\n #pragma mapbox: initialize mediump vec4 pattern_from\n #pragma mapbox: initialize mediump vec4 pattern_to\n\n vec2 pattern_tl_a = pattern_from.xy;\n vec2 pattern_br_a = pattern_from.zw;\n vec2 pattern_tl_b = pattern_to.xy;\n vec2 pattern_br_b = pattern_to.zw;\n\n float pixelRatio = u_scale.x;\n float tileRatio = u_scale.y;\n float fromScale = u_scale.z;\n float toScale = u_scale.w;\n\n vec3 normal = a_normal_ed.xyz;\n float edgedistance = a_normal_ed.w;\n\n vec2 display_size_a = vec2((pattern_br_a.x - pattern_tl_a.x) / pixelRatio, (pattern_br_a.y - pattern_tl_a.y) / pixelRatio);\n vec2 display_size_b = vec2((pattern_br_b.x - pattern_tl_b.x) / pixelRatio, (pattern_br_b.y - pattern_tl_b.y) / pixelRatio);\n\n base = max(0.0, base);\n height = max(0.0, height);\n\n float t = mod(normal.x, 2.0);\n float z = t > 0.0 ? height : base;\n\n gl_Position = u_matrix * vec4(a_pos, z, 1);\n\n vec2 pos = normal.x == 1.0 && normal.y == 0.0 && normal.z == 16384.0\n ? a_pos // extrusion top\n : vec2(edgedistance, z * u_height_factor); // extrusion side\n\n v_pos_a = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, fromScale * display_size_a, tileRatio, pos);\n v_pos_b = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, toScale * display_size_b, tileRatio, pos);\n\n v_lighting = vec4(0.0, 0.0, 0.0, 1.0);\n float directional = clamp(dot(normal / 16383.0, u_lightpos), 0.0, 1.0);\n directional = mix((1.0 - u_lightintensity), max((0.5 + u_lightintensity), 1.0), directional);\n\n if (normal.y != 0.0) {\n // This avoids another branching statement, but multiplies by a constant of 0.84 if no vertical gradient,\n // and otherwise calculates the gradient based on base + height\n directional *= (\n (1.0 - u_vertical_gradient) +\n (u_vertical_gradient * clamp((t + base) * pow(height / 150.0, 0.5), mix(0.7, 0.98, 1.0 - u_lightintensity), 1.0)));\n }\n\n v_lighting.rgb += clamp(directional * u_lightcolor, mix(vec3(0.0), vec3(0.3), 1.0 - u_lightcolor), vec3(1.0));\n v_lighting *= u_opacity;\n}\n"; var hillshadePrepareFrag = "#ifdef GL_ES\nprecision highp float;\n#endif\n\nuniform sampler2D u_image;\nvarying vec2 v_pos;\nuniform vec2 u_dimension;\nuniform float u_zoom;\nuniform float u_maxzoom;\n\nfloat getElevation(vec2 coord, float bias) {\n // Convert encoded elevation value to meters\n vec4 data = texture2D(u_image, coord) * 255.0;\n return (data.r + data.g * 256.0 + data.b * 256.0 * 256.0) / 4.0;\n}\n\nvoid main() {\n vec2 epsilon = 1.0 / u_dimension;\n\n // queried pixels:\n // +-----------+\n // | | | |\n // | a | b | c |\n // | | | |\n // +-----------+\n // | | | |\n // | d | e | f |\n // | | | |\n // +-----------+\n // | | | |\n // | g | h | i |\n // | | | |\n // +-----------+\n\n float a = getElevation(v_pos + vec2(-epsilon.x, -epsilon.y), 0.0);\n float b = getElevation(v_pos + vec2(0, -epsilon.y), 0.0);\n float c = getElevation(v_pos + vec2(epsilon.x, -epsilon.y), 0.0);\n float d = getElevation(v_pos + vec2(-epsilon.x, 0), 0.0);\n float e = getElevation(v_pos, 0.0);\n float f = getElevation(v_pos + vec2(epsilon.x, 0), 0.0);\n float g = getElevation(v_pos + vec2(-epsilon.x, epsilon.y), 0.0);\n float h = getElevation(v_pos + vec2(0, epsilon.y), 0.0);\n float i = getElevation(v_pos + vec2(epsilon.x, epsilon.y), 0.0);\n\n // here we divide the x and y slopes by 8 * pixel size\n // where pixel size (aka meters/pixel) is:\n // circumference of the world / (pixels per tile * number of tiles)\n // which is equivalent to: 8 * 40075016.6855785 / (512 * pow(2, u_zoom))\n // which can be reduced to: pow(2, 19.25619978527 - u_zoom)\n // we want to vertically exaggerate the hillshading though, because otherwise\n // it is barely noticeable at low zooms. to do this, we multiply this by some\n // scale factor pow(2, (u_zoom - u_maxzoom) * a) where a is an arbitrary value\n // Here we use a=0.3 which works out to the expression below. see \n // nickidlugash's awesome breakdown for more info\n // https://github.com/mapbox/mapbox-gl-js/pull/5286#discussion_r148419556\n float exaggeration = u_zoom < 2.0 ? 0.4 : u_zoom < 4.5 ? 0.35 : 0.3;\n\n vec2 deriv = vec2(\n (c + f + f + i) - (a + d + d + g),\n (g + h + h + i) - (a + b + b + c)\n ) / pow(2.0, (u_zoom - u_maxzoom) * exaggeration + 19.2562 - u_zoom);\n\n gl_FragColor = clamp(vec4(\n deriv.x / 2.0 + 0.5,\n deriv.y / 2.0 + 0.5,\n 1.0,\n 1.0), 0.0, 1.0);\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n"; var hillshadePrepareVert = "uniform mat4 u_matrix;\nuniform vec2 u_dimension;\n\nattribute vec2 a_pos;\nattribute vec2 a_texture_pos;\n\nvarying vec2 v_pos;\n\nvoid main() {\n gl_Position = u_matrix * vec4(a_pos, 0, 1);\n\n highp vec2 epsilon = 1.0 / u_dimension;\n float scale = (u_dimension.x - 2.0) / u_dimension.x;\n v_pos = (a_texture_pos / 8192.0) * scale + epsilon;\n}\n"; var hillshadeFrag = "uniform sampler2D u_image;\nvarying vec2 v_pos;\n\nuniform vec2 u_latrange;\nuniform vec2 u_light;\nuniform vec4 u_shadow;\nuniform vec4 u_highlight;\nuniform vec4 u_accent;\n\n#define PI 3.141592653589793\n\nvoid main() {\n vec4 pixel = texture2D(u_image, v_pos);\n\n vec2 deriv = ((pixel.rg * 2.0) - 1.0);\n\n // We divide the slope by a scale factor based on the cosin of the pixel's approximate latitude\n // to account for mercator projection distortion. see #4807 for details\n float scaleFactor = cos(radians((u_latrange[0] - u_latrange[1]) * (1.0 - v_pos.y) + u_latrange[1]));\n // We also multiply the slope by an arbitrary z-factor of 1.25\n float slope = atan(1.25 * length(deriv) / scaleFactor);\n float aspect = deriv.x != 0.0 ? atan(deriv.y, -deriv.x) : PI / 2.0 * (deriv.y > 0.0 ? 1.0 : -1.0);\n\n float intensity = u_light.x;\n // We add PI to make this property match the global light object, which adds PI/2 to the light's azimuthal\n // position property to account for 0deg corresponding to north/the top of the viewport in the style spec\n // and the original shader was written to accept (-illuminationDirection - 90) as the azimuthal.\n float azimuth = u_light.y + PI;\n\n // We scale the slope exponentially based on intensity, using a calculation similar to\n // the exponential interpolation function in the style spec:\n // https://github.com/mapbox/mapbox-gl-js/blob/master/src/style-spec/expression/definitions/interpolate.js#L217-L228\n // so that higher intensity values create more opaque hillshading.\n float base = 1.875 - intensity * 1.75;\n float maxValue = 0.5 * PI;\n float scaledSlope = intensity != 0.5 ? ((pow(base, slope) - 1.0) / (pow(base, maxValue) - 1.0)) * maxValue : slope;\n\n // The accent color is calculated with the cosine of the slope while the shade color is calculated with the sine\n // so that the accent color's rate of change eases in while the shade color's eases out.\n float accent = cos(scaledSlope);\n // We multiply both the accent and shade color by a clamped intensity value\n // so that intensities >= 0.5 do not additionally affect the color values\n // while intensity values < 0.5 make the overall color more transparent.\n vec4 accent_color = (1.0 - accent) * u_accent * clamp(intensity * 2.0, 0.0, 1.0);\n float shade = abs(mod((aspect + azimuth) / PI + 0.5, 2.0) - 1.0);\n vec4 shade_color = mix(u_shadow, u_highlight, shade) * sin(scaledSlope) * clamp(intensity * 2.0, 0.0, 1.0);\n gl_FragColor = accent_color * (1.0 - shade_color.a) + shade_color;\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n"; var hillshadeVert = "uniform mat4 u_matrix;\n\nattribute vec2 a_pos;\nattribute vec2 a_texture_pos;\n\nvarying vec2 v_pos;\n\nvoid main() {\n gl_Position = u_matrix * vec4(a_pos, 0, 1);\n v_pos = a_texture_pos / 8192.0;\n}\n"; var lineFrag = "#pragma mapbox: define highp vec4 color\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n\nvarying vec2 v_width2;\nvarying vec2 v_normal;\nvarying float v_gamma_scale;\n\nvoid main() {\n #pragma mapbox: initialize highp vec4 color\n #pragma mapbox: initialize lowp float blur\n #pragma mapbox: initialize lowp float opacity\n\n // Calculate the distance of the pixel from the line in pixels.\n float dist = length(v_normal) * v_width2.s;\n\n // Calculate the antialiasing fade factor. This is either when fading in\n // the line in case of an offset line (v_width2.t) or when fading out\n // (v_width2.s)\n float blur2 = (blur + 1.0 / DEVICE_PIXEL_RATIO) * v_gamma_scale;\n float alpha = clamp(min(dist - (v_width2.t - blur2), v_width2.s - dist) / blur2, 0.0, 1.0);\n\n gl_FragColor = color * (alpha * opacity);\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n"; var lineVert = "\n\n// the distance over which the line edge fades out.\n// Retina devices need a smaller distance to avoid aliasing.\n#define ANTIALIASING 1.0 / DEVICE_PIXEL_RATIO / 2.0\n\n// floor(127 / 2) == 63.0\n// the maximum allowed miter limit is 2.0 at the moment. the extrude normal is\n// stored in a byte (-128..127). we scale regular normals up to length 63, but\n// there are also \"special\" normals that have a bigger length (of up to 126 in\n// this case).\n// #define scale 63.0\n#define scale 0.015873016\n\nattribute vec4 a_pos_normal;\nattribute vec4 a_data;\n\nuniform mat4 u_matrix;\nuniform mediump float u_ratio;\nuniform vec2 u_gl_units_to_pixels;\n\nvarying vec2 v_normal;\nvarying vec2 v_width2;\nvarying float v_gamma_scale;\nvarying highp float v_linesofar;\n\n#pragma mapbox: define highp vec4 color\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define mediump float gapwidth\n#pragma mapbox: define lowp float offset\n#pragma mapbox: define mediump float width\n\nvoid main() {\n #pragma mapbox: initialize highp vec4 color\n #pragma mapbox: initialize lowp float blur\n #pragma mapbox: initialize lowp float opacity\n #pragma mapbox: initialize mediump float gapwidth\n #pragma mapbox: initialize lowp float offset\n #pragma mapbox: initialize mediump float width\n\n vec2 a_extrude = a_data.xy - 128.0;\n float a_direction = mod(a_data.z, 4.0) - 1.0;\n\n v_linesofar = (floor(a_data.z / 4.0) + a_data.w * 64.0) * 2.0;\n\n vec2 pos = a_pos_normal.xy;\n\n // x is 1 if it's a round cap, 0 otherwise\n // y is 1 if the normal points up, and -1 if it points down\n mediump vec2 normal = a_pos_normal.zw;\n v_normal = normal;\n\n // these transformations used to be applied in the JS and native code bases.\n // moved them into the shader for clarity and simplicity.\n gapwidth = gapwidth / 2.0;\n float halfwidth = width / 2.0;\n offset = -1.0 * offset;\n\n float inset = gapwidth + (gapwidth > 0.0 ? ANTIALIASING : 0.0);\n float outset = gapwidth + halfwidth * (gapwidth > 0.0 ? 2.0 : 1.0) + (halfwidth == 0.0 ? 0.0 : ANTIALIASING);\n\n // Scale the extrusion vector down to a normal and then up by the line width\n // of this vertex.\n mediump vec2 dist = outset * a_extrude * scale;\n\n // Calculate the offset when drawing a line that is to the side of the actual line.\n // We do this by creating a vector that points towards the extrude, but rotate\n // it when we're drawing round end points (a_direction = -1 or 1) since their\n // extrude vector points in another direction.\n mediump float u = 0.5 * a_direction;\n mediump float t = 1.0 - abs(u);\n mediump vec2 offset2 = offset * a_extrude * scale * normal.y * mat2(t, -u, u, t);\n\n vec4 projected_extrude = u_matrix * vec4(dist / u_ratio, 0.0, 0.0);\n gl_Position = u_matrix * vec4(pos + offset2 / u_ratio, 0.0, 1.0) + projected_extrude;\n\n // calculate how much the perspective view squishes or stretches the extrude\n float extrude_length_without_perspective = length(dist);\n float extrude_length_with_perspective = length(projected_extrude.xy / gl_Position.w * u_gl_units_to_pixels);\n v_gamma_scale = extrude_length_without_perspective / extrude_length_with_perspective;\n\n v_width2 = vec2(outset, inset);\n}\n"; var lineGradientFrag = "\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n\nuniform sampler2D u_image;\n\nvarying vec2 v_width2;\nvarying vec2 v_normal;\nvarying float v_gamma_scale;\nvarying highp float v_lineprogress;\n\nvoid main() {\n #pragma mapbox: initialize lowp float blur\n #pragma mapbox: initialize lowp float opacity\n\n // Calculate the distance of the pixel from the line in pixels.\n float dist = length(v_normal) * v_width2.s;\n\n // Calculate the antialiasing fade factor. This is either when fading in\n // the line in case of an offset line (v_width2.t) or when fading out\n // (v_width2.s)\n float blur2 = (blur + 1.0 / DEVICE_PIXEL_RATIO) * v_gamma_scale;\n float alpha = clamp(min(dist - (v_width2.t - blur2), v_width2.s - dist) / blur2, 0.0, 1.0);\n\n // For gradient lines, v_lineprogress is the ratio along the entire line,\n // scaled to [0, 2^15), and the gradient ramp is stored in a texture.\n vec4 color = texture2D(u_image, vec2(v_lineprogress, 0.5));\n\n gl_FragColor = color * (alpha * opacity);\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n"; var lineGradientVert = "\n// the attribute conveying progress along a line is scaled to [0, 2^15)\n#define MAX_LINE_DISTANCE 32767.0\n\n// the distance over which the line edge fades out.\n// Retina devices need a smaller distance to avoid aliasing.\n#define ANTIALIASING 1.0 / DEVICE_PIXEL_RATIO / 2.0\n\n// floor(127 / 2) == 63.0\n// the maximum allowed miter limit is 2.0 at the moment. the extrude normal is\n// stored in a byte (-128..127). we scale regular normals up to length 63, but\n// there are also \"special\" normals that have a bigger length (of up to 126 in\n// this case).\n// #define scale 63.0\n#define scale 0.015873016\n\nattribute vec4 a_pos_normal;\nattribute vec4 a_data;\n\nuniform mat4 u_matrix;\nuniform mediump float u_ratio;\nuniform vec2 u_gl_units_to_pixels;\n\nvarying vec2 v_normal;\nvarying vec2 v_width2;\nvarying float v_gamma_scale;\nvarying highp float v_lineprogress;\n\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define mediump float gapwidth\n#pragma mapbox: define lowp float offset\n#pragma mapbox: define mediump float width\n\nvoid main() {\n #pragma mapbox: initialize lowp float blur\n #pragma mapbox: initialize lowp float opacity\n #pragma mapbox: initialize mediump float gapwidth\n #pragma mapbox: initialize lowp float offset\n #pragma mapbox: initialize mediump float width\n\n vec2 a_extrude = a_data.xy - 128.0;\n float a_direction = mod(a_data.z, 4.0) - 1.0;\n\n v_lineprogress = (floor(a_data.z / 4.0) + a_data.w * 64.0) * 2.0 / MAX_LINE_DISTANCE;\n\n vec2 pos = a_pos_normal.xy;\n\n // x is 1 if it's a round cap, 0 otherwise\n // y is 1 if the normal points up, and -1 if it points down\n mediump vec2 normal = a_pos_normal.zw;\n v_normal = normal;\n\n // these transformations used to be applied in the JS and native code bases.\n // moved them into the shader for clarity and simplicity.\n gapwidth = gapwidth / 2.0;\n float halfwidth = width / 2.0;\n offset = -1.0 * offset;\n\n float inset = gapwidth + (gapwidth > 0.0 ? ANTIALIASING : 0.0);\n float outset = gapwidth + halfwidth * (gapwidth > 0.0 ? 2.0 : 1.0) + (halfwidth == 0.0 ? 0.0 : ANTIALIASING);\n\n // Scale the extrusion vector down to a normal and then up by the line width\n // of this vertex.\n mediump vec2 dist = outset * a_extrude * scale;\n\n // Calculate the offset when drawing a line that is to the side of the actual line.\n // We do this by creating a vector that points towards the extrude, but rotate\n // it when we're drawing round end points (a_direction = -1 or 1) since their\n // extrude vector points in another direction.\n mediump float u = 0.5 * a_direction;\n mediump float t = 1.0 - abs(u);\n mediump vec2 offset2 = offset * a_extrude * scale * normal.y * mat2(t, -u, u, t);\n\n vec4 projected_extrude = u_matrix * vec4(dist / u_ratio, 0.0, 0.0);\n gl_Position = u_matrix * vec4(pos + offset2 / u_ratio, 0.0, 1.0) + projected_extrude;\n\n // calculate how much the perspective view squishes or stretches the extrude\n float extrude_length_without_perspective = length(dist);\n float extrude_length_with_perspective = length(projected_extrude.xy / gl_Position.w * u_gl_units_to_pixels);\n v_gamma_scale = extrude_length_without_perspective / extrude_length_with_perspective;\n\n v_width2 = vec2(outset, inset);\n}\n"; var linePatternFrag = "uniform vec2 u_texsize;\nuniform float u_fade;\nuniform mediump vec4 u_scale;\n\nuniform sampler2D u_image;\n\nvarying vec2 v_normal;\nvarying vec2 v_width2;\nvarying float v_linesofar;\nvarying float v_gamma_scale;\n\n#pragma mapbox: define lowp vec4 pattern_from\n#pragma mapbox: define lowp vec4 pattern_to\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n\nvoid main() {\n #pragma mapbox: initialize mediump vec4 pattern_from\n #pragma mapbox: initialize mediump vec4 pattern_to\n\n #pragma mapbox: initialize lowp float blur\n #pragma mapbox: initialize lowp float opacity\n\n vec2 pattern_tl_a = pattern_from.xy;\n vec2 pattern_br_a = pattern_from.zw;\n vec2 pattern_tl_b = pattern_to.xy;\n vec2 pattern_br_b = pattern_to.zw;\n\n float pixelRatio = u_scale.x;\n float tileZoomRatio = u_scale.y;\n float fromScale = u_scale.z;\n float toScale = u_scale.w;\n\n vec2 display_size_a = vec2((pattern_br_a.x - pattern_tl_a.x) / pixelRatio, (pattern_br_a.y - pattern_tl_a.y) / pixelRatio);\n vec2 display_size_b = vec2((pattern_br_b.x - pattern_tl_b.x) / pixelRatio, (pattern_br_b.y - pattern_tl_b.y) / pixelRatio);\n\n vec2 pattern_size_a = vec2(display_size_a.x * fromScale / tileZoomRatio, display_size_a.y);\n vec2 pattern_size_b = vec2(display_size_b.x * toScale / tileZoomRatio, display_size_b.y);\n\n // Calculate the distance of the pixel from the line in pixels.\n float dist = length(v_normal) * v_width2.s;\n\n // Calculate the antialiasing fade factor. This is either when fading in\n // the line in case of an offset line (v_width2.t) or when fading out\n // (v_width2.s)\n float blur2 = (blur + 1.0 / DEVICE_PIXEL_RATIO) * v_gamma_scale;\n float alpha = clamp(min(dist - (v_width2.t - blur2), v_width2.s - dist) / blur2, 0.0, 1.0);\n\n float x_a = mod(v_linesofar / pattern_size_a.x, 1.0);\n float x_b = mod(v_linesofar / pattern_size_b.x, 1.0);\n\n // v_normal.y is 0 at the midpoint of the line, -1 at the lower edge, 1 at the upper edge\n // we clamp the line width outset to be between 0 and half the pattern height plus padding (2.0)\n // to ensure we don't sample outside the designated symbol on the sprite sheet.\n // 0.5 is added to shift the component to be bounded between 0 and 1 for interpolation of\n // the texture coordinate\n float y_a = 0.5 + (v_normal.y * clamp(v_width2.s, 0.0, (pattern_size_a.y + 2.0) / 2.0) / pattern_size_a.y);\n float y_b = 0.5 + (v_normal.y * clamp(v_width2.s, 0.0, (pattern_size_b.y + 2.0) / 2.0) / pattern_size_b.y);\n vec2 pos_a = mix(pattern_tl_a / u_texsize, pattern_br_a / u_texsize, vec2(x_a, y_a));\n vec2 pos_b = mix(pattern_tl_b / u_texsize, pattern_br_b / u_texsize, vec2(x_b, y_b));\n\n vec4 color = mix(texture2D(u_image, pos_a), texture2D(u_image, pos_b), u_fade);\n\n gl_FragColor = color * alpha * opacity;\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n"; var linePatternVert = "// floor(127 / 2) == 63.0\n// the maximum allowed miter limit is 2.0 at the moment. the extrude normal is\n// stored in a byte (-128..127). we scale regular normals up to length 63, but\n// there are also \"special\" normals that have a bigger length (of up to 126 in\n// this case).\n// #define scale 63.0\n#define scale 0.015873016\n\n// We scale the distance before adding it to the buffers so that we can store\n// long distances for long segments. Use this value to unscale the distance.\n#define LINE_DISTANCE_SCALE 2.0\n\n// the distance over which the line edge fades out.\n// Retina devices need a smaller distance to avoid aliasing.\n#define ANTIALIASING 1.0 / DEVICE_PIXEL_RATIO / 2.0\n\nattribute vec4 a_pos_normal;\nattribute vec4 a_data;\n\nuniform mat4 u_matrix;\nuniform vec2 u_gl_units_to_pixels;\nuniform mediump float u_ratio;\n\nvarying vec2 v_normal;\nvarying vec2 v_width2;\nvarying float v_linesofar;\nvarying float v_gamma_scale;\n\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define lowp float offset\n#pragma mapbox: define mediump float gapwidth\n#pragma mapbox: define mediump float width\n#pragma mapbox: define lowp vec4 pattern_from\n#pragma mapbox: define lowp vec4 pattern_to\n\nvoid main() {\n #pragma mapbox: initialize lowp float blur\n #pragma mapbox: initialize lowp float opacity\n #pragma mapbox: initialize lowp float offset\n #pragma mapbox: initialize mediump float gapwidth\n #pragma mapbox: initialize mediump float width\n #pragma mapbox: initialize mediump vec4 pattern_from\n #pragma mapbox: initialize mediump vec4 pattern_to\n\n vec2 a_extrude = a_data.xy - 128.0;\n float a_direction = mod(a_data.z, 4.0) - 1.0;\n float a_linesofar = (floor(a_data.z / 4.0) + a_data.w * 64.0) * LINE_DISTANCE_SCALE;\n // float tileRatio = u_scale.y;\n vec2 pos = a_pos_normal.xy;\n\n // x is 1 if it's a round cap, 0 otherwise\n // y is 1 if the normal points up, and -1 if it points down\n mediump vec2 normal = a_pos_normal.zw;\n v_normal = normal;\n\n // these transformations used to be applied in the JS and native code bases.\n // moved them into the shader for clarity and simplicity.\n gapwidth = gapwidth / 2.0;\n float halfwidth = width / 2.0;\n offset = -1.0 * offset;\n\n float inset = gapwidth + (gapwidth > 0.0 ? ANTIALIASING : 0.0);\n float outset = gapwidth + halfwidth * (gapwidth > 0.0 ? 2.0 : 1.0) + (halfwidth == 0.0 ? 0.0 : ANTIALIASING);\n\n // Scale the extrusion vector down to a normal and then up by the line width\n // of this vertex.\n mediump vec2 dist = outset * a_extrude * scale;\n\n // Calculate the offset when drawing a line that is to the side of the actual line.\n // We do this by creating a vector that points towards the extrude, but rotate\n // it when we're drawing round end points (a_direction = -1 or 1) since their\n // extrude vector points in another direction.\n mediump float u = 0.5 * a_direction;\n mediump float t = 1.0 - abs(u);\n mediump vec2 offset2 = offset * a_extrude * scale * normal.y * mat2(t, -u, u, t);\n\n vec4 projected_extrude = u_matrix * vec4(dist / u_ratio, 0.0, 0.0);\n gl_Position = u_matrix * vec4(pos + offset2 / u_ratio, 0.0, 1.0) + projected_extrude;\n\n // calculate how much the perspective view squishes or stretches the extrude\n float extrude_length_without_perspective = length(dist);\n float extrude_length_with_perspective = length(projected_extrude.xy / gl_Position.w * u_gl_units_to_pixels);\n v_gamma_scale = extrude_length_without_perspective / extrude_length_with_perspective;\n\n v_linesofar = a_linesofar;\n v_width2 = vec2(outset, inset);\n}\n"; var lineSDFFrag = "\nuniform sampler2D u_image;\nuniform float u_sdfgamma;\nuniform float u_mix;\n\nvarying vec2 v_normal;\nvarying vec2 v_width2;\nvarying vec2 v_tex_a;\nvarying vec2 v_tex_b;\nvarying float v_gamma_scale;\n\n#pragma mapbox: define highp vec4 color\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define mediump float width\n#pragma mapbox: define lowp float floorwidth\n\nvoid main() {\n #pragma mapbox: initialize highp vec4 color\n #pragma mapbox: initialize lowp float blur\n #pragma mapbox: initialize lowp float opacity\n #pragma mapbox: initialize mediump float width\n #pragma mapbox: initialize lowp float floorwidth\n\n // Calculate the distance of the pixel from the line in pixels.\n float dist = length(v_normal) * v_width2.s;\n\n // Calculate the antialiasing fade factor. This is either when fading in\n // the line in case of an offset line (v_width2.t) or when fading out\n // (v_width2.s)\n float blur2 = (blur + 1.0 / DEVICE_PIXEL_RATIO) * v_gamma_scale;\n float alpha = clamp(min(dist - (v_width2.t - blur2), v_width2.s - dist) / blur2, 0.0, 1.0);\n\n float sdfdist_a = texture2D(u_image, v_tex_a).a;\n float sdfdist_b = texture2D(u_image, v_tex_b).a;\n float sdfdist = mix(sdfdist_a, sdfdist_b, u_mix);\n alpha *= smoothstep(0.5 - u_sdfgamma / floorwidth, 0.5 + u_sdfgamma / floorwidth, sdfdist);\n\n gl_FragColor = color * (alpha * opacity);\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n"; var lineSDFVert = "// floor(127 / 2) == 63.0\n// the maximum allowed miter limit is 2.0 at the moment. the extrude normal is\n// stored in a byte (-128..127). we scale regular normals up to length 63, but\n// there are also \"special\" normals that have a bigger length (of up to 126 in\n// this case).\n// #define scale 63.0\n#define scale 0.015873016\n\n// We scale the distance before adding it to the buffers so that we can store\n// long distances for long segments. Use this value to unscale the distance.\n#define LINE_DISTANCE_SCALE 2.0\n\n// the distance over which the line edge fades out.\n// Retina devices need a smaller distance to avoid aliasing.\n#define ANTIALIASING 1.0 / DEVICE_PIXEL_RATIO / 2.0\n\nattribute vec4 a_pos_normal;\nattribute vec4 a_data;\n\nuniform mat4 u_matrix;\nuniform mediump float u_ratio;\nuniform vec2 u_patternscale_a;\nuniform float u_tex_y_a;\nuniform vec2 u_patternscale_b;\nuniform float u_tex_y_b;\nuniform vec2 u_gl_units_to_pixels;\n\nvarying vec2 v_normal;\nvarying vec2 v_width2;\nvarying vec2 v_tex_a;\nvarying vec2 v_tex_b;\nvarying float v_gamma_scale;\n\n#pragma mapbox: define highp vec4 color\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define mediump float gapwidth\n#pragma mapbox: define lowp float offset\n#pragma mapbox: define mediump float width\n#pragma mapbox: define lowp float floorwidth\n\nvoid main() {\n #pragma mapbox: initialize highp vec4 color\n #pragma mapbox: initialize lowp float blur\n #pragma mapbox: initialize lowp float opacity\n #pragma mapbox: initialize mediump float gapwidth\n #pragma mapbox: initialize lowp float offset\n #pragma mapbox: initialize mediump float width\n #pragma mapbox: initialize lowp float floorwidth\n\n vec2 a_extrude = a_data.xy - 128.0;\n float a_direction = mod(a_data.z, 4.0) - 1.0;\n float a_linesofar = (floor(a_data.z / 4.0) + a_data.w * 64.0) * LINE_DISTANCE_SCALE;\n\n vec2 pos = a_pos_normal.xy;\n\n // x is 1 if it's a round cap, 0 otherwise\n // y is 1 if the normal points up, and -1 if it points down\n mediump vec2 normal = a_pos_normal.zw;\n v_normal = normal;\n\n // these transformations used to be applied in the JS and native code bases.\n // moved them into the shader for clarity and simplicity.\n gapwidth = gapwidth / 2.0;\n float halfwidth = width / 2.0;\n offset = -1.0 * offset;\n\n float inset = gapwidth + (gapwidth > 0.0 ? ANTIALIASING : 0.0);\n float outset = gapwidth + halfwidth * (gapwidth > 0.0 ? 2.0 : 1.0) + (halfwidth == 0.0 ? 0.0 : ANTIALIASING);\n\n // Scale the extrusion vector down to a normal and then up by the line width\n // of this vertex.\n mediump vec2 dist =outset * a_extrude * scale;\n\n // Calculate the offset when drawing a line that is to the side of the actual line.\n // We do this by creating a vector that points towards the extrude, but rotate\n // it when we're drawing round end points (a_direction = -1 or 1) since their\n // extrude vector points in another direction.\n mediump float u = 0.5 * a_direction;\n mediump float t = 1.0 - abs(u);\n mediump vec2 offset2 = offset * a_extrude * scale * normal.y * mat2(t, -u, u, t);\n\n vec4 projected_extrude = u_matrix * vec4(dist / u_ratio, 0.0, 0.0);\n gl_Position = u_matrix * vec4(pos + offset2 / u_ratio, 0.0, 1.0) + projected_extrude;\n\n // calculate how much the perspective view squishes or stretches the extrude\n float extrude_length_without_perspective = length(dist);\n float extrude_length_with_perspective = length(projected_extrude.xy / gl_Position.w * u_gl_units_to_pixels);\n v_gamma_scale = extrude_length_without_perspective / extrude_length_with_perspective;\n\n v_tex_a = vec2(a_linesofar * u_patternscale_a.x / floorwidth, normal.y * u_patternscale_a.y + u_tex_y_a);\n v_tex_b = vec2(a_linesofar * u_patternscale_b.x / floorwidth, normal.y * u_patternscale_b.y + u_tex_y_b);\n\n v_width2 = vec2(outset, inset);\n}\n"; var rasterFrag = "uniform float u_fade_t;\nuniform float u_opacity;\nuniform sampler2D u_image0;\nuniform sampler2D u_image1;\nvarying vec2 v_pos0;\nvarying vec2 v_pos1;\n\nuniform float u_brightness_low;\nuniform float u_brightness_high;\n\nuniform float u_saturation_factor;\nuniform float u_contrast_factor;\nuniform vec3 u_spin_weights;\n\nvoid main() {\n\n // read and cross-fade colors from the main and parent tiles\n vec4 color0 = texture2D(u_image0, v_pos0);\n vec4 color1 = texture2D(u_image1, v_pos1);\n if (color0.a > 0.0) {\n color0.rgb = color0.rgb / color0.a;\n }\n if (color1.a > 0.0) {\n color1.rgb = color1.rgb / color1.a;\n }\n vec4 color = mix(color0, color1, u_fade_t);\n color.a *= u_opacity;\n vec3 rgb = color.rgb;\n\n // spin\n rgb = vec3(\n dot(rgb, u_spin_weights.xyz),\n dot(rgb, u_spin_weights.zxy),\n dot(rgb, u_spin_weights.yzx));\n\n // saturation\n float average = (color.r + color.g + color.b) / 3.0;\n rgb += (average - rgb) * u_saturation_factor;\n\n // contrast\n rgb = (rgb - 0.5) * u_contrast_factor + 0.5;\n\n // brightness\n vec3 u_high_vec = vec3(u_brightness_low, u_brightness_low, u_brightness_low);\n vec3 u_low_vec = vec3(u_brightness_high, u_brightness_high, u_brightness_high);\n\n gl_FragColor = vec4(mix(u_high_vec, u_low_vec, rgb) * color.a, color.a);\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n"; var rasterVert = "uniform mat4 u_matrix;\nuniform vec2 u_tl_parent;\nuniform float u_scale_parent;\nuniform float u_buffer_scale;\n\nattribute vec2 a_pos;\nattribute vec2 a_texture_pos;\n\nvarying vec2 v_pos0;\nvarying vec2 v_pos1;\n\nvoid main() {\n gl_Position = u_matrix * vec4(a_pos, 0, 1);\n // We are using Int16 for texture position coordinates to give us enough precision for\n // fractional coordinates. We use 8192 to scale the texture coordinates in the buffer\n // as an arbitrarily high number to preserve adequate precision when rendering.\n // This is also the same value as the EXTENT we are using for our tile buffer pos coordinates,\n // so math for modifying either is consistent.\n v_pos0 = (((a_texture_pos / 8192.0) - 0.5) / u_buffer_scale ) + 0.5;\n v_pos1 = (v_pos0 * u_scale_parent) + u_tl_parent;\n}\n"; var symbolIconFrag = "uniform sampler2D u_texture;\n\n#pragma mapbox: define lowp float opacity\n\nvarying vec2 v_tex;\nvarying float v_fade_opacity;\n\nvoid main() {\n #pragma mapbox: initialize lowp float opacity\n\n lowp float alpha = opacity * v_fade_opacity;\n gl_FragColor = texture2D(u_texture, v_tex) * alpha;\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n"; var symbolIconVert = "const float PI = 3.141592653589793;\n\nattribute vec4 a_pos_offset;\nattribute vec4 a_data;\nattribute vec3 a_projected_pos;\nattribute float a_fade_opacity;\n\nuniform bool u_is_size_zoom_constant;\nuniform bool u_is_size_feature_constant;\nuniform highp float u_size_t; // used to interpolate between zoom stops when size is a composite function\nuniform highp float u_size; // used when size is both zoom and feature constant\nuniform highp float u_camera_to_center_distance;\nuniform highp float u_pitch;\nuniform bool u_rotate_symbol;\nuniform highp float u_aspect_ratio;\nuniform float u_fade_change;\n\n#pragma mapbox: define lowp float opacity\n\nuniform mat4 u_matrix;\nuniform mat4 u_label_plane_matrix;\nuniform mat4 u_gl_coord_matrix;\n\nuniform bool u_is_text;\nuniform bool u_pitch_with_map;\n\nuniform vec2 u_texsize;\n\nvarying vec2 v_tex;\nvarying float v_fade_opacity;\n\nvoid main() {\n #pragma mapbox: initialize lowp float opacity\n\n vec2 a_pos = a_pos_offset.xy;\n vec2 a_offset = a_pos_offset.zw;\n\n vec2 a_tex = a_data.xy;\n vec2 a_size = a_data.zw;\n\n highp float segment_angle = -a_projected_pos[2];\n\n float size;\n if (!u_is_size_zoom_constant && !u_is_size_feature_constant) {\n size = mix(a_size[0], a_size[1], u_size_t) / 256.0;\n } else if (u_is_size_zoom_constant && !u_is_size_feature_constant) {\n size = a_size[0] / 256.0;\n } else if (!u_is_size_zoom_constant && u_is_size_feature_constant) {\n size = u_size;\n } else {\n size = u_size;\n }\n\n vec4 projectedPoint = u_matrix * vec4(a_pos, 0, 1);\n highp float camera_to_anchor_distance = projectedPoint.w;\n // See comments in symbol_sdf.vertex\n highp float distance_ratio = u_pitch_with_map ?\n camera_to_anchor_distance / u_camera_to_center_distance :\n u_camera_to_center_distance / camera_to_anchor_distance;\n highp float perspective_ratio = clamp(\n 0.5 + 0.5 * distance_ratio,\n 0.0, // Prevents oversized near-field symbols in pitched/overzoomed tiles\n 4.0);\n\n size *= perspective_ratio;\n\n float fontScale = u_is_text ? size / 24.0 : size;\n\n highp float symbol_rotation = 0.0;\n if (u_rotate_symbol) {\n // See comments in symbol_sdf.vertex\n vec4 offsetProjectedPoint = u_matrix * vec4(a_pos + vec2(1, 0), 0, 1);\n\n vec2 a = projectedPoint.xy / projectedPoint.w;\n vec2 b = offsetProjectedPoint.xy / offsetProjectedPoint.w;\n\n symbol_rotation = atan((b.y - a.y) / u_aspect_ratio, b.x - a.x);\n }\n\n highp float angle_sin = sin(segment_angle + symbol_rotation);\n highp float angle_cos = cos(segment_angle + symbol_rotation);\n mat2 rotation_matrix = mat2(angle_cos, -1.0 * angle_sin, angle_sin, angle_cos);\n\n vec4 projected_pos = u_label_plane_matrix * vec4(a_projected_pos.xy, 0.0, 1.0);\n gl_Position = u_gl_coord_matrix * vec4(projected_pos.xy / projected_pos.w + rotation_matrix * (a_offset / 32.0 * fontScale), 0.0, 1.0);\n\n v_tex = a_tex / u_texsize;\n vec2 fade_opacity = unpack_opacity(a_fade_opacity);\n float fade_change = fade_opacity[1] > 0.5 ? u_fade_change : -u_fade_change;\n v_fade_opacity = max(0.0, min(1.0, fade_opacity[0] + fade_change));\n}\n"; var symbolSDFFrag = "#define SDF_PX 8.0\n#define EDGE_GAMMA 0.105/DEVICE_PIXEL_RATIO\n\nuniform bool u_is_halo;\n#pragma mapbox: define highp vec4 fill_color\n#pragma mapbox: define highp vec4 halo_color\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define lowp float halo_width\n#pragma mapbox: define lowp float halo_blur\n\nuniform sampler2D u_texture;\nuniform highp float u_gamma_scale;\nuniform bool u_is_text;\n\nvarying vec2 v_data0;\nvarying vec3 v_data1;\n\nvoid main() {\n #pragma mapbox: initialize highp vec4 fill_color\n #pragma mapbox: initialize highp vec4 halo_color\n #pragma mapbox: initialize lowp float opacity\n #pragma mapbox: initialize lowp float halo_width\n #pragma mapbox: initialize lowp float halo_blur\n\n vec2 tex = v_data0.xy;\n float gamma_scale = v_data1.x;\n float size = v_data1.y;\n float fade_opacity = v_data1[2];\n\n float fontScale = u_is_text ? size / 24.0 : size;\n\n lowp vec4 color = fill_color;\n highp float gamma = EDGE_GAMMA / (fontScale * u_gamma_scale);\n lowp float buff = (256.0 - 64.0) / 256.0;\n if (u_is_halo) {\n color = halo_color;\n gamma = (halo_blur * 1.19 / SDF_PX + EDGE_GAMMA) / (fontScale * u_gamma_scale);\n buff = (6.0 - halo_width / fontScale) / SDF_PX;\n }\n\n lowp float dist = texture2D(u_texture, tex).a;\n highp float gamma_scaled = gamma * gamma_scale;\n highp float alpha = smoothstep(buff - gamma_scaled, buff + gamma_scaled, dist);\n\n gl_FragColor = color * (alpha * opacity * fade_opacity);\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n"; var symbolSDFVert = "const float PI = 3.141592653589793;\n\nattribute vec4 a_pos_offset;\nattribute vec4 a_data;\nattribute vec3 a_projected_pos;\nattribute float a_fade_opacity;\n\n// contents of a_size vary based on the type of property value\n// used for {text,icon}-size.\n// For constants, a_size is disabled.\n// For source functions, we bind only one value per vertex: the value of {text,icon}-size evaluated for the current feature.\n// For composite functions:\n// [ text-size(lowerZoomStop, feature),\n// text-size(upperZoomStop, feature) ]\nuniform bool u_is_size_zoom_constant;\nuniform bool u_is_size_feature_constant;\nuniform highp float u_size_t; // used to interpolate between zoom stops when size is a composite function\nuniform highp float u_size; // used when size is both zoom and feature constant\n\n#pragma mapbox: define highp vec4 fill_color\n#pragma mapbox: define highp vec4 halo_color\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define lowp float halo_width\n#pragma mapbox: define lowp float halo_blur\n\nuniform mat4 u_matrix;\nuniform mat4 u_label_plane_matrix;\nuniform mat4 u_gl_coord_matrix;\n\nuniform bool u_is_text;\nuniform bool u_pitch_with_map;\nuniform highp float u_pitch;\nuniform bool u_rotate_symbol;\nuniform highp float u_aspect_ratio;\nuniform highp float u_camera_to_center_distance;\nuniform float u_fade_change;\n\nuniform vec2 u_texsize;\n\nvarying vec2 v_data0;\nvarying vec3 v_data1;\n\nvoid main() {\n #pragma mapbox: initialize highp vec4 fill_color\n #pragma mapbox: initialize highp vec4 halo_color\n #pragma mapbox: initialize lowp float opacity\n #pragma mapbox: initialize lowp float halo_width\n #pragma mapbox: initialize lowp float halo_blur\n\n vec2 a_pos = a_pos_offset.xy;\n vec2 a_offset = a_pos_offset.zw;\n\n vec2 a_tex = a_data.xy;\n vec2 a_size = a_data.zw;\n\n highp float segment_angle = -a_projected_pos[2];\n float size;\n\n if (!u_is_size_zoom_constant && !u_is_size_feature_constant) {\n size = mix(a_size[0], a_size[1], u_size_t) / 256.0;\n } else if (u_is_size_zoom_constant && !u_is_size_feature_constant) {\n size = a_size[0] / 256.0;\n } else if (!u_is_size_zoom_constant && u_is_size_feature_constant) {\n size = u_size;\n } else {\n size = u_size;\n }\n\n vec4 projectedPoint = u_matrix * vec4(a_pos, 0, 1);\n highp float camera_to_anchor_distance = projectedPoint.w;\n // If the label is pitched with the map, layout is done in pitched space,\n // which makes labels in the distance smaller relative to viewport space.\n // We counteract part of that effect by multiplying by the perspective ratio.\n // If the label isn't pitched with the map, we do layout in viewport space,\n // which makes labels in the distance larger relative to the features around\n // them. We counteract part of that effect by dividing by the perspective ratio.\n highp float distance_ratio = u_pitch_with_map ?\n camera_to_anchor_distance / u_camera_to_center_distance :\n u_camera_to_center_distance / camera_to_anchor_distance;\n highp float perspective_ratio = clamp(\n 0.5 + 0.5 * distance_ratio,\n 0.0, // Prevents oversized near-field symbols in pitched/overzoomed tiles\n 4.0);\n\n size *= perspective_ratio;\n\n float fontScale = u_is_text ? size / 24.0 : size;\n\n highp float symbol_rotation = 0.0;\n if (u_rotate_symbol) {\n // Point labels with 'rotation-alignment: map' are horizontal with respect to tile units\n // To figure out that angle in projected space, we draw a short horizontal line in tile\n // space, project it, and measure its angle in projected space.\n vec4 offsetProjectedPoint = u_matrix * vec4(a_pos + vec2(1, 0), 0, 1);\n\n vec2 a = projectedPoint.xy / projectedPoint.w;\n vec2 b = offsetProjectedPoint.xy / offsetProjectedPoint.w;\n\n symbol_rotation = atan((b.y - a.y) / u_aspect_ratio, b.x - a.x);\n }\n\n highp float angle_sin = sin(segment_angle + symbol_rotation);\n highp float angle_cos = cos(segment_angle + symbol_rotation);\n mat2 rotation_matrix = mat2(angle_cos, -1.0 * angle_sin, angle_sin, angle_cos);\n\n vec4 projected_pos = u_label_plane_matrix * vec4(a_projected_pos.xy, 0.0, 1.0);\n gl_Position = u_gl_coord_matrix * vec4(projected_pos.xy / projected_pos.w + rotation_matrix * (a_offset / 32.0 * fontScale), 0.0, 1.0);\n float gamma_scale = gl_Position.w;\n\n vec2 tex = a_tex / u_texsize;\n vec2 fade_opacity = unpack_opacity(a_fade_opacity);\n float fade_change = fade_opacity[1] > 0.5 ? u_fade_change : -u_fade_change;\n float interpolated_fade_opacity = max(0.0, min(1.0, fade_opacity[0] + fade_change));\n\n v_data0 = vec2(tex.x, tex.y);\n v_data1 = vec3(gamma_scale, size, interpolated_fade_opacity);\n}\n"; var prelude = compile(preludeFrag, preludeVert); var background = compile(backgroundFrag, backgroundVert); var backgroundPattern = compile(backgroundPatternFrag, backgroundPatternVert); var circle = compile(circleFrag, circleVert); var clippingMask = compile(clippingMaskFrag, clippingMaskVert); var heatmap = compile(heatmapFrag, heatmapVert); var heatmapTexture = compile(heatmapTextureFrag, heatmapTextureVert); var collisionBox = compile(collisionBoxFrag, collisionBoxVert); var collisionCircle = compile(collisionCircleFrag, collisionCircleVert); var debug = compile(debugFrag, debugVert); var fill = compile(fillFrag, fillVert); var fillOutline = compile(fillOutlineFrag, fillOutlineVert); var fillOutlinePattern = compile(fillOutlinePatternFrag, fillOutlinePatternVert); var fillPattern = compile(fillPatternFrag, fillPatternVert); var fillExtrusion = compile(fillExtrusionFrag, fillExtrusionVert); var fillExtrusionPattern = compile(fillExtrusionPatternFrag, fillExtrusionPatternVert); var hillshadePrepare = compile(hillshadePrepareFrag, hillshadePrepareVert); var hillshade = compile(hillshadeFrag, hillshadeVert); var line = compile(lineFrag, lineVert); var lineGradient = compile(lineGradientFrag, lineGradientVert); var linePattern = compile(linePatternFrag, linePatternVert); var lineSDF = compile(lineSDFFrag, lineSDFVert); var raster = compile(rasterFrag, rasterVert); var symbolIcon = compile(symbolIconFrag, symbolIconVert); var symbolSDF = compile(symbolSDFFrag, symbolSDFVert); // Expand #pragmas to #ifdefs. function compile(fragmentSource, vertexSource) { var re = /#pragma mapbox: ([\w]+) ([\w]+) ([\w]+) ([\w]+)/g; var fragmentPragmas = {}; fragmentSource = fragmentSource.replace(re, function (match, operation, precision, type, name) { fragmentPragmas[name] = true; if (operation === 'define') { return ("\n#ifndef HAS_UNIFORM_u_" + name + "\nvarying " + precision + " " + type + " " + name + ";\n#else\nuniform " + precision + " " + type + " u_" + name + ";\n#endif\n"); } else /* if (operation === 'initialize') */ { return ("\n#ifdef HAS_UNIFORM_u_" + name + "\n " + precision + " " + type + " " + name + " = u_" + name + ";\n#endif\n"); } }); vertexSource = vertexSource.replace(re, function (match, operation, precision, type, name) { var attrType = type === 'float' ? 'vec2' : 'vec4'; var unpackType = name.match(/color/) ? 'color' : attrType; if (fragmentPragmas[name]) { if (operation === 'define') { return ("\n#ifndef HAS_UNIFORM_u_" + name + "\nuniform lowp float a_" + name + "_t;\nattribute " + precision + " " + attrType + " a_" + name + ";\nvarying " + precision + " " + type + " " + name + ";\n#else\nuniform " + precision + " " + type + " u_" + name + ";\n#endif\n"); } else /* if (operation === 'initialize') */ { if (unpackType === 'vec4') { // vec4 attributes are only used for cross-faded properties, and are not packed return ("\n#ifndef HAS_UNIFORM_u_" + name + "\n " + name + " = a_" + name + ";\n#else\n " + precision + " " + type + " " + name + " = u_" + name + ";\n#endif\n"); } else { return ("\n#ifndef HAS_UNIFORM_u_" + name + "\n " + name + " = unpack_mix_" + unpackType + "(a_" + name + ", a_" + name + "_t);\n#else\n " + precision + " " + type + " " + name + " = u_" + name + ";\n#endif\n"); } } } else { if (operation === 'define') { return ("\n#ifndef HAS_UNIFORM_u_" + name + "\nuniform lowp float a_" + name + "_t;\nattribute " + precision + " " + attrType + " a_" + name + ";\n#else\nuniform " + precision + " " + type + " u_" + name + ";\n#endif\n"); } else /* if (operation === 'initialize') */ { if (unpackType === 'vec4') { // vec4 attributes are only used for cross-faded properties, and are not packed return ("\n#ifndef HAS_UNIFORM_u_" + name + "\n " + precision + " " + type + " " + name + " = a_" + name + ";\n#else\n " + precision + " " + type + " " + name + " = u_" + name + ";\n#endif\n"); } else /* */{ return ("\n#ifndef HAS_UNIFORM_u_" + name + "\n " + precision + " " + type + " " + name + " = unpack_mix_" + unpackType + "(a_" + name + ", a_" + name + "_t);\n#else\n " + precision + " " + type + " " + name + " = u_" + name + ";\n#endif\n"); } } } }); return {fragmentSource: fragmentSource, vertexSource: vertexSource}; } var shaders = /*#__PURE__*/Object.freeze({ prelude: prelude, background: background, backgroundPattern: backgroundPattern, circle: circle, clippingMask: clippingMask, heatmap: heatmap, heatmapTexture: heatmapTexture, collisionBox: collisionBox, collisionCircle: collisionCircle, debug: debug, fill: fill, fillOutline: fillOutline, fillOutlinePattern: fillOutlinePattern, fillPattern: fillPattern, fillExtrusion: fillExtrusion, fillExtrusionPattern: fillExtrusionPattern, hillshadePrepare: hillshadePrepare, hillshade: hillshade, line: line, lineGradient: lineGradient, linePattern: linePattern, lineSDF: lineSDF, raster: raster, symbolIcon: symbolIcon, symbolSDF: symbolSDF }); // var VertexArrayObject = function VertexArrayObject() { this.boundProgram = null; this.boundLayoutVertexBuffer = null; this.boundPaintVertexBuffers = []; this.boundIndexBuffer = null; this.boundVertexOffset = null; this.boundDynamicVertexBuffer = null; this.vao = null; }; VertexArrayObject.prototype.bind = function bind (context , program , layoutVertexBuffer , paintVertexBuffers , indexBuffer , vertexOffset , dynamicVertexBuffer , dynamicVertexBuffer2 ) { this.context = context; var paintBuffersDiffer = this.boundPaintVertexBuffers.length !== paintVertexBuffers.length; for (var i = 0; !paintBuffersDiffer && i < paintVertexBuffers.length; i++) { if (this.boundPaintVertexBuffers[i] !== paintVertexBuffers[i]) { paintBuffersDiffer = true; } } var isFreshBindRequired = ( !this.vao || this.boundProgram !== program || this.boundLayoutVertexBuffer !== layoutVertexBuffer || paintBuffersDiffer || this.boundIndexBuffer !== indexBuffer || this.boundVertexOffset !== vertexOffset || this.boundDynamicVertexBuffer !== dynamicVertexBuffer || this.boundDynamicVertexBuffer2 !== dynamicVertexBuffer2 ); if (!context.extVertexArrayObject || isFreshBindRequired) { this.freshBind(program, layoutVertexBuffer, paintVertexBuffers, indexBuffer, vertexOffset, dynamicVertexBuffer, dynamicVertexBuffer2); } else { context.bindVertexArrayOES.set(this.vao); if (dynamicVertexBuffer) { // The buffer may have been updated. Rebind to upload data. dynamicVertexBuffer.bind(); } if (indexBuffer && indexBuffer.dynamicDraw) { indexBuffer.bind(); } if (dynamicVertexBuffer2) { dynamicVertexBuffer2.bind(); } } }; VertexArrayObject.prototype.freshBind = function freshBind (program , layoutVertexBuffer , paintVertexBuffers , indexBuffer , vertexOffset , dynamicVertexBuffer , dynamicVertexBuffer2 ) { var numPrevAttributes; var numNextAttributes = program.numAttributes; var context = this.context; var gl = context.gl; if (context.extVertexArrayObject) { if (this.vao) { this.destroy(); } this.vao = context.extVertexArrayObject.createVertexArrayOES(); context.bindVertexArrayOES.set(this.vao); numPrevAttributes = 0; // store the arguments so that we can verify them when the vao is bound again this.boundProgram = program; this.boundLayoutVertexBuffer = layoutVertexBuffer; this.boundPaintVertexBuffers = paintVertexBuffers; this.boundIndexBuffer = indexBuffer; this.boundVertexOffset = vertexOffset; this.boundDynamicVertexBuffer = dynamicVertexBuffer; this.boundDynamicVertexBuffer2 = dynamicVertexBuffer2; } else { numPrevAttributes = context.currentNumAttributes || 0; // Disable all attributes from the previous program that aren't used in // the new program. Note: attribute indices are *not* program specific! for (var i = numNextAttributes; i < numPrevAttributes; i++) { // WebGL breaks if you disable attribute 0. // http://stackoverflow.com/questions/20305231 __chunk_1.assert(i !== 0); gl.disableVertexAttribArray(i); } } layoutVertexBuffer.enableAttributes(gl, program); for (var i$1 = 0, list = paintVertexBuffers; i$1 < list.length; i$1 += 1) { var vertexBuffer = list[i$1]; vertexBuffer.enableAttributes(gl, program); } if (dynamicVertexBuffer) { dynamicVertexBuffer.enableAttributes(gl, program); } if (dynamicVertexBuffer2) { dynamicVertexBuffer2.enableAttributes(gl, program); } layoutVertexBuffer.bind(); layoutVertexBuffer.setVertexAttribPointers(gl, program, vertexOffset); for (var i$2 = 0, list$1 = paintVertexBuffers; i$2 < list$1.length; i$2 += 1) { var vertexBuffer$1 = list$1[i$2]; vertexBuffer$1.bind(); vertexBuffer$1.setVertexAttribPointers(gl, program, vertexOffset); } if (dynamicVertexBuffer) { dynamicVertexBuffer.bind(); dynamicVertexBuffer.setVertexAttribPointers(gl, program, vertexOffset); } if (indexBuffer) { indexBuffer.bind(); } if (dynamicVertexBuffer2) { dynamicVertexBuffer2.bind(); dynamicVertexBuffer2.setVertexAttribPointers(gl, program, vertexOffset); } context.currentNumAttributes = numNextAttributes; }; VertexArrayObject.prototype.destroy = function destroy () { if (this.vao) { this.context.extVertexArrayObject.deleteVertexArrayOES(this.vao); this.vao = null; } }; // var Program$1 = function Program(context , source , configuration , fixedUniforms , showOverdrawInspector ) { var gl = context.gl; this.program = gl.createProgram(); var defines = configuration.defines().concat( ("#define DEVICE_PIXEL_RATIO " + (__chunk_1.browser.devicePixelRatio.toFixed(1)))); if (showOverdrawInspector) { defines.push('#define OVERDRAW_INSPECTOR;'); } var fragmentSource = defines.concat(prelude.fragmentSource, source.fragmentSource).join('\n'); var vertexSource = defines.concat(prelude.vertexSource, source.vertexSource).join('\n'); var fragmentShader = gl.createShader(gl.FRAGMENT_SHADER); gl.shaderSource(fragmentShader, fragmentSource); gl.compileShader(fragmentShader); __chunk_1.assert(gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS), (gl.getShaderInfoLog(fragmentShader) )); gl.attachShader(this.program, fragmentShader); var vertexShader = gl.createShader(gl.VERTEX_SHADER); gl.shaderSource(vertexShader, vertexSource); gl.compileShader(vertexShader); __chunk_1.assert(gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS), (gl.getShaderInfoLog(vertexShader) )); gl.attachShader(this.program, vertexShader); // Manually bind layout attributes in the order defined by their // ProgramInterface so that we don't dynamically link an unused // attribute at position 0, which can cause rendering to fail for an // entire layer (see #4607, #4728) var layoutAttributes = configuration.layoutAttributes || []; for (var i = 0; i < layoutAttributes.length; i++) { gl.bindAttribLocation(this.program, i, layoutAttributes[i].name); } gl.linkProgram(this.program); __chunk_1.assert(gl.getProgramParameter(this.program, gl.LINK_STATUS), (gl.getProgramInfoLog(this.program) )); this.numAttributes = gl.getProgramParameter(this.program, gl.ACTIVE_ATTRIBUTES); this.attributes = {}; var uniformLocations = {}; for (var i$1 = 0; i$1 < this.numAttributes; i$1++) { var attribute = gl.getActiveAttrib(this.program, i$1); if (attribute) { this.attributes[attribute.name] = gl.getAttribLocation(this.program, attribute.name); } } var numUniforms = gl.getProgramParameter(this.program, gl.ACTIVE_UNIFORMS); for (var i$2 = 0; i$2 < numUniforms; i$2++) { var uniform = gl.getActiveUniform(this.program, i$2); if (uniform) { uniformLocations[uniform.name] = gl.getUniformLocation(this.program, uniform.name); } } this.fixedUniforms = fixedUniforms(context, uniformLocations); this.binderUniforms = configuration.getUniforms(context, uniformLocations); }; Program$1.prototype.draw = function draw (context , drawMode , depthMode , stencilMode , colorMode , cullFaceMode , uniformValues , layerID , layoutVertexBuffer , indexBuffer , segments , currentProperties , zoom , configuration , dynamicLayoutBuffer , dynamicLayoutBuffer2 ) { var obj; var gl = context.gl; context.program.set(this.program); context.setDepthMode(depthMode); context.setStencilMode(stencilMode); context.setColorMode(colorMode); context.setCullFace(cullFaceMode); for (var name in this.fixedUniforms) { this.fixedUniforms[name].set(uniformValues[name]); } if (configuration) { configuration.setUniforms(context, this.binderUniforms, currentProperties, {zoom: (zoom )}); } var primitiveSize = ( obj = {}, obj[gl.LINES] = 2, obj[gl.TRIANGLES] = 3, obj[gl.LINE_STRIP] = 1, obj )[drawMode]; for (var i = 0, list = segments.get(); i < list.length; i += 1) { var segment = list[i]; var vaos = segment.vaos || (segment.vaos = {}); var vao = vaos[layerID] || (vaos[layerID] = new VertexArrayObject()); vao.bind( context, this, layoutVertexBuffer, configuration ? configuration.getPaintVertexBuffers() : [], indexBuffer, segment.vertexOffset, dynamicLayoutBuffer, dynamicLayoutBuffer2 ); gl.drawElements( drawMode, segment.primitiveLength * primitiveSize, gl.UNSIGNED_SHORT, segment.primitiveOffset * primitiveSize * 2); } }; // function patternUniformValues(crossfade , painter , tile ) { var tileRatio = 1 / pixelsToTileUnits(tile, 1, painter.transform.tileZoom); var numTiles = Math.pow(2, tile.tileID.overscaledZ); var tileSizeAtNearestZoom = tile.tileSize * Math.pow(2, painter.transform.tileZoom) / numTiles; var pixelX = tileSizeAtNearestZoom * (tile.tileID.canonical.x + tile.tileID.wrap * numTiles); var pixelY = tileSizeAtNearestZoom * tile.tileID.canonical.y; return { 'u_image': 0, 'u_texsize': tile.imageAtlasTexture.size, // this assumes all images in the icon atlas texture have the same pixel ratio 'u_scale': [__chunk_1.browser.devicePixelRatio, tileRatio, crossfade.fromScale, crossfade.toScale], 'u_fade': crossfade.t, // split the pixel coord into two pairs of 16 bit numbers. The glsl spec only guarantees 16 bits of precision. 'u_pixel_coord_upper': [pixelX >> 16, pixelY >> 16], 'u_pixel_coord_lower': [pixelX & 0xFFFF, pixelY & 0xFFFF] }; } function bgPatternUniformValues(image , crossfade , painter , tile ) { var imagePosA = painter.imageManager.getPattern(image.from); var imagePosB = painter.imageManager.getPattern(image.to); __chunk_1.assert(imagePosA && imagePosB); var ref = painter.imageManager.getPixelSize(); var width = ref.width; var height = ref.height; var numTiles = Math.pow(2, tile.tileID.overscaledZ); var tileSizeAtNearestZoom = tile.tileSize * Math.pow(2, painter.transform.tileZoom) / numTiles; var pixelX = tileSizeAtNearestZoom * (tile.tileID.canonical.x + tile.tileID.wrap * numTiles); var pixelY = tileSizeAtNearestZoom * tile.tileID.canonical.y; return { 'u_image': 0, 'u_pattern_tl_a': (imagePosA ).tl, 'u_pattern_br_a': (imagePosA ).br, 'u_pattern_tl_b': (imagePosB ).tl, 'u_pattern_br_b': (imagePosB ).br, 'u_texsize': [width, height], 'u_mix': crossfade.t, 'u_pattern_size_a': (imagePosA ).displaySize, 'u_pattern_size_b': (imagePosB ).displaySize, 'u_scale_a': crossfade.fromScale, 'u_scale_b': crossfade.toScale, 'u_tile_units_to_pixels': 1 / pixelsToTileUnits(tile, 1, painter.transform.tileZoom), // split the pixel coord into two pairs of 16 bit numbers. The glsl spec only guarantees 16 bits of precision. 'u_pixel_coord_upper': [pixelX >> 16, pixelY >> 16], 'u_pixel_coord_lower': [pixelX & 0xFFFF, pixelY & 0xFFFF] }; } // var fillExtrusionUniforms = function (context , locations ) { return ({ 'u_matrix': new __chunk_1.UniformMatrix4f(context, locations.u_matrix), 'u_lightpos': new __chunk_1.Uniform3f(context, locations.u_lightpos), 'u_lightintensity': new __chunk_1.Uniform1f(context, locations.u_lightintensity), 'u_lightcolor': new __chunk_1.Uniform3f(context, locations.u_lightcolor), 'u_vertical_gradient': new __chunk_1.Uniform1f(context, locations.u_vertical_gradient), 'u_opacity': new __chunk_1.Uniform1f(context, locations.u_opacity) }); }; var fillExtrusionPatternUniforms = function (context , locations ) { return ({ 'u_matrix': new __chunk_1.UniformMatrix4f(context, locations.u_matrix), 'u_lightpos': new __chunk_1.Uniform3f(context, locations.u_lightpos), 'u_lightintensity': new __chunk_1.Uniform1f(context, locations.u_lightintensity), 'u_lightcolor': new __chunk_1.Uniform3f(context, locations.u_lightcolor), 'u_vertical_gradient': new __chunk_1.Uniform1f(context, locations.u_vertical_gradient), 'u_height_factor': new __chunk_1.Uniform1f(context, locations.u_height_factor), // pattern uniforms 'u_image': new __chunk_1.Uniform1i(context, locations.u_image), 'u_texsize': new __chunk_1.Uniform2f(context, locations.u_texsize), 'u_pixel_coord_upper': new __chunk_1.Uniform2f(context, locations.u_pixel_coord_upper), 'u_pixel_coord_lower': new __chunk_1.Uniform2f(context, locations.u_pixel_coord_lower), 'u_scale': new __chunk_1.Uniform4f(context, locations.u_scale), 'u_fade': new __chunk_1.Uniform1f(context, locations.u_fade), 'u_opacity': new __chunk_1.Uniform1f(context, locations.u_opacity) }); }; var fillExtrusionUniformValues = function ( matrix , painter , shouldUseVerticalGradient , opacity ) { var light = painter.style.light; var _lp = light.properties.get('position'); var lightPos = [_lp.x, _lp.y, _lp.z]; var lightMat = __chunk_1.create$1(); if (light.properties.get('anchor') === 'viewport') { __chunk_1.fromRotation(lightMat, -painter.transform.angle); } __chunk_1.transformMat3(lightPos, lightPos, lightMat); var lightColor = light.properties.get('color'); return { 'u_matrix': matrix, 'u_lightpos': lightPos, 'u_lightintensity': light.properties.get('intensity'), 'u_lightcolor': [lightColor.r, lightColor.g, lightColor.b], 'u_vertical_gradient': +shouldUseVerticalGradient, 'u_opacity': opacity }; }; var fillExtrusionPatternUniformValues = function ( matrix , painter , shouldUseVerticalGradient , opacity , coord , crossfade , tile ) { return __chunk_1.extend(fillExtrusionUniformValues(matrix, painter, shouldUseVerticalGradient, opacity), patternUniformValues(crossfade, painter, tile), { 'u_height_factor': -Math.pow(2, coord.overscaledZ) / tile.tileSize / 8 }); }; // var fillUniforms = function (context , locations ) { return ({ 'u_matrix': new __chunk_1.UniformMatrix4f(context, locations.u_matrix) }); }; var fillPatternUniforms = function (context , locations ) { return ({ 'u_matrix': new __chunk_1.UniformMatrix4f(context, locations.u_matrix), 'u_image': new __chunk_1.Uniform1i(context, locations.u_image), 'u_texsize': new __chunk_1.Uniform2f(context, locations.u_texsize), 'u_pixel_coord_upper': new __chunk_1.Uniform2f(context, locations.u_pixel_coord_upper), 'u_pixel_coord_lower': new __chunk_1.Uniform2f(context, locations.u_pixel_coord_lower), 'u_scale': new __chunk_1.Uniform4f(context, locations.u_scale), 'u_fade': new __chunk_1.Uniform1f(context, locations.u_fade) }); }; var fillOutlineUniforms = function (context , locations ) { return ({ 'u_matrix': new __chunk_1.UniformMatrix4f(context, locations.u_matrix), 'u_world': new __chunk_1.Uniform2f(context, locations.u_world) }); }; var fillOutlinePatternUniforms = function (context , locations ) { return ({ 'u_matrix': new __chunk_1.UniformMatrix4f(context, locations.u_matrix), 'u_world': new __chunk_1.Uniform2f(context, locations.u_world), 'u_image': new __chunk_1.Uniform1i(context, locations.u_image), 'u_texsize': new __chunk_1.Uniform2f(context, locations.u_texsize), 'u_pixel_coord_upper': new __chunk_1.Uniform2f(context, locations.u_pixel_coord_upper), 'u_pixel_coord_lower': new __chunk_1.Uniform2f(context, locations.u_pixel_coord_lower), 'u_scale': new __chunk_1.Uniform4f(context, locations.u_scale), 'u_fade': new __chunk_1.Uniform1f(context, locations.u_fade) }); }; var fillUniformValues = function (matrix ) { return ({ 'u_matrix': matrix }); }; var fillPatternUniformValues = function ( matrix , painter , crossfade , tile ) { return __chunk_1.extend( fillUniformValues(matrix), patternUniformValues(crossfade, painter, tile) ); }; var fillOutlineUniformValues = function ( matrix , drawingBufferSize ) { return ({ 'u_matrix': matrix, 'u_world': drawingBufferSize }); }; var fillOutlinePatternUniformValues = function ( matrix , painter , crossfade , tile , drawingBufferSize ) { return __chunk_1.extend( fillPatternUniformValues(matrix, painter, crossfade, tile), { 'u_world': drawingBufferSize } ); }; // var circleUniforms = function (context , locations ) { return ({ 'u_camera_to_center_distance': new __chunk_1.Uniform1f(context, locations.u_camera_to_center_distance), 'u_scale_with_map': new __chunk_1.Uniform1i(context, locations.u_scale_with_map), 'u_pitch_with_map': new __chunk_1.Uniform1i(context, locations.u_pitch_with_map), 'u_extrude_scale': new __chunk_1.Uniform2f(context, locations.u_extrude_scale), 'u_matrix': new __chunk_1.UniformMatrix4f(context, locations.u_matrix) }); }; var circleUniformValues = function ( painter , coord , tile , layer ) { var transform = painter.transform; var pitchWithMap , extrudeScale ; if (layer.paint.get('circle-pitch-alignment') === 'map') { var pixelRatio = pixelsToTileUnits(tile, 1, transform.zoom); pitchWithMap = true; extrudeScale = [pixelRatio, pixelRatio]; } else { pitchWithMap = false; extrudeScale = transform.pixelsToGLUnits; } return { 'u_camera_to_center_distance': transform.cameraToCenterDistance, 'u_scale_with_map': +(layer.paint.get('circle-pitch-scale') === 'map'), 'u_matrix': painter.translatePosMatrix( coord.posMatrix, tile, layer.paint.get('circle-translate'), layer.paint.get('circle-translate-anchor')), 'u_pitch_with_map': +(pitchWithMap), 'u_extrude_scale': extrudeScale }; }; // var collisionUniforms = function (context , locations ) { return ({ 'u_matrix': new __chunk_1.UniformMatrix4f(context, locations.u_matrix), 'u_camera_to_center_distance': new __chunk_1.Uniform1f(context, locations.u_camera_to_center_distance), 'u_pixels_to_tile_units': new __chunk_1.Uniform1f(context, locations.u_pixels_to_tile_units), 'u_extrude_scale': new __chunk_1.Uniform2f(context, locations.u_extrude_scale), 'u_overscale_factor': new __chunk_1.Uniform1f(context, locations.u_overscale_factor) }); }; var collisionUniformValues = function ( matrix , transform , tile ) { var pixelRatio = pixelsToTileUnits(tile, 1, transform.zoom); var scale = Math.pow(2, transform.zoom - tile.tileID.overscaledZ); var overscaleFactor = tile.tileID.overscaleFactor(); return { 'u_matrix': matrix, 'u_camera_to_center_distance': transform.cameraToCenterDistance, 'u_pixels_to_tile_units': pixelRatio, 'u_extrude_scale': [transform.pixelsToGLUnits[0] / (pixelRatio * scale), transform.pixelsToGLUnits[1] / (pixelRatio * scale)], 'u_overscale_factor': overscaleFactor }; }; // var debugUniforms = function (context , locations ) { return ({ 'u_color': new __chunk_1.UniformColor(context, locations.u_color), 'u_matrix': new __chunk_1.UniformMatrix4f(context, locations.u_matrix) }); }; var debugUniformValues = function (matrix , color ) { return ({ 'u_matrix': matrix, 'u_color': color }); }; // var clippingMaskUniforms = function (context , locations ) { return ({ 'u_matrix': new __chunk_1.UniformMatrix4f(context, locations.u_matrix) }); }; var clippingMaskUniformValues = function (matrix ) { return ({ 'u_matrix': matrix }); }; // var heatmapUniforms = function (context , locations ) { return ({ 'u_extrude_scale': new __chunk_1.Uniform1f(context, locations.u_extrude_scale), 'u_intensity': new __chunk_1.Uniform1f(context, locations.u_intensity), 'u_matrix': new __chunk_1.UniformMatrix4f(context, locations.u_matrix) }); }; var heatmapTextureUniforms = function (context , locations ) { return ({ 'u_matrix': new __chunk_1.UniformMatrix4f(context, locations.u_matrix), 'u_world': new __chunk_1.Uniform2f(context, locations.u_world), 'u_image': new __chunk_1.Uniform1i(context, locations.u_image), 'u_color_ramp': new __chunk_1.Uniform1i(context, locations.u_color_ramp), 'u_opacity': new __chunk_1.Uniform1f(context, locations.u_opacity) }); }; var heatmapUniformValues = function ( matrix , tile , zoom , intensity ) { return ({ 'u_matrix': matrix, 'u_extrude_scale': pixelsToTileUnits(tile, 1, zoom), 'u_intensity': intensity }); }; var heatmapTextureUniformValues = function ( painter , layer , textureUnit , colorRampUnit ) { var matrix = __chunk_1.create(); __chunk_1.ortho(matrix, 0, painter.width, painter.height, 0, 0, 1); var gl = painter.context.gl; return { 'u_matrix': matrix, 'u_world': [gl.drawingBufferWidth, gl.drawingBufferHeight], 'u_image': textureUnit, 'u_color_ramp': colorRampUnit, 'u_opacity': layer.paint.get('heatmap-opacity') }; }; // var hillshadeUniforms = function (context , locations ) { return ({ 'u_matrix': new __chunk_1.UniformMatrix4f(context, locations.u_matrix), 'u_image': new __chunk_1.Uniform1i(context, locations.u_image), 'u_latrange': new __chunk_1.Uniform2f(context, locations.u_latrange), 'u_light': new __chunk_1.Uniform2f(context, locations.u_light), 'u_shadow': new __chunk_1.UniformColor(context, locations.u_shadow), 'u_highlight': new __chunk_1.UniformColor(context, locations.u_highlight), 'u_accent': new __chunk_1.UniformColor(context, locations.u_accent) }); }; var hillshadePrepareUniforms = function (context , locations ) { return ({ 'u_matrix': new __chunk_1.UniformMatrix4f(context, locations.u_matrix), 'u_image': new __chunk_1.Uniform1i(context, locations.u_image), 'u_dimension': new __chunk_1.Uniform2f(context, locations.u_dimension), 'u_zoom': new __chunk_1.Uniform1f(context, locations.u_zoom), 'u_maxzoom': new __chunk_1.Uniform1f(context, locations.u_maxzoom) }); }; var hillshadeUniformValues = function ( painter , tile , layer ) { var shadow = layer.paint.get("hillshade-shadow-color"); var highlight = layer.paint.get("hillshade-highlight-color"); var accent = layer.paint.get("hillshade-accent-color"); var azimuthal = layer.paint.get('hillshade-illumination-direction') * (Math.PI / 180); // modify azimuthal angle by map rotation if light is anchored at the viewport if (layer.paint.get('hillshade-illumination-anchor') === 'viewport') { azimuthal -= painter.transform.angle; } var align = !painter.options.moving; return { 'u_matrix': painter.transform.calculatePosMatrix(tile.tileID.toUnwrapped(), align), 'u_image': 0, 'u_latrange': getTileLatRange(painter, tile.tileID), 'u_light': [layer.paint.get('hillshade-exaggeration'), azimuthal], 'u_shadow': shadow, 'u_highlight': highlight, 'u_accent': accent }; }; var hillshadeUniformPrepareValues = function ( tile , maxzoom ) { __chunk_1.assert(tile.dem); var stride = ((tile.dem ) ).stride; var matrix = __chunk_1.create(); // Flip rendering at y axis. __chunk_1.ortho(matrix, 0, __chunk_1.EXTENT, -__chunk_1.EXTENT, 0, 0, 1); __chunk_1.translate(matrix, matrix, [0, -__chunk_1.EXTENT, 0]); return { 'u_matrix': matrix, 'u_image': 1, 'u_dimension': [stride, stride], 'u_zoom': tile.tileID.overscaledZ, 'u_maxzoom': maxzoom }; }; function getTileLatRange(painter , tileID ) { // for scaling the magnitude of a points slope by its latitude var tilesAtZoom = Math.pow(2, tileID.canonical.z); var y = tileID.canonical.y; return [ new __chunk_1.MercatorCoordinate(0, y / tilesAtZoom).toLngLat().lat, new __chunk_1.MercatorCoordinate(0, (y + 1) / tilesAtZoom).toLngLat().lat]; } // var lineUniforms = function (context , locations ) { return ({ 'u_matrix': new __chunk_1.UniformMatrix4f(context, locations.u_matrix), 'u_ratio': new __chunk_1.Uniform1f(context, locations.u_ratio), 'u_gl_units_to_pixels': new __chunk_1.Uniform2f(context, locations.u_gl_units_to_pixels) }); }; var lineGradientUniforms = function (context , locations ) { return ({ 'u_matrix': new __chunk_1.UniformMatrix4f(context, locations.u_matrix), 'u_ratio': new __chunk_1.Uniform1f(context, locations.u_ratio), 'u_gl_units_to_pixels': new __chunk_1.Uniform2f(context, locations.u_gl_units_to_pixels), 'u_image': new __chunk_1.Uniform1i(context, locations.u_image) }); }; var linePatternUniforms = function (context , locations ) { return ({ 'u_matrix': new __chunk_1.UniformMatrix4f(context, locations.u_matrix), 'u_texsize': new __chunk_1.Uniform2f(context, locations.u_texsize), 'u_ratio': new __chunk_1.Uniform1f(context, locations.u_ratio), 'u_image': new __chunk_1.Uniform1i(context, locations.u_image), 'u_gl_units_to_pixels': new __chunk_1.Uniform2f(context, locations.u_gl_units_to_pixels), 'u_scale': new __chunk_1.Uniform4f(context, locations.u_scale), 'u_fade': new __chunk_1.Uniform1f(context, locations.u_fade) }); }; var lineSDFUniforms = function (context , locations ) { return ({ 'u_matrix': new __chunk_1.UniformMatrix4f(context, locations.u_matrix), 'u_ratio': new __chunk_1.Uniform1f(context, locations.u_ratio), 'u_gl_units_to_pixels': new __chunk_1.Uniform2f(context, locations.u_gl_units_to_pixels), 'u_patternscale_a': new __chunk_1.Uniform2f(context, locations.u_patternscale_a), 'u_patternscale_b': new __chunk_1.Uniform2f(context, locations.u_patternscale_b), 'u_sdfgamma': new __chunk_1.Uniform1f(context, locations.u_sdfgamma), 'u_image': new __chunk_1.Uniform1i(context, locations.u_image), 'u_tex_y_a': new __chunk_1.Uniform1f(context, locations.u_tex_y_a), 'u_tex_y_b': new __chunk_1.Uniform1f(context, locations.u_tex_y_b), 'u_mix': new __chunk_1.Uniform1f(context, locations.u_mix) }); }; var lineUniformValues = function ( painter , tile , layer ) { var transform = painter.transform; return { 'u_matrix': calculateMatrix(painter, tile, layer), 'u_ratio': 1 / pixelsToTileUnits(tile, 1, transform.zoom), 'u_gl_units_to_pixels': [ 1 / transform.pixelsToGLUnits[0], 1 / transform.pixelsToGLUnits[1] ] }; }; var lineGradientUniformValues = function ( painter , tile , layer ) { return __chunk_1.extend(lineUniformValues(painter, tile, layer), { 'u_image': 0 }); }; var linePatternUniformValues = function ( painter , tile , layer , crossfade ) { var transform = painter.transform; var tileZoomRatio = calculateTileRatio(tile, transform); return { 'u_matrix': calculateMatrix(painter, tile, layer), 'u_texsize': tile.imageAtlasTexture.size, // camera zoom ratio 'u_ratio': 1 / pixelsToTileUnits(tile, 1, transform.zoom), 'u_image': 0, // this assumes all images in the icon atlas texture have the same pixel ratio 'u_scale': [__chunk_1.browser.devicePixelRatio, tileZoomRatio, crossfade.fromScale, crossfade.toScale], 'u_fade': crossfade.t, 'u_gl_units_to_pixels': [ 1 / transform.pixelsToGLUnits[0], 1 / transform.pixelsToGLUnits[1] ] }; }; var lineSDFUniformValues = function ( painter , tile , layer , dasharray , crossfade ) { var transform = painter.transform; var lineAtlas = painter.lineAtlas; var tileRatio = calculateTileRatio(tile, transform); var round = layer.layout.get('line-cap') === 'round'; var posA = lineAtlas.getDash(dasharray.from, round); var posB = lineAtlas.getDash(dasharray.to, round); var widthA = posA.width * crossfade.fromScale; var widthB = posB.width * crossfade.toScale; return __chunk_1.extend(lineUniformValues(painter, tile, layer), { 'u_patternscale_a': [tileRatio / widthA, -posA.height / 2], 'u_patternscale_b': [tileRatio / widthB, -posB.height / 2], 'u_sdfgamma': lineAtlas.width / (Math.min(widthA, widthB) * 256 * __chunk_1.browser.devicePixelRatio) / 2, 'u_image': 0, 'u_tex_y_a': posA.y, 'u_tex_y_b': posB.y, 'u_mix': crossfade.t }); }; function calculateTileRatio(tile , transform ) { return 1 / pixelsToTileUnits(tile, 1, transform.tileZoom); } function calculateMatrix(painter, tile, layer) { return painter.translatePosMatrix( tile.tileID.posMatrix, tile, layer.paint.get('line-translate'), layer.paint.get('line-translate-anchor') ); } // var rasterUniforms = function (context , locations ) { return ({ 'u_matrix': new __chunk_1.UniformMatrix4f(context, locations.u_matrix), 'u_tl_parent': new __chunk_1.Uniform2f(context, locations.u_tl_parent), 'u_scale_parent': new __chunk_1.Uniform1f(context, locations.u_scale_parent), 'u_buffer_scale': new __chunk_1.Uniform1f(context, locations.u_buffer_scale), 'u_fade_t': new __chunk_1.Uniform1f(context, locations.u_fade_t), 'u_opacity': new __chunk_1.Uniform1f(context, locations.u_opacity), 'u_image0': new __chunk_1.Uniform1i(context, locations.u_image0), 'u_image1': new __chunk_1.Uniform1i(context, locations.u_image1), 'u_brightness_low': new __chunk_1.Uniform1f(context, locations.u_brightness_low), 'u_brightness_high': new __chunk_1.Uniform1f(context, locations.u_brightness_high), 'u_saturation_factor': new __chunk_1.Uniform1f(context, locations.u_saturation_factor), 'u_contrast_factor': new __chunk_1.Uniform1f(context, locations.u_contrast_factor), 'u_spin_weights': new __chunk_1.Uniform3f(context, locations.u_spin_weights) }); }; var rasterUniformValues = function ( matrix , parentTL , parentScaleBy , fade , layer ) { return ({ 'u_matrix': matrix, 'u_tl_parent': parentTL, 'u_scale_parent': parentScaleBy, 'u_buffer_scale': 1, 'u_fade_t': fade.mix, 'u_opacity': fade.opacity * layer.paint.get('raster-opacity'), 'u_image0': 0, 'u_image1': 1, 'u_brightness_low': layer.paint.get('raster-brightness-min'), 'u_brightness_high': layer.paint.get('raster-brightness-max'), 'u_saturation_factor': saturationFactor(layer.paint.get('raster-saturation')), 'u_contrast_factor': contrastFactor(layer.paint.get('raster-contrast')), 'u_spin_weights': spinWeights(layer.paint.get('raster-hue-rotate')) }); }; function spinWeights(angle) { angle *= Math.PI / 180; var s = Math.sin(angle); var c = Math.cos(angle); return [ (2 * c + 1) / 3, (-Math.sqrt(3) * s - c + 1) / 3, (Math.sqrt(3) * s - c + 1) / 3 ]; } function contrastFactor(contrast) { return contrast > 0 ? 1 / (1 - contrast) : 1 + contrast; } function saturationFactor(saturation) { return saturation > 0 ? 1 - 1 / (1.001 - saturation) : -saturation; } // var symbolIconUniforms = function (context , locations ) { return ({ 'u_is_size_zoom_constant': new __chunk_1.Uniform1i(context, locations.u_is_size_zoom_constant), 'u_is_size_feature_constant': new __chunk_1.Uniform1i(context, locations.u_is_size_feature_constant), 'u_size_t': new __chunk_1.Uniform1f(context, locations.u_size_t), 'u_size': new __chunk_1.Uniform1f(context, locations.u_size), 'u_camera_to_center_distance': new __chunk_1.Uniform1f(context, locations.u_camera_to_center_distance), 'u_pitch': new __chunk_1.Uniform1f(context, locations.u_pitch), 'u_rotate_symbol': new __chunk_1.Uniform1i(context, locations.u_rotate_symbol), 'u_aspect_ratio': new __chunk_1.Uniform1f(context, locations.u_aspect_ratio), 'u_fade_change': new __chunk_1.Uniform1f(context, locations.u_fade_change), 'u_matrix': new __chunk_1.UniformMatrix4f(context, locations.u_matrix), 'u_label_plane_matrix': new __chunk_1.UniformMatrix4f(context, locations.u_label_plane_matrix), 'u_gl_coord_matrix': new __chunk_1.UniformMatrix4f(context, locations.u_gl_coord_matrix), 'u_is_text': new __chunk_1.Uniform1f(context, locations.u_is_text), 'u_pitch_with_map': new __chunk_1.Uniform1i(context, locations.u_pitch_with_map), 'u_texsize': new __chunk_1.Uniform2f(context, locations.u_texsize), 'u_texture': new __chunk_1.Uniform1i(context, locations.u_texture) }); }; var symbolSDFUniforms = function (context , locations ) { return ({ 'u_is_size_zoom_constant': new __chunk_1.Uniform1i(context, locations.u_is_size_zoom_constant), 'u_is_size_feature_constant': new __chunk_1.Uniform1i(context, locations.u_is_size_feature_constant), 'u_size_t': new __chunk_1.Uniform1f(context, locations.u_size_t), 'u_size': new __chunk_1.Uniform1f(context, locations.u_size), 'u_camera_to_center_distance': new __chunk_1.Uniform1f(context, locations.u_camera_to_center_distance), 'u_pitch': new __chunk_1.Uniform1f(context, locations.u_pitch), 'u_rotate_symbol': new __chunk_1.Uniform1i(context, locations.u_rotate_symbol), 'u_aspect_ratio': new __chunk_1.Uniform1f(context, locations.u_aspect_ratio), 'u_fade_change': new __chunk_1.Uniform1f(context, locations.u_fade_change), 'u_matrix': new __chunk_1.UniformMatrix4f(context, locations.u_matrix), 'u_label_plane_matrix': new __chunk_1.UniformMatrix4f(context, locations.u_label_plane_matrix), 'u_gl_coord_matrix': new __chunk_1.UniformMatrix4f(context, locations.u_gl_coord_matrix), 'u_is_text': new __chunk_1.Uniform1f(context, locations.u_is_text), 'u_pitch_with_map': new __chunk_1.Uniform1i(context, locations.u_pitch_with_map), 'u_texsize': new __chunk_1.Uniform2f(context, locations.u_texsize), 'u_texture': new __chunk_1.Uniform1i(context, locations.u_texture), 'u_gamma_scale': new __chunk_1.Uniform1f(context, locations.u_gamma_scale), 'u_is_halo': new __chunk_1.Uniform1f(context, locations.u_is_halo) }); }; var symbolIconUniformValues = function ( functionType , size , rotateInShader , pitchWithMap , painter , matrix , labelPlaneMatrix , glCoordMatrix , isText , texSize ) { var transform = painter.transform; return { 'u_is_size_zoom_constant': +(functionType === 'constant' || functionType === 'source'), 'u_is_size_feature_constant': +(functionType === 'constant' || functionType === 'camera'), 'u_size_t': size ? size.uSizeT : 0, 'u_size': size ? size.uSize : 0, 'u_camera_to_center_distance': transform.cameraToCenterDistance, 'u_pitch': transform.pitch / 360 * 2 * Math.PI, 'u_rotate_symbol': +rotateInShader, 'u_aspect_ratio': transform.width / transform.height, 'u_fade_change': painter.options.fadeDuration ? painter.symbolFadeChange : 1, 'u_matrix': matrix, 'u_label_plane_matrix': labelPlaneMatrix, 'u_gl_coord_matrix': glCoordMatrix, 'u_is_text': +isText, 'u_pitch_with_map': +pitchWithMap, 'u_texsize': texSize, 'u_texture': 0 }; }; var symbolSDFUniformValues = function ( functionType , size , rotateInShader , pitchWithMap , painter , matrix , labelPlaneMatrix , glCoordMatrix , isText , texSize , isHalo ) { var transform = painter.transform; return __chunk_1.extend(symbolIconUniformValues(functionType, size, rotateInShader, pitchWithMap, painter, matrix, labelPlaneMatrix, glCoordMatrix, isText, texSize), { 'u_gamma_scale': (pitchWithMap ? Math.cos(transform._pitch) * transform.cameraToCenterDistance : 1), 'u_is_halo': +isHalo }); }; // var backgroundUniforms = function (context , locations ) { return ({ 'u_matrix': new __chunk_1.UniformMatrix4f(context, locations.u_matrix), 'u_opacity': new __chunk_1.Uniform1f(context, locations.u_opacity), 'u_color': new __chunk_1.UniformColor(context, locations.u_color) }); }; var backgroundPatternUniforms = function (context , locations ) { return ({ 'u_matrix': new __chunk_1.UniformMatrix4f(context, locations.u_matrix), 'u_opacity': new __chunk_1.Uniform1f(context, locations.u_opacity), 'u_image': new __chunk_1.Uniform1i(context, locations.u_image), 'u_pattern_tl_a': new __chunk_1.Uniform2f(context, locations.u_pattern_tl_a), 'u_pattern_br_a': new __chunk_1.Uniform2f(context, locations.u_pattern_br_a), 'u_pattern_tl_b': new __chunk_1.Uniform2f(context, locations.u_pattern_tl_b), 'u_pattern_br_b': new __chunk_1.Uniform2f(context, locations.u_pattern_br_b), 'u_texsize': new __chunk_1.Uniform2f(context, locations.u_texsize), 'u_mix': new __chunk_1.Uniform1f(context, locations.u_mix), 'u_pattern_size_a': new __chunk_1.Uniform2f(context, locations.u_pattern_size_a), 'u_pattern_size_b': new __chunk_1.Uniform2f(context, locations.u_pattern_size_b), 'u_scale_a': new __chunk_1.Uniform1f(context, locations.u_scale_a), 'u_scale_b': new __chunk_1.Uniform1f(context, locations.u_scale_b), 'u_pixel_coord_upper': new __chunk_1.Uniform2f(context, locations.u_pixel_coord_upper), 'u_pixel_coord_lower': new __chunk_1.Uniform2f(context, locations.u_pixel_coord_lower), 'u_tile_units_to_pixels': new __chunk_1.Uniform1f(context, locations.u_tile_units_to_pixels) }); }; var backgroundUniformValues = function ( matrix , opacity , color ) { return ({ 'u_matrix': matrix, 'u_opacity': opacity, 'u_color': color }); }; var backgroundPatternUniformValues = function ( matrix , opacity , painter , image , tile , crossfade ) { return __chunk_1.extend( bgPatternUniformValues(image, crossfade, painter, tile), { 'u_matrix': matrix, 'u_opacity': opacity } ); }; // var programUniforms = { fillExtrusion: fillExtrusionUniforms, fillExtrusionPattern: fillExtrusionPatternUniforms, fill: fillUniforms, fillPattern: fillPatternUniforms, fillOutline: fillOutlineUniforms, fillOutlinePattern: fillOutlinePatternUniforms, circle: circleUniforms, collisionBox: collisionUniforms, collisionCircle: collisionUniforms, debug: debugUniforms, clippingMask: clippingMaskUniforms, heatmap: heatmapUniforms, heatmapTexture: heatmapTextureUniforms, hillshade: hillshadeUniforms, hillshadePrepare: hillshadePrepareUniforms, line: lineUniforms, lineGradient: lineGradientUniforms, linePattern: linePatternUniforms, lineSDF: lineSDFUniforms, raster: rasterUniforms, symbolIcon: symbolIconUniforms, symbolSDF: symbolSDFUniforms, background: backgroundUniforms, backgroundPattern: backgroundPatternUniforms }; // // Updates the TileMasks for all renderable tiles. A TileMask describes all regions // within that tile that are *not* covered by other renderable tiles. // Example: renderableTiles in our list are 2/1/3, 3/3/6, and 4/5/13. The schematic for creating the // TileMask for 2/1/3 looks like this: // // ┌────────┬────────┬─────────────────┐ // │ │ │#################│ // │ 4/4/12 │ 4/5/12 │#################│ // │ │ │#################│ // ├──────3/2/6──────┤#####3/3/6#######│ // │ │########│#################│ // │ 4/4/13 │#4/5/13#│#################│ // │ │########│#################│ // ├────────┴──────2/1/3───────────────┤ // │ │ │ // │ │ │ // │ │ │ // │ 3/2/7 │ 3/3/7 │ // │ │ │ // │ │ │ // │ │ │ // └─────────────────┴─────────────────┘ // // The TileMask for 2/1/3 thus consists of the tiles 4/4/12, 4/5/12, 4/4/13, 3/2/7, and 3/3/7, // but it does *not* include 4/5/13, and 3/3/6, since these are other renderableTiles. // A TileMask always contains TileIDs *relative* to the tile it is generated for, so 2/1/3 is // "subtracted" from these TileIDs. The final TileMask for 2/1/3 will thus be: // // ┌────────┬────────┬─────────────────┐ // │ │ │#################│ // │ 2/0/0 │ 2/1/0 │#################│ // │ │ │#################│ // ├────────┼────────┤#################│ // │ │########│#################│ // │ 2/0/1 │########│#################│ // │ │########│#################│ // ├────────┴────────┼─────────────────┤ // │ │ │ // │ │ │ // │ │ │ // │ 1/0/1 │ 1/1/1 │ // │ │ │ // │ │ │ // │ │ │ // └─────────────────┴─────────────────┘ // // Only other renderable tiles that are *children* of the tile we are generating the mask for will // be considered. For example, adding TileID 4/8/13 to renderableTiles won't affect the TileMask for // 2/1/3, since it is not a descendant of it. function updateTileMasks(renderableTiles , context ) { var sortedRenderables = renderableTiles.sort(function (a, b) { return a.tileID.isLessThan(b.tileID) ? -1 : b.tileID.isLessThan(a.tileID) ? 1 : 0; }); for (var i = 0; i < sortedRenderables.length; i++) { var mask = {}; var tile = sortedRenderables[i]; var childArray = sortedRenderables.slice(i + 1); // Try to add all remaining ids as children. We sorted the tile list // by z earlier, so all preceding items cannot be children of the current // tile. We also compute the lower bound of the next wrap, because items of the next wrap // can never be children of the current wrap. computeTileMasks(tile.tileID.wrapped(), tile.tileID, childArray, new __chunk_1.OverscaledTileID(0, tile.tileID.wrap + 1, 0, 0, 0), mask); tile.setMask(mask, context); } } function computeTileMasks(rootTile , ref , childArray , lowerBound , mask ) { // If the reference or any of its children is found in the list, we need to recurse. for (var i = 0; i < childArray.length; i++) { var childTile = childArray[i]; // childTile is from a larger wrap than the rootTile so it cannot be a child tile if (lowerBound.isLessThan(childTile.tileID)) { break; } // The current tile is masked out, so we don't need to add them to the mask set. if (ref.key === childTile.tileID.key) { return; } else if (childTile.tileID.isChildOf(ref)) { // There's at least one child tile that is masked out, so recursively descend var children = ref.children(Infinity); for (var j = 0; j < children.length; j++) { var child = children[j]; computeTileMasks(rootTile, child, childArray.slice(i), lowerBound, mask); } return; } } // We couldn't find a child, so it's definitely a masked part. // Compute the difference between the root tile ID and the reference tile ID, since TileMask // elements are always relative (see below for explanation). var diffZ = ref.overscaledZ - rootTile.overscaledZ; var maskTileId = new __chunk_1.CanonicalTileID(diffZ, ref.canonical.x - (rootTile.canonical.x << diffZ), ref.canonical.y - (rootTile.canonical.y << diffZ)); mask[maskTileId.key] = mask[maskTileId.key] || maskTileId; } // function drawCollisionDebugGeometry(painter , sourceCache , layer , coords , drawCircles ) { var context = painter.context; var gl = context.gl; var program = drawCircles ? painter.useProgram('collisionCircle') : painter.useProgram('collisionBox'); for (var i = 0; i < coords.length; i++) { var coord = coords[i]; var tile = sourceCache.getTile(coord); var bucket = (tile.getBucket(layer) ); if (!bucket) { continue; } var buffers = drawCircles ? bucket.collisionCircle : bucket.collisionBox; if (!buffers) { continue; } program.draw(context, drawCircles ? gl.TRIANGLES : gl.LINES, DepthMode.disabled, StencilMode.disabled, painter.colorModeForRenderPass(), CullFaceMode.disabled, collisionUniformValues( coord.posMatrix, painter.transform, tile), layer.id, buffers.layoutVertexBuffer, buffers.indexBuffer, buffers.segments, null, painter.transform.zoom, null, null, buffers.collisionVertexBuffer); } } function drawCollisionDebug(painter , sourceCache , layer , coords ) { drawCollisionDebugGeometry(painter, sourceCache, layer, coords, false); drawCollisionDebugGeometry(painter, sourceCache, layer, coords, true); } // var identityMat4 = __chunk_1.identity(new Float32Array(16)); var symbolLayoutProperties$1 = __chunk_1.properties.layout; function drawSymbols(painter , sourceCache , layer , coords , variableOffsets ) { if (painter.renderPass !== 'translucent') { return; } // Disable the stencil test so that labels aren't clipped to tile boundaries. var stencilMode = StencilMode.disabled; var colorMode = painter.colorModeForRenderPass(); if (layer.paint.get('icon-opacity').constantOr(1) !== 0) { drawLayerSymbols(painter, sourceCache, layer, coords, false, layer.paint.get('icon-translate'), layer.paint.get('icon-translate-anchor'), layer.layout.get('icon-rotation-alignment'), layer.layout.get('icon-pitch-alignment'), layer.layout.get('icon-keep-upright'), stencilMode, colorMode, variableOffsets ); } if (layer.paint.get('text-opacity').constantOr(1) !== 0) { drawLayerSymbols(painter, sourceCache, layer, coords, true, layer.paint.get('text-translate'), layer.paint.get('text-translate-anchor'), layer.layout.get('text-rotation-alignment'), layer.layout.get('text-pitch-alignment'), layer.layout.get('text-keep-upright'), stencilMode, colorMode, variableOffsets ); } if (sourceCache.map.showCollisionBoxes) { drawCollisionDebug(painter, sourceCache, layer, coords); } } function calculateVariableRenderShift(anchor, width, height, radialOffset, textBoxScale, renderTextSize) { var ref = __chunk_1.getAnchorAlignment(anchor); var horizontalAlign = ref.horizontalAlign; var verticalAlign = ref.verticalAlign; var shiftX = -(horizontalAlign - 0.5) * width; var shiftY = -(verticalAlign - 0.5) * height; var offset = __chunk_1.evaluateRadialOffset(anchor, radialOffset); return new __chunk_1.Point( (shiftX / textBoxScale + offset[0]) * renderTextSize, (shiftY / textBoxScale + offset[1]) * renderTextSize ); } function updateVariableAnchors(bucket, rotateWithMap, pitchWithMap, variableOffsets, symbolSize, transform, labelPlaneMatrix, posMatrix, tileScale, size) { var placedSymbols = bucket.text.placedSymbolArray; var dynamicLayoutVertexArray = bucket.text.dynamicLayoutVertexArray; dynamicLayoutVertexArray.clear(); for (var s = 0; s < placedSymbols.length; s++) { var symbol = placedSymbols.get(s); var variableOffset = (!symbol.hidden && symbol.crossTileID) ? variableOffsets[symbol.crossTileID] : null; if (!variableOffset) { // These symbols are from a justification that is not being used, or a label that wasn't placed // so we don't need to do the extra math to figure out what incremental shift to apply. hideGlyphs(symbol.numGlyphs, dynamicLayoutVertexArray); } else { var tileAnchor = new __chunk_1.Point(symbol.anchorX, symbol.anchorY); var projectedAnchor = project(tileAnchor, pitchWithMap ? posMatrix : labelPlaneMatrix); var perspectiveRatio = 0.5 + 0.5 * (transform.cameraToCenterDistance / projectedAnchor.signedDistanceFromCamera); var renderTextSize = symbolSize.evaluateSizeForFeature(bucket.textSizeData, size, symbol) * perspectiveRatio / __chunk_1.ONE_EM; if (pitchWithMap) { // Go from size in pixels to equivalent size in tile units renderTextSize *= bucket.tilePixelRatio / tileScale; } var width = variableOffset.width; var height = variableOffset.height; var radialOffset = variableOffset.radialOffset; var textBoxScale = variableOffset.textBoxScale; var shift = calculateVariableRenderShift( variableOffset.anchor, width, height, radialOffset, textBoxScale, renderTextSize); // Usual case is that we take the projected anchor and add the pixel-based shift // calculated above. In the (somewhat weird) case of pitch-aligned text, we add an equivalent // tile-unit based shift to the anchor before projecting to the label plane. var shiftedAnchor = pitchWithMap ? project(tileAnchor.add(shift), labelPlaneMatrix).point : projectedAnchor.point.add(rotateWithMap ? shift.rotate(-transform.angle) : shift); for (var g = 0; g < symbol.numGlyphs; g++) { __chunk_1.addDynamicAttributes(dynamicLayoutVertexArray, shiftedAnchor, 0); } } } bucket.text.dynamicLayoutVertexBuffer.updateData(dynamicLayoutVertexArray); } function drawLayerSymbols(painter, sourceCache, layer, coords, isText, translate, translateAnchor, rotationAlignment, pitchAlignment, keepUpright, stencilMode, colorMode, variableOffsets) { var context = painter.context; var gl = context.gl; var tr = painter.transform; var rotateWithMap = rotationAlignment === 'map'; var pitchWithMap = pitchAlignment === 'map'; var alongLine = rotateWithMap && layer.layout.get('symbol-placement') !== 'point'; // Line label rotation happens in `updateLineLabels` // Pitched point labels are automatically rotated by the labelPlaneMatrix projection // Unpitched point labels need to have their rotation applied after projection var rotateInShader = rotateWithMap && !pitchWithMap && !alongLine; var sortFeaturesByKey = layer.layout.get('symbol-sort-key').constantOr(1) !== undefined; var depthMode = painter.depthModeForSublayer(0, DepthMode.ReadOnly); var program; var size; var variablePlacement = layer.layout.get('text-variable-anchor'); var tileRenderState = []; for (var i$1 = 0, list$1 = coords; i$1 < list$1.length; i$1 += 1) { var coord = list$1[i$1]; var tile = sourceCache.getTile(coord); var bucket = (tile.getBucket(layer) ); if (!bucket) { continue; } var buffers = isText ? bucket.text : bucket.icon; if (!buffers || !buffers.segments.get().length) { continue; } var programConfiguration = buffers.programConfigurations.get(layer.id); var isSDF = isText || bucket.sdfIcons; var sizeData = isText ? bucket.textSizeData : bucket.iconSizeData; if (!program) { program = painter.useProgram(isSDF ? 'symbolSDF' : 'symbolIcon', programConfiguration); size = __chunk_1.evaluateSizeForZoom(sizeData, tr.zoom, symbolLayoutProperties$1.properties[isText ? 'text-size' : 'icon-size']); } context.activeTexture.set(gl.TEXTURE0); var texSize = (void 0) ; var atlasTexture = (void 0); var atlasInterpolation = (void 0); if (isText) { atlasTexture = tile.glyphAtlasTexture; atlasInterpolation = gl.LINEAR; texSize = tile.glyphAtlasTexture.size; } else { var iconScaled = layer.layout.get('icon-size').constantOr(0) !== 1 || bucket.iconsNeedLinear; var iconTransformed = pitchWithMap || tr.pitch !== 0; atlasTexture = tile.imageAtlasTexture; atlasInterpolation = isSDF || painter.options.rotating || painter.options.zooming || iconScaled || iconTransformed ? gl.LINEAR : gl.NEAREST; texSize = tile.imageAtlasTexture.size; } var s = pixelsToTileUnits(tile, 1, painter.transform.zoom); var labelPlaneMatrix = getLabelPlaneMatrix(coord.posMatrix, pitchWithMap, rotateWithMap, painter.transform, s); var glCoordMatrix = getGlCoordMatrix(coord.posMatrix, pitchWithMap, rotateWithMap, painter.transform, s); if (alongLine) { updateLineLabels(bucket, coord.posMatrix, painter, isText, labelPlaneMatrix, glCoordMatrix, pitchWithMap, keepUpright); } else if (isText && size && variablePlacement) { var tileScale = Math.pow(2, tr.zoom - tile.tileID.overscaledZ); updateVariableAnchors(bucket, rotateWithMap, pitchWithMap, variableOffsets, __chunk_1.symbolSize, tr, labelPlaneMatrix, coord.posMatrix, tileScale, size); } var matrix = painter.translatePosMatrix(coord.posMatrix, tile, translate, translateAnchor), uLabelPlaneMatrix = (alongLine || (isText && variablePlacement)) ? identityMat4 : labelPlaneMatrix, uglCoordMatrix = painter.translatePosMatrix(glCoordMatrix, tile, translate, translateAnchor, true); var hasHalo = isSDF && layer.paint.get(isText ? 'text-halo-width' : 'icon-halo-width').constantOr(1) !== 0; var uniformValues = (void 0); if (isSDF) { uniformValues = symbolSDFUniformValues(sizeData.functionType, size, rotateInShader, pitchWithMap, painter, matrix, uLabelPlaneMatrix, uglCoordMatrix, isText, texSize, true); } else { uniformValues = symbolIconUniformValues(sizeData.functionType, size, rotateInShader, pitchWithMap, painter, matrix, uLabelPlaneMatrix, uglCoordMatrix, isText, texSize); } var state = { program: program, buffers: buffers, uniformValues: uniformValues, atlasTexture: atlasTexture, atlasInterpolation: atlasInterpolation, isSDF: isSDF, hasHalo: hasHalo }; if (sortFeaturesByKey) { var oldSegments = buffers.segments.get(); for (var i = 0, list = oldSegments; i < list.length; i += 1) { var segment = list[i]; tileRenderState.push({ segments: new __chunk_1.SegmentVector([segment]), sortKey: ((segment.sortKey ) ), state: state }); } } else { tileRenderState.push({ segments: buffers.segments, sortKey: 0, state: state }); } } if (sortFeaturesByKey) { tileRenderState.sort(function (a, b) { return a.sortKey - b.sortKey; }); } for (var i$2 = 0, list$2 = tileRenderState; i$2 < list$2.length; i$2 += 1) { var segmentState = list$2[i$2]; var state$1 = segmentState.state; state$1.atlasTexture.bind(state$1.atlasInterpolation, gl.CLAMP_TO_EDGE); if (state$1.isSDF) { var uniformValues$1 = ((state$1.uniformValues ) ); if (state$1.hasHalo) { uniformValues$1['u_is_halo'] = 1; drawSymbolElements(state$1.buffers, segmentState.segments, layer, painter, state$1.program, depthMode, stencilMode, colorMode, uniformValues$1); } uniformValues$1['u_is_halo'] = 0; } drawSymbolElements(state$1.buffers, segmentState.segments, layer, painter, state$1.program, depthMode, stencilMode, colorMode, state$1.uniformValues); } } function drawSymbolElements(buffers, segments, layer, painter, program, depthMode, stencilMode, colorMode, uniformValues) { var context = painter.context; var gl = context.gl; program.draw(context, gl.TRIANGLES, depthMode, stencilMode, colorMode, CullFaceMode.disabled, uniformValues, layer.id, buffers.layoutVertexBuffer, buffers.indexBuffer, segments, layer.paint, painter.transform.zoom, buffers.programConfigurations.get(layer.id), buffers.dynamicLayoutVertexBuffer, buffers.opacityVertexBuffer); } // function drawCircles(painter , sourceCache , layer , coords ) { if (painter.renderPass !== 'translucent') { return; } var opacity = layer.paint.get('circle-opacity'); var strokeWidth = layer.paint.get('circle-stroke-width'); var strokeOpacity = layer.paint.get('circle-stroke-opacity'); if (opacity.constantOr(1) === 0 && (strokeWidth.constantOr(1) === 0 || strokeOpacity.constantOr(1) === 0)) { return; } var context = painter.context; var gl = context.gl; var depthMode = painter.depthModeForSublayer(0, DepthMode.ReadOnly); // Turn off stencil testing to allow circles to be drawn across boundaries, // so that large circles are not clipped to tiles var stencilMode = StencilMode.disabled; var colorMode = painter.colorModeForRenderPass(); for (var i = 0; i < coords.length; i++) { var coord = coords[i]; var tile = sourceCache.getTile(coord); var bucket = (tile.getBucket(layer) ); if (!bucket) { continue; } var programConfiguration = bucket.programConfigurations.get(layer.id); var program = painter.useProgram('circle', programConfiguration); program.draw(context, gl.TRIANGLES, depthMode, stencilMode, colorMode, CullFaceMode.disabled, circleUniformValues(painter, coord, tile, layer), layer.id, bucket.layoutVertexBuffer, bucket.indexBuffer, bucket.segments, layer.paint, painter.transform.zoom, programConfiguration); } } // function drawHeatmap(painter , sourceCache , layer , coords ) { if (layer.paint.get('heatmap-opacity') === 0) { return; } if (painter.renderPass === 'offscreen') { var context = painter.context; var gl = context.gl; var depthMode = painter.depthModeForSublayer(0, DepthMode.ReadOnly); // Allow kernels to be drawn across boundaries, so that // large kernels are not clipped to tiles var stencilMode = StencilMode.disabled; // Turn on additive blending for kernels, which is a key aspect of kernel density estimation formula var colorMode = new ColorMode([gl.ONE, gl.ONE], __chunk_1.Color.transparent, [true, true, true, true]); bindFramebuffer(context, painter, layer); context.clear({ color: __chunk_1.Color.transparent }); for (var i = 0; i < coords.length; i++) { var coord = coords[i]; // Skip tiles that have uncovered parents to avoid flickering; we don't need // to use complex tile masking here because the change between zoom levels is subtle, // so it's fine to simply render the parent until all its 4 children are loaded if (sourceCache.hasRenderableParent(coord)) { continue; } var tile = sourceCache.getTile(coord); var bucket = (tile.getBucket(layer) ); if (!bucket) { continue; } var programConfiguration = bucket.programConfigurations.get(layer.id); var program = painter.useProgram('heatmap', programConfiguration); var ref = painter.transform; var zoom = ref.zoom; program.draw(context, gl.TRIANGLES, depthMode, stencilMode, colorMode, CullFaceMode.disabled, heatmapUniformValues(coord.posMatrix, tile, zoom, layer.paint.get('heatmap-intensity')), layer.id, bucket.layoutVertexBuffer, bucket.indexBuffer, bucket.segments, layer.paint, painter.transform.zoom, programConfiguration); } context.viewport.set([0, 0, painter.width, painter.height]); } else if (painter.renderPass === 'translucent') { painter.context.setColorMode(painter.colorModeForRenderPass()); renderTextureToMap(painter, layer); } } function bindFramebuffer(context, painter, layer) { var gl = context.gl; context.activeTexture.set(gl.TEXTURE1); // Use a 4x downscaled screen texture for better performance context.viewport.set([0, 0, painter.width / 4, painter.height / 4]); var fbo = layer.heatmapFbo; if (!fbo) { var texture = gl.createTexture(); gl.bindTexture(gl.TEXTURE_2D, texture); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); fbo = layer.heatmapFbo = context.createFramebuffer(painter.width / 4, painter.height / 4); bindTextureToFramebuffer(context, painter, texture, fbo); } else { gl.bindTexture(gl.TEXTURE_2D, fbo.colorAttachment.get()); context.bindFramebuffer.set(fbo.framebuffer); } } function bindTextureToFramebuffer(context, painter, texture, fbo) { var gl = context.gl; // Use the higher precision half-float texture where available (producing much smoother looking heatmaps); gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, painter.width / 4, painter.height / 4, 0, gl.RGBA, context.extTextureHalfFloat ? context.extTextureHalfFloat.HALF_FLOAT_OES : gl.UNSIGNED_BYTE, null); fbo.colorAttachment.set(texture); // If using half-float texture as a render target is not supported, fall back to a low precision texture if (context.extTextureHalfFloat && gl.checkFramebufferStatus(gl.FRAMEBUFFER) !== gl.FRAMEBUFFER_COMPLETE) { context.extTextureHalfFloat = null; fbo.colorAttachment.setDirty(); bindTextureToFramebuffer(context, painter, texture, fbo); } } function renderTextureToMap(painter, layer) { var context = painter.context; var gl = context.gl; // Here we bind two different textures from which we'll sample in drawing // heatmaps: the kernel texture, prepared in the offscreen pass, and a // color ramp texture. var fbo = layer.heatmapFbo; if (!fbo) { return; } context.activeTexture.set(gl.TEXTURE0); gl.bindTexture(gl.TEXTURE_2D, fbo.colorAttachment.get()); context.activeTexture.set(gl.TEXTURE1); var colorRampTexture = layer.colorRampTexture; if (!colorRampTexture) { colorRampTexture = layer.colorRampTexture = new __chunk_1.Texture(context, layer.colorRamp, gl.RGBA); } colorRampTexture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE); painter.useProgram('heatmapTexture').draw(context, gl.TRIANGLES, DepthMode.disabled, StencilMode.disabled, painter.colorModeForRenderPass(), CullFaceMode.disabled, heatmapTextureUniformValues(painter, layer, 0, 1), layer.id, painter.viewportBuffer, painter.quadTriangleIndexBuffer, painter.viewportSegments, layer.paint, painter.transform.zoom); } // function drawLine(painter , sourceCache , layer , coords ) { if (painter.renderPass !== 'translucent') { return; } var opacity = layer.paint.get('line-opacity'); var width = layer.paint.get('line-width'); if (opacity.constantOr(1) === 0 || width.constantOr(1) === 0) { return; } var depthMode = painter.depthModeForSublayer(0, DepthMode.ReadOnly); var colorMode = painter.colorModeForRenderPass(); var dasharray = layer.paint.get('line-dasharray'); var patternProperty = layer.paint.get('line-pattern'); var image = patternProperty.constantOr((1 )); var gradient = layer.paint.get('line-gradient'); var crossfade = layer.getCrossfadeParameters(); var programId = dasharray ? 'lineSDF' : image ? 'linePattern' : gradient ? 'lineGradient' : 'line'; var context = painter.context; var gl = context.gl; var firstTile = true; if (gradient) { context.activeTexture.set(gl.TEXTURE0); var gradientTexture = layer.gradientTexture; if (!layer.gradient) { return; } if (!gradientTexture) { gradientTexture = layer.gradientTexture = new __chunk_1.Texture(context, layer.gradient, gl.RGBA); } gradientTexture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE); } for (var i = 0, list = coords; i < list.length; i += 1) { var coord = list[i]; var tile = sourceCache.getTile(coord); if (image && !tile.patternsLoaded()) { continue; } var bucket = (tile.getBucket(layer) ); if (!bucket) { continue; } var programConfiguration = bucket.programConfigurations.get(layer.id); var prevProgram = painter.context.program.get(); var program = painter.useProgram(programId, programConfiguration); var programChanged = firstTile || program.program !== prevProgram; var constantPattern = patternProperty.constantOr(null); if (constantPattern && tile.imageAtlas) { var posTo = tile.imageAtlas.patternPositions[constantPattern.to]; var posFrom = tile.imageAtlas.patternPositions[constantPattern.from]; if (posTo && posFrom) { programConfiguration.setConstantPatternPositions(posTo, posFrom); } } var uniformValues = dasharray ? lineSDFUniformValues(painter, tile, layer, dasharray, crossfade) : image ? linePatternUniformValues(painter, tile, layer, crossfade) : gradient ? lineGradientUniformValues(painter, tile, layer) : lineUniformValues(painter, tile, layer); if (dasharray && (programChanged || painter.lineAtlas.dirty)) { context.activeTexture.set(gl.TEXTURE0); painter.lineAtlas.bind(context); } else if (image) { context.activeTexture.set(gl.TEXTURE0); tile.imageAtlasTexture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE); programConfiguration.updatePatternPaintBuffers(crossfade); } program.draw(context, gl.TRIANGLES, depthMode, painter.stencilModeForClipping(coord), colorMode, CullFaceMode.disabled, uniformValues, layer.id, bucket.layoutVertexBuffer, bucket.indexBuffer, bucket.segments, layer.paint, painter.transform.zoom, programConfiguration); firstTile = false; // once refactored so that bound texture state is managed, we'll also be able to remove this firstTile/programChanged logic } } // function drawFill(painter , sourceCache , layer , coords ) { var color = layer.paint.get('fill-color'); var opacity = layer.paint.get('fill-opacity'); if (opacity.constantOr(1) === 0) { return; } var colorMode = painter.colorModeForRenderPass(); var pattern = layer.paint.get('fill-pattern'); var pass = painter.opaquePassEnabledForLayer() && (!pattern.constantOr((1 )) && color.constantOr(__chunk_1.Color.transparent).a === 1 && opacity.constantOr(0) === 1) ? 'opaque' : 'translucent'; // Draw fill if (painter.renderPass === pass) { var depthMode = painter.depthModeForSublayer( 1, painter.renderPass === 'opaque' ? DepthMode.ReadWrite : DepthMode.ReadOnly); drawFillTiles(painter, sourceCache, layer, coords, depthMode, colorMode, false); } // Draw stroke if (painter.renderPass === 'translucent' && layer.paint.get('fill-antialias')) { // If we defined a different color for the fill outline, we are // going to ignore the bits in 0x07 and just care about the global // clipping mask. // Otherwise, we only want to drawFill the antialiased parts that are // *outside* the current shape. This is important in case the fill // or stroke color is translucent. If we wouldn't clip to outside // the current shape, some pixels from the outline stroke overlapped // the (non-antialiased) fill. var depthMode$1 = painter.depthModeForSublayer( layer.getPaintProperty('fill-outline-color') ? 2 : 0, DepthMode.ReadOnly); drawFillTiles(painter, sourceCache, layer, coords, depthMode$1, colorMode, true); } } function drawFillTiles(painter, sourceCache, layer, coords, depthMode, colorMode, isOutline) { var gl = painter.context.gl; var patternProperty = layer.paint.get('fill-pattern'); var image = patternProperty && patternProperty.constantOr((1 )); var crossfade = layer.getCrossfadeParameters(); var drawMode, programName, uniformValues, indexBuffer, segments; if (!isOutline) { programName = image ? 'fillPattern' : 'fill'; drawMode = gl.TRIANGLES; } else { programName = image && !layer.getPaintProperty('fill-outline-color') ? 'fillOutlinePattern' : 'fillOutline'; drawMode = gl.LINES; } for (var i = 0, list = coords; i < list.length; i += 1) { var coord = list[i]; var tile = sourceCache.getTile(coord); if (image && !tile.patternsLoaded()) { continue; } var bucket = (tile.getBucket(layer) ); if (!bucket) { continue; } var programConfiguration = bucket.programConfigurations.get(layer.id); var program = painter.useProgram(programName, programConfiguration); if (image) { painter.context.activeTexture.set(gl.TEXTURE0); tile.imageAtlasTexture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE); programConfiguration.updatePatternPaintBuffers(crossfade); } var constantPattern = patternProperty.constantOr(null); if (constantPattern && tile.imageAtlas) { var posTo = tile.imageAtlas.patternPositions[constantPattern.to]; var posFrom = tile.imageAtlas.patternPositions[constantPattern.from]; if (posTo && posFrom) { programConfiguration.setConstantPatternPositions(posTo, posFrom); } } var tileMatrix = painter.translatePosMatrix(coord.posMatrix, tile, layer.paint.get('fill-translate'), layer.paint.get('fill-translate-anchor')); if (!isOutline) { indexBuffer = bucket.indexBuffer; segments = bucket.segments; uniformValues = image ? fillPatternUniformValues(tileMatrix, painter, crossfade, tile) : fillUniformValues(tileMatrix); } else { indexBuffer = bucket.indexBuffer2; segments = bucket.segments2; var drawingBufferSize = [gl.drawingBufferWidth, gl.drawingBufferHeight]; uniformValues = (programName === 'fillOutlinePattern' && image) ? fillOutlinePatternUniformValues(tileMatrix, painter, crossfade, tile, drawingBufferSize) : fillOutlineUniformValues(tileMatrix, drawingBufferSize); } program.draw(painter.context, drawMode, depthMode, painter.stencilModeForClipping(coord), colorMode, CullFaceMode.disabled, uniformValues, layer.id, bucket.layoutVertexBuffer, indexBuffer, segments, layer.paint, painter.transform.zoom, programConfiguration); } } // function draw(painter , source , layer , coords ) { var opacity = layer.paint.get('fill-extrusion-opacity'); if (opacity === 0) { return; } if (painter.renderPass === 'translucent') { var depthMode = new DepthMode(painter.context.gl.LEQUAL, DepthMode.ReadWrite, painter.depthRangeFor3D); if (opacity === 1 && !layer.paint.get('fill-extrusion-pattern').constantOr((1 ))) { var colorMode = painter.colorModeForRenderPass(); drawExtrusionTiles(painter, source, layer, coords, depthMode, StencilMode.disabled, colorMode); } else { // Draw transparent buildings in two passes so that only the closest surface is drawn. // First draw all the extrusions into only the depth buffer. No colors are drawn. drawExtrusionTiles(painter, source, layer, coords, depthMode, StencilMode.disabled, ColorMode.disabled); // Then draw all the extrusions a second type, only coloring fragments if they have the // same depth value as the closest fragment in the previous pass. Use the stencil buffer // to prevent the second draw in cases where we have coincident polygons. drawExtrusionTiles(painter, source, layer, coords, depthMode, painter.stencilModeFor3D(), painter.colorModeForRenderPass()); } } } function drawExtrusionTiles(painter, source, layer, coords, depthMode, stencilMode, colorMode) { var context = painter.context; var gl = context.gl; var patternProperty = layer.paint.get('fill-extrusion-pattern'); var image = patternProperty.constantOr((1 )); var crossfade = layer.getCrossfadeParameters(); var opacity = layer.paint.get('fill-extrusion-opacity'); for (var i = 0, list = coords; i < list.length; i += 1) { var coord = list[i]; var tile = source.getTile(coord); var bucket = (tile.getBucket(layer) ); if (!bucket) { continue; } var programConfiguration = bucket.programConfigurations.get(layer.id); var program = painter.useProgram(image ? 'fillExtrusionPattern' : 'fillExtrusion', programConfiguration); if (image) { painter.context.activeTexture.set(gl.TEXTURE0); tile.imageAtlasTexture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE); programConfiguration.updatePatternPaintBuffers(crossfade); } var constantPattern = patternProperty.constantOr(null); if (constantPattern && tile.imageAtlas) { var posTo = tile.imageAtlas.patternPositions[constantPattern.to]; var posFrom = tile.imageAtlas.patternPositions[constantPattern.from]; if (posTo && posFrom) { programConfiguration.setConstantPatternPositions(posTo, posFrom); } } var matrix = painter.translatePosMatrix( coord.posMatrix, tile, layer.paint.get('fill-extrusion-translate'), layer.paint.get('fill-extrusion-translate-anchor')); var shouldUseVerticalGradient = layer.paint.get('fill-extrusion-vertical-gradient'); var uniformValues = image ? fillExtrusionPatternUniformValues(matrix, painter, shouldUseVerticalGradient, opacity, coord, crossfade, tile) : fillExtrusionUniformValues(matrix, painter, shouldUseVerticalGradient, opacity); program.draw(context, context.gl.TRIANGLES, depthMode, stencilMode, colorMode, CullFaceMode.backCCW, uniformValues, layer.id, bucket.layoutVertexBuffer, bucket.indexBuffer, bucket.segments, layer.paint, painter.transform.zoom, programConfiguration); } } // function drawHillshade(painter , sourceCache , layer , tileIDs ) { if (painter.renderPass !== 'offscreen' && painter.renderPass !== 'translucent') { return; } var context = painter.context; var sourceMaxZoom = sourceCache.getSource().maxzoom; var depthMode = painter.depthModeForSublayer(0, DepthMode.ReadOnly); var stencilMode = StencilMode.disabled; var colorMode = painter.colorModeForRenderPass(); for (var i = 0, list = tileIDs; i < list.length; i += 1) { var tileID = list[i]; var tile = sourceCache.getTile(tileID); if (tile.needsHillshadePrepare && painter.renderPass === 'offscreen') { prepareHillshade(painter, tile, layer, sourceMaxZoom, depthMode, stencilMode, colorMode); continue; } else if (painter.renderPass === 'translucent') { renderHillshade(painter, tile, layer, depthMode, stencilMode, colorMode); } } context.viewport.set([0, 0, painter.width, painter.height]); } function renderHillshade(painter, tile, layer, depthMode, stencilMode, colorMode) { var context = painter.context; var gl = context.gl; var fbo = tile.fbo; if (!fbo) { return; } var program = painter.useProgram('hillshade'); context.activeTexture.set(gl.TEXTURE0); gl.bindTexture(gl.TEXTURE_2D, fbo.colorAttachment.get()); var uniformValues = hillshadeUniformValues(painter, tile, layer); if (tile.maskedBoundsBuffer && tile.maskedIndexBuffer && tile.segments) { program.draw(context, gl.TRIANGLES, depthMode, stencilMode, colorMode, CullFaceMode.disabled, uniformValues, layer.id, tile.maskedBoundsBuffer, tile.maskedIndexBuffer, tile.segments); } else { program.draw(context, gl.TRIANGLES, depthMode, stencilMode, colorMode, CullFaceMode.disabled, uniformValues, layer.id, painter.rasterBoundsBuffer, painter.quadTriangleIndexBuffer, painter.rasterBoundsSegments); } } // hillshade rendering is done in two steps. the prepare step first calculates the slope of the terrain in the x and y // directions for each pixel, and saves those values to a framebuffer texture in the r and g channels. function prepareHillshade(painter, tile, layer, sourceMaxZoom, depthMode, stencilMode, colorMode) { var context = painter.context; var gl = context.gl; // decode rgba levels by using integer overflow to convert each Uint32Array element -> 4 Uint8Array elements. // ex. // Uint32: // base 10 - 67308 // base 2 - 0000 0000 0000 0001 0000 0110 1110 1100 // // Uint8: // base 10 - 0, 1, 6, 236 (this order is reversed in the resulting array via the overflow. // first 8 bits represent 236, so the r component of the texture pixel will be 236 etc.) // base 2 - 0000 0000, 0000 0001, 0000 0110, 1110 1100 if (tile.dem && tile.dem.data) { var tileSize = tile.dem.dim; var textureStride = tile.dem.stride; var pixelData = tile.dem.getPixels(); context.activeTexture.set(gl.TEXTURE1); // if UNPACK_PREMULTIPLY_ALPHA_WEBGL is set to true prior to drawHillshade being called // tiles will appear blank, because as you can see above the alpha value for these textures // is always 0 context.pixelStoreUnpackPremultiplyAlpha.set(false); tile.demTexture = tile.demTexture || painter.getTileTexture(textureStride); if (tile.demTexture) { var demTexture = tile.demTexture; demTexture.update(pixelData, { premultiply: false }); demTexture.bind(gl.NEAREST, gl.CLAMP_TO_EDGE); } else { tile.demTexture = new __chunk_1.Texture(context, pixelData, gl.RGBA, { premultiply: false }); tile.demTexture.bind(gl.NEAREST, gl.CLAMP_TO_EDGE); } context.activeTexture.set(gl.TEXTURE0); var fbo = tile.fbo; if (!fbo) { var renderTexture = new __chunk_1.Texture(context, {width: tileSize, height: tileSize, data: null}, gl.RGBA); renderTexture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE); fbo = tile.fbo = context.createFramebuffer(tileSize, tileSize); fbo.colorAttachment.set(renderTexture.texture); } context.bindFramebuffer.set(fbo.framebuffer); context.viewport.set([0, 0, tileSize, tileSize]); painter.useProgram('hillshadePrepare').draw(context, gl.TRIANGLES, depthMode, stencilMode, colorMode, CullFaceMode.disabled, hillshadeUniformPrepareValues(tile, sourceMaxZoom), layer.id, painter.rasterBoundsBuffer, painter.quadTriangleIndexBuffer, painter.rasterBoundsSegments); tile.needsHillshadePrepare = false; } } // function drawRaster(painter , sourceCache , layer , coords ) { if (painter.renderPass !== 'translucent') { return; } if (layer.paint.get('raster-opacity') === 0) { return; } var context = painter.context; var gl = context.gl; var source = sourceCache.getSource(); var program = painter.useProgram('raster'); var stencilMode = StencilMode.disabled; var colorMode = painter.colorModeForRenderPass(); var minTileZ = coords.length && coords[0].overscaledZ; var align = !painter.options.moving; for (var i = 0, list = coords; i < list.length; i += 1) { // Set the lower zoom level to sublayer 0, and higher zoom levels to higher sublayers // Use gl.LESS to prevent double drawing in areas where tiles overlap. var coord = list[i]; var depthMode = painter.depthModeForSublayer(coord.overscaledZ - minTileZ, layer.paint.get('raster-opacity') === 1 ? DepthMode.ReadWrite : DepthMode.ReadOnly, gl.LESS); var tile = sourceCache.getTile(coord); var posMatrix = painter.transform.calculatePosMatrix(coord.toUnwrapped(), align); tile.registerFadeDuration(layer.paint.get('raster-fade-duration')); var parentTile = sourceCache.findLoadedParent(coord, 0), fade = getFadeValues(tile, parentTile, sourceCache, layer, painter.transform); var parentScaleBy = (void 0), parentTL = (void 0); var textureFilter = layer.paint.get('raster-resampling') === 'nearest' ? gl.NEAREST : gl.LINEAR; context.activeTexture.set(gl.TEXTURE0); tile.texture.bind(textureFilter, gl.CLAMP_TO_EDGE, gl.LINEAR_MIPMAP_NEAREST); context.activeTexture.set(gl.TEXTURE1); if (parentTile) { parentTile.texture.bind(textureFilter, gl.CLAMP_TO_EDGE, gl.LINEAR_MIPMAP_NEAREST); parentScaleBy = Math.pow(2, parentTile.tileID.overscaledZ - tile.tileID.overscaledZ); parentTL = [tile.tileID.canonical.x * parentScaleBy % 1, tile.tileID.canonical.y * parentScaleBy % 1]; } else { tile.texture.bind(textureFilter, gl.CLAMP_TO_EDGE, gl.LINEAR_MIPMAP_NEAREST); } var uniformValues = rasterUniformValues(posMatrix, parentTL || [0, 0], parentScaleBy || 1, fade, layer); if (source instanceof ImageSource) { program.draw(context, gl.TRIANGLES, depthMode, stencilMode, colorMode, CullFaceMode.disabled, uniformValues, layer.id, source.boundsBuffer, painter.quadTriangleIndexBuffer, source.boundsSegments); } else if (tile.maskedBoundsBuffer && tile.maskedIndexBuffer && tile.segments) { program.draw(context, gl.TRIANGLES, depthMode, stencilMode, colorMode, CullFaceMode.disabled, uniformValues, layer.id, tile.maskedBoundsBuffer, tile.maskedIndexBuffer, tile.segments, layer.paint, painter.transform.zoom); } else { program.draw(context, gl.TRIANGLES, depthMode, stencilMode, colorMode, CullFaceMode.disabled, uniformValues, layer.id, painter.rasterBoundsBuffer, painter.quadTriangleIndexBuffer, painter.rasterBoundsSegments); } } } function getFadeValues(tile, parentTile, sourceCache, layer, transform) { var fadeDuration = layer.paint.get('raster-fade-duration'); if (fadeDuration > 0) { var now = __chunk_1.browser.now(); var sinceTile = (now - tile.timeAdded) / fadeDuration; var sinceParent = parentTile ? (now - parentTile.timeAdded) / fadeDuration : -1; var source = sourceCache.getSource(); var idealZ = transform.coveringZoomLevel({ tileSize: source.tileSize, roundZoom: source.roundZoom }); // if no parent or parent is older, fade in; if parent is younger, fade out var fadeIn = !parentTile || Math.abs(parentTile.tileID.overscaledZ - idealZ) > Math.abs(tile.tileID.overscaledZ - idealZ); var childOpacity = (fadeIn && tile.refreshedUponExpiration) ? 1 : __chunk_1.clamp(fadeIn ? sinceTile : 1 - sinceParent, 0, 1); // we don't crossfade tiles that were just refreshed upon expiring: // once they're old enough to pass the crossfading threshold // (fadeDuration), unset the `refreshedUponExpiration` flag so we don't // incorrectly fail to crossfade them when zooming if (tile.refreshedUponExpiration && sinceTile >= 1) { tile.refreshedUponExpiration = false; } if (parentTile) { return { opacity: 1, mix: 1 - childOpacity }; } else { return { opacity: childOpacity, mix: 0 }; } } else { return { opacity: 1, mix: 0 }; } } // function drawBackground(painter , sourceCache , layer ) { var color = layer.paint.get('background-color'); var opacity = layer.paint.get('background-opacity'); if (opacity === 0) { return; } var context = painter.context; var gl = context.gl; var transform = painter.transform; var tileSize = transform.tileSize; var image = layer.paint.get('background-pattern'); if (painter.isPatternMissing(image)) { return; } var pass = (!image && color.a === 1 && opacity === 1) ? 'opaque' : 'translucent'; if (painter.renderPass !== pass) { return; } var stencilMode = StencilMode.disabled; var depthMode = painter.depthModeForSublayer(0, pass === 'opaque' ? DepthMode.ReadWrite : DepthMode.ReadOnly); var colorMode = painter.colorModeForRenderPass(); var program = painter.useProgram(image ? 'backgroundPattern' : 'background'); var tileIDs = transform.coveringTiles({tileSize: tileSize}); if (image) { context.activeTexture.set(gl.TEXTURE0); painter.imageManager.bind(painter.context); } var crossfade = layer.getCrossfadeParameters(); for (var i = 0, list = tileIDs; i < list.length; i += 1) { var tileID = list[i]; var matrix = painter.transform.calculatePosMatrix(tileID.toUnwrapped()); var uniformValues = image ? backgroundPatternUniformValues(matrix, opacity, painter, image, {tileID: tileID, tileSize: tileSize}, crossfade) : backgroundUniformValues(matrix, opacity, color); program.draw(context, gl.TRIANGLES, depthMode, stencilMode, colorMode, CullFaceMode.disabled, uniformValues, layer.id, painter.tileExtentBuffer, painter.quadTriangleIndexBuffer, painter.tileExtentSegments); } } // function drawDebug(painter , sourceCache , coords ) { for (var i = 0; i < coords.length; i++) { drawDebugTile(painter, sourceCache, coords[i]); } } function drawDebugTile(painter, sourceCache, coord) { var context = painter.context; var gl = context.gl; var posMatrix = coord.posMatrix; var program = painter.useProgram('debug'); var depthMode = DepthMode.disabled; var stencilMode = StencilMode.disabled; var colorMode = painter.colorModeForRenderPass(); var id = '$debug'; program.draw(context, gl.LINE_STRIP, depthMode, stencilMode, colorMode, CullFaceMode.disabled, debugUniformValues(posMatrix, __chunk_1.Color.red), id, painter.debugBuffer, painter.tileBorderIndexBuffer, painter.debugSegments); var tileRawData = sourceCache.getTileByID(coord.key).latestRawTileData; var tileByteLength = (tileRawData && tileRawData.byteLength) || 0; var tileSizeKb = Math.floor(tileByteLength / 1024); var vertices = createTextVertices(((coord.toString()) + " " + tileSizeKb + "kb"), 50, 200, 5); var debugTextArray = new __chunk_1.StructArrayLayout2i4(); var debugTextIndices = new __chunk_1.StructArrayLayout2ui4(); for (var v = 0; v < vertices.length; v += 2) { debugTextArray.emplaceBack(vertices[v], vertices[v + 1]); debugTextIndices.emplaceBack(v, v + 1); } var debugTextBuffer = context.createVertexBuffer(debugTextArray, posAttributes.members); var debugTextIndexBuffer = context.createIndexBuffer(debugTextIndices); var debugTextSegment = __chunk_1.SegmentVector.simpleSegment(0, 0, debugTextArray.length / 2, debugTextArray.length / 2); // Draw the halo with multiple 1px lines instead of one wider line because // the gl spec doesn't guarantee support for lines with width > 1. var tileSize = sourceCache.getTile(coord).tileSize; var onePixel = __chunk_1.EXTENT / (Math.pow(2, painter.transform.zoom - coord.overscaledZ) * tileSize); var translations = [[-1, -1], [-1, 1], [1, -1], [1, 1]]; for (var i = 0; i < translations.length; i++) { var translation = translations[i]; program.draw(context, gl.LINES, depthMode, stencilMode, colorMode, CullFaceMode.disabled, debugUniformValues( __chunk_1.translate([], posMatrix, [ onePixel * translation[0], onePixel * translation[1], 0]), __chunk_1.Color.white), id, debugTextBuffer, debugTextIndexBuffer, debugTextSegment); } program.draw(context, gl.LINES, depthMode, stencilMode, colorMode, CullFaceMode.disabled, debugUniformValues(posMatrix, __chunk_1.Color.black), id, debugTextBuffer, debugTextIndexBuffer, debugTextSegment); } // Font data From Hershey Simplex Font // http://paulbourke.net/dataformats/hershey/ var simplexFont = { " ": [16, []], "!": [10, [5, 21, 5, 7, -1, -1, 5, 2, 4, 1, 5, 0, 6, 1, 5, 2]], "\"": [16, [4, 21, 4, 14, -1, -1, 12, 21, 12, 14]], "#": [21, [11, 25, 4, -7, -1, -1, 17, 25, 10, -7, -1, -1, 4, 12, 18, 12, -1, -1, 3, 6, 17, 6]], "$": [20, [8, 25, 8, -4, -1, -1, 12, 25, 12, -4, -1, -1, 17, 18, 15, 20, 12, 21, 8, 21, 5, 20, 3, 18, 3, 16, 4, 14, 5, 13, 7, 12, 13, 10, 15, 9, 16, 8, 17, 6, 17, 3, 15, 1, 12, 0, 8, 0, 5, 1, 3, 3]], "%": [24, [21, 21, 3, 0, -1, -1, 8, 21, 10, 19, 10, 17, 9, 15, 7, 14, 5, 14, 3, 16, 3, 18, 4, 20, 6, 21, 8, 21, 10, 20, 13, 19, 16, 19, 19, 20, 21, 21, -1, -1, 17, 7, 15, 6, 14, 4, 14, 2, 16, 0, 18, 0, 20, 1, 21, 3, 21, 5, 19, 7, 17, 7]], "&": [26, [23, 12, 23, 13, 22, 14, 21, 14, 20, 13, 19, 11, 17, 6, 15, 3, 13, 1, 11, 0, 7, 0, 5, 1, 4, 2, 3, 4, 3, 6, 4, 8, 5, 9, 12, 13, 13, 14, 14, 16, 14, 18, 13, 20, 11, 21, 9, 20, 8, 18, 8, 16, 9, 13, 11, 10, 16, 3, 18, 1, 20, 0, 22, 0, 23, 1, 23, 2]], "'": [10, [5, 19, 4, 20, 5, 21, 6, 20, 6, 18, 5, 16, 4, 15]], "(": [14, [11, 25, 9, 23, 7, 20, 5, 16, 4, 11, 4, 7, 5, 2, 7, -2, 9, -5, 11, -7]], ")": [14, [3, 25, 5, 23, 7, 20, 9, 16, 10, 11, 10, 7, 9, 2, 7, -2, 5, -5, 3, -7]], "*": [16, [8, 21, 8, 9, -1, -1, 3, 18, 13, 12, -1, -1, 13, 18, 3, 12]], "+": [26, [13, 18, 13, 0, -1, -1, 4, 9, 22, 9]], ",": [10, [6, 1, 5, 0, 4, 1, 5, 2, 6, 1, 6, -1, 5, -3, 4, -4]], "-": [26, [4, 9, 22, 9]], ".": [10, [5, 2, 4, 1, 5, 0, 6, 1, 5, 2]], "/": [22, [20, 25, 2, -7]], "0": [20, [9, 21, 6, 20, 4, 17, 3, 12, 3, 9, 4, 4, 6, 1, 9, 0, 11, 0, 14, 1, 16, 4, 17, 9, 17, 12, 16, 17, 14, 20, 11, 21, 9, 21]], "1": [20, [6, 17, 8, 18, 11, 21, 11, 0]], "2": [20, [4, 16, 4, 17, 5, 19, 6, 20, 8, 21, 12, 21, 14, 20, 15, 19, 16, 17, 16, 15, 15, 13, 13, 10, 3, 0, 17, 0]], "3": [20, [5, 21, 16, 21, 10, 13, 13, 13, 15, 12, 16, 11, 17, 8, 17, 6, 16, 3, 14, 1, 11, 0, 8, 0, 5, 1, 4, 2, 3, 4]], "4": [20, [13, 21, 3, 7, 18, 7, -1, -1, 13, 21, 13, 0]], "5": [20, [15, 21, 5, 21, 4, 12, 5, 13, 8, 14, 11, 14, 14, 13, 16, 11, 17, 8, 17, 6, 16, 3, 14, 1, 11, 0, 8, 0, 5, 1, 4, 2, 3, 4]], "6": [20, [16, 18, 15, 20, 12, 21, 10, 21, 7, 20, 5, 17, 4, 12, 4, 7, 5, 3, 7, 1, 10, 0, 11, 0, 14, 1, 16, 3, 17, 6, 17, 7, 16, 10, 14, 12, 11, 13, 10, 13, 7, 12, 5, 10, 4, 7]], "7": [20, [17, 21, 7, 0, -1, -1, 3, 21, 17, 21]], "8": [20, [8, 21, 5, 20, 4, 18, 4, 16, 5, 14, 7, 13, 11, 12, 14, 11, 16, 9, 17, 7, 17, 4, 16, 2, 15, 1, 12, 0, 8, 0, 5, 1, 4, 2, 3, 4, 3, 7, 4, 9, 6, 11, 9, 12, 13, 13, 15, 14, 16, 16, 16, 18, 15, 20, 12, 21, 8, 21]], "9": [20, [16, 14, 15, 11, 13, 9, 10, 8, 9, 8, 6, 9, 4, 11, 3, 14, 3, 15, 4, 18, 6, 20, 9, 21, 10, 21, 13, 20, 15, 18, 16, 14, 16, 9, 15, 4, 13, 1, 10, 0, 8, 0, 5, 1, 4, 3]], ":": [10, [5, 14, 4, 13, 5, 12, 6, 13, 5, 14, -1, -1, 5, 2, 4, 1, 5, 0, 6, 1, 5, 2]], ";": [10, [5, 14, 4, 13, 5, 12, 6, 13, 5, 14, -1, -1, 6, 1, 5, 0, 4, 1, 5, 2, 6, 1, 6, -1, 5, -3, 4, -4]], "<": [24, [20, 18, 4, 9, 20, 0]], "=": [26, [4, 12, 22, 12, -1, -1, 4, 6, 22, 6]], ">": [24, [4, 18, 20, 9, 4, 0]], "?": [18, [3, 16, 3, 17, 4, 19, 5, 20, 7, 21, 11, 21, 13, 20, 14, 19, 15, 17, 15, 15, 14, 13, 13, 12, 9, 10, 9, 7, -1, -1, 9, 2, 8, 1, 9, 0, 10, 1, 9, 2]], "@": [27, [18, 13, 17, 15, 15, 16, 12, 16, 10, 15, 9, 14, 8, 11, 8, 8, 9, 6, 11, 5, 14, 5, 16, 6, 17, 8, -1, -1, 12, 16, 10, 14, 9, 11, 9, 8, 10, 6, 11, 5, -1, -1, 18, 16, 17, 8, 17, 6, 19, 5, 21, 5, 23, 7, 24, 10, 24, 12, 23, 15, 22, 17, 20, 19, 18, 20, 15, 21, 12, 21, 9, 20, 7, 19, 5, 17, 4, 15, 3, 12, 3, 9, 4, 6, 5, 4, 7, 2, 9, 1, 12, 0, 15, 0, 18, 1, 20, 2, 21, 3, -1, -1, 19, 16, 18, 8, 18, 6, 19, 5]], "A": [18, [9, 21, 1, 0, -1, -1, 9, 21, 17, 0, -1, -1, 4, 7, 14, 7]], "B": [21, [4, 21, 4, 0, -1, -1, 4, 21, 13, 21, 16, 20, 17, 19, 18, 17, 18, 15, 17, 13, 16, 12, 13, 11, -1, -1, 4, 11, 13, 11, 16, 10, 17, 9, 18, 7, 18, 4, 17, 2, 16, 1, 13, 0, 4, 0]], "C": [21, [18, 16, 17, 18, 15, 20, 13, 21, 9, 21, 7, 20, 5, 18, 4, 16, 3, 13, 3, 8, 4, 5, 5, 3, 7, 1, 9, 0, 13, 0, 15, 1, 17, 3, 18, 5]], "D": [21, [4, 21, 4, 0, -1, -1, 4, 21, 11, 21, 14, 20, 16, 18, 17, 16, 18, 13, 18, 8, 17, 5, 16, 3, 14, 1, 11, 0, 4, 0]], "E": [19, [4, 21, 4, 0, -1, -1, 4, 21, 17, 21, -1, -1, 4, 11, 12, 11, -1, -1, 4, 0, 17, 0]], "F": [18, [4, 21, 4, 0, -1, -1, 4, 21, 17, 21, -1, -1, 4, 11, 12, 11]], "G": [21, [18, 16, 17, 18, 15, 20, 13, 21, 9, 21, 7, 20, 5, 18, 4, 16, 3, 13, 3, 8, 4, 5, 5, 3, 7, 1, 9, 0, 13, 0, 15, 1, 17, 3, 18, 5, 18, 8, -1, -1, 13, 8, 18, 8]], "H": [22, [4, 21, 4, 0, -1, -1, 18, 21, 18, 0, -1, -1, 4, 11, 18, 11]], "I": [8, [4, 21, 4, 0]], "J": [16, [12, 21, 12, 5, 11, 2, 10, 1, 8, 0, 6, 0, 4, 1, 3, 2, 2, 5, 2, 7]], "K": [21, [4, 21, 4, 0, -1, -1, 18, 21, 4, 7, -1, -1, 9, 12, 18, 0]], "L": [17, [4, 21, 4, 0, -1, -1, 4, 0, 16, 0]], "M": [24, [4, 21, 4, 0, -1, -1, 4, 21, 12, 0, -1, -1, 20, 21, 12, 0, -1, -1, 20, 21, 20, 0]], "N": [22, [4, 21, 4, 0, -1, -1, 4, 21, 18, 0, -1, -1, 18, 21, 18, 0]], "O": [22, [9, 21, 7, 20, 5, 18, 4, 16, 3, 13, 3, 8, 4, 5, 5, 3, 7, 1, 9, 0, 13, 0, 15, 1, 17, 3, 18, 5, 19, 8, 19, 13, 18, 16, 17, 18, 15, 20, 13, 21, 9, 21]], "P": [21, [4, 21, 4, 0, -1, -1, 4, 21, 13, 21, 16, 20, 17, 19, 18, 17, 18, 14, 17, 12, 16, 11, 13, 10, 4, 10]], "Q": [22, [9, 21, 7, 20, 5, 18, 4, 16, 3, 13, 3, 8, 4, 5, 5, 3, 7, 1, 9, 0, 13, 0, 15, 1, 17, 3, 18, 5, 19, 8, 19, 13, 18, 16, 17, 18, 15, 20, 13, 21, 9, 21, -1, -1, 12, 4, 18, -2]], "R": [21, [4, 21, 4, 0, -1, -1, 4, 21, 13, 21, 16, 20, 17, 19, 18, 17, 18, 15, 17, 13, 16, 12, 13, 11, 4, 11, -1, -1, 11, 11, 18, 0]], "S": [20, [17, 18, 15, 20, 12, 21, 8, 21, 5, 20, 3, 18, 3, 16, 4, 14, 5, 13, 7, 12, 13, 10, 15, 9, 16, 8, 17, 6, 17, 3, 15, 1, 12, 0, 8, 0, 5, 1, 3, 3]], "T": [16, [8, 21, 8, 0, -1, -1, 1, 21, 15, 21]], "U": [22, [4, 21, 4, 6, 5, 3, 7, 1, 10, 0, 12, 0, 15, 1, 17, 3, 18, 6, 18, 21]], "V": [18, [1, 21, 9, 0, -1, -1, 17, 21, 9, 0]], "W": [24, [2, 21, 7, 0, -1, -1, 12, 21, 7, 0, -1, -1, 12, 21, 17, 0, -1, -1, 22, 21, 17, 0]], "X": [20, [3, 21, 17, 0, -1, -1, 17, 21, 3, 0]], "Y": [18, [1, 21, 9, 11, 9, 0, -1, -1, 17, 21, 9, 11]], "Z": [20, [17, 21, 3, 0, -1, -1, 3, 21, 17, 21, -1, -1, 3, 0, 17, 0]], "[": [14, [4, 25, 4, -7, -1, -1, 5, 25, 5, -7, -1, -1, 4, 25, 11, 25, -1, -1, 4, -7, 11, -7]], "\\": [14, [0, 21, 14, -3]], "]": [14, [9, 25, 9, -7, -1, -1, 10, 25, 10, -7, -1, -1, 3, 25, 10, 25, -1, -1, 3, -7, 10, -7]], "^": [16, [6, 15, 8, 18, 10, 15, -1, -1, 3, 12, 8, 17, 13, 12, -1, -1, 8, 17, 8, 0]], "_": [16, [0, -2, 16, -2]], "`": [10, [6, 21, 5, 20, 4, 18, 4, 16, 5, 15, 6, 16, 5, 17]], "a": [19, [15, 14, 15, 0, -1, -1, 15, 11, 13, 13, 11, 14, 8, 14, 6, 13, 4, 11, 3, 8, 3, 6, 4, 3, 6, 1, 8, 0, 11, 0, 13, 1, 15, 3]], "b": [19, [4, 21, 4, 0, -1, -1, 4, 11, 6, 13, 8, 14, 11, 14, 13, 13, 15, 11, 16, 8, 16, 6, 15, 3, 13, 1, 11, 0, 8, 0, 6, 1, 4, 3]], "c": [18, [15, 11, 13, 13, 11, 14, 8, 14, 6, 13, 4, 11, 3, 8, 3, 6, 4, 3, 6, 1, 8, 0, 11, 0, 13, 1, 15, 3]], "d": [19, [15, 21, 15, 0, -1, -1, 15, 11, 13, 13, 11, 14, 8, 14, 6, 13, 4, 11, 3, 8, 3, 6, 4, 3, 6, 1, 8, 0, 11, 0, 13, 1, 15, 3]], "e": [18, [3, 8, 15, 8, 15, 10, 14, 12, 13, 13, 11, 14, 8, 14, 6, 13, 4, 11, 3, 8, 3, 6, 4, 3, 6, 1, 8, 0, 11, 0, 13, 1, 15, 3]], "f": [12, [10, 21, 8, 21, 6, 20, 5, 17, 5, 0, -1, -1, 2, 14, 9, 14]], "g": [19, [15, 14, 15, -2, 14, -5, 13, -6, 11, -7, 8, -7, 6, -6, -1, -1, 15, 11, 13, 13, 11, 14, 8, 14, 6, 13, 4, 11, 3, 8, 3, 6, 4, 3, 6, 1, 8, 0, 11, 0, 13, 1, 15, 3]], "h": [19, [4, 21, 4, 0, -1, -1, 4, 10, 7, 13, 9, 14, 12, 14, 14, 13, 15, 10, 15, 0]], "i": [8, [3, 21, 4, 20, 5, 21, 4, 22, 3, 21, -1, -1, 4, 14, 4, 0]], "j": [10, [5, 21, 6, 20, 7, 21, 6, 22, 5, 21, -1, -1, 6, 14, 6, -3, 5, -6, 3, -7, 1, -7]], "k": [17, [4, 21, 4, 0, -1, -1, 14, 14, 4, 4, -1, -1, 8, 8, 15, 0]], "l": [8, [4, 21, 4, 0]], "m": [30, [4, 14, 4, 0, -1, -1, 4, 10, 7, 13, 9, 14, 12, 14, 14, 13, 15, 10, 15, 0, -1, -1, 15, 10, 18, 13, 20, 14, 23, 14, 25, 13, 26, 10, 26, 0]], "n": [19, [4, 14, 4, 0, -1, -1, 4, 10, 7, 13, 9, 14, 12, 14, 14, 13, 15, 10, 15, 0]], "o": [19, [8, 14, 6, 13, 4, 11, 3, 8, 3, 6, 4, 3, 6, 1, 8, 0, 11, 0, 13, 1, 15, 3, 16, 6, 16, 8, 15, 11, 13, 13, 11, 14, 8, 14]], "p": [19, [4, 14, 4, -7, -1, -1, 4, 11, 6, 13, 8, 14, 11, 14, 13, 13, 15, 11, 16, 8, 16, 6, 15, 3, 13, 1, 11, 0, 8, 0, 6, 1, 4, 3]], "q": [19, [15, 14, 15, -7, -1, -1, 15, 11, 13, 13, 11, 14, 8, 14, 6, 13, 4, 11, 3, 8, 3, 6, 4, 3, 6, 1, 8, 0, 11, 0, 13, 1, 15, 3]], "r": [13, [4, 14, 4, 0, -1, -1, 4, 8, 5, 11, 7, 13, 9, 14, 12, 14]], "s": [17, [14, 11, 13, 13, 10, 14, 7, 14, 4, 13, 3, 11, 4, 9, 6, 8, 11, 7, 13, 6, 14, 4, 14, 3, 13, 1, 10, 0, 7, 0, 4, 1, 3, 3]], "t": [12, [5, 21, 5, 4, 6, 1, 8, 0, 10, 0, -1, -1, 2, 14, 9, 14]], "u": [19, [4, 14, 4, 4, 5, 1, 7, 0, 10, 0, 12, 1, 15, 4, -1, -1, 15, 14, 15, 0]], "v": [16, [2, 14, 8, 0, -1, -1, 14, 14, 8, 0]], "w": [22, [3, 14, 7, 0, -1, -1, 11, 14, 7, 0, -1, -1, 11, 14, 15, 0, -1, -1, 19, 14, 15, 0]], "x": [17, [3, 14, 14, 0, -1, -1, 14, 14, 3, 0]], "y": [16, [2, 14, 8, 0, -1, -1, 14, 14, 8, 0, 6, -4, 4, -6, 2, -7, 1, -7]], "z": [17, [14, 14, 3, 0, -1, -1, 3, 14, 14, 14, -1, -1, 3, 0, 14, 0]], "{": [14, [9, 25, 7, 24, 6, 23, 5, 21, 5, 19, 6, 17, 7, 16, 8, 14, 8, 12, 6, 10, -1, -1, 7, 24, 6, 22, 6, 20, 7, 18, 8, 17, 9, 15, 9, 13, 8, 11, 4, 9, 8, 7, 9, 5, 9, 3, 8, 1, 7, 0, 6, -2, 6, -4, 7, -6, -1, -1, 6, 8, 8, 6, 8, 4, 7, 2, 6, 1, 5, -1, 5, -3, 6, -5, 7, -6, 9, -7]], "|": [8, [4, 25, 4, -7]], "}": [14, [5, 25, 7, 24, 8, 23, 9, 21, 9, 19, 8, 17, 7, 16, 6, 14, 6, 12, 8, 10, -1, -1, 7, 24, 8, 22, 8, 20, 7, 18, 6, 17, 5, 15, 5, 13, 6, 11, 10, 9, 6, 7, 5, 5, 5, 3, 6, 1, 7, 0, 8, -2, 8, -4, 7, -6, -1, -1, 8, 8, 6, 6, 6, 4, 7, 2, 8, 1, 9, -1, 9, -3, 8, -5, 7, -6, 5, -7]], "~": [24, [3, 6, 3, 8, 4, 11, 6, 12, 8, 12, 10, 11, 14, 8, 16, 7, 18, 7, 20, 8, 21, 10, -1, -1, 3, 8, 4, 10, 6, 11, 8, 11, 10, 10, 14, 7, 16, 6, 18, 6, 20, 7, 21, 10, 21, 12]] }; function createTextVertices(text, left, baseline, scale) { scale = scale || 1; var strokes = []; var i, len, j, len2, glyph, x, y, prev; for (i = 0, len = text.length; i < len; i++) { glyph = simplexFont[text[i]]; if (!glyph) { continue; } prev = null; for (j = 0, len2 = glyph[1].length; j < len2; j += 2) { if (glyph[1][j] === -1 && glyph[1][j + 1] === -1) { prev = null; } else { x = left + glyph[1][j] * scale; y = baseline - glyph[1][j + 1] * scale; if (prev) { strokes.push(prev.x, prev.y, x, y); } prev = {x: x, y: y}; } } left += glyph[0] * scale; } return strokes; } // function drawCustom(painter , sourceCache , layer ) { var context = painter.context; var implementation = layer.implementation; if (painter.renderPass === 'offscreen') { var prerender = implementation.prerender; if (prerender) { painter.setCustomLayerDefaults(); context.setColorMode(painter.colorModeForRenderPass()); prerender.call(implementation, context.gl, painter.transform.customLayerMatrix()); context.setDirty(); painter.setBaseState(); } } else if (painter.renderPass === 'translucent') { painter.setCustomLayerDefaults(); context.setColorMode(painter.colorModeForRenderPass()); context.setStencilMode(StencilMode.disabled); var depthMode = implementation.renderingMode === '3d' ? new DepthMode(painter.context.gl.LEQUAL, DepthMode.ReadWrite, painter.depthRangeFor3D) : painter.depthModeForSublayer(0, DepthMode.ReadOnly); context.setDepthMode(depthMode); implementation.render(context.gl, painter.transform.customLayerMatrix()); context.setDirty(); painter.setBaseState(); context.bindFramebuffer.set(null); } } // var draw$1 = { symbol: drawSymbols, circle: drawCircles, heatmap: drawHeatmap, line: drawLine, fill: drawFill, 'fill-extrusion': draw, hillshade: drawHillshade, raster: drawRaster, background: drawBackground, debug: drawDebug, custom: drawCustom }; /** * Initialize a new painter object. * * @param {Canvas} gl an experimental-webgl drawing context * @private */ var Painter = function Painter(gl , transform ) { this.context = new Context(gl); this.transform = transform; this._tileTextures = {}; this.setup(); // Within each layer there are multiple distinct z-planes that can be drawn to. // This is implemented using the WebGL depth buffer. this.numSublayers = SourceCache.maxUnderzooming + SourceCache.maxOverzooming + 1; this.depthEpsilon = 1 / Math.pow(2, 16); this.depthRboNeedsClear = true; this.emptyProgramConfiguration = new __chunk_1.ProgramConfiguration(); this.crossTileSymbolIndex = new CrossTileSymbolIndex(); }; /* * Update the GL viewport, projection matrix, and transforms to compensate * for a new width and height value. */ Painter.prototype.resize = function resize (width , height ) { var gl = this.context.gl; this.width = width * __chunk_1.browser.devicePixelRatio; this.height = height * __chunk_1.browser.devicePixelRatio; this.context.viewport.set([0, 0, this.width, this.height]); if (this.style) { for (var i = 0, list = this.style._order; i < list.length; i += 1) { var layerId = list[i]; this.style._layers[layerId].resize(); } } if (this.depthRbo) { gl.deleteRenderbuffer(this.depthRbo); this.depthRbo = null; } }; Painter.prototype.setup = function setup () { var context = this.context; var tileExtentArray = new __chunk_1.StructArrayLayout2i4(); tileExtentArray.emplaceBack(0, 0); tileExtentArray.emplaceBack(__chunk_1.EXTENT, 0); tileExtentArray.emplaceBack(0, __chunk_1.EXTENT); tileExtentArray.emplaceBack(__chunk_1.EXTENT, __chunk_1.EXTENT); this.tileExtentBuffer = context.createVertexBuffer(tileExtentArray, posAttributes.members); this.tileExtentSegments = __chunk_1.SegmentVector.simpleSegment(0, 0, 4, 2); var debugArray = new __chunk_1.StructArrayLayout2i4(); debugArray.emplaceBack(0, 0); debugArray.emplaceBack(__chunk_1.EXTENT, 0); debugArray.emplaceBack(0, __chunk_1.EXTENT); debugArray.emplaceBack(__chunk_1.EXTENT, __chunk_1.EXTENT); this.debugBuffer = context.createVertexBuffer(debugArray, posAttributes.members); this.debugSegments = __chunk_1.SegmentVector.simpleSegment(0, 0, 4, 5); var rasterBoundsArray = new __chunk_1.StructArrayLayout4i8(); rasterBoundsArray.emplaceBack(0, 0, 0, 0); rasterBoundsArray.emplaceBack(__chunk_1.EXTENT, 0, __chunk_1.EXTENT, 0); rasterBoundsArray.emplaceBack(0, __chunk_1.EXTENT, 0, __chunk_1.EXTENT); rasterBoundsArray.emplaceBack(__chunk_1.EXTENT, __chunk_1.EXTENT, __chunk_1.EXTENT, __chunk_1.EXTENT); this.rasterBoundsBuffer = context.createVertexBuffer(rasterBoundsArray, __chunk_1.rasterBoundsAttributes.members); this.rasterBoundsSegments = __chunk_1.SegmentVector.simpleSegment(0, 0, 4, 2); var viewportArray = new __chunk_1.StructArrayLayout2i4(); viewportArray.emplaceBack(0, 0); viewportArray.emplaceBack(1, 0); viewportArray.emplaceBack(0, 1); viewportArray.emplaceBack(1, 1); this.viewportBuffer = context.createVertexBuffer(viewportArray, posAttributes.members); this.viewportSegments = __chunk_1.SegmentVector.simpleSegment(0, 0, 4, 2); var tileLineStripIndices = new __chunk_1.StructArrayLayout1ui2(); tileLineStripIndices.emplaceBack(0); tileLineStripIndices.emplaceBack(1); tileLineStripIndices.emplaceBack(3); tileLineStripIndices.emplaceBack(2); tileLineStripIndices.emplaceBack(0); this.tileBorderIndexBuffer = context.createIndexBuffer(tileLineStripIndices); var quadTriangleIndices = new __chunk_1.StructArrayLayout3ui6(); quadTriangleIndices.emplaceBack(0, 1, 2); quadTriangleIndices.emplaceBack(2, 1, 3); this.quadTriangleIndexBuffer = context.createIndexBuffer(quadTriangleIndices); var gl = this.context.gl; this.stencilClearMode = new StencilMode({ func: gl.ALWAYS, mask: 0 }, 0x0, 0xFF, gl.ZERO, gl.ZERO, gl.ZERO); }; /* * Reset the drawing canvas by clearing the stencil buffer so that we can draw * new tiles at the same location, while retaining previously drawn pixels. */ Painter.prototype.clearStencil = function clearStencil () { var context = this.context; var gl = context.gl; this.nextStencilID = 1; this.currentStencilSource = undefined; // As a temporary workaround for https://github.com/mapbox/mapbox-gl-js/issues/5490, // pending an upstream fix, we draw a fullscreen stencil=0 clipping mask here, // effectively clearing the stencil buffer: once an upstream patch lands, remove // this function in favor of context.clear({ stencil: 0x0 }) var matrix = __chunk_1.create(); __chunk_1.ortho(matrix, 0, this.width, this.height, 0, 0, 1); __chunk_1.scale(matrix, matrix, [gl.drawingBufferWidth, gl.drawingBufferHeight, 0]); this.useProgram('clippingMask').draw(context, gl.TRIANGLES, DepthMode.disabled, this.stencilClearMode, ColorMode.disabled, CullFaceMode.disabled, clippingMaskUniformValues(matrix), '$clipping', this.viewportBuffer, this.quadTriangleIndexBuffer, this.viewportSegments); }; Painter.prototype._renderTileClippingMasks = function _renderTileClippingMasks (layer , tileIDs ) { if (this.currentStencilSource === layer.source || !layer.isTileClipped() || !tileIDs || !tileIDs.length) { return; } this.currentStencilSource = layer.source; var context = this.context; var gl = context.gl; if (this.nextStencilID + tileIDs.length > 256) { // we'll run out of fresh IDs so we need to clear and start from scratch this.clearStencil(); } context.setColorMode(ColorMode.disabled); context.setDepthMode(DepthMode.disabled); var program = this.useProgram('clippingMask'); this._tileClippingMaskIDs = {}; for (var i = 0, list = tileIDs; i < list.length; i += 1) { var tileID = list[i]; var id = this._tileClippingMaskIDs[tileID.key] = this.nextStencilID++; program.draw(context, gl.TRIANGLES, DepthMode.disabled, // Tests will always pass, and ref value will be written to stencil buffer. new StencilMode({ func: gl.ALWAYS, mask: 0 }, id, 0xFF, gl.KEEP, gl.KEEP, gl.REPLACE), ColorMode.disabled, CullFaceMode.disabled, clippingMaskUniformValues(tileID.posMatrix), '$clipping', this.tileExtentBuffer, this.quadTriangleIndexBuffer, this.tileExtentSegments); } }; Painter.prototype.stencilModeFor3D = function stencilModeFor3D () { if (this.nextStencilID + 1 > 256) { this.clearStencil(); } var id = this.nextStencilID++; var gl = this.context.gl; return new StencilMode({ func: gl.NOTEQUAL, mask: 0xFF }, id, 0xFF, gl.KEEP, gl.KEEP, gl.REPLACE); }; Painter.prototype.stencilModeForClipping = function stencilModeForClipping (tileID ) { var gl = this.context.gl; return new StencilMode({ func: gl.EQUAL, mask: 0xFF }, this._tileClippingMaskIDs[tileID.key], 0x00, gl.KEEP, gl.KEEP, gl.REPLACE); }; Painter.prototype.colorModeForRenderPass = function colorModeForRenderPass () { var gl = this.context.gl; if (this._showOverdrawInspector) { var numOverdrawSteps = 8; var a = 1 / numOverdrawSteps; return new ColorMode([gl.CONSTANT_COLOR, gl.ONE], new __chunk_1.Color(a, a, a, 0), [true, true, true, true]); } else if (this.renderPass === 'opaque') { return ColorMode.unblended; } else { return ColorMode.alphaBlended; } }; Painter.prototype.depthModeForSublayer = function depthModeForSublayer (n , mask , func ) { if (!this.opaquePassEnabledForLayer()) { return DepthMode.disabled; } var depth = 1 - ((1 + this.currentLayer) * this.numSublayers + n) * this.depthEpsilon; return new DepthMode(func || this.context.gl.LEQUAL, mask, [depth, depth]); }; /* * The opaque pass and 3D layers both use the depth buffer. * Layers drawn above 3D layers need to be drawn using the * painter's algorithm so that they appear above 3D features. * This returns true for layers that can be drawn using the * opaque pass. */ Painter.prototype.opaquePassEnabledForLayer = function opaquePassEnabledForLayer () { return this.currentLayer < this.opaquePassCutoff; }; Painter.prototype.render = function render (style , options ) { this.style = style; this.options = options; this.lineAtlas = style.lineAtlas; this.imageManager = style.imageManager; this.glyphManager = style.glyphManager; this.symbolFadeChange = style.placement.symbolFadeChange(__chunk_1.browser.now()); this.imageManager.beginFrame(); var layerIds = this.style._order; var sourceCaches = this.style.sourceCaches; for (var id in sourceCaches) { var sourceCache = sourceCaches[id]; if (sourceCache.used) { sourceCache.prepare(this.context); } } var coordsAscending = {}; var coordsDescending = {}; var coordsDescendingSymbol = {}; for (var id$1 in sourceCaches) { var sourceCache$1 = sourceCaches[id$1]; coordsAscending[id$1] = sourceCache$1.getVisibleCoordinates(); coordsDescending[id$1] = coordsAscending[id$1].slice().reverse(); coordsDescendingSymbol[id$1] = sourceCache$1.getVisibleCoordinates(true).reverse(); } for (var id$2 in sourceCaches) { var sourceCache$2 = sourceCaches[id$2]; var source = sourceCache$2.getSource(); if (source.type !== 'raster' && source.type !== 'raster-dem') { continue; } var visibleTiles = []; for (var i$1 = 0, list = coordsAscending[id$2]; i$1 < list.length; i$1 += 1) { var coord = list[i$1]; visibleTiles.push(sourceCache$2.getTile(coord)); } updateTileMasks(visibleTiles, this.context); } this.opaquePassCutoff = Infinity; for (var i = 0; i < layerIds.length; i++) { var layerId = layerIds[i]; if (this.style._layers[layerId].is3D()) { this.opaquePassCutoff = i; break; } } // Offscreen pass =============================================== // We first do all rendering that requires rendering to a separate // framebuffer, and then save those for rendering back to the map // later: in doing this we avoid doing expensive framebuffer restores. this.renderPass = 'offscreen'; this.depthRboNeedsClear = true; for (var i$2 = 0, list$1 = layerIds; i$2 < list$1.length; i$2 += 1) { var layerId$1 = list$1[i$2]; var layer = this.style._layers[layerId$1]; if (!layer.hasOffscreenPass() || layer.isHidden(this.transform.zoom)) { continue; } var coords = coordsDescending[layer.source]; if (layer.type !== 'custom' && !coords.length) { continue; } this.renderLayer(this, sourceCaches[layer.source], layer, coords); } // Rebind the main framebuffer now that all offscreen layers have been rendered: this.context.bindFramebuffer.set(null); // Clear buffers in preparation for drawing to the main framebuffer this.context.clear({ color: options.showOverdrawInspector ? __chunk_1.Color.black : __chunk_1.Color.transparent, depth: 1 }); this.clearStencil(); this._showOverdrawInspector = options.showOverdrawInspector; this.depthRangeFor3D = [0, 1 - ((style._order.length + 2) * this.numSublayers * this.depthEpsilon)]; // Opaque pass =============================================== // Draw opaque layers top-to-bottom first. this.renderPass = 'opaque'; for (this.currentLayer = layerIds.length - 1; this.currentLayer >= 0; this.currentLayer--) { var layer$1 = this.style._layers[layerIds[this.currentLayer]]; var sourceCache$3 = sourceCaches[layer$1.source]; var coords$1 = coordsAscending[layer$1.source]; this._renderTileClippingMasks(layer$1, coords$1); this.renderLayer(this, sourceCache$3, layer$1, coords$1); } // Translucent pass =============================================== // Draw all other layers bottom-to-top. this.renderPass = 'translucent'; for (this.currentLayer = 0; this.currentLayer < layerIds.length; this.currentLayer++) { var layer$2 = this.style._layers[layerIds[this.currentLayer]]; var sourceCache$4 = sourceCaches[layer$2.source]; // For symbol layers in the translucent pass, we add extra tiles to the renderable set // for cross-tile symbol fading. Symbol layers don't use tile clipping, so no need to render // separate clipping masks var coords$2 = (layer$2.type === 'symbol' ? coordsDescendingSymbol : coordsDescending)[layer$2.source]; this._renderTileClippingMasks(layer$2, coordsAscending[layer$2.source]); this.renderLayer(this, sourceCache$4, layer$2, coords$2); } if (this.options.showTileBoundaries) { for (var id$3 in sourceCaches) { draw$1.debug(this, sourceCaches[id$3], coordsAscending[id$3]); break; } } this.setCustomLayerDefaults(); }; Painter.prototype.setupOffscreenDepthRenderbuffer = function setupOffscreenDepthRenderbuffer () { var context = this.context; // All of the 3D textures will use the same depth renderbuffer. if (!this.depthRbo) { this.depthRbo = context.createRenderbuffer(context.gl.DEPTH_COMPONENT16, this.width, this.height); } }; Painter.prototype.renderLayer = function renderLayer (painter , sourceCache , layer , coords ) { if (layer.isHidden(this.transform.zoom)) { return; } if (layer.type !== 'background' && layer.type !== 'custom' && !coords.length) { return; } this.id = layer.id; draw$1[layer.type](painter, sourceCache, layer, coords, this.style.placement.variableOffsets); }; /** * Transform a matrix to incorporate the *-translate and *-translate-anchor properties into it. * @param inViewportPixelUnitsUnits True when the units accepted by the matrix are in viewport pixels instead of tile units. * @returns {Float32Array} matrix */ Painter.prototype.translatePosMatrix = function translatePosMatrix (matrix , tile , translate , translateAnchor , inViewportPixelUnitsUnits ) { if (!translate[0] && !translate[1]) { return matrix; } var angle = inViewportPixelUnitsUnits ? (translateAnchor === 'map' ? this.transform.angle : 0) : (translateAnchor === 'viewport' ? -this.transform.angle : 0); if (angle) { var sinA = Math.sin(angle); var cosA = Math.cos(angle); translate = [ translate[0] * cosA - translate[1] * sinA, translate[0] * sinA + translate[1] * cosA ]; } var translation = [ inViewportPixelUnitsUnits ? translate[0] : pixelsToTileUnits(tile, translate[0], this.transform.zoom), inViewportPixelUnitsUnits ? translate[1] : pixelsToTileUnits(tile, translate[1], this.transform.zoom), 0 ]; var translatedMatrix = new Float32Array(16); __chunk_1.translate(translatedMatrix, matrix, translation); return translatedMatrix; }; Painter.prototype.saveTileTexture = function saveTileTexture (texture ) { var textures = this._tileTextures[texture.size[0]]; if (!textures) { this._tileTextures[texture.size[0]] = [texture]; } else { textures.push(texture); } }; Painter.prototype.getTileTexture = function getTileTexture (size ) { var textures = this._tileTextures[size]; return textures && textures.length > 0 ? textures.pop() : null; }; /** * Checks whether a pattern image is needed, and if it is, whether it is not loaded. * * @returns true if a needed image is missing and rendering needs to be skipped. */ Painter.prototype.isPatternMissing = function isPatternMissing (image ) { if (!image) { return false; } var imagePosA = this.imageManager.getPattern(image.from); var imagePosB = this.imageManager.getPattern(image.to); return !imagePosA || !imagePosB; }; Painter.prototype.useProgram = function useProgram (name , programConfiguration) { if ( programConfiguration === void 0 ) programConfiguration = this.emptyProgramConfiguration; this.cache = this.cache || {}; var key = "" + name + (programConfiguration.cacheKey || '') + (this._showOverdrawInspector ? '/overdraw' : ''); if (!this.cache[key]) { this.cache[key] = new Program$1(this.context, shaders[name], programConfiguration, programUniforms[name], this._showOverdrawInspector); } return this.cache[key]; }; /* * Reset some GL state to default values to avoid hard-to-debug bugs * in custom layers. */ Painter.prototype.setCustomLayerDefaults = function setCustomLayerDefaults () { // Prevent custom layers from unintentionally modify the last VAO used. // All other state is state is restored on it's own, but for VAOs it's // simpler to unbind so that we don't have to track the state of VAOs. this.context.unbindVAO(); // The default values for this state is meaningful and often expected. // Leaving this state dirty could cause a lot of confusion for users. this.context.cullFace.setDefault(); this.context.activeTexture.setDefault(); this.context.pixelStoreUnpack.setDefault(); this.context.pixelStoreUnpackPremultiplyAlpha.setDefault(); this.context.pixelStoreUnpackFlipY.setDefault(); }; /* * Set GL state that is shared by all layers. */ Painter.prototype.setBaseState = function setBaseState () { var gl = this.context.gl; this.context.cullFace.set(false); this.context.viewport.set([0, 0, this.width, this.height]); this.context.blendEquation.set(gl.FUNC_ADD); }; // function tileCover(z , bounds , actualZ , renderWorldCopies ) { if (renderWorldCopies === undefined) { renderWorldCopies = true; } var tiles = 1 << z; var t = {}; function scanLine(x0, x1, y) { var x, w, wx, coord; if (y >= 0 && y <= tiles) { for (x = x0; x < x1; x++) { w = Math.floor(x / tiles); wx = (x % tiles + tiles) % tiles; if (w === 0 || renderWorldCopies === true) { coord = new __chunk_1.OverscaledTileID(actualZ, w, z, wx, y); t[coord.key] = coord; } } } } var zoomedBounds = bounds.map(function (coord) { return new __chunk_1.Point(coord.x, coord.y)._mult(tiles); }); // Divide the screen up in two triangles and scan each of them: // +---/ // | / | // /---+ scanTriangle(zoomedBounds[0], zoomedBounds[1], zoomedBounds[2], 0, tiles, scanLine); scanTriangle(zoomedBounds[2], zoomedBounds[3], zoomedBounds[0], 0, tiles, scanLine); return Object.keys(t).map(function (id) { return t[id]; }); } // Taken from polymaps src/Layer.js // https://github.com/simplegeo/polymaps/blob/master/src/Layer.js#L333-L383 function edge(a , b ) { if (a.y > b.y) { var t = a; a = b; b = t; } return { x0: a.x, y0: a.y, x1: b.x, y1: b.y, dx: b.x - a.x, dy: b.y - a.y }; } function scanSpans(e0, e1, ymin, ymax, scanLine) { var y0 = Math.max(ymin, Math.floor(e1.y0)); var y1 = Math.min(ymax, Math.ceil(e1.y1)); // sort edges by x-coordinate if ((e0.x0 === e1.x0 && e0.y0 === e1.y0) ? (e0.x0 + e1.dy / e0.dy * e0.dx < e1.x1) : (e0.x1 - e1.dy / e0.dy * e0.dx < e1.x0)) { var t = e0; e0 = e1; e1 = t; } // scan lines! var m0 = e0.dx / e0.dy; var m1 = e1.dx / e1.dy; var d0 = e0.dx > 0; // use y + 1 to compute x0 var d1 = e1.dx < 0; // use y + 1 to compute x1 for (var y = y0; y < y1; y++) { var x0 = m0 * Math.max(0, Math.min(e0.dy, y + d0 - e0.y0)) + e0.x0; var x1 = m1 * Math.max(0, Math.min(e1.dy, y + d1 - e1.y0)) + e1.x0; scanLine(Math.floor(x1), Math.ceil(x0), y); } } function scanTriangle(a , b , c , ymin, ymax, scanLine) { var ab = edge(a, b), bc = edge(b, c), ca = edge(c, a); var t; // sort edges by y-length if (ab.dy > bc.dy) { t = ab; ab = bc; bc = t; } if (ab.dy > ca.dy) { t = ab; ab = ca; ca = t; } if (bc.dy > ca.dy) { t = bc; bc = ca; ca = t; } // scan span! scan span! if (ab.dy) { scanSpans(ca, ab, ymin, ymax, scanLine); } if (bc.dy) { scanSpans(ca, bc, ymin, ymax, scanLine); } } // /** * A single transform, generally used for a single tile to be * scaled, rotated, and zoomed. * @private */ var Transform = function Transform(minZoom , maxZoom , renderWorldCopies ) { this.tileSize = 512; // constant this.maxValidLatitude = 85.051129; // constant this._renderWorldCopies = renderWorldCopies === undefined ? true : renderWorldCopies; this._minZoom = minZoom || 0; this._maxZoom = maxZoom || 22; this.setMaxBounds(); this.width = 0; this.height = 0; this._center = new __chunk_1.LngLat(0, 0); this.zoom = 0; this.angle = 0; this._fov = 0.6435011087932844; this._pitch = 0; this._unmodified = true; this._posMatrixCache = {}; this._alignedPosMatrixCache = {}; }; var prototypeAccessors = { minZoom: { configurable: true },maxZoom: { configurable: true },renderWorldCopies: { configurable: true },worldSize: { configurable: true },centerPoint: { configurable: true },size: { configurable: true },bearing: { configurable: true },pitch: { configurable: true },fov: { configurable: true },zoom: { configurable: true },center: { configurable: true },unmodified: { configurable: true },point: { configurable: true } }; Transform.prototype.clone = function clone () { var clone = new Transform(this._minZoom, this._maxZoom, this._renderWorldCopies); clone.tileSize = this.tileSize; clone.latRange = this.latRange; clone.width = this.width; clone.height = this.height; clone._center = this._center; clone.zoom = this.zoom; clone.angle = this.angle; clone._fov = this._fov; clone._pitch = this._pitch; clone._unmodified = this._unmodified; clone._calcMatrices(); return clone; }; prototypeAccessors.minZoom.get = function () { return this._minZoom; }; prototypeAccessors.minZoom.set = function (zoom ) { if (this._minZoom === zoom) { return; } this._minZoom = zoom; this.zoom = Math.max(this.zoom, zoom); }; prototypeAccessors.maxZoom.get = function () { return this._maxZoom; }; prototypeAccessors.maxZoom.set = function (zoom ) { if (this._maxZoom === zoom) { return; } this._maxZoom = zoom; this.zoom = Math.min(this.zoom, zoom); }; prototypeAccessors.renderWorldCopies.get = function () { return this._renderWorldCopies; }; prototypeAccessors.renderWorldCopies.set = function (renderWorldCopies ) { if (renderWorldCopies === undefined) { renderWorldCopies = true; } else if (renderWorldCopies === null) { renderWorldCopies = false; } this._renderWorldCopies = renderWorldCopies; }; prototypeAccessors.worldSize.get = function () { return this.tileSize * this.scale; }; prototypeAccessors.centerPoint.get = function () { return this.size._div(2); }; prototypeAccessors.size.get = function () { return new __chunk_1.Point(this.width, this.height); }; prototypeAccessors.bearing.get = function () { return -this.angle / Math.PI * 180; }; prototypeAccessors.bearing.set = function (bearing ) { var b = -__chunk_1.wrap(bearing, -180, 180) * Math.PI / 180; if (this.angle === b) { return; } this._unmodified = false; this.angle = b; this._calcMatrices(); // 2x2 matrix for rotating points this.rotationMatrix = __chunk_1.create$2(); __chunk_1.rotate(this.rotationMatrix, this.rotationMatrix, this.angle); }; prototypeAccessors.pitch.get = function () { return this._pitch / Math.PI * 180; }; prototypeAccessors.pitch.set = function (pitch ) { var p = __chunk_1.clamp(pitch, 0, 60) / 180 * Math.PI; if (this._pitch === p) { return; } this._unmodified = false; this._pitch = p; this._calcMatrices(); }; prototypeAccessors.fov.get = function () { return this._fov / Math.PI * 180; }; prototypeAccessors.fov.set = function (fov ) { fov = Math.max(0.01, Math.min(60, fov)); if (this._fov === fov) { return; } this._unmodified = false; this._fov = fov / 180 * Math.PI; this._calcMatrices(); }; prototypeAccessors.zoom.get = function () { return this._zoom; }; prototypeAccessors.zoom.set = function (zoom ) { var z = Math.min(Math.max(zoom, this.minZoom), this.maxZoom); if (this._zoom === z) { return; } this._unmodified = false; this._zoom = z; this.scale = this.zoomScale(z); this.tileZoom = Math.floor(z); this.zoomFraction = z - this.tileZoom; this._constrain(); this._calcMatrices(); }; prototypeAccessors.center.get = function () { return this._center; }; prototypeAccessors.center.set = function (center ) { if (center.lat === this._center.lat && center.lng === this._center.lng) { return; } this._unmodified = false; this._center = center; this._constrain(); this._calcMatrices(); }; /** * Return a zoom level that will cover all tiles the transform * @param {Object} options * @param {number} options.tileSize * @param {boolean} options.roundZoom * @returns {number} zoom level */ Transform.prototype.coveringZoomLevel = function coveringZoomLevel (options ) { return (options.roundZoom ? Math.round : Math.floor)( this.zoom + this.scaleZoom(this.tileSize / options.tileSize) ); }; /** * Return any "wrapped" copies of a given tile coordinate that are visible * in the current view. * * @private */ Transform.prototype.getVisibleUnwrappedCoordinates = function getVisibleUnwrappedCoordinates (tileID ) { var result = [new __chunk_1.UnwrappedTileID(0, tileID)]; if (this._renderWorldCopies) { var utl = this.pointCoordinate(new __chunk_1.Point(0, 0)); var utr = this.pointCoordinate(new __chunk_1.Point(this.width, 0)); var ubl = this.pointCoordinate(new __chunk_1.Point(this.width, this.height)); var ubr = this.pointCoordinate(new __chunk_1.Point(0, this.height)); var w0 = Math.floor(Math.min(utl.x, utr.x, ubl.x, ubr.x)); var w1 = Math.floor(Math.max(utl.x, utr.x, ubl.x, ubr.x)); // Add an extra copy of the world on each side to properly render ImageSources and CanvasSources. // Both sources draw outside the tile boundaries of the tile that "contains them" so we need // to add extra copies on both sides in case offscreen tiles need to draw into on-screen ones. var extraWorldCopy = 1; for (var w = w0 - extraWorldCopy; w <= w1 + extraWorldCopy; w++) { if (w === 0) { continue; } result.push(new __chunk_1.UnwrappedTileID(w, tileID)); } } return result; }; /** * Return all coordinates that could cover this transform for a covering * zoom level. * @param {Object} options * @param {number} options.tileSize * @param {number} options.minzoom * @param {number} options.maxzoom * @param {boolean} options.roundZoom * @param {boolean} options.reparseOverscaled * @param {boolean} options.renderWorldCopies * @returns {Array} OverscaledTileIDs */ Transform.prototype.coveringTiles = function coveringTiles ( options ) { var z = this.coveringZoomLevel(options); var actualZ = z; if (options.minzoom !== undefined && z < options.minzoom) { return []; } if (options.maxzoom !== undefined && z > options.maxzoom) { z = options.maxzoom; } var centerCoord = __chunk_1.MercatorCoordinate.fromLngLat(this.center); var numTiles = Math.pow(2, z); var centerPoint = new __chunk_1.Point(numTiles * centerCoord.x - 0.5, numTiles * centerCoord.y - 0.5); var cornerCoords = [ this.pointCoordinate(new __chunk_1.Point(0, 0)), this.pointCoordinate(new __chunk_1.Point(this.width, 0)), this.pointCoordinate(new __chunk_1.Point(this.width, this.height)), this.pointCoordinate(new __chunk_1.Point(0, this.height)) ]; return tileCover(z, cornerCoords, options.reparseOverscaled ? actualZ : z, this._renderWorldCopies) .sort(function (a, b) { return centerPoint.dist(a.canonical) - centerPoint.dist(b.canonical); }); }; Transform.prototype.resize = function resize (width , height ) { this.width = width; this.height = height; this.pixelsToGLUnits = [2 / width, -2 / height]; this._constrain(); this._calcMatrices(); }; prototypeAccessors.unmodified.get = function () { return this._unmodified; }; Transform.prototype.zoomScale = function zoomScale (zoom ) { return Math.pow(2, zoom); }; Transform.prototype.scaleZoom = function scaleZoom (scale ) { return Math.log(scale) / Math.LN2; }; Transform.prototype.project = function project (lnglat ) { var lat = __chunk_1.clamp(lnglat.lat, -this.maxValidLatitude, this.maxValidLatitude); return new __chunk_1.Point( __chunk_1.mercatorXfromLng(lnglat.lng) * this.worldSize, __chunk_1.mercatorYfromLat(lat) * this.worldSize); }; Transform.prototype.unproject = function unproject (point ) { return new __chunk_1.MercatorCoordinate(point.x / this.worldSize, point.y / this.worldSize).toLngLat(); }; prototypeAccessors.point.get = function () { return this.project(this.center); }; Transform.prototype.setLocationAtPoint = function setLocationAtPoint (lnglat , point ) { var a = this.pointCoordinate(point); var b = this.pointCoordinate(this.centerPoint); var loc = this.locationCoordinate(lnglat); var newCenter = new __chunk_1.MercatorCoordinate( loc.x - (a.x - b.x), loc.y - (a.y - b.y)); this.center = this.coordinateLocation(newCenter); if (this._renderWorldCopies) { this.center = this.center.wrap(); } }; /** * Given a location, return the screen point that corresponds to it * @param {LngLat} lnglat location * @returns {Point} screen point */ Transform.prototype.locationPoint = function locationPoint (lnglat ) { return this.coordinatePoint(this.locationCoordinate(lnglat)); }; /** * Given a point on screen, return its lnglat * @param {Point} p screen point * @returns {LngLat} lnglat location */ Transform.prototype.pointLocation = function pointLocation (p ) { return this.coordinateLocation(this.pointCoordinate(p)); }; /** * Given a geographical lnglat, return an unrounded * coordinate that represents it at this transform's zoom level. * @param {LngLat} lnglat * @returns {Coordinate} */ Transform.prototype.locationCoordinate = function locationCoordinate (lnglat ) { return __chunk_1.MercatorCoordinate.fromLngLat(lnglat); }; /** * Given a Coordinate, return its geographical position. * @param {Coordinate} coord * @returns {LngLat} lnglat */ Transform.prototype.coordinateLocation = function coordinateLocation (coord ) { return coord.toLngLat(); }; Transform.prototype.pointCoordinate = function pointCoordinate (p ) { var targetZ = 0; // since we don't know the correct projected z value for the point, // unproject two points to get a line and then find the point on that // line with z=0 var coord0 = [p.x, p.y, 0, 1]; var coord1 = [p.x, p.y, 1, 1]; __chunk_1.transformMat4(coord0, coord0, this.pixelMatrixInverse); __chunk_1.transformMat4(coord1, coord1, this.pixelMatrixInverse); var w0 = coord0[3]; var w1 = coord1[3]; var x0 = coord0[0] / w0; var x1 = coord1[0] / w1; var y0 = coord0[1] / w0; var y1 = coord1[1] / w1; var z0 = coord0[2] / w0; var z1 = coord1[2] / w1; var t = z0 === z1 ? 0 : (targetZ - z0) / (z1 - z0); return new __chunk_1.MercatorCoordinate( __chunk_1.number(x0, x1, t) / this.worldSize, __chunk_1.number(y0, y1, t) / this.worldSize); }; /** * Given a coordinate, return the screen point that corresponds to it * @param {Coordinate} coord * @returns {Point} screen point */ Transform.prototype.coordinatePoint = function coordinatePoint (coord ) { var p = [coord.x * this.worldSize, coord.y * this.worldSize, 0, 1]; __chunk_1.transformMat4(p, p, this.pixelMatrix); return new __chunk_1.Point(p[0] / p[3], p[1] / p[3]); }; /** * Returns the map's geographical bounds. When the bearing or pitch is non-zero, the visible region is not * an axis-aligned rectangle, and the result is the smallest bounds that encompasses the visible region. */ Transform.prototype.getBounds = function getBounds () { return new __chunk_1.LngLatBounds() .extend(this.pointLocation(new __chunk_1.Point(0, 0))) .extend(this.pointLocation(new __chunk_1.Point(this.width, 0))) .extend(this.pointLocation(new __chunk_1.Point(this.width, this.height))) .extend(this.pointLocation(new __chunk_1.Point(0, this.height))); }; /** * Returns the maximum geographical bounds the map is constrained to, or `null` if none set. */ Transform.prototype.getMaxBounds = function getMaxBounds () { if (!this.latRange || this.latRange.length !== 2 || !this.lngRange || this.lngRange.length !== 2) { return null; } return new __chunk_1.LngLatBounds([this.lngRange[0], this.latRange[0]], [this.lngRange[1], this.latRange[1]]); }; /** * Sets or clears the map's geographical constraints. */ Transform.prototype.setMaxBounds = function setMaxBounds (bounds ) { if (bounds) { this.lngRange = [bounds.getWest(), bounds.getEast()]; this.latRange = [bounds.getSouth(), bounds.getNorth()]; this._constrain(); } else { this.lngRange = null; this.latRange = [-this.maxValidLatitude, this.maxValidLatitude]; } }; /** * Calculate the posMatrix that, given a tile coordinate, would be used to display the tile on a map. * @param {UnwrappedTileID} unwrappedTileID; */ Transform.prototype.calculatePosMatrix = function calculatePosMatrix (unwrappedTileID , aligned) { if ( aligned === void 0 ) aligned = false; var posMatrixKey = unwrappedTileID.key; var cache = aligned ? this._alignedPosMatrixCache : this._posMatrixCache; if (cache[posMatrixKey]) { return cache[posMatrixKey]; } var canonical = unwrappedTileID.canonical; var scale = this.worldSize / this.zoomScale(canonical.z); var unwrappedX = canonical.x + Math.pow(2, canonical.z) * unwrappedTileID.wrap; var posMatrix = __chunk_1.identity(new Float64Array(16)); __chunk_1.translate(posMatrix, posMatrix, [unwrappedX * scale, canonical.y * scale, 0]); __chunk_1.scale(posMatrix, posMatrix, [scale / __chunk_1.EXTENT, scale / __chunk_1.EXTENT, 1]); __chunk_1.multiply(posMatrix, aligned ? this.alignedProjMatrix : this.projMatrix, posMatrix); cache[posMatrixKey] = new Float32Array(posMatrix); return cache[posMatrixKey]; }; Transform.prototype.customLayerMatrix = function customLayerMatrix () { return this.mercatorMatrix.slice(); }; Transform.prototype._constrain = function _constrain () { if (!this.center || !this.width || !this.height || this._constraining) { return; } this._constraining = true; var minY = -90; var maxY = 90; var minX = -180; var maxX = 180; var sy, sx, x2, y2; var size = this.size, unmodified = this._unmodified; if (this.latRange) { var latRange = this.latRange; minY = __chunk_1.mercatorYfromLat(latRange[1]) * this.worldSize; maxY = __chunk_1.mercatorYfromLat(latRange[0]) * this.worldSize; sy = maxY - minY < size.y ? size.y / (maxY - minY) : 0; } if (this.lngRange) { var lngRange = this.lngRange; minX = __chunk_1.mercatorXfromLng(lngRange[0]) * this.worldSize; maxX = __chunk_1.mercatorXfromLng(lngRange[1]) * this.worldSize; sx = maxX - minX < size.x ? size.x / (maxX - minX) : 0; } var point = this.point; // how much the map should scale to fit the screen into given latitude/longitude ranges var s = Math.max(sx || 0, sy || 0); if (s) { this.center = this.unproject(new __chunk_1.Point( sx ? (maxX + minX) / 2 : point.x, sy ? (maxY + minY) / 2 : point.y)); this.zoom += this.scaleZoom(s); this._unmodified = unmodified; this._constraining = false; return; } if (this.latRange) { var y = point.y, h2 = size.y / 2; if (y - h2 < minY) { y2 = minY + h2; } if (y + h2 > maxY) { y2 = maxY - h2; } } if (this.lngRange) { var x = point.x, w2 = size.x / 2; if (x - w2 < minX) { x2 = minX + w2; } if (x + w2 > maxX) { x2 = maxX - w2; } } // pan the map if the screen goes off the range if (x2 !== undefined || y2 !== undefined) { this.center = this.unproject(new __chunk_1.Point( x2 !== undefined ? x2 : point.x, y2 !== undefined ? y2 : point.y)); } this._unmodified = unmodified; this._constraining = false; }; Transform.prototype._calcMatrices = function _calcMatrices () { if (!this.height) { return; } this.cameraToCenterDistance = 0.5 / Math.tan(this._fov / 2) * this.height; // Find the distance from the center point [width/2, height/2] to the // center top point [width/2, 0] in Z units, using the law of sines. // 1 Z unit is equivalent to 1 horizontal px at the center of the map // (the distance between[width/2, height/2] and [width/2 + 1, height/2]) var halfFov = this._fov / 2; var groundAngle = Math.PI / 2 + this._pitch; var topHalfSurfaceDistance = Math.sin(halfFov) * this.cameraToCenterDistance / Math.sin(Math.PI - groundAngle - halfFov); var point = this.point; var x = point.x, y = point.y; // Calculate z distance of the farthest fragment that should be rendered. var furthestDistance = Math.cos(Math.PI / 2 - this._pitch) * topHalfSurfaceDistance + this.cameraToCenterDistance; // Add a bit extra to avoid precision problems when a fragment's distance is exactly `furthestDistance` var farZ = furthestDistance * 1.01; // matrix for conversion from location to GL coordinates (-1 .. 1) var m = new Float64Array(16); __chunk_1.perspective(m, this._fov, this.width / this.height, 1, farZ); __chunk_1.scale(m, m, [1, -1, 1]); __chunk_1.translate(m, m, [0, 0, -this.cameraToCenterDistance]); __chunk_1.rotateX(m, m, this._pitch); __chunk_1.rotateZ(m, m, this.angle); __chunk_1.translate(m, m, [-x, -y, 0]); // The mercatorMatrix can be used to transform points from mercator coordinates // ([0, 0] nw, [1, 1] se) to GL coordinates. this.mercatorMatrix = __chunk_1.scale([], m, [this.worldSize, this.worldSize, this.worldSize]); // scale vertically to meters per pixel (inverse of ground resolution): __chunk_1.scale(m, m, [1, 1, __chunk_1.mercatorZfromAltitude(1, this.center.lat) * this.worldSize, 1]); this.projMatrix = m; // Make a second projection matrix that is aligned to a pixel grid for rendering raster tiles. // We're rounding the (floating point) x/y values to achieve to avoid rendering raster images to fractional // coordinates. Additionally, we adjust by half a pixel in either direction in case that viewport dimension // is an odd integer to preserve rendering to the pixel grid. We're rotating this shift based on the angle // of the transformation so that 0°, 90°, 180°, and 270° rasters are crisp, and adjust the shift so that // it is always <= 0.5 pixels. var xShift = (this.width % 2) / 2, yShift = (this.height % 2) / 2, angleCos = Math.cos(this.angle), angleSin = Math.sin(this.angle), dx = x - Math.round(x) + angleCos * xShift + angleSin * yShift, dy = y - Math.round(y) + angleCos * yShift + angleSin * xShift; var alignedM = new Float64Array(m); __chunk_1.translate(alignedM, alignedM, [ dx > 0.5 ? dx - 1 : dx, dy > 0.5 ? dy - 1 : dy, 0 ]); this.alignedProjMatrix = alignedM; m = __chunk_1.create(); __chunk_1.scale(m, m, [this.width / 2, -this.height / 2, 1]); __chunk_1.translate(m, m, [1, -1, 0]); this.labelPlaneMatrix = m; m = __chunk_1.create(); __chunk_1.scale(m, m, [1, -1, 1]); __chunk_1.translate(m, m, [-1, -1, 0]); __chunk_1.scale(m, m, [2 / this.width, 2 / this.height, 1]); this.glCoordMatrix = m; // matrix for conversion from location to screen coordinates this.pixelMatrix = __chunk_1.multiply(new Float64Array(16), this.labelPlaneMatrix, this.projMatrix); // inverse matrix for conversion from screen coordinaes to location m = __chunk_1.invert(new Float64Array(16), this.pixelMatrix); if (!m) { throw new Error("failed to invert matrix"); } this.pixelMatrixInverse = m; this._posMatrixCache = {}; this._alignedPosMatrixCache = {}; }; Transform.prototype.maxPitchScaleFactor = function maxPitchScaleFactor () { // calcMatrices hasn't run yet if (!this.pixelMatrixInverse) { return 1; } var coord = this.pointCoordinate(new __chunk_1.Point(0, 0)); var p = [coord.x * this.worldSize, coord.y * this.worldSize, 0, 1]; var topPoint = __chunk_1.transformMat4(p, p, this.pixelMatrix); return topPoint[3] / this.cameraToCenterDistance; }; /* * The camera looks at the map from a 3D (lng, lat, altitude) location. Let's use `cameraLocation` * as the name for the location under the camera and on the surface of the earth (lng, lat, 0). * `cameraPoint` is the projected position of the `cameraLocation`. * * This point is useful to us because only fill-extrusions that are between `cameraPoint` and * the query point on the surface of the earth can extend and intersect the query. * * When the map is not pitched the `cameraPoint` is equivalent to the center of the map because * the camera is right above the center of the map. */ Transform.prototype.getCameraPoint = function getCameraPoint () { var pitch = this._pitch; var yOffset = Math.tan(pitch) * (this.cameraToCenterDistance || 1); return this.centerPoint.add(new __chunk_1.Point(0, yOffset)); }; /* * When the map is pitched, some of the 3D features that intersect a query will not intersect * the query at the surface of the earth. Instead the feature may be closer and only intersect * the query because it extrudes into the air. * * This returns a geometry that includes all of the original query as well as all possible ares of the * screen where the *base* of a visible extrusion could be. * - For point queries, the line from the query point to the "camera point" * - For other geometries, the envelope of the query geometry and the "camera point" */ Transform.prototype.getCameraQueryGeometry = function getCameraQueryGeometry (queryGeometry ) { var c = this.getCameraPoint(); if (queryGeometry.length === 1) { return [queryGeometry[0], c]; } else { var minX = c.x; var minY = c.y; var maxX = c.x; var maxY = c.y; for (var i = 0, list = queryGeometry; i < list.length; i += 1) { var p = list[i]; minX = Math.min(minX, p.x); minY = Math.min(minY, p.y); maxX = Math.max(maxX, p.x); maxY = Math.max(maxY, p.y); } return [ new __chunk_1.Point(minX, minY), new __chunk_1.Point(maxX, minY), new __chunk_1.Point(maxX, maxY), new __chunk_1.Point(minX, maxY), new __chunk_1.Point(minX, minY) ]; } }; Object.defineProperties( Transform.prototype, prototypeAccessors ); // /** * Throttle the given function to run at most every `period` milliseconds. Throttle the given function to run at most every period milliseconds. * @private */ function throttle(fn , time ) { var pending = false; var timerId = (0 ); var later = function () { timerId = (0 ); if (pending) { fn(); timerId = setTimeout(later, time); pending = false; } }; return function () { pending = true; if (!timerId) { later(); } return timerId; }; } // /* * Adds the map's position to its page's location hash. * Passed as an option to the map object. * * @returns {Hash} `this` */ var Hash = function Hash() { __chunk_1.bindAll([ '_onHashChange', '_updateHash' ], this); // Mobile Safari doesn't allow updating the hash more than 100 times per 30 seconds. this._updateHash = throttle(this._updateHashUnthrottled.bind(this), 30 * 1000 / 100); }; /* * Map element to listen for coordinate changes * * @param {Object} map * @returns {Hash} `this` */ Hash.prototype.addTo = function addTo (map ) { this._map = map; __chunk_1.window.addEventListener('hashchange', this._onHashChange, false); this._map.on('moveend', this._updateHash); return this; }; /* * Removes hash * * @returns {Popup} `this` */ Hash.prototype.remove = function remove () { __chunk_1.window.removeEventListener('hashchange', this._onHashChange, false); this._map.off('moveend', this._updateHash); clearTimeout(this._updateHash()); delete this._map; return this; }; Hash.prototype.getHashString = function getHashString (mapFeedback ) { var center = this._map.getCenter(), zoom = Math.round(this._map.getZoom() * 100) / 100, // derived from equation: 512px * 2^z / 360 / 10^d < 0.5px precision = Math.ceil((zoom * Math.LN2 + Math.log(512 / 360 / 0.5)) / Math.LN10), m = Math.pow(10, precision), lng = Math.round(center.lng * m) / m, lat = Math.round(center.lat * m) / m, bearing = this._map.getBearing(), pitch = this._map.getPitch(); var hash = ''; if (mapFeedback) { // new map feedback site has some constraints that don't allow // us to use the same hash format as we do for the Map hash option. hash += "#/" + lng + "/" + lat + "/" + zoom; } else { hash += "#" + zoom + "/" + lat + "/" + lng; } if (bearing || pitch) { hash += (("/" + (Math.round(bearing * 10) / 10))); } if (pitch) { hash += (("/" + (Math.round(pitch)))); } return hash; }; Hash.prototype._onHashChange = function _onHashChange () { var loc = __chunk_1.window.location.hash.replace('#', '').split('/'); if (loc.length >= 3) { this._map.jumpTo({ center: [+loc[2], +loc[1]], zoom: +loc[0], bearing: +(loc[3] || 0), pitch: +(loc[4] || 0) }); return true; } return false; }; Hash.prototype._updateHashUnthrottled = function _updateHashUnthrottled () { var hash = this.getHashString(); try { __chunk_1.window.history.replaceState(__chunk_1.window.history.state, '', hash); } catch (SecurityError) { // IE11 does not allow this if the page is within an iframe created // with iframe.contentWindow.document.write(...). // https://github.com/mapbox/mapbox-gl-js/issues/7410 } }; // /** * `MapMouseEvent` is the event type for mouse-related map events. * @extends {Object} */ var MapMouseEvent = /*@__PURE__*/(function (Event) { function MapMouseEvent(type , map , originalEvent , data) { if ( data === void 0 ) data = {}; var point = DOM.mousePos(map.getCanvasContainer(), originalEvent); var lngLat = map.unproject(point); Event.call(this, type, __chunk_1.extend({ point: point, lngLat: lngLat, originalEvent: originalEvent }, data)); this._defaultPrevented = false; this.target = map; } if ( Event ) MapMouseEvent.__proto__ = Event; MapMouseEvent.prototype = Object.create( Event && Event.prototype ); MapMouseEvent.prototype.constructor = MapMouseEvent; var prototypeAccessors = { defaultPrevented: { configurable: true } }; MapMouseEvent.prototype.preventDefault = function preventDefault () { this._defaultPrevented = true; }; /** * `true` if `preventDefault` has been called. */ prototypeAccessors.defaultPrevented.get = function () { return this._defaultPrevented; }; Object.defineProperties( MapMouseEvent.prototype, prototypeAccessors ); return MapMouseEvent; }(__chunk_1.Event)); /** * `MapTouchEvent` is the event type for touch-related map events. * @extends {Object} */ var MapTouchEvent = /*@__PURE__*/(function (Event) { function MapTouchEvent(type , map , originalEvent ) { var points = DOM.touchPos(map.getCanvasContainer(), originalEvent); var lngLats = points.map(function (t) { return map.unproject(t); }); var point = points.reduce(function (prev, curr, i, arr) { return prev.add(curr.div(arr.length)); }, new __chunk_1.Point(0, 0)); var lngLat = map.unproject(point); Event.call(this, type, { points: points, point: point, lngLats: lngLats, lngLat: lngLat, originalEvent: originalEvent }); this._defaultPrevented = false; } if ( Event ) MapTouchEvent.__proto__ = Event; MapTouchEvent.prototype = Object.create( Event && Event.prototype ); MapTouchEvent.prototype.constructor = MapTouchEvent; var prototypeAccessors$1 = { defaultPrevented: { configurable: true } }; MapTouchEvent.prototype.preventDefault = function preventDefault () { this._defaultPrevented = true; }; /** * `true` if `preventDefault` has been called. */ prototypeAccessors$1.defaultPrevented.get = function () { return this._defaultPrevented; }; Object.defineProperties( MapTouchEvent.prototype, prototypeAccessors$1 ); return MapTouchEvent; }(__chunk_1.Event)); /** * `MapWheelEvent` is the event type for the `wheel` map event. * @extends {Object} */ var MapWheelEvent = /*@__PURE__*/(function (Event) { function MapWheelEvent(type , map , originalEvent ) { Event.call(this, type, { originalEvent: originalEvent }); this._defaultPrevented = false; } if ( Event ) MapWheelEvent.__proto__ = Event; MapWheelEvent.prototype = Object.create( Event && Event.prototype ); MapWheelEvent.prototype.constructor = MapWheelEvent; var prototypeAccessors$2 = { defaultPrevented: { configurable: true } }; MapWheelEvent.prototype.preventDefault = function preventDefault () { this._defaultPrevented = true; }; /** * `true` if `preventDefault` has been called. */ prototypeAccessors$2.defaultPrevented.get = function () { return this._defaultPrevented; }; Object.defineProperties( MapWheelEvent.prototype, prototypeAccessors$2 ); return MapWheelEvent; }(__chunk_1.Event)); /** * @typedef {Object} MapBoxZoomEvent * @property {MouseEvent} originalEvent */ /** * A `MapDataEvent` object is emitted with the {@link Map.event:data} * and {@link Map.event:dataloading} events. Possible values for * `dataType`s are: * * - `'source'`: The non-tile data associated with any source * - `'style'`: The [style](https://www.mapbox.com/mapbox-gl-style-spec/) used by the map * * @typedef {Object} MapDataEvent * @property {string} type The event type. * @property {string} dataType The type of data that has changed. One of `'source'`, `'style'`. * @property {boolean} [isSourceLoaded] True if the event has a `dataType` of `source` and the source has no outstanding network requests. * @property {Object} [source] The [style spec representation of the source](https://www.mapbox.com/mapbox-gl-style-spec/#sources) if the event has a `dataType` of `source`. * @property {string} [sourceDataType] Included if the event has a `dataType` of `source` and the event signals * that internal data has been received or changed. Possible values are `metadata` and `content`. * @property {Object} [tile] The tile being loaded or changed, if the event has a `dataType` of `source` and * the event is related to loading of a tile. * @property {Coordinate} [coord] The coordinate of the tile if the event has a `dataType` of `source` and * the event is related to loading of a tile. */ // // deltaY value for mouse scroll wheel identification var wheelZoomDelta = 4.000244140625; // These magic numbers control the rate of zoom. Trackpad events fire at a greater // frequency than mouse scroll wheel, so reduce the zoom rate per wheel tick var defaultZoomRate = 1 / 100; var wheelZoomRate = 1 / 450; // upper bound on how much we scale the map in any single render frame; this // is used to limit zoom rate in the case of very fast scrolling var maxScalePerFrame = 2; /** * The `ScrollZoomHandler` allows the user to zoom the map by scrolling. */ var ScrollZoomHandler = function ScrollZoomHandler(map ) { this._map = map; this._el = map.getCanvasContainer(); this._delta = 0; __chunk_1.bindAll([ '_onWheel', '_onTimeout', '_onScrollFrame', '_onScrollFinished' ], this); }; /** * Returns a Boolean indicating whether the "scroll to zoom" interaction is enabled. * * @returns {boolean} `true` if the "scroll to zoom" interaction is enabled. */ ScrollZoomHandler.prototype.isEnabled = function isEnabled () { return !!this._enabled; }; /* * Active state is turned on and off with every scroll wheel event and is set back to false before the map * render is called, so _active is not a good candidate for determining if a scroll zoom animation is in * progress. */ ScrollZoomHandler.prototype.isActive = function isActive () { return !!this._active; }; ScrollZoomHandler.prototype.isZooming = function isZooming () { return !!this._zooming; }; /** * Enables the "scroll to zoom" interaction. * * @param {Object} [options] * @param {string} [options.around] If "center" is passed, map will zoom around center of map * * @example * map.scrollZoom.enable(); * @example * map.scrollZoom.enable({ around: 'center' }) */ ScrollZoomHandler.prototype.enable = function enable (options ) { if (this.isEnabled()) { return; } this._enabled = true; this._aroundCenter = options && options.around === 'center'; }; /** * Disables the "scroll to zoom" interaction. * * @example * map.scrollZoom.disable(); */ ScrollZoomHandler.prototype.disable = function disable () { if (!this.isEnabled()) { return; } this._enabled = false; }; ScrollZoomHandler.prototype.onWheel = function onWheel (e ) { if (!this.isEnabled()) { return; } // Remove `any` cast when https://github.com/facebook/flow/issues/4879 is fixed. var value = e.deltaMode === (__chunk_1.window.WheelEvent ).DOM_DELTA_LINE ? e.deltaY * 40 : e.deltaY; var now = __chunk_1.browser.now(), timeDelta = now - (this._lastWheelEventTime || 0); this._lastWheelEventTime = now; if (value !== 0 && (value % wheelZoomDelta) === 0) { // This one is definitely a mouse wheel event. this._type = 'wheel'; } else if (value !== 0 && Math.abs(value) < 4) { // This one is definitely a trackpad event because it is so small. this._type = 'trackpad'; } else if (timeDelta > 400) { // This is likely a new scroll action. this._type = null; this._lastValue = value; // Start a timeout in case this was a singular event, and dely it by up to 40ms. this._timeout = setTimeout(this._onTimeout, 40, e); } else if (!this._type) { // This is a repeating event, but we don't know the type of event just yet. // If the delta per time is small, we assume it's a fast trackpad; otherwise we switch into wheel mode. this._type = (Math.abs(timeDelta * value) < 200) ? 'trackpad' : 'wheel'; // Make sure our delayed event isn't fired again, because we accumulate // the previous event (which was less than 40ms ago) into this event. if (this._timeout) { clearTimeout(this._timeout); this._timeout = null; value += this._lastValue; } } // Slow down zoom if shift key is held for more precise zooming if (e.shiftKey && value) { value = value / 4; } // Only fire the callback if we actually know what type of scrolling device the user uses. if (this._type) { this._lastWheelEvent = e; this._delta -= value; if (!this.isActive()) { this._start(e); } } e.preventDefault(); }; ScrollZoomHandler.prototype._onTimeout = function _onTimeout (initialEvent ) { this._type = 'wheel'; this._delta -= this._lastValue; if (!this.isActive()) { this._start(initialEvent); } }; ScrollZoomHandler.prototype._start = function _start (e ) { if (!this._delta) { return; } if (this._frameId) { this._map._cancelRenderFrame(this._frameId); this._frameId = null; } this._active = true; this._zooming = true; this._map.fire(new __chunk_1.Event('movestart', {originalEvent: e})); this._map.fire(new __chunk_1.Event('zoomstart', {originalEvent: e})); if (this._finishTimeout) { clearTimeout(this._finishTimeout); } var pos = DOM.mousePos(this._el, e); this._around = __chunk_1.LngLat.convert(this._aroundCenter ? this._map.getCenter() : this._map.unproject(pos)); this._aroundPoint = this._map.transform.locationPoint(this._around); if (!this._frameId) { this._frameId = this._map._requestRenderFrame(this._onScrollFrame); } }; ScrollZoomHandler.prototype._onScrollFrame = function _onScrollFrame () { var this$1 = this; this._frameId = null; if (!this.isActive()) { return; } var tr = this._map.transform; // if we've had scroll events since the last render frame, consume the // accumulated delta, and update the target zoom level accordingly if (this._delta !== 0) { // For trackpad events and single mouse wheel ticks, use the default zoom rate var zoomRate = (this._type === 'wheel' && Math.abs(this._delta) > wheelZoomDelta) ? wheelZoomRate : defaultZoomRate; // Scale by sigmoid of scroll wheel delta. var scale = maxScalePerFrame / (1 + Math.exp(-Math.abs(this._delta * zoomRate))); if (this._delta < 0 && scale !== 0) { scale = 1 / scale; } var fromScale = typeof this._targetZoom === 'number' ? tr.zoomScale(this._targetZoom) : tr.scale; this._targetZoom = Math.min(tr.maxZoom, Math.max(tr.minZoom, tr.scaleZoom(fromScale * scale))); // if this is a mouse wheel, refresh the starting zoom and easing // function we're using to smooth out the zooming between wheel // events if (this._type === 'wheel') { this._startZoom = tr.zoom; this._easing = this._smoothOutEasing(200); } this._delta = 0; } var targetZoom = typeof this._targetZoom === 'number' ? this._targetZoom : tr.zoom; var startZoom = this._startZoom; var easing = this._easing; var finished = false; if (this._type === 'wheel' && startZoom && easing) { __chunk_1.assert(easing && typeof startZoom === 'number'); var t = Math.min((__chunk_1.browser.now() - this._lastWheelEventTime) / 200, 1); var k = easing(t); tr.zoom = __chunk_1.number(startZoom, targetZoom, k); if (t < 1) { if (!this._frameId) { this._frameId = this._map._requestRenderFrame(this._onScrollFrame); } } else { finished = true; } } else { tr.zoom = targetZoom; finished = true; } tr.setLocationAtPoint(this._around, this._aroundPoint); this._map.fire(new __chunk_1.Event('move', {originalEvent: this._lastWheelEvent})); this._map.fire(new __chunk_1.Event('zoom', {originalEvent: this._lastWheelEvent})); if (finished) { this._active = false; this._finishTimeout = setTimeout(function () { this$1._zooming = false; this$1._map.fire(new __chunk_1.Event('zoomend', {originalEvent: this$1._lastWheelEvent})); this$1._map.fire(new __chunk_1.Event('moveend', {originalEvent: this$1._lastWheelEvent})); delete this$1._targetZoom; }, 200); } }; ScrollZoomHandler.prototype._smoothOutEasing = function _smoothOutEasing (duration ) { var easing = __chunk_1.ease; if (this._prevEase) { var ease = this._prevEase, t = (__chunk_1.browser.now() - ease.start) / ease.duration, speed = ease.easing(t + 0.01) - ease.easing(t), // Quick hack to make new bezier that is continuous with last x = 0.27 / Math.sqrt(speed * speed + 0.0001) * 0.01, y = Math.sqrt(0.27 * 0.27 - x * x); easing = __chunk_1.bezier(x, y, 0.25, 1); } this._prevEase = { start: __chunk_1.browser.now(), duration: duration, easing: easing }; return easing; }; // /** * The `BoxZoomHandler` allows the user to zoom the map to fit within a bounding box. * The bounding box is defined by clicking and holding `shift` while dragging the cursor. */ var BoxZoomHandler = function BoxZoomHandler(map , options ) { this._map = map; this._el = map.getCanvasContainer(); this._container = map.getContainer(); this._clickTolerance = options.clickTolerance || 1; __chunk_1.bindAll([ '_onMouseMove', '_onMouseUp', '_onKeyDown' ], this); }; /** * Returns a Boolean indicating whether the "box zoom" interaction is enabled. * * @returns {boolean} `true` if the "box zoom" interaction is enabled. */ BoxZoomHandler.prototype.isEnabled = function isEnabled () { return !!this._enabled; }; /** * Returns a Boolean indicating whether the "box zoom" interaction is active, i.e. currently being used. * * @returns {boolean} `true` if the "box zoom" interaction is active. */ BoxZoomHandler.prototype.isActive = function isActive () { return !!this._active; }; /** * Enables the "box zoom" interaction. * * @example * map.boxZoom.enable(); */ BoxZoomHandler.prototype.enable = function enable () { if (this.isEnabled()) { return; } this._enabled = true; }; /** * Disables the "box zoom" interaction. * * @example * map.boxZoom.disable(); */ BoxZoomHandler.prototype.disable = function disable () { if (!this.isEnabled()) { return; } this._enabled = false; }; BoxZoomHandler.prototype.onMouseDown = function onMouseDown (e ) { if (!this.isEnabled()) { return; } if (!(e.shiftKey && e.button === 0)) { return; } __chunk_1.window.document.addEventListener('mousemove', this._onMouseMove, false); __chunk_1.window.document.addEventListener('keydown', this._onKeyDown, false); __chunk_1.window.document.addEventListener('mouseup', this._onMouseUp, false); DOM.disableDrag(); this._startPos = this._lastPos = DOM.mousePos(this._el, e); this._active = true; }; BoxZoomHandler.prototype._onMouseMove = function _onMouseMove (e ) { var pos = DOM.mousePos(this._el, e); if (this._lastPos.equals(pos) || (!this._box && pos.dist(this._startPos) < this._clickTolerance)) { return; } var p0 = this._startPos; this._lastPos = pos; if (!this._box) { this._box = DOM.create('div', 'mapboxgl-boxzoom', this._container); this._container.classList.add('mapboxgl-crosshair'); this._fireEvent('boxzoomstart', e); } var minX = Math.min(p0.x, pos.x), maxX = Math.max(p0.x, pos.x), minY = Math.min(p0.y, pos.y), maxY = Math.max(p0.y, pos.y); DOM.setTransform(this._box, ("translate(" + minX + "px," + minY + "px)")); this._box.style.width = (maxX - minX) + "px"; this._box.style.height = (maxY - minY) + "px"; }; BoxZoomHandler.prototype._onMouseUp = function _onMouseUp (e ) { if (e.button !== 0) { return; } var p0 = this._startPos, p1 = DOM.mousePos(this._el, e); this._finish(); DOM.suppressClick(); if (p0.x === p1.x && p0.y === p1.y) { this._fireEvent('boxzoomcancel', e); } else { this._map .fitScreenCoordinates(p0, p1, this._map.getBearing(), {linear: true}) .fire(new __chunk_1.Event('boxzoomend', { originalEvent: e})); } }; BoxZoomHandler.prototype._onKeyDown = function _onKeyDown (e ) { if (e.keyCode === 27) { this._finish(); this._fireEvent('boxzoomcancel', e); } }; BoxZoomHandler.prototype._finish = function _finish () { this._active = false; __chunk_1.window.document.removeEventListener('mousemove', this._onMouseMove, false); __chunk_1.window.document.removeEventListener('keydown', this._onKeyDown, false); __chunk_1.window.document.removeEventListener('mouseup', this._onMouseUp, false); this._container.classList.remove('mapboxgl-crosshair'); if (this._box) { DOM.remove(this._box); this._box = (null ); } DOM.enableDrag(); delete this._startPos; delete this._lastPos; }; BoxZoomHandler.prototype._fireEvent = function _fireEvent (type , e ) { return this._map.fire(new __chunk_1.Event(type, { originalEvent: e })); }; // var inertiaLinearity = 0.25, inertiaEasing = __chunk_1.bezier(0, 0, inertiaLinearity, 1), inertiaMaxSpeed = 180, // deg/s inertiaDeceleration = 720; // deg/s^2 /** * The `DragRotateHandler` allows the user to rotate the map by clicking and * dragging the cursor while holding the right mouse button or `ctrl` key. */ var DragRotateHandler = function DragRotateHandler(map , options ) { this._map = map; this._el = options.element || map.getCanvasContainer(); this._state = 'disabled'; this._button = options.button || 'right'; this._bearingSnap = options.bearingSnap || 0; this._pitchWithRotate = options.pitchWithRotate !== false; __chunk_1.bindAll([ 'onMouseDown', '_onMouseMove', '_onMouseUp', '_onBlur', '_onDragFrame' ], this); }; /** * Returns a Boolean indicating whether the "drag to rotate" interaction is enabled. * * @returns {boolean} `true` if the "drag to rotate" interaction is enabled. */ DragRotateHandler.prototype.isEnabled = function isEnabled () { return this._state !== 'disabled'; }; /** * Returns a Boolean indicating whether the "drag to rotate" interaction is active, i.e. currently being used. * * @returns {boolean} `true` if the "drag to rotate" interaction is active. */ DragRotateHandler.prototype.isActive = function isActive () { return this._state === 'active'; }; /** * Enables the "drag to rotate" interaction. * * @example * map.dragRotate.enable(); */ DragRotateHandler.prototype.enable = function enable () { if (this.isEnabled()) { return; } this._state = 'enabled'; }; /** * Disables the "drag to rotate" interaction. * * @example * map.dragRotate.disable(); */ DragRotateHandler.prototype.disable = function disable () { if (!this.isEnabled()) { return; } switch (this._state) { case 'active': this._state = 'disabled'; this._unbind(); this._deactivate(); this._fireEvent('rotateend'); if (this._pitchWithRotate) { this._fireEvent('pitchend'); } this._fireEvent('moveend'); break; case 'pending': this._state = 'disabled'; this._unbind(); break; default: this._state = 'disabled'; break; } }; DragRotateHandler.prototype.onMouseDown = function onMouseDown (e ) { if (this._state !== 'enabled') { return; } if (this._button === 'right') { this._eventButton = DOM.mouseButton(e); if (this._eventButton !== (e.ctrlKey ? 0 : 2)) { return; } } else { if (e.ctrlKey || DOM.mouseButton(e) !== 0) { return; } this._eventButton = 0; } DOM.disableDrag(); // Bind window-level event listeners for move and up/end events. In the absence of // the pointer capture API, which is not supported by all necessary platforms, // window-level event listeners give us the best shot at capturing events that // fall outside the map canvas element. Use `{capture: true}` for the move event // to prevent map move events from being fired during a drag. __chunk_1.window.document.addEventListener('mousemove', this._onMouseMove, {capture: true}); __chunk_1.window.document.addEventListener('mouseup', this._onMouseUp); // Deactivate when the window loses focus. Otherwise if a mouseup occurs when the window // isn't in focus, dragging will continue even though the mouse is no longer pressed. __chunk_1.window.addEventListener('blur', this._onBlur); this._state = 'pending'; this._inertia = [[__chunk_1.browser.now(), this._map.getBearing()]]; this._startPos = this._lastPos = DOM.mousePos(this._el, e); this._center = this._map.transform.centerPoint; // Center of rotation e.preventDefault(); }; DragRotateHandler.prototype._onMouseMove = function _onMouseMove (e ) { var pos = DOM.mousePos(this._el, e); if (this._lastPos.equals(pos)) { return; } this._lastMoveEvent = e; this._lastPos = pos; if (this._state === 'pending') { this._state = 'active'; this._fireEvent('rotatestart', e); this._fireEvent('movestart', e); if (this._pitchWithRotate) { this._fireEvent('pitchstart', e); } } if (!this._frameId) { this._frameId = this._map._requestRenderFrame(this._onDragFrame); } }; DragRotateHandler.prototype._onDragFrame = function _onDragFrame () { this._frameId = null; var e = this._lastMoveEvent; if (!e) { return; } var tr = this._map.transform; var p1 = this._startPos, p2 = this._lastPos, bearingDiff = (p1.x - p2.x) * 0.8, pitchDiff = (p1.y - p2.y) * -0.5, bearing = tr.bearing - bearingDiff, pitch = tr.pitch - pitchDiff, inertia = this._inertia, last = inertia[inertia.length - 1]; this._drainInertiaBuffer(); inertia.push([__chunk_1.browser.now(), this._map._normalizeBearing(bearing, last[1])]); tr.bearing = bearing; if (this._pitchWithRotate) { this._fireEvent('pitch', e); tr.pitch = pitch; } this._fireEvent('rotate', e); this._fireEvent('move', e); delete this._lastMoveEvent; this._startPos = this._lastPos; }; DragRotateHandler.prototype._onMouseUp = function _onMouseUp (e ) { if (DOM.mouseButton(e) !== this._eventButton) { return; } switch (this._state) { case 'active': this._state = 'enabled'; DOM.suppressClick(); this._unbind(); this._deactivate(); this._inertialRotate(e); break; case 'pending': this._state = 'enabled'; this._unbind(); break; default: __chunk_1.assert(false); break; } }; DragRotateHandler.prototype._onBlur = function _onBlur (e ) { switch (this._state) { case 'active': this._state = 'enabled'; this._unbind(); this._deactivate(); this._fireEvent('rotateend', e); if (this._pitchWithRotate) { this._fireEvent('pitchend', e); } this._fireEvent('moveend', e); break; case 'pending': this._state = 'enabled'; this._unbind(); break; default: __chunk_1.assert(false); break; } }; DragRotateHandler.prototype._unbind = function _unbind () { __chunk_1.window.document.removeEventListener('mousemove', this._onMouseMove, {capture: true}); __chunk_1.window.document.removeEventListener('mouseup', this._onMouseUp); __chunk_1.window.removeEventListener('blur', this._onBlur); DOM.enableDrag(); }; DragRotateHandler.prototype._deactivate = function _deactivate () { if (this._frameId) { this._map._cancelRenderFrame(this._frameId); this._frameId = null; } delete this._lastMoveEvent; delete this._startPos; delete this._lastPos; }; DragRotateHandler.prototype._inertialRotate = function _inertialRotate (e ) { var this$1 = this; this._fireEvent('rotateend', e); this._drainInertiaBuffer(); var map = this._map, mapBearing = map.getBearing(), inertia = this._inertia; var finish = function () { if (Math.abs(mapBearing) < this$1._bearingSnap) { map.resetNorth({noMoveStart: true}, { originalEvent: e }); } else { this$1._fireEvent('moveend', e); } if (this$1._pitchWithRotate) { this$1._fireEvent('pitchend', e); } }; if (inertia.length < 2) { finish(); return; } var first = inertia[0], last = inertia[inertia.length - 1], previous = inertia[inertia.length - 2]; var bearing = map._normalizeBearing(mapBearing, previous[1]); var flingDiff = last[1] - first[1], sign = flingDiff < 0 ? -1 : 1, flingDuration = (last[0] - first[0]) / 1000; if (flingDiff === 0 || flingDuration === 0) { finish(); return; } var speed = Math.abs(flingDiff * (inertiaLinearity / flingDuration)); // deg/s if (speed > inertiaMaxSpeed) { speed = inertiaMaxSpeed; } var duration = speed / (inertiaDeceleration * inertiaLinearity), offset = sign * speed * (duration / 2); bearing += offset; if (Math.abs(map._normalizeBearing(bearing, 0)) < this._bearingSnap) { bearing = map._normalizeBearing(0, bearing); } map.rotateTo(bearing, { duration: duration * 1000, easing: inertiaEasing, noMoveStart: true }, { originalEvent: e }); }; DragRotateHandler.prototype._fireEvent = function _fireEvent (type , e ) { return this._map.fire(new __chunk_1.Event(type, e ? { originalEvent: e } : {})); }; DragRotateHandler.prototype._drainInertiaBuffer = function _drainInertiaBuffer () { var inertia = this._inertia, now = __chunk_1.browser.now(), cutoff = 160; //msec while (inertia.length > 0 && now - inertia[0][0] > cutoff) { inertia.shift(); } }; // var inertiaLinearity$1 = 0.3, inertiaEasing$1 = __chunk_1.bezier(0, 0, inertiaLinearity$1, 1), inertiaMaxSpeed$1 = 1400, // px/s inertiaDeceleration$1 = 2500; // px/s^2 /** * The `DragPanHandler` allows the user to pan the map by clicking and dragging * the cursor. */ var DragPanHandler = function DragPanHandler(map , options ) { this._map = map; this._el = map.getCanvasContainer(); this._state = 'disabled'; this._clickTolerance = options.clickTolerance || 1; __chunk_1.bindAll([ '_onMove', '_onMouseUp', '_onTouchEnd', '_onBlur', '_onDragFrame' ], this); }; /** * Returns a Boolean indicating whether the "drag to pan" interaction is enabled. * * @returns {boolean} `true` if the "drag to pan" interaction is enabled. */ DragPanHandler.prototype.isEnabled = function isEnabled () { return this._state !== 'disabled'; }; /** * Returns a Boolean indicating whether the "drag to pan" interaction is active, i.e. currently being used. * * @returns {boolean} `true` if the "drag to pan" interaction is active. */ DragPanHandler.prototype.isActive = function isActive () { return this._state === 'active'; }; /** * Enables the "drag to pan" interaction. * * @example * map.dragPan.enable(); */ DragPanHandler.prototype.enable = function enable () { if (this.isEnabled()) { return; } this._el.classList.add('mapboxgl-touch-drag-pan'); this._state = 'enabled'; }; /** * Disables the "drag to pan" interaction. * * @example * map.dragPan.disable(); */ DragPanHandler.prototype.disable = function disable () { if (!this.isEnabled()) { return; } this._el.classList.remove('mapboxgl-touch-drag-pan'); switch (this._state) { case 'active': this._state = 'disabled'; this._unbind(); this._deactivate(); this._fireEvent('dragend'); this._fireEvent('moveend'); break; case 'pending': this._state = 'disabled'; this._unbind(); break; default: this._state = 'disabled'; break; } }; DragPanHandler.prototype.onMouseDown = function onMouseDown (e ) { if (this._state !== 'enabled') { return; } if (e.ctrlKey || DOM.mouseButton(e) !== 0) { return; } // Bind window-level event listeners for mousemove/up events. In the absence of // the pointer capture API, which is not supported by all necessary platforms, // window-level event listeners give us the best shot at capturing events that // fall outside the map canvas element. Use `{capture: true}` for the move event // to prevent map move events from being fired during a drag. DOM.addEventListener(__chunk_1.window.document, 'mousemove', this._onMove, {capture: true}); DOM.addEventListener(__chunk_1.window.document, 'mouseup', this._onMouseUp); this._start(e); }; DragPanHandler.prototype.onTouchStart = function onTouchStart (e ) { if (this._state !== 'enabled') { return; } if (e.touches.length > 1) { return; } // Bind window-level event listeners for touchmove/end events. In the absence of // the pointer capture API, which is not supported by all necessary platforms, // window-level event listeners give us the best shot at capturing events that // fall outside the map canvas element. Use `{capture: true}` for the move event // to prevent map move events from being fired during a drag. DOM.addEventListener(__chunk_1.window.document, 'touchmove', this._onMove, {capture: true, passive: false}); DOM.addEventListener(__chunk_1.window.document, 'touchend', this._onTouchEnd); this._start(e); }; DragPanHandler.prototype._start = function _start (e ) { // Deactivate when the window loses focus. Otherwise if a mouseup occurs when the window // isn't in focus, dragging will continue even though the mouse is no longer pressed. __chunk_1.window.addEventListener('blur', this._onBlur); this._state = 'pending'; this._startPos = this._mouseDownPos = this._lastPos = DOM.mousePos(this._el, e); this._inertia = [[__chunk_1.browser.now(), this._startPos]]; }; DragPanHandler.prototype._onMove = function _onMove (e ) { e.preventDefault(); var pos = DOM.mousePos(this._el, e); if (this._lastPos.equals(pos) || (this._state === 'pending' && pos.dist(this._mouseDownPos) < this._clickTolerance)) { return; } this._lastMoveEvent = e; this._lastPos = pos; this._drainInertiaBuffer(); this._inertia.push([__chunk_1.browser.now(), this._lastPos]); if (this._state === 'pending') { // we treat the first move event (rather than the mousedown event) // as the start of the drag this._state = 'active'; this._fireEvent('dragstart', e); this._fireEvent('movestart', e); } if (!this._frameId) { this._frameId = this._map._requestRenderFrame(this._onDragFrame); } }; /** * Called in each render frame while dragging is happening. * @private */ DragPanHandler.prototype._onDragFrame = function _onDragFrame () { this._frameId = null; var e = this._lastMoveEvent; if (!e) { return; } var tr = this._map.transform; tr.setLocationAtPoint(tr.pointLocation(this._startPos), this._lastPos); this._fireEvent('drag', e); this._fireEvent('move', e); this._startPos = this._lastPos; delete this._lastMoveEvent; }; DragPanHandler.prototype._onMouseUp = function _onMouseUp (e ) { if (DOM.mouseButton(e) !== 0) { return; } switch (this._state) { case 'active': this._state = 'enabled'; DOM.suppressClick(); this._unbind(); this._deactivate(); this._inertialPan(e); break; case 'pending': this._state = 'enabled'; this._unbind(); break; default: __chunk_1.assert(false); break; } }; DragPanHandler.prototype._onTouchEnd = function _onTouchEnd (e ) { switch (this._state) { case 'active': this._state = 'enabled'; this._unbind(); this._deactivate(); this._inertialPan(e); break; case 'pending': this._state = 'enabled'; this._unbind(); break; default: __chunk_1.assert(false); break; } }; DragPanHandler.prototype._onBlur = function _onBlur (e ) { switch (this._state) { case 'active': this._state = 'enabled'; this._unbind(); this._deactivate(); this._fireEvent('dragend', e); this._fireEvent('moveend', e); break; case 'pending': this._state = 'enabled'; this._unbind(); break; default: __chunk_1.assert(false); break; } }; DragPanHandler.prototype._unbind = function _unbind () { DOM.removeEventListener(__chunk_1.window.document, 'touchmove', this._onMove, {capture: true, passive: false}); DOM.removeEventListener(__chunk_1.window.document, 'touchend', this._onTouchEnd); DOM.removeEventListener(__chunk_1.window.document, 'mousemove', this._onMove, {capture: true}); DOM.removeEventListener(__chunk_1.window.document, 'mouseup', this._onMouseUp); DOM.removeEventListener(__chunk_1.window, 'blur', this._onBlur); }; DragPanHandler.prototype._deactivate = function _deactivate () { if (this._frameId) { this._map._cancelRenderFrame(this._frameId); this._frameId = null; } delete this._lastMoveEvent; delete this._startPos; delete this._mouseDownPos; delete this._lastPos; }; DragPanHandler.prototype._inertialPan = function _inertialPan (e ) { this._fireEvent('dragend', e); this._drainInertiaBuffer(); var inertia = this._inertia; if (inertia.length < 2) { this._fireEvent('moveend', e); return; } var last = inertia[inertia.length - 1], first = inertia[0], flingOffset = last[1].sub(first[1]), flingDuration = (last[0] - first[0]) / 1000; if (flingDuration === 0 || last[1].equals(first[1])) { this._fireEvent('moveend', e); return; } // calculate px/s velocity & adjust for increased initial animation speed when easing out var velocity = flingOffset.mult(inertiaLinearity$1 / flingDuration); var speed = velocity.mag(); // px/s if (speed > inertiaMaxSpeed$1) { speed = inertiaMaxSpeed$1; velocity._unit()._mult(speed); } var duration = speed / (inertiaDeceleration$1 * inertiaLinearity$1), offset = velocity.mult(-duration / 2); this._map.panBy(offset, { duration: duration * 1000, easing: inertiaEasing$1, noMoveStart: true }, { originalEvent: e }); }; DragPanHandler.prototype._fireEvent = function _fireEvent (type , e ) { return this._map.fire(new __chunk_1.Event(type, e ? { originalEvent: e } : {})); }; DragPanHandler.prototype._drainInertiaBuffer = function _drainInertiaBuffer () { var inertia = this._inertia, now = __chunk_1.browser.now(), cutoff = 160; // msec while (inertia.length > 0 && now - inertia[0][0] > cutoff) { inertia.shift(); } }; // var panStep = 100, bearingStep = 15, pitchStep = 10; /** * The `KeyboardHandler` allows the user to zoom, rotate, and pan the map using * the following keyboard shortcuts: * * - `=` / `+`: Increase the zoom level by 1. * - `Shift-=` / `Shift-+`: Increase the zoom level by 2. * - `-`: Decrease the zoom level by 1. * - `Shift--`: Decrease the zoom level by 2. * - Arrow keys: Pan by 100 pixels. * - `Shift+⇢`: Increase the rotation by 15 degrees. * - `Shift+⇠`: Decrease the rotation by 15 degrees. * - `Shift+⇡`: Increase the pitch by 10 degrees. * - `Shift+⇣`: Decrease the pitch by 10 degrees. */ var KeyboardHandler = function KeyboardHandler(map ) { this._map = map; this._el = map.getCanvasContainer(); __chunk_1.bindAll([ '_onKeyDown' ], this); }; /** * Returns a Boolean indicating whether keyboard interaction is enabled. * * @returns {boolean} `true` if keyboard interaction is enabled. */ KeyboardHandler.prototype.isEnabled = function isEnabled () { return !!this._enabled; }; /** * Enables keyboard interaction. * * @example * map.keyboard.enable(); */ KeyboardHandler.prototype.enable = function enable () { if (this.isEnabled()) { return; } this._el.addEventListener('keydown', this._onKeyDown, false); this._enabled = true; }; /** * Disables keyboard interaction. * * @example * map.keyboard.disable(); */ KeyboardHandler.prototype.disable = function disable () { if (!this.isEnabled()) { return; } this._el.removeEventListener('keydown', this._onKeyDown); this._enabled = false; }; KeyboardHandler.prototype._onKeyDown = function _onKeyDown (e ) { if (e.altKey || e.ctrlKey || e.metaKey) { return; } var zoomDir = 0; var bearingDir = 0; var pitchDir = 0; var xDir = 0; var yDir = 0; switch (e.keyCode) { case 61: case 107: case 171: case 187: zoomDir = 1; break; case 189: case 109: case 173: zoomDir = -1; break; case 37: if (e.shiftKey) { bearingDir = -1; } else { e.preventDefault(); xDir = -1; } break; case 39: if (e.shiftKey) { bearingDir = 1; } else { e.preventDefault(); xDir = 1; } break; case 38: if (e.shiftKey) { pitchDir = 1; } else { e.preventDefault(); yDir = -1; } break; case 40: if (e.shiftKey) { pitchDir = -1; } else { yDir = 1; e.preventDefault(); } break; default: return; } var map = this._map; var zoom = map.getZoom(); var easeOptions = { duration: 300, delayEndEvents: 500, easing: easeOut, zoom: zoomDir ? Math.round(zoom) + zoomDir * (e.shiftKey ? 2 : 1) : zoom, bearing: map.getBearing() + bearingDir * bearingStep, pitch: map.getPitch() + pitchDir * pitchStep, offset: [-xDir * panStep, -yDir * panStep], center: map.getCenter() }; map.easeTo(easeOptions, {originalEvent: e}); }; function easeOut(t) { return t * (2 - t); } // /** * The `DoubleClickZoomHandler` allows the user to zoom the map at a point by * double clicking or double tapping. */ var DoubleClickZoomHandler = function DoubleClickZoomHandler(map ) { this._map = map; __chunk_1.bindAll([ '_onDblClick', '_onZoomEnd' ], this); }; /** * Returns a Boolean indicating whether the "double click to zoom" interaction is enabled. * * @returns {boolean} `true` if the "double click to zoom" interaction is enabled. */ DoubleClickZoomHandler.prototype.isEnabled = function isEnabled () { return !!this._enabled; }; /** * Returns a Boolean indicating whether the "double click to zoom" interaction is active, i.e. currently being used. * * @returns {boolean} `true` if the "double click to zoom" interaction is active. */ DoubleClickZoomHandler.prototype.isActive = function isActive () { return !!this._active; }; /** * Enables the "double click to zoom" interaction. * * @example * map.doubleClickZoom.enable(); */ DoubleClickZoomHandler.prototype.enable = function enable () { if (this.isEnabled()) { return; } this._enabled = true; }; /** * Disables the "double click to zoom" interaction. * * @example * map.doubleClickZoom.disable(); */ DoubleClickZoomHandler.prototype.disable = function disable () { if (!this.isEnabled()) { return; } this._enabled = false; }; DoubleClickZoomHandler.prototype.onTouchStart = function onTouchStart (e ) { var this$1 = this; if (!this.isEnabled()) { return; } if (e.points.length > 1) { return; } if (!this._tapped) { this._tapped = setTimeout(function () { this$1._tapped = null; }, 300); } else { clearTimeout(this._tapped); this._tapped = null; this._zoom(e); } }; DoubleClickZoomHandler.prototype.onDblClick = function onDblClick (e ) { if (!this.isEnabled()) { return; } e.originalEvent.preventDefault(); this._zoom(e); }; DoubleClickZoomHandler.prototype._zoom = function _zoom (e ) { this._active = true; this._map.on('zoomend', this._onZoomEnd); this._map.zoomTo( this._map.getZoom() + (e.originalEvent.shiftKey ? -1 : 1), {around: e.lngLat}, e ); }; DoubleClickZoomHandler.prototype._onZoomEnd = function _onZoomEnd () { this._active = false; this._map.off('zoomend', this._onZoomEnd); }; // var inertiaLinearity$2 = 0.15, inertiaEasing$2 = __chunk_1.bezier(0, 0, inertiaLinearity$2, 1), inertiaDeceleration$2 = 12, // scale / s^2 inertiaMaxSpeed$2 = 2.5, // scale / s significantScaleThreshold = 0.15, significantRotateThreshold = 10; /** * The `TouchZoomRotateHandler` allows the user to zoom and rotate the map by * pinching on a touchscreen. */ var TouchZoomRotateHandler = function TouchZoomRotateHandler(map ) { this._map = map; this._el = map.getCanvasContainer(); __chunk_1.bindAll([ '_onMove', '_onEnd', '_onTouchFrame' ], this); }; /** * Returns a Boolean indicating whether the "pinch to rotate and zoom" interaction is enabled. * * @returns {boolean} `true` if the "pinch to rotate and zoom" interaction is enabled. */ TouchZoomRotateHandler.prototype.isEnabled = function isEnabled () { return !!this._enabled; }; /** * Enables the "pinch to rotate and zoom" interaction. * * @param {Object} [options] * @param {string} [options.around] If "center" is passed, map will zoom around the center * * @example * map.touchZoomRotate.enable(); * @example * map.touchZoomRotate.enable({ around: 'center' }); */ TouchZoomRotateHandler.prototype.enable = function enable (options ) { if (this.isEnabled()) { return; } this._el.classList.add('mapboxgl-touch-zoom-rotate'); this._enabled = true; this._aroundCenter = !!options && options.around === 'center'; }; /** * Disables the "pinch to rotate and zoom" interaction. * * @example * map.touchZoomRotate.disable(); */ TouchZoomRotateHandler.prototype.disable = function disable () { if (!this.isEnabled()) { return; } this._el.classList.remove('mapboxgl-touch-zoom-rotate'); this._enabled = false; }; /** * Disables the "pinch to rotate" interaction, leaving the "pinch to zoom" * interaction enabled. * * @example * map.touchZoomRotate.disableRotation(); */ TouchZoomRotateHandler.prototype.disableRotation = function disableRotation () { this._rotationDisabled = true; }; /** * Enables the "pinch to rotate" interaction. * * @example * map.touchZoomRotate.enable(); * map.touchZoomRotate.enableRotation(); */ TouchZoomRotateHandler.prototype.enableRotation = function enableRotation () { this._rotationDisabled = false; }; TouchZoomRotateHandler.prototype.onStart = function onStart (e ) { if (!this.isEnabled()) { return; } if (e.touches.length !== 2) { return; } var p0 = DOM.mousePos(this._el, e.touches[0]), p1 = DOM.mousePos(this._el, e.touches[1]), center = p0.add(p1).div(2); this._startVec = p0.sub(p1); this._startAround = this._map.transform.pointLocation(center); this._gestureIntent = undefined; this._inertia = []; DOM.addEventListener(__chunk_1.window.document, 'touchmove', this._onMove, {passive: false}); DOM.addEventListener(__chunk_1.window.document, 'touchend', this._onEnd); }; TouchZoomRotateHandler.prototype._getTouchEventData = function _getTouchEventData (e ) { var p0 = DOM.mousePos(this._el, e.touches[0]), p1 = DOM.mousePos(this._el, e.touches[1]); var vec = p0.sub(p1); return { vec: vec, center: p0.add(p1).div(2), scale: vec.mag() / this._startVec.mag(), bearing: this._rotationDisabled ? 0 : vec.angleWith(this._startVec) * 180 / Math.PI }; }; TouchZoomRotateHandler.prototype._onMove = function _onMove (e ) { if (e.touches.length !== 2) { return; } var ref = this._getTouchEventData(e); var vec = ref.vec; var scale = ref.scale; var bearing = ref.bearing; // Determine 'intent' by whichever threshold is surpassed first, // then keep that state for the duration of this gesture. if (!this._gestureIntent) { // when rotation is disabled, any scale change triggers the zoom gesture to start var scalingSignificantly = (this._rotationDisabled && scale !== 1) || (Math.abs(1 - scale) > significantScaleThreshold), rotatingSignificantly = (Math.abs(bearing) > significantRotateThreshold); if (rotatingSignificantly) { this._gestureIntent = 'rotate'; } else if (scalingSignificantly) { this._gestureIntent = 'zoom'; } if (this._gestureIntent) { this._map.fire(new __chunk_1.Event(((this._gestureIntent) + "start"), { originalEvent: e })); this._map.fire(new __chunk_1.Event('movestart', { originalEvent: e })); this._startVec = vec; } } this._lastTouchEvent = e; if (!this._frameId) { this._frameId = this._map._requestRenderFrame(this._onTouchFrame); } e.preventDefault(); }; TouchZoomRotateHandler.prototype._onTouchFrame = function _onTouchFrame () { this._frameId = null; var gestureIntent = this._gestureIntent; if (!gestureIntent) { return; } var tr = this._map.transform; if (!this._startScale) { this._startScale = tr.scale; this._startBearing = tr.bearing; } var ref = this._getTouchEventData(this._lastTouchEvent); var center = ref.center; var bearing = ref.bearing; var scale = ref.scale; var around = tr.pointLocation(center); var aroundPoint = tr.locationPoint(around); if (gestureIntent === 'rotate') { tr.bearing = this._startBearing + bearing; } tr.zoom = tr.scaleZoom(this._startScale * scale); tr.setLocationAtPoint(this._startAround, aroundPoint); this._map.fire(new __chunk_1.Event(gestureIntent, {originalEvent: this._lastTouchEvent})); this._map.fire(new __chunk_1.Event('move', {originalEvent: this._lastTouchEvent})); this._drainInertiaBuffer(); this._inertia.push([__chunk_1.browser.now(), scale, center]); }; TouchZoomRotateHandler.prototype._onEnd = function _onEnd (e ) { DOM.removeEventListener(__chunk_1.window.document, 'touchmove', this._onMove, {passive: false}); DOM.removeEventListener(__chunk_1.window.document, 'touchend', this._onEnd); var gestureIntent = this._gestureIntent; var startScale = this._startScale; if (this._frameId) { this._map._cancelRenderFrame(this._frameId); this._frameId = null; } delete this._gestureIntent; delete this._startScale; delete this._startBearing; delete this._lastTouchEvent; if (!gestureIntent) { return; } this._map.fire(new __chunk_1.Event((gestureIntent + "end"), { originalEvent: e })); this._drainInertiaBuffer(); var inertia = this._inertia, map = this._map; if (inertia.length < 2) { map.snapToNorth({}, { originalEvent: e }); return; } var last = inertia[inertia.length - 1], first = inertia[0], lastScale = map.transform.scaleZoom(startScale * last[1]), firstScale = map.transform.scaleZoom(startScale * first[1]), scaleOffset = lastScale - firstScale, scaleDuration = (last[0] - first[0]) / 1000, p = last[2]; if (scaleDuration === 0 || lastScale === firstScale) { map.snapToNorth({}, { originalEvent: e }); return; } // calculate scale/s speed and adjust for increased initial animation speed when easing var speed = scaleOffset * inertiaLinearity$2 / scaleDuration; // scale/s if (Math.abs(speed) > inertiaMaxSpeed$2) { if (speed > 0) { speed = inertiaMaxSpeed$2; } else { speed = -inertiaMaxSpeed$2; } } var duration = Math.abs(speed / (inertiaDeceleration$2 * inertiaLinearity$2)) * 1000; var targetScale = lastScale + speed * duration / 2000; if (targetScale < 0) { targetScale = 0; } map.easeTo({ zoom: targetScale, duration: duration, easing: inertiaEasing$2, around: this._aroundCenter ? map.getCenter() : map.unproject(p), noMoveStart: true }, { originalEvent: e }); }; TouchZoomRotateHandler.prototype._drainInertiaBuffer = function _drainInertiaBuffer () { var inertia = this._inertia, now = __chunk_1.browser.now(), cutoff = 160; // msec while (inertia.length > 2 && now - inertia[0][0] > cutoff) { inertia.shift(); } }; // var handlers = { scrollZoom: ScrollZoomHandler, boxZoom: BoxZoomHandler, dragRotate: DragRotateHandler, dragPan: DragPanHandler, keyboard: KeyboardHandler, doubleClickZoom: DoubleClickZoomHandler, touchZoomRotate: TouchZoomRotateHandler }; function bindHandlers(map , options ) { var el = map.getCanvasContainer(); var contextMenuEvent = null; var mouseDown = false; var startPos = null; for (var name in handlers) { (map )[name] = new handlers[name](map, options); if (options.interactive && options[name]) { (map )[name].enable(options[name]); } } DOM.addEventListener(el, 'mouseout', onMouseOut); DOM.addEventListener(el, 'mousedown', onMouseDown); DOM.addEventListener(el, 'mouseup', onMouseUp); DOM.addEventListener(el, 'mousemove', onMouseMove); DOM.addEventListener(el, 'mouseover', onMouseOver); // Bind touchstart and touchmove with passive: false because, even though // they only fire a map events and therefore could theoretically be // passive, binding with passive: true causes iOS not to respect // e.preventDefault() in _other_ handlers, even if they are non-passive // (see https://bugs.webkit.org/show_bug.cgi?id=184251) DOM.addEventListener(el, 'touchstart', onTouchStart, {passive: false}); DOM.addEventListener(el, 'touchmove', onTouchMove, {passive: false}); DOM.addEventListener(el, 'touchend', onTouchEnd); DOM.addEventListener(el, 'touchcancel', onTouchCancel); DOM.addEventListener(el, 'click', onClick); DOM.addEventListener(el, 'dblclick', onDblClick); DOM.addEventListener(el, 'contextmenu', onContextMenu); DOM.addEventListener(el, 'wheel', onWheel, {passive: false}); function onMouseDown(e ) { mouseDown = true; startPos = DOM.mousePos(el, e); var mapEvent = new MapMouseEvent('mousedown', map, e); map.fire(mapEvent); if (mapEvent.defaultPrevented) { return; } if (options.interactive && !map.doubleClickZoom.isActive()) { map.stop(); } map.boxZoom.onMouseDown(e); if (!map.boxZoom.isActive() && !map.dragPan.isActive()) { map.dragRotate.onMouseDown(e); } if (!map.boxZoom.isActive() && !map.dragRotate.isActive()) { map.dragPan.onMouseDown(e); } } function onMouseUp(e ) { var rotating = map.dragRotate.isActive(); if (contextMenuEvent && !rotating) { // This will be the case for Mac map.fire(new MapMouseEvent('contextmenu', map, contextMenuEvent)); } contextMenuEvent = null; mouseDown = false; map.fire(new MapMouseEvent('mouseup', map, e)); } function onMouseMove(e ) { if (map.dragPan.isActive()) { return; } if (map.dragRotate.isActive()) { return; } var target = (e.target ); while (target && target !== el) { target = target.parentNode; } if (target !== el) { return; } map.fire(new MapMouseEvent('mousemove', map, e)); } function onMouseOver(e ) { var target = (e.target ); while (target && target !== el) { target = target.parentNode; } if (target !== el) { return; } map.fire(new MapMouseEvent('mouseover', map, e)); } function onMouseOut(e ) { map.fire(new MapMouseEvent('mouseout', map, e)); } function onTouchStart(e ) { var mapEvent = new MapTouchEvent('touchstart', map, e); map.fire(mapEvent); if (mapEvent.defaultPrevented) { return; } if (options.interactive) { map.stop(); } if (!map.boxZoom.isActive() && !map.dragRotate.isActive()) { map.dragPan.onTouchStart(e); } map.touchZoomRotate.onStart(e); map.doubleClickZoom.onTouchStart(mapEvent); } function onTouchMove(e ) { map.fire(new MapTouchEvent('touchmove', map, e)); } function onTouchEnd(e ) { map.fire(new MapTouchEvent('touchend', map, e)); } function onTouchCancel(e ) { map.fire(new MapTouchEvent('touchcancel', map, e)); } function onClick(e ) { var pos = DOM.mousePos(el, e); if (pos.equals(startPos) || pos.dist(startPos) < options.clickTolerance) { map.fire(new MapMouseEvent('click', map, e)); } } function onDblClick(e ) { var mapEvent = new MapMouseEvent('dblclick', map, e); map.fire(mapEvent); if (mapEvent.defaultPrevented) { return; } map.doubleClickZoom.onDblClick(mapEvent); } function onContextMenu(e ) { var rotating = map.dragRotate.isActive(); if (!mouseDown && !rotating) { // Windows: contextmenu fired on mouseup, so fire event now map.fire(new MapMouseEvent('contextmenu', map, e)); } else if (mouseDown) { // Mac: contextmenu fired on mousedown; we save it until mouseup for consistency's sake contextMenuEvent = e; } // prevent browser context menu when necessary; we don't allow it with rotation // because we can't discern rotation gesture start from contextmenu on Mac if (map.dragRotate.isEnabled() || map.listens('contextmenu')) { e.preventDefault(); } } function onWheel(e ) { if (options.interactive) { map.stop(); } var mapEvent = new MapWheelEvent('wheel', map, e); map.fire(mapEvent); if (mapEvent.defaultPrevented) { return; } map.scrollZoom.onWheel(e); } } // /** * Options common to {@link Map#jumpTo}, {@link Map#easeTo}, and {@link Map#flyTo}, controlling the desired location, * zoom, bearing, and pitch of the camera. All properties are optional, and when a property is omitted, the current * camera value for that property will remain unchanged. * * @typedef {Object} CameraOptions * @property {LngLatLike} center The desired center. * @property {number} zoom The desired zoom level. * @property {number} bearing The desired bearing, in degrees. The bearing is the compass direction that * is "up"; for example, a bearing of 90° orients the map so that east is up. * @property {number} pitch The desired pitch, in degrees. * @property {LngLatLike} around If `zoom` is specified, `around` determines the point around which the zoom is centered. */ /** * Options common to map movement methods that involve animation, such as {@link Map#panBy} and * {@link Map#easeTo}, controlling the duration and easing function of the animation. All properties * are optional. * * @typedef {Object} AnimationOptions * @property {number} duration The animation's duration, measured in milliseconds. * @property {Function} easing A function taking a time in the range 0..1 and returning a number where 0 is * the initial state and 1 is the final state. * @property {PointLike} offset of the target center relative to real map container center at the end of animation. * @property {boolean} animate If `false`, no animation will occur. */ /** * Options for setting padding on a call to {@link Map#fitBounds}. All properties of this object must be * non-negative integers. * * @typedef {Object} PaddingOptions * @property {number} top Padding in pixels from the top of the map canvas. * @property {number} bottom Padding in pixels from the bottom of the map canvas. * @property {number} left Padding in pixels from the left of the map canvas. * @property {number} right Padding in pixels from the right of the map canvas. */ var Camera = /*@__PURE__*/(function (Evented) { function Camera(transform , options ) { Evented.call(this); this._moving = false; this._zooming = false; this.transform = transform; this._bearingSnap = options.bearingSnap; __chunk_1.bindAll(['_renderFrameCallback'], this); } if ( Evented ) Camera.__proto__ = Evented; Camera.prototype = Object.create( Evented && Evented.prototype ); Camera.prototype.constructor = Camera; /** * Returns the map's geographical centerpoint. * * @memberof Map# * @returns The map's geographical centerpoint. */ Camera.prototype.getCenter = function getCenter () { return new __chunk_1.LngLat(this.transform.center.lng, this.transform.center.lat); }; /** * Sets the map's geographical centerpoint. Equivalent to `jumpTo({center: center})`. * * @memberof Map# * @param center The centerpoint to set. * @param eventData Additional properties to be added to event objects of events triggered by this method. * @fires movestart * @fires moveend * @returns {Map} `this` * @example * map.setCenter([-74, 38]); */ Camera.prototype.setCenter = function setCenter (center , eventData ) { return this.jumpTo({center: center}, eventData); }; /** * Pans the map by the specified offset. * * @memberof Map# * @param offset `x` and `y` coordinates by which to pan the map. * @param options * @param eventData Additional properties to be added to event objects of events triggered by this method. * @fires movestart * @fires moveend * @returns {Map} `this` * @see [Navigate the map with game-like controls](https://www.mapbox.com/mapbox-gl-js/example/game-controls/) */ Camera.prototype.panBy = function panBy (offset , options , eventData ) { offset = __chunk_1.Point.convert(offset).mult(-1); return this.panTo(this.transform.center, __chunk_1.extend({offset: offset}, options), eventData); }; /** * Pans the map to the specified location, with an animated transition. * * @memberof Map# * @param lnglat The location to pan the map to. * @param options * @param eventData Additional properties to be added to event objects of events triggered by this method. * @fires movestart * @fires moveend * @returns {Map} `this` */ Camera.prototype.panTo = function panTo (lnglat , options , eventData ) { return this.easeTo(__chunk_1.extend({ center: lnglat }, options), eventData); }; /** * Returns the map's current zoom level. * * @memberof Map# * @returns The map's current zoom level. */ Camera.prototype.getZoom = function getZoom () { return this.transform.zoom; }; /** * Sets the map's zoom level. Equivalent to `jumpTo({zoom: zoom})`. * * @memberof Map# * @param zoom The zoom level to set (0-20). * @param eventData Additional properties to be added to event objects of events triggered by this method. * @fires movestart * @fires zoomstart * @fires move * @fires zoom * @fires moveend * @fires zoomend * @returns {Map} `this` * @example * // zoom the map to 5 * map.setZoom(5); */ Camera.prototype.setZoom = function setZoom (zoom , eventData ) { this.jumpTo({zoom: zoom}, eventData); return this; }; /** * Zooms the map to the specified zoom level, with an animated transition. * * @memberof Map# * @param zoom The zoom level to transition to. * @param options * @param eventData Additional properties to be added to event objects of events triggered by this method. * @fires movestart * @fires zoomstart * @fires move * @fires zoom * @fires moveend * @fires zoomend * @returns {Map} `this` */ Camera.prototype.zoomTo = function zoomTo (zoom , options , eventData ) { return this.easeTo(__chunk_1.extend({ zoom: zoom }, options), eventData); }; /** * Increases the map's zoom level by 1. * * @memberof Map# * @param options * @param eventData Additional properties to be added to event objects of events triggered by this method. * @fires movestart * @fires zoomstart * @fires move * @fires zoom * @fires moveend * @fires zoomend * @returns {Map} `this` */ Camera.prototype.zoomIn = function zoomIn (options , eventData ) { this.zoomTo(this.getZoom() + 1, options, eventData); return this; }; /** * Decreases the map's zoom level by 1. * * @memberof Map# * @param options * @param eventData Additional properties to be added to event objects of events triggered by this method. * @fires movestart * @fires zoomstart * @fires move * @fires zoom * @fires moveend * @fires zoomend * @returns {Map} `this` */ Camera.prototype.zoomOut = function zoomOut (options , eventData ) { this.zoomTo(this.getZoom() - 1, options, eventData); return this; }; /** * Returns the map's current bearing. The bearing is the compass direction that is \"up\"; for example, a bearing * of 90° orients the map so that east is up. * * @memberof Map# * @returns The map's current bearing. * @see [Navigate the map with game-like controls](https://www.mapbox.com/mapbox-gl-js/example/game-controls/) */ Camera.prototype.getBearing = function getBearing () { return this.transform.bearing; }; /** * Sets the map's bearing (rotation). The bearing is the compass direction that is \"up\"; for example, a bearing * of 90° orients the map so that east is up. * * Equivalent to `jumpTo({bearing: bearing})`. * * @memberof Map# * @param bearing The desired bearing. * @param eventData Additional properties to be added to event objects of events triggered by this method. * @fires movestart * @fires moveend * @returns {Map} `this` * @example * // rotate the map to 90 degrees * map.setBearing(90); */ Camera.prototype.setBearing = function setBearing (bearing , eventData ) { this.jumpTo({bearing: bearing}, eventData); return this; }; /** * Rotates the map to the specified bearing, with an animated transition. The bearing is the compass direction * that is \"up\"; for example, a bearing of 90° orients the map so that east is up. * * @memberof Map# * @param bearing The desired bearing. * @param options * @param eventData Additional properties to be added to event objects of events triggered by this method. * @fires movestart * @fires moveend * @returns {Map} `this` */ Camera.prototype.rotateTo = function rotateTo (bearing , options , eventData ) { return this.easeTo(__chunk_1.extend({ bearing: bearing }, options), eventData); }; /** * Rotates the map so that north is up (0° bearing), with an animated transition. * * @memberof Map# * @param options * @param eventData Additional properties to be added to event objects of events triggered by this method. * @fires movestart * @fires moveend * @returns {Map} `this` */ Camera.prototype.resetNorth = function resetNorth (options , eventData ) { this.rotateTo(0, __chunk_1.extend({duration: 1000}, options), eventData); return this; }; /** * Snaps the map so that north is up (0° bearing), if the current bearing is close enough to it (i.e. within the * `bearingSnap` threshold). * * @memberof Map# * @param options * @param eventData Additional properties to be added to event objects of events triggered by this method. * @fires movestart * @fires moveend * @returns {Map} `this` */ Camera.prototype.snapToNorth = function snapToNorth (options , eventData ) { if (Math.abs(this.getBearing()) < this._bearingSnap) { return this.resetNorth(options, eventData); } return this; }; /** * Returns the map's current pitch (tilt). * * @memberof Map# * @returns The map's current pitch, measured in degrees away from the plane of the screen. */ Camera.prototype.getPitch = function getPitch () { return this.transform.pitch; }; /** * Sets the map's pitch (tilt). Equivalent to `jumpTo({pitch: pitch})`. * * @memberof Map# * @param pitch The pitch to set, measured in degrees away from the plane of the screen (0-60). * @param eventData Additional properties to be added to event objects of events triggered by this method. * @fires pitchstart * @fires movestart * @fires moveend * @returns {Map} `this` */ Camera.prototype.setPitch = function setPitch (pitch , eventData ) { this.jumpTo({pitch: pitch}, eventData); return this; }; /** * @memberof Map# * @param {LatLngBoundsLike} bounds Calculate the center for these bounds in the viewport and use * the highest zoom level up to and including `Map#getMaxZoom()` that fits * in the viewport. LatLngBounds represent a box that is always axis-aligned with bearing 0. * @param options * @param {number | PaddingOptions} [options.padding] The amount of padding in pixels to add to the given bounds. * @param {PointLike} [options.offset=[0, 0]] The center of the given bounds relative to the map's center, measured in pixels. * @param {number} [options.maxZoom] The maximum zoom level to allow when the camera would transition to the specified bounds. * @returns {CameraOptions | void} If map is able to fit to provided bounds, returns `CameraOptions` with * `center`, `zoom`, and `bearing`. If map is unable to fit, method will warn and return undefined. * @example * var bbox = [[-79, 43], [-73, 45]]; * var newCameraTransform = map.cameraForBounds(bbox, { * padding: {top: 10, bottom:25, left: 15, right: 5} * }); */ Camera.prototype.cameraForBounds = function cameraForBounds (bounds , options ) { bounds = __chunk_1.LngLatBounds.convert(bounds); return this._cameraForBoxAndBearing(bounds.getNorthWest(), bounds.getSouthEast(), 0, options); }; /** * Calculate the center of these two points in the viewport and use * the highest zoom level up to and including `Map#getMaxZoom()` that fits * the points in the viewport at the specified bearing. * @memberof Map# * @param {LngLatLike} p0 First point * @param {LngLatLike} p1 Second point * @param bearing Desired map bearing at end of animation, in degrees * @param options * @param {number | PaddingOptions} [options.padding] The amount of padding in pixels to add to the given bounds. * @param {PointLike} [options.offset=[0, 0]] The center of the given bounds relative to the map's center, measured in pixels. * @param {number} [options.maxZoom] The maximum zoom level to allow when the camera would transition to the specified bounds. * @returns {CameraOptions | void} If map is able to fit to provided bounds, returns `CameraOptions` with * `center`, `zoom`, and `bearing`. If map is unable to fit, method will warn and return undefined. * @private * @example * var p0 = [-79, 43]; * var p1 = [-73, 45]; * var bearing = 90; * var newCameraTransform = map._cameraForBoxAndBearing(p0, p1, bearing, { * padding: {top: 10, bottom:25, left: 15, right: 5} * }); */ Camera.prototype._cameraForBoxAndBearing = function _cameraForBoxAndBearing (p0 , p1 , bearing , options ) { options = __chunk_1.extend({ padding: { top: 0, bottom: 0, right: 0, left: 0 }, offset: [0, 0], maxZoom: this.transform.maxZoom }, options); if (typeof options.padding === 'number') { var p = options.padding; options.padding = { top: p, bottom: p, right: p, left: p }; } if (!__chunk_1.deepEqual(Object.keys(options.padding).sort(function (a, b) { if (a < b) { return -1; } if (a > b) { return 1; } return 0; }), ["bottom", "left", "right", "top"])) { __chunk_1.warnOnce( "options.padding must be a positive number, or an Object with keys 'bottom', 'left', 'right', 'top'" ); return; } var tr = this.transform; // We want to calculate the upper right and lower left of the box defined by p0 and p1 // in a coordinate system rotate to match the destination bearing. var p0world = tr.project(__chunk_1.LngLat.convert(p0)); var p1world = tr.project(__chunk_1.LngLat.convert(p1)); var p0rotated = p0world.rotate(-bearing * Math.PI / 180); var p1rotated = p1world.rotate(-bearing * Math.PI / 180); var upperRight = new __chunk_1.Point(Math.max(p0rotated.x, p1rotated.x), Math.max(p0rotated.y, p1rotated.y)); var lowerLeft = new __chunk_1.Point(Math.min(p0rotated.x, p1rotated.x), Math.min(p0rotated.y, p1rotated.y)); // Calculate zoom: consider the original bbox and padding. var size = upperRight.sub(lowerLeft); var scaleX = (tr.width - options.padding.left - options.padding.right) / size.x; var scaleY = (tr.height - options.padding.top - options.padding.bottom) / size.y; if (scaleY < 0 || scaleX < 0) { __chunk_1.warnOnce( 'Map cannot fit within canvas with the given bounds, padding, and/or offset.' ); return; } var zoom = Math.min(tr.scaleZoom(tr.scale * Math.min(scaleX, scaleY)), options.maxZoom); // Calculate center: apply the zoom, the configured offset, as well as offset that exists as a result of padding. var offset = __chunk_1.Point.convert(options.offset); var paddingOffsetX = (options.padding.left - options.padding.right) / 2; var paddingOffsetY = (options.padding.top - options.padding.bottom) / 2; var offsetAtInitialZoom = new __chunk_1.Point(offset.x + paddingOffsetX, offset.y + paddingOffsetY); var offsetAtFinalZoom = offsetAtInitialZoom.mult(tr.scale / tr.zoomScale(zoom)); var center = tr.unproject(p0world.add(p1world).div(2).sub(offsetAtFinalZoom)); return { center: center, zoom: zoom, bearing: bearing }; }; /** * Pans and zooms the map to contain its visible area within the specified geographical bounds. * This function will also reset the map's bearing to 0 if bearing is nonzero. * * @memberof Map# * @param bounds Center these bounds in the viewport and use the highest * zoom level up to and including `Map#getMaxZoom()` that fits them in the viewport. * @param {Object} [options] Options supports all properties from {@link AnimationOptions} and {@link CameraOptions} in addition to the fields below. * @param {number | PaddingOptions} [options.padding] The amount of padding in pixels to add to the given bounds. * @param {boolean} [options.linear=false] If `true`, the map transitions using * {@link Map#easeTo}. If `false`, the map transitions using {@link Map#flyTo}. See * those functions and {@link AnimationOptions} for information about options available. * @param {Function} [options.easing] An easing function for the animated transition. See {@link AnimationOptions}. * @param {PointLike} [options.offset=[0, 0]] The center of the given bounds relative to the map's center, measured in pixels. * @param {number} [options.maxZoom] The maximum zoom level to allow when the map view transitions to the specified bounds. * @param {Object} [eventData] Additional properties to be added to event objects of events triggered by this method. * @fires movestart * @fires moveend * @returns {Map} `this` * @example * var bbox = [[-79, 43], [-73, 45]]; * map.fitBounds(bbox, { * padding: {top: 10, bottom:25, left: 15, right: 5} * }); * @see [Fit a map to a bounding box](https://www.mapbox.com/mapbox-gl-js/example/fitbounds/) */ Camera.prototype.fitBounds = function fitBounds (bounds , options , eventData ) { return this._fitInternal( this.cameraForBounds(bounds, options), options, eventData); }; /** * Pans, rotates and zooms the map to to fit the box made by points p0 and p1 * once the map is rotated to the specified bearing. To zoom without rotating, * pass in the current map bearing. * * @memberof Map# * @param p0 First point on screen, in pixel coordinates * @param p1 Second point on screen, in pixel coordinates * @param bearing Desired map bearing at end of animation, in degrees * @param options * @param {number | PaddingOptions} [options.padding] The amount of padding in pixels to add to the given bounds. * @param {boolean} [options.linear=false] If `true`, the map transitions using * {@link Map#easeTo}. If `false`, the map transitions using {@link Map#flyTo}. See * those functions and {@link AnimationOptions} for information about options available. * @param {Function} [options.easing] An easing function for the animated transition. See {@link AnimationOptions}. * @param {PointLike} [options.offset=[0, 0]] The center of the given bounds relative to the map's center, measured in pixels. * @param {number} [options.maxZoom] The maximum zoom level to allow when the map view transitions to the specified bounds. * @param eventData Additional properties to be added to event objects of events triggered by this method. * @fires movestart * @fires moveend * @returns {Map} `this` * @example * var p0 = [220, 400]; * var p1 = [500, 900]; * map.fitScreenCoordinates(p0, p1, map.getBearing(), { * padding: {top: 10, bottom:25, left: 15, right: 5} * }); * @see [Used by BoxZoomHandler](https://www.mapbox.com/mapbox-gl-js/api/#boxzoomhandler) */ Camera.prototype.fitScreenCoordinates = function fitScreenCoordinates (p0 , p1 , bearing , options , eventData ) { return this._fitInternal( this._cameraForBoxAndBearing( this.transform.pointLocation(__chunk_1.Point.convert(p0)), this.transform.pointLocation(__chunk_1.Point.convert(p1)), bearing, options), options, eventData); }; Camera.prototype._fitInternal = function _fitInternal (calculatedOptions , options , eventData ) { // cameraForBounds warns + returns undefined if unable to fit: if (!calculatedOptions) { return this; } options = __chunk_1.extend(calculatedOptions, options); return options.linear ? this.easeTo(options, eventData) : this.flyTo(options, eventData); }; /** * Changes any combination of center, zoom, bearing, and pitch, without * an animated transition. The map will retain its current values for any * details not specified in `options`. * * @memberof Map# * @param options * @param eventData Additional properties to be added to event objects of events triggered by this method. * @fires movestart * @fires zoomstart * @fires pitchstart * @fires rotate * @fires move * @fires zoom * @fires pitch * @fires moveend * @fires zoomend * @fires pitchend * @returns {Map} `this` */ Camera.prototype.jumpTo = function jumpTo (options , eventData ) { this.stop(); var tr = this.transform; var zoomChanged = false, bearingChanged = false, pitchChanged = false; if ('zoom' in options && tr.zoom !== +options.zoom) { zoomChanged = true; tr.zoom = +options.zoom; } if (options.center !== undefined) { tr.center = __chunk_1.LngLat.convert(options.center); } if ('bearing' in options && tr.bearing !== +options.bearing) { bearingChanged = true; tr.bearing = +options.bearing; } if ('pitch' in options && tr.pitch !== +options.pitch) { pitchChanged = true; tr.pitch = +options.pitch; } this.fire(new __chunk_1.Event('movestart', eventData)) .fire(new __chunk_1.Event('move', eventData)); if (zoomChanged) { this.fire(new __chunk_1.Event('zoomstart', eventData)) .fire(new __chunk_1.Event('zoom', eventData)) .fire(new __chunk_1.Event('zoomend', eventData)); } if (bearingChanged) { this.fire(new __chunk_1.Event('rotatestart', eventData)) .fire(new __chunk_1.Event('rotate', eventData)) .fire(new __chunk_1.Event('rotateend', eventData)); } if (pitchChanged) { this.fire(new __chunk_1.Event('pitchstart', eventData)) .fire(new __chunk_1.Event('pitch', eventData)) .fire(new __chunk_1.Event('pitchend', eventData)); } return this.fire(new __chunk_1.Event('moveend', eventData)); }; /** * Changes any combination of center, zoom, bearing, and pitch, with an animated transition * between old and new values. The map will retain its current values for any * details not specified in `options`. * * @memberof Map# * @param options Options describing the destination and animation of the transition. * Accepts {@link CameraOptions} and {@link AnimationOptions}. * @param eventData Additional properties to be added to event objects of events triggered by this method. * @fires movestart * @fires zoomstart * @fires pitchstart * @fires rotate * @fires move * @fires zoom * @fires pitch * @fires moveend * @fires zoomend * @fires pitchend * @returns {Map} `this` * @see [Navigate the map with game-like controls](https://www.mapbox.com/mapbox-gl-js/example/game-controls/) */ Camera.prototype.easeTo = function easeTo (options , eventData ) { var this$1 = this; this.stop(); options = __chunk_1.extend({ offset: [0, 0], duration: 500, easing: __chunk_1.ease }, options); if (options.animate === false) { options.duration = 0; } var tr = this.transform, startZoom = this.getZoom(), startBearing = this.getBearing(), startPitch = this.getPitch(), zoom = 'zoom' in options ? +options.zoom : startZoom, bearing = 'bearing' in options ? this._normalizeBearing(options.bearing, startBearing) : startBearing, pitch = 'pitch' in options ? +options.pitch : startPitch; var pointAtOffset = tr.centerPoint.add(__chunk_1.Point.convert(options.offset)); var locationAtOffset = tr.pointLocation(pointAtOffset); var center = __chunk_1.LngLat.convert(options.center || locationAtOffset); this._normalizeCenter(center); var from = tr.project(locationAtOffset); var delta = tr.project(center).sub(from); var finalScale = tr.zoomScale(zoom - startZoom); var around, aroundPoint; if (options.around) { around = __chunk_1.LngLat.convert(options.around); aroundPoint = tr.locationPoint(around); } this._zooming = (zoom !== startZoom); this._rotating = (startBearing !== bearing); this._pitching = (pitch !== startPitch); this._prepareEase(eventData, options.noMoveStart); clearTimeout(this._easeEndTimeoutID); this._ease(function (k) { if (this$1._zooming) { tr.zoom = __chunk_1.number(startZoom, zoom, k); } if (this$1._rotating) { tr.bearing = __chunk_1.number(startBearing, bearing, k); } if (this$1._pitching) { tr.pitch = __chunk_1.number(startPitch, pitch, k); } if (around) { tr.setLocationAtPoint(around, aroundPoint); } else { var scale = tr.zoomScale(tr.zoom - startZoom); var base = zoom > startZoom ? Math.min(2, finalScale) : Math.max(0.5, finalScale); var speedup = Math.pow(base, 1 - k); var newCenter = tr.unproject(from.add(delta.mult(k * speedup)).mult(scale)); tr.setLocationAtPoint(tr.renderWorldCopies ? newCenter.wrap() : newCenter, pointAtOffset); } this$1._fireMoveEvents(eventData); }, function () { if (options.delayEndEvents) { this$1._easeEndTimeoutID = setTimeout(function () { return this$1._afterEase(eventData); }, options.delayEndEvents); } else { this$1._afterEase(eventData); } }, options); return this; }; Camera.prototype._prepareEase = function _prepareEase (eventData , noMoveStart ) { this._moving = true; if (!noMoveStart) { this.fire(new __chunk_1.Event('movestart', eventData)); } if (this._zooming) { this.fire(new __chunk_1.Event('zoomstart', eventData)); } if (this._rotating) { this.fire(new __chunk_1.Event('rotatestart', eventData)); } if (this._pitching) { this.fire(new __chunk_1.Event('pitchstart', eventData)); } }; Camera.prototype._fireMoveEvents = function _fireMoveEvents (eventData ) { this.fire(new __chunk_1.Event('move', eventData)); if (this._zooming) { this.fire(new __chunk_1.Event('zoom', eventData)); } if (this._rotating) { this.fire(new __chunk_1.Event('rotate', eventData)); } if (this._pitching) { this.fire(new __chunk_1.Event('pitch', eventData)); } }; Camera.prototype._afterEase = function _afterEase (eventData ) { var wasZooming = this._zooming; var wasRotating = this._rotating; var wasPitching = this._pitching; this._moving = false; this._zooming = false; this._rotating = false; this._pitching = false; if (wasZooming) { this.fire(new __chunk_1.Event('zoomend', eventData)); } if (wasRotating) { this.fire(new __chunk_1.Event('rotateend', eventData)); } if (wasPitching) { this.fire(new __chunk_1.Event('pitchend', eventData)); } this.fire(new __chunk_1.Event('moveend', eventData)); }; /** * Changes any combination of center, zoom, bearing, and pitch, animating the transition along a curve that * evokes flight. The animation seamlessly incorporates zooming and panning to help * the user maintain her bearings even after traversing a great distance. * * @memberof Map# * @param {Object} options Options describing the destination and animation of the transition. * Accepts {@link CameraOptions}, {@link AnimationOptions}, * and the following additional options. * @param {number} [options.curve=1.42] The zooming "curve" that will occur along the * flight path. A high value maximizes zooming for an exaggerated animation, while a low * value minimizes zooming for an effect closer to {@link Map#easeTo}. 1.42 is the average * value selected by participants in the user study discussed in * [van Wijk (2003)](https://www.win.tue.nl/~vanwijk/zoompan.pdf). A value of * `Math.pow(6, 0.25)` would be equivalent to the root mean squared average velocity. A * value of 1 would produce a circular motion. * @param {number} [options.minZoom] The zero-based zoom level at the peak of the flight path. If * `options.curve` is specified, this option is ignored. * @param {number} [options.speed=1.2] The average speed of the animation defined in relation to * `options.curve`. A speed of 1.2 means that the map appears to move along the flight path * by 1.2 times `options.curve` screenfuls every second. A _screenful_ is the map's visible span. * It does not correspond to a fixed physical distance, but varies by zoom level. * @param {number} [options.screenSpeed] The average speed of the animation measured in screenfuls * per second, assuming a linear timing curve. If `options.speed` is specified, this option is ignored. * @param {number} [options.maxDuration] The animation's maximum duration, measured in milliseconds. * If duration exceeds maximum duration, it resets to 0. * @param eventData Additional properties to be added to event objects of events triggered by this method. * @fires movestart * @fires zoomstart * @fires pitchstart * @fires move * @fires zoom * @fires rotate * @fires pitch * @fires moveend * @fires zoomend * @fires pitchend * @returns {Map} `this` * @example * // fly with default options to null island * map.flyTo({center: [0, 0], zoom: 9}); * // using flyTo options * map.flyTo({ * center: [0, 0], * zoom: 9, * speed: 0.2, * curve: 1, * easing(t) { * return t; * } * }); * @see [Fly to a location](https://www.mapbox.com/mapbox-gl-js/example/flyto/) * @see [Slowly fly to a location](https://www.mapbox.com/mapbox-gl-js/example/flyto-options/) * @see [Fly to a location based on scroll position](https://www.mapbox.com/mapbox-gl-js/example/scroll-fly-to/) */ Camera.prototype.flyTo = function flyTo (options , eventData ) { var this$1 = this; // This method implements an “optimal path” animation, as detailed in: // // Van Wijk, Jarke J.; Nuij, Wim A. A. “Smooth and efficient zooming and panning.” INFOVIS // ’03. pp. 15–22. . // // Where applicable, local variable documentation begins with the associated variable or // function in van Wijk (2003). this.stop(); options = __chunk_1.extend({ offset: [0, 0], speed: 1.2, curve: 1.42, easing: __chunk_1.ease }, options); var tr = this.transform, startZoom = this.getZoom(), startBearing = this.getBearing(), startPitch = this.getPitch(); var zoom = 'zoom' in options ? __chunk_1.clamp(+options.zoom, tr.minZoom, tr.maxZoom) : startZoom; var bearing = 'bearing' in options ? this._normalizeBearing(options.bearing, startBearing) : startBearing; var pitch = 'pitch' in options ? +options.pitch : startPitch; var scale = tr.zoomScale(zoom - startZoom); var pointAtOffset = tr.centerPoint.add(__chunk_1.Point.convert(options.offset)); var locationAtOffset = tr.pointLocation(pointAtOffset); var center = __chunk_1.LngLat.convert(options.center || locationAtOffset); this._normalizeCenter(center); var from = tr.project(locationAtOffset); var delta = tr.project(center).sub(from); var rho = options.curve; // w₀: Initial visible span, measured in pixels at the initial scale. var w0 = Math.max(tr.width, tr.height), // w₁: Final visible span, measured in pixels with respect to the initial scale. w1 = w0 / scale, // Length of the flight path as projected onto the ground plane, measured in pixels from // the world image origin at the initial scale. u1 = delta.mag(); if ('minZoom' in options) { var minZoom = __chunk_1.clamp(Math.min(options.minZoom, startZoom, zoom), tr.minZoom, tr.maxZoom); // wm: Maximum visible span, measured in pixels with respect to the initial // scale. var wMax = w0 / tr.zoomScale(minZoom - startZoom); rho = Math.sqrt(wMax / u1 * 2); } // ρ² var rho2 = rho * rho; /** * rᵢ: Returns the zoom-out factor at one end of the animation. * * @param i 0 for the ascent or 1 for the descent. * @private */ function r(i) { var b = (w1 * w1 - w0 * w0 + (i ? -1 : 1) * rho2 * rho2 * u1 * u1) / (2 * (i ? w1 : w0) * rho2 * u1); return Math.log(Math.sqrt(b * b + 1) - b); } function sinh(n) { return (Math.exp(n) - Math.exp(-n)) / 2; } function cosh(n) { return (Math.exp(n) + Math.exp(-n)) / 2; } function tanh(n) { return sinh(n) / cosh(n); } // r₀: Zoom-out factor during ascent. var r0 = r(0); // w(s): Returns the visible span on the ground, measured in pixels with respect to the // initial scale. Assumes an angular field of view of 2 arctan ½ ≈ 53°. var w = function (s) { return (cosh(r0) / cosh(r0 + rho * s)); }; // u(s): Returns the distance along the flight path as projected onto the ground plane, // measured in pixels from the world image origin at the initial scale. var u = function (s) { return w0 * ((cosh(r0) * tanh(r0 + rho * s) - sinh(r0)) / rho2) / u1; }; // S: Total length of the flight path, measured in ρ-screenfuls. var S = (r(1) - r0) / rho; // When u₀ = u₁, the optimal path doesn’t require both ascent and descent. if (Math.abs(u1) < 0.000001 || !isFinite(S)) { // Perform a more or less instantaneous transition if the path is too short. if (Math.abs(w0 - w1) < 0.000001) { return this.easeTo(options, eventData); } var k = w1 < w0 ? -1 : 1; S = Math.abs(Math.log(w1 / w0)) / rho; u = function() { return 0; }; w = function(s) { return Math.exp(k * rho * s); }; } if ('duration' in options) { options.duration = +options.duration; } else { var V = 'screenSpeed' in options ? +options.screenSpeed / rho : +options.speed; options.duration = 1000 * S / V; } if (options.maxDuration && options.duration > options.maxDuration) { options.duration = 0; } this._zooming = true; this._rotating = (startBearing !== bearing); this._pitching = (pitch !== startPitch); this._prepareEase(eventData, false); this._ease(function (k) { // s: The distance traveled along the flight path, measured in ρ-screenfuls. var s = k * S; var scale = 1 / w(s); tr.zoom = k === 1 ? zoom : startZoom + tr.scaleZoom(scale); if (this$1._rotating) { tr.bearing = __chunk_1.number(startBearing, bearing, k); } if (this$1._pitching) { tr.pitch = __chunk_1.number(startPitch, pitch, k); } var newCenter = k === 1 ? center : tr.unproject(from.add(delta.mult(u(s))).mult(scale)); tr.setLocationAtPoint(tr.renderWorldCopies ? newCenter.wrap() : newCenter, pointAtOffset); this$1._fireMoveEvents(eventData); }, function () { return this$1._afterEase(eventData); }, options); return this; }; Camera.prototype.isEasing = function isEasing () { return !!this._easeFrameId; }; /** * Stops any animated transition underway. * * @memberof Map# * @returns {Map} `this` */ Camera.prototype.stop = function stop () { if (this._easeFrameId) { this._cancelRenderFrame(this._easeFrameId); delete this._easeFrameId; delete this._onEaseFrame; } if (this._onEaseEnd) { // The _onEaseEnd function might emit events which trigger new // animation, which sets a new _onEaseEnd. Ensure we don't delete // it unintentionally. var onEaseEnd = this._onEaseEnd; delete this._onEaseEnd; onEaseEnd.call(this); } return this; }; Camera.prototype._ease = function _ease (frame , finish , options ) { if (options.animate === false || options.duration === 0) { frame(1); finish(); } else { this._easeStart = __chunk_1.browser.now(); this._easeOptions = options; this._onEaseFrame = frame; this._onEaseEnd = finish; this._easeFrameId = this._requestRenderFrame(this._renderFrameCallback); } }; // Callback for map._requestRenderFrame Camera.prototype._renderFrameCallback = function _renderFrameCallback () { var t = Math.min((__chunk_1.browser.now() - this._easeStart) / this._easeOptions.duration, 1); this._onEaseFrame(this._easeOptions.easing(t)); if (t < 1) { this._easeFrameId = this._requestRenderFrame(this._renderFrameCallback); } else { this.stop(); } }; // convert bearing so that it's numerically close to the current one so that it interpolates properly Camera.prototype._normalizeBearing = function _normalizeBearing (bearing , currentBearing ) { bearing = __chunk_1.wrap(bearing, -180, 180); var diff = Math.abs(bearing - currentBearing); if (Math.abs(bearing - 360 - currentBearing) < diff) { bearing -= 360; } if (Math.abs(bearing + 360 - currentBearing) < diff) { bearing += 360; } return bearing; }; // If a path crossing the antimeridian would be shorter, extend the final coordinate so that // interpolating between the two endpoints will cross it. Camera.prototype._normalizeCenter = function _normalizeCenter (center ) { var tr = this.transform; if (!tr.renderWorldCopies || tr.lngRange) { return; } var delta = center.lng - tr.center.lng; center.lng += delta > 180 ? -360 : delta < -180 ? 360 : 0; }; return Camera; }(__chunk_1.Evented)); // /** * An `AttributionControl` control presents the map's [attribution information](https://www.mapbox.com/help/attribution/). * * @implements {IControl} * @param {Object} [options] * @param {boolean} [options.compact] If `true` force a compact attribution that shows the full attribution on mouse hover, or if `false` force the full attribution control. The default is a responsive attribution that collapses when the map is less than 640 pixels wide. * @param {string | Array} [options.customAttribution] String or strings to show in addition to any other attributions. * @example * var map = new mapboxgl.Map({attributionControl: false}) * .addControl(new mapboxgl.AttributionControl({ * compact: true * })); */ var AttributionControl = function AttributionControl(options) { if ( options === void 0 ) options = {}; this.options = options; __chunk_1.bindAll([ '_updateEditLink', '_updateData', '_updateCompact' ], this); }; AttributionControl.prototype.getDefaultPosition = function getDefaultPosition () { return 'bottom-right'; }; AttributionControl.prototype.onAdd = function onAdd (map ) { var compact = this.options && this.options.compact; this._map = map; this._container = DOM.create('div', 'mapboxgl-ctrl mapboxgl-ctrl-attrib'); this._innerContainer = DOM.create('div', 'mapboxgl-ctrl-attrib-inner', this._container); if (compact) { this._container.classList.add('mapboxgl-compact'); } this._updateAttributions(); this._updateEditLink(); this._map.on('styledata', this._updateData); this._map.on('sourcedata', this._updateData); this._map.on('moveend', this._updateEditLink); if (compact === undefined) { this._map.on('resize', this._updateCompact); this._updateCompact(); } return this._container; }; AttributionControl.prototype.onRemove = function onRemove () { DOM.remove(this._container); this._map.off('styledata', this._updateData); this._map.off('sourcedata', this._updateData); this._map.off('moveend', this._updateEditLink); this._map.off('resize', this._updateCompact); this._map = (undefined ); }; AttributionControl.prototype._updateEditLink = function _updateEditLink () { var editLink = this._editLink; if (!editLink) { editLink = this._editLink = (this._container.querySelector('.mapbox-improve-map') ); } var params = [ {key: "owner", value: this.styleOwner}, {key: "id", value: this.styleId}, {key: "access_token", value: __chunk_1.config.ACCESS_TOKEN} ]; if (editLink) { var paramString = params.reduce(function (acc, next, i) { if (next.value) { acc += (next.key) + "=" + (next.value) + (i < params.length - 1 ? '&' : ''); } return acc; }, "?"); editLink.href = (__chunk_1.config.FEEDBACK_URL) + "/" + paramString + (this._map._hash ? this._map._hash.getHashString(true) : ''); editLink.rel = "noopener"; } }; AttributionControl.prototype._updateData = function _updateData (e ) { if (e && (e.sourceDataType === 'metadata' || e.dataType === 'style')) { this._updateAttributions(); this._updateEditLink(); } }; AttributionControl.prototype._updateAttributions = function _updateAttributions () { if (!this._map.style) { return; } var attributions = []; if (this.options.customAttribution) { if (Array.isArray(this.options.customAttribution)) { attributions = attributions.concat( this.options.customAttribution.map(function (attribution) { if (typeof attribution !== 'string') { return ''; } return attribution; }) ); } else if (typeof this.options.customAttribution === 'string') { attributions.push(this.options.customAttribution); } } if (this._map.style.stylesheet) { var stylesheet = this._map.style.stylesheet; this.styleOwner = stylesheet.owner; this.styleId = stylesheet.id; } var sourceCaches = this._map.style.sourceCaches; for (var id in sourceCaches) { var sourceCache = sourceCaches[id]; if (sourceCache.used) { var source = sourceCache.getSource(); if (source.attribution && attributions.indexOf(source.attribution) < 0) { attributions.push(source.attribution); } } } // remove any entries that are substrings of another entry. // first sort by length so that substrings come first attributions.sort(function (a, b) { return a.length - b.length; }); attributions = attributions.filter(function (attrib, i) { for (var j = i + 1; j < attributions.length; j++) { if (attributions[j].indexOf(attrib) >= 0) { return false; } } return true; }); if (attributions.length) { this._innerContainer.innerHTML = attributions.join(' | '); this._container.classList.remove('mapboxgl-attrib-empty'); } else { this._container.classList.add('mapboxgl-attrib-empty'); } // remove old DOM node from _editLink this._editLink = null; }; AttributionControl.prototype._updateCompact = function _updateCompact () { if (this._map.getCanvasContainer().offsetWidth <= 640) { this._container.classList.add('mapboxgl-compact'); } else { this._container.classList.remove('mapboxgl-compact'); } }; // /** * A `LogoControl` is a control that adds the Mapbox watermark * to the map as required by the [terms of service](https://www.mapbox.com/tos/) for Mapbox * vector tiles and core styles. * * @implements {IControl} * @private **/ var LogoControl = function LogoControl() { __chunk_1.bindAll(['_updateLogo'], this); __chunk_1.bindAll(['_updateCompact'], this); }; LogoControl.prototype.onAdd = function onAdd (map ) { this._map = map; this._container = DOM.create('div', 'mapboxgl-ctrl'); var anchor = DOM.create('a', 'mapboxgl-ctrl-logo'); anchor.target = "_blank"; anchor.rel = "noopener"; anchor.href = "https://www.mapbox.com/"; anchor.setAttribute("aria-label", "Mapbox logo"); anchor.setAttribute("rel", "noopener"); this._container.appendChild(anchor); this._container.style.display = 'none'; this._map.on('sourcedata', this._updateLogo); this._updateLogo(); this._map.on('resize', this._updateCompact); this._updateCompact(); return this._container; }; LogoControl.prototype.onRemove = function onRemove () { DOM.remove(this._container); this._map.off('sourcedata', this._updateLogo); this._map.off('resize', this._updateCompact); }; LogoControl.prototype.getDefaultPosition = function getDefaultPosition () { return 'bottom-left'; }; LogoControl.prototype._updateLogo = function _updateLogo (e ) { if (!e || e.sourceDataType === 'metadata') { this._container.style.display = this._logoRequired() ? 'block' : 'none'; } }; LogoControl.prototype._logoRequired = function _logoRequired () { if (!this._map.style) { return; } var sourceCaches = this._map.style.sourceCaches; for (var id in sourceCaches) { var source = sourceCaches[id].getSource(); if (source.mapbox_logo) { return true; } } return false; }; LogoControl.prototype._updateCompact = function _updateCompact () { var containerChildren = this._container.children; if (containerChildren.length) { var anchor = containerChildren[0]; if (this._map.getCanvasContainer().offsetWidth < 250) { anchor.classList.add('mapboxgl-compact'); } else { anchor.classList.remove('mapboxgl-compact'); } } }; // // can't mark opaque due to https://github.com/flowtype/flow-remove-types/pull/61 var TaskQueue = function TaskQueue(){ this._queue = []; this._id = 0; this._cleared = false; this._currentlyRunning = false; }; TaskQueue.prototype.add = function add (callback ) { var id = ++this._id; var queue = this._queue; queue.push({callback: callback, id: id, cancelled: false}); return id; }; TaskQueue.prototype.remove = function remove (id ) { var running = this._currentlyRunning; var queue = running ? this._queue.concat(running) : this._queue; for (var i = 0, list = queue; i < list.length; i += 1) { var task = list[i]; if (task.id === id) { task.cancelled = true; return; } } }; TaskQueue.prototype.run = function run () { __chunk_1.assert(!this._currentlyRunning); var queue = this._currentlyRunning = this._queue; // Tasks queued by callbacks in the current queue should be executed // on the next run, not the current run. this._queue = []; for (var i = 0, list = queue; i < list.length; i += 1) { var task = list[i]; if (task.cancelled) { continue; } task.callback(); if (this._cleared) { break; } } this._cleared = false; this._currentlyRunning = false; }; TaskQueue.prototype.clear = function clear () { if (this._currentlyRunning) { this._cleared = true; } this._queue = []; }; // var HTMLImageElement = __chunk_1.window.HTMLImageElement; var HTMLElement = __chunk_1.window.HTMLElement; /* eslint-disable no-use-before-define */ /* eslint-enable no-use-before-define */ var defaultMinZoom = 0; var defaultMaxZoom = 22; var defaultOptions = { center: [0, 0], zoom: 0, bearing: 0, pitch: 0, minZoom: defaultMinZoom, maxZoom: defaultMaxZoom, interactive: true, scrollZoom: true, boxZoom: true, dragRotate: true, dragPan: true, keyboard: true, doubleClickZoom: true, touchZoomRotate: true, bearingSnap: 7, clickTolerance: 3, hash: false, attributionControl: true, failIfMajorPerformanceCaveat: false, preserveDrawingBuffer: false, trackResize: true, renderWorldCopies: true, refreshExpiredTiles: true, maxTileCacheSize: null, localIdeographFontFamily: 'sans-serif', transformRequest: null, fadeDuration: 300, crossSourceCollisions: true }; /** * The `Map` object represents the map on your page. It exposes methods * and properties that enable you to programmatically change the map, * and fires events as users interact with it. * * You create a `Map` by specifying a `container` and other options. * Then Mapbox GL JS initializes the map on the page and returns your `Map` * object. * * @extends Evented * @param {Object} options * @param {HTMLElement|string} options.container The HTML element in which Mapbox GL JS will render the map, or the element's string `id`. The specified element must have no children. * @param {number} [options.minZoom=0] The minimum zoom level of the map (0-24). * @param {number} [options.maxZoom=22] The maximum zoom level of the map (0-24). * @param {Object|string} [options.style] The map's Mapbox style. This must be an a JSON object conforming to * the schema described in the [Mapbox Style Specification](https://mapbox.com/mapbox-gl-style-spec/), or a URL to * such JSON. * * To load a style from the Mapbox API, you can use a URL of the form `mapbox://styles/:owner/:style`, * where `:owner` is your Mapbox account name and `:style` is the style ID. Or you can use one of the following * [the predefined Mapbox styles](https://www.mapbox.com/maps/): * * * `mapbox://styles/mapbox/streets-v10` * * `mapbox://styles/mapbox/outdoors-v10` * * `mapbox://styles/mapbox/light-v9` * * `mapbox://styles/mapbox/dark-v9` * * `mapbox://styles/mapbox/satellite-v9` * * `mapbox://styles/mapbox/satellite-streets-v10` * * `mapbox://styles/mapbox/navigation-preview-day-v2` * * `mapbox://styles/mapbox/navigation-preview-night-v2` * * `mapbox://styles/mapbox/navigation-guidance-day-v2` * * `mapbox://styles/mapbox/navigation-guidance-night-v2` * * Tilesets hosted with Mapbox can be style-optimized if you append `?optimize=true` to the end of your style URL, like `mapbox://styles/mapbox/streets-v9?optimize=true`. * Learn more about style-optimized vector tiles in our [API documentation](https://www.mapbox.com/api-documentation/maps/#retrieve-tiles). * * @param {boolean} [options.hash=false] If `true`, the map's position (zoom, center latitude, center longitude, bearing, and pitch) will be synced with the hash fragment of the page's URL. * For example, `http://path/to/my/page.html#2.59/39.26/53.07/-24.1/60`. * @param {boolean} [options.interactive=true] If `false`, no mouse, touch, or keyboard listeners will be attached to the map, so it will not respond to interaction. * @param {number} [options.bearingSnap=7] The threshold, measured in degrees, that determines when the map's * bearing will snap to north. For example, with a `bearingSnap` of 7, if the user rotates * the map within 7 degrees of north, the map will automatically snap to exact north. * @param {boolean} [options.pitchWithRotate=true] If `false`, the map's pitch (tilt) control with "drag to rotate" interaction will be disabled. * @param {number} [options.clickTolerance=3] The max number of pixels a user can shift the mouse pointer during a click for it to be considered a valid click (as opposed to a mouse drag). * @param {boolean} [options.attributionControl=true] If `true`, an {@link AttributionControl} will be added to the map. * @param {string | Array} [options.customAttribution] String or strings to show in an {@link AttributionControl}. Only applicable if `options.attributionControl` is `true`. * @param {string} [options.logoPosition='bottom-left'] A string representing the position of the Mapbox wordmark on the map. Valid options are `top-left`,`top-right`, `bottom-left`, `bottom-right`. * @param {boolean} [options.failIfMajorPerformanceCaveat=false] If `true`, map creation will fail if the performance of Mapbox * GL JS would be dramatically worse than expected (i.e. a software renderer would be used). * @param {boolean} [options.preserveDrawingBuffer=false] If `true`, the map's canvas can be exported to a PNG using `map.getCanvas().toDataURL()`. This is `false` by default as a performance optimization. * @param {boolean} [options.antialias] If `true`, the gl context will be created with MSAA antialiasing, which can be useful for antialiasing custom layers. this is `false` by default as a performance optimization. * @param {boolean} [options.refreshExpiredTiles=true] If `false`, the map won't attempt to re-request tiles once they expire per their HTTP `cacheControl`/`expires` headers. * @param {LngLatBoundsLike} [options.maxBounds] If set, the map will be constrained to the given bounds. * @param {boolean|Object} [options.scrollZoom=true] If `true`, the "scroll to zoom" interaction is enabled. An `Object` value is passed as options to {@link ScrollZoomHandler#enable}. * @param {boolean} [options.boxZoom=true] If `true`, the "box zoom" interaction is enabled (see {@link BoxZoomHandler}). * @param {boolean} [options.dragRotate=true] If `true`, the "drag to rotate" interaction is enabled (see {@link DragRotateHandler}). * @param {boolean} [options.dragPan=true] If `true`, the "drag to pan" interaction is enabled (see {@link DragPanHandler}). * @param {boolean} [options.keyboard=true] If `true`, keyboard shortcuts are enabled (see {@link KeyboardHandler}). * @param {boolean} [options.doubleClickZoom=true] If `true`, the "double click to zoom" interaction is enabled (see {@link DoubleClickZoomHandler}). * @param {boolean|Object} [options.touchZoomRotate=true] If `true`, the "pinch to rotate and zoom" interaction is enabled. An `Object` value is passed as options to {@link TouchZoomRotateHandler#enable}. * @param {boolean} [options.trackResize=true] If `true`, the map will automatically resize when the browser window resizes. * @param {LngLatLike} [options.center=[0, 0]] The inital geographical centerpoint of the map. If `center` is not specified in the constructor options, Mapbox GL JS will look for it in the map's style object. If it is not specified in the style, either, it will default to `[0, 0]` Note: Mapbox GL uses longitude, latitude coordinate order (as opposed to latitude, longitude) to match GeoJSON. * @param {number} [options.zoom=0] The initial zoom level of the map. If `zoom` is not specified in the constructor options, Mapbox GL JS will look for it in the map's style object. If it is not specified in the style, either, it will default to `0`. * @param {number} [options.bearing=0] The initial bearing (rotation) of the map, measured in degrees counter-clockwise from north. If `bearing` is not specified in the constructor options, Mapbox GL JS will look for it in the map's style object. If it is not specified in the style, either, it will default to `0`. * @param {number} [options.pitch=0] The initial pitch (tilt) of the map, measured in degrees away from the plane of the screen (0-60). If `pitch` is not specified in the constructor options, Mapbox GL JS will look for it in the map's style object. If it is not specified in the style, either, it will default to `0`. * @param {LngLatBoundsLike} [options.bounds] The initial bounds of the map. If `bounds` is specified, it overrides `center` and `zoom` constructor options. * @param {Object} [options.fitBoundsOptions] A [`fitBounds`](#map#fitbounds) options object to use _only_ when fitting the initial `bounds` provided above. * @param {boolean} [options.renderWorldCopies=true] If `true`, multiple copies of the world will be rendered, when zoomed out. * @param {number} [options.maxTileCacheSize=null] The maximum number of tiles stored in the tile cache for a given source. If omitted, the cache will be dynamically sized based on the current viewport. * @param {string} [options.localIdeographFontFamily='sans-serif'] Defines a CSS * font-family for locally overriding generation of glyphs in the 'CJK Unified Ideographs' and 'Hangul Syllables' ranges. * In these ranges, font settings from the map's style will be ignored, except for font-weight keywords (light/regular/medium/bold). * Set to `false`, to enable font settings from the map's style for these glyph ranges. * The purpose of this option is to avoid bandwidth-intensive glyph server requests. (see [Use locally generated ideographs](https://www.mapbox.com/mapbox-gl-js/example/local-ideographs)) * @param {RequestTransformFunction} [options.transformRequest=null] A callback run before the Map makes a request for an external URL. The callback can be used to modify the url, set headers, or set the credentials property for cross-origin requests. * Expected to return an object with a `url` property and optionally `headers` and `credentials` properties. * @param {boolean} [options.collectResourceTiming=false] If `true`, Resource Timing API information will be collected for requests made by GeoJSON and Vector Tile web workers (this information is normally inaccessible from the main Javascript thread). Information will be returned in a `resourceTiming` property of relevant `data` events. * @param {number} [options.fadeDuration=300] Controls the duration of the fade-in/fade-out animation for label collisions, in milliseconds. This setting affects all symbol layers. This setting does not affect the duration of runtime styling transitions or raster tile cross-fading. * @param {boolean} [options.crossSourceCollisions=true] If `true`, symbols from multiple sources can collide with each other during collision detection. If `false`, collision detection is run separately for the symbols in each source. * @example * var map = new mapboxgl.Map({ * container: 'map', * center: [-122.420679, 37.772537], * zoom: 13, * style: style_object, * hash: true, * transformRequest: (url, resourceType)=> { * if(resourceType === 'Source' && url.startsWith('http://myHost')) { * return { * url: url.replace('http', 'https'), * headers: { 'my-custom-header': true}, * credentials: 'include' // Include cookies for cross-origin requests * } * } * } * }); * @see [Display a map](https://www.mapbox.com/mapbox-gl-js/examples/) */ var Map = /*@__PURE__*/(function (Camera) { function Map(options ) { var this$1 = this; options = __chunk_1.extend({}, defaultOptions, options); if (options.minZoom != null && options.maxZoom != null && options.minZoom > options.maxZoom) { throw new Error("maxZoom must be greater than minZoom"); } var transform = new Transform(options.minZoom, options.maxZoom, options.renderWorldCopies); Camera.call(this, transform, options); this._interactive = options.interactive; this._maxTileCacheSize = options.maxTileCacheSize; this._failIfMajorPerformanceCaveat = options.failIfMajorPerformanceCaveat; this._preserveDrawingBuffer = options.preserveDrawingBuffer; this._antialias = options.antialias; this._trackResize = options.trackResize; this._bearingSnap = options.bearingSnap; this._refreshExpiredTiles = options.refreshExpiredTiles; this._fadeDuration = options.fadeDuration; this._crossSourceCollisions = options.crossSourceCollisions; this._crossFadingFactor = 1; this._collectResourceTiming = options.collectResourceTiming; this._renderTaskQueue = new TaskQueue(); this._controls = []; this._mapId = __chunk_1.uniqueId(); this._requestManager = new __chunk_1.RequestManager(options.transformRequest); if (typeof options.container === 'string') { this._container = __chunk_1.window.document.getElementById(options.container); if (!this._container) { throw new Error(("Container '" + (options.container) + "' not found.")); } } else if (options.container instanceof HTMLElement) { this._container = options.container; } else { throw new Error("Invalid type: 'container' must be a String or HTMLElement."); } if (options.maxBounds) { this.setMaxBounds(options.maxBounds); } __chunk_1.bindAll([ '_onWindowOnline', '_onWindowResize', '_contextLost', '_contextRestored' ], this); this._setupContainer(); this._setupPainter(); if (this.painter === undefined) { throw new Error("Failed to initialize WebGL."); } this.on('move', function () { return this$1._update(false); }); this.on('moveend', function () { return this$1._update(false); }); this.on('zoom', function () { return this$1._update(true); }); if (typeof __chunk_1.window !== 'undefined') { __chunk_1.window.addEventListener('online', this._onWindowOnline, false); __chunk_1.window.addEventListener('resize', this._onWindowResize, false); } bindHandlers(this, options); this._hash = options.hash && (new Hash()).addTo(this); // don't set position from options if set through hash if (!this._hash || !this._hash._onHashChange()) { this.jumpTo({ center: options.center, zoom: options.zoom, bearing: options.bearing, pitch: options.pitch }); if (options.bounds) { this.resize(); this.fitBounds(options.bounds, __chunk_1.extend({}, options.fitBoundsOptions, { duration: 0 })); } } this.resize(); this._localIdeographFontFamily = options.localIdeographFontFamily; if (options.style) { this.setStyle(options.style, { localIdeographFontFamily: options.localIdeographFontFamily }); } if (options.attributionControl) { this.addControl(new AttributionControl({ customAttribution: options.customAttribution })); } this.addControl(new LogoControl(), options.logoPosition); this.on('style.load', function () { if (this$1.transform.unmodified) { this$1.jumpTo((this$1.style.stylesheet )); } }); this.on('data', function (event ) { this$1._update(event.dataType === 'style'); this$1.fire(new __chunk_1.Event(((event.dataType) + "data"), event)); }); this.on('dataloading', function (event ) { this$1.fire(new __chunk_1.Event(((event.dataType) + "dataloading"), event)); }); } if ( Camera ) Map.__proto__ = Camera; Map.prototype = Object.create( Camera && Camera.prototype ); Map.prototype.constructor = Map; var prototypeAccessors = { showTileBoundaries: { configurable: true },showCollisionBoxes: { configurable: true },showOverdrawInspector: { configurable: true },repaint: { configurable: true },vertices: { configurable: true } }; /* * Returns a unique number for this map instance which is used for the MapLoadEvent * to make sure we only fire one event per instantiated map object. * @private * @returns {number} */ Map.prototype._getMapId = function _getMapId () { return this._mapId; }; /** * Adds a {@link IControl} to the map, calling `control.onAdd(this)`. * * @param {IControl} control The {@link IControl} to add. * @param {string} [position] position on the map to which the control will be added. * Valid values are `'top-left'`, `'top-right'`, `'bottom-left'`, and `'bottom-right'`. Defaults to `'top-right'`. * @returns {Map} `this` * @see [Display map navigation controls](https://www.mapbox.com/mapbox-gl-js/example/navigation/) */ Map.prototype.addControl = function addControl (control , position ) { if (position === undefined && control.getDefaultPosition) { position = control.getDefaultPosition(); } if (position === undefined) { position = 'top-right'; } if (!control || !control.onAdd) { return this.fire(new __chunk_1.ErrorEvent(new Error( 'Invalid argument to map.addControl(). Argument must be a control with onAdd and onRemove methods.'))); } var controlElement = control.onAdd(this); this._controls.push(control); var positionContainer = this._controlPositions[position]; if (position.indexOf('bottom') !== -1) { positionContainer.insertBefore(controlElement, positionContainer.firstChild); } else { positionContainer.appendChild(controlElement); } return this; }; /** * Removes the control from the map. * * @param {IControl} control The {@link IControl} to remove. * @returns {Map} `this` */ Map.prototype.removeControl = function removeControl (control ) { if (!control || !control.onRemove) { return this.fire(new __chunk_1.ErrorEvent(new Error( 'Invalid argument to map.removeControl(). Argument must be a control with onAdd and onRemove methods.'))); } var ci = this._controls.indexOf(control); if (ci > -1) { this._controls.splice(ci, 1); } control.onRemove(this); return this; }; /** * Resizes the map according to the dimensions of its * `container` element. * * This method must be called after the map's `container` is resized by another script, * or when the map is shown after being initially hidden with CSS. * * @param eventData Additional properties to be added to event objects of events triggered by this method. * @returns {Map} `this` */ Map.prototype.resize = function resize (eventData ) { var dimensions = this._containerDimensions(); var width = dimensions[0]; var height = dimensions[1]; this._resizeCanvas(width, height); this.transform.resize(width, height); this.painter.resize(width, height); this.fire(new __chunk_1.Event('movestart', eventData)) .fire(new __chunk_1.Event('move', eventData)) .fire(new __chunk_1.Event('resize', eventData)) .fire(new __chunk_1.Event('moveend', eventData)); return this; }; /** * Returns the map's geographical bounds. When the bearing or pitch is non-zero, the visible region is not * an axis-aligned rectangle, and the result is the smallest bounds that encompasses the visible region. */ Map.prototype.getBounds = function getBounds () { return this.transform.getBounds(); }; /** * Returns the maximum geographical bounds the map is constrained to, or `null` if none set. */ Map.prototype.getMaxBounds = function getMaxBounds () { return this.transform.getMaxBounds(); }; /** * Sets or clears the map's geographical bounds. * * Pan and zoom operations are constrained within these bounds. * If a pan or zoom is performed that would * display regions outside these bounds, the map will * instead display a position and zoom level * as close as possible to the operation's request while still * remaining within the bounds. * * @param {LngLatBoundsLike | null | undefined} bounds The maximum bounds to set. If `null` or `undefined` is provided, the function removes the map's maximum bounds. * @returns {Map} `this` */ Map.prototype.setMaxBounds = function setMaxBounds (bounds ) { this.transform.setMaxBounds(__chunk_1.LngLatBounds.convert(bounds)); return this._update(); }; /** * Sets or clears the map's minimum zoom level. * If the map's current zoom level is lower than the new minimum, * the map will zoom to the new minimum. * * @param {number | null | undefined} minZoom The minimum zoom level to set (0-24). * If `null` or `undefined` is provided, the function removes the current minimum zoom (i.e. sets it to 0). * @returns {Map} `this` */ Map.prototype.setMinZoom = function setMinZoom (minZoom ) { minZoom = minZoom === null || minZoom === undefined ? defaultMinZoom : minZoom; if (minZoom >= defaultMinZoom && minZoom <= this.transform.maxZoom) { this.transform.minZoom = minZoom; this._update(); if (this.getZoom() < minZoom) { this.setZoom(minZoom); } return this; } else { throw new Error(("minZoom must be between " + defaultMinZoom + " and the current maxZoom, inclusive")); } }; /** * Returns the map's minimum allowable zoom level. * * @returns {number} minZoom */ Map.prototype.getMinZoom = function getMinZoom () { return this.transform.minZoom; }; /** * Sets or clears the map's maximum zoom level. * If the map's current zoom level is higher than the new maximum, * the map will zoom to the new maximum. * * @param {number | null | undefined} maxZoom The maximum zoom level to set. * If `null` or `undefined` is provided, the function removes the current maximum zoom (sets it to 22). * @returns {Map} `this` */ Map.prototype.setMaxZoom = function setMaxZoom (maxZoom ) { maxZoom = maxZoom === null || maxZoom === undefined ? defaultMaxZoom : maxZoom; if (maxZoom >= this.transform.minZoom) { this.transform.maxZoom = maxZoom; this._update(); if (this.getZoom() > maxZoom) { this.setZoom(maxZoom); } return this; } else { throw new Error("maxZoom must be greater than the current minZoom"); } }; /** * Returns the state of renderWorldCopies. * * @returns {boolean} renderWorldCopies */ Map.prototype.getRenderWorldCopies = function getRenderWorldCopies () { return this.transform.renderWorldCopies; }; /** * Sets the state of renderWorldCopies. * * @param {boolean} renderWorldCopies If `true`, multiple copies of the world will be rendered, when zoomed out. `undefined` is treated as `true`, `null` is treated as `false`. * @returns {Map} `this` */ Map.prototype.setRenderWorldCopies = function setRenderWorldCopies (renderWorldCopies ) { this.transform.renderWorldCopies = renderWorldCopies; return this._update(); }; /** * Returns the map's maximum allowable zoom level. * * @returns {number} maxZoom */ Map.prototype.getMaxZoom = function getMaxZoom () { return this.transform.maxZoom; }; /** * Returns a {@link Point} representing pixel coordinates, relative to the map's `container`, * that correspond to the specified geographical location. * * @param {LngLatLike} lnglat The geographical location to project. * @returns {Point} The {@link Point} corresponding to `lnglat`, relative to the map's `container`. */ Map.prototype.project = function project (lnglat ) { return this.transform.locationPoint(__chunk_1.LngLat.convert(lnglat)); }; /** * Returns a {@link LngLat} representing geographical coordinates that correspond * to the specified pixel coordinates. * * @param {PointLike} point The pixel coordinates to unproject. * @returns {LngLat} The {@link LngLat} corresponding to `point`. * @see [Show polygon information on click](https://www.mapbox.com/mapbox-gl-js/example/polygon-popup-on-click/) */ Map.prototype.unproject = function unproject (point ) { return this.transform.pointLocation(__chunk_1.Point.convert(point)); }; /** * Returns true if the map is panning, zooming, rotating, or pitching due to a camera animation or user gesture. */ Map.prototype.isMoving = function isMoving () { return this._moving || this.dragPan.isActive() || this.dragRotate.isActive() || this.scrollZoom.isActive(); }; /** * Returns true if the map is zooming due to a camera animation or user gesture. */ Map.prototype.isZooming = function isZooming () { return this._zooming || this.scrollZoom.isZooming(); }; /** * Returns true if the map is rotating due to a camera animation or user gesture. */ Map.prototype.isRotating = function isRotating () { return this._rotating || this.dragRotate.isActive(); }; /** * Adds a listener for events of a specified type. * * @method * @name on * @memberof Map * @instance * @param {string} type The event type to add a listen for. * @param {Function} listener The function to be called when the event is fired. * The listener function is called with the data object passed to `fire`, * extended with `target` and `type` properties. * @returns {Map} `this` */ /** * Adds a listener for events of a specified type occurring on features in a specified style layer. * * @param {string} type The event type to listen for; one of `'mousedown'`, `'mouseup'`, `'click'`, `'dblclick'`, * `'mousemove'`, `'mouseenter'`, `'mouseleave'`, `'mouseover'`, `'mouseout'`, `'contextmenu'`, `'touchstart'`, * `'touchend'`, or `'touchcancel'`. `mouseenter` and `mouseover` events are triggered when the cursor enters * a visible portion of the specified layer from outside that layer or outside the map canvas. `mouseleave` * and `mouseout` events are triggered when the cursor leaves a visible portion of the specified layer, or leaves * the map canvas. * @param {string} layerId The ID of a style layer. Only events whose location is within a visible * feature in this layer will trigger the listener. The event will have a `features` property containing * an array of the matching features. * @param {Function} listener The function to be called when the event is fired. * @returns {Map} `this` */ Map.prototype.on = function on (type , layerId , listener ) { var this$1 = this; if (listener === undefined) { return Camera.prototype.on.call(this, type, layerId); } var delegatedListener = (function () { var obj; if (type === 'mouseenter' || type === 'mouseover') { var mousein = false; var mousemove = function (e) { var features = this$1.getLayer(layerId) ? this$1.queryRenderedFeatures(e.point, {layers: [layerId]}) : []; if (!features.length) { mousein = false; } else if (!mousein) { mousein = true; listener.call(this$1, new MapMouseEvent(type, this$1, e.originalEvent, {features: features})); } }; var mouseout = function () { mousein = false; }; return {layer: layerId, listener: listener, delegates: {mousemove: mousemove, mouseout: mouseout}}; } else if (type === 'mouseleave' || type === 'mouseout') { var mousein$1 = false; var mousemove$1 = function (e) { var features = this$1.getLayer(layerId) ? this$1.queryRenderedFeatures(e.point, {layers: [layerId]}) : []; if (features.length) { mousein$1 = true; } else if (mousein$1) { mousein$1 = false; listener.call(this$1, new MapMouseEvent(type, this$1, e.originalEvent)); } }; var mouseout$1 = function (e) { if (mousein$1) { mousein$1 = false; listener.call(this$1, new MapMouseEvent(type, this$1, e.originalEvent)); } }; return {layer: layerId, listener: listener, delegates: {mousemove: mousemove$1, mouseout: mouseout$1}}; } else { var delegate = function (e) { var features = this$1.getLayer(layerId) ? this$1.queryRenderedFeatures(e.point, {layers: [layerId]}) : []; if (features.length) { // Here we need to mutate the original event, so that preventDefault works as expected. e.features = features; listener.call(this$1, e); delete e.features; } }; return {layer: layerId, listener: listener, delegates: ( obj = {}, obj[type] = delegate, obj )}; } })(); this._delegatedListeners = this._delegatedListeners || {}; this._delegatedListeners[type] = this._delegatedListeners[type] || []; this._delegatedListeners[type].push(delegatedListener); for (var event in delegatedListener.delegates) { this.on((event ), delegatedListener.delegates[event]); } return this; }; /** * Removes an event listener previously added with `Map#on`. * * @method * @name off * @memberof Map * @instance * @param {string} type The event type previously used to install the listener. * @param {Function} listener The function previously installed as a listener. * @returns {Map} `this` */ /** * Removes an event listener for layer-specific events previously added with `Map#on`. * * @param {string} type The event type previously used to install the listener. * @param {string} layerId The layer ID previously used to install the listener. * @param {Function} listener The function previously installed as a listener. * @returns {Map} `this` */ Map.prototype.off = function off (type , layerId , listener ) { if (listener === undefined) { return Camera.prototype.off.call(this, type, layerId); } if (this._delegatedListeners && this._delegatedListeners[type]) { var listeners = this._delegatedListeners[type]; for (var i = 0; i < listeners.length; i++) { var delegatedListener = listeners[i]; if (delegatedListener.layer === layerId && delegatedListener.listener === listener) { for (var event in delegatedListener.delegates) { this.off((event ), delegatedListener.delegates[event]); } listeners.splice(i, 1); return this; } } } return this; }; /** * Returns an array of [GeoJSON](http://geojson.org/) * [Feature objects](https://tools.ietf.org/html/rfc7946#section-3.2) * representing visible features that satisfy the query parameters. * * @param {PointLike|Array} [geometry] - The geometry of the query region: * either a single point or southwest and northeast points describing a bounding box. * Omitting this parameter (i.e. calling {@link Map#queryRenderedFeatures} with zero arguments, * or with only a `options` argument) is equivalent to passing a bounding box encompassing the entire * map viewport. * @param {Object} [options] * @param {Array} [options.layers] An array of style layer IDs for the query to inspect. * Only features within these layers will be returned. If this parameter is undefined, all layers will be checked. * @param {Array} [options.filter] A [filter](https://www.mapbox.com/mapbox-gl-js/style-spec/#other-filter) * to limit query results. * * @returns {Array} An array of [GeoJSON](http://geojson.org/) * [feature objects](https://tools.ietf.org/html/rfc7946#section-3.2). * * The `properties` value of each returned feature object contains the properties of its source feature. For GeoJSON sources, only * string and numeric property values are supported (i.e. `null`, `Array`, and `Object` values are not supported). * * Each feature includes top-level `layer`, `source`, and `sourceLayer` properties. The `layer` property is an object * representing the style layer to which the feature belongs. Layout and paint properties in this object contain values * which are fully evaluated for the given zoom level and feature. * * Features from layers whose `visibility` property is `"none"`, or from layers whose zoom range excludes the * current zoom level are not included. Symbol features that have been hidden due to text or icon collision are * not included. Features from all other layers are included, including features that may have no visible * contribution to the rendered result; for example, because the layer's opacity or color alpha component is set to * 0. * * The topmost rendered feature appears first in the returned array, and subsequent features are sorted by * descending z-order. Features that are rendered multiple times (due to wrapping across the antimeridian at low * zoom levels) are returned only once (though subject to the following caveat). * * Because features come from tiled vector data or GeoJSON data that is converted to tiles internally, feature * geometries may be split or duplicated across tile boundaries and, as a result, features may appear multiple * times in query results. For example, suppose there is a highway running through the bounding rectangle of a query. * The results of the query will be those parts of the highway that lie within the map tiles covering the bounding * rectangle, even if the highway extends into other tiles, and the portion of the highway within each map tile * will be returned as a separate feature. Similarly, a point feature near a tile boundary may appear in multiple * tiles due to tile buffering. * * @example * // Find all features at a point * var features = map.queryRenderedFeatures( * [20, 35], * { layers: ['my-layer-name'] } * ); * * @example * // Find all features within a static bounding box * var features = map.queryRenderedFeatures( * [[10, 20], [30, 50]], * { layers: ['my-layer-name'] } * ); * * @example * // Find all features within a bounding box around a point * var width = 10; * var height = 20; * var features = map.queryRenderedFeatures([ * [point.x - width / 2, point.y - height / 2], * [point.x + width / 2, point.y + height / 2] * ], { layers: ['my-layer-name'] }); * * @example * // Query all rendered features from a single layer * var features = map.queryRenderedFeatures({ layers: ['my-layer-name'] }); * @see [Get features under the mouse pointer](https://www.mapbox.com/mapbox-gl-js/example/queryrenderedfeatures/) * @see [Highlight features within a bounding box](https://www.mapbox.com/mapbox-gl-js/example/using-box-queryrenderedfeatures/) * @see [Center the map on a clicked symbol](https://www.mapbox.com/mapbox-gl-js/example/center-on-symbol/) */ Map.prototype.queryRenderedFeatures = function queryRenderedFeatures (geometry , options ) { // The first parameter can be omitted entirely, making this effectively an overloaded method // with two signatures: // // queryRenderedFeatures(geometry: PointLike | [PointLike, PointLike], options?: Object) // queryRenderedFeatures(options?: Object) // // There no way to express that in a way that's compatible with both flow and documentation.js. // Related: https://github.com/facebook/flow/issues/1556 if (!this.style) { return []; } if (options === undefined && geometry !== undefined && !(geometry instanceof __chunk_1.Point) && !Array.isArray(geometry)) { options = (geometry ); geometry = undefined; } options = options || {}; geometry = geometry || [[0, 0], [this.transform.width, this.transform.height]]; var queryGeometry; if (geometry instanceof __chunk_1.Point || typeof geometry[0] === 'number') { queryGeometry = [__chunk_1.Point.convert(geometry)]; } else { var tl = __chunk_1.Point.convert(geometry[0]); var br = __chunk_1.Point.convert(geometry[1]); queryGeometry = [tl, new __chunk_1.Point(br.x, tl.y), br, new __chunk_1.Point(tl.x, br.y), tl]; } return this.style.queryRenderedFeatures(queryGeometry, options, this.transform); }; /** * Returns an array of [GeoJSON](http://geojson.org/) * [Feature objects](https://tools.ietf.org/html/rfc7946#section-3.2) * representing features within the specified vector tile or GeoJSON source that satisfy the query parameters. * * @param {string} sourceId The ID of the vector tile or GeoJSON source to query. * @param {Object} [parameters] * @param {string} [parameters.sourceLayer] The name of the vector tile layer to query. *For vector tile * sources, this parameter is required.* For GeoJSON sources, it is ignored. * @param {Array} [parameters.filter] A [filter](https://www.mapbox.com/mapbox-gl-js/style-spec/#other-filter) * to limit query results. * * @returns {Array} An array of [GeoJSON](http://geojson.org/) * [Feature objects](https://tools.ietf.org/html/rfc7946#section-3.2). * * In contrast to {@link Map#queryRenderedFeatures}, this function * returns all features matching the query parameters, * whether or not they are rendered by the current style (i.e. visible). The domain of the query includes all currently-loaded * vector tiles and GeoJSON source tiles: this function does not check tiles outside the currently * visible viewport. * * Because features come from tiled vector data or GeoJSON data that is converted to tiles internally, feature * geometries may be split or duplicated across tile boundaries and, as a result, features may appear multiple * times in query results. For example, suppose there is a highway running through the bounding rectangle of a query. * The results of the query will be those parts of the highway that lie within the map tiles covering the bounding * rectangle, even if the highway extends into other tiles, and the portion of the highway within each map tile * will be returned as a separate feature. Similarly, a point feature near a tile boundary may appear in multiple * tiles due to tile buffering. * @see [Filter features within map view](https://www.mapbox.com/mapbox-gl-js/example/filter-features-within-map-view/) * @see [Highlight features containing similar data](https://www.mapbox.com/mapbox-gl-js/example/query-similar-features/) */ Map.prototype.querySourceFeatures = function querySourceFeatures (sourceId , parameters ) { return this.style.querySourceFeatures(sourceId, parameters); }; /** * Updates the map's Mapbox style object with a new value. If a style already is set and options.diff is true, * this compares the style against the map's current state and performs only the changes necessary to make * the map style match the desired state. * * @param style A JSON object conforming to the schema described in the * [Mapbox Style Specification](https://mapbox.com/mapbox-gl-style-spec/), or a URL to such JSON. * @param {Object} [options] * @param {boolean} [options.diff=true] If false, force a 'full' update, removing the current style * and building the given one instead of attempting a diff-based update. * @param {string} [options.localIdeographFontFamily='sans-serif'] Defines a CSS * font-family for locally overriding generation of glyphs in the 'CJK Unified Ideographs' and 'Hangul Syllables' ranges. * In these ranges, font settings from the map's style will be ignored, except for font-weight keywords (light/regular/medium/bold). * Set to `false`, to enable font settings from the map's style for these glyph ranges. * Forces a full update. * @returns {Map} `this` * @see [Change a map's style](https://www.mapbox.com/mapbox-gl-js/example/setstyle/) */ Map.prototype.setStyle = function setStyle (style , options ) { options = __chunk_1.extend({}, { localIdeographFontFamily: defaultOptions.localIdeographFontFamily}, options); if ((options.diff !== false && options.localIdeographFontFamily === this._localIdeographFontFamily) && this.style && style) { this._diffStyle(style, options); return this; } else { this._localIdeographFontFamily = options.localIdeographFontFamily; return this._updateStyle(style, options); } }; Map.prototype._updateStyle = function _updateStyle (style , options ) { if (this.style) { this.style.setEventedParent(null); this.style._remove(); } if (!style) { delete this.style; return this; } else { this.style = new Style(this, options || {}); } this.style.setEventedParent(this, {style: this.style}); if (typeof style === 'string') { this.style.loadURL(style); } else { this.style.loadJSON(style); } return this; }; Map.prototype._diffStyle = function _diffStyle (style , options ) { var this$1 = this; if (typeof style === 'string') { var url = this._requestManager.normalizeStyleURL(style); var request = this._requestManager.transformRequest(url, __chunk_1.ResourceType.Style); __chunk_1.getJSON(request, function (error , json ) { if (error) { this$1.fire(new __chunk_1.ErrorEvent(error)); } else if (json) { this$1._updateDiff(json, options); } }); } else if (typeof style === 'object') { this._updateDiff(style, options); } }; Map.prototype._updateDiff = function _updateDiff (style , options ) { try { if (this.style.setState(style)) { this._update(true); } } catch (e) { __chunk_1.warnOnce( ("Unable to perform style diff: " + (e.message || e.error || e) + ". Rebuilding the style from scratch.") ); this._updateStyle(style, options); } }; /** * Returns the map's Mapbox style object, which can be used to recreate the map's style. * * @returns {Object} The map's style object. */ Map.prototype.getStyle = function getStyle () { if (this.style) { return this.style.serialize(); } }; /** * Returns a Boolean indicating whether the map's style is fully loaded. * * @returns {boolean} A Boolean indicating whether the style is fully loaded. */ Map.prototype.isStyleLoaded = function isStyleLoaded () { if (!this.style) { return __chunk_1.warnOnce('There is no style added to the map.'); } return this.style.loaded(); }; /** * Adds a source to the map's style. * * @param {string} id The ID of the source to add. Must not conflict with existing sources. * @param {Object} source The source object, conforming to the * Mapbox Style Specification's [source definition](https://www.mapbox.com/mapbox-gl-style-spec/#sources) or * {@link CanvasSourceOptions}. * @fires source.add * @returns {Map} `this` * @see [Draw GeoJSON points](https://www.mapbox.com/mapbox-gl-js/example/geojson-markers/) * @see [Style circles using data-driven styling](https://www.mapbox.com/mapbox-gl-js/example/data-driven-circle-colors/) * @see [Set a point after Geocoder result](https://www.mapbox.com/mapbox-gl-js/example/point-from-geocoder-result/) */ Map.prototype.addSource = function addSource (id , source ) { this.style.addSource(id, source); return this._update(true); }; /** * Returns a Boolean indicating whether the source is loaded. * * @param {string} id The ID of the source to be checked. * @returns {boolean} A Boolean indicating whether the source is loaded. */ Map.prototype.isSourceLoaded = function isSourceLoaded (id ) { var source = this.style && this.style.sourceCaches[id]; if (source === undefined) { this.fire(new __chunk_1.ErrorEvent(new Error(("There is no source with ID '" + id + "'")))); return; } return source.loaded(); }; /** * Returns a Boolean indicating whether all tiles in the viewport from all sources on * the style are loaded. * * @returns {boolean} A Boolean indicating whether all tiles are loaded. */ Map.prototype.areTilesLoaded = function areTilesLoaded () { var sources = this.style && this.style.sourceCaches; for (var id in sources) { var source = sources[id]; var tiles = source._tiles; for (var t in tiles) { var tile = tiles[t]; if (!(tile.state === 'loaded' || tile.state === 'errored')) { return false; } } } return true; }; /** * Adds a [custom source type](#Custom Sources), making it available for use with * {@link Map#addSource}. * @private * @param {string} name The name of the source type; source definition objects use this name in the `{type: ...}` field. * @param {Function} SourceType A {@link Source} constructor. * @param {Function} callback Called when the source type is ready or with an error argument if there is an error. */ Map.prototype.addSourceType = function addSourceType (name , SourceType , callback ) { return this.style.addSourceType(name, SourceType, callback); }; /** * Removes a source from the map's style. * * @param {string} id The ID of the source to remove. * @returns {Map} `this` */ Map.prototype.removeSource = function removeSource (id ) { this.style.removeSource(id); return this._update(true); }; /** * Returns the source with the specified ID in the map's style. * * @param {string} id The ID of the source to get. * @returns {?Object} The style source with the specified ID, or `undefined` * if the ID corresponds to no existing sources. * @see [Create a draggable point](https://www.mapbox.com/mapbox-gl-js/example/drag-a-point/) * @see [Animate a point](https://www.mapbox.com/mapbox-gl-js/example/animate-point-along-line/) * @see [Add live realtime data](https://www.mapbox.com/mapbox-gl-js/example/live-geojson/) */ Map.prototype.getSource = function getSource (id ) { return this.style.getSource(id); }; /** * Add an image to the style. This image can be used in `icon-image`, * `background-pattern`, `fill-pattern`, and `line-pattern`. An * {@link Map#error} event will be fired if there is not enough space in the * sprite to add this image. * * @see [Add an icon to the map](https://www.mapbox.com/mapbox-gl-js/example/add-image/) * @see [Add a generated icon to the map](https://www.mapbox.com/mapbox-gl-js/example/add-image-generated/) * @param id The ID of the image. * @param image The image as an `HTMLImageElement`, `ImageData`, or object with `width`, `height`, and `data` * properties with the same format as `ImageData`. * @param options * @param options.pixelRatio The ratio of pixels in the image to physical pixels on the screen * @param options.sdf Whether the image should be interpreted as an SDF image */ Map.prototype.addImage = function addImage (id , image , ref) { if ( ref === void 0 ) ref = {}; var pixelRatio = ref.pixelRatio; if ( pixelRatio === void 0 ) pixelRatio = 1; var sdf = ref.sdf; if ( sdf === void 0 ) sdf = false; var version = 0; if (image instanceof HTMLImageElement) { var ref$1 = __chunk_1.browser.getImageData(image); var width = ref$1.width; var height = ref$1.height; var data = ref$1.data; this.style.addImage(id, { data: new __chunk_1.RGBAImage({width: width, height: height}, data), pixelRatio: pixelRatio, sdf: sdf, version: version }); } else if (image.width === undefined || image.height === undefined) { return this.fire(new __chunk_1.ErrorEvent(new Error( 'Invalid arguments to map.addImage(). The second argument must be an `HTMLImageElement`, `ImageData`, ' + 'or object with `width`, `height`, and `data` properties with the same format as `ImageData`'))); } else { var width$1 = image.width; var height$1 = image.height; var data$1 = image.data; var userImage = ((image ) ); this.style.addImage(id, { data: new __chunk_1.RGBAImage({width: width$1, height: height$1}, new Uint8Array(data$1)), pixelRatio: pixelRatio, sdf: sdf, version: version, userImage: userImage }); if (userImage.onAdd) { userImage.onAdd(this, id); } } }; /** * Update an existing style image. This image can be used in `icon-image`, * `background-pattern`, `fill-pattern`, and `line-pattern`. * * @param id The ID of the image. * @param image The image as an `HTMLImageElement`, `ImageData`, or object with `width`, `height`, and `data` * properties with the same format as `ImageData`. */ Map.prototype.updateImage = function updateImage (id , image ) { var existingImage = this.style.getImage(id); if (!existingImage) { return this.fire(new __chunk_1.ErrorEvent(new Error( 'The map has no image with that id. If you are adding a new image use `map.addImage(...)` instead.'))); } var imageData = image instanceof HTMLImageElement ? __chunk_1.browser.getImageData(image) : image; var width = imageData.width; var height = imageData.height; var data = imageData.data; if (width === undefined || height === undefined) { return this.fire(new __chunk_1.ErrorEvent(new Error( 'Invalid arguments to map.updateImage(). The second argument must be an `HTMLImageElement`, `ImageData`, ' + 'or object with `width`, `height`, and `data` properties with the same format as `ImageData`'))); } if (width !== existingImage.data.width || height !== existingImage.data.height) { return this.fire(new __chunk_1.ErrorEvent(new Error( 'The width and height of the updated image must be that same as the previous version of the image'))); } var copy = !(image instanceof HTMLImageElement); existingImage.data.replace(data, copy); this.style.updateImage(id, existingImage); }; /** * Define whether the image has been added or not * * @param id The ID of the image. */ Map.prototype.hasImage = function hasImage (id ) { if (!id) { this.fire(new __chunk_1.ErrorEvent(new Error('Missing required image id'))); return false; } return !!this.style.getImage(id); }; /** * Remove an image from the style (such as one used by `icon-image` or `background-pattern`). * * @param id The ID of the image. */ Map.prototype.removeImage = function removeImage (id ) { this.style.removeImage(id); }; /** * Load an image from an external URL for use with `Map#addImage`. External * domains must support [CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS). * * @param {string} url The URL of the image file. Image file must be in png, webp, or jpg format. * @param {Function} callback Expecting `callback(error, data)`. Called when the image has loaded or with an error argument if there is an error. * @see [Add an icon to the map](https://www.mapbox.com/mapbox-gl-js/example/add-image/) */ Map.prototype.loadImage = function loadImage (url , callback ) { __chunk_1.getImage(this._requestManager.transformRequest(url, __chunk_1.ResourceType.Image), callback); }; /** * Returns an Array of strings containing the names of all sprites/images currently available in the map * * @returns {Array} An Array of strings containing the names of all sprites/images currently available in the map * */ Map.prototype.listImages = function listImages () { return this.style.listImages(); }; /** * Adds a [Mapbox style layer](https://www.mapbox.com/mapbox-gl-style-spec/#layers) * to the map's style. * * A layer defines styling for data from a specified source. * * @param {Object | CustomLayerInterface} layer The style layer to add, conforming to the Mapbox Style Specification's * [layer definition](https://www.mapbox.com/mapbox-gl-style-spec/#layers). * @param {string} [beforeId] The ID of an existing layer to insert the new layer before. * If this argument is omitted, the layer will be appended to the end of the layers array. * @returns {Map} `this` * @see [Create and style clusters](https://www.mapbox.com/mapbox-gl-js/example/cluster/) * @see [Add a vector tile source](https://www.mapbox.com/mapbox-gl-js/example/vector-source/) * @see [Add a WMS source](https://www.mapbox.com/mapbox-gl-js/example/wms/) */ Map.prototype.addLayer = function addLayer (layer , beforeId ) { this.style.addLayer(layer, beforeId); return this._update(true); }; /** * Moves a layer to a different z-position. * * @param {string} id The ID of the layer to move. * @param {string} [beforeId] The ID of an existing layer to insert the new layer before. * If this argument is omitted, the layer will be appended to the end of the layers array. * @returns {Map} `this` */ Map.prototype.moveLayer = function moveLayer (id , beforeId ) { this.style.moveLayer(id, beforeId); return this._update(true); }; /** * Removes the layer with the given id from the map's style. * * If no such layer exists, an `error` event is fired. * * @param {string} id id of the layer to remove * @fires error */ Map.prototype.removeLayer = function removeLayer (id ) { this.style.removeLayer(id); return this._update(true); }; /** * Returns the layer with the specified ID in the map's style. * * @param {string} id The ID of the layer to get. * @returns {?Object} The layer with the specified ID, or `undefined` * if the ID corresponds to no existing layers. * @see [Filter symbols by toggling a list](https://www.mapbox.com/mapbox-gl-js/example/filter-markers/) * @see [Filter symbols by text input](https://www.mapbox.com/mapbox-gl-js/example/filter-markers-by-input/) */ Map.prototype.getLayer = function getLayer (id ) { return this.style.getLayer(id); }; /** * Sets the filter for the specified style layer. * * @param {string} layerId The ID of the layer to which the filter will be applied. * @param {Array | null | undefined} filter The filter, conforming to the Mapbox Style Specification's * [filter definition](https://www.mapbox.com/mapbox-gl-js/style-spec/#other-filter). If `null` or `undefined` is provided, the function removes any existing filter from the layer. * @param {Object} [options] * @param {boolean} [options.validate=true] Whether to check if the filter conforms to the Mapbox GL Style Specification. Disabling validation is a performance optimization that should only be used if you have previously validated the values you will be passing to this function. * * @returns {Map} `this` * @example * map.setFilter('my-layer', ['==', 'name', 'USA']); * @see [Filter features within map view](https://www.mapbox.com/mapbox-gl-js/example/filter-features-within-map-view/) * @see [Highlight features containing similar data](https://www.mapbox.com/mapbox-gl-js/example/query-similar-features/) * @see [Create a timeline animation](https://www.mapbox.com/mapbox-gl-js/example/timeline-animation/) */ Map.prototype.setFilter = function setFilter (layerId , filter , options) { if ( options === void 0 ) options = {}; this.style.setFilter(layerId, filter, options); return this._update(true); }; /** * Sets the zoom extent for the specified style layer. * * @param {string} layerId The ID of the layer to which the zoom extent will be applied. * @param {number} minzoom The minimum zoom to set (0-24). * @param {number} maxzoom The maximum zoom to set (0-24). * @returns {Map} `this` * @example * map.setLayerZoomRange('my-layer', 2, 5); */ Map.prototype.setLayerZoomRange = function setLayerZoomRange (layerId , minzoom , maxzoom ) { this.style.setLayerZoomRange(layerId, minzoom, maxzoom); return this._update(true); }; /** * Returns the filter applied to the specified style layer. * * @param {string} layerId The ID of the style layer whose filter to get. * @returns {Array} The layer's filter. */ Map.prototype.getFilter = function getFilter (layerId ) { return this.style.getFilter(layerId); }; /** * Sets the value of a paint property in the specified style layer. * * @param {string} layerId The ID of the layer to set the paint property in. * @param {string} name The name of the paint property to set. * @param {*} value The value of the paint property to set. * Must be of a type appropriate for the property, as defined in the [Mapbox Style Specification](https://www.mapbox.com/mapbox-gl-style-spec/). * @param {Object} [options] * @param {boolean} [options.validate=true] Whether to check if `value` conforms to the Mapbox GL Style Specification. Disabling validation is a performance optimization that should only be used if you have previously validated the values you will be passing to this function. * @returns {Map} `this` * @example * map.setPaintProperty('my-layer', 'fill-color', '#faafee'); * @see [Change a layer's color with buttons](https://www.mapbox.com/mapbox-gl-js/example/color-switcher/) * @see [Adjust a layer's opacity](https://www.mapbox.com/mapbox-gl-js/example/adjust-layer-opacity/) * @see [Create a draggable point](https://www.mapbox.com/mapbox-gl-js/example/drag-a-point/) */ Map.prototype.setPaintProperty = function setPaintProperty (layerId , name , value , options) { if ( options === void 0 ) options = {}; this.style.setPaintProperty(layerId, name, value, options); return this._update(true); }; /** * Returns the value of a paint property in the specified style layer. * * @param {string} layerId The ID of the layer to get the paint property from. * @param {string} name The name of a paint property to get. * @returns {*} The value of the specified paint property. */ Map.prototype.getPaintProperty = function getPaintProperty (layerId , name ) { return this.style.getPaintProperty(layerId, name); }; /** * Sets the value of a layout property in the specified style layer. * * @param {string} layerId The ID of the layer to set the layout property in. * @param {string} name The name of the layout property to set. * @param {*} value The value of the layout property. Must be of a type appropriate for the property, as defined in the [Mapbox Style Specification](https://www.mapbox.com/mapbox-gl-style-spec/). * @param {Object} [options] * @param {boolean} [options.validate=true] Whether to check if `value` conforms to the Mapbox GL Style Specification. Disabling validation is a performance optimization that should only be used if you have previously validated the values you will be passing to this function. * @returns {Map} `this` * @example * map.setLayoutProperty('my-layer', 'visibility', 'none'); */ Map.prototype.setLayoutProperty = function setLayoutProperty (layerId , name , value , options) { if ( options === void 0 ) options = {}; this.style.setLayoutProperty(layerId, name, value, options); return this._update(true); }; /** * Returns the value of a layout property in the specified style layer. * * @param {string} layerId The ID of the layer to get the layout property from. * @param {string} name The name of the layout property to get. * @returns {*} The value of the specified layout property. */ Map.prototype.getLayoutProperty = function getLayoutProperty (layerId , name ) { return this.style.getLayoutProperty(layerId, name); }; /** * Sets the any combination of light values. * * @param light Light properties to set. Must conform to the [Mapbox Style Specification](https://www.mapbox.com/mapbox-gl-style-spec/#light). * @param {Object} [options] * @param {boolean} [options.validate=true] Whether to check if the filter conforms to the Mapbox GL Style Specification. Disabling validation is a performance optimization that should only be used if you have previously validated the values you will be passing to this function. * @returns {Map} `this` */ Map.prototype.setLight = function setLight (light , options) { if ( options === void 0 ) options = {}; this.style.setLight(light, options); return this._update(true); }; /** * Returns the value of the light object. * * @returns {Object} light Light properties of the style. */ Map.prototype.getLight = function getLight () { return this.style.getLight(); }; /** * Sets the state of a feature. The `state` object is merged in with the existing state of the feature. * * @param {Object} feature Feature identifier. Feature objects returned from * {@link Map#queryRenderedFeatures} or event handlers can be used as feature identifiers. * @param {string | number} feature.id Unique id of the feature. * @param {string} feature.source The Id of the vector source or GeoJSON source for the feature. * @param {string} [feature.sourceLayer] (optional) *For vector tile sources, the sourceLayer is * required.* * @param {Object} state A set of key-value pairs. The values should be valid JSON types. * * This method requires the `feature.id` attribute on data sets. For GeoJSON sources without * feature ids, set the `generateIds` option in the `GeoJSONSourceSpecification` to auto-assign them. This * option assigns ids based on a feature's index in the source data. If you change feature data using * `map.getSource('some id').setData(..)`, you may need to re-apply state taking into account updated `id` values. */ Map.prototype.setFeatureState = function setFeatureState (feature , state ) { this.style.setFeatureState(feature, state); return this._update(); }; /** * Removes feature state, setting it back to the default behavior. If only * source is specified, removes all states of that source. If * target.id is also specified, removes all keys for that feature's state. * If key is also specified, removes that key from that feature's state. * * @param {Object} target Identifier of where to set state: can be a source, a feature, or a specific key of feature. * Feature objects returned from {@link Map#queryRenderedFeatures} or event handlers can be used as feature identifiers. * @param {string | number} target.id (optional) Unique id of the feature. Optional if key is not specified. * @param {string} target.source The Id of the vector source or GeoJSON source for the feature. * @param {string} [target.sourceLayer] (optional) *For vector tile sources, the sourceLayer is * required.* * @param {string} key (optional) The key in the feature state to reset. */ Map.prototype.removeFeatureState = function removeFeatureState (target , key ) { this.style.removeFeatureState(target, key); return this._update(); }; /** * Gets the state of a feature. * * @param {Object} feature Feature identifier. Feature objects returned from * {@link Map#queryRenderedFeatures} or event handlers can be used as feature identifiers. * @param {string | number} feature.id Unique id of the feature. * @param {string} feature.source The Id of the vector source or GeoJSON source for the feature. * @param {string} [feature.sourceLayer] (optional) *For vector tile sources, the sourceLayer is * required.* * * @returns {Object} The state of the feature. */ Map.prototype.getFeatureState = function getFeatureState (feature ) { return this.style.getFeatureState(feature); }; /** * Returns the map's containing HTML element. * * @returns {HTMLElement} The map's container. */ Map.prototype.getContainer = function getContainer () { return this._container; }; /** * Returns the HTML element containing the map's `` element. * * If you want to add non-GL overlays to the map, you should append them to this element. * * This is the element to which event bindings for map interactivity (such as panning and zooming) are * attached. It will receive bubbled events from child elements such as the ``, but not from * map controls. * * @returns {HTMLElement} The container of the map's ``. * @see [Create a draggable point](https://www.mapbox.com/mapbox-gl-js/example/drag-a-point/) * @see [Highlight features within a bounding box](https://www.mapbox.com/mapbox-gl-js/example/using-box-queryrenderedfeatures/) */ Map.prototype.getCanvasContainer = function getCanvasContainer () { return this._canvasContainer; }; /** * Returns the map's `` element. * * @returns {HTMLCanvasElement} The map's `` element. * @see [Measure distances](https://www.mapbox.com/mapbox-gl-js/example/measure/) * @see [Display a popup on hover](https://www.mapbox.com/mapbox-gl-js/example/popup-on-hover/) * @see [Center the map on a clicked symbol](https://www.mapbox.com/mapbox-gl-js/example/center-on-symbol/) */ Map.prototype.getCanvas = function getCanvas () { return this._canvas; }; Map.prototype._containerDimensions = function _containerDimensions () { var width = 0; var height = 0; if (this._container) { width = this._container.clientWidth || 400; height = this._container.clientHeight || 300; } return [width, height]; }; Map.prototype._detectMissingCSS = function _detectMissingCSS () { var computedColor = __chunk_1.window.getComputedStyle(this._missingCSSCanary).getPropertyValue('background-color'); if (computedColor !== 'rgb(250, 128, 114)') { __chunk_1.warnOnce('This page appears to be missing CSS declarations for ' + 'Mapbox GL JS, which may cause the map to display incorrectly. ' + 'Please ensure your page includes mapbox-gl.css, as described ' + 'in https://www.mapbox.com/mapbox-gl-js/api/.'); } }; Map.prototype._setupContainer = function _setupContainer () { var container = this._container; container.classList.add('mapboxgl-map'); var missingCSSCanary = this._missingCSSCanary = DOM.create('div', 'mapboxgl-canary', container); missingCSSCanary.style.visibility = 'hidden'; this._detectMissingCSS(); var canvasContainer = this._canvasContainer = DOM.create('div', 'mapboxgl-canvas-container', container); if (this._interactive) { canvasContainer.classList.add('mapboxgl-interactive'); } this._canvas = DOM.create('canvas', 'mapboxgl-canvas', canvasContainer); this._canvas.style.position = 'absolute'; this._canvas.addEventListener('webglcontextlost', this._contextLost, false); this._canvas.addEventListener('webglcontextrestored', this._contextRestored, false); this._canvas.setAttribute('tabindex', '0'); this._canvas.setAttribute('aria-label', 'Map'); var dimensions = this._containerDimensions(); this._resizeCanvas(dimensions[0], dimensions[1]); var controlContainer = this._controlContainer = DOM.create('div', 'mapboxgl-control-container', container); var positions = this._controlPositions = {}; ['top-left', 'top-right', 'bottom-left', 'bottom-right'].forEach(function (positionName) { positions[positionName] = DOM.create('div', ("mapboxgl-ctrl-" + positionName), controlContainer); }); }; Map.prototype._resizeCanvas = function _resizeCanvas (width , height ) { var pixelRatio = __chunk_1.window.devicePixelRatio || 1; // Request the required canvas size taking the pixelratio into account. this._canvas.width = pixelRatio * width; this._canvas.height = pixelRatio * height; // Maintain the same canvas size, potentially downscaling it for HiDPI displays this._canvas.style.width = width + "px"; this._canvas.style.height = height + "px"; }; Map.prototype._setupPainter = function _setupPainter () { var attributes = __chunk_1.extend({}, mapboxGlSupported.webGLContextAttributes, { failIfMajorPerformanceCaveat: this._failIfMajorPerformanceCaveat, preserveDrawingBuffer: this._preserveDrawingBuffer, antialias: this._antialias || false }); var gl = this._canvas.getContext('webgl', attributes) || this._canvas.getContext('experimental-webgl', attributes); if (!gl) { this.fire(new __chunk_1.ErrorEvent(new Error('Failed to initialize WebGL'))); return; } this.painter = new Painter(gl, this.transform); __chunk_1.webpSupported.testSupport(gl); }; Map.prototype._contextLost = function _contextLost (event ) { event.preventDefault(); if (this._frame) { this._frame.cancel(); this._frame = null; } this.fire(new __chunk_1.Event('webglcontextlost', {originalEvent: event})); }; Map.prototype._contextRestored = function _contextRestored (event ) { this._setupPainter(); this.resize(); this._update(); this.fire(new __chunk_1.Event('webglcontextrestored', {originalEvent: event})); }; /** * Returns a Boolean indicating whether the map is fully loaded. * * Returns `false` if the style is not yet fully loaded, * or if there has been a change to the sources or style that * has not yet fully loaded. * * @returns {boolean} A Boolean indicating whether the map is fully loaded. */ Map.prototype.loaded = function loaded () { return !this._styleDirty && !this._sourcesDirty && !!this.style && this.style.loaded(); }; /** * Update this map's style and sources, and re-render the map. * * @param {boolean} updateStyle mark the map's style for reprocessing as * well as its sources * @returns {Map} this * @private */ Map.prototype._update = function _update (updateStyle ) { if (!this.style) { return this; } this._styleDirty = this._styleDirty || updateStyle; this._sourcesDirty = true; this.triggerRepaint(); return this; }; /** * Request that the given callback be executed during the next render * frame. Schedule a render frame if one is not already scheduled. * @returns An id that can be used to cancel the callback * @private */ Map.prototype._requestRenderFrame = function _requestRenderFrame (callback ) { this._update(); return this._renderTaskQueue.add(callback); }; Map.prototype._cancelRenderFrame = function _cancelRenderFrame (id ) { this._renderTaskQueue.remove(id); }; /** * Call when a (re-)render of the map is required: * - The style has changed (`setPaintProperty()`, etc.) * - Source data has changed (e.g. tiles have finished loading) * - The map has is moving (or just finished moving) * - A transition is in progress * * @returns {Map} this * @private */ Map.prototype._render = function _render () { // A custom layer may have used the context asynchronously. Mark the state as dirty. this.painter.context.setDirty(); this.painter.setBaseState(); this._renderTaskQueue.run(); var crossFading = false; // If the style has changed, the map is being zoomed, or a transition or fade is in progress: // - Apply style changes (in a batch) // - Recalculate paint properties. if (this.style && this._styleDirty) { this._styleDirty = false; var zoom = this.transform.zoom; var now = __chunk_1.browser.now(); this.style.zoomHistory.update(zoom, now); var parameters = new __chunk_1.EvaluationParameters(zoom, { now: now, fadeDuration: this._fadeDuration, zoomHistory: this.style.zoomHistory, transition: this.style.getTransition() }); var factor = parameters.crossFadingFactor(); if (factor !== 1 || factor !== this._crossFadingFactor) { crossFading = true; this._crossFadingFactor = factor; } this.style.update(parameters); } // If we are in _render for any reason other than an in-progress paint // transition, update source caches to check for and load any tiles we // need for the current transform if (this.style && this._sourcesDirty) { this._sourcesDirty = false; this.style._updateSources(this.transform); } this._placementDirty = this.style && this.style._updatePlacement(this.painter.transform, this.showCollisionBoxes, this._fadeDuration, this._crossSourceCollisions); // Actually draw this.painter.render(this.style, { showTileBoundaries: this.showTileBoundaries, showOverdrawInspector: this._showOverdrawInspector, rotating: this.isRotating(), zooming: this.isZooming(), moving: this.isMoving(), fadeDuration: this._fadeDuration }); this.fire(new __chunk_1.Event('render')); if (this.loaded() && !this._loaded) { this._loaded = true; this.fire(new __chunk_1.Event('load')); } if (this.style && (this.style.hasTransitions() || crossFading)) { this._styleDirty = true; } if (this.style && !this._placementDirty) { // Since no fade operations are in progress, we can release // all tiles held for fading. If we didn't do this, the tiles // would just sit in the SourceCaches until the next render this.style._releaseSymbolFadeTiles(); } // Schedule another render frame if it's needed. // // Even though `_styleDirty` and `_sourcesDirty` are reset in this // method, synchronous events fired during Style#update or // Style#_updateSources could have caused them to be set again. if (this._sourcesDirty || this._repaint || this._styleDirty || this._placementDirty) { this.triggerRepaint(); } else if (!this.isMoving() && this.loaded()) { this.fire(new __chunk_1.Event('idle')); } return this; }; /** * Clean up and release all internal resources associated with this map. * * This includes DOM elements, event bindings, web workers, and WebGL resources. * * Use this method when you are done using the map and wish to ensure that it no * longer consumes browser resources. Afterwards, you must not call any other * methods on the map. */ Map.prototype.remove = function remove () { if (this._hash) { this._hash.remove(); } for (var i = 0, list = this._controls; i < list.length; i += 1) { var control = list[i]; control.onRemove(this); } this._controls = []; if (this._frame) { this._frame.cancel(); this._frame = null; } this._renderTaskQueue.clear(); this.setStyle(null); if (typeof __chunk_1.window !== 'undefined') { __chunk_1.window.removeEventListener('resize', this._onWindowResize, false); __chunk_1.window.removeEventListener('online', this._onWindowOnline, false); } var extension = this.painter.context.gl.getExtension('WEBGL_lose_context'); if (extension) { extension.loseContext(); } removeNode(this._canvasContainer); removeNode(this._controlContainer); removeNode(this._missingCSSCanary); this._container.classList.remove('mapboxgl-map'); this.fire(new __chunk_1.Event('remove')); }; /** * Trigger the rendering of a single frame. Use this method with custom layers to * repaint the map when the layer changes. Calling this multiple times before the * next frame is rendered will still result in only a single frame being rendered. */ Map.prototype.triggerRepaint = function triggerRepaint () { var this$1 = this; if (this.style && !this._frame) { this._frame = __chunk_1.browser.frame(function () { this$1._frame = null; this$1._render(); }); } }; Map.prototype._onWindowOnline = function _onWindowOnline () { this._update(); }; Map.prototype._onWindowResize = function _onWindowResize () { if (this._trackResize) { this.resize()._update(); } }; /** * Gets and sets a Boolean indicating whether the map will render an outline * around each tile. These tile boundaries are useful for debugging. * * @name showTileBoundaries * @type {boolean} * @instance * @memberof Map */ prototypeAccessors.showTileBoundaries.get = function () { return !!this._showTileBoundaries; }; prototypeAccessors.showTileBoundaries.set = function (value ) { if (this._showTileBoundaries === value) { return; } this._showTileBoundaries = value; this._update(); }; /** * Gets and sets a Boolean indicating whether the map will render boxes * around all symbols in the data source, revealing which symbols * were rendered or which were hidden due to collisions. * This information is useful for debugging. * * @name showCollisionBoxes * @type {boolean} * @instance * @memberof Map */ prototypeAccessors.showCollisionBoxes.get = function () { return !!this._showCollisionBoxes; }; prototypeAccessors.showCollisionBoxes.set = function (value ) { if (this._showCollisionBoxes === value) { return; } this._showCollisionBoxes = value; if (value) { // When we turn collision boxes on we have to generate them for existing tiles // When we turn them off, there's no cost to leaving existing boxes in place this.style._generateCollisionBoxes(); } else { // Otherwise, call an update to remove collision boxes this._update(); } }; /* * Gets and sets a Boolean indicating whether the map should color-code * each fragment to show how many times it has been shaded. * White fragments have been shaded 8 or more times. * Black fragments have been shaded 0 times. * This information is useful for debugging. * * @name showOverdraw * @type {boolean} * @instance * @memberof Map */ prototypeAccessors.showOverdrawInspector.get = function () { return !!this._showOverdrawInspector; }; prototypeAccessors.showOverdrawInspector.set = function (value ) { if (this._showOverdrawInspector === value) { return; } this._showOverdrawInspector = value; this._update(); }; /** * Gets and sets a Boolean indicating whether the map will * continuously repaint. This information is useful for analyzing performance. * * @name repaint * @type {boolean} * @instance * @memberof Map */ prototypeAccessors.repaint.get = function () { return !!this._repaint; }; prototypeAccessors.repaint.set = function (value ) { if (this._repaint !== value) { this._repaint = value; this.triggerRepaint(); } }; // show vertices prototypeAccessors.vertices.get = function () { return !!this._vertices; }; prototypeAccessors.vertices.set = function (value ) { this._vertices = value; this._update(); }; Object.defineProperties( Map.prototype, prototypeAccessors ); return Map; }(Camera)); function removeNode(node) { if (node.parentNode) { node.parentNode.removeChild(node); } } /** * Interface for interactive controls added to the map. This is an * specification for implementers to model: it is not * an exported method or class. * * Controls must implement `onAdd` and `onRemove`, and must own an * element, which is often a `div` element. To use Mapbox GL JS's * default control styling, add the `mapboxgl-ctrl` class to your control's * node. * * @interface IControl * @example * // Control implemented as ES6 class * class HelloWorldControl { * onAdd(map) { * this._map = map; * this._container = document.createElement('div'); * this._container.className = 'mapboxgl-ctrl'; * this._container.textContent = 'Hello, world'; * return this._container; * } * * onRemove() { * this._container.parentNode.removeChild(this._container); * this._map = undefined; * } * } * * // Control implemented as ES5 prototypical class * function HelloWorldControl() { } * * HelloWorldControl.prototype.onAdd = function(map) { * this._map = map; * this._container = document.createElement('div'); * this._container.className = 'mapboxgl-ctrl'; * this._container.textContent = 'Hello, world'; * return this._container; * }; * * HelloWorldControl.prototype.onRemove = function () { * this._container.parentNode.removeChild(this._container); * this._map = undefined; * }; */ /** * Register a control on the map and give it a chance to register event listeners * and resources. This method is called by {@link Map#addControl} * internally. * * @function * @memberof IControl * @instance * @name onAdd * @param {Map} map the Map this control will be added to * @returns {HTMLElement} The control's container element. This should * be created by the control and returned by onAdd without being attached * to the DOM: the map will insert the control's element into the DOM * as necessary. */ /** * Unregister a control on the map and give it a chance to detach event listeners * and resources. This method is called by {@link Map#removeControl} * internally. * * @function * @memberof IControl * @instance * @name onRemove * @param {Map} map the Map this control will be removed from * @returns {undefined} there is no required return value for this method */ /** * Optionally provide a default position for this control. If this method * is implemented and {@link Map#addControl} is called without the `position` * parameter, the value returned by getDefaultPosition will be used as the * control's position. * * @function * @memberof IControl * @instance * @name getDefaultPosition * @returns {string} a control position, one of the values valid in addControl. */ /** * A [`Point` geometry](https://github.com/mapbox/point-geometry) object, which has * `x` and `y` properties representing screen coordinates in pixels. * * @typedef {Object} Point */ /** * A {@link Point} or an array of two numbers representing `x` and `y` screen coordinates in pixels. * * @typedef {(Point | Array)} PointLike */ // var defaultOptions$1 = { showCompass: true, showZoom: true }; /** * A `NavigationControl` control contains zoom buttons and a compass. * * @implements {IControl} * @param {Object} [options] * @param {Boolean} [options.showCompass=true] If `true` the compass button is included. * @param {Boolean} [options.showZoom=true] If `true` the zoom-in and zoom-out buttons are included. * @example * var nav = new mapboxgl.NavigationControl(); * map.addControl(nav, 'top-left'); * @see [Display map navigation controls](https://www.mapbox.com/mapbox-gl-js/example/navigation/) * @see [Add a third party vector tile source](https://www.mapbox.com/mapbox-gl-js/example/third-party/) */ var NavigationControl = function NavigationControl(options ) { var this$1 = this; this.options = __chunk_1.extend({}, defaultOptions$1, options); this._container = DOM.create('div', 'mapboxgl-ctrl mapboxgl-ctrl-group'); this._container.addEventListener('contextmenu', function (e) { return e.preventDefault(); }); if (this.options.showZoom) { __chunk_1.bindAll([ '_updateZoomButtons' ], this); this._zoomInButton = this._createButton('mapboxgl-ctrl-icon mapboxgl-ctrl-zoom-in', 'Zoom in', function () { return this$1._map.zoomIn(); }); this._zoomOutButton = this._createButton('mapboxgl-ctrl-icon mapboxgl-ctrl-zoom-out', 'Zoom out', function () { return this$1._map.zoomOut(); }); } if (this.options.showCompass) { __chunk_1.bindAll([ '_rotateCompassArrow' ], this); this._compass = this._createButton('mapboxgl-ctrl-icon mapboxgl-ctrl-compass', 'Reset bearing to north', function () { return this$1._map.resetNorth(); }); this._compassArrow = DOM.create('span', 'mapboxgl-ctrl-compass-arrow', this._compass); } }; NavigationControl.prototype._updateZoomButtons = function _updateZoomButtons () { var zoom = this._map.getZoom(); this._zoomInButton.classList.toggle('mapboxgl-ctrl-icon-disabled', zoom === this._map.getMaxZoom()); this._zoomOutButton.classList.toggle('mapboxgl-ctrl-icon-disabled', zoom === this._map.getMinZoom()); }; NavigationControl.prototype._rotateCompassArrow = function _rotateCompassArrow () { var rotate = "rotate(" + (this._map.transform.angle * (180 / Math.PI)) + "deg)"; this._compassArrow.style.transform = rotate; }; NavigationControl.prototype.onAdd = function onAdd (map ) { this._map = map; if (this.options.showZoom) { this._map.on('zoom', this._updateZoomButtons); this._updateZoomButtons(); } if (this.options.showCompass) { this._map.on('rotate', this._rotateCompassArrow); this._rotateCompassArrow(); this._handler = new DragRotateHandler(map, {button: 'left', element: this._compass}); DOM.addEventListener(this._compass, 'mousedown', this._handler.onMouseDown); this._handler.enable(); } return this._container; }; NavigationControl.prototype.onRemove = function onRemove () { DOM.remove(this._container); if (this.options.showZoom) { this._map.off('zoom', this._updateZoomButtons); } if (this.options.showCompass) { this._map.off('rotate', this._rotateCompassArrow); DOM.removeEventListener(this._compass, 'mousedown', this._handler.onMouseDown); this._handler.disable(); delete this._handler; } delete this._map; }; NavigationControl.prototype._createButton = function _createButton (className , ariaLabel , fn ) { var a = DOM.create('button', className, this._container); a.type = 'button'; a.title = ariaLabel; a.setAttribute('aria-label', ariaLabel); a.addEventListener('click', fn); return a; }; // /** * Given a LngLat, prior projected position, and a transform, return a new LngLat shifted * n × 360° east or west for some n ≥ 0 such that: * * * the projected location of the result is on screen, if possible, and secondarily: * * the difference between the projected location of the result and the prior position * is minimized. * * The object is to preserve perceived object constancy for Popups and Markers as much as * possible; they should avoid shifting large distances across the screen, even when the * map center changes by ±360° due to automatic wrapping, and when about to go off screen, * should wrap just enough to avoid doing so. * * @private */ function smartWrap(lngLat , priorPos , transform ) { lngLat = new __chunk_1.LngLat(lngLat.lng, lngLat.lat); // First, try shifting one world in either direction, and see if either is closer to the // prior position. This preserves object constancy when the map center is auto-wrapped // during animations. if (priorPos) { var left = new __chunk_1.LngLat(lngLat.lng - 360, lngLat.lat); var right = new __chunk_1.LngLat(lngLat.lng + 360, lngLat.lat); var delta = transform.locationPoint(lngLat).distSqr(priorPos); if (transform.locationPoint(left).distSqr(priorPos) < delta) { lngLat = left; } else if (transform.locationPoint(right).distSqr(priorPos) < delta) { lngLat = right; } } // Second, wrap toward the center until the new position is on screen, or we can't get // any closer. while (Math.abs(lngLat.lng - transform.center.lng) > 180) { var pos = transform.locationPoint(lngLat); if (pos.x >= 0 && pos.y >= 0 && pos.x <= transform.width && pos.y <= transform.height) { break; } if (lngLat.lng > transform.center.lng) { lngLat.lng -= 360; } else { lngLat.lng += 360; } } return lngLat; } // var anchorTranslate = { 'center': 'translate(-50%,-50%)', 'top': 'translate(-50%,0)', 'top-left': 'translate(0,0)', 'top-right': 'translate(-100%,0)', 'bottom': 'translate(-50%,-100%)', 'bottom-left': 'translate(0,-100%)', 'bottom-right': 'translate(-100%,-100%)', 'left': 'translate(0,-50%)', 'right': 'translate(-100%,-50%)' }; function applyAnchorClass(element , anchor , prefix ) { var classList = element.classList; for (var key in anchorTranslate) { classList.remove(("mapboxgl-" + prefix + "-anchor-" + key)); } classList.add(("mapboxgl-" + prefix + "-anchor-" + anchor)); } // /** * Creates a marker component * @param {Object} [options] * @param {HTMLElement} [options.element] DOM element to use as a marker. The default is a light blue, droplet-shaped SVG marker. * @param {string} [options.anchor='center'] A string indicating the part of the Marker that should be positioned closest to the coordinate set via {@link Marker#setLngLat}. * Options are `'center'`, `'top'`, `'bottom'`, `'left'`, `'right'`, `'top-left'`, `'top-right'`, `'bottom-left'`, and `'bottom-right'`. * @param {PointLike} [options.offset] The offset in pixels as a {@link PointLike} object to apply relative to the element's center. Negatives indicate left and up. * @param {string} [options.color='#3FB1CE'] The color to use for the default marker if options.element is not provided. The default is light blue. * @param {boolean} [options.draggable=false] A boolean indicating whether or not a marker is able to be dragged to a new position on the map. * @example * var marker = new mapboxgl.Marker() * .setLngLat([30.5, 50.5]) * .addTo(map); * @see [Add custom icons with Markers](https://www.mapbox.com/mapbox-gl-js/example/custom-marker-icons/) * @see [Create a draggable Marker](https://www.mapbox.com/mapbox-gl-js/example/drag-a-marker/) */ var Marker = /*@__PURE__*/(function (Evented) { function Marker(options , legacyOptions ) { Evented.call(this); // For backward compatibility -- the constructor used to accept the element as a // required first argument, before it was made optional. if (options instanceof __chunk_1.window.HTMLElement || legacyOptions) { options = __chunk_1.extend({element: options}, legacyOptions); } __chunk_1.bindAll([ '_update', '_onMove', '_onUp', '_addDragHandler', '_onMapClick' ], this); this._anchor = options && options.anchor || 'center'; this._color = options && options.color || '#3FB1CE'; this._draggable = options && options.draggable || false; this._state = 'inactive'; if (!options || !options.element) { this._defaultMarker = true; this._element = DOM.create('div'); // create default map marker SVG var svg = DOM.createNS('http://www.w3.org/2000/svg', 'svg'); svg.setAttributeNS(null, 'display', 'block'); svg.setAttributeNS(null, 'height', '41px'); svg.setAttributeNS(null, 'width', '27px'); svg.setAttributeNS(null, 'viewBox', '0 0 27 41'); var markerLarge = DOM.createNS('http://www.w3.org/2000/svg', 'g'); markerLarge.setAttributeNS(null, 'stroke', 'none'); markerLarge.setAttributeNS(null, 'stroke-width', '1'); markerLarge.setAttributeNS(null, 'fill', 'none'); markerLarge.setAttributeNS(null, 'fill-rule', 'evenodd'); var page1 = DOM.createNS('http://www.w3.org/2000/svg', 'g'); page1.setAttributeNS(null, 'fill-rule', 'nonzero'); var shadow = DOM.createNS('http://www.w3.org/2000/svg', 'g'); shadow.setAttributeNS(null, 'transform', 'translate(3.0, 29.0)'); shadow.setAttributeNS(null, 'fill', '#000000'); var ellipses = [ {'rx': '10.5', 'ry': '5.25002273'}, {'rx': '10.5', 'ry': '5.25002273'}, {'rx': '9.5', 'ry': '4.77275007'}, {'rx': '8.5', 'ry': '4.29549936'}, {'rx': '7.5', 'ry': '3.81822308'}, {'rx': '6.5', 'ry': '3.34094679'}, {'rx': '5.5', 'ry': '2.86367051'}, {'rx': '4.5', 'ry': '2.38636864'} ]; for (var i = 0, list = ellipses; i < list.length; i += 1) { var data = list[i]; var ellipse = DOM.createNS('http://www.w3.org/2000/svg', 'ellipse'); ellipse.setAttributeNS(null, 'opacity', '0.04'); ellipse.setAttributeNS(null, 'cx', '10.5'); ellipse.setAttributeNS(null, 'cy', '5.80029008'); ellipse.setAttributeNS(null, 'rx', data['rx']); ellipse.setAttributeNS(null, 'ry', data['ry']); shadow.appendChild(ellipse); } var background = DOM.createNS('http://www.w3.org/2000/svg', 'g'); background.setAttributeNS(null, 'fill', this._color); var bgPath = DOM.createNS('http://www.w3.org/2000/svg', 'path'); bgPath.setAttributeNS(null, 'd', 'M27,13.5 C27,19.074644 20.250001,27.000002 14.75,34.500002 C14.016665,35.500004 12.983335,35.500004 12.25,34.500002 C6.7499993,27.000002 0,19.222562 0,13.5 C0,6.0441559 6.0441559,0 13.5,0 C20.955844,0 27,6.0441559 27,13.5 Z'); background.appendChild(bgPath); var border = DOM.createNS('http://www.w3.org/2000/svg', 'g'); border.setAttributeNS(null, 'opacity', '0.25'); border.setAttributeNS(null, 'fill', '#000000'); var borderPath = DOM.createNS('http://www.w3.org/2000/svg', 'path'); borderPath.setAttributeNS(null, 'd', 'M13.5,0 C6.0441559,0 0,6.0441559 0,13.5 C0,19.222562 6.7499993,27 12.25,34.5 C13,35.522727 14.016664,35.500004 14.75,34.5 C20.250001,27 27,19.074644 27,13.5 C27,6.0441559 20.955844,0 13.5,0 Z M13.5,1 C20.415404,1 26,6.584596 26,13.5 C26,15.898657 24.495584,19.181431 22.220703,22.738281 C19.945823,26.295132 16.705119,30.142167 13.943359,33.908203 C13.743445,34.180814 13.612715,34.322738 13.5,34.441406 C13.387285,34.322738 13.256555,34.180814 13.056641,33.908203 C10.284481,30.127985 7.4148684,26.314159 5.015625,22.773438 C2.6163816,19.232715 1,15.953538 1,13.5 C1,6.584596 6.584596,1 13.5,1 Z'); border.appendChild(borderPath); var maki = DOM.createNS('http://www.w3.org/2000/svg', 'g'); maki.setAttributeNS(null, 'transform', 'translate(6.0, 7.0)'); maki.setAttributeNS(null, 'fill', '#FFFFFF'); var circleContainer = DOM.createNS('http://www.w3.org/2000/svg', 'g'); circleContainer.setAttributeNS(null, 'transform', 'translate(8.0, 8.0)'); var circle1 = DOM.createNS('http://www.w3.org/2000/svg', 'circle'); circle1.setAttributeNS(null, 'fill', '#000000'); circle1.setAttributeNS(null, 'opacity', '0.25'); circle1.setAttributeNS(null, 'cx', '5.5'); circle1.setAttributeNS(null, 'cy', '5.5'); circle1.setAttributeNS(null, 'r', '5.4999962'); var circle2 = DOM.createNS('http://www.w3.org/2000/svg', 'circle'); circle2.setAttributeNS(null, 'fill', '#FFFFFF'); circle2.setAttributeNS(null, 'cx', '5.5'); circle2.setAttributeNS(null, 'cy', '5.5'); circle2.setAttributeNS(null, 'r', '5.4999962'); circleContainer.appendChild(circle1); circleContainer.appendChild(circle2); page1.appendChild(shadow); page1.appendChild(background); page1.appendChild(border); page1.appendChild(maki); page1.appendChild(circleContainer); svg.appendChild(page1); this._element.appendChild(svg); // if no element and no offset option given apply an offset for the default marker // the -14 as the y value of the default marker offset was determined as follows // // the marker tip is at the center of the shadow ellipse from the default svg // the y value of the center of the shadow ellipse relative to the svg top left is "shadow transform translate-y (29.0) + ellipse cy (5.80029008)" // offset to the svg center "height (41 / 2)" gives (29.0 + 5.80029008) - (41 / 2) and rounded for an integer pixel offset gives 14 // negative is used to move the marker up from the center so the tip is at the Marker lngLat this._offset = __chunk_1.Point.convert(options && options.offset || [0, -14]); } else { this._element = options.element; this._offset = __chunk_1.Point.convert(options && options.offset || [0, 0]); } this._element.classList.add('mapboxgl-marker'); this._element.addEventListener('dragstart', function (e ) { e.preventDefault(); }); applyAnchorClass(this._element, this._anchor, 'marker'); this._popup = null; } if ( Evented ) Marker.__proto__ = Evented; Marker.prototype = Object.create( Evented && Evented.prototype ); Marker.prototype.constructor = Marker; /** * Attaches the marker to a map * @param {Map} map * @returns {Marker} `this` */ Marker.prototype.addTo = function addTo (map ) { this.remove(); this._map = map; map.getCanvasContainer().appendChild(this._element); map.on('move', this._update); map.on('moveend', this._update); this.setDraggable(this._draggable); this._update(); // If we attached the `click` listener to the marker element, the popup // would close once the event propogated to `map` due to the // `Popup#_onClickClose` listener. this._map.on('click', this._onMapClick); return this; }; /** * Removes the marker from a map * @example * var marker = new mapboxgl.Marker().addTo(map); * marker.remove(); * @returns {Marker} `this` */ Marker.prototype.remove = function remove () { if (this._map) { this._map.off('click', this._onMapClick); this._map.off('move', this._update); this._map.off('moveend', this._update); this._map.off('mousedown', this._addDragHandler); this._map.off('touchstart', this._addDragHandler); this._map.off('mouseup', this._onUp); this._map.off('touchend', this._onUp); delete this._map; } DOM.remove(this._element); if (this._popup) { this._popup.remove(); } return this; }; /** * Get the marker's geographical location. * * The longitude of the result may differ by a multiple of 360 degrees from the longitude previously * set by `setLngLat` because `Marker` wraps the anchor longitude across copies of the world to keep * the marker on screen. * * @returns {LngLat} */ Marker.prototype.getLngLat = function getLngLat () { return this._lngLat; }; /** * Set the marker's geographical position and move it. * @returns {Marker} `this` */ Marker.prototype.setLngLat = function setLngLat (lnglat ) { this._lngLat = __chunk_1.LngLat.convert(lnglat); this._pos = null; if (this._popup) { this._popup.setLngLat(this._lngLat); } this._update(); return this; }; /** * Returns the `Marker`'s HTML element. * @returns {HTMLElement} element */ Marker.prototype.getElement = function getElement () { return this._element; }; /** * Binds a Popup to the Marker * @param popup an instance of the `Popup` class. If undefined or null, any popup * set on this `Marker` instance is unset * @returns {Marker} `this` */ Marker.prototype.setPopup = function setPopup (popup ) { if (this._popup) { this._popup.remove(); this._popup = null; } if (popup) { if (!('offset' in popup.options)) { var markerHeight = 41 - (5.8 / 2); var markerRadius = 13.5; var linearOffset = Math.sqrt(Math.pow(markerRadius, 2) / 2); popup.options.offset = this._defaultMarker ? { 'top': [0, 0], 'top-left': [0, 0], 'top-right': [0, 0], 'bottom': [0, -markerHeight], 'bottom-left': [linearOffset, (markerHeight - markerRadius + linearOffset) * -1], 'bottom-right': [-linearOffset, (markerHeight - markerRadius + linearOffset) * -1], 'left': [markerRadius, (markerHeight - markerRadius) * -1], 'right': [-markerRadius, (markerHeight - markerRadius) * -1] } : this._offset; } this._popup = popup; if (this._lngLat) { this._popup.setLngLat(this._lngLat); } } return this; }; Marker.prototype._onMapClick = function _onMapClick (e ) { var targetElement = e.originalEvent.target; var element = this._element; if (this._popup && (targetElement === element || element.contains((targetElement )))) { this.togglePopup(); } }; /** * Returns the Popup instance that is bound to the Marker * @returns {Popup} popup */ Marker.prototype.getPopup = function getPopup () { return this._popup; }; /** * Opens or closes the bound popup, depending on the current state * @returns {Marker} `this` */ Marker.prototype.togglePopup = function togglePopup () { var popup = this._popup; if (!popup) { return this; } else if (popup.isOpen()) { popup.remove(); } else { popup.addTo(this._map); } return this; }; Marker.prototype._update = function _update (e ) { if (!this._map) { return; } if (this._map.transform.renderWorldCopies) { this._lngLat = smartWrap(this._lngLat, this._pos, this._map.transform); } this._pos = this._map.project(this._lngLat)._add(this._offset); // because rounding the coordinates at every `move` event causes stuttered zooming // we only round them when _update is called with `moveend` or when its called with // no arguments (when the Marker is initialized or Marker#setLngLat is invoked). if (!e || e.type === "moveend") { this._pos = this._pos.round(); } DOM.setTransform(this._element, ((anchorTranslate[this._anchor]) + " translate(" + (this._pos.x) + "px, " + (this._pos.y) + "px)")); }; /** * Get the marker's offset. * @returns {Point} */ Marker.prototype.getOffset = function getOffset () { return this._offset; }; /** * Sets the offset of the marker * @param {PointLike} offset The offset in pixels as a {@link PointLike} object to apply relative to the element's center. Negatives indicate left and up. * @returns {Marker} `this` */ Marker.prototype.setOffset = function setOffset (offset ) { this._offset = __chunk_1.Point.convert(offset); this._update(); return this; }; Marker.prototype._onMove = function _onMove (e ) { this._pos = e.point.sub(this._positionDelta); this._lngLat = this._map.unproject(this._pos); this.setLngLat(this._lngLat); // suppress click event so that popups don't toggle on drag this._element.style.pointerEvents = 'none'; // make sure dragstart only fires on the first move event after mousedown. // this can't be on mousedown because that event doesn't necessarily // imply that a drag is about to happen. if (this._state === 'pending') { this._state = 'active'; /** * Fired when dragging starts * * @event dragstart * @memberof Marker * @instance * @type {Object} * @property {Marker} marker object that is being dragged */ this.fire(new __chunk_1.Event('dragstart')); } /** * Fired while dragging * * @event drag * @memberof Marker * @instance * @type {Object} * @property {Marker} marker object that is being dragged */ this.fire(new __chunk_1.Event('drag')); }; Marker.prototype._onUp = function _onUp () { // revert to normal pointer event handling this._element.style.pointerEvents = 'auto'; this._positionDelta = null; this._map.off('mousemove', this._onMove); this._map.off('touchmove', this._onMove); // only fire dragend if it was preceded by at least one drag event if (this._state === 'active') { /** * Fired when the marker is finished being dragged * * @event dragend * @memberof Marker * @instance * @type {Object} * @property {Marker} marker object that was dragged */ this.fire(new __chunk_1.Event('dragend')); } this._state = 'inactive'; }; Marker.prototype._addDragHandler = function _addDragHandler (e ) { if (this._element.contains((e.originalEvent.target ))) { e.preventDefault(); // We need to calculate the pixel distance between the click point // and the marker position, with the offset accounted for. Then we // can subtract this distance from the mousemove event's position // to calculate the new marker position. // If we don't do this, the marker 'jumps' to the click position // creating a jarring UX effect. this._positionDelta = e.point.sub(this._pos).add(this._offset); this._state = 'pending'; this._map.on('mousemove', this._onMove); this._map.on('touchmove', this._onMove); this._map.once('mouseup', this._onUp); this._map.once('touchend', this._onUp); } }; /** * Sets the `draggable` property and functionality of the marker * @param {boolean} [shouldBeDraggable=false] Turns drag functionality on/off * @returns {Marker} `this` */ Marker.prototype.setDraggable = function setDraggable (shouldBeDraggable ) { this._draggable = !!shouldBeDraggable; // convert possible undefined value to false // handle case where map may not exist yet // e.g. when setDraggable is called before addTo if (this._map) { if (shouldBeDraggable) { this._map.on('mousedown', this._addDragHandler); this._map.on('touchstart', this._addDragHandler); } else { this._map.off('mousedown', this._addDragHandler); this._map.off('touchstart', this._addDragHandler); } } return this; }; /** * Returns true if the marker can be dragged * @returns {boolean} */ Marker.prototype.isDraggable = function isDraggable () { return this._draggable; }; return Marker; }(__chunk_1.Evented)); // var defaultOptions$2 = { positionOptions: { enableHighAccuracy: false, maximumAge: 0, timeout: 6000 /* 6 sec */ }, fitBoundsOptions: { maxZoom: 15 }, trackUserLocation: false, showUserLocation: true }; var className = 'mapboxgl-ctrl'; var supportsGeolocation; function checkGeolocationSupport(callback) { if (supportsGeolocation !== undefined) { callback(supportsGeolocation); } else if (__chunk_1.window.navigator.permissions !== undefined) { // navigator.permissions has incomplete browser support // http://caniuse.com/#feat=permissions-api // Test for the case where a browser disables Geolocation because of an // insecure origin __chunk_1.window.navigator.permissions.query({ name: 'geolocation' }).then(function (p) { supportsGeolocation = p.state !== 'denied'; callback(supportsGeolocation); }); } else { supportsGeolocation = !!__chunk_1.window.navigator.geolocation; callback(supportsGeolocation); } } /** * A `GeolocateControl` control provides a button that uses the browser's geolocation * API to locate the user on the map. * * Not all browsers support geolocation, * and some users may disable the feature. Geolocation support for modern * browsers including Chrome requires sites to be served over HTTPS. If * geolocation support is not available, the GeolocateControl will not * be visible. * * The zoom level applied will depend on the accuracy of the geolocation provided by the device. * * The GeolocateControl has two modes. If `trackUserLocation` is `false` (default) the control acts as a button, which when pressed will set the map's camera to target the user location. If the user moves, the map won't update. This is most suited for the desktop. If `trackUserLocation` is `true` the control acts as a toggle button that when active the user's location is actively monitored for changes. In this mode the GeolocateControl has three states: * * active - the map's camera automatically updates as the user's location changes, keeping the location dot in the center. * * passive - the user's location dot automatically updates, but the map's camera does not. * * disabled * * @implements {IControl} * @param {Object} [options] * @param {Object} [options.positionOptions={enableHighAccuracy: false, timeout: 6000}] A Geolocation API [PositionOptions](https://developer.mozilla.org/en-US/docs/Web/API/PositionOptions) object. * @param {Object} [options.fitBoundsOptions={maxZoom: 15}] A [`fitBounds`](#map#fitbounds) options object to use when the map is panned and zoomed to the user's location. The default is to use a `maxZoom` of 15 to limit how far the map will zoom in for very accurate locations. * @param {Object} [options.trackUserLocation=false] If `true` the Geolocate Control becomes a toggle button and when active the map will receive updates to the user's location as it changes. * @param {Object} [options.showUserLocation=true] By default a dot will be shown on the map at the user's location. Set to `false` to disable. * * @example * map.addControl(new mapboxgl.GeolocateControl({ * positionOptions: { * enableHighAccuracy: true * }, * trackUserLocation: true * })); * @see [Locate the user](https://www.mapbox.com/mapbox-gl-js/example/locate-user/) */ var GeolocateControl = /*@__PURE__*/(function (Evented) { function GeolocateControl(options ) { Evented.call(this); this.options = __chunk_1.extend({}, defaultOptions$2, options); __chunk_1.bindAll([ '_onSuccess', '_onError', '_finish', '_setupUI', '_updateCamera', '_updateMarker' ], this); } if ( Evented ) GeolocateControl.__proto__ = Evented; GeolocateControl.prototype = Object.create( Evented && Evented.prototype ); GeolocateControl.prototype.constructor = GeolocateControl; GeolocateControl.prototype.onAdd = function onAdd (map ) { this._map = map; this._container = DOM.create('div', (className + " " + className + "-group")); checkGeolocationSupport(this._setupUI); return this._container; }; GeolocateControl.prototype.onRemove = function onRemove () { // clear the geolocation watch if exists if (this._geolocationWatchID !== undefined) { __chunk_1.window.navigator.geolocation.clearWatch(this._geolocationWatchID); this._geolocationWatchID = (undefined ); } // clear the marker from the map if (this.options.showUserLocation && this._userLocationDotMarker) { this._userLocationDotMarker.remove(); } DOM.remove(this._container); this._map = (undefined ); }; GeolocateControl.prototype._onSuccess = function _onSuccess (position ) { if (this.options.trackUserLocation) { // keep a record of the position so that if the state is BACKGROUND and the user // clicks the button, we can move to ACTIVE_LOCK immediately without waiting for // watchPosition to trigger _onSuccess this._lastKnownPosition = position; switch (this._watchState) { case 'WAITING_ACTIVE': case 'ACTIVE_LOCK': case 'ACTIVE_ERROR': this._watchState = 'ACTIVE_LOCK'; this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-waiting'); this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-active-error'); this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-active'); break; case 'BACKGROUND': case 'BACKGROUND_ERROR': this._watchState = 'BACKGROUND'; this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-waiting'); this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-background-error'); this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-background'); break; default: __chunk_1.assert(false, ("Unexpected watchState " + (this._watchState))); } } // if showUserLocation and the watch state isn't off then update the marker location if (this.options.showUserLocation && this._watchState !== 'OFF') { this._updateMarker(position); } // if in normal mode (not watch mode), or if in watch mode and the state is active watch // then update the camera if (!this.options.trackUserLocation || this._watchState === 'ACTIVE_LOCK') { this._updateCamera(position); } if (this.options.showUserLocation) { this._dotElement.classList.remove('mapboxgl-user-location-dot-stale'); } this.fire(new __chunk_1.Event('geolocate', position)); this._finish(); }; GeolocateControl.prototype._updateCamera = function _updateCamera (position ) { var center = new __chunk_1.LngLat(position.coords.longitude, position.coords.latitude); var radius = position.coords.accuracy; var bearing = this._map.getBearing(); var options = __chunk_1.extend({bearing: bearing}, this.options.fitBoundsOptions); this._map.fitBounds(center.toBounds(radius), options, { geolocateSource: true // tag this camera change so it won't cause the control to change to background state }); }; GeolocateControl.prototype._updateMarker = function _updateMarker (position ) { if (position) { this._userLocationDotMarker.setLngLat([position.coords.longitude, position.coords.latitude]).addTo(this._map); } else { this._userLocationDotMarker.remove(); } }; GeolocateControl.prototype._onError = function _onError (error ) { if (this.options.trackUserLocation) { if (error.code === 1) { // PERMISSION_DENIED this._watchState = 'OFF'; this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-waiting'); this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-active'); this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-active-error'); this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-background'); this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-background-error'); if (this._geolocationWatchID !== undefined) { this._clearWatch(); } } else { switch (this._watchState) { case 'WAITING_ACTIVE': this._watchState = 'ACTIVE_ERROR'; this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-active'); this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-active-error'); break; case 'ACTIVE_LOCK': this._watchState = 'ACTIVE_ERROR'; this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-active'); this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-active-error'); this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-waiting'); // turn marker grey break; case 'BACKGROUND': this._watchState = 'BACKGROUND_ERROR'; this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-background'); this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-background-error'); this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-waiting'); // turn marker grey break; case 'ACTIVE_ERROR': break; default: __chunk_1.assert(false, ("Unexpected watchState " + (this._watchState))); } } } if (this._watchState !== 'OFF' && this.options.showUserLocation) { this._dotElement.classList.add('mapboxgl-user-location-dot-stale'); } this.fire(new __chunk_1.Event('error', error)); this._finish(); }; GeolocateControl.prototype._finish = function _finish () { if (this._timeoutId) { clearTimeout(this._timeoutId); } this._timeoutId = undefined; }; GeolocateControl.prototype._setupUI = function _setupUI (supported ) { var this$1 = this; if (supported === false) { __chunk_1.warnOnce('Geolocation support is not available, the GeolocateControl will not be visible.'); return; } this._container.addEventListener('contextmenu', function (e ) { return e.preventDefault(); }); this._geolocateButton = DOM.create('button', (className + "-icon " + className + "-geolocate"), this._container); this._geolocateButton.type = 'button'; this._geolocateButton.setAttribute('aria-label', 'Geolocate'); if (this.options.trackUserLocation) { this._geolocateButton.setAttribute('aria-pressed', 'false'); this._watchState = 'OFF'; } // when showUserLocation is enabled, keep the Geolocate button disabled until the device location marker is setup on the map if (this.options.showUserLocation) { this._dotElement = DOM.create('div', 'mapboxgl-user-location-dot'); this._userLocationDotMarker = new Marker(this._dotElement); if (this.options.trackUserLocation) { this._watchState = 'OFF'; } } this._geolocateButton.addEventListener('click', this.trigger.bind(this)); this._setup = true; // when the camera is changed (and it's not as a result of the Geolocation Control) change // the watch mode to background watch, so that the marker is updated but not the camera. if (this.options.trackUserLocation) { this._map.on('movestart', function (event) { if (!event.geolocateSource && this$1._watchState === 'ACTIVE_LOCK') { this$1._watchState = 'BACKGROUND'; this$1._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-background'); this$1._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-active'); this$1.fire(new __chunk_1.Event('trackuserlocationend')); } }); } }; /** * Trigger a geolocation * * @returns {boolean} Returns `false` if called before control was added to a map, otherwise returns `true`. */ GeolocateControl.prototype.trigger = function trigger () { if (!this._setup) { __chunk_1.warnOnce('Geolocate control triggered before added to a map'); return false; } if (this.options.trackUserLocation) { // update watchState and do any outgoing state cleanup switch (this._watchState) { case 'OFF': // turn on the Geolocate Control this._watchState = 'WAITING_ACTIVE'; this.fire(new __chunk_1.Event('trackuserlocationstart')); break; case 'WAITING_ACTIVE': case 'ACTIVE_LOCK': case 'ACTIVE_ERROR': case 'BACKGROUND_ERROR': // turn off the Geolocate Control this._watchState = 'OFF'; this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-waiting'); this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-active'); this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-active-error'); this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-background'); this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-background-error'); this.fire(new __chunk_1.Event('trackuserlocationend')); break; case 'BACKGROUND': this._watchState = 'ACTIVE_LOCK'; this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-background'); // set camera to last known location if (this._lastKnownPosition) { this._updateCamera(this._lastKnownPosition); } this.fire(new __chunk_1.Event('trackuserlocationstart')); break; default: __chunk_1.assert(false, ("Unexpected watchState " + (this._watchState))); } // incoming state setup switch (this._watchState) { case 'WAITING_ACTIVE': this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-waiting'); this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-active'); break; case 'ACTIVE_LOCK': this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-active'); break; case 'ACTIVE_ERROR': this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-waiting'); this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-active-error'); break; case 'BACKGROUND': this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-background'); break; case 'BACKGROUND_ERROR': this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-waiting'); this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-background-error'); break; case 'OFF': break; default: __chunk_1.assert(false, ("Unexpected watchState " + (this._watchState))); } // manage geolocation.watchPosition / geolocation.clearWatch if (this._watchState === 'OFF' && this._geolocationWatchID !== undefined) { // clear watchPosition as we've changed to an OFF state this._clearWatch(); } else if (this._geolocationWatchID === undefined) { // enable watchPosition since watchState is not OFF and there is no watchPosition already running this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-waiting'); this._geolocateButton.setAttribute('aria-pressed', 'true'); this._geolocationWatchID = __chunk_1.window.navigator.geolocation.watchPosition( this._onSuccess, this._onError, this.options.positionOptions); } } else { __chunk_1.window.navigator.geolocation.getCurrentPosition( this._onSuccess, this._onError, this.options.positionOptions); // This timeout ensures that we still call finish() even if // the user declines to share their location in Firefox this._timeoutId = setTimeout(this._finish, 10000 /* 10sec */); } return true; }; GeolocateControl.prototype._clearWatch = function _clearWatch () { __chunk_1.window.navigator.geolocation.clearWatch(this._geolocationWatchID); this._geolocationWatchID = (undefined ); this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-waiting'); this._geolocateButton.setAttribute('aria-pressed', 'false'); if (this.options.showUserLocation) { this._updateMarker(null); } }; return GeolocateControl; }(__chunk_1.Evented)); /* Geolocate Control Watch States * This is the private state of the control. * * OFF * off/inactive * WAITING_ACTIVE * Geolocate Control was clicked but still waiting for Geolocation API response with user location * ACTIVE_LOCK * Showing the user location as a dot AND tracking the camera to be fixed to their location. If their location changes the map moves to follow. * ACTIVE_ERROR * There was en error from the Geolocation API while trying to show and track the user location. * BACKGROUND * Showing the user location as a dot but the camera doesn't follow their location as it changes. * BACKGROUND_ERROR * There was an error from the Geolocation API while trying to show (but not track) the user location. */ /** * Fired on each Geolocation API position update which returned as success. * * @event geolocate * @memberof GeolocateControl * @instance * @property {Position} data The returned [Position](https://developer.mozilla.org/en-US/docs/Web/API/Position) object from the callback in [Geolocation.getCurrentPosition()](https://developer.mozilla.org/en-US/docs/Web/API/Geolocation/getCurrentPosition) or [Geolocation.watchPosition()](https://developer.mozilla.org/en-US/docs/Web/API/Geolocation/watchPosition). * */ /** * Fired on each Geolocation API position update which returned as an error. * * @event error * @memberof GeolocateControl * @instance * @property {PositionError} data The returned [PositionError](https://developer.mozilla.org/en-US/docs/Web/API/PositionError) object from the callback in [Geolocation.getCurrentPosition()](https://developer.mozilla.org/en-US/docs/Web/API/Geolocation/getCurrentPosition) or [Geolocation.watchPosition()](https://developer.mozilla.org/en-US/docs/Web/API/Geolocation/watchPosition). * */ /** * Fired when the Geolocate Control changes to the active lock state, which happens either upon first obtaining a successful Geolocation API position for the user (a geolocate event will follow), or the user clicks the geolocate button when in the background state which uses the last known position to recenter the map and enter active lock state (no geolocate event will follow unless the users's location changes). * * @event trackuserlocationstart * @memberof GeolocateControl * @instance * */ /** * Fired when the Geolocate Control changes to the background state, which happens when a user changes the camera during an active position lock. This only applies when trackUserLocation is true. In the background state, the dot on the map will update with location updates but the camera will not. * * @event trackuserlocationend * @memberof GeolocateControl * @instance * */ // var defaultOptions$3 = { maxWidth: 100, unit: 'metric' }; /** * A `ScaleControl` control displays the ratio of a distance on the map to the corresponding distance on the ground. * * @implements {IControl} * @param {Object} [options] * @param {number} [options.maxWidth='100'] The maximum length of the scale control in pixels. * @param {string} [options.unit='metric'] Unit of the distance (`'imperial'`, `'metric'` or `'nautical'`). * @example * var scale = new mapboxgl.ScaleControl({ * maxWidth: 80, * unit: 'imperial' * }); * map.addControl(scale); * * scale.setUnit('metric'); */ var ScaleControl = function ScaleControl(options ) { this.options = __chunk_1.extend({}, defaultOptions$3, options); __chunk_1.bindAll([ '_onMove', 'setUnit' ], this); }; ScaleControl.prototype.getDefaultPosition = function getDefaultPosition () { return 'bottom-left'; }; ScaleControl.prototype._onMove = function _onMove () { updateScale(this._map, this._container, this.options); }; ScaleControl.prototype.onAdd = function onAdd (map ) { this._map = map; this._container = DOM.create('div', 'mapboxgl-ctrl mapboxgl-ctrl-scale', map.getContainer()); this._map.on('move', this._onMove); this._onMove(); return this._container; }; ScaleControl.prototype.onRemove = function onRemove () { DOM.remove(this._container); this._map.off('move', this._onMove); this._map = (undefined ); }; /** * Set the scale's unit of the distance * * @param unit Unit of the distance (`'imperial'`, `'metric'` or `'nautical'`). */ ScaleControl.prototype.setUnit = function setUnit (unit ) { this.options.unit = unit; updateScale(this._map, this._container, this.options); }; function updateScale(map, container, options) { // A horizontal scale is imagined to be present at center of the map // container with maximum length (Default) as 100px. // Using spherical law of cosines approximation, the real distance is // found between the two coordinates. var maxWidth = options && options.maxWidth || 100; var y = map._container.clientHeight / 2; var maxMeters = getDistance(map.unproject([0, y]), map.unproject([maxWidth, y])); // The real distance corresponding to 100px scale length is rounded off to // near pretty number and the scale length for the same is found out. // Default unit of the scale is based on User's locale. if (options && options.unit === 'imperial') { var maxFeet = 3.2808 * maxMeters; if (maxFeet > 5280) { var maxMiles = maxFeet / 5280; setScale(container, maxWidth, maxMiles, 'mi'); } else { setScale(container, maxWidth, maxFeet, 'ft'); } } else if (options && options.unit === 'nautical') { var maxNauticals = maxMeters / 1852; setScale(container, maxWidth, maxNauticals, 'nm'); } else { setScale(container, maxWidth, maxMeters, 'm'); } } function setScale(container, maxWidth, maxDistance, unit) { var distance = getRoundNum(maxDistance); var ratio = distance / maxDistance; if (unit === 'm' && distance >= 1000) { distance = distance / 1000; unit = 'km'; } container.style.width = (maxWidth * ratio) + "px"; container.innerHTML = distance + unit; } function getDistance(latlng1, latlng2) { // Uses spherical law of cosines approximation. var R = 6371000; var rad = Math.PI / 180, lat1 = latlng1.lat * rad, lat2 = latlng2.lat * rad, a = Math.sin(lat1) * Math.sin(lat2) + Math.cos(lat1) * Math.cos(lat2) * Math.cos((latlng2.lng - latlng1.lng) * rad); var maxMeters = R * Math.acos(Math.min(a, 1)); return maxMeters; } function getDecimalRoundNum(d) { var multiplier = Math.pow(10, Math.ceil(-Math.log(d) / Math.LN10)); return Math.round(d * multiplier) / multiplier; } function getRoundNum(num) { var pow10 = Math.pow(10, (("" + (Math.floor(num)))).length - 1); var d = num / pow10; d = d >= 10 ? 10 : d >= 5 ? 5 : d >= 3 ? 3 : d >= 2 ? 2 : d >= 1 ? 1 : getDecimalRoundNum(d); return pow10 * d; } // /** * A `FullscreenControl` control contains a button for toggling the map in and out of fullscreen mode. * * @implements {IControl} * @param {Object} [options] * @param {HTMLElement} [options.container] `container` is the [compatible DOM element](https://developer.mozilla.org/en-US/docs/Web/API/Element/requestFullScreen#Compatible_elements) which should be made full screen. By default, the map container element will be made full screen. * * @example * map.addControl(new mapboxgl.FullscreenControl({container: document.querySelector('body')})); * @see [View a fullscreen map](https://www.mapbox.com/mapbox-gl-js/example/fullscreen/) */ var FullscreenControl = function FullscreenControl(options ) { this._fullscreen = false; if (options && options.container) { if (options.container instanceof __chunk_1.window.HTMLElement) { this._container = options.container; } else { __chunk_1.warnOnce('Full screen control \'container\' must be a DOM element.'); } } __chunk_1.bindAll([ '_onClickFullscreen', '_changeIcon' ], this); if ('onfullscreenchange' in __chunk_1.window.document) { this._fullscreenchange = 'fullscreenchange'; } else if ('onmozfullscreenchange' in __chunk_1.window.document) { this._fullscreenchange = 'mozfullscreenchange'; } else if ('onwebkitfullscreenchange' in __chunk_1.window.document) { this._fullscreenchange = 'webkitfullscreenchange'; } else if ('onmsfullscreenchange' in __chunk_1.window.document) { this._fullscreenchange = 'MSFullscreenChange'; } this._className = 'mapboxgl-ctrl'; }; FullscreenControl.prototype.onAdd = function onAdd (map ) { this._map = map; if (!this._container) { this._container = this._map.getContainer(); } this._controlContainer = DOM.create('div', ((this._className) + " mapboxgl-ctrl-group")); if (this._checkFullscreenSupport()) { this._setupUI(); } else { this._controlContainer.style.display = 'none'; __chunk_1.warnOnce('This device does not support fullscreen mode.'); } return this._controlContainer; }; FullscreenControl.prototype.onRemove = function onRemove () { DOM.remove(this._controlContainer); this._map = (null ); __chunk_1.window.document.removeEventListener(this._fullscreenchange, this._changeIcon); }; FullscreenControl.prototype._checkFullscreenSupport = function _checkFullscreenSupport () { return !!( __chunk_1.window.document.fullscreenEnabled || (__chunk_1.window.document ).mozFullScreenEnabled || (__chunk_1.window.document ).msFullscreenEnabled || (__chunk_1.window.document ).webkitFullscreenEnabled ); }; FullscreenControl.prototype._setupUI = function _setupUI () { var button = this._fullscreenButton = DOM.create('button', (((this._className) + "-icon " + (this._className) + "-fullscreen")), this._controlContainer); button.type = 'button'; this._updateTitle(); this._fullscreenButton.addEventListener('click', this._onClickFullscreen); __chunk_1.window.document.addEventListener(this._fullscreenchange, this._changeIcon); }; FullscreenControl.prototype._updateTitle = function _updateTitle () { var title = this._isFullscreen() ? "Exit fullscreen" : "Enter fullscreen"; this._fullscreenButton.setAttribute("aria-label", title); this._fullscreenButton.title = title; }; FullscreenControl.prototype._isFullscreen = function _isFullscreen () { return this._fullscreen; }; FullscreenControl.prototype._changeIcon = function _changeIcon () { var fullscreenElement = __chunk_1.window.document.fullscreenElement || (__chunk_1.window.document ).mozFullScreenElement || (__chunk_1.window.document ).webkitFullscreenElement || (__chunk_1.window.document ).msFullscreenElement; if ((fullscreenElement === this._container) !== this._fullscreen) { this._fullscreen = !this._fullscreen; this._fullscreenButton.classList.toggle(((this._className) + "-shrink")); this._fullscreenButton.classList.toggle(((this._className) + "-fullscreen")); this._updateTitle(); } }; FullscreenControl.prototype._onClickFullscreen = function _onClickFullscreen () { if (this._isFullscreen()) { if (__chunk_1.window.document.exitFullscreen) { (__chunk_1.window.document ).exitFullscreen(); } else if (__chunk_1.window.document.mozCancelFullScreen) { (__chunk_1.window.document ).mozCancelFullScreen(); } else if (__chunk_1.window.document.msExitFullscreen) { (__chunk_1.window.document ).msExitFullscreen(); } else if (__chunk_1.window.document.webkitCancelFullScreen) { (__chunk_1.window.document ).webkitCancelFullScreen(); } } else if (this._container.requestFullscreen) { this._container.requestFullscreen(); } else if ((this._container ).mozRequestFullScreen) { (this._container ).mozRequestFullScreen(); } else if ((this._container ).msRequestFullscreen) { (this._container ).msRequestFullscreen(); } else if ((this._container ).webkitRequestFullscreen) { (this._container ).webkitRequestFullscreen(); } }; // var defaultOptions$4 = { closeButton: true, closeOnClick: true, className: '', maxWidth: "240px" }; /** * A popup component. * * @param {Object} [options] * @param {boolean} [options.closeButton=true] If `true`, a close button will appear in the * top right corner of the popup. * @param {boolean} [options.closeOnClick=true] If `true`, the popup will closed when the * map is clicked. * @param {string} [options.anchor] - A string indicating the part of the Popup that should * be positioned closest to the coordinate set via {@link Popup#setLngLat}. * Options are `'center'`, `'top'`, `'bottom'`, `'left'`, `'right'`, `'top-left'`, * `'top-right'`, `'bottom-left'`, and `'bottom-right'`. If unset the anchor will be * dynamically set to ensure the popup falls within the map container with a preference * for `'bottom'`. * @param {number|PointLike|Object} [options.offset] - * A pixel offset applied to the popup's location specified as: * - a single number specifying a distance from the popup's location * - a {@link PointLike} specifying a constant offset * - an object of {@link Point}s specifing an offset for each anchor position * Negative offsets indicate left and up. * @param {string} [options.className] Space-separated CSS class names to add to popup container * @param {string} [options.maxWidth] A string that sets the CSS property of the popup's maxWidth in pixels, eg "300px" * @example * var markerHeight = 50, markerRadius = 10, linearOffset = 25; * var popupOffsets = { * 'top': [0, 0], * 'top-left': [0,0], * 'top-right': [0,0], * 'bottom': [0, -markerHeight], * 'bottom-left': [linearOffset, (markerHeight - markerRadius + linearOffset) * -1], * 'bottom-right': [-linearOffset, (markerHeight - markerRadius + linearOffset) * -1], * 'left': [markerRadius, (markerHeight - markerRadius) * -1], * 'right': [-markerRadius, (markerHeight - markerRadius) * -1] * }; * var popup = new mapboxgl.Popup({offset: popupOffsets, className: 'my-class'}) * .setLngLat(e.lngLat) * .setHTML("

Hello World!

") * .setMaxWidth("300px") * .addTo(map); * @see [Display a popup](https://www.mapbox.com/mapbox-gl-js/example/popup/) * @see [Display a popup on hover](https://www.mapbox.com/mapbox-gl-js/example/popup-on-hover/) * @see [Display a popup on click](https://www.mapbox.com/mapbox-gl-js/example/popup-on-click/) * @see [Attach a popup to a marker instance](https://www.mapbox.com/mapbox-gl-js/example/set-popup/) */ var Popup = /*@__PURE__*/(function (Evented) { function Popup(options ) { Evented.call(this); this.options = __chunk_1.extend(Object.create(defaultOptions$4), options); __chunk_1.bindAll(['_update', '_onClickClose', 'remove'], this); } if ( Evented ) Popup.__proto__ = Evented; Popup.prototype = Object.create( Evented && Evented.prototype ); Popup.prototype.constructor = Popup; /** * Adds the popup to a map. * * @param {Map} map The Mapbox GL JS map to add the popup to. * @returns {Popup} `this` */ Popup.prototype.addTo = function addTo (map ) { this._map = map; this._map.on('move', this._update); if (this.options.closeOnClick) { this._map.on('click', this._onClickClose); } this._map.on('remove', this.remove); this._update(); /** * Fired when the popup is opened manually or programatically. * * @event open * @memberof Popup * @instance * @type {Object} * @property {Popup} popup object that was opened */ this.fire(new __chunk_1.Event('open')); return this; }; /** * @returns {boolean} `true` if the popup is open, `false` if it is closed. */ Popup.prototype.isOpen = function isOpen () { return !!this._map; }; /** * Removes the popup from the map it has been added to. * * @example * var popup = new mapboxgl.Popup().addTo(map); * popup.remove(); * @returns {Popup} `this` */ Popup.prototype.remove = function remove () { if (this._content) { DOM.remove(this._content); } if (this._container) { DOM.remove(this._container); delete this._container; } if (this._map) { this._map.off('move', this._update); this._map.off('click', this._onClickClose); this._map.off('remove', this.remove); delete this._map; } /** * Fired when the popup is closed manually or programatically. * * @event close * @memberof Popup * @instance * @type {Object} * @property {Popup} popup object that was closed */ this.fire(new __chunk_1.Event('close')); return this; }; /** * Returns the geographical location of the popup's anchor. * * The longitude of the result may differ by a multiple of 360 degrees from the longitude previously * set by `setLngLat` because `Popup` wraps the anchor longitude across copies of the world to keep * the popup on screen. * * @returns {LngLat} The geographical location of the popup's anchor. */ Popup.prototype.getLngLat = function getLngLat () { return this._lngLat; }; /** * Sets the geographical location of the popup's anchor, and moves the popup to it. * * @param lnglat The geographical location to set as the popup's anchor. * @returns {Popup} `this` */ Popup.prototype.setLngLat = function setLngLat (lnglat ) { this._lngLat = __chunk_1.LngLat.convert(lnglat); this._pos = null; this._update(); return this; }; /** * Sets the popup's content to a string of text. * * This function creates a [Text](https://developer.mozilla.org/en-US/docs/Web/API/Text) node in the DOM, * so it cannot insert raw HTML. Use this method for security against XSS * if the popup content is user-provided. * * @param text Textual content for the popup. * @returns {Popup} `this` * @example * var popup = new mapboxgl.Popup() * .setLngLat(e.lngLat) * .setText('Hello, world!') * .addTo(map); */ Popup.prototype.setText = function setText (text ) { return this.setDOMContent(__chunk_1.window.document.createTextNode(text)); }; /** * Sets the popup's content to the HTML provided as a string. * * This method does not perform HTML filtering or sanitization, and must be * used only with trusted content. Consider {@link Popup#setText} if * the content is an untrusted text string. * * @param html A string representing HTML content for the popup. * @returns {Popup} `this` */ Popup.prototype.setHTML = function setHTML (html ) { var frag = __chunk_1.window.document.createDocumentFragment(); var temp = __chunk_1.window.document.createElement('body'); var child; temp.innerHTML = html; while (true) { child = temp.firstChild; if (!child) { break; } frag.appendChild(child); } return this.setDOMContent(frag); }; /** * Returns the popup's max width. * * @returns {string} The max width of the popup. */ Popup.prototype.getMaxWidth = function getMaxWidth () { return this._container.style.maxWidth; }; /** * Sets the popup's max width. This is setting the CSS property maxWidth. It expects a string in "Npx" format, where N is some number. * * @param maxWidth A string representing the pixel value for the maximum width. * @returns {Popup} `this` */ Popup.prototype.setMaxWidth = function setMaxWidth (maxWidth ) { this.options.maxWidth = maxWidth; this._update(); return this; }; /** * Sets the popup's content to the element provided as a DOM node. * * @param htmlNode A DOM node to be used as content for the popup. * @returns {Popup} `this` * @example * // create an element with the popup content * var div = window.document.createElement('div'); * div.innerHTML = 'Hello, world!'; * var popup = new mapboxgl.Popup() * .setLngLat(e.lngLat) * .setDOMContent(div) * .addTo(map); */ Popup.prototype.setDOMContent = function setDOMContent (htmlNode ) { this._createContent(); this._content.appendChild(htmlNode); this._update(); return this; }; Popup.prototype._createContent = function _createContent () { if (this._content) { DOM.remove(this._content); } this._content = DOM.create('div', 'mapboxgl-popup-content', this._container); if (this.options.closeButton) { this._closeButton = DOM.create('button', 'mapboxgl-popup-close-button', this._content); this._closeButton.type = 'button'; this._closeButton.setAttribute('aria-label', 'Close popup'); this._closeButton.innerHTML = '×'; this._closeButton.addEventListener('click', this._onClickClose); } }; Popup.prototype._update = function _update () { var this$1 = this; if (!this._map || !this._lngLat || !this._content) { return; } if (!this._container) { this._container = DOM.create('div', 'mapboxgl-popup', this._map.getContainer()); this._tip = DOM.create('div', 'mapboxgl-popup-tip', this._container); this._container.appendChild(this._content); if (this.options.className) { this.options.className.split(' ').forEach(function (name) { return this$1._container.classList.add(name); }); } } if (this.options.maxWidth && this._container.style.maxWidth !== this.options.maxWidth) { this._container.style.maxWidth = this.options.maxWidth; } if (this._map.transform.renderWorldCopies) { this._lngLat = smartWrap(this._lngLat, this._pos, this._map.transform); } var pos = this._pos = this._map.project(this._lngLat); var anchor = this.options.anchor; var offset = normalizeOffset(this.options.offset); if (!anchor) { var width = this._container.offsetWidth; var height = this._container.offsetHeight; var anchorComponents; if (pos.y + offset.bottom.y < height) { anchorComponents = ['top']; } else if (pos.y > this._map.transform.height - height) { anchorComponents = ['bottom']; } else { anchorComponents = []; } if (pos.x < width / 2) { anchorComponents.push('left'); } else if (pos.x > this._map.transform.width - width / 2) { anchorComponents.push('right'); } if (anchorComponents.length === 0) { anchor = 'bottom'; } else { anchor = (anchorComponents.join('-') ); } } var offsetedPos = pos.add(offset[anchor]).round(); DOM.setTransform(this._container, ((anchorTranslate[anchor]) + " translate(" + (offsetedPos.x) + "px," + (offsetedPos.y) + "px)")); applyAnchorClass(this._container, anchor, 'popup'); }; Popup.prototype._onClickClose = function _onClickClose () { this.remove(); }; return Popup; }(__chunk_1.Evented)); function normalizeOffset(offset ) { if (!offset) { return normalizeOffset(new __chunk_1.Point(0, 0)); } else if (typeof offset === 'number') { // input specifies a radius from which to calculate offsets at all positions var cornerOffset = Math.round(Math.sqrt(0.5 * Math.pow(offset, 2))); return { 'center': new __chunk_1.Point(0, 0), 'top': new __chunk_1.Point(0, offset), 'top-left': new __chunk_1.Point(cornerOffset, cornerOffset), 'top-right': new __chunk_1.Point(-cornerOffset, cornerOffset), 'bottom': new __chunk_1.Point(0, -offset), 'bottom-left': new __chunk_1.Point(cornerOffset, -cornerOffset), 'bottom-right': new __chunk_1.Point(-cornerOffset, -cornerOffset), 'left': new __chunk_1.Point(offset, 0), 'right': new __chunk_1.Point(-offset, 0) }; } else if (offset instanceof __chunk_1.Point || Array.isArray(offset)) { // input specifies a single offset to be applied to all positions var convertedOffset = __chunk_1.Point.convert(offset); return { 'center': convertedOffset, 'top': convertedOffset, 'top-left': convertedOffset, 'top-right': convertedOffset, 'bottom': convertedOffset, 'bottom-left': convertedOffset, 'bottom-right': convertedOffset, 'left': convertedOffset, 'right': convertedOffset }; } else { // input specifies an offset per position return { 'center': __chunk_1.Point.convert(offset['center'] || [0, 0]), 'top': __chunk_1.Point.convert(offset['top'] || [0, 0]), 'top-left': __chunk_1.Point.convert(offset['top-left'] || [0, 0]), 'top-right': __chunk_1.Point.convert(offset['top-right'] || [0, 0]), 'bottom': __chunk_1.Point.convert(offset['bottom'] || [0, 0]), 'bottom-left': __chunk_1.Point.convert(offset['bottom-left'] || [0, 0]), 'bottom-right': __chunk_1.Point.convert(offset['bottom-right'] || [0, 0]), 'left': __chunk_1.Point.convert(offset['left'] || [0, 0]), 'right': __chunk_1.Point.convert(offset['right'] || [0, 0]) }; } } // var exported = { version: __chunk_1.version, supported: mapboxGlSupported, setRTLTextPlugin: __chunk_1.setRTLTextPlugin, Map: Map, NavigationControl: NavigationControl, GeolocateControl: GeolocateControl, AttributionControl: AttributionControl, ScaleControl: ScaleControl, FullscreenControl: FullscreenControl, Popup: Popup, Marker: Marker, Style: Style, LngLat: __chunk_1.LngLat, LngLatBounds: __chunk_1.LngLatBounds, Point: __chunk_1.Point, MercatorCoordinate: __chunk_1.MercatorCoordinate, Evented: __chunk_1.Evented, config: __chunk_1.config, /** * Gets and sets the map's [access token](https://www.mapbox.com/help/define-access-token/). * * @var {string} accessToken * @example * mapboxgl.accessToken = myAccessToken; * @see [Display a map](https://www.mapbox.com/mapbox-gl-js/examples/) */ get accessToken() { return __chunk_1.config.ACCESS_TOKEN; }, set accessToken(token ) { __chunk_1.config.ACCESS_TOKEN = token; }, /** * Gets and sets the map's default API URL for requesting tiles, styles, sprites, and glyphs * * @var {string} baseApiUrl * @example * mapboxgl.baseApiUrl = 'https://api.mapbox.com'; */ get baseApiUrl() { return __chunk_1.config.API_URL; }, set baseApiUrl(url ) { __chunk_1.config.API_URL = url; }, /** * Gets and sets the number of web workers instantiated on a page with GL JS maps. * By default, it is set to half the number of CPU cores (capped at 6). * Make sure to set this property before creating any map instances for it to have effect. * * @var {string} workerCount * @example * mapboxgl.workerCount = 2; */ get workerCount() { return WorkerPool.workerCount; }, set workerCount(count ) { WorkerPool.workerCount = count; }, /** * Gets and sets the maximum number of images (raster tiles, sprites, icons) to load in parallel, * which affects performance in raster-heavy maps. 16 by default. * * @var {string} maxParallelImageRequests * @example * mapboxgl.maxParallelImageRequests = 10; */ get maxParallelImageRequests() { return __chunk_1.config.MAX_PARALLEL_IMAGE_REQUESTS; }, set maxParallelImageRequests(numRequests ) { __chunk_1.config.MAX_PARALLEL_IMAGE_REQUESTS = numRequests; }, workerUrl: '' }; // canary assert: used to confirm that asserts have been removed from production build __chunk_1.assert(true, 'canary assert'); return exported; }); // return mapboxgl; })); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFwYm94LWdsLWRldi5qcyIsInNvdXJjZXMiOlsiLi4vbm9kZV9tb2R1bGVzL3V0aWwvc3VwcG9ydC9pc0J1ZmZlckJyb3dzZXIuanMiLCIuLi9ub2RlX21vZHVsZXMvdXRpbC9ub2RlX21vZHVsZXMvaW5oZXJpdHMvaW5oZXJpdHNfYnJvd3Nlci5qcyIsIi4uL25vZGVfbW9kdWxlcy91dGlsL3V0aWwuanMiLCIuLi9ub2RlX21vZHVsZXMvYXNzZXJ0L2Fzc2VydC5qcyIsIi4uL25vZGVfbW9kdWxlcy9AbWFwYm94L3VuaXRiZXppZXIvaW5kZXguanMiLCIuLi9ub2RlX21vZHVsZXMvQG1hcGJveC9wb2ludC1nZW9tZXRyeS9pbmRleC5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL3V0aWwvZGVlcF9lcXVhbC5qcyIsIi4uL3NyYy91dGlsL3V0aWwuanMiLCIuLi9zcmMvdXRpbC9icm93c2VyLmpzIiwiLi4vc3JjL3V0aWwvY29uZmlnLmpzIiwiLi4vc3JjL3V0aWwvd2VicF9zdXBwb3J0ZWQuanMiLCIuLi9zcmMvdXRpbC9za3VfdG9rZW4uanMiLCIuLi9zcmMvdXRpbC9tYXBib3guanMiLCIuLi9zcmMvdXRpbC9hamF4LmpzIiwiLi4vc3JjL3V0aWwvZXZlbnRlZC5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL2Vycm9yL3ZhbGlkYXRpb25fZXJyb3IuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy92YWxpZGF0ZS92YWxpZGF0ZV9jb25zdGFudHMuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy91dGlsL2V4dGVuZC5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL3V0aWwvdW5idW5kbGVfanNvbmxpbnQuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy9leHByZXNzaW9uL3BhcnNpbmdfZXJyb3IuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy9leHByZXNzaW9uL3Njb3BlLmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi90eXBlcy5qcyIsIi4uL25vZGVfbW9kdWxlcy9jc3Njb2xvcnBhcnNlci9jc3Njb2xvcnBhcnNlci5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL3V0aWwvY29sb3IuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy9leHByZXNzaW9uL3R5cGVzL2NvbGxhdG9yLmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi90eXBlcy9mb3JtYXR0ZWQuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy9leHByZXNzaW9uL3ZhbHVlcy5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL2V4cHJlc3Npb24vZGVmaW5pdGlvbnMvbGl0ZXJhbC5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL2V4cHJlc3Npb24vcnVudGltZV9lcnJvci5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL2V4cHJlc3Npb24vZGVmaW5pdGlvbnMvYXNzZXJ0aW9uLmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9kZWZpbml0aW9ucy9mb3JtYXQuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy9leHByZXNzaW9uL2RlZmluaXRpb25zL2NvZXJjaW9uLmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9ldmFsdWF0aW9uX2NvbnRleHQuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy9leHByZXNzaW9uL2NvbXBvdW5kX2V4cHJlc3Npb24uanMiLCIuLi9zcmMvc3R5bGUtc3BlYy9leHByZXNzaW9uL2RlZmluaXRpb25zL2NvbGxhdG9yLmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9pc19jb25zdGFudC5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL2V4cHJlc3Npb24vZGVmaW5pdGlvbnMvdmFyLmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9wYXJzaW5nX2NvbnRleHQuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy9leHByZXNzaW9uL3N0b3BzLmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9kZWZpbml0aW9ucy9zdGVwLmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvdXRpbC9pbnRlcnBvbGF0ZS5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL3V0aWwvY29sb3Jfc3BhY2VzLmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9kZWZpbml0aW9ucy9pbnRlcnBvbGF0ZS5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL2V4cHJlc3Npb24vZGVmaW5pdGlvbnMvY29hbGVzY2UuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy9leHByZXNzaW9uL2RlZmluaXRpb25zL2xldC5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL2V4cHJlc3Npb24vZGVmaW5pdGlvbnMvYXQuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy9leHByZXNzaW9uL2RlZmluaXRpb25zL21hdGNoLmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9kZWZpbml0aW9ucy9jYXNlLmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9kZWZpbml0aW9ucy9jb21wYXJpc29uLmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9kZWZpbml0aW9ucy9udW1iZXJfZm9ybWF0LmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9kZWZpbml0aW9ucy9sZW5ndGguanMiLCIuLi9zcmMvc3R5bGUtc3BlYy9leHByZXNzaW9uL2RlZmluaXRpb25zL2luZGV4LmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvdXRpbC9yZXN1bHQuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy91dGlsL3Byb3BlcnRpZXMuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy91dGlsL2dldF90eXBlLmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvZnVuY3Rpb24vaW5kZXguanMiLCIuLi9zcmMvc3R5bGUtc3BlYy9leHByZXNzaW9uL2luZGV4LmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvdmFsaWRhdGUvdmFsaWRhdGVfb2JqZWN0LmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvdmFsaWRhdGUvdmFsaWRhdGVfYXJyYXkuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy92YWxpZGF0ZS92YWxpZGF0ZV9udW1iZXIuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy92YWxpZGF0ZS92YWxpZGF0ZV9mdW5jdGlvbi5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL3ZhbGlkYXRlL3ZhbGlkYXRlX2V4cHJlc3Npb24uanMiLCIuLi9zcmMvc3R5bGUtc3BlYy92YWxpZGF0ZS92YWxpZGF0ZV9ib29sZWFuLmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvdmFsaWRhdGUvdmFsaWRhdGVfY29sb3IuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy92YWxpZGF0ZS92YWxpZGF0ZV9lbnVtLmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvZmVhdHVyZV9maWx0ZXIvaW5kZXguanMiLCIuLi9zcmMvc3R5bGUtc3BlYy92YWxpZGF0ZS92YWxpZGF0ZV9maWx0ZXIuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy92YWxpZGF0ZS92YWxpZGF0ZV9wcm9wZXJ0eS5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL3ZhbGlkYXRlL3ZhbGlkYXRlX3BhaW50X3Byb3BlcnR5LmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvdmFsaWRhdGUvdmFsaWRhdGVfbGF5b3V0X3Byb3BlcnR5LmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvdmFsaWRhdGUvdmFsaWRhdGVfbGF5ZXIuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy92YWxpZGF0ZS92YWxpZGF0ZV9zb3VyY2UuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy92YWxpZGF0ZS92YWxpZGF0ZV9saWdodC5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL3ZhbGlkYXRlL3ZhbGlkYXRlX3N0cmluZy5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL3ZhbGlkYXRlL3ZhbGlkYXRlX2Zvcm1hdHRlZC5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL3ZhbGlkYXRlL3ZhbGlkYXRlLmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvdmFsaWRhdGUvdmFsaWRhdGVfZ2x5cGhzX3VybC5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL3ZhbGlkYXRlX3N0eWxlLm1pbi5qcyIsIi4uL3NyYy9zdHlsZS92YWxpZGF0ZV9zdHlsZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9ncmlkLWluZGV4L2dyaWQtaW5kZXguanMiLCIuLi9zcmMvdXRpbC93ZWJfd29ya2VyX3RyYW5zZmVyLmpzIiwiLi4vc3JjL3N0eWxlL3pvb21faGlzdG9yeS5qcyIsIi4uL3NyYy91dGlsL2lzX2NoYXJfaW5fdW5pY29kZV9ibG9jay5qcyIsIi4uL3NyYy91dGlsL3NjcmlwdF9kZXRlY3Rpb24uanMiLCIuLi9zcmMvc291cmNlL3J0bF90ZXh0X3BsdWdpbi5qcyIsIi4uL3NyYy9zdHlsZS9ldmFsdWF0aW9uX3BhcmFtZXRlcnMuanMiLCIuLi9zcmMvc3R5bGUvcHJvcGVydGllcy5qcyIsIi4uL3NyYy9zdHlsZS9zdHlsZV9sYXllci5qcyIsIi4uL3NyYy91dGlsL3N0cnVjdF9hcnJheS5qcyIsIi4uL3NyYy9kYXRhL2FycmF5X3R5cGVzLmpzIiwiLi4vc3JjL2RhdGEvYnVja2V0L2NpcmNsZV9hdHRyaWJ1dGVzLmpzIiwiLi4vc3JjL2RhdGEvc2VnbWVudC5qcyIsIi4uL3NyYy9zaGFkZXJzL2VuY29kZV9hdHRyaWJ1dGUuanMiLCIuLi9zcmMvZGF0YS9mZWF0dXJlX3Bvc2l0aW9uX21hcC5qcyIsIi4uL3NyYy9yZW5kZXIvdW5pZm9ybV9iaW5kaW5nLmpzIiwiLi4vc3JjL2RhdGEvcHJvZ3JhbV9jb25maWd1cmF0aW9uLmpzIiwiLi4vc3JjL2RhdGEvZXh0ZW50LmpzIiwiLi4vc3JjL2RhdGEvbG9hZF9nZW9tZXRyeS5qcyIsIi4uL3NyYy9kYXRhL2J1Y2tldC9jaXJjbGVfYnVja2V0LmpzIiwiLi4vc3JjL3V0aWwvaW50ZXJzZWN0aW9uX3Rlc3RzLmpzIiwiLi4vc3JjL3N0eWxlL3F1ZXJ5X3V0aWxzLmpzIiwiLi4vc3JjL3N0eWxlL3N0eWxlX2xheWVyL2NpcmNsZV9zdHlsZV9sYXllcl9wcm9wZXJ0aWVzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2dsLW1hdHJpeC9lc20vY29tbW9uLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2dsLW1hdHJpeC9lc20vbWF0Mi5qcyIsIi4uL25vZGVfbW9kdWxlcy9nbC1tYXRyaXgvZXNtL21hdDJkLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2dsLW1hdHJpeC9lc20vbWF0My5qcyIsIi4uL25vZGVfbW9kdWxlcy9nbC1tYXRyaXgvZXNtL21hdDQuanMiLCIuLi9ub2RlX21vZHVsZXMvZ2wtbWF0cml4L2VzbS92ZWMzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2dsLW1hdHJpeC9lc20vdmVjNC5qcyIsIi4uL25vZGVfbW9kdWxlcy9nbC1tYXRyaXgvZXNtL3F1YXQuanMiLCIuLi9ub2RlX21vZHVsZXMvZ2wtbWF0cml4L2VzbS9xdWF0Mi5qcyIsIi4uL25vZGVfbW9kdWxlcy9nbC1tYXRyaXgvZXNtL3ZlYzIuanMiLCIuLi9zcmMvc3R5bGUvc3R5bGVfbGF5ZXIvY2lyY2xlX3N0eWxlX2xheWVyLmpzIiwiLi4vc3JjL2RhdGEvYnVja2V0L2hlYXRtYXBfYnVja2V0LmpzIiwiLi4vc3JjL3V0aWwvaW1hZ2UuanMiLCIuLi9zcmMvc3R5bGUvc3R5bGVfbGF5ZXIvaGVhdG1hcF9zdHlsZV9sYXllcl9wcm9wZXJ0aWVzLmpzIiwiLi4vc3JjL3V0aWwvY29sb3JfcmFtcC5qcyIsIi4uL3NyYy9zdHlsZS9zdHlsZV9sYXllci9oZWF0bWFwX3N0eWxlX2xheWVyLmpzIiwiLi4vc3JjL3N0eWxlL3N0eWxlX2xheWVyL2hpbGxzaGFkZV9zdHlsZV9sYXllcl9wcm9wZXJ0aWVzLmpzIiwiLi4vc3JjL3N0eWxlL3N0eWxlX2xheWVyL2hpbGxzaGFkZV9zdHlsZV9sYXllci5qcyIsIi4uL3NyYy9kYXRhL2J1Y2tldC9maWxsX2F0dHJpYnV0ZXMuanMiLCIuLi9ub2RlX21vZHVsZXMvZWFyY3V0L3NyYy9lYXJjdXQuanMiLCIuLi9ub2RlX21vZHVsZXMvcXVpY2tzZWxlY3QvaW5kZXguanMiLCIuLi9zcmMvdXRpbC9jbGFzc2lmeV9yaW5ncy5qcyIsIi4uL3NyYy9kYXRhL2J1Y2tldC9wYXR0ZXJuX2J1Y2tldF9mZWF0dXJlcy5qcyIsIi4uL3NyYy9kYXRhL2J1Y2tldC9maWxsX2J1Y2tldC5qcyIsIi4uL3NyYy9zdHlsZS9zdHlsZV9sYXllci9maWxsX3N0eWxlX2xheWVyX3Byb3BlcnRpZXMuanMiLCIuLi9zcmMvc3R5bGUvc3R5bGVfbGF5ZXIvZmlsbF9zdHlsZV9sYXllci5qcyIsIi4uL3NyYy9kYXRhL2J1Y2tldC9maWxsX2V4dHJ1c2lvbl9hdHRyaWJ1dGVzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BtYXBib3gvdmVjdG9yLXRpbGUvbGliL3ZlY3RvcnRpbGVmZWF0dXJlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BtYXBib3gvdmVjdG9yLXRpbGUvbGliL3ZlY3RvcnRpbGVsYXllci5qcyIsIi4uL25vZGVfbW9kdWxlcy9AbWFwYm94L3ZlY3Rvci10aWxlL2xpYi92ZWN0b3J0aWxlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BtYXBib3gvdmVjdG9yLXRpbGUvaW5kZXguanMiLCIuLi9zcmMvZGF0YS9idWNrZXQvZmlsbF9leHRydXNpb25fYnVja2V0LmpzIiwiLi4vc3JjL3N0eWxlL3N0eWxlX2xheWVyL2ZpbGxfZXh0cnVzaW9uX3N0eWxlX2xheWVyX3Byb3BlcnRpZXMuanMiLCIuLi9zcmMvc3R5bGUvc3R5bGVfbGF5ZXIvZmlsbF9leHRydXNpb25fc3R5bGVfbGF5ZXIuanMiLCIuLi9zcmMvZGF0YS9idWNrZXQvbGluZV9hdHRyaWJ1dGVzLmpzIiwiLi4vc3JjL2RhdGEvYnVja2V0L2xpbmVfYnVja2V0LmpzIiwiLi4vc3JjL3N0eWxlL3N0eWxlX2xheWVyL2xpbmVfc3R5bGVfbGF5ZXJfcHJvcGVydGllcy5qcyIsIi4uL3NyYy9zdHlsZS9zdHlsZV9sYXllci9saW5lX3N0eWxlX2xheWVyLmpzIiwiLi4vc3JjL2RhdGEvYnVja2V0L3N5bWJvbF9hdHRyaWJ1dGVzLmpzIiwiLi4vc3JjL3N5bWJvbC90cmFuc2Zvcm1fdGV4dC5qcyIsIi4uL3NyYy9zeW1ib2wvbWVyZ2VsaW5lcy5qcyIsIi4uL3NyYy91dGlsL3ZlcnRpY2FsaXplX3B1bmN0dWF0aW9uLmpzIiwiLi4vc3JjL3N5bWJvbC9hbmNob3IuanMiLCIuLi9zcmMvc3ltYm9sL3N5bWJvbF9zaXplLmpzIiwiLi4vc3JjL2RhdGEvYnVja2V0L3N5bWJvbF9idWNrZXQuanMiLCIuLi9zcmMvdXRpbC9yZXNvbHZlX3Rva2Vucy5qcyIsIi4uL3NyYy9zdHlsZS9zdHlsZV9sYXllci9zeW1ib2xfc3R5bGVfbGF5ZXJfcHJvcGVydGllcy5qcyIsIi4uL3NyYy9zdHlsZS9zdHlsZV9sYXllci9zeW1ib2xfc3R5bGVfbGF5ZXIuanMiLCIuLi9zcmMvc3R5bGUvc3R5bGVfbGF5ZXIvYmFja2dyb3VuZF9zdHlsZV9sYXllcl9wcm9wZXJ0aWVzLmpzIiwiLi4vc3JjL3N0eWxlL3N0eWxlX2xheWVyL2JhY2tncm91bmRfc3R5bGVfbGF5ZXIuanMiLCIuLi9zcmMvc3R5bGUvc3R5bGVfbGF5ZXIvcmFzdGVyX3N0eWxlX2xheWVyX3Byb3BlcnRpZXMuanMiLCIuLi9zcmMvc3R5bGUvc3R5bGVfbGF5ZXIvcmFzdGVyX3N0eWxlX2xheWVyLmpzIiwiLi4vc3JjL3N0eWxlL3N0eWxlX2xheWVyL2N1c3RvbV9zdHlsZV9sYXllci5qcyIsIi4uL3NyYy9zdHlsZS9jcmVhdGVfc3R5bGVfbGF5ZXIuanMiLCIuLi9ub2RlX21vZHVsZXMvcG90cGFjay9pbmRleC5tanMiLCIuLi9zcmMvcmVuZGVyL2ltYWdlX2F0bGFzLmpzIiwiLi4vc3JjL3JlbmRlci90ZXh0dXJlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2llZWU3NTQvaW5kZXguanMiLCIuLi9ub2RlX21vZHVsZXMvcGJmL2luZGV4LmpzIiwiLi4vc3JjL3N0eWxlL3BhcnNlX2dseXBoX3BiZi5qcyIsIi4uL3NyYy91dGlsL2FjdG9yLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BtYXBib3gvd2hvb3RzLWpzL2luZGV4Lm1qcyIsIi4uL3NyYy9nZW8vbG5nX2xhdF9ib3VuZHMuanMiLCIuLi9zcmMvZ2VvL2xuZ19sYXQuanMiLCIuLi9zcmMvZ2VvL21lcmNhdG9yX2Nvb3JkaW5hdGUuanMiLCIuLi9zcmMvc291cmNlL3RpbGVfaWQuanMiLCIuLi9zcmMvZGF0YS9kZW1fZGF0YS5qcyIsIi4uL3NyYy9kYXRhL3Jhc3Rlcl9ib3VuZHNfYXR0cmlidXRlcy5qcyIsIi4uL3NyYy9kYXRhL2J1Y2tldC5qcyIsIi4uL3NyYy91dGlsL2RpY3Rpb25hcnlfY29kZXIuanMiLCIuLi9zcmMvdXRpbC92ZWN0b3J0aWxlX3RvX2dlb2pzb24uanMiLCIuLi9zcmMvc291cmNlL3NvdXJjZV9zdGF0ZS5qcyIsIi4uL3NyYy9kYXRhL2ZlYXR1cmVfaW5kZXguanMiLCIuLi9zcmMvc291cmNlL3RpbGUuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy91dGlsL3JlZl9wcm9wZXJ0aWVzLmpzIiwiLi4vc3JjL3N5bWJvbC9vbmVfZW0uanMiLCIuLi9zcmMvc3ltYm9sL3NoYXBpbmcuanMiLCIuLi9zcmMvc3ltYm9sL2NoZWNrX21heF9hbmdsZS5qcyIsIi4uL3NyYy9zeW1ib2wvZ2V0X2FuY2hvcnMuanMiLCIuLi9zcmMvc3ltYm9sL2NsaXBfbGluZS5qcyIsIi4uL3NyYy9zeW1ib2wvcXVhZHMuanMiLCIuLi9zcmMvc3ltYm9sL2NvbGxpc2lvbl9mZWF0dXJlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3RpbnlxdWV1ZS9pbmRleC5qcyIsIi4uL3NyYy91dGlsL2ZpbmRfcG9sZV9vZl9pbmFjY2Vzc2liaWxpdHkuanMiLCIuLi9ub2RlX21vZHVsZXMvbXVybXVyaGFzaC1qcy9tdXJtdXJoYXNoM19nYy5qcyIsIi4uL25vZGVfbW9kdWxlcy9tdXJtdXJoYXNoLWpzL211cm11cmhhc2gyX2djLmpzIiwiLi4vbm9kZV9tb2R1bGVzL211cm11cmhhc2gtanMvaW5kZXguanMiLCIuLi9zcmMvc3ltYm9sL3N5bWJvbF9sYXlvdXQuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy9ncm91cF9ieV9sYXlvdXQuanMiLCIuLi9zcmMvc3R5bGUvc3R5bGVfbGF5ZXJfaW5kZXguanMiLCIuLi9zcmMvcmVuZGVyL2dseXBoX2F0bGFzLmpzIiwiLi4vc3JjL3NvdXJjZS93b3JrZXJfdGlsZS5qcyIsIi4uL3NyYy91dGlsL3BlcmZvcm1hbmNlLmpzIiwiLi4vc3JjL3NvdXJjZS92ZWN0b3JfdGlsZV93b3JrZXJfc291cmNlLmpzIiwiLi4vc3JjL3NvdXJjZS9yYXN0ZXJfZGVtX3RpbGVfd29ya2VyX3NvdXJjZS5qcyIsIi4uL25vZGVfbW9kdWxlcy93Z3M4NC9pbmRleC5qcyIsIi4uL25vZGVfbW9kdWxlcy9AbWFwYm94L2dlb2pzb24tYXJlYS9pbmRleC5qcyIsIi4uL25vZGVfbW9kdWxlcy9AbWFwYm94L2dlb2pzb24tcmV3aW5kL2luZGV4LmpzIiwiLi4vc3JjL3NvdXJjZS9nZW9qc29uX3dyYXBwZXIuanMiLCIuLi9ub2RlX21vZHVsZXMvdnQtcGJmL2xpYi9nZW9qc29uX3dyYXBwZXIuanMiLCIuLi9ub2RlX21vZHVsZXMvdnQtcGJmL2luZGV4LmpzIiwiLi4vbm9kZV9tb2R1bGVzL2tkYnVzaC9zcmMvc29ydC5qcyIsIi4uL25vZGVfbW9kdWxlcy9rZGJ1c2gvc3JjL3JhbmdlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2tkYnVzaC9zcmMvd2l0aGluLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2tkYnVzaC9zcmMvaW5kZXguanMiLCIuLi9ub2RlX21vZHVsZXMvc3VwZXJjbHVzdGVyL2luZGV4LmpzIiwiLi4vbm9kZV9tb2R1bGVzL2dlb2pzb24tdnQvc3JjL3NpbXBsaWZ5LmpzIiwiLi4vbm9kZV9tb2R1bGVzL2dlb2pzb24tdnQvc3JjL2ZlYXR1cmUuanMiLCIuLi9ub2RlX21vZHVsZXMvZ2VvanNvbi12dC9zcmMvY29udmVydC5qcyIsIi4uL25vZGVfbW9kdWxlcy9nZW9qc29uLXZ0L3NyYy9jbGlwLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2dlb2pzb24tdnQvc3JjL3dyYXAuanMiLCIuLi9ub2RlX21vZHVsZXMvZ2VvanNvbi12dC9zcmMvdHJhbnNmb3JtLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2dlb2pzb24tdnQvc3JjL3RpbGUuanMiLCIuLi9ub2RlX21vZHVsZXMvZ2VvanNvbi12dC9zcmMvaW5kZXguanMiLCIuLi9zcmMvc291cmNlL2dlb2pzb25fd29ya2VyX3NvdXJjZS5qcyIsIi4uL3NyYy9zb3VyY2Uvd29ya2VyLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BtYXBib3gvbWFwYm94LWdsLXN1cHBvcnRlZC9pbmRleC5qcyIsIi4uL3NyYy91dGlsL2RvbS5qcyIsIi4uL3NyYy9zdHlsZS9sb2FkX3Nwcml0ZS5qcyIsIi4uL3NyYy9zdHlsZS9zdHlsZV9pbWFnZS5qcyIsIi4uL3NyYy9yZW5kZXIvaW1hZ2VfbWFuYWdlci5qcyIsIi4uL3NyYy9zdHlsZS9sb2FkX2dseXBoX3JhbmdlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BtYXBib3gvdGlueS1zZGYvaW5kZXguanMiLCIuLi9zcmMvcmVuZGVyL2dseXBoX21hbmFnZXIuanMiLCIuLi9zcmMvc3R5bGUvbGlnaHQuanMiLCIuLi9zcmMvcmVuZGVyL2xpbmVfYXRsYXMuanMiLCIuLi9zcmMvdXRpbC9kaXNwYXRjaGVyLmpzIiwiLi4vc3JjL3NvdXJjZS9sb2FkX3RpbGVqc29uLmpzIiwiLi4vc3JjL3NvdXJjZS90aWxlX2JvdW5kcy5qcyIsIi4uL3NyYy9zb3VyY2UvdmVjdG9yX3RpbGVfc291cmNlLmpzIiwiLi4vc3JjL3NvdXJjZS9yYXN0ZXJfdGlsZV9zb3VyY2UuanMiLCIuLi9zcmMvc291cmNlL3Jhc3Rlcl9kZW1fdGlsZV9zb3VyY2UuanMiLCIuLi9zcmMvc291cmNlL2dlb2pzb25fc291cmNlLmpzIiwiLi4vc3JjL3NvdXJjZS9pbWFnZV9zb3VyY2UuanMiLCIuLi9zcmMvc291cmNlL3ZpZGVvX3NvdXJjZS5qcyIsIi4uL3NyYy9zb3VyY2UvY2FudmFzX3NvdXJjZS5qcyIsIi4uL3NyYy9zb3VyY2Uvc291cmNlLmpzIiwiLi4vc3JjL3NvdXJjZS9xdWVyeV9mZWF0dXJlcy5qcyIsIi4uL3NyYy9zb3VyY2UvdGlsZV9jYWNoZS5qcyIsIi4uL3NyYy9nbC9pbmRleF9idWZmZXIuanMiLCIuLi9zcmMvZ2wvdmVydGV4X2J1ZmZlci5qcyIsIi4uL3NyYy9nbC92YWx1ZS5qcyIsIi4uL3NyYy9nbC9mcmFtZWJ1ZmZlci5qcyIsIi4uL3NyYy9nbC9kZXB0aF9tb2RlLmpzIiwiLi4vc3JjL2dsL3N0ZW5jaWxfbW9kZS5qcyIsIi4uL3NyYy9nbC9jb2xvcl9tb2RlLmpzIiwiLi4vc3JjL2dsL2N1bGxfZmFjZV9tb2RlLmpzIiwiLi4vc3JjL2dsL2NvbnRleHQuanMiLCIuLi9zcmMvc291cmNlL3NvdXJjZV9jYWNoZS5qcyIsIi4uL3NyYy91dGlsL2Jyb3dzZXIvd2ViX3dvcmtlci5qcyIsIi4uL3NyYy91dGlsL3dvcmtlcl9wb29sLmpzIiwiLi4vc3JjL3V0aWwvZ2xvYmFsX3dvcmtlcl9wb29sLmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvZGVyZWYuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy9kaWZmLmpzIiwiLi4vc3JjL3N5bWJvbC9ncmlkX2luZGV4LmpzIiwiLi4vc3JjL3N5bWJvbC9wcm9qZWN0aW9uLmpzIiwiLi4vc3JjL3N5bWJvbC9jb2xsaXNpb25faW5kZXguanMiLCIuLi9zcmMvc291cmNlL3BpeGVsc190b190aWxlX3VuaXRzLmpzIiwiLi4vc3JjL3N5bWJvbC9wbGFjZW1lbnQuanMiLCIuLi9zcmMvc3R5bGUvcGF1c2VhYmxlX3BsYWNlbWVudC5qcyIsIi4uL3NyYy9zeW1ib2wvY3Jvc3NfdGlsZV9zeW1ib2xfaW5kZXguanMiLCIuLi9zcmMvc3R5bGUvc3R5bGUuanMiLCIuLi9zcmMvZGF0YS9wb3NfYXR0cmlidXRlcy5qcyIsIi4uL3NyYy9zaGFkZXJzL3NoYWRlcnMuanMiLCIuLi9zcmMvcmVuZGVyL3ZlcnRleF9hcnJheV9vYmplY3QuanMiLCIuLi9zcmMvcmVuZGVyL3Byb2dyYW0uanMiLCIuLi9zcmMvcmVuZGVyL3Byb2dyYW0vcGF0dGVybi5qcyIsIi4uL3NyYy9yZW5kZXIvcHJvZ3JhbS9maWxsX2V4dHJ1c2lvbl9wcm9ncmFtLmpzIiwiLi4vc3JjL3JlbmRlci9wcm9ncmFtL2ZpbGxfcHJvZ3JhbS5qcyIsIi4uL3NyYy9yZW5kZXIvcHJvZ3JhbS9jaXJjbGVfcHJvZ3JhbS5qcyIsIi4uL3NyYy9yZW5kZXIvcHJvZ3JhbS9jb2xsaXNpb25fcHJvZ3JhbS5qcyIsIi4uL3NyYy9yZW5kZXIvcHJvZ3JhbS9kZWJ1Z19wcm9ncmFtLmpzIiwiLi4vc3JjL3JlbmRlci9wcm9ncmFtL2NsaXBwaW5nX21hc2tfcHJvZ3JhbS5qcyIsIi4uL3NyYy9yZW5kZXIvcHJvZ3JhbS9oZWF0bWFwX3Byb2dyYW0uanMiLCIuLi9zcmMvcmVuZGVyL3Byb2dyYW0vaGlsbHNoYWRlX3Byb2dyYW0uanMiLCIuLi9zcmMvcmVuZGVyL3Byb2dyYW0vbGluZV9wcm9ncmFtLmpzIiwiLi4vc3JjL3JlbmRlci9wcm9ncmFtL3Jhc3Rlcl9wcm9ncmFtLmpzIiwiLi4vc3JjL3JlbmRlci9wcm9ncmFtL3N5bWJvbF9wcm9ncmFtLmpzIiwiLi4vc3JjL3JlbmRlci9wcm9ncmFtL2JhY2tncm91bmRfcHJvZ3JhbS5qcyIsIi4uL3NyYy9yZW5kZXIvcHJvZ3JhbS9wcm9ncmFtX3VuaWZvcm1zLmpzIiwiLi4vc3JjL3JlbmRlci90aWxlX21hc2suanMiLCIuLi9zcmMvcmVuZGVyL2RyYXdfY29sbGlzaW9uX2RlYnVnLmpzIiwiLi4vc3JjL3JlbmRlci9kcmF3X3N5bWJvbC5qcyIsIi4uL3NyYy9yZW5kZXIvZHJhd19jaXJjbGUuanMiLCIuLi9zcmMvcmVuZGVyL2RyYXdfaGVhdG1hcC5qcyIsIi4uL3NyYy9yZW5kZXIvZHJhd19saW5lLmpzIiwiLi4vc3JjL3JlbmRlci9kcmF3X2ZpbGwuanMiLCIuLi9zcmMvcmVuZGVyL2RyYXdfZmlsbF9leHRydXNpb24uanMiLCIuLi9zcmMvcmVuZGVyL2RyYXdfaGlsbHNoYWRlLmpzIiwiLi4vc3JjL3JlbmRlci9kcmF3X3Jhc3Rlci5qcyIsIi4uL3NyYy9yZW5kZXIvZHJhd19iYWNrZ3JvdW5kLmpzIiwiLi4vc3JjL3JlbmRlci9kcmF3X2RlYnVnLmpzIiwiLi4vc3JjL3JlbmRlci9kcmF3X2N1c3RvbS5qcyIsIi4uL3NyYy9yZW5kZXIvcGFpbnRlci5qcyIsIi4uL3NyYy91dGlsL3RpbGVfY292ZXIuanMiLCIuLi9zcmMvZ2VvL3RyYW5zZm9ybS5qcyIsIi4uL3NyYy91dGlsL3Rocm90dGxlLmpzIiwiLi4vc3JjL3VpL2hhc2guanMiLCIuLi9zcmMvdWkvZXZlbnRzLmpzIiwiLi4vc3JjL3VpL2hhbmRsZXIvc2Nyb2xsX3pvb20uanMiLCIuLi9zcmMvdWkvaGFuZGxlci9ib3hfem9vbS5qcyIsIi4uL3NyYy91aS9oYW5kbGVyL2RyYWdfcm90YXRlLmpzIiwiLi4vc3JjL3VpL2hhbmRsZXIvZHJhZ19wYW4uanMiLCIuLi9zcmMvdWkvaGFuZGxlci9rZXlib2FyZC5qcyIsIi4uL3NyYy91aS9oYW5kbGVyL2RibGNsaWNrX3pvb20uanMiLCIuLi9zcmMvdWkvaGFuZGxlci90b3VjaF96b29tX3JvdGF0ZS5qcyIsIi4uL3NyYy91aS9iaW5kX2hhbmRsZXJzLmpzIiwiLi4vc3JjL3VpL2NhbWVyYS5qcyIsIi4uL3NyYy91aS9jb250cm9sL2F0dHJpYnV0aW9uX2NvbnRyb2wuanMiLCIuLi9zcmMvdWkvY29udHJvbC9sb2dvX2NvbnRyb2wuanMiLCIuLi9zcmMvdXRpbC90YXNrX3F1ZXVlLmpzIiwiLi4vc3JjL3VpL21hcC5qcyIsIi4uL3NyYy91aS9jb250cm9sL25hdmlnYXRpb25fY29udHJvbC5qcyIsIi4uL3NyYy91dGlsL3NtYXJ0X3dyYXAuanMiLCIuLi9zcmMvdWkvYW5jaG9yLmpzIiwiLi4vc3JjL3VpL21hcmtlci5qcyIsIi4uL3NyYy91aS9jb250cm9sL2dlb2xvY2F0ZV9jb250cm9sLmpzIiwiLi4vc3JjL3VpL2NvbnRyb2wvc2NhbGVfY29udHJvbC5qcyIsIi4uL3NyYy91aS9jb250cm9sL2Z1bGxzY3JlZW5fY29udHJvbC5qcyIsIi4uL3NyYy91aS9wb3B1cC5qcyIsIi4uL3NyYy9pbmRleC5qcyIsIi4uL3JvbGx1cC9tYXBib3hnbC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzQnVmZmVyKGFyZykge1xuICByZXR1cm4gYXJnICYmIHR5cGVvZiBhcmcgPT09ICdvYmplY3QnXG4gICAgJiYgdHlwZW9mIGFyZy5jb3B5ID09PSAnZnVuY3Rpb24nXG4gICAgJiYgdHlwZW9mIGFyZy5maWxsID09PSAnZnVuY3Rpb24nXG4gICAgJiYgdHlwZW9mIGFyZy5yZWFkVUludDggPT09ICdmdW5jdGlvbic7XG59IiwiaWYgKHR5cGVvZiBPYmplY3QuY3JlYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gIC8vIGltcGxlbWVudGF0aW9uIGZyb20gc3RhbmRhcmQgbm9kZS5qcyAndXRpbCcgbW9kdWxlXG4gIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaW5oZXJpdHMoY3Rvciwgc3VwZXJDdG9yKSB7XG4gICAgY3Rvci5zdXBlcl8gPSBzdXBlckN0b3JcbiAgICBjdG9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDdG9yLnByb3RvdHlwZSwge1xuICAgICAgY29uc3RydWN0b3I6IHtcbiAgICAgICAgdmFsdWU6IGN0b3IsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICB9XG4gICAgfSk7XG4gIH07XG59IGVsc2Uge1xuICAvLyBvbGQgc2Nob29sIHNoaW0gZm9yIG9sZCBicm93c2Vyc1xuICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGluaGVyaXRzKGN0b3IsIHN1cGVyQ3Rvcikge1xuICAgIGN0b3Iuc3VwZXJfID0gc3VwZXJDdG9yXG4gICAgdmFyIFRlbXBDdG9yID0gZnVuY3Rpb24gKCkge31cbiAgICBUZW1wQ3Rvci5wcm90b3R5cGUgPSBzdXBlckN0b3IucHJvdG90eXBlXG4gICAgY3Rvci5wcm90b3R5cGUgPSBuZXcgVGVtcEN0b3IoKVxuICAgIGN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gY3RvclxuICB9XG59XG4iLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxudmFyIGZvcm1hdFJlZ0V4cCA9IC8lW3NkaiVdL2c7XG5leHBvcnRzLmZvcm1hdCA9IGZ1bmN0aW9uKGYpIHtcbiAgaWYgKCFpc1N0cmluZyhmKSkge1xuICAgIHZhciBvYmplY3RzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIG9iamVjdHMucHVzaChpbnNwZWN0KGFyZ3VtZW50c1tpXSkpO1xuICAgIH1cbiAgICByZXR1cm4gb2JqZWN0cy5qb2luKCcgJyk7XG4gIH1cblxuICB2YXIgaSA9IDE7XG4gIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICB2YXIgbGVuID0gYXJncy5sZW5ndGg7XG4gIHZhciBzdHIgPSBTdHJpbmcoZikucmVwbGFjZShmb3JtYXRSZWdFeHAsIGZ1bmN0aW9uKHgpIHtcbiAgICBpZiAoeCA9PT0gJyUlJykgcmV0dXJuICclJztcbiAgICBpZiAoaSA+PSBsZW4pIHJldHVybiB4O1xuICAgIHN3aXRjaCAoeCkge1xuICAgICAgY2FzZSAnJXMnOiByZXR1cm4gU3RyaW5nKGFyZ3NbaSsrXSk7XG4gICAgICBjYXNlICclZCc6IHJldHVybiBOdW1iZXIoYXJnc1tpKytdKTtcbiAgICAgIGNhc2UgJyVqJzpcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoYXJnc1tpKytdKTtcbiAgICAgICAgfSBjYXRjaCAoXykge1xuICAgICAgICAgIHJldHVybiAnW0NpcmN1bGFyXSc7XG4gICAgICAgIH1cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB4O1xuICAgIH1cbiAgfSk7XG4gIGZvciAodmFyIHggPSBhcmdzW2ldOyBpIDwgbGVuOyB4ID0gYXJnc1srK2ldKSB7XG4gICAgaWYgKGlzTnVsbCh4KSB8fCAhaXNPYmplY3QoeCkpIHtcbiAgICAgIHN0ciArPSAnICcgKyB4O1xuICAgIH0gZWxzZSB7XG4gICAgICBzdHIgKz0gJyAnICsgaW5zcGVjdCh4KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHN0cjtcbn07XG5cblxuLy8gTWFyayB0aGF0IGEgbWV0aG9kIHNob3VsZCBub3QgYmUgdXNlZC5cbi8vIFJldHVybnMgYSBtb2RpZmllZCBmdW5jdGlvbiB3aGljaCB3YXJucyBvbmNlIGJ5IGRlZmF1bHQuXG4vLyBJZiAtLW5vLWRlcHJlY2F0aW9uIGlzIHNldCwgdGhlbiBpdCBpcyBhIG5vLW9wLlxuZXhwb3J0cy5kZXByZWNhdGUgPSBmdW5jdGlvbihmbiwgbXNnKSB7XG4gIC8vIEFsbG93IGZvciBkZXByZWNhdGluZyB0aGluZ3MgaW4gdGhlIHByb2Nlc3Mgb2Ygc3RhcnRpbmcgdXAuXG4gIGlmIChpc1VuZGVmaW5lZChnbG9iYWwucHJvY2VzcykpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gZXhwb3J0cy5kZXByZWNhdGUoZm4sIG1zZykuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xuICB9XG5cbiAgaWYgKHByb2Nlc3Mubm9EZXByZWNhdGlvbiA9PT0gdHJ1ZSkge1xuICAgIHJldHVybiBmbjtcbiAgfVxuXG4gIHZhciB3YXJuZWQgPSBmYWxzZTtcbiAgZnVuY3Rpb24gZGVwcmVjYXRlZCgpIHtcbiAgICBpZiAoIXdhcm5lZCkge1xuICAgICAgaWYgKHByb2Nlc3MudGhyb3dEZXByZWNhdGlvbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcbiAgICAgIH0gZWxzZSBpZiAocHJvY2Vzcy50cmFjZURlcHJlY2F0aW9uKSB7XG4gICAgICAgIGNvbnNvbGUudHJhY2UobXNnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IobXNnKTtcbiAgICAgIH1cbiAgICAgIHdhcm5lZCA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgcmV0dXJuIGRlcHJlY2F0ZWQ7XG59O1xuXG5cbnZhciBkZWJ1Z3MgPSB7fTtcbnZhciBkZWJ1Z0Vudmlyb247XG5leHBvcnRzLmRlYnVnbG9nID0gZnVuY3Rpb24oc2V0KSB7XG4gIGlmIChpc1VuZGVmaW5lZChkZWJ1Z0Vudmlyb24pKVxuICAgIGRlYnVnRW52aXJvbiA9IHByb2Nlc3MuZW52Lk5PREVfREVCVUcgfHwgJyc7XG4gIHNldCA9IHNldC50b1VwcGVyQ2FzZSgpO1xuICBpZiAoIWRlYnVnc1tzZXRdKSB7XG4gICAgaWYgKG5ldyBSZWdFeHAoJ1xcXFxiJyArIHNldCArICdcXFxcYicsICdpJykudGVzdChkZWJ1Z0Vudmlyb24pKSB7XG4gICAgICB2YXIgcGlkID0gcHJvY2Vzcy5waWQ7XG4gICAgICBkZWJ1Z3Nbc2V0XSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgbXNnID0gZXhwb3J0cy5mb3JtYXQuYXBwbHkoZXhwb3J0cywgYXJndW1lbnRzKTtcbiAgICAgICAgY29uc29sZS5lcnJvcignJXMgJWQ6ICVzJywgc2V0LCBwaWQsIG1zZyk7XG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWJ1Z3Nbc2V0XSA9IGZ1bmN0aW9uKCkge307XG4gICAgfVxuICB9XG4gIHJldHVybiBkZWJ1Z3Nbc2V0XTtcbn07XG5cblxuLyoqXG4gKiBFY2hvcyB0aGUgdmFsdWUgb2YgYSB2YWx1ZS4gVHJ5cyB0byBwcmludCB0aGUgdmFsdWUgb3V0XG4gKiBpbiB0aGUgYmVzdCB3YXkgcG9zc2libGUgZ2l2ZW4gdGhlIGRpZmZlcmVudCB0eXBlcy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gcHJpbnQgb3V0LlxuICogQHBhcmFtIHtPYmplY3R9IG9wdHMgT3B0aW9uYWwgb3B0aW9ucyBvYmplY3QgdGhhdCBhbHRlcnMgdGhlIG91dHB1dC5cbiAqL1xuLyogbGVnYWN5OiBvYmosIHNob3dIaWRkZW4sIGRlcHRoLCBjb2xvcnMqL1xuZnVuY3Rpb24gaW5zcGVjdChvYmosIG9wdHMpIHtcbiAgLy8gZGVmYXVsdCBvcHRpb25zXG4gIHZhciBjdHggPSB7XG4gICAgc2VlbjogW10sXG4gICAgc3R5bGl6ZTogc3R5bGl6ZU5vQ29sb3JcbiAgfTtcbiAgLy8gbGVnYWN5Li4uXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID49IDMpIGN0eC5kZXB0aCA9IGFyZ3VtZW50c1syXTtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPj0gNCkgY3R4LmNvbG9ycyA9IGFyZ3VtZW50c1szXTtcbiAgaWYgKGlzQm9vbGVhbihvcHRzKSkge1xuICAgIC8vIGxlZ2FjeS4uLlxuICAgIGN0eC5zaG93SGlkZGVuID0gb3B0cztcbiAgfSBlbHNlIGlmIChvcHRzKSB7XG4gICAgLy8gZ290IGFuIFwib3B0aW9uc1wiIG9iamVjdFxuICAgIGV4cG9ydHMuX2V4dGVuZChjdHgsIG9wdHMpO1xuICB9XG4gIC8vIHNldCBkZWZhdWx0IG9wdGlvbnNcbiAgaWYgKGlzVW5kZWZpbmVkKGN0eC5zaG93SGlkZGVuKSkgY3R4LnNob3dIaWRkZW4gPSBmYWxzZTtcbiAgaWYgKGlzVW5kZWZpbmVkKGN0eC5kZXB0aCkpIGN0eC5kZXB0aCA9IDI7XG4gIGlmIChpc1VuZGVmaW5lZChjdHguY29sb3JzKSkgY3R4LmNvbG9ycyA9IGZhbHNlO1xuICBpZiAoaXNVbmRlZmluZWQoY3R4LmN1c3RvbUluc3BlY3QpKSBjdHguY3VzdG9tSW5zcGVjdCA9IHRydWU7XG4gIGlmIChjdHguY29sb3JzKSBjdHguc3R5bGl6ZSA9IHN0eWxpemVXaXRoQ29sb3I7XG4gIHJldHVybiBmb3JtYXRWYWx1ZShjdHgsIG9iaiwgY3R4LmRlcHRoKTtcbn1cbmV4cG9ydHMuaW5zcGVjdCA9IGluc3BlY3Q7XG5cblxuLy8gaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9BTlNJX2VzY2FwZV9jb2RlI2dyYXBoaWNzXG5pbnNwZWN0LmNvbG9ycyA9IHtcbiAgJ2JvbGQnIDogWzEsIDIyXSxcbiAgJ2l0YWxpYycgOiBbMywgMjNdLFxuICAndW5kZXJsaW5lJyA6IFs0LCAyNF0sXG4gICdpbnZlcnNlJyA6IFs3LCAyN10sXG4gICd3aGl0ZScgOiBbMzcsIDM5XSxcbiAgJ2dyZXknIDogWzkwLCAzOV0sXG4gICdibGFjaycgOiBbMzAsIDM5XSxcbiAgJ2JsdWUnIDogWzM0LCAzOV0sXG4gICdjeWFuJyA6IFszNiwgMzldLFxuICAnZ3JlZW4nIDogWzMyLCAzOV0sXG4gICdtYWdlbnRhJyA6IFszNSwgMzldLFxuICAncmVkJyA6IFszMSwgMzldLFxuICAneWVsbG93JyA6IFszMywgMzldXG59O1xuXG4vLyBEb24ndCB1c2UgJ2JsdWUnIG5vdCB2aXNpYmxlIG9uIGNtZC5leGVcbmluc3BlY3Quc3R5bGVzID0ge1xuICAnc3BlY2lhbCc6ICdjeWFuJyxcbiAgJ251bWJlcic6ICd5ZWxsb3cnLFxuICAnYm9vbGVhbic6ICd5ZWxsb3cnLFxuICAndW5kZWZpbmVkJzogJ2dyZXknLFxuICAnbnVsbCc6ICdib2xkJyxcbiAgJ3N0cmluZyc6ICdncmVlbicsXG4gICdkYXRlJzogJ21hZ2VudGEnLFxuICAvLyBcIm5hbWVcIjogaW50ZW50aW9uYWxseSBub3Qgc3R5bGluZ1xuICAncmVnZXhwJzogJ3JlZCdcbn07XG5cblxuZnVuY3Rpb24gc3R5bGl6ZVdpdGhDb2xvcihzdHIsIHN0eWxlVHlwZSkge1xuICB2YXIgc3R5bGUgPSBpbnNwZWN0LnN0eWxlc1tzdHlsZVR5cGVdO1xuXG4gIGlmIChzdHlsZSkge1xuICAgIHJldHVybiAnXFx1MDAxYlsnICsgaW5zcGVjdC5jb2xvcnNbc3R5bGVdWzBdICsgJ20nICsgc3RyICtcbiAgICAgICAgICAgJ1xcdTAwMWJbJyArIGluc3BlY3QuY29sb3JzW3N0eWxlXVsxXSArICdtJztcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gc3RyO1xuICB9XG59XG5cblxuZnVuY3Rpb24gc3R5bGl6ZU5vQ29sb3Ioc3RyLCBzdHlsZVR5cGUpIHtcbiAgcmV0dXJuIHN0cjtcbn1cblxuXG5mdW5jdGlvbiBhcnJheVRvSGFzaChhcnJheSkge1xuICB2YXIgaGFzaCA9IHt9O1xuXG4gIGFycmF5LmZvckVhY2goZnVuY3Rpb24odmFsLCBpZHgpIHtcbiAgICBoYXNoW3ZhbF0gPSB0cnVlO1xuICB9KTtcblxuICByZXR1cm4gaGFzaDtcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRWYWx1ZShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMpIHtcbiAgLy8gUHJvdmlkZSBhIGhvb2sgZm9yIHVzZXItc3BlY2lmaWVkIGluc3BlY3QgZnVuY3Rpb25zLlxuICAvLyBDaGVjayB0aGF0IHZhbHVlIGlzIGFuIG9iamVjdCB3aXRoIGFuIGluc3BlY3QgZnVuY3Rpb24gb24gaXRcbiAgaWYgKGN0eC5jdXN0b21JbnNwZWN0ICYmXG4gICAgICB2YWx1ZSAmJlxuICAgICAgaXNGdW5jdGlvbih2YWx1ZS5pbnNwZWN0KSAmJlxuICAgICAgLy8gRmlsdGVyIG91dCB0aGUgdXRpbCBtb2R1bGUsIGl0J3MgaW5zcGVjdCBmdW5jdGlvbiBpcyBzcGVjaWFsXG4gICAgICB2YWx1ZS5pbnNwZWN0ICE9PSBleHBvcnRzLmluc3BlY3QgJiZcbiAgICAgIC8vIEFsc28gZmlsdGVyIG91dCBhbnkgcHJvdG90eXBlIG9iamVjdHMgdXNpbmcgdGhlIGNpcmN1bGFyIGNoZWNrLlxuICAgICAgISh2YWx1ZS5jb25zdHJ1Y3RvciAmJiB2YWx1ZS5jb25zdHJ1Y3Rvci5wcm90b3R5cGUgPT09IHZhbHVlKSkge1xuICAgIHZhciByZXQgPSB2YWx1ZS5pbnNwZWN0KHJlY3Vyc2VUaW1lcywgY3R4KTtcbiAgICBpZiAoIWlzU3RyaW5nKHJldCkpIHtcbiAgICAgIHJldCA9IGZvcm1hdFZhbHVlKGN0eCwgcmV0LCByZWN1cnNlVGltZXMpO1xuICAgIH1cbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgLy8gUHJpbWl0aXZlIHR5cGVzIGNhbm5vdCBoYXZlIHByb3BlcnRpZXNcbiAgdmFyIHByaW1pdGl2ZSA9IGZvcm1hdFByaW1pdGl2ZShjdHgsIHZhbHVlKTtcbiAgaWYgKHByaW1pdGl2ZSkge1xuICAgIHJldHVybiBwcmltaXRpdmU7XG4gIH1cblxuICAvLyBMb29rIHVwIHRoZSBrZXlzIG9mIHRoZSBvYmplY3QuXG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXModmFsdWUpO1xuICB2YXIgdmlzaWJsZUtleXMgPSBhcnJheVRvSGFzaChrZXlzKTtcblxuICBpZiAoY3R4LnNob3dIaWRkZW4pIHtcbiAgICBrZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModmFsdWUpO1xuICB9XG5cbiAgLy8gSUUgZG9lc24ndCBtYWtlIGVycm9yIGZpZWxkcyBub24tZW51bWVyYWJsZVxuICAvLyBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvaWUvZHd3NTJzYnQodj12cy45NCkuYXNweFxuICBpZiAoaXNFcnJvcih2YWx1ZSlcbiAgICAgICYmIChrZXlzLmluZGV4T2YoJ21lc3NhZ2UnKSA+PSAwIHx8IGtleXMuaW5kZXhPZignZGVzY3JpcHRpb24nKSA+PSAwKSkge1xuICAgIHJldHVybiBmb3JtYXRFcnJvcih2YWx1ZSk7XG4gIH1cblxuICAvLyBTb21lIHR5cGUgb2Ygb2JqZWN0IHdpdGhvdXQgcHJvcGVydGllcyBjYW4gYmUgc2hvcnRjdXR0ZWQuXG4gIGlmIChrZXlzLmxlbmd0aCA9PT0gMCkge1xuICAgIGlmIChpc0Z1bmN0aW9uKHZhbHVlKSkge1xuICAgICAgdmFyIG5hbWUgPSB2YWx1ZS5uYW1lID8gJzogJyArIHZhbHVlLm5hbWUgOiAnJztcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZSgnW0Z1bmN0aW9uJyArIG5hbWUgKyAnXScsICdzcGVjaWFsJyk7XG4gICAgfVxuICAgIGlmIChpc1JlZ0V4cCh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZShSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpLCAncmVnZXhwJyk7XG4gICAgfVxuICAgIGlmIChpc0RhdGUodmFsdWUpKSB7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSksICdkYXRlJyk7XG4gICAgfVxuICAgIGlmIChpc0Vycm9yKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGZvcm1hdEVycm9yKHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICB2YXIgYmFzZSA9ICcnLCBhcnJheSA9IGZhbHNlLCBicmFjZXMgPSBbJ3snLCAnfSddO1xuXG4gIC8vIE1ha2UgQXJyYXkgc2F5IHRoYXQgdGhleSBhcmUgQXJyYXlcbiAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgYXJyYXkgPSB0cnVlO1xuICAgIGJyYWNlcyA9IFsnWycsICddJ107XG4gIH1cblxuICAvLyBNYWtlIGZ1bmN0aW9ucyBzYXkgdGhhdCB0aGV5IGFyZSBmdW5jdGlvbnNcbiAgaWYgKGlzRnVuY3Rpb24odmFsdWUpKSB7XG4gICAgdmFyIG4gPSB2YWx1ZS5uYW1lID8gJzogJyArIHZhbHVlLm5hbWUgOiAnJztcbiAgICBiYXNlID0gJyBbRnVuY3Rpb24nICsgbiArICddJztcbiAgfVxuXG4gIC8vIE1ha2UgUmVnRXhwcyBzYXkgdGhhdCB0aGV5IGFyZSBSZWdFeHBzXG4gIGlmIChpc1JlZ0V4cCh2YWx1ZSkpIHtcbiAgICBiYXNlID0gJyAnICsgUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKTtcbiAgfVxuXG4gIC8vIE1ha2UgZGF0ZXMgd2l0aCBwcm9wZXJ0aWVzIGZpcnN0IHNheSB0aGUgZGF0ZVxuICBpZiAoaXNEYXRlKHZhbHVlKSkge1xuICAgIGJhc2UgPSAnICcgKyBEYXRlLnByb3RvdHlwZS50b1VUQ1N0cmluZy5jYWxsKHZhbHVlKTtcbiAgfVxuXG4gIC8vIE1ha2UgZXJyb3Igd2l0aCBtZXNzYWdlIGZpcnN0IHNheSB0aGUgZXJyb3JcbiAgaWYgKGlzRXJyb3IodmFsdWUpKSB7XG4gICAgYmFzZSA9ICcgJyArIGZvcm1hdEVycm9yKHZhbHVlKTtcbiAgfVxuXG4gIGlmIChrZXlzLmxlbmd0aCA9PT0gMCAmJiAoIWFycmF5IHx8IHZhbHVlLmxlbmd0aCA9PSAwKSkge1xuICAgIHJldHVybiBicmFjZXNbMF0gKyBiYXNlICsgYnJhY2VzWzFdO1xuICB9XG5cbiAgaWYgKHJlY3Vyc2VUaW1lcyA8IDApIHtcbiAgICBpZiAoaXNSZWdFeHAodmFsdWUpKSB7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSwgJ3JlZ2V4cCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoJ1tPYmplY3RdJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gIH1cblxuICBjdHguc2Vlbi5wdXNoKHZhbHVlKTtcblxuICB2YXIgb3V0cHV0O1xuICBpZiAoYXJyYXkpIHtcbiAgICBvdXRwdXQgPSBmb3JtYXRBcnJheShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLCBrZXlzKTtcbiAgfSBlbHNlIHtcbiAgICBvdXRwdXQgPSBrZXlzLm1hcChmdW5jdGlvbihrZXkpIHtcbiAgICAgIHJldHVybiBmb3JtYXRQcm9wZXJ0eShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLCBrZXksIGFycmF5KTtcbiAgICB9KTtcbiAgfVxuXG4gIGN0eC5zZWVuLnBvcCgpO1xuXG4gIHJldHVybiByZWR1Y2VUb1NpbmdsZVN0cmluZyhvdXRwdXQsIGJhc2UsIGJyYWNlcyk7XG59XG5cblxuZnVuY3Rpb24gZm9ybWF0UHJpbWl0aXZlKGN0eCwgdmFsdWUpIHtcbiAgaWYgKGlzVW5kZWZpbmVkKHZhbHVlKSlcbiAgICByZXR1cm4gY3R4LnN0eWxpemUoJ3VuZGVmaW5lZCcsICd1bmRlZmluZWQnKTtcbiAgaWYgKGlzU3RyaW5nKHZhbHVlKSkge1xuICAgIHZhciBzaW1wbGUgPSAnXFwnJyArIEpTT04uc3RyaW5naWZ5KHZhbHVlKS5yZXBsYWNlKC9eXCJ8XCIkL2csICcnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoLycvZywgXCJcXFxcJ1wiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcXFxcIi9nLCAnXCInKSArICdcXCcnO1xuICAgIHJldHVybiBjdHguc3R5bGl6ZShzaW1wbGUsICdzdHJpbmcnKTtcbiAgfVxuICBpZiAoaXNOdW1iZXIodmFsdWUpKVxuICAgIHJldHVybiBjdHguc3R5bGl6ZSgnJyArIHZhbHVlLCAnbnVtYmVyJyk7XG4gIGlmIChpc0Jvb2xlYW4odmFsdWUpKVxuICAgIHJldHVybiBjdHguc3R5bGl6ZSgnJyArIHZhbHVlLCAnYm9vbGVhbicpO1xuICAvLyBGb3Igc29tZSByZWFzb24gdHlwZW9mIG51bGwgaXMgXCJvYmplY3RcIiwgc28gc3BlY2lhbCBjYXNlIGhlcmUuXG4gIGlmIChpc051bGwodmFsdWUpKVxuICAgIHJldHVybiBjdHguc3R5bGl6ZSgnbnVsbCcsICdudWxsJyk7XG59XG5cblxuZnVuY3Rpb24gZm9ybWF0RXJyb3IodmFsdWUpIHtcbiAgcmV0dXJuICdbJyArIEVycm9yLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSArICddJztcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRBcnJheShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLCBrZXlzKSB7XG4gIHZhciBvdXRwdXQgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDAsIGwgPSB2YWx1ZS5sZW5ndGg7IGkgPCBsOyArK2kpIHtcbiAgICBpZiAoaGFzT3duUHJvcGVydHkodmFsdWUsIFN0cmluZyhpKSkpIHtcbiAgICAgIG91dHB1dC5wdXNoKGZvcm1hdFByb3BlcnR5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsXG4gICAgICAgICAgU3RyaW5nKGkpLCB0cnVlKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dHB1dC5wdXNoKCcnKTtcbiAgICB9XG4gIH1cbiAga2V5cy5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xuICAgIGlmICgha2V5Lm1hdGNoKC9eXFxkKyQvKSkge1xuICAgICAgb3V0cHV0LnB1c2goZm9ybWF0UHJvcGVydHkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cyxcbiAgICAgICAgICBrZXksIHRydWUpKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gb3V0cHV0O1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdFByb3BlcnR5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleSwgYXJyYXkpIHtcbiAgdmFyIG5hbWUsIHN0ciwgZGVzYztcbiAgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodmFsdWUsIGtleSkgfHwgeyB2YWx1ZTogdmFsdWVba2V5XSB9O1xuICBpZiAoZGVzYy5nZXQpIHtcbiAgICBpZiAoZGVzYy5zZXQpIHtcbiAgICAgIHN0ciA9IGN0eC5zdHlsaXplKCdbR2V0dGVyL1NldHRlcl0nLCAnc3BlY2lhbCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdHIgPSBjdHguc3R5bGl6ZSgnW0dldHRlcl0nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoZGVzYy5zZXQpIHtcbiAgICAgIHN0ciA9IGN0eC5zdHlsaXplKCdbU2V0dGVyXScsICdzcGVjaWFsJyk7XG4gICAgfVxuICB9XG4gIGlmICghaGFzT3duUHJvcGVydHkodmlzaWJsZUtleXMsIGtleSkpIHtcbiAgICBuYW1lID0gJ1snICsga2V5ICsgJ10nO1xuICB9XG4gIGlmICghc3RyKSB7XG4gICAgaWYgKGN0eC5zZWVuLmluZGV4T2YoZGVzYy52YWx1ZSkgPCAwKSB7XG4gICAgICBpZiAoaXNOdWxsKHJlY3Vyc2VUaW1lcykpIHtcbiAgICAgICAgc3RyID0gZm9ybWF0VmFsdWUoY3R4LCBkZXNjLnZhbHVlLCBudWxsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0ciA9IGZvcm1hdFZhbHVlKGN0eCwgZGVzYy52YWx1ZSwgcmVjdXJzZVRpbWVzIC0gMSk7XG4gICAgICB9XG4gICAgICBpZiAoc3RyLmluZGV4T2YoJ1xcbicpID4gLTEpIHtcbiAgICAgICAgaWYgKGFycmF5KSB7XG4gICAgICAgICAgc3RyID0gc3RyLnNwbGl0KCdcXG4nKS5tYXAoZnVuY3Rpb24obGluZSkge1xuICAgICAgICAgICAgcmV0dXJuICcgICcgKyBsaW5lO1xuICAgICAgICAgIH0pLmpvaW4oJ1xcbicpLnN1YnN0cigyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdHIgPSAnXFxuJyArIHN0ci5zcGxpdCgnXFxuJykubWFwKGZ1bmN0aW9uKGxpbmUpIHtcbiAgICAgICAgICAgIHJldHVybiAnICAgJyArIGxpbmU7XG4gICAgICAgICAgfSkuam9pbignXFxuJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc3RyID0gY3R4LnN0eWxpemUoJ1tDaXJjdWxhcl0nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgfVxuICBpZiAoaXNVbmRlZmluZWQobmFtZSkpIHtcbiAgICBpZiAoYXJyYXkgJiYga2V5Lm1hdGNoKC9eXFxkKyQvKSkge1xuICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG4gICAgbmFtZSA9IEpTT04uc3RyaW5naWZ5KCcnICsga2V5KTtcbiAgICBpZiAobmFtZS5tYXRjaCgvXlwiKFthLXpBLVpfXVthLXpBLVpfMC05XSopXCIkLykpIHtcbiAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cigxLCBuYW1lLmxlbmd0aCAtIDIpO1xuICAgICAgbmFtZSA9IGN0eC5zdHlsaXplKG5hbWUsICduYW1lJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoLycvZywgXCJcXFxcJ1wiKVxuICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxcXFwiL2csICdcIicpXG4gICAgICAgICAgICAgICAgIC5yZXBsYWNlKC8oXlwifFwiJCkvZywgXCInXCIpO1xuICAgICAgbmFtZSA9IGN0eC5zdHlsaXplKG5hbWUsICdzdHJpbmcnKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmFtZSArICc6ICcgKyBzdHI7XG59XG5cblxuZnVuY3Rpb24gcmVkdWNlVG9TaW5nbGVTdHJpbmcob3V0cHV0LCBiYXNlLCBicmFjZXMpIHtcbiAgdmFyIG51bUxpbmVzRXN0ID0gMDtcbiAgdmFyIGxlbmd0aCA9IG91dHB1dC5yZWR1Y2UoZnVuY3Rpb24ocHJldiwgY3VyKSB7XG4gICAgbnVtTGluZXNFc3QrKztcbiAgICBpZiAoY3VyLmluZGV4T2YoJ1xcbicpID49IDApIG51bUxpbmVzRXN0Kys7XG4gICAgcmV0dXJuIHByZXYgKyBjdXIucmVwbGFjZSgvXFx1MDAxYlxcW1xcZFxcZD9tL2csICcnKS5sZW5ndGggKyAxO1xuICB9LCAwKTtcblxuICBpZiAobGVuZ3RoID4gNjApIHtcbiAgICByZXR1cm4gYnJhY2VzWzBdICtcbiAgICAgICAgICAgKGJhc2UgPT09ICcnID8gJycgOiBiYXNlICsgJ1xcbiAnKSArXG4gICAgICAgICAgICcgJyArXG4gICAgICAgICAgIG91dHB1dC5qb2luKCcsXFxuICAnKSArXG4gICAgICAgICAgICcgJyArXG4gICAgICAgICAgIGJyYWNlc1sxXTtcbiAgfVxuXG4gIHJldHVybiBicmFjZXNbMF0gKyBiYXNlICsgJyAnICsgb3V0cHV0LmpvaW4oJywgJykgKyAnICcgKyBicmFjZXNbMV07XG59XG5cblxuLy8gTk9URTogVGhlc2UgdHlwZSBjaGVja2luZyBmdW5jdGlvbnMgaW50ZW50aW9uYWxseSBkb24ndCB1c2UgYGluc3RhbmNlb2ZgXG4vLyBiZWNhdXNlIGl0IGlzIGZyYWdpbGUgYW5kIGNhbiBiZSBlYXNpbHkgZmFrZWQgd2l0aCBgT2JqZWN0LmNyZWF0ZSgpYC5cbmZ1bmN0aW9uIGlzQXJyYXkoYXIpIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkoYXIpO1xufVxuZXhwb3J0cy5pc0FycmF5ID0gaXNBcnJheTtcblxuZnVuY3Rpb24gaXNCb29sZWFuKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ2Jvb2xlYW4nO1xufVxuZXhwb3J0cy5pc0Jvb2xlYW4gPSBpc0Jvb2xlYW47XG5cbmZ1bmN0aW9uIGlzTnVsbChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gbnVsbDtcbn1cbmV4cG9ydHMuaXNOdWxsID0gaXNOdWxsO1xuXG5mdW5jdGlvbiBpc051bGxPclVuZGVmaW5lZChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PSBudWxsO1xufVxuZXhwb3J0cy5pc051bGxPclVuZGVmaW5lZCA9IGlzTnVsbE9yVW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBpc051bWJlcihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdudW1iZXInO1xufVxuZXhwb3J0cy5pc051bWJlciA9IGlzTnVtYmVyO1xuXG5mdW5jdGlvbiBpc1N0cmluZyhhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnO1xufVxuZXhwb3J0cy5pc1N0cmluZyA9IGlzU3RyaW5nO1xuXG5mdW5jdGlvbiBpc1N5bWJvbChhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdzeW1ib2wnO1xufVxuZXhwb3J0cy5pc1N5bWJvbCA9IGlzU3ltYm9sO1xuXG5mdW5jdGlvbiBpc1VuZGVmaW5lZChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gdm9pZCAwO1xufVxuZXhwb3J0cy5pc1VuZGVmaW5lZCA9IGlzVW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBpc1JlZ0V4cChyZSkge1xuICByZXR1cm4gaXNPYmplY3QocmUpICYmIG9iamVjdFRvU3RyaW5nKHJlKSA9PT0gJ1tvYmplY3QgUmVnRXhwXSc7XG59XG5leHBvcnRzLmlzUmVnRXhwID0gaXNSZWdFeHA7XG5cbmZ1bmN0aW9uIGlzT2JqZWN0KGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ29iamVjdCcgJiYgYXJnICE9PSBudWxsO1xufVxuZXhwb3J0cy5pc09iamVjdCA9IGlzT2JqZWN0O1xuXG5mdW5jdGlvbiBpc0RhdGUoZCkge1xuICByZXR1cm4gaXNPYmplY3QoZCkgJiYgb2JqZWN0VG9TdHJpbmcoZCkgPT09ICdbb2JqZWN0IERhdGVdJztcbn1cbmV4cG9ydHMuaXNEYXRlID0gaXNEYXRlO1xuXG5mdW5jdGlvbiBpc0Vycm9yKGUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0KGUpICYmXG4gICAgICAob2JqZWN0VG9TdHJpbmcoZSkgPT09ICdbb2JqZWN0IEVycm9yXScgfHwgZSBpbnN0YW5jZW9mIEVycm9yKTtcbn1cbmV4cG9ydHMuaXNFcnJvciA9IGlzRXJyb3I7XG5cbmZ1bmN0aW9uIGlzRnVuY3Rpb24oYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnZnVuY3Rpb24nO1xufVxuZXhwb3J0cy5pc0Z1bmN0aW9uID0gaXNGdW5jdGlvbjtcblxuZnVuY3Rpb24gaXNQcmltaXRpdmUoYXJnKSB7XG4gIHJldHVybiBhcmcgPT09IG51bGwgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdib29sZWFuJyB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ251bWJlcicgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnc3ltYm9sJyB8fCAgLy8gRVM2IHN5bWJvbFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ3VuZGVmaW5lZCc7XG59XG5leHBvcnRzLmlzUHJpbWl0aXZlID0gaXNQcmltaXRpdmU7XG5cbmV4cG9ydHMuaXNCdWZmZXIgPSByZXF1aXJlKCcuL3N1cHBvcnQvaXNCdWZmZXInKTtcblxuZnVuY3Rpb24gb2JqZWN0VG9TdHJpbmcobykge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pO1xufVxuXG5cbmZ1bmN0aW9uIHBhZChuKSB7XG4gIHJldHVybiBuIDwgMTAgPyAnMCcgKyBuLnRvU3RyaW5nKDEwKSA6IG4udG9TdHJpbmcoMTApO1xufVxuXG5cbnZhciBtb250aHMgPSBbJ0phbicsICdGZWInLCAnTWFyJywgJ0FwcicsICdNYXknLCAnSnVuJywgJ0p1bCcsICdBdWcnLCAnU2VwJyxcbiAgICAgICAgICAgICAgJ09jdCcsICdOb3YnLCAnRGVjJ107XG5cbi8vIDI2IEZlYiAxNjoxOTozNFxuZnVuY3Rpb24gdGltZXN0YW1wKCkge1xuICB2YXIgZCA9IG5ldyBEYXRlKCk7XG4gIHZhciB0aW1lID0gW3BhZChkLmdldEhvdXJzKCkpLFxuICAgICAgICAgICAgICBwYWQoZC5nZXRNaW51dGVzKCkpLFxuICAgICAgICAgICAgICBwYWQoZC5nZXRTZWNvbmRzKCkpXS5qb2luKCc6Jyk7XG4gIHJldHVybiBbZC5nZXREYXRlKCksIG1vbnRoc1tkLmdldE1vbnRoKCldLCB0aW1lXS5qb2luKCcgJyk7XG59XG5cblxuLy8gbG9nIGlzIGp1c3QgYSB0aGluIHdyYXBwZXIgdG8gY29uc29sZS5sb2cgdGhhdCBwcmVwZW5kcyBhIHRpbWVzdGFtcFxuZXhwb3J0cy5sb2cgPSBmdW5jdGlvbigpIHtcbiAgY29uc29sZS5sb2coJyVzIC0gJXMnLCB0aW1lc3RhbXAoKSwgZXhwb3J0cy5mb3JtYXQuYXBwbHkoZXhwb3J0cywgYXJndW1lbnRzKSk7XG59O1xuXG5cbi8qKlxuICogSW5oZXJpdCB0aGUgcHJvdG90eXBlIG1ldGhvZHMgZnJvbSBvbmUgY29uc3RydWN0b3IgaW50byBhbm90aGVyLlxuICpcbiAqIFRoZSBGdW5jdGlvbi5wcm90b3R5cGUuaW5oZXJpdHMgZnJvbSBsYW5nLmpzIHJld3JpdHRlbiBhcyBhIHN0YW5kYWxvbmVcbiAqIGZ1bmN0aW9uIChub3Qgb24gRnVuY3Rpb24ucHJvdG90eXBlKS4gTk9URTogSWYgdGhpcyBmaWxlIGlzIHRvIGJlIGxvYWRlZFxuICogZHVyaW5nIGJvb3RzdHJhcHBpbmcgdGhpcyBmdW5jdGlvbiBuZWVkcyB0byBiZSByZXdyaXR0ZW4gdXNpbmcgc29tZSBuYXRpdmVcbiAqIGZ1bmN0aW9ucyBhcyBwcm90b3R5cGUgc2V0dXAgdXNpbmcgbm9ybWFsIEphdmFTY3JpcHQgZG9lcyBub3Qgd29yayBhc1xuICogZXhwZWN0ZWQgZHVyaW5nIGJvb3RzdHJhcHBpbmcgKHNlZSBtaXJyb3IuanMgaW4gcjExNDkwMykuXG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbn0gY3RvciBDb25zdHJ1Y3RvciBmdW5jdGlvbiB3aGljaCBuZWVkcyB0byBpbmhlcml0IHRoZVxuICogICAgIHByb3RvdHlwZS5cbiAqIEBwYXJhbSB7ZnVuY3Rpb259IHN1cGVyQ3RvciBDb25zdHJ1Y3RvciBmdW5jdGlvbiB0byBpbmhlcml0IHByb3RvdHlwZSBmcm9tLlxuICovXG5leHBvcnRzLmluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcblxuZXhwb3J0cy5fZXh0ZW5kID0gZnVuY3Rpb24ob3JpZ2luLCBhZGQpIHtcbiAgLy8gRG9uJ3QgZG8gYW55dGhpbmcgaWYgYWRkIGlzbid0IGFuIG9iamVjdFxuICBpZiAoIWFkZCB8fCAhaXNPYmplY3QoYWRkKSkgcmV0dXJuIG9yaWdpbjtcblxuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGFkZCk7XG4gIHZhciBpID0ga2V5cy5sZW5ndGg7XG4gIHdoaWxlIChpLS0pIHtcbiAgICBvcmlnaW5ba2V5c1tpXV0gPSBhZGRba2V5c1tpXV07XG4gIH1cbiAgcmV0dXJuIG9yaWdpbjtcbn07XG5cbmZ1bmN0aW9uIGhhc093blByb3BlcnR5KG9iaiwgcHJvcCkge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbi8vIGNvbXBhcmUgYW5kIGlzQnVmZmVyIHRha2VuIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXIvYmxvYi82ODBlOWU1ZTQ4OGYyMmFhYzI3NTk5YTU3ZGM4NDRhNjMxNTkyOGRkL2luZGV4LmpzXG4vLyBvcmlnaW5hbCBub3RpY2U6XG5cbi8qIVxuICogVGhlIGJ1ZmZlciBtb2R1bGUgZnJvbSBub2RlLmpzLCBmb3IgdGhlIGJyb3dzZXIuXG4gKlxuICogQGF1dGhvciAgIEZlcm9zcyBBYm91a2hhZGlqZWggPGZlcm9zc0BmZXJvc3Mub3JnPiA8aHR0cDovL2Zlcm9zcy5vcmc+XG4gKiBAbGljZW5zZSAgTUlUXG4gKi9cbmZ1bmN0aW9uIGNvbXBhcmUoYSwgYikge1xuICBpZiAoYSA9PT0gYikge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgdmFyIHggPSBhLmxlbmd0aDtcbiAgdmFyIHkgPSBiLmxlbmd0aDtcblxuICBmb3IgKHZhciBpID0gMCwgbGVuID0gTWF0aC5taW4oeCwgeSk7IGkgPCBsZW47ICsraSkge1xuICAgIGlmIChhW2ldICE9PSBiW2ldKSB7XG4gICAgICB4ID0gYVtpXTtcbiAgICAgIHkgPSBiW2ldO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgaWYgKHggPCB5KSB7XG4gICAgcmV0dXJuIC0xO1xuICB9XG4gIGlmICh5IDwgeCkge1xuICAgIHJldHVybiAxO1xuICB9XG4gIHJldHVybiAwO1xufVxuZnVuY3Rpb24gaXNCdWZmZXIoYikge1xuICBpZiAoZ2xvYmFsLkJ1ZmZlciAmJiB0eXBlb2YgZ2xvYmFsLkJ1ZmZlci5pc0J1ZmZlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBnbG9iYWwuQnVmZmVyLmlzQnVmZmVyKGIpO1xuICB9XG4gIHJldHVybiAhIShiICE9IG51bGwgJiYgYi5faXNCdWZmZXIpO1xufVxuXG4vLyBiYXNlZCBvbiBub2RlIGFzc2VydCwgb3JpZ2luYWwgbm90aWNlOlxuXG4vLyBodHRwOi8vd2lraS5jb21tb25qcy5vcmcvd2lraS9Vbml0X1Rlc3RpbmcvMS4wXG4vL1xuLy8gVEhJUyBJUyBOT1QgVEVTVEVEIE5PUiBMSUtFTFkgVE8gV09SSyBPVVRTSURFIFY4IVxuLy9cbi8vIE9yaWdpbmFsbHkgZnJvbSBuYXJ3aGFsLmpzIChodHRwOi8vbmFyd2hhbGpzLm9yZylcbi8vIENvcHlyaWdodCAoYykgMjAwOSBUaG9tYXMgUm9iaW5zb24gPDI4MG5vcnRoLmNvbT5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAnU29mdHdhcmUnKSwgdG9cbi8vIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlXG4vLyByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Jcbi8vIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgJ0FTIElTJywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOXG4vLyBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OXG4vLyBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxudmFyIHV0aWwgPSByZXF1aXJlKCd1dGlsLycpO1xudmFyIGhhc093biA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG52YXIgcFNsaWNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlO1xudmFyIGZ1bmN0aW9uc0hhdmVOYW1lcyA9IChmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBmdW5jdGlvbiBmb28oKSB7fS5uYW1lID09PSAnZm9vJztcbn0oKSk7XG5mdW5jdGlvbiBwVG9TdHJpbmcgKG9iaikge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iaik7XG59XG5mdW5jdGlvbiBpc1ZpZXcoYXJyYnVmKSB7XG4gIGlmIChpc0J1ZmZlcihhcnJidWYpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICh0eXBlb2YgZ2xvYmFsLkFycmF5QnVmZmVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICh0eXBlb2YgQXJyYXlCdWZmZXIuaXNWaWV3ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIEFycmF5QnVmZmVyLmlzVmlldyhhcnJidWYpO1xuICB9XG4gIGlmICghYXJyYnVmKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChhcnJidWYgaW5zdGFuY2VvZiBEYXRhVmlldykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmIChhcnJidWYuYnVmZmVyICYmIGFycmJ1Zi5idWZmZXIgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cbi8vIDEuIFRoZSBhc3NlcnQgbW9kdWxlIHByb3ZpZGVzIGZ1bmN0aW9ucyB0aGF0IHRocm93XG4vLyBBc3NlcnRpb25FcnJvcidzIHdoZW4gcGFydGljdWxhciBjb25kaXRpb25zIGFyZSBub3QgbWV0LiBUaGVcbi8vIGFzc2VydCBtb2R1bGUgbXVzdCBjb25mb3JtIHRvIHRoZSBmb2xsb3dpbmcgaW50ZXJmYWNlLlxuXG52YXIgYXNzZXJ0ID0gbW9kdWxlLmV4cG9ydHMgPSBvaztcblxuLy8gMi4gVGhlIEFzc2VydGlvbkVycm9yIGlzIGRlZmluZWQgaW4gYXNzZXJ0LlxuLy8gbmV3IGFzc2VydC5Bc3NlcnRpb25FcnJvcih7IG1lc3NhZ2U6IG1lc3NhZ2UsXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsOiBhY3R1YWwsXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQ6IGV4cGVjdGVkIH0pXG5cbnZhciByZWdleCA9IC9cXHMqZnVuY3Rpb25cXHMrKFteXFwoXFxzXSopXFxzKi87XG4vLyBiYXNlZCBvbiBodHRwczovL2dpdGh1Yi5jb20vbGpoYXJiL2Z1bmN0aW9uLnByb3RvdHlwZS5uYW1lL2Jsb2IvYWRlZWVlYzhiZmNjNjA2OGIxODdkN2Q5ZmIzZDViYjFkM2EzMDg5OS9pbXBsZW1lbnRhdGlvbi5qc1xuZnVuY3Rpb24gZ2V0TmFtZShmdW5jKSB7XG4gIGlmICghdXRpbC5pc0Z1bmN0aW9uKGZ1bmMpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChmdW5jdGlvbnNIYXZlTmFtZXMpIHtcbiAgICByZXR1cm4gZnVuYy5uYW1lO1xuICB9XG4gIHZhciBzdHIgPSBmdW5jLnRvU3RyaW5nKCk7XG4gIHZhciBtYXRjaCA9IHN0ci5tYXRjaChyZWdleCk7XG4gIHJldHVybiBtYXRjaCAmJiBtYXRjaFsxXTtcbn1cbmFzc2VydC5Bc3NlcnRpb25FcnJvciA9IGZ1bmN0aW9uIEFzc2VydGlvbkVycm9yKG9wdGlvbnMpIHtcbiAgdGhpcy5uYW1lID0gJ0Fzc2VydGlvbkVycm9yJztcbiAgdGhpcy5hY3R1YWwgPSBvcHRpb25zLmFjdHVhbDtcbiAgdGhpcy5leHBlY3RlZCA9IG9wdGlvbnMuZXhwZWN0ZWQ7XG4gIHRoaXMub3BlcmF0b3IgPSBvcHRpb25zLm9wZXJhdG9yO1xuICBpZiAob3B0aW9ucy5tZXNzYWdlKSB7XG4gICAgdGhpcy5tZXNzYWdlID0gb3B0aW9ucy5tZXNzYWdlO1xuICAgIHRoaXMuZ2VuZXJhdGVkTWVzc2FnZSA9IGZhbHNlO1xuICB9IGVsc2Uge1xuICAgIHRoaXMubWVzc2FnZSA9IGdldE1lc3NhZ2UodGhpcyk7XG4gICAgdGhpcy5nZW5lcmF0ZWRNZXNzYWdlID0gdHJ1ZTtcbiAgfVxuICB2YXIgc3RhY2tTdGFydEZ1bmN0aW9uID0gb3B0aW9ucy5zdGFja1N0YXJ0RnVuY3Rpb24gfHwgZmFpbDtcbiAgaWYgKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKSB7XG4gICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgc3RhY2tTdGFydEZ1bmN0aW9uKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBub24gdjggYnJvd3NlcnMgc28gd2UgY2FuIGhhdmUgYSBzdGFja3RyYWNlXG4gICAgdmFyIGVyciA9IG5ldyBFcnJvcigpO1xuICAgIGlmIChlcnIuc3RhY2spIHtcbiAgICAgIHZhciBvdXQgPSBlcnIuc3RhY2s7XG5cbiAgICAgIC8vIHRyeSB0byBzdHJpcCB1c2VsZXNzIGZyYW1lc1xuICAgICAgdmFyIGZuX25hbWUgPSBnZXROYW1lKHN0YWNrU3RhcnRGdW5jdGlvbik7XG4gICAgICB2YXIgaWR4ID0gb3V0LmluZGV4T2YoJ1xcbicgKyBmbl9uYW1lKTtcbiAgICAgIGlmIChpZHggPj0gMCkge1xuICAgICAgICAvLyBvbmNlIHdlIGhhdmUgbG9jYXRlZCB0aGUgZnVuY3Rpb24gZnJhbWVcbiAgICAgICAgLy8gd2UgbmVlZCB0byBzdHJpcCBvdXQgZXZlcnl0aGluZyBiZWZvcmUgaXQgKGFuZCBpdHMgbGluZSlcbiAgICAgICAgdmFyIG5leHRfbGluZSA9IG91dC5pbmRleE9mKCdcXG4nLCBpZHggKyAxKTtcbiAgICAgICAgb3V0ID0gb3V0LnN1YnN0cmluZyhuZXh0X2xpbmUgKyAxKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zdGFjayA9IG91dDtcbiAgICB9XG4gIH1cbn07XG5cbi8vIGFzc2VydC5Bc3NlcnRpb25FcnJvciBpbnN0YW5jZW9mIEVycm9yXG51dGlsLmluaGVyaXRzKGFzc2VydC5Bc3NlcnRpb25FcnJvciwgRXJyb3IpO1xuXG5mdW5jdGlvbiB0cnVuY2F0ZShzLCBuKSB7XG4gIGlmICh0eXBlb2YgcyA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gcy5sZW5ndGggPCBuID8gcyA6IHMuc2xpY2UoMCwgbik7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHM7XG4gIH1cbn1cbmZ1bmN0aW9uIGluc3BlY3Qoc29tZXRoaW5nKSB7XG4gIGlmIChmdW5jdGlvbnNIYXZlTmFtZXMgfHwgIXV0aWwuaXNGdW5jdGlvbihzb21ldGhpbmcpKSB7XG4gICAgcmV0dXJuIHV0aWwuaW5zcGVjdChzb21ldGhpbmcpO1xuICB9XG4gIHZhciByYXduYW1lID0gZ2V0TmFtZShzb21ldGhpbmcpO1xuICB2YXIgbmFtZSA9IHJhd25hbWUgPyAnOiAnICsgcmF3bmFtZSA6ICcnO1xuICByZXR1cm4gJ1tGdW5jdGlvbicgKyAgbmFtZSArICddJztcbn1cbmZ1bmN0aW9uIGdldE1lc3NhZ2Uoc2VsZikge1xuICByZXR1cm4gdHJ1bmNhdGUoaW5zcGVjdChzZWxmLmFjdHVhbCksIDEyOCkgKyAnICcgK1xuICAgICAgICAgc2VsZi5vcGVyYXRvciArICcgJyArXG4gICAgICAgICB0cnVuY2F0ZShpbnNwZWN0KHNlbGYuZXhwZWN0ZWQpLCAxMjgpO1xufVxuXG4vLyBBdCBwcmVzZW50IG9ubHkgdGhlIHRocmVlIGtleXMgbWVudGlvbmVkIGFib3ZlIGFyZSB1c2VkIGFuZFxuLy8gdW5kZXJzdG9vZCBieSB0aGUgc3BlYy4gSW1wbGVtZW50YXRpb25zIG9yIHN1YiBtb2R1bGVzIGNhbiBwYXNzXG4vLyBvdGhlciBrZXlzIHRvIHRoZSBBc3NlcnRpb25FcnJvcidzIGNvbnN0cnVjdG9yIC0gdGhleSB3aWxsIGJlXG4vLyBpZ25vcmVkLlxuXG4vLyAzLiBBbGwgb2YgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgbXVzdCB0aHJvdyBhbiBBc3NlcnRpb25FcnJvclxuLy8gd2hlbiBhIGNvcnJlc3BvbmRpbmcgY29uZGl0aW9uIGlzIG5vdCBtZXQsIHdpdGggYSBtZXNzYWdlIHRoYXRcbi8vIG1heSBiZSB1bmRlZmluZWQgaWYgbm90IHByb3ZpZGVkLiAgQWxsIGFzc2VydGlvbiBtZXRob2RzIHByb3ZpZGVcbi8vIGJvdGggdGhlIGFjdHVhbCBhbmQgZXhwZWN0ZWQgdmFsdWVzIHRvIHRoZSBhc3NlcnRpb24gZXJyb3IgZm9yXG4vLyBkaXNwbGF5IHB1cnBvc2VzLlxuXG5mdW5jdGlvbiBmYWlsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UsIG9wZXJhdG9yLCBzdGFja1N0YXJ0RnVuY3Rpb24pIHtcbiAgdGhyb3cgbmV3IGFzc2VydC5Bc3NlcnRpb25FcnJvcih7XG4gICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICBhY3R1YWw6IGFjdHVhbCxcbiAgICBleHBlY3RlZDogZXhwZWN0ZWQsXG4gICAgb3BlcmF0b3I6IG9wZXJhdG9yLFxuICAgIHN0YWNrU3RhcnRGdW5jdGlvbjogc3RhY2tTdGFydEZ1bmN0aW9uXG4gIH0pO1xufVxuXG4vLyBFWFRFTlNJT04hIGFsbG93cyBmb3Igd2VsbCBiZWhhdmVkIGVycm9ycyBkZWZpbmVkIGVsc2V3aGVyZS5cbmFzc2VydC5mYWlsID0gZmFpbDtcblxuLy8gNC4gUHVyZSBhc3NlcnRpb24gdGVzdHMgd2hldGhlciBhIHZhbHVlIGlzIHRydXRoeSwgYXMgZGV0ZXJtaW5lZFxuLy8gYnkgISFndWFyZC5cbi8vIGFzc2VydC5vayhndWFyZCwgbWVzc2FnZV9vcHQpO1xuLy8gVGhpcyBzdGF0ZW1lbnQgaXMgZXF1aXZhbGVudCB0byBhc3NlcnQuZXF1YWwodHJ1ZSwgISFndWFyZCxcbi8vIG1lc3NhZ2Vfb3B0KTsuIFRvIHRlc3Qgc3RyaWN0bHkgZm9yIHRoZSB2YWx1ZSB0cnVlLCB1c2Vcbi8vIGFzc2VydC5zdHJpY3RFcXVhbCh0cnVlLCBndWFyZCwgbWVzc2FnZV9vcHQpOy5cblxuZnVuY3Rpb24gb2sodmFsdWUsIG1lc3NhZ2UpIHtcbiAgaWYgKCF2YWx1ZSkgZmFpbCh2YWx1ZSwgdHJ1ZSwgbWVzc2FnZSwgJz09JywgYXNzZXJ0Lm9rKTtcbn1cbmFzc2VydC5vayA9IG9rO1xuXG4vLyA1LiBUaGUgZXF1YWxpdHkgYXNzZXJ0aW9uIHRlc3RzIHNoYWxsb3csIGNvZXJjaXZlIGVxdWFsaXR5IHdpdGhcbi8vID09LlxuLy8gYXNzZXJ0LmVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2Vfb3B0KTtcblxuYXNzZXJ0LmVxdWFsID0gZnVuY3Rpb24gZXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSkge1xuICBpZiAoYWN0dWFsICE9IGV4cGVjdGVkKSBmYWlsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UsICc9PScsIGFzc2VydC5lcXVhbCk7XG59O1xuXG4vLyA2LiBUaGUgbm9uLWVxdWFsaXR5IGFzc2VydGlvbiB0ZXN0cyBmb3Igd2hldGhlciB0d28gb2JqZWN0cyBhcmUgbm90IGVxdWFsXG4vLyB3aXRoICE9IGFzc2VydC5ub3RFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlX29wdCk7XG5cbmFzc2VydC5ub3RFcXVhbCA9IGZ1bmN0aW9uIG5vdEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UpIHtcbiAgaWYgKGFjdHVhbCA9PSBleHBlY3RlZCkge1xuICAgIGZhaWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSwgJyE9JywgYXNzZXJ0Lm5vdEVxdWFsKTtcbiAgfVxufTtcblxuLy8gNy4gVGhlIGVxdWl2YWxlbmNlIGFzc2VydGlvbiB0ZXN0cyBhIGRlZXAgZXF1YWxpdHkgcmVsYXRpb24uXG4vLyBhc3NlcnQuZGVlcEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2Vfb3B0KTtcblxuYXNzZXJ0LmRlZXBFcXVhbCA9IGZ1bmN0aW9uIGRlZXBFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlKSB7XG4gIGlmICghX2RlZXBFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBmYWxzZSkpIHtcbiAgICBmYWlsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UsICdkZWVwRXF1YWwnLCBhc3NlcnQuZGVlcEVxdWFsKTtcbiAgfVxufTtcblxuYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbCA9IGZ1bmN0aW9uIGRlZXBTdHJpY3RFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlKSB7XG4gIGlmICghX2RlZXBFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCB0cnVlKSkge1xuICAgIGZhaWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSwgJ2RlZXBTdHJpY3RFcXVhbCcsIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwpO1xuICB9XG59O1xuXG5mdW5jdGlvbiBfZGVlcEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIHN0cmljdCwgbWVtb3MpIHtcbiAgLy8gNy4xLiBBbGwgaWRlbnRpY2FsIHZhbHVlcyBhcmUgZXF1aXZhbGVudCwgYXMgZGV0ZXJtaW5lZCBieSA9PT0uXG4gIGlmIChhY3R1YWwgPT09IGV4cGVjdGVkKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gZWxzZSBpZiAoaXNCdWZmZXIoYWN0dWFsKSAmJiBpc0J1ZmZlcihleHBlY3RlZCkpIHtcbiAgICByZXR1cm4gY29tcGFyZShhY3R1YWwsIGV4cGVjdGVkKSA9PT0gMDtcblxuICAvLyA3LjIuIElmIHRoZSBleHBlY3RlZCB2YWx1ZSBpcyBhIERhdGUgb2JqZWN0LCB0aGUgYWN0dWFsIHZhbHVlIGlzXG4gIC8vIGVxdWl2YWxlbnQgaWYgaXQgaXMgYWxzbyBhIERhdGUgb2JqZWN0IHRoYXQgcmVmZXJzIHRvIHRoZSBzYW1lIHRpbWUuXG4gIH0gZWxzZSBpZiAodXRpbC5pc0RhdGUoYWN0dWFsKSAmJiB1dGlsLmlzRGF0ZShleHBlY3RlZCkpIHtcbiAgICByZXR1cm4gYWN0dWFsLmdldFRpbWUoKSA9PT0gZXhwZWN0ZWQuZ2V0VGltZSgpO1xuXG4gIC8vIDcuMyBJZiB0aGUgZXhwZWN0ZWQgdmFsdWUgaXMgYSBSZWdFeHAgb2JqZWN0LCB0aGUgYWN0dWFsIHZhbHVlIGlzXG4gIC8vIGVxdWl2YWxlbnQgaWYgaXQgaXMgYWxzbyBhIFJlZ0V4cCBvYmplY3Qgd2l0aCB0aGUgc2FtZSBzb3VyY2UgYW5kXG4gIC8vIHByb3BlcnRpZXMgKGBnbG9iYWxgLCBgbXVsdGlsaW5lYCwgYGxhc3RJbmRleGAsIGBpZ25vcmVDYXNlYCkuXG4gIH0gZWxzZSBpZiAodXRpbC5pc1JlZ0V4cChhY3R1YWwpICYmIHV0aWwuaXNSZWdFeHAoZXhwZWN0ZWQpKSB7XG4gICAgcmV0dXJuIGFjdHVhbC5zb3VyY2UgPT09IGV4cGVjdGVkLnNvdXJjZSAmJlxuICAgICAgICAgICBhY3R1YWwuZ2xvYmFsID09PSBleHBlY3RlZC5nbG9iYWwgJiZcbiAgICAgICAgICAgYWN0dWFsLm11bHRpbGluZSA9PT0gZXhwZWN0ZWQubXVsdGlsaW5lICYmXG4gICAgICAgICAgIGFjdHVhbC5sYXN0SW5kZXggPT09IGV4cGVjdGVkLmxhc3RJbmRleCAmJlxuICAgICAgICAgICBhY3R1YWwuaWdub3JlQ2FzZSA9PT0gZXhwZWN0ZWQuaWdub3JlQ2FzZTtcblxuICAvLyA3LjQuIE90aGVyIHBhaXJzIHRoYXQgZG8gbm90IGJvdGggcGFzcyB0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCcsXG4gIC8vIGVxdWl2YWxlbmNlIGlzIGRldGVybWluZWQgYnkgPT0uXG4gIH0gZWxzZSBpZiAoKGFjdHVhbCA9PT0gbnVsbCB8fCB0eXBlb2YgYWN0dWFsICE9PSAnb2JqZWN0JykgJiZcbiAgICAgICAgICAgICAoZXhwZWN0ZWQgPT09IG51bGwgfHwgdHlwZW9mIGV4cGVjdGVkICE9PSAnb2JqZWN0JykpIHtcbiAgICByZXR1cm4gc3RyaWN0ID8gYWN0dWFsID09PSBleHBlY3RlZCA6IGFjdHVhbCA9PSBleHBlY3RlZDtcblxuICAvLyBJZiBib3RoIHZhbHVlcyBhcmUgaW5zdGFuY2VzIG9mIHR5cGVkIGFycmF5cywgd3JhcCB0aGVpciB1bmRlcmx5aW5nXG4gIC8vIEFycmF5QnVmZmVycyBpbiBhIEJ1ZmZlciBlYWNoIHRvIGluY3JlYXNlIHBlcmZvcm1hbmNlXG4gIC8vIFRoaXMgb3B0aW1pemF0aW9uIHJlcXVpcmVzIHRoZSBhcnJheXMgdG8gaGF2ZSB0aGUgc2FtZSB0eXBlIGFzIGNoZWNrZWQgYnlcbiAgLy8gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyAoYWthIHBUb1N0cmluZykuIE5ldmVyIHBlcmZvcm0gYmluYXJ5XG4gIC8vIGNvbXBhcmlzb25zIGZvciBGbG9hdCpBcnJheXMsIHRob3VnaCwgc2luY2UgZS5nLiArMCA9PT0gLTAgYnV0IHRoZWlyXG4gIC8vIGJpdCBwYXR0ZXJucyBhcmUgbm90IGlkZW50aWNhbC5cbiAgfSBlbHNlIGlmIChpc1ZpZXcoYWN0dWFsKSAmJiBpc1ZpZXcoZXhwZWN0ZWQpICYmXG4gICAgICAgICAgICAgcFRvU3RyaW5nKGFjdHVhbCkgPT09IHBUb1N0cmluZyhleHBlY3RlZCkgJiZcbiAgICAgICAgICAgICAhKGFjdHVhbCBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheSB8fFxuICAgICAgICAgICAgICAgYWN0dWFsIGluc3RhbmNlb2YgRmxvYXQ2NEFycmF5KSkge1xuICAgIHJldHVybiBjb21wYXJlKG5ldyBVaW50OEFycmF5KGFjdHVhbC5idWZmZXIpLFxuICAgICAgICAgICAgICAgICAgIG5ldyBVaW50OEFycmF5KGV4cGVjdGVkLmJ1ZmZlcikpID09PSAwO1xuXG4gIC8vIDcuNSBGb3IgYWxsIG90aGVyIE9iamVjdCBwYWlycywgaW5jbHVkaW5nIEFycmF5IG9iamVjdHMsIGVxdWl2YWxlbmNlIGlzXG4gIC8vIGRldGVybWluZWQgYnkgaGF2aW5nIHRoZSBzYW1lIG51bWJlciBvZiBvd25lZCBwcm9wZXJ0aWVzIChhcyB2ZXJpZmllZFxuICAvLyB3aXRoIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCksIHRoZSBzYW1lIHNldCBvZiBrZXlzXG4gIC8vIChhbHRob3VnaCBub3QgbmVjZXNzYXJpbHkgdGhlIHNhbWUgb3JkZXIpLCBlcXVpdmFsZW50IHZhbHVlcyBmb3IgZXZlcnlcbiAgLy8gY29ycmVzcG9uZGluZyBrZXksIGFuZCBhbiBpZGVudGljYWwgJ3Byb3RvdHlwZScgcHJvcGVydHkuIE5vdGU6IHRoaXNcbiAgLy8gYWNjb3VudHMgZm9yIGJvdGggbmFtZWQgYW5kIGluZGV4ZWQgcHJvcGVydGllcyBvbiBBcnJheXMuXG4gIH0gZWxzZSBpZiAoaXNCdWZmZXIoYWN0dWFsKSAhPT0gaXNCdWZmZXIoZXhwZWN0ZWQpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IGVsc2Uge1xuICAgIG1lbW9zID0gbWVtb3MgfHwge2FjdHVhbDogW10sIGV4cGVjdGVkOiBbXX07XG5cbiAgICB2YXIgYWN0dWFsSW5kZXggPSBtZW1vcy5hY3R1YWwuaW5kZXhPZihhY3R1YWwpO1xuICAgIGlmIChhY3R1YWxJbmRleCAhPT0gLTEpIHtcbiAgICAgIGlmIChhY3R1YWxJbmRleCA9PT0gbWVtb3MuZXhwZWN0ZWQuaW5kZXhPZihleHBlY3RlZCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbWVtb3MuYWN0dWFsLnB1c2goYWN0dWFsKTtcbiAgICBtZW1vcy5leHBlY3RlZC5wdXNoKGV4cGVjdGVkKTtcblxuICAgIHJldHVybiBvYmpFcXVpdihhY3R1YWwsIGV4cGVjdGVkLCBzdHJpY3QsIG1lbW9zKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc0FyZ3VtZW50cyhvYmplY3QpIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmplY3QpID09ICdbb2JqZWN0IEFyZ3VtZW50c10nO1xufVxuXG5mdW5jdGlvbiBvYmpFcXVpdihhLCBiLCBzdHJpY3QsIGFjdHVhbFZpc2l0ZWRPYmplY3RzKSB7XG4gIGlmIChhID09PSBudWxsIHx8IGEgPT09IHVuZGVmaW5lZCB8fCBiID09PSBudWxsIHx8IGIgPT09IHVuZGVmaW5lZClcbiAgICByZXR1cm4gZmFsc2U7XG4gIC8vIGlmIG9uZSBpcyBhIHByaW1pdGl2ZSwgdGhlIG90aGVyIG11c3QgYmUgc2FtZVxuICBpZiAodXRpbC5pc1ByaW1pdGl2ZShhKSB8fCB1dGlsLmlzUHJpbWl0aXZlKGIpKVxuICAgIHJldHVybiBhID09PSBiO1xuICBpZiAoc3RyaWN0ICYmIE9iamVjdC5nZXRQcm90b3R5cGVPZihhKSAhPT0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGIpKVxuICAgIHJldHVybiBmYWxzZTtcbiAgdmFyIGFJc0FyZ3MgPSBpc0FyZ3VtZW50cyhhKTtcbiAgdmFyIGJJc0FyZ3MgPSBpc0FyZ3VtZW50cyhiKTtcbiAgaWYgKChhSXNBcmdzICYmICFiSXNBcmdzKSB8fCAoIWFJc0FyZ3MgJiYgYklzQXJncykpXG4gICAgcmV0dXJuIGZhbHNlO1xuICBpZiAoYUlzQXJncykge1xuICAgIGEgPSBwU2xpY2UuY2FsbChhKTtcbiAgICBiID0gcFNsaWNlLmNhbGwoYik7XG4gICAgcmV0dXJuIF9kZWVwRXF1YWwoYSwgYiwgc3RyaWN0KTtcbiAgfVxuICB2YXIga2EgPSBvYmplY3RLZXlzKGEpO1xuICB2YXIga2IgPSBvYmplY3RLZXlzKGIpO1xuICB2YXIga2V5LCBpO1xuICAvLyBoYXZpbmcgdGhlIHNhbWUgbnVtYmVyIG9mIG93bmVkIHByb3BlcnRpZXMgKGtleXMgaW5jb3Jwb3JhdGVzXG4gIC8vIGhhc093blByb3BlcnR5KVxuICBpZiAoa2EubGVuZ3RoICE9PSBrYi5sZW5ndGgpXG4gICAgcmV0dXJuIGZhbHNlO1xuICAvL3RoZSBzYW1lIHNldCBvZiBrZXlzIChhbHRob3VnaCBub3QgbmVjZXNzYXJpbHkgdGhlIHNhbWUgb3JkZXIpLFxuICBrYS5zb3J0KCk7XG4gIGtiLnNvcnQoKTtcbiAgLy9+fn5jaGVhcCBrZXkgdGVzdFxuICBmb3IgKGkgPSBrYS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIGlmIChrYVtpXSAhPT0ga2JbaV0pXG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLy9lcXVpdmFsZW50IHZhbHVlcyBmb3IgZXZlcnkgY29ycmVzcG9uZGluZyBrZXksIGFuZFxuICAvL35+fnBvc3NpYmx5IGV4cGVuc2l2ZSBkZWVwIHRlc3RcbiAgZm9yIChpID0ga2EubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBrZXkgPSBrYVtpXTtcbiAgICBpZiAoIV9kZWVwRXF1YWwoYVtrZXldLCBiW2tleV0sIHN0cmljdCwgYWN0dWFsVmlzaXRlZE9iamVjdHMpKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vLyA4LiBUaGUgbm9uLWVxdWl2YWxlbmNlIGFzc2VydGlvbiB0ZXN0cyBmb3IgYW55IGRlZXAgaW5lcXVhbGl0eS5cbi8vIGFzc2VydC5ub3REZWVwRXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZV9vcHQpO1xuXG5hc3NlcnQubm90RGVlcEVxdWFsID0gZnVuY3Rpb24gbm90RGVlcEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UpIHtcbiAgaWYgKF9kZWVwRXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgZmFsc2UpKSB7XG4gICAgZmFpbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlLCAnbm90RGVlcEVxdWFsJywgYXNzZXJ0Lm5vdERlZXBFcXVhbCk7XG4gIH1cbn07XG5cbmFzc2VydC5ub3REZWVwU3RyaWN0RXF1YWwgPSBub3REZWVwU3RyaWN0RXF1YWw7XG5mdW5jdGlvbiBub3REZWVwU3RyaWN0RXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSkge1xuICBpZiAoX2RlZXBFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCB0cnVlKSkge1xuICAgIGZhaWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSwgJ25vdERlZXBTdHJpY3RFcXVhbCcsIG5vdERlZXBTdHJpY3RFcXVhbCk7XG4gIH1cbn1cblxuXG4vLyA5LiBUaGUgc3RyaWN0IGVxdWFsaXR5IGFzc2VydGlvbiB0ZXN0cyBzdHJpY3QgZXF1YWxpdHksIGFzIGRldGVybWluZWQgYnkgPT09LlxuLy8gYXNzZXJ0LnN0cmljdEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2Vfb3B0KTtcblxuYXNzZXJ0LnN0cmljdEVxdWFsID0gZnVuY3Rpb24gc3RyaWN0RXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSkge1xuICBpZiAoYWN0dWFsICE9PSBleHBlY3RlZCkge1xuICAgIGZhaWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSwgJz09PScsIGFzc2VydC5zdHJpY3RFcXVhbCk7XG4gIH1cbn07XG5cbi8vIDEwLiBUaGUgc3RyaWN0IG5vbi1lcXVhbGl0eSBhc3NlcnRpb24gdGVzdHMgZm9yIHN0cmljdCBpbmVxdWFsaXR5LCBhc1xuLy8gZGV0ZXJtaW5lZCBieSAhPT0uICBhc3NlcnQubm90U3RyaWN0RXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZV9vcHQpO1xuXG5hc3NlcnQubm90U3RyaWN0RXF1YWwgPSBmdW5jdGlvbiBub3RTdHJpY3RFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlKSB7XG4gIGlmIChhY3R1YWwgPT09IGV4cGVjdGVkKSB7XG4gICAgZmFpbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlLCAnIT09JywgYXNzZXJ0Lm5vdFN0cmljdEVxdWFsKTtcbiAgfVxufTtcblxuZnVuY3Rpb24gZXhwZWN0ZWRFeGNlcHRpb24oYWN0dWFsLCBleHBlY3RlZCkge1xuICBpZiAoIWFjdHVhbCB8fCAhZXhwZWN0ZWQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGV4cGVjdGVkKSA9PSAnW29iamVjdCBSZWdFeHBdJykge1xuICAgIHJldHVybiBleHBlY3RlZC50ZXN0KGFjdHVhbCk7XG4gIH1cblxuICB0cnkge1xuICAgIGlmIChhY3R1YWwgaW5zdGFuY2VvZiBleHBlY3RlZCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gSWdub3JlLiAgVGhlIGluc3RhbmNlb2YgY2hlY2sgZG9lc24ndCB3b3JrIGZvciBhcnJvdyBmdW5jdGlvbnMuXG4gIH1cblxuICBpZiAoRXJyb3IuaXNQcm90b3R5cGVPZihleHBlY3RlZCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gZXhwZWN0ZWQuY2FsbCh7fSwgYWN0dWFsKSA9PT0gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gX3RyeUJsb2NrKGJsb2NrKSB7XG4gIHZhciBlcnJvcjtcbiAgdHJ5IHtcbiAgICBibG9jaygpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgZXJyb3IgPSBlO1xuICB9XG4gIHJldHVybiBlcnJvcjtcbn1cblxuZnVuY3Rpb24gX3Rocm93cyhzaG91bGRUaHJvdywgYmxvY2ssIGV4cGVjdGVkLCBtZXNzYWdlKSB7XG4gIHZhciBhY3R1YWw7XG5cbiAgaWYgKHR5cGVvZiBibG9jayAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wiYmxvY2tcIiBhcmd1bWVudCBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgZXhwZWN0ZWQgPT09ICdzdHJpbmcnKSB7XG4gICAgbWVzc2FnZSA9IGV4cGVjdGVkO1xuICAgIGV4cGVjdGVkID0gbnVsbDtcbiAgfVxuXG4gIGFjdHVhbCA9IF90cnlCbG9jayhibG9jayk7XG5cbiAgbWVzc2FnZSA9IChleHBlY3RlZCAmJiBleHBlY3RlZC5uYW1lID8gJyAoJyArIGV4cGVjdGVkLm5hbWUgKyAnKS4nIDogJy4nKSArXG4gICAgICAgICAgICAobWVzc2FnZSA/ICcgJyArIG1lc3NhZ2UgOiAnLicpO1xuXG4gIGlmIChzaG91bGRUaHJvdyAmJiAhYWN0dWFsKSB7XG4gICAgZmFpbChhY3R1YWwsIGV4cGVjdGVkLCAnTWlzc2luZyBleHBlY3RlZCBleGNlcHRpb24nICsgbWVzc2FnZSk7XG4gIH1cblxuICB2YXIgdXNlclByb3ZpZGVkTWVzc2FnZSA9IHR5cGVvZiBtZXNzYWdlID09PSAnc3RyaW5nJztcbiAgdmFyIGlzVW53YW50ZWRFeGNlcHRpb24gPSAhc2hvdWxkVGhyb3cgJiYgdXRpbC5pc0Vycm9yKGFjdHVhbCk7XG4gIHZhciBpc1VuZXhwZWN0ZWRFeGNlcHRpb24gPSAhc2hvdWxkVGhyb3cgJiYgYWN0dWFsICYmICFleHBlY3RlZDtcblxuICBpZiAoKGlzVW53YW50ZWRFeGNlcHRpb24gJiZcbiAgICAgIHVzZXJQcm92aWRlZE1lc3NhZ2UgJiZcbiAgICAgIGV4cGVjdGVkRXhjZXB0aW9uKGFjdHVhbCwgZXhwZWN0ZWQpKSB8fFxuICAgICAgaXNVbmV4cGVjdGVkRXhjZXB0aW9uKSB7XG4gICAgZmFpbChhY3R1YWwsIGV4cGVjdGVkLCAnR290IHVud2FudGVkIGV4Y2VwdGlvbicgKyBtZXNzYWdlKTtcbiAgfVxuXG4gIGlmICgoc2hvdWxkVGhyb3cgJiYgYWN0dWFsICYmIGV4cGVjdGVkICYmXG4gICAgICAhZXhwZWN0ZWRFeGNlcHRpb24oYWN0dWFsLCBleHBlY3RlZCkpIHx8ICghc2hvdWxkVGhyb3cgJiYgYWN0dWFsKSkge1xuICAgIHRocm93IGFjdHVhbDtcbiAgfVxufVxuXG4vLyAxMS4gRXhwZWN0ZWQgdG8gdGhyb3cgYW4gZXJyb3I6XG4vLyBhc3NlcnQudGhyb3dzKGJsb2NrLCBFcnJvcl9vcHQsIG1lc3NhZ2Vfb3B0KTtcblxuYXNzZXJ0LnRocm93cyA9IGZ1bmN0aW9uKGJsb2NrLCAvKm9wdGlvbmFsKi9lcnJvciwgLypvcHRpb25hbCovbWVzc2FnZSkge1xuICBfdGhyb3dzKHRydWUsIGJsb2NrLCBlcnJvciwgbWVzc2FnZSk7XG59O1xuXG4vLyBFWFRFTlNJT04hIFRoaXMgaXMgYW5ub3lpbmcgdG8gd3JpdGUgb3V0c2lkZSB0aGlzIG1vZHVsZS5cbmFzc2VydC5kb2VzTm90VGhyb3cgPSBmdW5jdGlvbihibG9jaywgLypvcHRpb25hbCovZXJyb3IsIC8qb3B0aW9uYWwqL21lc3NhZ2UpIHtcbiAgX3Rocm93cyhmYWxzZSwgYmxvY2ssIGVycm9yLCBtZXNzYWdlKTtcbn07XG5cbmFzc2VydC5pZkVycm9yID0gZnVuY3Rpb24oZXJyKSB7IGlmIChlcnIpIHRocm93IGVycjsgfTtcblxudmFyIG9iamVjdEtleXMgPSBPYmplY3Qua2V5cyB8fCBmdW5jdGlvbiAob2JqKSB7XG4gIHZhciBrZXlzID0gW107XG4gIGZvciAodmFyIGtleSBpbiBvYmopIHtcbiAgICBpZiAoaGFzT3duLmNhbGwob2JqLCBrZXkpKSBrZXlzLnB1c2goa2V5KTtcbiAgfVxuICByZXR1cm4ga2V5cztcbn07XG4iLCIvKlxuICogQ29weXJpZ2h0IChDKSAyMDA4IEFwcGxlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uc1xuICogYXJlIG1ldDpcbiAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0XG4gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodFxuICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZVxuICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cbiAqXG4gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTllcbiAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVJcbiAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SXG4gKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCxcbiAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTyxcbiAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUlxuICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWVxuICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUXG4gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0VcbiAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4gKlxuICogUG9ydGVkIGZyb20gV2Via2l0XG4gKiBodHRwOi8vc3ZuLndlYmtpdC5vcmcvcmVwb3NpdG9yeS93ZWJraXQvdHJ1bmsvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvVW5pdEJlemllci5oXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBVbml0QmV6aWVyO1xuXG5mdW5jdGlvbiBVbml0QmV6aWVyKHAxeCwgcDF5LCBwMngsIHAyeSkge1xuICAgIC8vIENhbGN1bGF0ZSB0aGUgcG9seW5vbWlhbCBjb2VmZmljaWVudHMsIGltcGxpY2l0IGZpcnN0IGFuZCBsYXN0IGNvbnRyb2wgcG9pbnRzIGFyZSAoMCwwKSBhbmQgKDEsMSkuXG4gICAgdGhpcy5jeCA9IDMuMCAqIHAxeDtcbiAgICB0aGlzLmJ4ID0gMy4wICogKHAyeCAtIHAxeCkgLSB0aGlzLmN4O1xuICAgIHRoaXMuYXggPSAxLjAgLSB0aGlzLmN4IC0gdGhpcy5ieDtcblxuICAgIHRoaXMuY3kgPSAzLjAgKiBwMXk7XG4gICAgdGhpcy5ieSA9IDMuMCAqIChwMnkgLSBwMXkpIC0gdGhpcy5jeTtcbiAgICB0aGlzLmF5ID0gMS4wIC0gdGhpcy5jeSAtIHRoaXMuYnk7XG5cbiAgICB0aGlzLnAxeCA9IHAxeDtcbiAgICB0aGlzLnAxeSA9IHAyeTtcbiAgICB0aGlzLnAyeCA9IHAyeDtcbiAgICB0aGlzLnAyeSA9IHAyeTtcbn1cblxuVW5pdEJlemllci5wcm90b3R5cGUuc2FtcGxlQ3VydmVYID0gZnVuY3Rpb24odCkge1xuICAgIC8vIGBheCB0XjMgKyBieCB0XjIgKyBjeCB0JyBleHBhbmRlZCB1c2luZyBIb3JuZXIncyBydWxlLlxuICAgIHJldHVybiAoKHRoaXMuYXggKiB0ICsgdGhpcy5ieCkgKiB0ICsgdGhpcy5jeCkgKiB0O1xufTtcblxuVW5pdEJlemllci5wcm90b3R5cGUuc2FtcGxlQ3VydmVZID0gZnVuY3Rpb24odCkge1xuICAgIHJldHVybiAoKHRoaXMuYXkgKiB0ICsgdGhpcy5ieSkgKiB0ICsgdGhpcy5jeSkgKiB0O1xufTtcblxuVW5pdEJlemllci5wcm90b3R5cGUuc2FtcGxlQ3VydmVEZXJpdmF0aXZlWCA9IGZ1bmN0aW9uKHQpIHtcbiAgICByZXR1cm4gKDMuMCAqIHRoaXMuYXggKiB0ICsgMi4wICogdGhpcy5ieCkgKiB0ICsgdGhpcy5jeDtcbn07XG5cblVuaXRCZXppZXIucHJvdG90eXBlLnNvbHZlQ3VydmVYID0gZnVuY3Rpb24oeCwgZXBzaWxvbikge1xuICAgIGlmICh0eXBlb2YgZXBzaWxvbiA9PT0gJ3VuZGVmaW5lZCcpIGVwc2lsb24gPSAxZS02O1xuXG4gICAgdmFyIHQwLCB0MSwgdDIsIHgyLCBpO1xuXG4gICAgLy8gRmlyc3QgdHJ5IGEgZmV3IGl0ZXJhdGlvbnMgb2YgTmV3dG9uJ3MgbWV0aG9kIC0tIG5vcm1hbGx5IHZlcnkgZmFzdC5cbiAgICBmb3IgKHQyID0geCwgaSA9IDA7IGkgPCA4OyBpKyspIHtcblxuICAgICAgICB4MiA9IHRoaXMuc2FtcGxlQ3VydmVYKHQyKSAtIHg7XG4gICAgICAgIGlmIChNYXRoLmFicyh4MikgPCBlcHNpbG9uKSByZXR1cm4gdDI7XG5cbiAgICAgICAgdmFyIGQyID0gdGhpcy5zYW1wbGVDdXJ2ZURlcml2YXRpdmVYKHQyKTtcbiAgICAgICAgaWYgKE1hdGguYWJzKGQyKSA8IDFlLTYpIGJyZWFrO1xuXG4gICAgICAgIHQyID0gdDIgLSB4MiAvIGQyO1xuICAgIH1cblxuICAgIC8vIEZhbGwgYmFjayB0byB0aGUgYmlzZWN0aW9uIG1ldGhvZCBmb3IgcmVsaWFiaWxpdHkuXG4gICAgdDAgPSAwLjA7XG4gICAgdDEgPSAxLjA7XG4gICAgdDIgPSB4O1xuXG4gICAgaWYgKHQyIDwgdDApIHJldHVybiB0MDtcbiAgICBpZiAodDIgPiB0MSkgcmV0dXJuIHQxO1xuXG4gICAgd2hpbGUgKHQwIDwgdDEpIHtcblxuICAgICAgICB4MiA9IHRoaXMuc2FtcGxlQ3VydmVYKHQyKTtcbiAgICAgICAgaWYgKE1hdGguYWJzKHgyIC0geCkgPCBlcHNpbG9uKSByZXR1cm4gdDI7XG5cbiAgICAgICAgaWYgKHggPiB4Mikge1xuICAgICAgICAgICAgdDAgPSB0MjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHQxID0gdDI7XG4gICAgICAgIH1cblxuICAgICAgICB0MiA9ICh0MSAtIHQwKSAqIDAuNSArIHQwO1xuICAgIH1cblxuICAgIC8vIEZhaWx1cmUuXG4gICAgcmV0dXJuIHQyO1xufTtcblxuVW5pdEJlemllci5wcm90b3R5cGUuc29sdmUgPSBmdW5jdGlvbih4LCBlcHNpbG9uKSB7XG4gICAgcmV0dXJuIHRoaXMuc2FtcGxlQ3VydmVZKHRoaXMuc29sdmVDdXJ2ZVgoeCwgZXBzaWxvbikpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBQb2ludDtcblxuLyoqXG4gKiBBIHN0YW5kYWxvbmUgcG9pbnQgZ2VvbWV0cnkgd2l0aCB1c2VmdWwgYWNjZXNzb3IsIGNvbXBhcmlzb24sIGFuZFxuICogbW9kaWZpY2F0aW9uIG1ldGhvZHMuXG4gKlxuICogQGNsYXNzIFBvaW50XG4gKiBAcGFyYW0ge051bWJlcn0geCB0aGUgeC1jb29yZGluYXRlLiB0aGlzIGNvdWxkIGJlIGxvbmdpdHVkZSBvciBzY3JlZW5cbiAqIHBpeGVscywgb3IgYW55IG90aGVyIHNvcnQgb2YgdW5pdC5cbiAqIEBwYXJhbSB7TnVtYmVyfSB5IHRoZSB5LWNvb3JkaW5hdGUuIHRoaXMgY291bGQgYmUgbGF0aXR1ZGUgb3Igc2NyZWVuXG4gKiBwaXhlbHMsIG9yIGFueSBvdGhlciBzb3J0IG9mIHVuaXQuXG4gKiBAZXhhbXBsZVxuICogdmFyIHBvaW50ID0gbmV3IFBvaW50KC03NywgMzgpO1xuICovXG5mdW5jdGlvbiBQb2ludCh4LCB5KSB7XG4gICAgdGhpcy54ID0geDtcbiAgICB0aGlzLnkgPSB5O1xufVxuXG5Qb2ludC5wcm90b3R5cGUgPSB7XG5cbiAgICAvKipcbiAgICAgKiBDbG9uZSB0aGlzIHBvaW50LCByZXR1cm5pbmcgYSBuZXcgcG9pbnQgdGhhdCBjYW4gYmUgbW9kaWZpZWRcbiAgICAgKiB3aXRob3V0IGFmZmVjdGluZyB0aGUgb2xkIG9uZS5cbiAgICAgKiBAcmV0dXJuIHtQb2ludH0gdGhlIGNsb25lXG4gICAgICovXG4gICAgY2xvbmU6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbmV3IFBvaW50KHRoaXMueCwgdGhpcy55KTsgfSxcblxuICAgIC8qKlxuICAgICAqIEFkZCB0aGlzIHBvaW50J3MgeCAmIHkgY29vcmRpbmF0ZXMgdG8gYW5vdGhlciBwb2ludCxcbiAgICAgKiB5aWVsZGluZyBhIG5ldyBwb2ludC5cbiAgICAgKiBAcGFyYW0ge1BvaW50fSBwIHRoZSBvdGhlciBwb2ludFxuICAgICAqIEByZXR1cm4ge1BvaW50fSBvdXRwdXQgcG9pbnRcbiAgICAgKi9cbiAgICBhZGQ6ICAgICBmdW5jdGlvbihwKSB7IHJldHVybiB0aGlzLmNsb25lKCkuX2FkZChwKTsgfSxcblxuICAgIC8qKlxuICAgICAqIFN1YnRyYWN0IHRoaXMgcG9pbnQncyB4ICYgeSBjb29yZGluYXRlcyB0byBmcm9tIHBvaW50LFxuICAgICAqIHlpZWxkaW5nIGEgbmV3IHBvaW50LlxuICAgICAqIEBwYXJhbSB7UG9pbnR9IHAgdGhlIG90aGVyIHBvaW50XG4gICAgICogQHJldHVybiB7UG9pbnR9IG91dHB1dCBwb2ludFxuICAgICAqL1xuICAgIHN1YjogICAgIGZ1bmN0aW9uKHApIHsgcmV0dXJuIHRoaXMuY2xvbmUoKS5fc3ViKHApOyB9LFxuXG4gICAgLyoqXG4gICAgICogTXVsdGlwbHkgdGhpcyBwb2ludCdzIHggJiB5IGNvb3JkaW5hdGVzIGJ5IHBvaW50LFxuICAgICAqIHlpZWxkaW5nIGEgbmV3IHBvaW50LlxuICAgICAqIEBwYXJhbSB7UG9pbnR9IHAgdGhlIG90aGVyIHBvaW50XG4gICAgICogQHJldHVybiB7UG9pbnR9IG91dHB1dCBwb2ludFxuICAgICAqL1xuICAgIG11bHRCeVBvaW50OiAgICBmdW5jdGlvbihwKSB7IHJldHVybiB0aGlzLmNsb25lKCkuX211bHRCeVBvaW50KHApOyB9LFxuXG4gICAgLyoqXG4gICAgICogRGl2aWRlIHRoaXMgcG9pbnQncyB4ICYgeSBjb29yZGluYXRlcyBieSBwb2ludCxcbiAgICAgKiB5aWVsZGluZyBhIG5ldyBwb2ludC5cbiAgICAgKiBAcGFyYW0ge1BvaW50fSBwIHRoZSBvdGhlciBwb2ludFxuICAgICAqIEByZXR1cm4ge1BvaW50fSBvdXRwdXQgcG9pbnRcbiAgICAgKi9cbiAgICBkaXZCeVBvaW50OiAgICAgZnVuY3Rpb24ocCkgeyByZXR1cm4gdGhpcy5jbG9uZSgpLl9kaXZCeVBvaW50KHApOyB9LFxuXG4gICAgLyoqXG4gICAgICogTXVsdGlwbHkgdGhpcyBwb2ludCdzIHggJiB5IGNvb3JkaW5hdGVzIGJ5IGEgZmFjdG9yLFxuICAgICAqIHlpZWxkaW5nIGEgbmV3IHBvaW50LlxuICAgICAqIEBwYXJhbSB7UG9pbnR9IGsgZmFjdG9yXG4gICAgICogQHJldHVybiB7UG9pbnR9IG91dHB1dCBwb2ludFxuICAgICAqL1xuICAgIG11bHQ6ICAgIGZ1bmN0aW9uKGspIHsgcmV0dXJuIHRoaXMuY2xvbmUoKS5fbXVsdChrKTsgfSxcblxuICAgIC8qKlxuICAgICAqIERpdmlkZSB0aGlzIHBvaW50J3MgeCAmIHkgY29vcmRpbmF0ZXMgYnkgYSBmYWN0b3IsXG4gICAgICogeWllbGRpbmcgYSBuZXcgcG9pbnQuXG4gICAgICogQHBhcmFtIHtQb2ludH0gayBmYWN0b3JcbiAgICAgKiBAcmV0dXJuIHtQb2ludH0gb3V0cHV0IHBvaW50XG4gICAgICovXG4gICAgZGl2OiAgICAgZnVuY3Rpb24oaykgeyByZXR1cm4gdGhpcy5jbG9uZSgpLl9kaXYoayk7IH0sXG5cbiAgICAvKipcbiAgICAgKiBSb3RhdGUgdGhpcyBwb2ludCBhcm91bmQgdGhlIDAsIDAgb3JpZ2luIGJ5IGFuIGFuZ2xlIGEsXG4gICAgICogZ2l2ZW4gaW4gcmFkaWFuc1xuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBhIGFuZ2xlIHRvIHJvdGF0ZSBhcm91bmQsIGluIHJhZGlhbnNcbiAgICAgKiBAcmV0dXJuIHtQb2ludH0gb3V0cHV0IHBvaW50XG4gICAgICovXG4gICAgcm90YXRlOiAgZnVuY3Rpb24oYSkgeyByZXR1cm4gdGhpcy5jbG9uZSgpLl9yb3RhdGUoYSk7IH0sXG5cbiAgICAvKipcbiAgICAgKiBSb3RhdGUgdGhpcyBwb2ludCBhcm91bmQgcCBwb2ludCBieSBhbiBhbmdsZSBhLFxuICAgICAqIGdpdmVuIGluIHJhZGlhbnNcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gYSBhbmdsZSB0byByb3RhdGUgYXJvdW5kLCBpbiByYWRpYW5zXG4gICAgICogQHBhcmFtIHtQb2ludH0gcCBQb2ludCB0byByb3RhdGUgYXJvdW5kXG4gICAgICogQHJldHVybiB7UG9pbnR9IG91dHB1dCBwb2ludFxuICAgICAqL1xuICAgIHJvdGF0ZUFyb3VuZDogIGZ1bmN0aW9uKGEscCkgeyByZXR1cm4gdGhpcy5jbG9uZSgpLl9yb3RhdGVBcm91bmQoYSxwKTsgfSxcblxuICAgIC8qKlxuICAgICAqIE11bHRpcGx5IHRoaXMgcG9pbnQgYnkgYSA0eDEgdHJhbnNmb3JtYXRpb24gbWF0cml4XG4gICAgICogQHBhcmFtIHtBcnJheTxOdW1iZXI+fSBtIHRyYW5zZm9ybWF0aW9uIG1hdHJpeFxuICAgICAqIEByZXR1cm4ge1BvaW50fSBvdXRwdXQgcG9pbnRcbiAgICAgKi9cbiAgICBtYXRNdWx0OiBmdW5jdGlvbihtKSB7IHJldHVybiB0aGlzLmNsb25lKCkuX21hdE11bHQobSk7IH0sXG5cbiAgICAvKipcbiAgICAgKiBDYWxjdWxhdGUgdGhpcyBwb2ludCBidXQgYXMgYSB1bml0IHZlY3RvciBmcm9tIDAsIDAsIG1lYW5pbmdcbiAgICAgKiB0aGF0IHRoZSBkaXN0YW5jZSBmcm9tIHRoZSByZXN1bHRpbmcgcG9pbnQgdG8gdGhlIDAsIDBcbiAgICAgKiBjb29yZGluYXRlIHdpbGwgYmUgZXF1YWwgdG8gMSBhbmQgdGhlIGFuZ2xlIGZyb20gdGhlIHJlc3VsdGluZ1xuICAgICAqIHBvaW50IHRvIHRoZSAwLCAwIGNvb3JkaW5hdGUgd2lsbCBiZSB0aGUgc2FtZSBhcyBiZWZvcmUuXG4gICAgICogQHJldHVybiB7UG9pbnR9IHVuaXQgdmVjdG9yIHBvaW50XG4gICAgICovXG4gICAgdW5pdDogICAgZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLmNsb25lKCkuX3VuaXQoKTsgfSxcblxuICAgIC8qKlxuICAgICAqIENvbXB1dGUgYSBwZXJwZW5kaWN1bGFyIHBvaW50LCB3aGVyZSB0aGUgbmV3IHkgY29vcmRpbmF0ZVxuICAgICAqIGlzIHRoZSBvbGQgeCBjb29yZGluYXRlIGFuZCB0aGUgbmV3IHggY29vcmRpbmF0ZSBpcyB0aGUgb2xkIHlcbiAgICAgKiBjb29yZGluYXRlIG11bHRpcGxpZWQgYnkgLTFcbiAgICAgKiBAcmV0dXJuIHtQb2ludH0gcGVycGVuZGljdWxhciBwb2ludFxuICAgICAqL1xuICAgIHBlcnA6ICAgIGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5jbG9uZSgpLl9wZXJwKCk7IH0sXG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gYSB2ZXJzaW9uIG9mIHRoaXMgcG9pbnQgd2l0aCB0aGUgeCAmIHkgY29vcmRpbmF0ZXNcbiAgICAgKiByb3VuZGVkIHRvIGludGVnZXJzLlxuICAgICAqIEByZXR1cm4ge1BvaW50fSByb3VuZGVkIHBvaW50XG4gICAgICovXG4gICAgcm91bmQ6ICAgZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLmNsb25lKCkuX3JvdW5kKCk7IH0sXG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdGhlIG1hZ2l0dWRlIG9mIHRoaXMgcG9pbnQ6IHRoaXMgaXMgdGhlIEV1Y2xpZGVhblxuICAgICAqIGRpc3RhbmNlIGZyb20gdGhlIDAsIDAgY29vcmRpbmF0ZSB0byB0aGlzIHBvaW50J3MgeCBhbmQgeVxuICAgICAqIGNvb3JkaW5hdGVzLlxuICAgICAqIEByZXR1cm4ge051bWJlcn0gbWFnbml0dWRlXG4gICAgICovXG4gICAgbWFnOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIE1hdGguc3FydCh0aGlzLnggKiB0aGlzLnggKyB0aGlzLnkgKiB0aGlzLnkpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBKdWRnZSB3aGV0aGVyIHRoaXMgcG9pbnQgaXMgZXF1YWwgdG8gYW5vdGhlciBwb2ludCwgcmV0dXJuaW5nXG4gICAgICogdHJ1ZSBvciBmYWxzZS5cbiAgICAgKiBAcGFyYW0ge1BvaW50fSBvdGhlciB0aGUgb3RoZXIgcG9pbnRcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSB3aGV0aGVyIHRoZSBwb2ludHMgYXJlIGVxdWFsXG4gICAgICovXG4gICAgZXF1YWxzOiBmdW5jdGlvbihvdGhlcikge1xuICAgICAgICByZXR1cm4gdGhpcy54ID09PSBvdGhlci54ICYmXG4gICAgICAgICAgICAgICB0aGlzLnkgPT09IG90aGVyLnk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENhbGN1bGF0ZSB0aGUgZGlzdGFuY2UgZnJvbSB0aGlzIHBvaW50IHRvIGFub3RoZXIgcG9pbnRcbiAgICAgKiBAcGFyYW0ge1BvaW50fSBwIHRoZSBvdGhlciBwb2ludFxuICAgICAqIEByZXR1cm4ge051bWJlcn0gZGlzdGFuY2VcbiAgICAgKi9cbiAgICBkaXN0OiBmdW5jdGlvbihwKSB7XG4gICAgICAgIHJldHVybiBNYXRoLnNxcnQodGhpcy5kaXN0U3FyKHApKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ2FsY3VsYXRlIHRoZSBkaXN0YW5jZSBmcm9tIHRoaXMgcG9pbnQgdG8gYW5vdGhlciBwb2ludCxcbiAgICAgKiB3aXRob3V0IHRoZSBzcXVhcmUgcm9vdCBzdGVwLiBVc2VmdWwgaWYgeW91J3JlIGNvbXBhcmluZ1xuICAgICAqIHJlbGF0aXZlIGRpc3RhbmNlcy5cbiAgICAgKiBAcGFyYW0ge1BvaW50fSBwIHRoZSBvdGhlciBwb2ludFxuICAgICAqIEByZXR1cm4ge051bWJlcn0gZGlzdGFuY2VcbiAgICAgKi9cbiAgICBkaXN0U3FyOiBmdW5jdGlvbihwKSB7XG4gICAgICAgIHZhciBkeCA9IHAueCAtIHRoaXMueCxcbiAgICAgICAgICAgIGR5ID0gcC55IC0gdGhpcy55O1xuICAgICAgICByZXR1cm4gZHggKiBkeCArIGR5ICogZHk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgYW5nbGUgZnJvbSB0aGUgMCwgMCBjb29yZGluYXRlIHRvIHRoaXMgcG9pbnQsIGluIHJhZGlhbnNcbiAgICAgKiBjb29yZGluYXRlcy5cbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9IGFuZ2xlXG4gICAgICovXG4gICAgYW5nbGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gTWF0aC5hdGFuMih0aGlzLnksIHRoaXMueCk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgYW5nbGUgZnJvbSB0aGlzIHBvaW50IHRvIGFub3RoZXIgcG9pbnQsIGluIHJhZGlhbnNcbiAgICAgKiBAcGFyYW0ge1BvaW50fSBiIHRoZSBvdGhlciBwb2ludFxuICAgICAqIEByZXR1cm4ge051bWJlcn0gYW5nbGVcbiAgICAgKi9cbiAgICBhbmdsZVRvOiBmdW5jdGlvbihiKSB7XG4gICAgICAgIHJldHVybiBNYXRoLmF0YW4yKHRoaXMueSAtIGIueSwgdGhpcy54IC0gYi54KTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBhbmdsZSBiZXR3ZWVuIHRoaXMgcG9pbnQgYW5kIGFub3RoZXIgcG9pbnQsIGluIHJhZGlhbnNcbiAgICAgKiBAcGFyYW0ge1BvaW50fSBiIHRoZSBvdGhlciBwb2ludFxuICAgICAqIEByZXR1cm4ge051bWJlcn0gYW5nbGVcbiAgICAgKi9cbiAgICBhbmdsZVdpdGg6IGZ1bmN0aW9uKGIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYW5nbGVXaXRoU2VwKGIueCwgYi55KTtcbiAgICB9LFxuXG4gICAgLypcbiAgICAgKiBGaW5kIHRoZSBhbmdsZSBvZiB0aGUgdHdvIHZlY3RvcnMsIHNvbHZpbmcgdGhlIGZvcm11bGEgZm9yXG4gICAgICogdGhlIGNyb3NzIHByb2R1Y3QgYSB4IGIgPSB8YXx8YnxzaW4ow47CuCkgZm9yIMOOwrguXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHggdGhlIHgtY29vcmRpbmF0ZVxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSB5IHRoZSB5LWNvb3JkaW5hdGVcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9IHRoZSBhbmdsZSBpbiByYWRpYW5zXG4gICAgICovXG4gICAgYW5nbGVXaXRoU2VwOiBmdW5jdGlvbih4LCB5KSB7XG4gICAgICAgIHJldHVybiBNYXRoLmF0YW4yKFxuICAgICAgICAgICAgdGhpcy54ICogeSAtIHRoaXMueSAqIHgsXG4gICAgICAgICAgICB0aGlzLnggKiB4ICsgdGhpcy55ICogeSk7XG4gICAgfSxcblxuICAgIF9tYXRNdWx0OiBmdW5jdGlvbihtKSB7XG4gICAgICAgIHZhciB4ID0gbVswXSAqIHRoaXMueCArIG1bMV0gKiB0aGlzLnksXG4gICAgICAgICAgICB5ID0gbVsyXSAqIHRoaXMueCArIG1bM10gKiB0aGlzLnk7XG4gICAgICAgIHRoaXMueCA9IHg7XG4gICAgICAgIHRoaXMueSA9IHk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBfYWRkOiBmdW5jdGlvbihwKSB7XG4gICAgICAgIHRoaXMueCArPSBwLng7XG4gICAgICAgIHRoaXMueSArPSBwLnk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBfc3ViOiBmdW5jdGlvbihwKSB7XG4gICAgICAgIHRoaXMueCAtPSBwLng7XG4gICAgICAgIHRoaXMueSAtPSBwLnk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBfbXVsdDogZnVuY3Rpb24oaykge1xuICAgICAgICB0aGlzLnggKj0gaztcbiAgICAgICAgdGhpcy55ICo9IGs7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBfZGl2OiBmdW5jdGlvbihrKSB7XG4gICAgICAgIHRoaXMueCAvPSBrO1xuICAgICAgICB0aGlzLnkgLz0gaztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIF9tdWx0QnlQb2ludDogZnVuY3Rpb24ocCkge1xuICAgICAgICB0aGlzLnggKj0gcC54O1xuICAgICAgICB0aGlzLnkgKj0gcC55O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgX2RpdkJ5UG9pbnQ6IGZ1bmN0aW9uKHApIHtcbiAgICAgICAgdGhpcy54IC89IHAueDtcbiAgICAgICAgdGhpcy55IC89IHAueTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIF91bml0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy5fZGl2KHRoaXMubWFnKCkpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgX3BlcnA6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgeSA9IHRoaXMueTtcbiAgICAgICAgdGhpcy55ID0gdGhpcy54O1xuICAgICAgICB0aGlzLnggPSAteTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIF9yb3RhdGU6IGZ1bmN0aW9uKGFuZ2xlKSB7XG4gICAgICAgIHZhciBjb3MgPSBNYXRoLmNvcyhhbmdsZSksXG4gICAgICAgICAgICBzaW4gPSBNYXRoLnNpbihhbmdsZSksXG4gICAgICAgICAgICB4ID0gY29zICogdGhpcy54IC0gc2luICogdGhpcy55LFxuICAgICAgICAgICAgeSA9IHNpbiAqIHRoaXMueCArIGNvcyAqIHRoaXMueTtcbiAgICAgICAgdGhpcy54ID0geDtcbiAgICAgICAgdGhpcy55ID0geTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIF9yb3RhdGVBcm91bmQ6IGZ1bmN0aW9uKGFuZ2xlLCBwKSB7XG4gICAgICAgIHZhciBjb3MgPSBNYXRoLmNvcyhhbmdsZSksXG4gICAgICAgICAgICBzaW4gPSBNYXRoLnNpbihhbmdsZSksXG4gICAgICAgICAgICB4ID0gcC54ICsgY29zICogKHRoaXMueCAtIHAueCkgLSBzaW4gKiAodGhpcy55IC0gcC55KSxcbiAgICAgICAgICAgIHkgPSBwLnkgKyBzaW4gKiAodGhpcy54IC0gcC54KSArIGNvcyAqICh0aGlzLnkgLSBwLnkpO1xuICAgICAgICB0aGlzLnggPSB4O1xuICAgICAgICB0aGlzLnkgPSB5O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgX3JvdW5kOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy54ID0gTWF0aC5yb3VuZCh0aGlzLngpO1xuICAgICAgICB0aGlzLnkgPSBNYXRoLnJvdW5kKHRoaXMueSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbn07XG5cbi8qKlxuICogQ29uc3RydWN0IGEgcG9pbnQgZnJvbSBhbiBhcnJheSBpZiBuZWNlc3NhcnksIG90aGVyd2lzZSBpZiB0aGUgaW5wdXRcbiAqIGlzIGFscmVhZHkgYSBQb2ludCwgb3IgYW4gdW5rbm93biB0eXBlLCByZXR1cm4gaXQgdW5jaGFuZ2VkXG4gKiBAcGFyYW0ge0FycmF5PE51bWJlcj58UG9pbnR8Kn0gYSBhbnkga2luZCBvZiBpbnB1dCB2YWx1ZVxuICogQHJldHVybiB7UG9pbnR9IGNvbnN0cnVjdGVkIHBvaW50LCBvciBwYXNzZWQtdGhyb3VnaCB2YWx1ZS5cbiAqIEBleGFtcGxlXG4gKiAvLyB0aGlzXG4gKiB2YXIgcG9pbnQgPSBQb2ludC5jb252ZXJ0KFswLCAxXSk7XG4gKiAvLyBpcyBlcXVpdmFsZW50IHRvXG4gKiB2YXIgcG9pbnQgPSBuZXcgUG9pbnQoMCwgMSk7XG4gKi9cblBvaW50LmNvbnZlcnQgPSBmdW5jdGlvbiAoYSkge1xuICAgIGlmIChhIGluc3RhbmNlb2YgUG9pbnQpIHtcbiAgICAgICAgcmV0dXJuIGE7XG4gICAgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KGEpKSB7XG4gICAgICAgIHJldHVybiBuZXcgUG9pbnQoYVswXSwgYVsxXSk7XG4gICAgfVxuICAgIHJldHVybiBhO1xufTtcbiIsIi8vIEBmbG93XG5cbi8qKlxuICogRGVlcGx5IGNvbXBhcmVzIHR3byBvYmplY3QgbGl0ZXJhbHMuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gZGVlcEVxdWFsKGE6ID9taXhlZCwgYjogP21peGVkKTogYm9vbGVhbiB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYSkpIHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGIpIHx8IGEubGVuZ3RoICE9PSBiLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICghZGVlcEVxdWFsKGFbaV0sIGJbaV0pKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgYSA9PT0gJ29iamVjdCcgJiYgYSAhPT0gbnVsbCAmJiBiICE9PSBudWxsKSB7XG4gICAgICAgIGlmICghKHR5cGVvZiBiID09PSAnb2JqZWN0JykpIHJldHVybiBmYWxzZTtcbiAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGEpO1xuICAgICAgICBpZiAoa2V5cy5sZW5ndGggIT09IE9iamVjdC5rZXlzKGIpLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBhKSB7XG4gICAgICAgICAgICBpZiAoIWRlZXBFcXVhbChhW2tleV0sIGJba2V5XSkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGEgPT09IGI7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGRlZXBFcXVhbDtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCBVbml0QmV6aWVyIGZyb20gJ0BtYXBib3gvdW5pdGJlemllcic7XG5cbmltcG9ydCBQb2ludCBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcbmltcG9ydCB3aW5kb3cgZnJvbSAnLi93aW5kb3cnO1xuXG5pbXBvcnQgdHlwZSB7Q2FsbGJhY2t9IGZyb20gJy4uL3R5cGVzL2NhbGxiYWNrJztcblxuLyoqXG4gKiBAbW9kdWxlIHV0aWxcbiAqIEBwcml2YXRlXG4gKi9cblxuLyoqXG4gKiBHaXZlbiBhIHZhbHVlIGB0YCB0aGF0IHZhcmllcyBiZXR3ZWVuIDAgYW5kIDEsIHJldHVyblxuICogYW4gaW50ZXJwb2xhdGlvbiBmdW5jdGlvbiB0aGF0IGVhc2VzIGJldHdlZW4gMCBhbmQgMSBpbiBhIHBsZWFzaW5nXG4gKiBjdWJpYyBpbi1vdXQgZmFzaGlvbi5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZWFzZUN1YmljSW5PdXQodDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBpZiAodCA8PSAwKSByZXR1cm4gMDtcbiAgICBpZiAodCA+PSAxKSByZXR1cm4gMTtcbiAgICBjb25zdCB0MiA9IHQgKiB0LFxuICAgICAgICB0MyA9IHQyICogdDtcbiAgICByZXR1cm4gNCAqICh0IDwgMC41ID8gdDMgOiAzICogKHQgLSB0MikgKyB0MyAtIDAuNzUpO1xufVxuXG4vKipcbiAqIEdpdmVuIGdpdmVuICh4LCB5KSwgKHgxLCB5MSkgY29udHJvbCBwb2ludHMgZm9yIGEgYmV6aWVyIGN1cnZlLFxuICogcmV0dXJuIGEgZnVuY3Rpb24gdGhhdCBpbnRlcnBvbGF0ZXMgYWxvbmcgdGhhdCBjdXJ2ZS5cbiAqXG4gKiBAcGFyYW0gcDF4IGNvbnRyb2wgcG9pbnQgMSB4IGNvb3JkaW5hdGVcbiAqIEBwYXJhbSBwMXkgY29udHJvbCBwb2ludCAxIHkgY29vcmRpbmF0ZVxuICogQHBhcmFtIHAyeCBjb250cm9sIHBvaW50IDIgeCBjb29yZGluYXRlXG4gKiBAcGFyYW0gcDJ5IGNvbnRyb2wgcG9pbnQgMiB5IGNvb3JkaW5hdGVcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBiZXppZXIocDF4OiBudW1iZXIsIHAxeTogbnVtYmVyLCBwMng6IG51bWJlciwgcDJ5OiBudW1iZXIpOiAodDogbnVtYmVyKSA9PiBudW1iZXIge1xuICAgIGNvbnN0IGJlemllciA9IG5ldyBVbml0QmV6aWVyKHAxeCwgcDF5LCBwMngsIHAyeSk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHQ6IG51bWJlcikge1xuICAgICAgICByZXR1cm4gYmV6aWVyLnNvbHZlKHQpO1xuICAgIH07XG59XG5cbi8qKlxuICogQSBkZWZhdWx0IGJlemllci1jdXJ2ZSBwb3dlcmVkIGVhc2luZyBmdW5jdGlvbiB3aXRoXG4gKiBjb250cm9sIHBvaW50cyAoMC4yNSwgMC4xKSBhbmQgKDAuMjUsIDEpXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGNvbnN0IGVhc2UgPSBiZXppZXIoMC4yNSwgMC4xLCAwLjI1LCAxKTtcblxuLyoqXG4gKiBjb25zdHJhaW4gbiB0byB0aGUgZ2l2ZW4gcmFuZ2UgdmlhIG1pbiArIG1heFxuICpcbiAqIEBwYXJhbSBuIHZhbHVlXG4gKiBAcGFyYW0gbWluIHRoZSBtaW5pbXVtIHZhbHVlIHRvIGJlIHJldHVybmVkXG4gKiBAcGFyYW0gbWF4IHRoZSBtYXhpbXVtIHZhbHVlIHRvIGJlIHJldHVybmVkXG4gKiBAcmV0dXJucyB0aGUgY2xhbXBlZCB2YWx1ZVxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsYW1wKG46IG51bWJlciwgbWluOiBudW1iZXIsIG1heDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gTWF0aC5taW4obWF4LCBNYXRoLm1heChtaW4sIG4pKTtcbn1cblxuLyoqXG4gKiBjb25zdHJhaW4gbiB0byB0aGUgZ2l2ZW4gcmFuZ2UsIGV4Y2x1ZGluZyB0aGUgbWluaW11bSwgdmlhIG1vZHVsYXIgYXJpdGhtZXRpY1xuICpcbiAqIEBwYXJhbSBuIHZhbHVlXG4gKiBAcGFyYW0gbWluIHRoZSBtaW5pbXVtIHZhbHVlIHRvIGJlIHJldHVybmVkLCBleGNsdXNpdmVcbiAqIEBwYXJhbSBtYXggdGhlIG1heGltdW0gdmFsdWUgdG8gYmUgcmV0dXJuZWQsIGluY2x1c2l2ZVxuICogQHJldHVybnMgY29uc3RyYWluZWQgbnVtYmVyXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gd3JhcChuOiBudW1iZXIsIG1pbjogbnVtYmVyLCBtYXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3QgZCA9IG1heCAtIG1pbjtcbiAgICBjb25zdCB3ID0gKChuIC0gbWluKSAlIGQgKyBkKSAlIGQgKyBtaW47XG4gICAgcmV0dXJuICh3ID09PSBtaW4pID8gbWF4IDogdztcbn1cblxuLypcbiAqIENhbGwgYW4gYXN5bmNocm9ub3VzIGZ1bmN0aW9uIG9uIGFuIGFycmF5IG9mIGFyZ3VtZW50cyxcbiAqIGNhbGxpbmcgYGNhbGxiYWNrYCB3aXRoIHRoZSBjb21wbGV0ZWQgcmVzdWx0cyBvZiBhbGwgY2FsbHMuXG4gKlxuICogQHBhcmFtIGFycmF5IGlucHV0IHRvIGVhY2ggY2FsbCBvZiB0aGUgYXN5bmMgZnVuY3Rpb24uXG4gKiBAcGFyYW0gZm4gYW4gYXN5bmMgZnVuY3Rpb24gd2l0aCBzaWduYXR1cmUgKGRhdGEsIGNhbGxiYWNrKVxuICogQHBhcmFtIGNhbGxiYWNrIGEgY2FsbGJhY2sgcnVuIGFmdGVyIGFsbCBhc3luYyB3b3JrIGlzIGRvbmUuXG4gKiBjYWxsZWQgd2l0aCBhbiBhcnJheSwgY29udGFpbmluZyB0aGUgcmVzdWx0cyBvZiBlYWNoIGFzeW5jIGNhbGwuXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gYXN5bmNBbGw8SXRlbSwgUmVzdWx0PihcbiAgICBhcnJheTogQXJyYXk8SXRlbT4sXG4gICAgZm46IChpdGVtOiBJdGVtLCBmbkNhbGxiYWNrOiBDYWxsYmFjazxSZXN1bHQ+KSA9PiB2b2lkLFxuICAgIGNhbGxiYWNrOiBDYWxsYmFjazxBcnJheTxSZXN1bHQ+PlxuKSB7XG4gICAgaWYgKCFhcnJheS5sZW5ndGgpIHsgcmV0dXJuIGNhbGxiYWNrKG51bGwsIFtdKTsgfVxuICAgIGxldCByZW1haW5pbmcgPSBhcnJheS5sZW5ndGg7XG4gICAgY29uc3QgcmVzdWx0cyA9IG5ldyBBcnJheShhcnJheS5sZW5ndGgpO1xuICAgIGxldCBlcnJvciA9IG51bGw7XG4gICAgYXJyYXkuZm9yRWFjaCgoaXRlbSwgaSkgPT4ge1xuICAgICAgICBmbihpdGVtLCAoZXJyLCByZXN1bHQpID0+IHtcbiAgICAgICAgICAgIGlmIChlcnIpIGVycm9yID0gZXJyO1xuICAgICAgICAgICAgcmVzdWx0c1tpXSA9ICgocmVzdWx0OiBhbnkpOiBSZXN1bHQpOyAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svZmxvdy9pc3N1ZXMvMjEyM1xuICAgICAgICAgICAgaWYgKC0tcmVtYWluaW5nID09PSAwKSBjYWxsYmFjayhlcnJvciwgcmVzdWx0cyk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuXG4vKlxuICogUG9seWZpbGwgZm9yIE9iamVjdC52YWx1ZXMuIE5vdCBmdWxseSBzcGVjIGNvbXBsaWFudCwgYnV0IHdlIGRvbid0XG4gKiBuZWVkIGl0IHRvIGJlLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWx1ZXM8VD4ob2JqOiB7W2tleTogc3RyaW5nXTogVH0pOiBBcnJheTxUPiB7XG4gICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgZm9yIChjb25zdCBrIGluIG9iaikge1xuICAgICAgICByZXN1bHQucHVzaChvYmpba10pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKlxuICogQ29tcHV0ZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBrZXlzIGluIG9uZSBvYmplY3QgYW5kIHRoZSBrZXlzXG4gKiBpbiBhbm90aGVyIG9iamVjdC5cbiAqXG4gKiBAcmV0dXJucyBrZXlzIGRpZmZlcmVuY2VcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBrZXlzRGlmZmVyZW5jZTxTLCBUPihvYmo6IHtba2V5OiBzdHJpbmddOiBTfSwgb3RoZXI6IHtba2V5OiBzdHJpbmddOiBUfSk6IEFycmF5PHN0cmluZz4ge1xuICAgIGNvbnN0IGRpZmZlcmVuY2UgPSBbXTtcbiAgICBmb3IgKGNvbnN0IGkgaW4gb2JqKSB7XG4gICAgICAgIGlmICghKGkgaW4gb3RoZXIpKSB7XG4gICAgICAgICAgICBkaWZmZXJlbmNlLnB1c2goaSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGRpZmZlcmVuY2U7XG59XG5cbi8qKlxuICogR2l2ZW4gYSBkZXN0aW5hdGlvbiBvYmplY3QgYW5kIG9wdGlvbmFsbHkgbWFueSBzb3VyY2Ugb2JqZWN0cyxcbiAqIGNvcHkgYWxsIHByb3BlcnRpZXMgZnJvbSB0aGUgc291cmNlIG9iamVjdHMgaW50byB0aGUgZGVzdGluYXRpb24uXG4gKiBUaGUgbGFzdCBzb3VyY2Ugb2JqZWN0IGdpdmVuIG92ZXJyaWRlcyBwcm9wZXJ0aWVzIGZyb20gcHJldmlvdXNcbiAqIHNvdXJjZSBvYmplY3RzLlxuICpcbiAqIEBwYXJhbSBkZXN0IGRlc3RpbmF0aW9uIG9iamVjdFxuICogQHBhcmFtIHNvdXJjZXMgc291cmNlcyBmcm9tIHdoaWNoIHByb3BlcnRpZXMgYXJlIHB1bGxlZFxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dGVuZChkZXN0OiBPYmplY3QsIC4uLnNvdXJjZXM6IEFycmF5PD9PYmplY3Q+KTogT2JqZWN0IHtcbiAgICBmb3IgKGNvbnN0IHNyYyBvZiBzb3VyY2VzKSB7XG4gICAgICAgIGZvciAoY29uc3QgayBpbiBzcmMpIHtcbiAgICAgICAgICAgIGRlc3Rba10gPSBzcmNba107XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGRlc3Q7XG59XG5cbi8qKlxuICogR2l2ZW4gYW4gb2JqZWN0IGFuZCBhIG51bWJlciBvZiBwcm9wZXJ0aWVzIGFzIHN0cmluZ3MsIHJldHVybiB2ZXJzaW9uXG4gKiBvZiB0aGF0IG9iamVjdCB3aXRoIG9ubHkgdGhvc2UgcHJvcGVydGllcy5cbiAqXG4gKiBAcGFyYW0gc3JjIHRoZSBvYmplY3RcbiAqIEBwYXJhbSBwcm9wZXJ0aWVzIGFuIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzIGNob3NlblxuICogdG8gYXBwZWFyIG9uIHRoZSByZXN1bHRpbmcgb2JqZWN0LlxuICogQHJldHVybnMgb2JqZWN0IHdpdGggbGltaXRlZCBwcm9wZXJ0aWVzLlxuICogQGV4YW1wbGVcbiAqIHZhciBmb28gPSB7IG5hbWU6ICdDaGFybGllJywgYWdlOiAxMCB9O1xuICogdmFyIGp1c3ROYW1lID0gcGljayhmb28sIFsnbmFtZSddKTtcbiAqIC8vIGp1c3ROYW1lID0geyBuYW1lOiAnQ2hhcmxpZScgfVxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBpY2soc3JjOiBPYmplY3QsIHByb3BlcnRpZXM6IEFycmF5PHN0cmluZz4pOiBPYmplY3Qge1xuICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBrID0gcHJvcGVydGllc1tpXTtcbiAgICAgICAgaWYgKGsgaW4gc3JjKSB7XG4gICAgICAgICAgICByZXN1bHRba10gPSBzcmNba107XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxubGV0IGlkID0gMTtcblxuLyoqXG4gKiBSZXR1cm4gYSB1bmlxdWUgbnVtZXJpYyBpZCwgc3RhcnRpbmcgYXQgMSBhbmQgaW5jcmVtZW50aW5nIHdpdGhcbiAqIGVhY2ggY2FsbC5cbiAqXG4gKiBAcmV0dXJucyB1bmlxdWUgbnVtZXJpYyBpZC5cbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bmlxdWVJZCgpOiBudW1iZXIge1xuICAgIHJldHVybiBpZCsrO1xufVxuXG4vKipcbiAqIFJldHVybiBhIHJhbmRvbSBVVUlEICh2NCkuIFRha2VuIGZyb206IGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL2plZC85ODI4ODNcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1dWlkKCk6IHN0cmluZyB7XG4gICAgZnVuY3Rpb24gYihhKSB7XG4gICAgICAgIHJldHVybiBhID8gKGEgXiBNYXRoLnJhbmRvbSgpICogMTYgPj4gYSAvIDQpLnRvU3RyaW5nKDE2KSA6XG4gICAgICAgIC8vJEZsb3dGaXhNZTogRmxvdyBkb2Vzbid0IGxpa2UgdGhlIGltcGxpZWQgYXJyYXkgbGl0ZXJhbCBjb252ZXJzaW9uIGhlcmVcbiAgICAgICAgICAgIChbMWU3XSArIC1bMWUzXSArIC00ZTMgKyAtOGUzICsgLTFlMTEpLnJlcGxhY2UoL1swMThdL2csIGIpO1xuICAgIH1cbiAgICByZXR1cm4gYigpO1xufVxuXG4vKipcbiAqIFZhbGlkYXRlIGEgc3RyaW5nIHRvIG1hdGNoIFVVSUQodjQpIG9mIHRoZVxuICogZm9ybTogeHh4eHh4eHgteHh4eC00eHh4LVs4OWFiXXh4eC14eHh4eHh4eHh4eHhcbiAqIEBwYXJhbSBzdHIgc3RyaW5nIHRvIHZhbGlkYXRlLlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlVXVpZChzdHI6ID9zdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gc3RyID8gL15bMC05YS1mXXs4fS1bMC05YS1mXXs0fS1bNF1bMC05YS1mXXszfS1bODlhYl1bMC05YS1mXXszfS1bMC05YS1mXXsxMn0kL2kudGVzdChzdHIpIDogZmFsc2U7XG59XG5cbi8qKlxuICogR2l2ZW4gYW4gYXJyYXkgb2YgbWVtYmVyIGZ1bmN0aW9uIG5hbWVzIGFzIHN0cmluZ3MsIHJlcGxhY2UgYWxsIG9mIHRoZW1cbiAqIHdpdGggYm91bmQgdmVyc2lvbnMgdGhhdCB3aWxsIGFsd2F5cyByZWZlciB0byBgY29udGV4dGAgYXMgYHRoaXNgLiBUaGlzXG4gKiBpcyB1c2VmdWwgZm9yIGNsYXNzZXMgd2hlcmUgb3RoZXJ3aXNlIGV2ZW50IGJpbmRpbmdzIHdvdWxkIHJlYXNzaWduXG4gKiBgdGhpc2AgdG8gdGhlIGV2ZW50ZWQgb2JqZWN0IG9yIHNvbWUgb3RoZXIgdmFsdWU6IHRoaXMgbGV0cyB5b3UgZW5zdXJlXG4gKiB0aGUgYHRoaXNgIHZhbHVlIGFsd2F5cy5cbiAqXG4gKiBAcGFyYW0gZm5zIGxpc3Qgb2YgbWVtYmVyIGZ1bmN0aW9uIG5hbWVzXG4gKiBAcGFyYW0gY29udGV4dCB0aGUgY29udGV4dCB2YWx1ZVxuICogQGV4YW1wbGVcbiAqIGZ1bmN0aW9uIE15Q2xhc3MoKSB7XG4gKiAgIGJpbmRBbGwoWydvbnRpbWVyJ10sIHRoaXMpO1xuICogICB0aGlzLm5hbWUgPSAnVG9tJztcbiAqIH1cbiAqIE15Q2xhc3MucHJvdG90eXBlLm9udGltZXIgPSBmdW5jdGlvbigpIHtcbiAqICAgYWxlcnQodGhpcy5uYW1lKTtcbiAqIH07XG4gKiB2YXIgbXlDbGFzcyA9IG5ldyBNeUNsYXNzKCk7XG4gKiBzZXRUaW1lb3V0KG15Q2xhc3Mub250aW1lciwgMTAwKTtcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBiaW5kQWxsKGZuczogQXJyYXk8c3RyaW5nPiwgY29udGV4dDogT2JqZWN0KTogdm9pZCB7XG4gICAgZm5zLmZvckVhY2goKGZuKSA9PiB7XG4gICAgICAgIGlmICghY29udGV4dFtmbl0pIHsgcmV0dXJuOyB9XG4gICAgICAgIGNvbnRleHRbZm5dID0gY29udGV4dFtmbl0uYmluZChjb250ZXh0KTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSBzdHJpbmcgZW5kcyB3aXRoIGEgcGFydGljdWxhciBzdWJzdHJpbmdcbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZW5kc1dpdGgoc3RyaW5nOiBzdHJpbmcsIHN1ZmZpeDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHN0cmluZy5pbmRleE9mKHN1ZmZpeCwgc3RyaW5nLmxlbmd0aCAtIHN1ZmZpeC5sZW5ndGgpICE9PSAtMTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYW4gb2JqZWN0IGJ5IG1hcHBpbmcgYWxsIHRoZSB2YWx1ZXMgb2YgYW4gZXhpc3Rpbmcgb2JqZWN0IHdoaWxlXG4gKiBwcmVzZXJ2aW5nIHRoZWlyIGtleXMuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hcE9iamVjdChpbnB1dDogT2JqZWN0LCBpdGVyYXRvcjogRnVuY3Rpb24sIGNvbnRleHQ/OiBPYmplY3QpOiBPYmplY3Qge1xuICAgIGNvbnN0IG91dHB1dCA9IHt9O1xuICAgIGZvciAoY29uc3Qga2V5IGluIGlucHV0KSB7XG4gICAgICAgIG91dHB1dFtrZXldID0gaXRlcmF0b3IuY2FsbChjb250ZXh0IHx8IHRoaXMsIGlucHV0W2tleV0sIGtleSwgaW5wdXQpO1xuICAgIH1cbiAgICByZXR1cm4gb3V0cHV0O1xufVxuXG4vKipcbiAqIENyZWF0ZSBhbiBvYmplY3QgYnkgZmlsdGVyaW5nIG91dCB2YWx1ZXMgb2YgYW4gZXhpc3Rpbmcgb2JqZWN0LlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaWx0ZXJPYmplY3QoaW5wdXQ6IE9iamVjdCwgaXRlcmF0b3I6IEZ1bmN0aW9uLCBjb250ZXh0PzogT2JqZWN0KTogT2JqZWN0IHtcbiAgICBjb25zdCBvdXRwdXQgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBpbnB1dCkge1xuICAgICAgICBpZiAoaXRlcmF0b3IuY2FsbChjb250ZXh0IHx8IHRoaXMsIGlucHV0W2tleV0sIGtleSwgaW5wdXQpKSB7XG4gICAgICAgICAgICBvdXRwdXRba2V5XSA9IGlucHV0W2tleV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG91dHB1dDtcbn1cblxuaW1wb3J0IGRlZXBFcXVhbCBmcm9tICcuLi9zdHlsZS1zcGVjL3V0aWwvZGVlcF9lcXVhbCc7XG5leHBvcnQgeyBkZWVwRXF1YWwgfTtcblxuLyoqXG4gKiBEZWVwbHkgY2xvbmVzIHR3byBvYmplY3RzLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbG9uZTxUPihpbnB1dDogVCk6IFQge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGlucHV0KSkge1xuICAgICAgICByZXR1cm4gaW5wdXQubWFwKGNsb25lKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ29iamVjdCcgJiYgaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuICgobWFwT2JqZWN0KGlucHV0LCBjbG9uZSk6IGFueSk6IFQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBpbnB1dDtcbiAgICB9XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgdHdvIGFycmF5cyBoYXZlIGF0IGxlYXN0IG9uZSBjb21tb24gZWxlbWVudC5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gYXJyYXlzSW50ZXJzZWN0PFQ+KGE6IEFycmF5PFQ+LCBiOiBBcnJheTxUPik6IGJvb2xlYW4ge1xuICAgIGZvciAobGV0IGwgPSAwOyBsIDwgYS5sZW5ndGg7IGwrKykge1xuICAgICAgICBpZiAoYi5pbmRleE9mKGFbbF0pID49IDApIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogUHJpbnQgYSB3YXJuaW5nIG1lc3NhZ2UgdG8gdGhlIGNvbnNvbGUgYW5kIGVuc3VyZSBkdXBsaWNhdGUgd2FybmluZyBtZXNzYWdlc1xuICogYXJlIG5vdCBwcmludGVkLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmNvbnN0IHdhcm5PbmNlSGlzdG9yeToge1trZXk6IHN0cmluZ106IGJvb2xlYW59ID0ge307XG5cbmV4cG9ydCBmdW5jdGlvbiB3YXJuT25jZShtZXNzYWdlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIXdhcm5PbmNlSGlzdG9yeVttZXNzYWdlXSkge1xuICAgICAgICAvLyBjb25zb2xlIGlzbid0IGRlZmluZWQgaW4gc29tZSBXZWJXb3JrZXJzLCBzZWUgIzI1NThcbiAgICAgICAgaWYgKHR5cGVvZiBjb25zb2xlICE9PSBcInVuZGVmaW5lZFwiKSBjb25zb2xlLndhcm4obWVzc2FnZSk7XG4gICAgICAgIHdhcm5PbmNlSGlzdG9yeVttZXNzYWdlXSA9IHRydWU7XG4gICAgfVxufVxuXG4vKipcbiAqIEluZGljYXRlcyBpZiB0aGUgcHJvdmlkZWQgUG9pbnRzIGFyZSBpbiBhIGNvdW50ZXIgY2xvY2t3aXNlICh0cnVlKSBvciBjbG9ja3dpc2UgKGZhbHNlKSBvcmRlclxuICpcbiAqIEBwcml2YXRlXG4gKiBAcmV0dXJucyB0cnVlIGZvciBhIGNvdW50ZXIgY2xvY2t3aXNlIHNldCBvZiBwb2ludHNcbiAqL1xuLy8gaHR0cDovL2JyeWNlYm9lLmNvbS8yMDA2LzEwLzIzL2xpbmUtc2VnbWVudC1pbnRlcnNlY3Rpb24tYWxnb3JpdGhtL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQ291bnRlckNsb2Nrd2lzZShhOiBQb2ludCwgYjogUG9pbnQsIGM6IFBvaW50KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChjLnkgLSBhLnkpICogKGIueCAtIGEueCkgPiAoYi55IC0gYS55KSAqIChjLnggLSBhLngpO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHNpZ25lZCBhcmVhIGZvciB0aGUgcG9seWdvbiByaW5nLiAgUG9zdGl2ZSBhcmVhcyBhcmUgZXh0ZXJpb3IgcmluZ3MgYW5kXG4gKiBoYXZlIGEgY2xvY2t3aXNlIHdpbmRpbmcuICBOZWdhdGl2ZSBhcmVhcyBhcmUgaW50ZXJpb3IgcmluZ3MgYW5kIGhhdmUgYSBjb3VudGVyIGNsb2Nrd2lzZVxuICogb3JkZXJpbmcuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSByaW5nIEV4dGVyaW9yIG9yIGludGVyaW9yIHJpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhbGN1bGF0ZVNpZ25lZEFyZWEocmluZzogQXJyYXk8UG9pbnQ+KTogbnVtYmVyIHtcbiAgICBsZXQgc3VtID0gMDtcbiAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gcmluZy5sZW5ndGgsIGogPSBsZW4gLSAxLCBwMSwgcDI7IGkgPCBsZW47IGogPSBpKyspIHtcbiAgICAgICAgcDEgPSByaW5nW2ldO1xuICAgICAgICBwMiA9IHJpbmdbal07XG4gICAgICAgIHN1bSArPSAocDIueCAtIHAxLngpICogKHAxLnkgKyBwMi55KTtcbiAgICB9XG4gICAgcmV0dXJuIHN1bTtcbn1cblxuLyoqXG4gKiBEZXRlY3RzIGNsb3NlZCBwb2x5Z29ucywgZmlyc3QgKyBsYXN0IHBvaW50IGFyZSBlcXVhbFxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0gcG9pbnRzIGFycmF5IG9mIHBvaW50c1xuICogQHJldHVybiB0cnVlIGlmIHRoZSBwb2ludHMgYXJlIGEgY2xvc2VkIHBvbHlnb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQ2xvc2VkUG9seWdvbihwb2ludHM6IEFycmF5PFBvaW50Pik6IGJvb2xlYW4ge1xuICAgIC8vIElmIGl0IGlzIDIgcG9pbnRzIHRoYXQgYXJlIHRoZSBzYW1lIHRoZW4gaXQgaXMgYSBwb2ludFxuICAgIC8vIElmIGl0IGlzIDMgcG9pbnRzIHdpdGggc3RhcnQgYW5kIGVuZCB0aGUgc2FtZSB0aGVuIGl0IGlzIGEgbGluZVxuICAgIGlmIChwb2ludHMubGVuZ3RoIDwgNClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgY29uc3QgcDEgPSBwb2ludHNbMF07XG4gICAgY29uc3QgcDIgPSBwb2ludHNbcG9pbnRzLmxlbmd0aCAtIDFdO1xuXG4gICAgaWYgKE1hdGguYWJzKHAxLnggLSBwMi54KSA+IDAgfHxcbiAgICAgICAgTWF0aC5hYnMocDEueSAtIHAyLnkpID4gMCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gcG9seWdvbiBzaW1wbGlmaWNhdGlvbiBjYW4gcHJvZHVjZSBwb2x5Z29ucyB3aXRoIHplcm8gYXJlYSBhbmQgbW9yZSB0aGFuIDMgcG9pbnRzXG4gICAgcmV0dXJuIE1hdGguYWJzKGNhbGN1bGF0ZVNpZ25lZEFyZWEocG9pbnRzKSkgPiAwLjAxO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIHNwaGVyaWNhbCBjb29yZGluYXRlcyB0byBjYXJ0ZXNpYW4gY29vcmRpbmF0ZXMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSBzcGhlcmljYWwgU3BoZXJpY2FsIGNvb3JkaW5hdGVzLCBpbiBbcmFkaWFsLCBhemltdXRoYWwsIHBvbGFyXVxuICogQHJldHVybiBjYXJ0ZXNpYW4gY29vcmRpbmF0ZXMgaW4gW3gsIHksIHpdXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHNwaGVyaWNhbFRvQ2FydGVzaWFuKFtyLCBhemltdXRoYWwsIHBvbGFyXTogW251bWJlciwgbnVtYmVyLCBudW1iZXJdKToge3g6IG51bWJlciwgeTogbnVtYmVyLCB6OiBudW1iZXJ9IHtcbiAgICAvLyBXZSBhYnN0cmFjdCBcIm5vcnRoXCIvXCJ1cFwiIChjb21wYXNzLXdpc2UpIHRvIGJlIDDDgsKwIHdoZW4gcmVhbGx5IHRoaXMgaXMgOTDDgsKwICjDj8KALzIpOlxuICAgIC8vIGNvcnJlY3QgZm9yIHRoYXQgaGVyZVxuICAgIGF6aW11dGhhbCArPSA5MDtcblxuICAgIC8vIENvbnZlcnQgYXppbXV0aGFsIGFuZCBwb2xhciBhbmdsZXMgdG8gcmFkaWFuc1xuICAgIGF6aW11dGhhbCAqPSBNYXRoLlBJIC8gMTgwO1xuICAgIHBvbGFyICo9IE1hdGguUEkgLyAxODA7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICB4OiByICogTWF0aC5jb3MoYXppbXV0aGFsKSAqIE1hdGguc2luKHBvbGFyKSxcbiAgICAgICAgeTogciAqIE1hdGguc2luKGF6aW11dGhhbCkgKiBNYXRoLnNpbihwb2xhciksXG4gICAgICAgIHo6IHIgKiBNYXRoLmNvcyhwb2xhcilcbiAgICB9O1xufVxuXG4vKipcbiAqIFBhcnNlcyBkYXRhIGZyb20gJ0NhY2hlLUNvbnRyb2wnIGhlYWRlcnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSBjYWNoZUNvbnRyb2wgVmFsdWUgb2YgJ0NhY2hlLUNvbnRyb2wnIGhlYWRlclxuICogQHJldHVybiBvYmplY3QgY29udGFpbmluZyBwYXJzZWQgaGVhZGVyIGluZm8uXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlQ2FjaGVDb250cm9sKGNhY2hlQ29udHJvbDogc3RyaW5nKTogT2JqZWN0IHtcbiAgICAvLyBUYWtlbiBmcm9tIFtXcmVja10oaHR0cHM6Ly9naXRodWIuY29tL2hhcGlqcy93cmVjaylcbiAgICBjb25zdCByZSA9IC8oPzpefCg/OlxccypcXCxcXHMqKSkoW15cXHgwMC1cXHgyMFxcKFxcKTw+QFxcLDtcXDpcXFxcXCJcXC9cXFtcXF1cXD9cXD1cXHtcXH1cXHg3Rl0rKSg/OlxcPSg/OihbXlxceDAwLVxceDIwXFwoXFwpPD5AXFwsO1xcOlxcXFxcIlxcL1xcW1xcXVxcP1xcPVxce1xcfVxceDdGXSspfCg/OlxcXCIoKD86W15cIlxcXFxdfFxcXFwuKSopXFxcIikpKT8vZztcblxuICAgIGNvbnN0IGhlYWRlciA9IHt9O1xuICAgIGNhY2hlQ29udHJvbC5yZXBsYWNlKHJlLCAoJDAsICQxLCAkMiwgJDMpID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSAkMiB8fCAkMztcbiAgICAgICAgaGVhZGVyWyQxXSA9IHZhbHVlID8gdmFsdWUudG9Mb3dlckNhc2UoKSA6IHRydWU7XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9KTtcblxuICAgIGlmIChoZWFkZXJbJ21heC1hZ2UnXSkge1xuICAgICAgICBjb25zdCBtYXhBZ2UgPSBwYXJzZUludChoZWFkZXJbJ21heC1hZ2UnXSwgMTApO1xuICAgICAgICBpZiAoaXNOYU4obWF4QWdlKSkgZGVsZXRlIGhlYWRlclsnbWF4LWFnZSddO1xuICAgICAgICBlbHNlIGhlYWRlclsnbWF4LWFnZSddID0gbWF4QWdlO1xuICAgIH1cblxuICAgIHJldHVybiBoZWFkZXI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzdG9yYWdlQXZhaWxhYmxlKHR5cGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHN0b3JhZ2UgPSB3aW5kb3dbdHlwZV07XG4gICAgICAgIHN0b3JhZ2Uuc2V0SXRlbSgnX21hcGJveF90ZXN0XycsIDEpO1xuICAgICAgICBzdG9yYWdlLnJlbW92ZUl0ZW0oJ19tYXBib3hfdGVzdF8nKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuXG4vLyBUaGUgZm9sbG93aW5nIG1ldGhvZHMgYXJlIGZyb20gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1dpbmRvd0Jhc2U2NC9CYXNlNjRfZW5jb2RpbmdfYW5kX2RlY29kaW5nI1RoZV9Vbmljb2RlX1Byb2JsZW1cbi8vVW5pY29kZSBjb21wbGlhbnQgYmFzZTY0IGVuY29kZXIgZm9yIHN0cmluZ3NcbmV4cG9ydCBmdW5jdGlvbiBiNjRFbmNvZGVVbmljb2RlKHN0cjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHdpbmRvdy5idG9hKFxuICAgICAgICBlbmNvZGVVUklDb21wb25lbnQoc3RyKS5yZXBsYWNlKC8lKFswLTlBLUZdezJ9KS9nLFxuICAgICAgICAgICAgKG1hdGNoLCBwMSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKE51bWJlcignMHgnICsgcDEpKTsgLy9lc2xpbnQtZGlzYWJsZS1saW5lXG4gICAgICAgICAgICB9XG4gICAgICAgIClcbiAgICApO1xufVxuXG5cbi8vIFVuaWNvZGUgY29tcGxpYW50IGRlY29kZXIgZm9yIGJhc2U2NC1lbmNvZGVkIHN0cmluZ3NcbmV4cG9ydCBmdW5jdGlvbiBiNjREZWNvZGVVbmljb2RlKHN0cjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudCh3aW5kb3cuYXRvYihzdHIpLnNwbGl0KCcnKS5tYXAoKGMpID0+IHtcbiAgICAgICAgcmV0dXJuICclJyArICgnMDAnICsgYy5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KSkuc2xpY2UoLTIpOyAvL2VzbGludC1kaXNhYmxlLWxpbmVcbiAgICB9KS5qb2luKCcnKSk7XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgd2luZG93IGZyb20gJy4vd2luZG93JztcbmltcG9ydCB0eXBlIHsgQ2FuY2VsYWJsZSB9IGZyb20gJy4uL3R5cGVzL2NhbmNlbGFibGUnO1xuXG5jb25zdCBub3cgPSB3aW5kb3cucGVyZm9ybWFuY2UgJiYgd2luZG93LnBlcmZvcm1hbmNlLm5vdyA/XG4gICAgd2luZG93LnBlcmZvcm1hbmNlLm5vdy5iaW5kKHdpbmRvdy5wZXJmb3JtYW5jZSkgOlxuICAgIERhdGUubm93LmJpbmQoRGF0ZSk7XG5cbmNvbnN0IHJhZiA9IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHxcbiAgICB3aW5kb3cubW96UmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8XG4gICAgd2luZG93LndlYmtpdFJlcXVlc3RBbmltYXRpb25GcmFtZSB8fFxuICAgIHdpbmRvdy5tc1JlcXVlc3RBbmltYXRpb25GcmFtZTtcblxuY29uc3QgY2FuY2VsID0gd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lIHx8XG4gICAgd2luZG93Lm1vekNhbmNlbEFuaW1hdGlvbkZyYW1lIHx8XG4gICAgd2luZG93LndlYmtpdENhbmNlbEFuaW1hdGlvbkZyYW1lIHx8XG4gICAgd2luZG93Lm1zQ2FuY2VsQW5pbWF0aW9uRnJhbWU7XG5cbmxldCBsaW5rRWw7XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuY29uc3QgZXhwb3J0ZWQgPSB7XG4gICAgLyoqXG4gICAgICogUHJvdmlkZXMgYSBmdW5jdGlvbiB0aGF0IG91dHB1dHMgbWlsbGlzZWNvbmRzOiBlaXRoZXIgcGVyZm9ybWFuY2Uubm93KClcbiAgICAgKiBvciBhIGZhbGxiYWNrIHRvIERhdGUubm93KClcbiAgICAgKi9cbiAgICBub3csXG5cbiAgICBmcmFtZShmbjogRnVuY3Rpb24pOiBDYW5jZWxhYmxlIHtcbiAgICAgICAgY29uc3QgZnJhbWUgPSByYWYoZm4pO1xuICAgICAgICByZXR1cm4geyBjYW5jZWw6ICgpID0+IGNhbmNlbChmcmFtZSkgfTtcbiAgICB9LFxuXG4gICAgZ2V0SW1hZ2VEYXRhKGltZzogQ2FudmFzSW1hZ2VTb3VyY2UpOiBJbWFnZURhdGEge1xuICAgICAgICBjb25zdCBjYW52YXMgPSB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICAgICAgaWYgKCFjb250ZXh0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ZhaWxlZCB0byBjcmVhdGUgY2FudmFzIDJkIGNvbnRleHQnKTtcbiAgICAgICAgfVxuICAgICAgICBjYW52YXMud2lkdGggPSBpbWcud2lkdGg7XG4gICAgICAgIGNhbnZhcy5oZWlnaHQgPSBpbWcuaGVpZ2h0O1xuICAgICAgICBjb250ZXh0LmRyYXdJbWFnZShpbWcsIDAsIDAsIGltZy53aWR0aCwgaW1nLmhlaWdodCk7XG4gICAgICAgIHJldHVybiBjb250ZXh0LmdldEltYWdlRGF0YSgwLCAwLCBpbWcud2lkdGgsIGltZy5oZWlnaHQpO1xuICAgIH0sXG5cbiAgICByZXNvbHZlVVJMKHBhdGg6IHN0cmluZykge1xuICAgICAgICBpZiAoIWxpbmtFbCkgbGlua0VsID0gd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICAgICAgbGlua0VsLmhyZWYgPSBwYXRoO1xuICAgICAgICByZXR1cm4gbGlua0VsLmhyZWY7XG4gICAgfSxcblxuICAgIGhhcmR3YXJlQ29uY3VycmVuY3k6IHdpbmRvdy5uYXZpZ2F0b3IuaGFyZHdhcmVDb25jdXJyZW5jeSB8fCA0LFxuICAgIGdldCBkZXZpY2VQaXhlbFJhdGlvKCkgeyByZXR1cm4gd2luZG93LmRldmljZVBpeGVsUmF0aW87IH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IGV4cG9ydGVkO1xuIiwiLy8gQGZsb3dcblxudHlwZSBDb25maWcgPSB7fFxuICBBUElfVVJMOiBzdHJpbmcsXG4gIEVWRU5UU19VUkw6ID9zdHJpbmcsXG4gIEZFRURCQUNLX1VSTDogc3RyaW5nLFxuICBSRVFVSVJFX0FDQ0VTU19UT0tFTjogYm9vbGVhbixcbiAgQUNDRVNTX1RPS0VOOiA/c3RyaW5nLFxuICBNQVhfUEFSQUxMRUxfSU1BR0VfUkVRVUVTVFM6IG51bWJlclxufH07XG5cbmNvbnN0IGNvbmZpZzogQ29uZmlnID0ge1xuICAgIEFQSV9VUkw6ICdodHRwczovL2FwaS5tYXBib3guY29tJyxcbiAgICBnZXQgRVZFTlRTX1VSTCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLkFQSV9VUkwpIHsgcmV0dXJuIG51bGw7IH1cbiAgICAgICAgaWYgKHRoaXMuQVBJX1VSTC5pbmRleE9mKCdodHRwczovL2FwaS5tYXBib3guY24nKSA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuICdodHRwczovL2V2ZW50cy5tYXBib3guY24vZXZlbnRzL3YyJztcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLkFQSV9VUkwuaW5kZXhPZignaHR0cHM6Ly9hcGkubWFwYm94LmNvbScpID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gJ2h0dHBzOi8vZXZlbnRzLm1hcGJveC5jb20vZXZlbnRzL3YyJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBGRUVEQkFDS19VUkw6ICdodHRwczovL2FwcHMubWFwYm94LmNvbS9mZWVkYmFjaycsXG4gICAgUkVRVUlSRV9BQ0NFU1NfVE9LRU46IHRydWUsXG4gICAgQUNDRVNTX1RPS0VOOiBudWxsLFxuICAgIE1BWF9QQVJBTExFTF9JTUFHRV9SRVFVRVNUUzogMTZcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNvbmZpZztcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB3aW5kb3cgZnJvbSAnLi93aW5kb3cnO1xuXG5jb25zdCBleHBvcnRlZCA9IHtcbiAgICBzdXBwb3J0ZWQ6IGZhbHNlLFxuICAgIHRlc3RTdXBwb3J0XG59O1xuXG5leHBvcnQgZGVmYXVsdCBleHBvcnRlZDtcblxubGV0IGdsRm9yVGVzdGluZztcbmxldCB3ZWJwQ2hlY2tDb21wbGV0ZSA9IGZhbHNlO1xubGV0IHdlYnBJbWdUZXN0O1xubGV0IHdlYnBJbWdUZXN0T25sb2FkQ29tcGxldGUgPSBmYWxzZTtcblxuaWYgKHdpbmRvdy5kb2N1bWVudCkge1xuICAgIHdlYnBJbWdUZXN0ID0gd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpO1xuICAgIHdlYnBJbWdUZXN0Lm9ubG9hZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAoZ2xGb3JUZXN0aW5nKSB0ZXN0V2VicFRleHR1cmVVcGxvYWQoZ2xGb3JUZXN0aW5nKTtcbiAgICAgICAgZ2xGb3JUZXN0aW5nID0gbnVsbDtcbiAgICAgICAgd2VicEltZ1Rlc3RPbmxvYWRDb21wbGV0ZSA9IHRydWU7XG4gICAgfTtcbiAgICB3ZWJwSW1nVGVzdC5vbmVycm9yID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHdlYnBDaGVja0NvbXBsZXRlID0gdHJ1ZTtcbiAgICAgICAgZ2xGb3JUZXN0aW5nID0gbnVsbDtcbiAgICB9O1xuICAgIHdlYnBJbWdUZXN0LnNyYyA9ICdkYXRhOmltYWdlL3dlYnA7YmFzZTY0LFVrbEdSaDRBQUFCWFJVSlFWbEE0VEJFQUFBQXZBUUFBQUFmUS8vNzN2LytCaU9oL0FBQT0nO1xufVxuXG5mdW5jdGlvbiB0ZXN0U3VwcG9ydChnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0KSB7XG4gICAgaWYgKHdlYnBDaGVja0NvbXBsZXRlIHx8ICF3ZWJwSW1nVGVzdCkgcmV0dXJuO1xuXG4gICAgLy8gSFRNTEltYWdlRWxlbWVudC5jb21wbGV0ZSBpcyBzZXQgd2hlbiBhbiBpbWFnZSBpcyBkb25lIGxvYWRpbmcgaXQncyBzb3VyY2VcbiAgICAvLyByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIGxvYWQgd2FzIHN1Y2Nlc3NmdWwgb3Igbm90LlxuICAgIC8vIEl0J3MgcG9zc2libGUgZm9yIGFuIGVycm9yIHRvIHNldCBIVE1MSW1hZ2VFbGVtZW50LmNvbXBsZXRlIHRvIHRydWUgd2hpY2ggd291bGQgdHJpZ2dlclxuICAgIC8vIHRlc3RXZWJwVGV4dHVyZVVwbG9hZCBhbmQgbWlzdGFrZW5seSBzZXQgZXhwb3J0ZWQuc3VwcG9ydGVkIHRvIHRydWUgaW4gYnJvd3NlcnMgd2hpY2ggZG9uJ3Qgc3VwcG9ydCB3ZWJwXG4gICAgLy8gVG8gYXZvaWQgdGhpcywgd2Ugc2V0IGEgZmxhZyBpbiB0aGUgaW1hZ2UncyBvbmxvYWQgaGFuZGxlciBhbmQgb25seSBjYWxsIHRlc3RXZWJwVGV4dHVyZVVwbG9hZFxuICAgIC8vIGFmdGVyIGEgc3VjY2Vzc2Z1bCBpbWFnZSBsb2FkIGV2ZW50LlxuICAgIGlmICh3ZWJwSW1nVGVzdE9ubG9hZENvbXBsZXRlKSB7XG4gICAgICAgIHRlc3RXZWJwVGV4dHVyZVVwbG9hZChnbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZ2xGb3JUZXN0aW5nID0gZ2w7XG5cbiAgICB9XG59XG5cbmZ1bmN0aW9uIHRlc3RXZWJwVGV4dHVyZVVwbG9hZChnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0KSB7XG4gICAgLy8gRWRnZSAxOCBzdXBwb3J0cyBXZWJQIGJ1dCBub3QgdXBsb2FkaW5nIGEgV2ViUCBpbWFnZSB0byBhIGdsIHRleHR1cmVcbiAgICAvLyBUZXN0IHN1cHBvcnQgZm9yIHRoaXMgYmVmb3JlIGFsbG93aW5nIFdlYlAgaW1hZ2VzLlxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvbWFwYm94LWdsLWpzL2lzc3Vlcy83NjcxXG4gICAgY29uc3QgdGV4dHVyZSA9IGdsLmNyZWF0ZVRleHR1cmUoKTtcbiAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCB0ZXh0dXJlKTtcblxuICAgIHRyeSB7XG4gICAgICAgIGdsLnRleEltYWdlMkQoZ2wuVEVYVFVSRV8yRCwgMCwgZ2wuUkdCQSwgZ2wuUkdCQSwgZ2wuVU5TSUdORURfQllURSwgd2VicEltZ1Rlc3QpO1xuXG4gICAgICAgIC8vIFRoZSBlcnJvciBkb2VzIG5vdCBnZXQgdHJpZ2dlcmVkIGluIEVkZ2UgaWYgdGhlIGNvbnRleHQgaXMgbG9zdFxuICAgICAgICBpZiAoZ2wuaXNDb250ZXh0TG9zdCgpKSByZXR1cm47XG5cbiAgICAgICAgZXhwb3J0ZWQuc3VwcG9ydGVkID0gdHJ1ZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIENhdGNoIFwiVW5zcGVjaWZpZWQgRXJyb3IuXCIgaW4gRWRnZSAxOC5cbiAgICB9XG5cbiAgICBnbC5kZWxldGVUZXh0dXJlKHRleHR1cmUpO1xuXG4gICAgd2VicENoZWNrQ29tcGxldGUgPSB0cnVlO1xufVxuIiwiLy8gQGZsb3dcblxuLyoqKioqIFNUQVJUIFdBUk5JTkcgLSBJRiBZT1UgVVNFIFRISVMgQ09ERSBXSVRIIE1BUEJPWCBNQVBQSU5HIEFQSVMsIFJFTU9WQUwgT1JcbiogTU9ESUZJQ0FUSU9OIE9GIFRIRSBGT0xMT1dJTkcgQ09ERSBWSU9MQVRFUyBUSEUgTUFQQk9YIFRFUk1TIE9GIFNFUlZJQ0UgICoqKioqKlxuKiBUaGUgZm9sbG93aW5nIGNvZGUgaXMgdXNlZCB0byBhY2Nlc3MgTWFwYm94J3MgTWFwcGluZyBBUElzLiBSZW1vdmFsIG9yIG1vZGlmaWNhdGlvblxuKiBvZiB0aGlzIGNvZGUgd2hlbiB1c2VkIHdpdGggTWFwYm94J3MgTWFwcGluZyBBUElzIGNhbiByZXN1bHQgaW4gaGlnaGVyIGZlZXMgYW5kL29yXG4qIHRlcm1pbmF0aW9uIG9mIHlvdXIgYWNjb3VudCB3aXRoIE1hcGJveC5cbipcbiogVW5kZXIgdGhlIE1hcGJveCBUZXJtcyBvZiBTZXJ2aWNlLCB5b3UgbWF5IG5vdCB1c2UgdGhpcyBjb2RlIHRvIGFjY2VzcyBNYXBib3hcbiogTWFwcGluZyBBUElzIG90aGVyIHRoYW4gdGhyb3VnaCBNYXBib3ggU0RLcy5cbipcbiogVGhlIE1hcHBpbmcgQVBJcyBkb2N1bWVudGF0aW9uIGlzIGF2YWlsYWJsZSBhdCBodHRwczovL2RvY3MubWFwYm94LmNvbS9hcGkvbWFwcy8jbWFwc1xuKiBhbmQgdGhlIE1hcGJveCBUZXJtcyBvZiBTZXJ2aWNlIGFyZSBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cubWFwYm94LmNvbS90b3MvXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbnR5cGUgU2t1VG9rZW5PYmplY3QgPSB7fFxuICAgIHRva2VuOiBzdHJpbmcsXG4gICAgdG9rZW5FeHBpcmVzQXQ6IG51bWJlclxufH07XG5cbmNvbnN0IFNLVV9JRCA9ICcwMSc7XG5cbmZ1bmN0aW9uIGNyZWF0ZVNrdVRva2VuKCk6IFNrdVRva2VuT2JqZWN0IHtcbiAgICAvLyBTS1VfSUQgYW5kIFRPS0VOX1ZFUlNJT04gYXJlIHNwZWNpZmllZCBieSBhbiBpbnRlcm5hbCBzY2hlbWEgYW5kIHNob3VsZCBub3QgY2hhbmdlXG4gICAgY29uc3QgVE9LRU5fVkVSU0lPTiA9ICcxJztcbiAgICBjb25zdCBiYXNlNjJjaGFycyA9ICcwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWic7XG4gICAgLy8gc2Vzc2lvblJhbmRvbWl6ZXIgaXMgYSByYW5kb21pemVkIDEwLWRpZ2l0IGJhc2UtNjIgbnVtYmVyXG4gICAgbGV0IHNlc3Npb25SYW5kb21pemVyID0gJyc7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7XG4gICAgICAgIHNlc3Npb25SYW5kb21pemVyICs9IGJhc2U2MmNoYXJzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDYyKV07XG4gICAgfVxuICAgIGNvbnN0IGV4cGlyYXRpb24gPSAxMiAqIDYwICogNjAgKiAxMDAwOyAvLyAxMiBob3Vyc1xuICAgIGNvbnN0IHRva2VuID0gW1RPS0VOX1ZFUlNJT04sIFNLVV9JRCwgc2Vzc2lvblJhbmRvbWl6ZXJdLmpvaW4oJycpO1xuICAgIGNvbnN0IHRva2VuRXhwaXJlc0F0ID0gRGF0ZS5ub3coKSArIGV4cGlyYXRpb247XG5cbiAgICByZXR1cm4geyB0b2tlbiwgdG9rZW5FeHBpcmVzQXQgfTtcbn1cblxuZXhwb3J0IHsgY3JlYXRlU2t1VG9rZW4sIFNLVV9JRCB9O1xuXG4vKioqKiogRU5EIFdBUk5JTkcgLSBSRU1PVkFMIE9SIE1PRElGSUNBVElPTiBPRiBUSEVcblBSRUNFRElORyBDT0RFIFZJT0xBVEVTIFRIRSBNQVBCT1ggVEVSTVMgT0YgU0VSVklDRSAgKioqKioqL1xuIiwiLy8gQGZsb3dcblxuLyoqKioqIFNUQVJUIFdBUk5JTkcgLSBJRiBZT1UgVVNFIFRISVMgQ09ERSBXSVRIIE1BUEJPWCBNQVBQSU5HIEFQSVMsIFJFTU9WQUwgT1JcbiogTU9ESUZJQ0FUSU9OIE9GIFRIRSBGT0xMT1dJTkcgQ09ERSBWSU9MQVRFUyBUSEUgTUFQQk9YIFRFUk1TIE9GIFNFUlZJQ0UgICoqKioqKlxuKiBUaGUgZm9sbG93aW5nIGNvZGUgaXMgdXNlZCB0byBhY2Nlc3MgTWFwYm94J3MgTWFwcGluZyBBUElzLiBSZW1vdmFsIG9yIG1vZGlmaWNhdGlvblxuKiBvZiB0aGlzIGNvZGUgd2hlbiB1c2VkIHdpdGggTWFwYm94J3MgTWFwcGluZyBBUElzIGNhbiByZXN1bHQgaW4gaGlnaGVyIGZlZXMgYW5kL29yXG4qIHRlcm1pbmF0aW9uIG9mIHlvdXIgYWNjb3VudCB3aXRoIE1hcGJveC5cbipcbiogVW5kZXIgdGhlIE1hcGJveCBUZXJtcyBvZiBTZXJ2aWNlLCB5b3UgbWF5IG5vdCB1c2UgdGhpcyBjb2RlIHRvIGFjY2VzcyBNYXBib3hcbiogTWFwcGluZyBBUElzIG90aGVyIHRoYW4gdGhyb3VnaCBNYXBib3ggU0RLcy5cbipcbiogVGhlIE1hcHBpbmcgQVBJcyBkb2N1bWVudGF0aW9uIGlzIGF2YWlsYWJsZSBhdCBodHRwczovL2RvY3MubWFwYm94LmNvbS9hcGkvbWFwcy8jbWFwc1xuKiBhbmQgdGhlIE1hcGJveCBUZXJtcyBvZiBTZXJ2aWNlIGFyZSBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cubWFwYm94LmNvbS90b3MvXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCBjb25maWcgZnJvbSAnLi9jb25maWcnO1xuXG5pbXBvcnQgYnJvd3NlciBmcm9tICcuL2Jyb3dzZXInO1xuaW1wb3J0IHdpbmRvdyBmcm9tICcuL3dpbmRvdyc7XG5pbXBvcnQgd2VicFN1cHBvcnRlZCBmcm9tICcuL3dlYnBfc3VwcG9ydGVkJztcbmltcG9ydCB7IGNyZWF0ZVNrdVRva2VuLCBTS1VfSUQgfSBmcm9tICcuL3NrdV90b2tlbic7XG5pbXBvcnQgeyB2ZXJzaW9uIGFzIHNka1ZlcnNpb24gfSBmcm9tICcuLi8uLi9wYWNrYWdlLmpzb24nO1xuaW1wb3J0IHsgdXVpZCwgdmFsaWRhdGVVdWlkLCBzdG9yYWdlQXZhaWxhYmxlLCBiNjREZWNvZGVVbmljb2RlLCBiNjRFbmNvZGVVbmljb2RlLCB3YXJuT25jZSwgZXh0ZW5kIH0gZnJvbSAnLi91dGlsJztcbmltcG9ydCB7IHBvc3REYXRhLCBSZXNvdXJjZVR5cGUgfSBmcm9tICcuL2FqYXgnO1xuXG5pbXBvcnQgdHlwZSB7IFJlcXVlc3RQYXJhbWV0ZXJzIH0gZnJvbSAnLi9hamF4JztcbmltcG9ydCB0eXBlIHsgQ2FuY2VsYWJsZSB9IGZyb20gJy4uL3R5cGVzL2NhbmNlbGFibGUnO1xuaW1wb3J0IHR5cGUgeyBUaWxlSlNPTiB9IGZyb20gJy4uL3R5cGVzL3RpbGVqc29uJztcblxudHlwZSBSZXNvdXJjZVR5cGVFbnVtID0gJEtleXM8dHlwZW9mIFJlc291cmNlVHlwZT47XG5leHBvcnQgdHlwZSBSZXF1ZXN0VHJhbnNmb3JtRnVuY3Rpb24gPSAodXJsOiBzdHJpbmcsIHJlc291cmNlVHlwZT86IFJlc291cmNlVHlwZUVudW0pID0+IFJlcXVlc3RQYXJhbWV0ZXJzO1xuXG50eXBlIFVybE9iamVjdCA9IHt8XG4gICAgcHJvdG9jb2w6IHN0cmluZyxcbiAgICBhdXRob3JpdHk6IHN0cmluZyxcbiAgICBwYXRoOiBzdHJpbmcsXG4gICAgcGFyYW1zOiBBcnJheTxzdHJpbmc+XG58fTtcblxuZXhwb3J0IGNsYXNzIFJlcXVlc3RNYW5hZ2VyIHtcbiAgICBfc2t1VG9rZW46IHN0cmluZztcbiAgICBfc2t1VG9rZW5FeHBpcmVzQXQ6IG51bWJlcjtcbiAgICBfdHJhbnNmb3JtUmVxdWVzdEZuOiA/UmVxdWVzdFRyYW5zZm9ybUZ1bmN0aW9uO1xuXG4gICAgY29uc3RydWN0b3IodHJhbnNmb3JtUmVxdWVzdEZuPzogUmVxdWVzdFRyYW5zZm9ybUZ1bmN0aW9uKSB7XG4gICAgICAgIHRoaXMuX3RyYW5zZm9ybVJlcXVlc3RGbiA9IHRyYW5zZm9ybVJlcXVlc3RGbjtcbiAgICAgICAgdGhpcy5fY3JlYXRlU2t1VG9rZW4oKTtcbiAgICB9XG5cbiAgICBfY3JlYXRlU2t1VG9rZW4oKSB7XG4gICAgICAgIGNvbnN0IHNrdVRva2VuID0gY3JlYXRlU2t1VG9rZW4oKTtcbiAgICAgICAgdGhpcy5fc2t1VG9rZW4gPSBza3VUb2tlbi50b2tlbjtcbiAgICAgICAgdGhpcy5fc2t1VG9rZW5FeHBpcmVzQXQgPSBza3VUb2tlbi50b2tlbkV4cGlyZXNBdDtcbiAgICB9XG5cbiAgICBfaXNTa3VUb2tlbkV4cGlyZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBEYXRlLm5vdygpID4gdGhpcy5fc2t1VG9rZW5FeHBpcmVzQXQ7XG4gICAgfVxuXG4gICAgdHJhbnNmb3JtUmVxdWVzdCh1cmw6IHN0cmluZywgdHlwZTogUmVzb3VyY2VUeXBlRW51bSkge1xuICAgICAgICBpZiAodGhpcy5fdHJhbnNmb3JtUmVxdWVzdEZuKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fdHJhbnNmb3JtUmVxdWVzdEZuKHVybCwgdHlwZSkgfHwge3VybH07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge3VybH07XG4gICAgfVxuXG4gICAgbm9ybWFsaXplU3R5bGVVUkwodXJsOiBzdHJpbmcsIGFjY2Vzc1Rva2VuPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZVN0eWxlVVJMKHVybCwgYWNjZXNzVG9rZW4pO1xuICAgIH1cblxuICAgIG5vcm1hbGl6ZUdseXBoc1VSTCh1cmw6IHN0cmluZywgYWNjZXNzVG9rZW4/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gbm9ybWFsaXplR2x5cGhzVVJMKHVybCwgYWNjZXNzVG9rZW4pO1xuICAgIH1cblxuICAgIG5vcm1hbGl6ZVNvdXJjZVVSTCh1cmw6IHN0cmluZywgYWNjZXNzVG9rZW4/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gbm9ybWFsaXplU291cmNlVVJMKHVybCwgYWNjZXNzVG9rZW4pO1xuICAgIH1cblxuICAgIG5vcm1hbGl6ZVNwcml0ZVVSTCh1cmw6IHN0cmluZywgZm9ybWF0OiBzdHJpbmcsIGV4dGVuc2lvbjogc3RyaW5nLCBhY2Nlc3NUb2tlbj86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBub3JtYWxpemVTcHJpdGVVUkwodXJsLCBmb3JtYXQsIGV4dGVuc2lvbiwgYWNjZXNzVG9rZW4pO1xuICAgIH1cblxuICAgIG5vcm1hbGl6ZVRpbGVVUkwodGlsZVVSTDogc3RyaW5nLCBzb3VyY2VVUkw/OiA/c3RyaW5nLCB0aWxlU2l6ZT86ID9udW1iZXIpOiBzdHJpbmcge1xuICAgICAgICBpZiAodGhpcy5faXNTa3VUb2tlbkV4cGlyZWQoKSkge1xuICAgICAgICAgICAgdGhpcy5fY3JlYXRlU2t1VG9rZW4oKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBub3JtYWxpemVUaWxlVVJMKHRpbGVVUkwsIHNvdXJjZVVSTCwgdGlsZVNpemUsIHRoaXMuX3NrdVRva2VuKTtcbiAgICB9XG5cbiAgICBjYW5vbmljYWxpemVUaWxlVVJMKHVybDogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiBjYW5vbmljYWxpemVUaWxlVVJMKHVybCk7XG4gICAgfVxuXG4gICAgY2Fub25pY2FsaXplVGlsZXNldCh0aWxlSlNPTjogVGlsZUpTT04sIHNvdXJjZVVSTDogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiBjYW5vbmljYWxpemVUaWxlc2V0KHRpbGVKU09OLCBzb3VyY2VVUkwpO1xuICAgIH1cbn1cblxuY29uc3QgaGVscCA9ICdTZWUgaHR0cHM6Ly93d3cubWFwYm94LmNvbS9hcGktZG9jdW1lbnRhdGlvbi8jYWNjZXNzLXRva2Vucy1hbmQtdG9rZW4tc2NvcGVzJztcblxuZnVuY3Rpb24gbWFrZUFQSVVSTCh1cmxPYmplY3Q6IFVybE9iamVjdCwgYWNjZXNzVG9rZW46IHN0cmluZyB8IG51bGwgfCB2b2lkKTogc3RyaW5nIHtcbiAgICBjb25zdCBhcGlVcmxPYmplY3QgPSBwYXJzZVVybChjb25maWcuQVBJX1VSTCk7XG4gICAgdXJsT2JqZWN0LnByb3RvY29sID0gYXBpVXJsT2JqZWN0LnByb3RvY29sO1xuICAgIHVybE9iamVjdC5hdXRob3JpdHkgPSBhcGlVcmxPYmplY3QuYXV0aG9yaXR5O1xuXG4gICAgaWYgKGFwaVVybE9iamVjdC5wYXRoICE9PSAnLycpIHtcbiAgICAgICAgdXJsT2JqZWN0LnBhdGggPSBgJHthcGlVcmxPYmplY3QucGF0aH0ke3VybE9iamVjdC5wYXRofWA7XG4gICAgfVxuXG4gICAgaWYgKCFjb25maWcuUkVRVUlSRV9BQ0NFU1NfVE9LRU4pIHJldHVybiBmb3JtYXRVcmwodXJsT2JqZWN0KTtcblxuICAgIGFjY2Vzc1Rva2VuID0gYWNjZXNzVG9rZW4gfHwgY29uZmlnLkFDQ0VTU19UT0tFTjtcbiAgICBpZiAoIWFjY2Vzc1Rva2VuKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEFuIEFQSSBhY2Nlc3MgdG9rZW4gaXMgcmVxdWlyZWQgdG8gdXNlIE1hcGJveCBHTC4gJHtoZWxwfWApO1xuICAgIGlmIChhY2Nlc3NUb2tlblswXSA9PT0gJ3MnKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVzZSBhIHB1YmxpYyBhY2Nlc3MgdG9rZW4gKHBrLiopIHdpdGggTWFwYm94IEdMLCBub3QgYSBzZWNyZXQgYWNjZXNzIHRva2VuIChzay4qKS4gJHtoZWxwfWApO1xuXG4gICAgdXJsT2JqZWN0LnBhcmFtcy5wdXNoKGBhY2Nlc3NfdG9rZW49JHthY2Nlc3NUb2tlbn1gKTtcbiAgICByZXR1cm4gZm9ybWF0VXJsKHVybE9iamVjdCk7XG59XG5cbmZ1bmN0aW9uIGlzTWFwYm94VVJMKHVybDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHVybC5pbmRleE9mKCdtYXBib3g6JykgPT09IDA7XG59XG5cbmNvbnN0IG1hcGJveEhUVFBVUkxSZSA9IC9eKChodHRwcz86KT9cXC9cXC8pPyhbXlxcL10rXFwuKT9tYXBib3hcXC5jKG58b20pKFxcL3xcXD98JCkvaTtcbmZ1bmN0aW9uIGlzTWFwYm94SFRUUFVSTCh1cmw6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBtYXBib3hIVFRQVVJMUmUudGVzdCh1cmwpO1xufVxuXG5jb25zdCBub3JtYWxpemVTdHlsZVVSTCA9IGZ1bmN0aW9uKHVybDogc3RyaW5nLCBhY2Nlc3NUb2tlbj86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCFpc01hcGJveFVSTCh1cmwpKSByZXR1cm4gdXJsO1xuICAgIGNvbnN0IHVybE9iamVjdCA9IHBhcnNlVXJsKHVybCk7XG4gICAgdXJsT2JqZWN0LnBhdGggPSBgL3N0eWxlcy92MSR7dXJsT2JqZWN0LnBhdGh9YDtcbiAgICByZXR1cm4gbWFrZUFQSVVSTCh1cmxPYmplY3QsIGFjY2Vzc1Rva2VuKTtcbn07XG5cbmNvbnN0IG5vcm1hbGl6ZUdseXBoc1VSTCA9IGZ1bmN0aW9uKHVybDogc3RyaW5nLCBhY2Nlc3NUb2tlbj86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCFpc01hcGJveFVSTCh1cmwpKSByZXR1cm4gdXJsO1xuICAgIGNvbnN0IHVybE9iamVjdCA9IHBhcnNlVXJsKHVybCk7XG4gICAgdXJsT2JqZWN0LnBhdGggPSBgL2ZvbnRzL3YxJHt1cmxPYmplY3QucGF0aH1gO1xuICAgIHJldHVybiBtYWtlQVBJVVJMKHVybE9iamVjdCwgYWNjZXNzVG9rZW4pO1xufTtcblxuY29uc3Qgbm9ybWFsaXplU291cmNlVVJMID0gZnVuY3Rpb24odXJsOiBzdHJpbmcsIGFjY2Vzc1Rva2VuPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIWlzTWFwYm94VVJMKHVybCkpIHJldHVybiB1cmw7XG4gICAgY29uc3QgdXJsT2JqZWN0ID0gcGFyc2VVcmwodXJsKTtcbiAgICB1cmxPYmplY3QucGF0aCA9IGAvdjQvJHt1cmxPYmplY3QuYXV0aG9yaXR5fS5qc29uYDtcbiAgICAvLyBUaWxlSlNPTiByZXF1ZXN0cyBuZWVkIGEgc2VjdXJlIGZsYWcgYXBwZW5kZWQgdG8gdGhlaXIgVVJMcyBzb1xuICAgIC8vIHRoYXQgdGhlIHNlcnZlciBrbm93cyB0byBzZW5kIFNTTC1pZmllZCByZXNvdXJjZSByZWZlcmVuY2VzLlxuICAgIHVybE9iamVjdC5wYXJhbXMucHVzaCgnc2VjdXJlJyk7XG4gICAgcmV0dXJuIG1ha2VBUElVUkwodXJsT2JqZWN0LCBhY2Nlc3NUb2tlbik7XG59O1xuXG5jb25zdCBub3JtYWxpemVTcHJpdGVVUkwgPSBmdW5jdGlvbih1cmw6IHN0cmluZywgZm9ybWF0OiBzdHJpbmcsIGV4dGVuc2lvbjogc3RyaW5nLCBhY2Nlc3NUb2tlbj86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgdXJsT2JqZWN0ID0gcGFyc2VVcmwodXJsKTtcbiAgICBpZiAoIWlzTWFwYm94VVJMKHVybCkpIHtcbiAgICAgICAgdXJsT2JqZWN0LnBhdGggKz0gYCR7Zm9ybWF0fSR7ZXh0ZW5zaW9ufWA7XG4gICAgICAgIHJldHVybiBmb3JtYXRVcmwodXJsT2JqZWN0KTtcbiAgICB9XG4gICAgdXJsT2JqZWN0LnBhdGggPSBgL3N0eWxlcy92MSR7dXJsT2JqZWN0LnBhdGh9L3Nwcml0ZSR7Zm9ybWF0fSR7ZXh0ZW5zaW9ufWA7XG4gICAgcmV0dXJuIG1ha2VBUElVUkwodXJsT2JqZWN0LCBhY2Nlc3NUb2tlbik7XG59O1xuXG5jb25zdCBpbWFnZUV4dGVuc2lvblJlID0gLyhcXC4ocG5nfGpwZylcXGQqKSg/PSQpLztcblxuY29uc3Qgbm9ybWFsaXplVGlsZVVSTCA9IGZ1bmN0aW9uKHRpbGVVUkw6IHN0cmluZywgc291cmNlVVJMPzogP3N0cmluZywgdGlsZVNpemU/OiA/bnVtYmVyLCBza3VUb2tlbj86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCFzb3VyY2VVUkwgfHwgIWlzTWFwYm94VVJMKHNvdXJjZVVSTCkpIHJldHVybiB0aWxlVVJMO1xuXG4gICAgY29uc3QgdXJsT2JqZWN0ID0gcGFyc2VVcmwodGlsZVVSTCk7XG5cbiAgICAvLyBUaGUgdjQgbWFwYm94IHRpbGUgQVBJIHN1cHBvcnRzIDUxMng1MTIgaW1hZ2UgdGlsZXMgb25seSB3aGVuIEAyeFxuICAgIC8vIGlzIGFwcGVuZGVkIHRvIHRoZSB0aWxlIFVSTC4gSWYgYHRpbGVTaXplOiA1MTJgIGlzIHNwZWNpZmllZCBmb3JcbiAgICAvLyBhIE1hcGJveCByYXN0ZXIgc291cmNlIGZvcmNlIHRoZSBAMnggc3VmZml4IGV2ZW4gaWYgYSBub24gaGlkcGkgZGV2aWNlLlxuICAgIGNvbnN0IHN1ZmZpeCA9IGJyb3dzZXIuZGV2aWNlUGl4ZWxSYXRpbyA+PSAyIHx8IHRpbGVTaXplID09PSA1MTIgPyAnQDJ4JyA6ICcnO1xuICAgIGNvbnN0IGV4dGVuc2lvbiA9IHdlYnBTdXBwb3J0ZWQuc3VwcG9ydGVkID8gJy53ZWJwJyA6ICckMSc7XG4gICAgdXJsT2JqZWN0LnBhdGggPSB1cmxPYmplY3QucGF0aC5yZXBsYWNlKGltYWdlRXh0ZW5zaW9uUmUsIGAke3N1ZmZpeH0ke2V4dGVuc2lvbn1gKTtcbiAgICB1cmxPYmplY3QucGF0aCA9IGAvdjQke3VybE9iamVjdC5wYXRofWA7XG5cbiAgICBpZiAoY29uZmlnLlJFUVVJUkVfQUNDRVNTX1RPS0VOICYmIGNvbmZpZy5BQ0NFU1NfVE9LRU4gJiYgc2t1VG9rZW4pIHtcbiAgICAgICAgdXJsT2JqZWN0LnBhcmFtcy5wdXNoKGBza3U9JHtza3VUb2tlbn1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbWFrZUFQSVVSTCh1cmxPYmplY3QpO1xufTtcblxuLy8gbWF0Y2hlcyBhbnkgZmlsZSBleHRlbnNpb24gc3BlY2lmaWVkIGJ5IGEgZG90IGFuZCBvbmUgb3IgbW9yZSBhbHBoYW51bWVyaWMgY2hhcmFjdGVyc1xuY29uc3QgZXh0ZW5zaW9uUmUgPSAvXFwuW1xcd10rJC87XG5cbmNvbnN0IGNhbm9uaWNhbGl6ZVRpbGVVUkwgPSBmdW5jdGlvbih1cmw6IHN0cmluZykge1xuICAgIGNvbnN0IHZlcnNpb24gPSBcIi92NC9cIjtcblxuICAgIGNvbnN0IHVybE9iamVjdCA9IHBhcnNlVXJsKHVybCk7XG4gICAgLy8gTWFrZSBzdXJlIHRoYXQgd2UgYXJlIGRlYWxpbmcgd2l0aCBhIHZhbGlkIE1hcGJveCB0aWxlIFVSTC5cbiAgICAvLyBIYXMgdG8gYmVnaW4gd2l0aCAvdjQvLCB3aXRoIGEgdmFsaWQgZmlsZW5hbWUgKyBleHRlbnNpb25cbiAgICBpZiAoIXVybE9iamVjdC5wYXRoLm1hdGNoKC8oXlxcL3Y0XFwvKS8pIHx8ICF1cmxPYmplY3QucGF0aC5tYXRjaChleHRlbnNpb25SZSkpIHtcbiAgICAgICAgLy8gTm90IGEgcHJvcGVyIE1hcGJveCB0aWxlIFVSTC5cbiAgICAgICAgcmV0dXJuIHVybDtcbiAgICB9XG4gICAgLy8gUmVhc3NlbWJsZSB0aGUgY2Fub25pY2FsIFVSTCBmcm9tIHRoZSBwYXJ0cyB3ZSd2ZSBwYXJzZWQgYmVmb3JlLlxuICAgIGxldCByZXN1bHQgPSBcIm1hcGJveDovL3RpbGVzL1wiO1xuICAgIHJlc3VsdCArPSAgdXJsT2JqZWN0LnBhdGgucmVwbGFjZSh2ZXJzaW9uLCAnJyk7XG5cbiAgICAvLyBBcHBlbmQgdGhlIHF1ZXJ5IHN0cmluZywgbWludXMgdGhlIGFjY2VzcyB0b2tlbiBwYXJhbWV0ZXIuXG4gICAgY29uc3QgcGFyYW1zID0gdXJsT2JqZWN0LnBhcmFtcy5maWx0ZXIocCA9PiAhcC5tYXRjaCgvXmFjY2Vzc190b2tlbj0vKSk7XG4gICAgaWYgKHBhcmFtcy5sZW5ndGgpIHJlc3VsdCArPSBgPyR7cGFyYW1zLmpvaW4oJyYnKX1gO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xuXG5jb25zdCBjYW5vbmljYWxpemVUaWxlc2V0ID0gZnVuY3Rpb24odGlsZUpTT046IFRpbGVKU09OLCBzb3VyY2VVUkw6IHN0cmluZykge1xuICAgIGlmICghaXNNYXBib3hVUkwoc291cmNlVVJMKSkgcmV0dXJuIHRpbGVKU09OLnRpbGVzIHx8IFtdO1xuICAgIGNvbnN0IGNhbm9uaWNhbCA9IFtdO1xuICAgIGZvciAoY29uc3QgdXJsIG9mIHRpbGVKU09OLnRpbGVzKSB7XG4gICAgICAgIGNvbnN0IGNhbm9uaWNhbFVybCA9IGNhbm9uaWNhbGl6ZVRpbGVVUkwodXJsKTtcbiAgICAgICAgY2Fub25pY2FsLnB1c2goY2Fub25pY2FsVXJsKTtcbiAgICB9XG4gICAgcmV0dXJuIGNhbm9uaWNhbDtcbn07XG5cbmNvbnN0IHVybFJlID0gL14oXFx3Kyk6XFwvXFwvKFteLz9dKikoXFwvW14/XSspP1xcPz8oLispPy87XG5cbmZ1bmN0aW9uIHBhcnNlVXJsKHVybDogc3RyaW5nKTogVXJsT2JqZWN0IHtcbiAgICBjb25zdCBwYXJ0cyA9IHVybC5tYXRjaCh1cmxSZSk7XG4gICAgaWYgKCFwYXJ0cykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBwYXJzZSBVUkwgb2JqZWN0Jyk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIHByb3RvY29sOiBwYXJ0c1sxXSxcbiAgICAgICAgYXV0aG9yaXR5OiBwYXJ0c1syXSxcbiAgICAgICAgcGF0aDogcGFydHNbM10gfHwgJy8nLFxuICAgICAgICBwYXJhbXM6IHBhcnRzWzRdID8gcGFydHNbNF0uc3BsaXQoJyYnKSA6IFtdXG4gICAgfTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0VXJsKG9iajogVXJsT2JqZWN0KTogc3RyaW5nIHtcbiAgICBjb25zdCBwYXJhbXMgPSBvYmoucGFyYW1zLmxlbmd0aCA/IGA/JHtvYmoucGFyYW1zLmpvaW4oJyYnKX1gIDogJyc7XG4gICAgcmV0dXJuIGAke29iai5wcm90b2NvbH06Ly8ke29iai5hdXRob3JpdHl9JHtvYmoucGF0aH0ke3BhcmFtc31gO1xufVxuXG5leHBvcnQgeyBpc01hcGJveFVSTCwgaXNNYXBib3hIVFRQVVJMIH07XG5cbmNvbnN0IHRlbGVtRXZlbnRLZXkgPSAnbWFwYm94LmV2ZW50RGF0YSc7XG5cbmZ1bmN0aW9uIHBhcnNlQWNjZXNzVG9rZW4oYWNjZXNzVG9rZW46ID9zdHJpbmcpIHtcbiAgICBpZiAoIWFjY2Vzc1Rva2VuKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcnRzID0gYWNjZXNzVG9rZW4uc3BsaXQoJy4nKTtcbiAgICBpZiAoIXBhcnRzIHx8IHBhcnRzLmxlbmd0aCAhPT0gMykge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgICBjb25zdCBqc29uRGF0YSA9IEpTT04ucGFyc2UoYjY0RGVjb2RlVW5pY29kZShwYXJ0c1sxXSkpO1xuICAgICAgICByZXR1cm4ganNvbkRhdGE7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59XG5cbnR5cGUgVGVsZW1ldHJ5RXZlbnRUeXBlID0gJ2FwcFVzZXJUdXJuc3RpbGUnIHwgJ21hcC5sb2FkJztcblxuY2xhc3MgVGVsZW1ldHJ5RXZlbnQge1xuICAgIGV2ZW50RGF0YTogYW55O1xuICAgIGFub25JZDogP3N0cmluZztcbiAgICBxdWV1ZTogQXJyYXk8YW55PjtcbiAgICB0eXBlOiBUZWxlbWV0cnlFdmVudFR5cGU7XG4gICAgcGVuZGluZ1JlcXVlc3Q6ID9DYW5jZWxhYmxlO1xuXG4gICAgY29uc3RydWN0b3IodHlwZTogVGVsZW1ldHJ5RXZlbnRUeXBlKSB7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgIHRoaXMuYW5vbklkID0gbnVsbDtcbiAgICAgICAgdGhpcy5ldmVudERhdGEgPSB7fTtcbiAgICAgICAgdGhpcy5xdWV1ZSA9IFtdO1xuICAgICAgICB0aGlzLnBlbmRpbmdSZXF1ZXN0ID0gbnVsbDtcbiAgICB9XG5cbiAgICBnZXRTdG9yYWdlS2V5KGRvbWFpbjogP3N0cmluZykge1xuICAgICAgICBjb25zdCB0b2tlbkRhdGEgPSBwYXJzZUFjY2Vzc1Rva2VuKGNvbmZpZy5BQ0NFU1NfVE9LRU4pO1xuICAgICAgICBsZXQgdSA9ICcnO1xuICAgICAgICBpZiAodG9rZW5EYXRhICYmIHRva2VuRGF0YVsndSddKSB7XG4gICAgICAgICAgICB1ID0gYjY0RW5jb2RlVW5pY29kZSh0b2tlbkRhdGFbJ3UnXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB1ID0gY29uZmlnLkFDQ0VTU19UT0tFTiB8fCAnJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZG9tYWluID9cbiAgICAgICAgICAgIGAke3RlbGVtRXZlbnRLZXl9LiR7ZG9tYWlufToke3V9YCA6XG4gICAgICAgICAgICBgJHt0ZWxlbUV2ZW50S2V5fToke3V9YDtcbiAgICB9XG5cbiAgICBmZXRjaEV2ZW50RGF0YSgpIHtcbiAgICAgICAgY29uc3QgaXNMb2NhbFN0b3JhZ2VBdmFpbGFibGUgPSBzdG9yYWdlQXZhaWxhYmxlKCdsb2NhbFN0b3JhZ2UnKTtcbiAgICAgICAgY29uc3Qgc3RvcmFnZUtleSA9IHRoaXMuZ2V0U3RvcmFnZUtleSgpO1xuICAgICAgICBjb25zdCB1dWlkS2V5ID0gdGhpcy5nZXRTdG9yYWdlS2V5KCd1dWlkJyk7XG5cbiAgICAgICAgaWYgKGlzTG9jYWxTdG9yYWdlQXZhaWxhYmxlKSB7XG4gICAgICAgICAgICAvL1JldHJpZXZlIGNhY2hlZCBkYXRhXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSB3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0oc3RvcmFnZUtleSk7XG4gICAgICAgICAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ldmVudERhdGEgPSBKU09OLnBhcnNlKGRhdGEpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IHV1aWQgPSB3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0odXVpZEtleSk7XG4gICAgICAgICAgICAgICAgaWYgKHV1aWQpIHRoaXMuYW5vbklkID0gdXVpZDtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICB3YXJuT25jZSgnVW5hYmxlIHRvIHJlYWQgZnJvbSBMb2NhbFN0b3JhZ2UnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNhdmVFdmVudERhdGEoKSB7XG4gICAgICAgIGNvbnN0IGlzTG9jYWxTdG9yYWdlQXZhaWxhYmxlID0gc3RvcmFnZUF2YWlsYWJsZSgnbG9jYWxTdG9yYWdlJyk7XG4gICAgICAgIGNvbnN0IHN0b3JhZ2VLZXkgPSAgdGhpcy5nZXRTdG9yYWdlS2V5KCk7XG4gICAgICAgIGNvbnN0IHV1aWRLZXkgPSB0aGlzLmdldFN0b3JhZ2VLZXkoJ3V1aWQnKTtcbiAgICAgICAgaWYgKGlzTG9jYWxTdG9yYWdlQXZhaWxhYmxlKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbSh1dWlkS2V5LCB0aGlzLmFub25JZCk7XG4gICAgICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuZXZlbnREYXRhKS5sZW5ndGggPj0gMSkge1xuICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0oc3RvcmFnZUtleSwgSlNPTi5zdHJpbmdpZnkodGhpcy5ldmVudERhdGEpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgd2Fybk9uY2UoJ1VuYWJsZSB0byB3cml0ZSB0byBMb2NhbFN0b3JhZ2UnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgfVxuXG4gICAgcHJvY2Vzc1JlcXVlc3RzKCkge31cblxuICAgIC8qXG4gICAgKiBJZiBhbnkgZXZlbnQgZGF0YSBzaG91bGQgYmUgcGVyc2lzdGVkIGFmdGVyIHRoZSBQT1NUIHJlcXVlc3QsIHRoZSBjYWxsYmFjayBzaG91bGQgbW9kaWZ5IGV2ZW50RGF0YWBcbiAgICAqIHRvIHRoZSB2YWx1ZXMgdGhhdCBzaG91bGQgYmUgc2F2ZWQuIEZvciB0aGlzIHJlYXNvbiwgdGhlIGNhbGxiYWNrIHNob3VsZCBiZSBpbnZva2VkIHByaW9yIHRvIHRoZSBjYWxsXG4gICAgKiB0byBUZWxlbWV0cnlFdmVudCNzYXZlRGF0YVxuICAgICovXG4gICAgcG9zdEV2ZW50KHRpbWVzdGFtcDogbnVtYmVyLCBhZGRpdGlvbmFsUGF5bG9hZDoge1tzdHJpbmddOiBhbnl9LCBjYWxsYmFjazogKGVycjogP0Vycm9yKSA9PiB2b2lkKSB7XG4gICAgICAgIGlmICghY29uZmlnLkVWRU5UU19VUkwpIHJldHVybjtcbiAgICAgICAgY29uc3QgZXZlbnRzVXJsT2JqZWN0OiBVcmxPYmplY3QgPSBwYXJzZVVybChjb25maWcuRVZFTlRTX1VSTCk7XG4gICAgICAgIGV2ZW50c1VybE9iamVjdC5wYXJhbXMucHVzaChgYWNjZXNzX3Rva2VuPSR7Y29uZmlnLkFDQ0VTU19UT0tFTiB8fCAnJ31gKTtcbiAgICAgICAgY29uc3QgcGF5bG9hZDogT2JqZWN0ID0ge1xuICAgICAgICAgICAgZXZlbnQ6IHRoaXMudHlwZSxcbiAgICAgICAgICAgIGNyZWF0ZWQ6IG5ldyBEYXRlKHRpbWVzdGFtcCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgICAgIHNka0lkZW50aWZpZXI6ICdtYXBib3gtZ2wtanMnLFxuICAgICAgICAgICAgc2RrVmVyc2lvbixcbiAgICAgICAgICAgIHNrdUlkOiBTS1VfSUQsXG4gICAgICAgICAgICB1c2VySWQ6IHRoaXMuYW5vbklkXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgZmluYWxQYXlsb2FkID0gYWRkaXRpb25hbFBheWxvYWQgPyBleHRlbmQocGF5bG9hZCwgYWRkaXRpb25hbFBheWxvYWQpIDogcGF5bG9hZDtcbiAgICAgICAgY29uc3QgcmVxdWVzdDogUmVxdWVzdFBhcmFtZXRlcnMgPSB7XG4gICAgICAgICAgICB1cmw6IGZvcm1hdFVybChldmVudHNVcmxPYmplY3QpLFxuICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAndGV4dC9wbGFpbicgLy9Ta2lwIHRoZSBwcmUtZmxpZ2h0IE9QVElPTlMgcmVxdWVzdFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KFtmaW5hbFBheWxvYWRdKVxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMucGVuZGluZ1JlcXVlc3QgPSBwb3N0RGF0YShyZXF1ZXN0LCAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgIHRoaXMucGVuZGluZ1JlcXVlc3QgPSBudWxsO1xuICAgICAgICAgICAgY2FsbGJhY2soZXJyb3IpO1xuICAgICAgICAgICAgdGhpcy5zYXZlRXZlbnREYXRhKCk7XG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NSZXF1ZXN0cygpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBxdWV1ZVJlcXVlc3QoZXZlbnQ6IG51bWJlciB8IHtpZDogbnVtYmVyLCB0aW1lc3RhbXA6IG51bWJlcn0pIHtcbiAgICAgICAgdGhpcy5xdWV1ZS5wdXNoKGV2ZW50KTtcbiAgICAgICAgdGhpcy5wcm9jZXNzUmVxdWVzdHMoKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBNYXBMb2FkRXZlbnQgZXh0ZW5kcyBUZWxlbWV0cnlFdmVudCB7XG4gICAgK3N1Y2Nlc3M6IHtbbnVtYmVyXTogYm9vbGVhbn07XG4gICAgc2t1VG9rZW46IHN0cmluZztcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcignbWFwLmxvYWQnKTtcbiAgICAgICAgdGhpcy5zdWNjZXNzID0ge307XG4gICAgICAgIHRoaXMuc2t1VG9rZW4gPSAnJztcbiAgICB9XG5cbiAgICBwb3N0TWFwTG9hZEV2ZW50KHRpbGVVcmxzOiBBcnJheTxzdHJpbmc+LCBtYXBJZDogbnVtYmVyLCBza3VUb2tlbjogc3RyaW5nKSB7XG4gICAgICAgIC8vRW5hYmxlZCBvbmx5IHdoZW4gTWFwYm94IEFjY2VzcyBUb2tlbiBpcyBzZXQgYW5kIGEgc291cmNlIHVzZXNcbiAgICAgICAgLy8gbWFwYm94IHRpbGVzLlxuICAgICAgICB0aGlzLnNrdVRva2VuID0gc2t1VG9rZW47XG5cbiAgICAgICAgaWYgKGNvbmZpZy5FVkVOVFNfVVJMICYmXG4gICAgICAgICAgICBjb25maWcuQUNDRVNTX1RPS0VOICYmXG4gICAgICAgICAgICBBcnJheS5pc0FycmF5KHRpbGVVcmxzKSAmJlxuICAgICAgICAgICAgdGlsZVVybHMuc29tZSh1cmwgPT4gaXNNYXBib3hVUkwodXJsKSB8fCBpc01hcGJveEhUVFBVUkwodXJsKSkpIHtcbiAgICAgICAgICAgIHRoaXMucXVldWVSZXF1ZXN0KHtpZDogbWFwSWQsIHRpbWVzdGFtcDogRGF0ZS5ub3coKX0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvY2Vzc1JlcXVlc3RzKCkge1xuICAgICAgICBpZiAodGhpcy5wZW5kaW5nUmVxdWVzdCB8fCB0aGlzLnF1ZXVlLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgICAgICBjb25zdCB7aWQsIHRpbWVzdGFtcH0gPSB0aGlzLnF1ZXVlLnNoaWZ0KCk7XG5cbiAgICAgICAgLy8gT25seSBvbmUgbG9hZCBldmVudCBzaG91bGQgZmlyZSBwZXIgbWFwXG4gICAgICAgIGlmIChpZCAmJiB0aGlzLnN1Y2Nlc3NbaWRdKSByZXR1cm47XG5cbiAgICAgICAgaWYgKCF0aGlzLmFub25JZCkge1xuICAgICAgICAgICAgdGhpcy5mZXRjaEV2ZW50RGF0YSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF2YWxpZGF0ZVV1aWQodGhpcy5hbm9uSWQpKSB7XG4gICAgICAgICAgICB0aGlzLmFub25JZCA9IHV1aWQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucG9zdEV2ZW50KHRpbWVzdGFtcCwge3NrdVRva2VuOiB0aGlzLnNrdVRva2VufSwgKGVycikgPT4ge1xuICAgICAgICAgICAgaWYgKCFlcnIpIHtcbiAgICAgICAgICAgICAgICBpZiAoaWQpIHRoaXMuc3VjY2Vzc1tpZF0gPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBUdXJuc3RpbGVFdmVudCBleHRlbmRzIFRlbGVtZXRyeUV2ZW50IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoJ2FwcFVzZXJUdXJuc3RpbGUnKTtcbiAgICB9XG5cbiAgICBwb3N0VHVybnN0aWxlRXZlbnQodGlsZVVybHM6IEFycmF5PHN0cmluZz4pIHtcbiAgICAgICAgLy9FbmFibGVkIG9ubHkgd2hlbiBNYXBib3ggQWNjZXNzIFRva2VuIGlzIHNldCBhbmQgYSBzb3VyY2UgdXNlc1xuICAgICAgICAvLyBtYXBib3ggdGlsZXMuXG4gICAgICAgIGlmIChjb25maWcuRVZFTlRTX1VSTCAmJlxuICAgICAgICAgICAgY29uZmlnLkFDQ0VTU19UT0tFTiAmJlxuICAgICAgICAgICAgQXJyYXkuaXNBcnJheSh0aWxlVXJscykgJiZcbiAgICAgICAgICAgIHRpbGVVcmxzLnNvbWUodXJsID0+IGlzTWFwYm94VVJMKHVybCkgfHwgaXNNYXBib3hIVFRQVVJMKHVybCkpKSB7XG4gICAgICAgICAgICB0aGlzLnF1ZXVlUmVxdWVzdChEYXRlLm5vdygpKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG4gICAgcHJvY2Vzc1JlcXVlc3RzKCkge1xuICAgICAgICBpZiAodGhpcy5wZW5kaW5nUmVxdWVzdCB8fCB0aGlzLnF1ZXVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLmFub25JZCB8fCAhdGhpcy5ldmVudERhdGEubGFzdFN1Y2Nlc3MgfHwgIXRoaXMuZXZlbnREYXRhLnRva2VuVSkge1xuICAgICAgICAgICAgLy9SZXRyaWV2ZSBjYWNoZWQgZGF0YVxuICAgICAgICAgICAgdGhpcy5mZXRjaEV2ZW50RGF0YSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdG9rZW5EYXRhID0gcGFyc2VBY2Nlc3NUb2tlbihjb25maWcuQUNDRVNTX1RPS0VOKTtcbiAgICAgICAgY29uc3QgdG9rZW5VID0gdG9rZW5EYXRhID8gdG9rZW5EYXRhWyd1J10gOiBjb25maWcuQUNDRVNTX1RPS0VOO1xuICAgICAgICAvL1Jlc2V0IGV2ZW50IGRhdGEgY2FjaGUgaWYgdGhlIGFjY2VzcyB0b2tlbiBvd25lciBjaGFuZ2VkLlxuICAgICAgICBsZXQgZHVlRm9yRXZlbnQgPSB0b2tlblUgIT09IHRoaXMuZXZlbnREYXRhLnRva2VuVTtcblxuICAgICAgICBpZiAoIXZhbGlkYXRlVXVpZCh0aGlzLmFub25JZCkpIHtcbiAgICAgICAgICAgIHRoaXMuYW5vbklkID0gdXVpZCgpO1xuICAgICAgICAgICAgZHVlRm9yRXZlbnQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbmV4dFVwZGF0ZSA9IHRoaXMucXVldWUuc2hpZnQoKTtcbiAgICAgICAgLy8gUmVjb3JkIHR1cm5zdGlsZSBldmVudCBvbmNlIHBlciBjYWxlbmRhciBkYXkuXG4gICAgICAgIGlmICh0aGlzLmV2ZW50RGF0YS5sYXN0U3VjY2Vzcykge1xuICAgICAgICAgICAgY29uc3QgbGFzdFVwZGF0ZSA9IG5ldyBEYXRlKHRoaXMuZXZlbnREYXRhLmxhc3RTdWNjZXNzKTtcbiAgICAgICAgICAgIGNvbnN0IG5leHREYXRlID0gbmV3IERhdGUobmV4dFVwZGF0ZSk7XG4gICAgICAgICAgICBjb25zdCBkYXlzRWxhcHNlZCA9IChuZXh0VXBkYXRlIC0gdGhpcy5ldmVudERhdGEubGFzdFN1Y2Nlc3MpIC8gKDI0ICogNjAgKiA2MCAqIDEwMDApO1xuICAgICAgICAgICAgZHVlRm9yRXZlbnQgPSBkdWVGb3JFdmVudCB8fCBkYXlzRWxhcHNlZCA+PSAxIHx8IGRheXNFbGFwc2VkIDwgLTEgfHwgbGFzdFVwZGF0ZS5nZXREYXRlKCkgIT09IG5leHREYXRlLmdldERhdGUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGR1ZUZvckV2ZW50ID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghZHVlRm9yRXZlbnQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NSZXF1ZXN0cygpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5wb3N0RXZlbnQobmV4dFVwZGF0ZSwge1wiZW5hYmxlZC50ZWxlbWV0cnlcIjogZmFsc2V9LCAoZXJyKSA9PiB7XG4gICAgICAgICAgICBpZiAoIWVycikge1xuICAgICAgICAgICAgICAgIHRoaXMuZXZlbnREYXRhLmxhc3RTdWNjZXNzID0gbmV4dFVwZGF0ZTtcbiAgICAgICAgICAgICAgICB0aGlzLmV2ZW50RGF0YS50b2tlblUgPSB0b2tlblU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuY29uc3QgdHVybnN0aWxlRXZlbnRfID0gbmV3IFR1cm5zdGlsZUV2ZW50KCk7XG5leHBvcnQgY29uc3QgcG9zdFR1cm5zdGlsZUV2ZW50ID0gdHVybnN0aWxlRXZlbnRfLnBvc3RUdXJuc3RpbGVFdmVudC5iaW5kKHR1cm5zdGlsZUV2ZW50Xyk7XG5cbmNvbnN0IG1hcExvYWRFdmVudF8gPSBuZXcgTWFwTG9hZEV2ZW50KCk7XG5leHBvcnQgY29uc3QgcG9zdE1hcExvYWRFdmVudCA9IG1hcExvYWRFdmVudF8ucG9zdE1hcExvYWRFdmVudC5iaW5kKG1hcExvYWRFdmVudF8pO1xuXG4vKioqKiogRU5EIFdBUk5JTkcgLSBSRU1PVkFMIE9SIE1PRElGSUNBVElPTiBPRiBUSEVcblBSRUNFRElORyBDT0RFIFZJT0xBVEVTIFRIRSBNQVBCT1ggVEVSTVMgT0YgU0VSVklDRSAgKioqKioqL1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHdpbmRvdyBmcm9tICcuL3dpbmRvdyc7XG5pbXBvcnQgeyBleHRlbmQgfSBmcm9tICcuL3V0aWwnO1xuaW1wb3J0IHsgaXNNYXBib3hIVFRQVVJMIH0gZnJvbSAnLi9tYXBib3gnO1xuaW1wb3J0IGNvbmZpZyBmcm9tICcuL2NvbmZpZyc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5cbmltcG9ydCB0eXBlIHsgQ2FsbGJhY2sgfSBmcm9tICcuLi90eXBlcy9jYWxsYmFjayc7XG5pbXBvcnQgdHlwZSB7IENhbmNlbGFibGUgfSBmcm9tICcuLi90eXBlcy9jYW5jZWxhYmxlJztcblxuLyoqXG4gKiBUaGUgdHlwZSBvZiBhIHJlc291cmNlLlxuICogQHByaXZhdGVcbiAqIEByZWFkb25seVxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuY29uc3QgUmVzb3VyY2VUeXBlID0ge1xuICAgIFVua25vd246ICdVbmtub3duJyxcbiAgICBTdHlsZTogJ1N0eWxlJyxcbiAgICBTb3VyY2U6ICdTb3VyY2UnLFxuICAgIFRpbGU6ICdUaWxlJyxcbiAgICBHbHlwaHM6ICdHbHlwaHMnLFxuICAgIFNwcml0ZUltYWdlOiAnU3ByaXRlSW1hZ2UnLFxuICAgIFNwcml0ZUpTT046ICdTcHJpdGVKU09OJyxcbiAgICBJbWFnZTogJ0ltYWdlJ1xufTtcbmV4cG9ydCB7IFJlc291cmNlVHlwZSB9O1xuXG5pZiAodHlwZW9mIE9iamVjdC5mcmVlemUgPT0gJ2Z1bmN0aW9uJykge1xuICAgIE9iamVjdC5mcmVlemUoUmVzb3VyY2VUeXBlKTtcbn1cblxuLyoqXG4gKiBBIGBSZXF1ZXN0UGFyYW1ldGVyc2Agb2JqZWN0IHRvIGJlIHJldHVybmVkIGZyb20gTWFwLm9wdGlvbnMudHJhbnNmb3JtUmVxdWVzdCBjYWxsYmFja3MuXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBSZXF1ZXN0UGFyYW1ldGVyc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IHVybCBUaGUgVVJMIHRvIGJlIHJlcXVlc3RlZC5cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBoZWFkZXJzIFRoZSBoZWFkZXJzIHRvIGJlIHNlbnQgd2l0aCB0aGUgcmVxdWVzdC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjcmVkZW50aWFscyBgJ3NhbWUtb3JpZ2luJ3wnaW5jbHVkZSdgIFVzZSAnaW5jbHVkZScgdG8gc2VuZCBjb29raWVzIHdpdGggY3Jvc3Mtb3JpZ2luIHJlcXVlc3RzLlxuICovXG5leHBvcnQgdHlwZSBSZXF1ZXN0UGFyYW1ldGVycyA9IHtcbiAgICB1cmw6IHN0cmluZyxcbiAgICBoZWFkZXJzPzogT2JqZWN0LFxuICAgIG1ldGhvZD86ICdHRVQnIHwgJ1BPU1QnIHwgJ1BVVCcsXG4gICAgYm9keT86IHN0cmluZyxcbiAgICB0eXBlPzogJ3N0cmluZycgfCAnanNvbicgfCAnYXJyYXlCdWZmZXInLFxuICAgIGNyZWRlbnRpYWxzPzogJ3NhbWUtb3JpZ2luJyB8ICdpbmNsdWRlJyxcbiAgICBjb2xsZWN0UmVzb3VyY2VUaW1pbmc/OiBib29sZWFuXG59O1xuXG5leHBvcnQgdHlwZSBSZXNwb25zZUNhbGxiYWNrPFQ+ID0gKGVycm9yOiA/RXJyb3IsIGRhdGE6ID9ULCBjYWNoZUNvbnRyb2w6ID9zdHJpbmcsIGV4cGlyZXM6ID9zdHJpbmcpID0+IHZvaWQ7XG5cbmNsYXNzIEFKQVhFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBzdGF0dXM6IG51bWJlcjtcbiAgICB1cmw6IHN0cmluZztcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIHN0YXR1czogbnVtYmVyLCB1cmw6IHN0cmluZykge1xuICAgICAgICBpZiAoc3RhdHVzID09PSA0MDEgJiYgaXNNYXBib3hIVFRQVVJMKHVybCkpIHtcbiAgICAgICAgICAgIG1lc3NhZ2UgKz0gJzogeW91IG1heSBoYXZlIHByb3ZpZGVkIGFuIGludmFsaWQgTWFwYm94IGFjY2VzcyB0b2tlbi4gU2VlIGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vYXBpLWRvY3VtZW50YXRpb24vI2FjY2Vzcy10b2tlbnMtYW5kLXRva2VuLXNjb3Blcyc7XG4gICAgICAgIH1cbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzO1xuICAgICAgICB0aGlzLnVybCA9IHVybDtcblxuICAgICAgICAvLyB3b3JrIGFyb3VuZCBmb3IgaHR0cHM6Ly9naXRodWIuY29tL1JpY2gtSGFycmlzL2J1YmxlL2lzc3Vlcy80MFxuICAgICAgICB0aGlzLm5hbWUgPSB0aGlzLmNvbnN0cnVjdG9yLm5hbWU7XG4gICAgICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgfVxuXG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiBgJHt0aGlzLm5hbWV9OiAke3RoaXMubWVzc2FnZX0gKCR7dGhpcy5zdGF0dXN9KTogJHt0aGlzLnVybH1gO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gaXNXb3JrZXIoKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBXb3JrZXJHbG9iYWxTY29wZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgICAgIHNlbGYgaW5zdGFuY2VvZiBXb3JrZXJHbG9iYWxTY29wZTtcbn1cblxuLy8gRW5zdXJlIHRoYXQgd2UncmUgc2VuZGluZyB0aGUgY29ycmVjdCByZWZlcnJlciBmcm9tIGJsb2IgVVJMIHdvcmtlciBidW5kbGVzLlxuLy8gRm9yIGZpbGVzIGxvYWRlZCBmcm9tIHRoZSBsb2NhbCBmaWxlIHN5c3RlbSwgYGxvY2F0aW9uLm9yaWdpbmAgd2lsbCBiZSBzZXRcbi8vIHRvIHRoZSBzdHJpbmcoISkgXCJudWxsXCIgKEZpcmVmb3gpLCBvciBcImZpbGU6Ly9cIiAoQ2hyb21lLCBTYWZhcmksIEVkZ2UsIElFKSxcbi8vIGFuZCB3ZSB3aWxsIHNldCBhbiBlbXB0eSByZWZlcnJlci4gT3RoZXJ3aXNlLCB3ZSdyZSB1c2luZyB0aGUgZG9jdW1lbnQncyBVUkwuXG4vKiBnbG9iYWwgc2VsZiwgV29ya2VyR2xvYmFsU2NvcGUgKi9cbmV4cG9ydCBjb25zdCBnZXRSZWZlcnJlciA9IGlzV29ya2VyKCkgP1xuICAgICgpID0+IHNlbGYud29ya2VyICYmIHNlbGYud29ya2VyLnJlZmVycmVyIDpcbiAgICAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG9yaWdpbiA9IHdpbmRvdy5sb2NhdGlvbi5vcmlnaW47XG4gICAgICAgIGlmIChvcmlnaW4gJiYgb3JpZ2luICE9PSAnbnVsbCcgJiYgb3JpZ2luICE9PSAnZmlsZTovLycpIHtcbiAgICAgICAgICAgIHJldHVybiBvcmlnaW4gKyB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWU7XG4gICAgICAgIH1cbiAgICB9O1xuXG5mdW5jdGlvbiBtYWtlRmV0Y2hSZXF1ZXN0KHJlcXVlc3RQYXJhbWV0ZXJzOiBSZXF1ZXN0UGFyYW1ldGVycywgY2FsbGJhY2s6IFJlc3BvbnNlQ2FsbGJhY2s8YW55Pik6IENhbmNlbGFibGUge1xuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgd2luZG93LkFib3J0Q29udHJvbGxlcigpO1xuICAgIGNvbnN0IHJlcXVlc3QgPSBuZXcgd2luZG93LlJlcXVlc3QocmVxdWVzdFBhcmFtZXRlcnMudXJsLCB7XG4gICAgICAgIG1ldGhvZDogcmVxdWVzdFBhcmFtZXRlcnMubWV0aG9kIHx8ICdHRVQnLFxuICAgICAgICBib2R5OiByZXF1ZXN0UGFyYW1ldGVycy5ib2R5LFxuICAgICAgICBjcmVkZW50aWFsczogcmVxdWVzdFBhcmFtZXRlcnMuY3JlZGVudGlhbHMsXG4gICAgICAgIGhlYWRlcnM6IHJlcXVlc3RQYXJhbWV0ZXJzLmhlYWRlcnMsXG4gICAgICAgIHJlZmVycmVyOiBnZXRSZWZlcnJlcigpLFxuICAgICAgICBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsXG4gICAgfSk7XG5cbiAgICBpZiAocmVxdWVzdFBhcmFtZXRlcnMudHlwZSA9PT0gJ2pzb24nKSB7XG4gICAgICAgIHJlcXVlc3QuaGVhZGVycy5zZXQoJ0FjY2VwdCcsICdhcHBsaWNhdGlvbi9qc29uJyk7XG4gICAgfVxuXG4gICAgd2luZG93LmZldGNoKHJlcXVlc3QpLnRoZW4ocmVzcG9uc2UgPT4ge1xuICAgICAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgIHJlc3BvbnNlW3JlcXVlc3RQYXJhbWV0ZXJzLnR5cGUgfHwgJ3RleHQnXSgpLnRoZW4ocmVzdWx0ID0+IHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCByZXN1bHQsIHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdDYWNoZS1Db250cm9sJyksIHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdFeHBpcmVzJykpO1xuICAgICAgICAgICAgfSkuY2F0Y2goZXJyID0+IGNhbGxiYWNrKG5ldyBFcnJvcihlcnIubWVzc2FnZSkpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKG5ldyBBSkFYRXJyb3IocmVzcG9uc2Uuc3RhdHVzVGV4dCwgcmVzcG9uc2Uuc3RhdHVzLCByZXF1ZXN0UGFyYW1ldGVycy51cmwpKTtcbiAgICAgICAgfVxuICAgIH0pLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IuY29kZSA9PT0gMjApIHtcbiAgICAgICAgICAgIC8vIHNpbGVuY2UgZXhwZWN0ZWQgQWJvcnRFcnJvclxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNhbGxiYWNrKG5ldyBFcnJvcihlcnJvci5tZXNzYWdlKSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4geyBjYW5jZWw6ICgpID0+IGNvbnRyb2xsZXIuYWJvcnQoKSB9O1xufVxuXG5mdW5jdGlvbiBtYWtlWE1MSHR0cFJlcXVlc3QocmVxdWVzdFBhcmFtZXRlcnM6IFJlcXVlc3RQYXJhbWV0ZXJzLCBjYWxsYmFjazogUmVzcG9uc2VDYWxsYmFjazxhbnk+KTogQ2FuY2VsYWJsZSB7XG4gICAgY29uc3QgeGhyOiBYTUxIdHRwUmVxdWVzdCA9IG5ldyB3aW5kb3cuWE1MSHR0cFJlcXVlc3QoKTtcblxuICAgIHhoci5vcGVuKHJlcXVlc3RQYXJhbWV0ZXJzLm1ldGhvZCB8fCAnR0VUJywgcmVxdWVzdFBhcmFtZXRlcnMudXJsLCB0cnVlKTtcbiAgICBpZiAocmVxdWVzdFBhcmFtZXRlcnMudHlwZSA9PT0gJ2FycmF5QnVmZmVyJykge1xuICAgICAgICB4aHIucmVzcG9uc2VUeXBlID0gJ2FycmF5YnVmZmVyJztcbiAgICB9XG4gICAgZm9yIChjb25zdCBrIGluIHJlcXVlc3RQYXJhbWV0ZXJzLmhlYWRlcnMpIHtcbiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoaywgcmVxdWVzdFBhcmFtZXRlcnMuaGVhZGVyc1trXSk7XG4gICAgfVxuICAgIGlmIChyZXF1ZXN0UGFyYW1ldGVycy50eXBlID09PSAnanNvbicpIHtcbiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoJ0FjY2VwdCcsICdhcHBsaWNhdGlvbi9qc29uJyk7XG4gICAgfVxuICAgIHhoci53aXRoQ3JlZGVudGlhbHMgPSByZXF1ZXN0UGFyYW1ldGVycy5jcmVkZW50aWFscyA9PT0gJ2luY2x1ZGUnO1xuICAgIHhoci5vbmVycm9yID0gKCkgPT4ge1xuICAgICAgICBjYWxsYmFjayhuZXcgRXJyb3IoeGhyLnN0YXR1c1RleHQpKTtcbiAgICB9O1xuICAgIHhoci5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgIGlmICgoKHhoci5zdGF0dXMgPj0gMjAwICYmIHhoci5zdGF0dXMgPCAzMDApIHx8IHhoci5zdGF0dXMgPT09IDApICYmIHhoci5yZXNwb25zZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgbGV0IGRhdGE6IG1peGVkID0geGhyLnJlc3BvbnNlO1xuICAgICAgICAgICAgaWYgKHJlcXVlc3RQYXJhbWV0ZXJzLnR5cGUgPT09ICdqc29uJykge1xuICAgICAgICAgICAgICAgIC8vIFdlJ3JlIG1hbnVhbGx5IHBhcnNpbmcgSlNPTiBoZXJlIHRvIGdldCBiZXR0ZXIgZXJyb3IgbWVzc2FnZXMuXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YSA9IEpTT04ucGFyc2UoeGhyLnJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgZGF0YSwgeGhyLmdldFJlc3BvbnNlSGVhZGVyKCdDYWNoZS1Db250cm9sJyksIHhoci5nZXRSZXNwb25zZUhlYWRlcignRXhwaXJlcycpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKG5ldyBBSkFYRXJyb3IoeGhyLnN0YXR1c1RleHQsIHhoci5zdGF0dXMsIHJlcXVlc3RQYXJhbWV0ZXJzLnVybCkpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICB4aHIuc2VuZChyZXF1ZXN0UGFyYW1ldGVycy5ib2R5KTtcbiAgICByZXR1cm4geyBjYW5jZWw6ICgpID0+IHhoci5hYm9ydCgpIH07XG59XG5cbmV4cG9ydCBjb25zdCBtYWtlUmVxdWVzdCA9IGZ1bmN0aW9uKHJlcXVlc3RQYXJhbWV0ZXJzOiBSZXF1ZXN0UGFyYW1ldGVycywgY2FsbGJhY2s6IFJlc3BvbnNlQ2FsbGJhY2s8YW55Pik6IENhbmNlbGFibGUge1xuICAgIC8vIFdlJ3JlIHRyeWluZyB0byB1c2UgdGhlIEZldGNoIEFQSSBpZiBwb3NzaWJsZS4gSG93ZXZlciwgaW4gc29tZSBzaXR1YXRpb25zIHdlIGNhbid0IHVzZSBpdDpcbiAgICAvLyAtIElFMTEgZG9lc24ndCBzdXBwb3J0IGl0IGF0IGFsbC4gSW4gdGhpcyBjYXNlLCB3ZSBkaXNwYXRjaCB0aGUgcmVxdWVzdCB0byB0aGUgbWFpbiB0aHJlYWQgc29cbiAgICAvLyAgIHRoYXQgd2UgY2FuIGdldCBhbiBhY2NydWF0ZSByZWZlcnJlciBoZWFkZXIuXG4gICAgLy8gLSBTYWZhcmkgZXhwb3NlcyB3aW5kb3cuQWJvcnRDb250cm9sbGVyLCBidXQgaXQgZG9lc24ndCB3b3JrIGFjdHVhbGx5IGFib3J0IGFueSByZXF1ZXN0cyBpblxuICAgIC8vICAgc29tZSB2ZXJzaW9ucyAoc2VlIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNzQ5ODAjYzIpXG4gICAgLy8gLSBSZXF1ZXN0cyBmb3IgcmVzb3VyY2VzIHdpdGggdGhlIGZpbGU6Ly8gVVJJIHNjaGVtZSBkb24ndCB3b3JrIHdpdGggdGhlIEZldGNoIEFQSSBlaXRoZXIuIEluXG4gICAgLy8gICB0aGlzIGNhc2Ugd2UgdW5jb25kaXRpb25hbGx5IHVzZSBYSFIgb24gdGhlIGN1cnJlbnQgdGhyZWFkIHNpbmNlIHJlZmVycmVycyBkb24ndCBtYXR0ZXIuXG4gICAgaWYgKCEvXmZpbGU6Ly50ZXN0KHJlcXVlc3RQYXJhbWV0ZXJzLnVybCkpIHtcbiAgICAgICAgaWYgKHdpbmRvdy5mZXRjaCAmJiB3aW5kb3cuUmVxdWVzdCAmJiB3aW5kb3cuQWJvcnRDb250cm9sbGVyICYmIHdpbmRvdy5SZXF1ZXN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSgnc2lnbmFsJykpIHtcbiAgICAgICAgICAgIHJldHVybiBtYWtlRmV0Y2hSZXF1ZXN0KHJlcXVlc3RQYXJhbWV0ZXJzLCBjYWxsYmFjayk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzV29ya2VyKCkgJiYgc2VsZi53b3JrZXIgJiYgc2VsZi53b3JrZXIuYWN0b3IpIHtcbiAgICAgICAgICAgIHJldHVybiBzZWxmLndvcmtlci5hY3Rvci5zZW5kKCdnZXRSZXNvdXJjZScsIHJlcXVlc3RQYXJhbWV0ZXJzLCBjYWxsYmFjayk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1ha2VYTUxIdHRwUmVxdWVzdChyZXF1ZXN0UGFyYW1ldGVycywgY2FsbGJhY2spO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEpTT04gPSBmdW5jdGlvbihyZXF1ZXN0UGFyYW1ldGVyczogUmVxdWVzdFBhcmFtZXRlcnMsIGNhbGxiYWNrOiBSZXNwb25zZUNhbGxiYWNrPE9iamVjdD4pOiBDYW5jZWxhYmxlIHtcbiAgICByZXR1cm4gbWFrZVJlcXVlc3QoZXh0ZW5kKHJlcXVlc3RQYXJhbWV0ZXJzLCB7IHR5cGU6ICdqc29uJyB9KSwgY2FsbGJhY2spO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEFycmF5QnVmZmVyID0gZnVuY3Rpb24ocmVxdWVzdFBhcmFtZXRlcnM6IFJlcXVlc3RQYXJhbWV0ZXJzLCBjYWxsYmFjazogUmVzcG9uc2VDYWxsYmFjazxBcnJheUJ1ZmZlcj4pOiBDYW5jZWxhYmxlIHtcbiAgICByZXR1cm4gbWFrZVJlcXVlc3QoZXh0ZW5kKHJlcXVlc3RQYXJhbWV0ZXJzLCB7IHR5cGU6ICdhcnJheUJ1ZmZlcicgfSksIGNhbGxiYWNrKTtcbn07XG5cbmV4cG9ydCBjb25zdCBwb3N0RGF0YSA9IGZ1bmN0aW9uKHJlcXVlc3RQYXJhbWV0ZXJzOiBSZXF1ZXN0UGFyYW1ldGVycywgY2FsbGJhY2s6IFJlc3BvbnNlQ2FsbGJhY2s8c3RyaW5nPik6IENhbmNlbGFibGUge1xuICAgIHJldHVybiBtYWtlUmVxdWVzdChleHRlbmQocmVxdWVzdFBhcmFtZXRlcnMsIHsgbWV0aG9kOiAnUE9TVCcgfSksIGNhbGxiYWNrKTtcbn07XG5cbmZ1bmN0aW9uIHNhbWVPcmlnaW4odXJsKSB7XG4gICAgY29uc3QgYTogSFRNTEFuY2hvckVsZW1lbnQgPSB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgIGEuaHJlZiA9IHVybDtcbiAgICByZXR1cm4gYS5wcm90b2NvbCA9PT0gd2luZG93LmRvY3VtZW50LmxvY2F0aW9uLnByb3RvY29sICYmIGEuaG9zdCA9PT0gd2luZG93LmRvY3VtZW50LmxvY2F0aW9uLmhvc3Q7XG59XG5cbmNvbnN0IHRyYW5zcGFyZW50UG5nVXJsID0gJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQUVBQUFBQkNBWUFBQUFmRmNTSkFBQUFDMGxFUVZRWVYyTmdBQUlBQUFVQUFhclZ5RkVBQUFBQVNVVk9SSzVDWUlJPSc7XG5cbmxldCBpbWFnZVF1ZXVlLCBudW1JbWFnZVJlcXVlc3RzO1xuZXhwb3J0IGNvbnN0IHJlc2V0SW1hZ2VSZXF1ZXN0UXVldWUgPSAoKSA9PiB7XG4gICAgaW1hZ2VRdWV1ZSA9IFtdO1xuICAgIG51bUltYWdlUmVxdWVzdHMgPSAwO1xufTtcbnJlc2V0SW1hZ2VSZXF1ZXN0UXVldWUoKTtcblxuZXhwb3J0IGNvbnN0IGdldEltYWdlID0gZnVuY3Rpb24ocmVxdWVzdFBhcmFtZXRlcnM6IFJlcXVlc3RQYXJhbWV0ZXJzLCBjYWxsYmFjazogQ2FsbGJhY2s8SFRNTEltYWdlRWxlbWVudD4pOiBDYW5jZWxhYmxlIHtcbiAgICAvLyBsaW1pdCBjb25jdXJyZW50IGltYWdlIGxvYWRzIHRvIGhlbHAgd2l0aCByYXN0ZXIgc291cmNlcyBwZXJmb3JtYW5jZSBvbiBiaWcgc2NyZWVuc1xuICAgIGlmIChudW1JbWFnZVJlcXVlc3RzID49IGNvbmZpZy5NQVhfUEFSQUxMRUxfSU1BR0VfUkVRVUVTVFMpIHtcbiAgICAgICAgY29uc3QgcXVldWVkID0ge1xuICAgICAgICAgICAgcmVxdWVzdFBhcmFtZXRlcnMsXG4gICAgICAgICAgICBjYWxsYmFjayxcbiAgICAgICAgICAgIGNhbmNlbGxlZDogZmFsc2UsXG4gICAgICAgICAgICBjYW5jZWwoKSB7IHRoaXMuY2FuY2VsbGVkID0gdHJ1ZTsgfVxuICAgICAgICB9O1xuICAgICAgICBpbWFnZVF1ZXVlLnB1c2gocXVldWVkKTtcbiAgICAgICAgcmV0dXJuIHF1ZXVlZDtcbiAgICB9XG4gICAgbnVtSW1hZ2VSZXF1ZXN0cysrO1xuXG4gICAgbGV0IGFkdmFuY2VkID0gZmFsc2U7XG4gICAgY29uc3QgYWR2YW5jZUltYWdlUmVxdWVzdFF1ZXVlID0gKCkgPT4ge1xuICAgICAgICBpZiAoYWR2YW5jZWQpIHJldHVybjtcbiAgICAgICAgYWR2YW5jZWQgPSB0cnVlO1xuICAgICAgICBudW1JbWFnZVJlcXVlc3RzLS07XG4gICAgICAgIGFzc2VydChudW1JbWFnZVJlcXVlc3RzID49IDApO1xuICAgICAgICB3aGlsZSAoaW1hZ2VRdWV1ZS5sZW5ndGggJiYgbnVtSW1hZ2VSZXF1ZXN0cyA8IGNvbmZpZy5NQVhfUEFSQUxMRUxfSU1BR0VfUkVRVUVTVFMpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICAgICAgICAgICAgY29uc3QgcmVxdWVzdCA9IGltYWdlUXVldWUuc2hpZnQoKTtcbiAgICAgICAgICAgIGNvbnN0IHtyZXF1ZXN0UGFyYW1ldGVycywgY2FsbGJhY2ssIGNhbmNlbGxlZH0gPSByZXF1ZXN0O1xuICAgICAgICAgICAgaWYgKCFjYW5jZWxsZWQpIHtcbiAgICAgICAgICAgICAgICByZXF1ZXN0LmNhbmNlbCA9IGdldEltYWdlKHJlcXVlc3RQYXJhbWV0ZXJzLCBjYWxsYmFjaykuY2FuY2VsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8vIHJlcXVlc3QgdGhlIGltYWdlIHdpdGggWEhSIHRvIHdvcmsgYXJvdW5kIGNhY2hpbmcgaXNzdWVzXG4gICAgLy8gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvbWFwYm94LWdsLWpzL2lzc3Vlcy8xNDcwXG4gICAgY29uc3QgcmVxdWVzdCA9IGdldEFycmF5QnVmZmVyKHJlcXVlc3RQYXJhbWV0ZXJzLCAoZXJyOiA/RXJyb3IsIGRhdGE6ID9BcnJheUJ1ZmZlciwgY2FjaGVDb250cm9sOiA/c3RyaW5nLCBleHBpcmVzOiA/c3RyaW5nKSA9PiB7XG5cbiAgICAgICAgYWR2YW5jZUltYWdlUmVxdWVzdFF1ZXVlKCk7XG5cbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICAgICAgfSBlbHNlIGlmIChkYXRhKSB7XG4gICAgICAgICAgICBjb25zdCBpbWc6IEhUTUxJbWFnZUVsZW1lbnQgPSBuZXcgd2luZG93LkltYWdlKCk7XG4gICAgICAgICAgICBjb25zdCBVUkwgPSB3aW5kb3cuVVJMIHx8IHdpbmRvdy53ZWJraXRVUkw7XG4gICAgICAgICAgICBpbWcub25sb2FkID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIGltZyk7XG4gICAgICAgICAgICAgICAgVVJMLnJldm9rZU9iamVjdFVSTChpbWcuc3JjKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpbWcub25lcnJvciA9ICgpID0+IGNhbGxiYWNrKG5ldyBFcnJvcignQ291bGQgbm90IGxvYWQgaW1hZ2UuIFBsZWFzZSBtYWtlIHN1cmUgdG8gdXNlIGEgc3VwcG9ydGVkIGltYWdlIHR5cGUgc3VjaCBhcyBQTkcgb3IgSlBFRy4gTm90ZSB0aGF0IFNWR3MgYXJlIG5vdCBzdXBwb3J0ZWQuJykpO1xuICAgICAgICAgICAgY29uc3QgYmxvYjogQmxvYiA9IG5ldyB3aW5kb3cuQmxvYihbbmV3IFVpbnQ4QXJyYXkoZGF0YSldLCB7IHR5cGU6ICdpbWFnZS9wbmcnIH0pO1xuICAgICAgICAgICAgKGltZzogYW55KS5jYWNoZUNvbnRyb2wgPSBjYWNoZUNvbnRyb2w7XG4gICAgICAgICAgICAoaW1nOiBhbnkpLmV4cGlyZXMgPSBleHBpcmVzO1xuICAgICAgICAgICAgaW1nLnNyYyA9IGRhdGEuYnl0ZUxlbmd0aCA/IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYikgOiB0cmFuc3BhcmVudFBuZ1VybDtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgY2FuY2VsOiAoKSA9PiB7XG4gICAgICAgICAgICByZXF1ZXN0LmNhbmNlbCgpO1xuICAgICAgICAgICAgYWR2YW5jZUltYWdlUmVxdWVzdFF1ZXVlKCk7XG4gICAgICAgIH1cbiAgICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFZpZGVvID0gZnVuY3Rpb24odXJsczogQXJyYXk8c3RyaW5nPiwgY2FsbGJhY2s6IENhbGxiYWNrPEhUTUxWaWRlb0VsZW1lbnQ+KTogQ2FuY2VsYWJsZSB7XG4gICAgY29uc3QgdmlkZW86IEhUTUxWaWRlb0VsZW1lbnQgPSB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndmlkZW8nKTtcbiAgICB2aWRlby5tdXRlZCA9IHRydWU7XG4gICAgdmlkZW8ub25sb2Fkc3RhcnQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgY2FsbGJhY2sobnVsbCwgdmlkZW8pO1xuICAgIH07XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB1cmxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHM6IEhUTUxTb3VyY2VFbGVtZW50ID0gd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NvdXJjZScpO1xuICAgICAgICBpZiAoIXNhbWVPcmlnaW4odXJsc1tpXSkpIHtcbiAgICAgICAgICAgIHZpZGVvLmNyb3NzT3JpZ2luID0gJ0Fub255bW91cyc7XG4gICAgICAgIH1cbiAgICAgICAgcy5zcmMgPSB1cmxzW2ldO1xuICAgICAgICB2aWRlby5hcHBlbmRDaGlsZChzKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgY2FuY2VsOiAoKSA9PiB7fSB9O1xufTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7IGV4dGVuZCB9IGZyb20gJy4vdXRpbCc7XG5cbnR5cGUgTGlzdGVuZXIgPSAoT2JqZWN0KSA9PiBhbnk7XG50eXBlIExpc3RlbmVycyA9IHsgW3N0cmluZ106IEFycmF5PExpc3RlbmVyPiB9O1xuXG5mdW5jdGlvbiBfYWRkRXZlbnRMaXN0ZW5lcih0eXBlOiBzdHJpbmcsIGxpc3RlbmVyOiBMaXN0ZW5lciwgbGlzdGVuZXJMaXN0OiBMaXN0ZW5lcnMpIHtcbiAgICBjb25zdCBsaXN0ZW5lckV4aXN0cyA9IGxpc3RlbmVyTGlzdFt0eXBlXSAmJiBsaXN0ZW5lckxpc3RbdHlwZV0uaW5kZXhPZihsaXN0ZW5lcikgIT09IC0xO1xuICAgIGlmICghbGlzdGVuZXJFeGlzdHMpIHtcbiAgICAgICAgbGlzdGVuZXJMaXN0W3R5cGVdID0gbGlzdGVuZXJMaXN0W3R5cGVdIHx8IFtdO1xuICAgICAgICBsaXN0ZW5lckxpc3RbdHlwZV0ucHVzaChsaXN0ZW5lcik7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBfcmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlOiBzdHJpbmcsIGxpc3RlbmVyOiBMaXN0ZW5lciwgbGlzdGVuZXJMaXN0OiBMaXN0ZW5lcnMpIHtcbiAgICBpZiAobGlzdGVuZXJMaXN0ICYmIGxpc3RlbmVyTGlzdFt0eXBlXSkge1xuICAgICAgICBjb25zdCBpbmRleCA9IGxpc3RlbmVyTGlzdFt0eXBlXS5pbmRleE9mKGxpc3RlbmVyKTtcbiAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgbGlzdGVuZXJMaXN0W3R5cGVdLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBFdmVudCB7XG4gICAgK3R5cGU6IHN0cmluZztcblxuICAgIGNvbnN0cnVjdG9yKHR5cGU6IHN0cmluZywgZGF0YTogT2JqZWN0ID0ge30pIHtcbiAgICAgICAgZXh0ZW5kKHRoaXMsIGRhdGEpO1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEVycm9yRXZlbnQgZXh0ZW5kcyBFdmVudCB7XG4gICAgZXJyb3I6IEVycm9yO1xuXG4gICAgY29uc3RydWN0b3IoZXJyb3I6IEVycm9yLCBkYXRhOiBPYmplY3QgPSB7fSkge1xuICAgICAgICBzdXBlcignZXJyb3InLCBleHRlbmQoe2Vycm9yfSwgZGF0YSkpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBNZXRob2RzIG1peGVkIGluIHRvIG90aGVyIGNsYXNzZXMgZm9yIGV2ZW50IGNhcGFiaWxpdGllcy5cbiAqXG4gKiBAbWl4aW4gRXZlbnRlZFxuICovXG5leHBvcnQgY2xhc3MgRXZlbnRlZCB7XG4gICAgX2xpc3RlbmVyczogTGlzdGVuZXJzO1xuICAgIF9vbmVUaW1lTGlzdGVuZXJzOiBMaXN0ZW5lcnM7XG4gICAgX2V2ZW50ZWRQYXJlbnQ6ID9FdmVudGVkO1xuICAgIF9ldmVudGVkUGFyZW50RGF0YTogPyhPYmplY3QgfCAoKSA9PiBPYmplY3QpO1xuXG4gICAgLyoqXG4gICAgICogQWRkcyBhIGxpc3RlbmVyIHRvIGEgc3BlY2lmaWVkIGV2ZW50IHR5cGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSBUaGUgZXZlbnQgdHlwZSB0byBhZGQgYSBsaXN0ZW4gZm9yLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGxpc3RlbmVyIFRoZSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgd2hlbiB0aGUgZXZlbnQgaXMgZmlyZWQuXG4gICAgICogICBUaGUgbGlzdGVuZXIgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGggdGhlIGRhdGEgb2JqZWN0IHBhc3NlZCB0byBgZmlyZWAsXG4gICAgICogICBleHRlbmRlZCB3aXRoIGB0YXJnZXRgIGFuZCBgdHlwZWAgcHJvcGVydGllcy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBgdGhpc2BcbiAgICAgKi9cbiAgICBvbih0eXBlOiAqLCBsaXN0ZW5lcjogTGlzdGVuZXIpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fbGlzdGVuZXJzID0gdGhpcy5fbGlzdGVuZXJzIHx8IHt9O1xuICAgICAgICBfYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lciwgdGhpcy5fbGlzdGVuZXJzKTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGEgcHJldmlvdXNseSByZWdpc3RlcmVkIGV2ZW50IGxpc3RlbmVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgVGhlIGV2ZW50IHR5cGUgdG8gcmVtb3ZlIGxpc3RlbmVycyBmb3IuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyIGZ1bmN0aW9uIHRvIHJlbW92ZS5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBgdGhpc2BcbiAgICAgKi9cbiAgICBvZmYodHlwZTogKiwgbGlzdGVuZXI6IExpc3RlbmVyKSB7XG4gICAgICAgIF9yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyLCB0aGlzLl9saXN0ZW5lcnMpO1xuICAgICAgICBfcmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lciwgdGhpcy5fb25lVGltZUxpc3RlbmVycyk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBhIGxpc3RlbmVyIHRoYXQgd2lsbCBiZSBjYWxsZWQgb25seSBvbmNlIHRvIGEgc3BlY2lmaWVkIGV2ZW50IHR5cGUuXG4gICAgICpcbiAgICAgKiBUaGUgbGlzdGVuZXIgd2lsbCBiZSBjYWxsZWQgZmlyc3QgdGltZSB0aGUgZXZlbnQgZmlyZXMgYWZ0ZXIgdGhlIGxpc3RlbmVyIGlzIHJlZ2lzdGVyZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSBUaGUgZXZlbnQgdHlwZSB0byBsaXN0ZW4gZm9yLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGxpc3RlbmVyIFRoZSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgd2hlbiB0aGUgZXZlbnQgaXMgZmlyZWQgdGhlIGZpcnN0IHRpbWUuXG4gICAgICogQHJldHVybnMge09iamVjdH0gYHRoaXNgXG4gICAgICovXG4gICAgb25jZSh0eXBlOiBzdHJpbmcsIGxpc3RlbmVyOiBMaXN0ZW5lcikge1xuICAgICAgICB0aGlzLl9vbmVUaW1lTGlzdGVuZXJzID0gdGhpcy5fb25lVGltZUxpc3RlbmVycyB8fCB7fTtcbiAgICAgICAgX2FkZEV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXIsIHRoaXMuX29uZVRpbWVMaXN0ZW5lcnMpO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGZpcmUoZXZlbnQ6IEV2ZW50LCBwcm9wZXJ0aWVzPzogT2JqZWN0KSB7XG4gICAgICAgIC8vIENvbXBhdGliaWxpdHkgd2l0aCAodHlwZTogc3RyaW5nLCBwcm9wZXJ0aWVzOiBPYmplY3QpIHNpZ25hdHVyZSBmcm9tIHByZXZpb3VzIHZlcnNpb25zLlxuICAgICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL21hcGJveC9tYXBib3gtZ2wtanMvaXNzdWVzLzY1MjIsXG4gICAgICAgIC8vICAgICBodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L21hcGJveC1nbC1kcmF3L2lzc3Vlcy83NjZcbiAgICAgICAgaWYgKHR5cGVvZiBldmVudCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGV2ZW50ID0gbmV3IEV2ZW50KGV2ZW50LCBwcm9wZXJ0aWVzIHx8IHt9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHR5cGUgPSBldmVudC50eXBlO1xuXG4gICAgICAgIGlmICh0aGlzLmxpc3RlbnModHlwZSkpIHtcbiAgICAgICAgICAgIChldmVudDogYW55KS50YXJnZXQgPSB0aGlzO1xuXG4gICAgICAgICAgICAvLyBtYWtlIHN1cmUgYWRkaW5nIG9yIHJlbW92aW5nIGxpc3RlbmVycyBpbnNpZGUgb3RoZXIgbGlzdGVuZXJzIHdvbid0IGNhdXNlIGFuIGluZmluaXRlIGxvb3BcbiAgICAgICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IHRoaXMuX2xpc3RlbmVycyAmJiB0aGlzLl9saXN0ZW5lcnNbdHlwZV0gPyB0aGlzLl9saXN0ZW5lcnNbdHlwZV0uc2xpY2UoKSA6IFtdO1xuICAgICAgICAgICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiBsaXN0ZW5lcnMpIHtcbiAgICAgICAgICAgICAgICBsaXN0ZW5lci5jYWxsKHRoaXMsIGV2ZW50KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3Qgb25lVGltZUxpc3RlbmVycyA9IHRoaXMuX29uZVRpbWVMaXN0ZW5lcnMgJiYgdGhpcy5fb25lVGltZUxpc3RlbmVyc1t0eXBlXSA/IHRoaXMuX29uZVRpbWVMaXN0ZW5lcnNbdHlwZV0uc2xpY2UoKSA6IFtdO1xuICAgICAgICAgICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiBvbmVUaW1lTGlzdGVuZXJzKSB7XG4gICAgICAgICAgICAgICAgX3JlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXIsIHRoaXMuX29uZVRpbWVMaXN0ZW5lcnMpO1xuICAgICAgICAgICAgICAgIGxpc3RlbmVyLmNhbGwodGhpcywgZXZlbnQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBwYXJlbnQgPSB0aGlzLl9ldmVudGVkUGFyZW50O1xuICAgICAgICAgICAgaWYgKHBhcmVudCkge1xuICAgICAgICAgICAgICAgIGV4dGVuZChcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICAgICAgICAgIHR5cGVvZiB0aGlzLl9ldmVudGVkUGFyZW50RGF0YSA9PT0gJ2Z1bmN0aW9uJyA/IHRoaXMuX2V2ZW50ZWRQYXJlbnREYXRhKCkgOiB0aGlzLl9ldmVudGVkUGFyZW50RGF0YVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgcGFyZW50LmZpcmUoZXZlbnQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIC8vIFRvIGVuc3VyZSB0aGF0IG5vIGVycm9yIGV2ZW50cyBhcmUgZHJvcHBlZCwgcHJpbnQgdGhlbSB0byB0aGVcbiAgICAgICAgLy8gY29uc29sZSBpZiB0aGV5IGhhdmUgbm8gbGlzdGVuZXJzLlxuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50IGluc3RhbmNlb2YgRXJyb3JFdmVudCkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihldmVudC5lcnJvcik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgdHJ1ZSBpZiB0aGlzIGluc3RhbmNlIG9mIEV2ZW50ZWQgb3IgYW55IGZvcndhcmRlZWQgaW5zdGFuY2VzIG9mIEV2ZW50ZWQgaGF2ZSBhIGxpc3RlbmVyIGZvciB0aGUgc3BlY2lmaWVkIHR5cGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSBUaGUgZXZlbnQgdHlwZVxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIHJlZ2lzdGVyZWQgbGlzdGVuZXIgZm9yIHNwZWNpZmllZCBldmVudCB0eXBlLCBgZmFsc2VgIG90aGVyd2lzZVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgbGlzdGVucyh0eXBlOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICh0aGlzLl9saXN0ZW5lcnMgJiYgdGhpcy5fbGlzdGVuZXJzW3R5cGVdICYmIHRoaXMuX2xpc3RlbmVyc1t0eXBlXS5sZW5ndGggPiAwKSB8fFxuICAgICAgICAgICAgKHRoaXMuX29uZVRpbWVMaXN0ZW5lcnMgJiYgdGhpcy5fb25lVGltZUxpc3RlbmVyc1t0eXBlXSAmJiB0aGlzLl9vbmVUaW1lTGlzdGVuZXJzW3R5cGVdLmxlbmd0aCA+IDApIHx8XG4gICAgICAgICAgICAodGhpcy5fZXZlbnRlZFBhcmVudCAmJiB0aGlzLl9ldmVudGVkUGFyZW50Lmxpc3RlbnModHlwZSkpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQnViYmxlIGFsbCBldmVudHMgZmlyZWQgYnkgdGhpcyBpbnN0YW5jZSBvZiBFdmVudGVkIHRvIHRoaXMgcGFyZW50IGluc3RhbmNlIG9mIEV2ZW50ZWQuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IGB0aGlzYFxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgc2V0RXZlbnRlZFBhcmVudChwYXJlbnQ6ID9FdmVudGVkLCBkYXRhPzogT2JqZWN0IHwgKCkgPT4gT2JqZWN0KSB7XG4gICAgICAgIHRoaXMuX2V2ZW50ZWRQYXJlbnQgPSBwYXJlbnQ7XG4gICAgICAgIHRoaXMuX2V2ZW50ZWRQYXJlbnREYXRhID0gZGF0YTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG59XG4iLCJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZhbGlkYXRpb25FcnJvciB7XG4gICAgY29uc3RydWN0b3Ioa2V5LCB2YWx1ZSwgbWVzc2FnZSwgaWRlbnRpZmllcikge1xuICAgICAgICB0aGlzLm1lc3NhZ2UgPSAoa2V5ID8gYCR7a2V5fTogYCA6ICcnKSArIG1lc3NhZ2U7XG4gICAgICAgIGlmIChpZGVudGlmaWVyKSB0aGlzLmlkZW50aWZpZXIgPSBpZGVudGlmaWVyO1xuXG4gICAgICAgIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLl9fbGluZV9fKSB7XG4gICAgICAgICAgICB0aGlzLmxpbmUgPSB2YWx1ZS5fX2xpbmVfXztcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIlxuaW1wb3J0IFZhbGlkYXRpb25FcnJvciBmcm9tICcuLi9lcnJvci92YWxpZGF0aW9uX2Vycm9yJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdmFsaWRhdGVDb25zdGFudHMob3B0aW9ucykge1xuICAgIGNvbnN0IGtleSA9IG9wdGlvbnMua2V5O1xuICAgIGNvbnN0IGNvbnN0YW50cyA9IG9wdGlvbnMudmFsdWU7XG5cbiAgICBpZiAoY29uc3RhbnRzKSB7XG4gICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihrZXksIGNvbnN0YW50cywgJ2NvbnN0YW50cyBoYXZlIGJlZW4gZGVwcmVjYXRlZCBhcyBvZiB2OCcpXTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfVxufVxuIiwiXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAob3V0cHV0LCAuLi5pbnB1dHMpIHtcbiAgICBmb3IgKGNvbnN0IGlucHV0IG9mIGlucHV0cykge1xuICAgICAgICBmb3IgKGNvbnN0IGsgaW4gaW5wdXQpIHtcbiAgICAgICAgICAgIG91dHB1dFtrXSA9IGlucHV0W2tdO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvdXRwdXQ7XG59XG4iLCJcbi8vIFR1cm4ganNvbmxpbnQtbGluZXMtcHJpbWl0aXZlcyBvYmplY3RzIGludG8gcHJpbWl0aXZlIG9iamVjdHNcbmV4cG9ydCBmdW5jdGlvbiB1bmJ1bmRsZSh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE51bWJlciB8fCB2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZyB8fCB2YWx1ZSBpbnN0YW5jZW9mIEJvb2xlYW4pIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlLnZhbHVlT2YoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVlcFVuYnVuZGxlKHZhbHVlKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZS5tYXAoZGVlcFVuYnVuZGxlKTtcbiAgICB9XG4gICAgcmV0dXJuIHVuYnVuZGxlKHZhbHVlKTtcbn1cblxuIiwiLy8gQGZsb3dcblxuY2xhc3MgUGFyc2luZ0Vycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGtleTogc3RyaW5nO1xuICAgIG1lc3NhZ2U6IHN0cmluZztcbiAgICBjb25zdHJ1Y3RvcihrZXk6IHN0cmluZywgbWVzc2FnZTogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgICAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgICAgICB0aGlzLmtleSA9IGtleTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFBhcnNpbmdFcnJvcjtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB0eXBlIHtFeHByZXNzaW9ufSBmcm9tICcuL2V4cHJlc3Npb24nO1xuXG4vKipcbiAqIFRyYWNrcyBgbGV0YCBiaW5kaW5ncyBkdXJpbmcgZXhwcmVzc2lvbiBwYXJzaW5nLlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgU2NvcGUge1xuICAgIHBhcmVudDogP1Njb3BlO1xuICAgIGJpbmRpbmdzOiB7W3N0cmluZ106IEV4cHJlc3Npb259O1xuICAgIGNvbnN0cnVjdG9yKHBhcmVudD86IFNjb3BlLCBiaW5kaW5nczogQXJyYXk8W3N0cmluZywgRXhwcmVzc2lvbl0+ID0gW10pIHtcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgICAgIHRoaXMuYmluZGluZ3MgPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCBbbmFtZSwgZXhwcmVzc2lvbl0gb2YgYmluZGluZ3MpIHtcbiAgICAgICAgICAgIHRoaXMuYmluZGluZ3NbbmFtZV0gPSBleHByZXNzaW9uO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY29uY2F0KGJpbmRpbmdzOiBBcnJheTxbc3RyaW5nLCBFeHByZXNzaW9uXT4pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTY29wZSh0aGlzLCBiaW5kaW5ncyk7XG4gICAgfVxuXG4gICAgZ2V0KG5hbWU6IHN0cmluZyk6IEV4cHJlc3Npb24ge1xuICAgICAgICBpZiAodGhpcy5iaW5kaW5nc1tuYW1lXSkgeyByZXR1cm4gdGhpcy5iaW5kaW5nc1tuYW1lXTsgfVxuICAgICAgICBpZiAodGhpcy5wYXJlbnQpIHsgcmV0dXJuIHRoaXMucGFyZW50LmdldChuYW1lKTsgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7bmFtZX0gbm90IGZvdW5kIGluIHNjb3BlLmApO1xuICAgIH1cblxuICAgIGhhcyhuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMuYmluZGluZ3NbbmFtZV0pIHJldHVybiB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnQgPyB0aGlzLnBhcmVudC5oYXMobmFtZSkgOiBmYWxzZTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFNjb3BlO1xuIiwiLy8gQGZsb3dcblxuZXhwb3J0IHR5cGUgTnVsbFR5cGVUID0geyBraW5kOiAnbnVsbCcgfTtcbmV4cG9ydCB0eXBlIE51bWJlclR5cGVUID0geyBraW5kOiAnbnVtYmVyJyB9O1xuZXhwb3J0IHR5cGUgU3RyaW5nVHlwZVQgPSB7IGtpbmQ6ICdzdHJpbmcnIH07XG5leHBvcnQgdHlwZSBCb29sZWFuVHlwZVQgPSB7IGtpbmQ6ICdib29sZWFuJyB9O1xuZXhwb3J0IHR5cGUgQ29sb3JUeXBlVCA9IHsga2luZDogJ2NvbG9yJyB9O1xuZXhwb3J0IHR5cGUgT2JqZWN0VHlwZVQgPSB7IGtpbmQ6ICdvYmplY3QnIH07XG5leHBvcnQgdHlwZSBWYWx1ZVR5cGVUID0geyBraW5kOiAndmFsdWUnIH07XG5leHBvcnQgdHlwZSBFcnJvclR5cGVUID0geyBraW5kOiAnZXJyb3InIH07XG5leHBvcnQgdHlwZSBDb2xsYXRvclR5cGVUID0geyBraW5kOiAnY29sbGF0b3InIH07XG5leHBvcnQgdHlwZSBGb3JtYXR0ZWRUeXBlVCA9IHsga2luZDogJ2Zvcm1hdHRlZCcgfTtcblxuZXhwb3J0IHR5cGUgRXZhbHVhdGlvbktpbmQgPSAnY29uc3RhbnQnIHwgJ3NvdXJjZScgfCAnY2FtZXJhJyB8ICdjb21wb3NpdGUnO1xuXG5leHBvcnQgdHlwZSBUeXBlID1cbiAgICBOdWxsVHlwZVQgfFxuICAgIE51bWJlclR5cGVUIHxcbiAgICBTdHJpbmdUeXBlVCB8XG4gICAgQm9vbGVhblR5cGVUIHxcbiAgICBDb2xvclR5cGVUIHxcbiAgICBPYmplY3RUeXBlVCB8XG4gICAgVmFsdWVUeXBlVCB8XG4gICAgQXJyYXlUeXBlIHwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZVxuICAgIEVycm9yVHlwZVQgfFxuICAgIENvbGxhdG9yVHlwZVQgfFxuICAgIEZvcm1hdHRlZFR5cGVUXG5cbmV4cG9ydCB0eXBlIEFycmF5VHlwZSA9IHtcbiAgICBraW5kOiAnYXJyYXknLFxuICAgIGl0ZW1UeXBlOiBUeXBlLFxuICAgIE46ID9udW1iZXJcbn1cblxuZXhwb3J0IGNvbnN0IE51bGxUeXBlID0geyBraW5kOiAnbnVsbCcgfTtcbmV4cG9ydCBjb25zdCBOdW1iZXJUeXBlID0geyBraW5kOiAnbnVtYmVyJyB9O1xuZXhwb3J0IGNvbnN0IFN0cmluZ1R5cGUgPSB7IGtpbmQ6ICdzdHJpbmcnIH07XG5leHBvcnQgY29uc3QgQm9vbGVhblR5cGUgPSB7IGtpbmQ6ICdib29sZWFuJyB9O1xuZXhwb3J0IGNvbnN0IENvbG9yVHlwZSA9IHsga2luZDogJ2NvbG9yJyB9O1xuZXhwb3J0IGNvbnN0IE9iamVjdFR5cGUgPSB7IGtpbmQ6ICdvYmplY3QnIH07XG5leHBvcnQgY29uc3QgVmFsdWVUeXBlID0geyBraW5kOiAndmFsdWUnIH07XG5leHBvcnQgY29uc3QgRXJyb3JUeXBlID0geyBraW5kOiAnZXJyb3InIH07XG5leHBvcnQgY29uc3QgQ29sbGF0b3JUeXBlID0geyBraW5kOiAnY29sbGF0b3InIH07XG5leHBvcnQgY29uc3QgRm9ybWF0dGVkVHlwZSA9IHsga2luZDogJ2Zvcm1hdHRlZCcgfTtcblxuZXhwb3J0IGZ1bmN0aW9uIGFycmF5KGl0ZW1UeXBlOiBUeXBlLCBOOiA/bnVtYmVyKTogQXJyYXlUeXBlIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBraW5kOiAnYXJyYXknLFxuICAgICAgICBpdGVtVHlwZSxcbiAgICAgICAgTlxuICAgIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b1N0cmluZyh0eXBlOiBUeXBlKTogc3RyaW5nIHtcbiAgICBpZiAodHlwZS5raW5kID09PSAnYXJyYXknKSB7XG4gICAgICAgIGNvbnN0IGl0ZW1UeXBlID0gdG9TdHJpbmcodHlwZS5pdGVtVHlwZSk7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdHlwZS5OID09PSAnbnVtYmVyJyA/XG4gICAgICAgICAgICBgYXJyYXk8JHtpdGVtVHlwZX0sICR7dHlwZS5OfT5gIDpcbiAgICAgICAgICAgIHR5cGUuaXRlbVR5cGUua2luZCA9PT0gJ3ZhbHVlJyA/ICdhcnJheScgOiBgYXJyYXk8JHtpdGVtVHlwZX0+YDtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdHlwZS5raW5kO1xuICAgIH1cbn1cblxuY29uc3QgdmFsdWVNZW1iZXJUeXBlcyA9IFtcbiAgICBOdWxsVHlwZSxcbiAgICBOdW1iZXJUeXBlLFxuICAgIFN0cmluZ1R5cGUsXG4gICAgQm9vbGVhblR5cGUsXG4gICAgQ29sb3JUeXBlLFxuICAgIEZvcm1hdHRlZFR5cGUsXG4gICAgT2JqZWN0VHlwZSxcbiAgICBhcnJheShWYWx1ZVR5cGUpXG5dO1xuXG4vKipcbiAqIFJldHVybnMgbnVsbCBpZiBgdGAgaXMgYSBzdWJ0eXBlIG9mIGBleHBlY3RlZGA7IG90aGVyd2lzZSByZXR1cm5zIGFuXG4gKiBlcnJvciBtZXNzYWdlLlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrU3VidHlwZShleHBlY3RlZDogVHlwZSwgdDogVHlwZSk6ID9zdHJpbmcge1xuICAgIGlmICh0LmtpbmQgPT09ICdlcnJvcicpIHtcbiAgICAgICAgLy8gRXJyb3IgaXMgYSBzdWJ0eXBlIG9mIGV2ZXJ5IHR5cGVcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSBlbHNlIGlmIChleHBlY3RlZC5raW5kID09PSAnYXJyYXknKSB7XG4gICAgICAgIGlmICh0LmtpbmQgPT09ICdhcnJheScgJiZcbiAgICAgICAgICAgICgodC5OID09PSAwICYmIHQuaXRlbVR5cGUua2luZCA9PT0gJ3ZhbHVlJykgfHwgIWNoZWNrU3VidHlwZShleHBlY3RlZC5pdGVtVHlwZSwgdC5pdGVtVHlwZSkpICYmXG4gICAgICAgICAgICAodHlwZW9mIGV4cGVjdGVkLk4gIT09ICdudW1iZXInIHx8IGV4cGVjdGVkLk4gPT09IHQuTikpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfSBlbHNlIGlmIChleHBlY3RlZC5raW5kID09PSB0LmtpbmQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSBlbHNlIGlmIChleHBlY3RlZC5raW5kID09PSAndmFsdWUnKSB7XG4gICAgICAgIGZvciAoY29uc3QgbWVtYmVyVHlwZSBvZiB2YWx1ZU1lbWJlclR5cGVzKSB7XG4gICAgICAgICAgICBpZiAoIWNoZWNrU3VidHlwZShtZW1iZXJUeXBlLCB0KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGBFeHBlY3RlZCAke3RvU3RyaW5nKGV4cGVjdGVkKX0gYnV0IGZvdW5kICR7dG9TdHJpbmcodCl9IGluc3RlYWQuYDtcbn1cbiIsIi8vIChjKSBEZWFuIE1jTmFtZWUgPGRlYW5AZ21haWwuY29tPiwgMjAxMi5cbi8vXG4vLyBodHRwczovL2dpdGh1Yi5jb20vZGVhbm0vY3NzLWNvbG9yLXBhcnNlci1qc1xuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvXG4vLyBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZVxuLy8gcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yXG4vLyBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HXG4vLyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTXG4vLyBJTiBUSEUgU09GVFdBUkUuXG5cbi8vIGh0dHA6Ly93d3cudzMub3JnL1RSL2NzczMtY29sb3IvXG52YXIga0NTU0NvbG9yVGFibGUgPSB7XG4gIFwidHJhbnNwYXJlbnRcIjogWzAsMCwwLDBdLCBcImFsaWNlYmx1ZVwiOiBbMjQwLDI0OCwyNTUsMV0sXG4gIFwiYW50aXF1ZXdoaXRlXCI6IFsyNTAsMjM1LDIxNSwxXSwgXCJhcXVhXCI6IFswLDI1NSwyNTUsMV0sXG4gIFwiYXF1YW1hcmluZVwiOiBbMTI3LDI1NSwyMTIsMV0sIFwiYXp1cmVcIjogWzI0MCwyNTUsMjU1LDFdLFxuICBcImJlaWdlXCI6IFsyNDUsMjQ1LDIyMCwxXSwgXCJiaXNxdWVcIjogWzI1NSwyMjgsMTk2LDFdLFxuICBcImJsYWNrXCI6IFswLDAsMCwxXSwgXCJibGFuY2hlZGFsbW9uZFwiOiBbMjU1LDIzNSwyMDUsMV0sXG4gIFwiYmx1ZVwiOiBbMCwwLDI1NSwxXSwgXCJibHVldmlvbGV0XCI6IFsxMzgsNDMsMjI2LDFdLFxuICBcImJyb3duXCI6IFsxNjUsNDIsNDIsMV0sIFwiYnVybHl3b29kXCI6IFsyMjIsMTg0LDEzNSwxXSxcbiAgXCJjYWRldGJsdWVcIjogWzk1LDE1OCwxNjAsMV0sIFwiY2hhcnRyZXVzZVwiOiBbMTI3LDI1NSwwLDFdLFxuICBcImNob2NvbGF0ZVwiOiBbMjEwLDEwNSwzMCwxXSwgXCJjb3JhbFwiOiBbMjU1LDEyNyw4MCwxXSxcbiAgXCJjb3JuZmxvd2VyYmx1ZVwiOiBbMTAwLDE0OSwyMzcsMV0sIFwiY29ybnNpbGtcIjogWzI1NSwyNDgsMjIwLDFdLFxuICBcImNyaW1zb25cIjogWzIyMCwyMCw2MCwxXSwgXCJjeWFuXCI6IFswLDI1NSwyNTUsMV0sXG4gIFwiZGFya2JsdWVcIjogWzAsMCwxMzksMV0sIFwiZGFya2N5YW5cIjogWzAsMTM5LDEzOSwxXSxcbiAgXCJkYXJrZ29sZGVucm9kXCI6IFsxODQsMTM0LDExLDFdLCBcImRhcmtncmF5XCI6IFsxNjksMTY5LDE2OSwxXSxcbiAgXCJkYXJrZ3JlZW5cIjogWzAsMTAwLDAsMV0sIFwiZGFya2dyZXlcIjogWzE2OSwxNjksMTY5LDFdLFxuICBcImRhcmtraGFraVwiOiBbMTg5LDE4MywxMDcsMV0sIFwiZGFya21hZ2VudGFcIjogWzEzOSwwLDEzOSwxXSxcbiAgXCJkYXJrb2xpdmVncmVlblwiOiBbODUsMTA3LDQ3LDFdLCBcImRhcmtvcmFuZ2VcIjogWzI1NSwxNDAsMCwxXSxcbiAgXCJkYXJrb3JjaGlkXCI6IFsxNTMsNTAsMjA0LDFdLCBcImRhcmtyZWRcIjogWzEzOSwwLDAsMV0sXG4gIFwiZGFya3NhbG1vblwiOiBbMjMzLDE1MCwxMjIsMV0sIFwiZGFya3NlYWdyZWVuXCI6IFsxNDMsMTg4LDE0MywxXSxcbiAgXCJkYXJrc2xhdGVibHVlXCI6IFs3Miw2MSwxMzksMV0sIFwiZGFya3NsYXRlZ3JheVwiOiBbNDcsNzksNzksMV0sXG4gIFwiZGFya3NsYXRlZ3JleVwiOiBbNDcsNzksNzksMV0sIFwiZGFya3R1cnF1b2lzZVwiOiBbMCwyMDYsMjA5LDFdLFxuICBcImRhcmt2aW9sZXRcIjogWzE0OCwwLDIxMSwxXSwgXCJkZWVwcGlua1wiOiBbMjU1LDIwLDE0NywxXSxcbiAgXCJkZWVwc2t5Ymx1ZVwiOiBbMCwxOTEsMjU1LDFdLCBcImRpbWdyYXlcIjogWzEwNSwxMDUsMTA1LDFdLFxuICBcImRpbWdyZXlcIjogWzEwNSwxMDUsMTA1LDFdLCBcImRvZGdlcmJsdWVcIjogWzMwLDE0NCwyNTUsMV0sXG4gIFwiZmlyZWJyaWNrXCI6IFsxNzgsMzQsMzQsMV0sIFwiZmxvcmFsd2hpdGVcIjogWzI1NSwyNTAsMjQwLDFdLFxuICBcImZvcmVzdGdyZWVuXCI6IFszNCwxMzksMzQsMV0sIFwiZnVjaHNpYVwiOiBbMjU1LDAsMjU1LDFdLFxuICBcImdhaW5zYm9yb1wiOiBbMjIwLDIyMCwyMjAsMV0sIFwiZ2hvc3R3aGl0ZVwiOiBbMjQ4LDI0OCwyNTUsMV0sXG4gIFwiZ29sZFwiOiBbMjU1LDIxNSwwLDFdLCBcImdvbGRlbnJvZFwiOiBbMjE4LDE2NSwzMiwxXSxcbiAgXCJncmF5XCI6IFsxMjgsMTI4LDEyOCwxXSwgXCJncmVlblwiOiBbMCwxMjgsMCwxXSxcbiAgXCJncmVlbnllbGxvd1wiOiBbMTczLDI1NSw0NywxXSwgXCJncmV5XCI6IFsxMjgsMTI4LDEyOCwxXSxcbiAgXCJob25leWRld1wiOiBbMjQwLDI1NSwyNDAsMV0sIFwiaG90cGlua1wiOiBbMjU1LDEwNSwxODAsMV0sXG4gIFwiaW5kaWFucmVkXCI6IFsyMDUsOTIsOTIsMV0sIFwiaW5kaWdvXCI6IFs3NSwwLDEzMCwxXSxcbiAgXCJpdm9yeVwiOiBbMjU1LDI1NSwyNDAsMV0sIFwia2hha2lcIjogWzI0MCwyMzAsMTQwLDFdLFxuICBcImxhdmVuZGVyXCI6IFsyMzAsMjMwLDI1MCwxXSwgXCJsYXZlbmRlcmJsdXNoXCI6IFsyNTUsMjQwLDI0NSwxXSxcbiAgXCJsYXduZ3JlZW5cIjogWzEyNCwyNTIsMCwxXSwgXCJsZW1vbmNoaWZmb25cIjogWzI1NSwyNTAsMjA1LDFdLFxuICBcImxpZ2h0Ymx1ZVwiOiBbMTczLDIxNiwyMzAsMV0sIFwibGlnaHRjb3JhbFwiOiBbMjQwLDEyOCwxMjgsMV0sXG4gIFwibGlnaHRjeWFuXCI6IFsyMjQsMjU1LDI1NSwxXSwgXCJsaWdodGdvbGRlbnJvZHllbGxvd1wiOiBbMjUwLDI1MCwyMTAsMV0sXG4gIFwibGlnaHRncmF5XCI6IFsyMTEsMjExLDIxMSwxXSwgXCJsaWdodGdyZWVuXCI6IFsxNDQsMjM4LDE0NCwxXSxcbiAgXCJsaWdodGdyZXlcIjogWzIxMSwyMTEsMjExLDFdLCBcImxpZ2h0cGlua1wiOiBbMjU1LDE4MiwxOTMsMV0sXG4gIFwibGlnaHRzYWxtb25cIjogWzI1NSwxNjAsMTIyLDFdLCBcImxpZ2h0c2VhZ3JlZW5cIjogWzMyLDE3OCwxNzAsMV0sXG4gIFwibGlnaHRza3libHVlXCI6IFsxMzUsMjA2LDI1MCwxXSwgXCJsaWdodHNsYXRlZ3JheVwiOiBbMTE5LDEzNiwxNTMsMV0sXG4gIFwibGlnaHRzbGF0ZWdyZXlcIjogWzExOSwxMzYsMTUzLDFdLCBcImxpZ2h0c3RlZWxibHVlXCI6IFsxNzYsMTk2LDIyMiwxXSxcbiAgXCJsaWdodHllbGxvd1wiOiBbMjU1LDI1NSwyMjQsMV0sIFwibGltZVwiOiBbMCwyNTUsMCwxXSxcbiAgXCJsaW1lZ3JlZW5cIjogWzUwLDIwNSw1MCwxXSwgXCJsaW5lblwiOiBbMjUwLDI0MCwyMzAsMV0sXG4gIFwibWFnZW50YVwiOiBbMjU1LDAsMjU1LDFdLCBcIm1hcm9vblwiOiBbMTI4LDAsMCwxXSxcbiAgXCJtZWRpdW1hcXVhbWFyaW5lXCI6IFsxMDIsMjA1LDE3MCwxXSwgXCJtZWRpdW1ibHVlXCI6IFswLDAsMjA1LDFdLFxuICBcIm1lZGl1bW9yY2hpZFwiOiBbMTg2LDg1LDIxMSwxXSwgXCJtZWRpdW1wdXJwbGVcIjogWzE0NywxMTIsMjE5LDFdLFxuICBcIm1lZGl1bXNlYWdyZWVuXCI6IFs2MCwxNzksMTEzLDFdLCBcIm1lZGl1bXNsYXRlYmx1ZVwiOiBbMTIzLDEwNCwyMzgsMV0sXG4gIFwibWVkaXVtc3ByaW5nZ3JlZW5cIjogWzAsMjUwLDE1NCwxXSwgXCJtZWRpdW10dXJxdW9pc2VcIjogWzcyLDIwOSwyMDQsMV0sXG4gIFwibWVkaXVtdmlvbGV0cmVkXCI6IFsxOTksMjEsMTMzLDFdLCBcIm1pZG5pZ2h0Ymx1ZVwiOiBbMjUsMjUsMTEyLDFdLFxuICBcIm1pbnRjcmVhbVwiOiBbMjQ1LDI1NSwyNTAsMV0sIFwibWlzdHlyb3NlXCI6IFsyNTUsMjI4LDIyNSwxXSxcbiAgXCJtb2NjYXNpblwiOiBbMjU1LDIyOCwxODEsMV0sIFwibmF2YWpvd2hpdGVcIjogWzI1NSwyMjIsMTczLDFdLFxuICBcIm5hdnlcIjogWzAsMCwxMjgsMV0sIFwib2xkbGFjZVwiOiBbMjUzLDI0NSwyMzAsMV0sXG4gIFwib2xpdmVcIjogWzEyOCwxMjgsMCwxXSwgXCJvbGl2ZWRyYWJcIjogWzEwNywxNDIsMzUsMV0sXG4gIFwib3JhbmdlXCI6IFsyNTUsMTY1LDAsMV0sIFwib3JhbmdlcmVkXCI6IFsyNTUsNjksMCwxXSxcbiAgXCJvcmNoaWRcIjogWzIxOCwxMTIsMjE0LDFdLCBcInBhbGVnb2xkZW5yb2RcIjogWzIzOCwyMzIsMTcwLDFdLFxuICBcInBhbGVncmVlblwiOiBbMTUyLDI1MSwxNTIsMV0sIFwicGFsZXR1cnF1b2lzZVwiOiBbMTc1LDIzOCwyMzgsMV0sXG4gIFwicGFsZXZpb2xldHJlZFwiOiBbMjE5LDExMiwxNDcsMV0sIFwicGFwYXlhd2hpcFwiOiBbMjU1LDIzOSwyMTMsMV0sXG4gIFwicGVhY2hwdWZmXCI6IFsyNTUsMjE4LDE4NSwxXSwgXCJwZXJ1XCI6IFsyMDUsMTMzLDYzLDFdLFxuICBcInBpbmtcIjogWzI1NSwxOTIsMjAzLDFdLCBcInBsdW1cIjogWzIyMSwxNjAsMjIxLDFdLFxuICBcInBvd2RlcmJsdWVcIjogWzE3NiwyMjQsMjMwLDFdLCBcInB1cnBsZVwiOiBbMTI4LDAsMTI4LDFdLFxuICBcInJlYmVjY2FwdXJwbGVcIjogWzEwMiw1MSwxNTMsMV0sXG4gIFwicmVkXCI6IFsyNTUsMCwwLDFdLCBcInJvc3licm93blwiOiBbMTg4LDE0MywxNDMsMV0sXG4gIFwicm95YWxibHVlXCI6IFs2NSwxMDUsMjI1LDFdLCBcInNhZGRsZWJyb3duXCI6IFsxMzksNjksMTksMV0sXG4gIFwic2FsbW9uXCI6IFsyNTAsMTI4LDExNCwxXSwgXCJzYW5keWJyb3duXCI6IFsyNDQsMTY0LDk2LDFdLFxuICBcInNlYWdyZWVuXCI6IFs0NiwxMzksODcsMV0sIFwic2Vhc2hlbGxcIjogWzI1NSwyNDUsMjM4LDFdLFxuICBcInNpZW5uYVwiOiBbMTYwLDgyLDQ1LDFdLCBcInNpbHZlclwiOiBbMTkyLDE5MiwxOTIsMV0sXG4gIFwic2t5Ymx1ZVwiOiBbMTM1LDIwNiwyMzUsMV0sIFwic2xhdGVibHVlXCI6IFsxMDYsOTAsMjA1LDFdLFxuICBcInNsYXRlZ3JheVwiOiBbMTEyLDEyOCwxNDQsMV0sIFwic2xhdGVncmV5XCI6IFsxMTIsMTI4LDE0NCwxXSxcbiAgXCJzbm93XCI6IFsyNTUsMjUwLDI1MCwxXSwgXCJzcHJpbmdncmVlblwiOiBbMCwyNTUsMTI3LDFdLFxuICBcInN0ZWVsYmx1ZVwiOiBbNzAsMTMwLDE4MCwxXSwgXCJ0YW5cIjogWzIxMCwxODAsMTQwLDFdLFxuICBcInRlYWxcIjogWzAsMTI4LDEyOCwxXSwgXCJ0aGlzdGxlXCI6IFsyMTYsMTkxLDIxNiwxXSxcbiAgXCJ0b21hdG9cIjogWzI1NSw5OSw3MSwxXSwgXCJ0dXJxdW9pc2VcIjogWzY0LDIyNCwyMDgsMV0sXG4gIFwidmlvbGV0XCI6IFsyMzgsMTMwLDIzOCwxXSwgXCJ3aGVhdFwiOiBbMjQ1LDIyMiwxNzksMV0sXG4gIFwid2hpdGVcIjogWzI1NSwyNTUsMjU1LDFdLCBcIndoaXRlc21va2VcIjogWzI0NSwyNDUsMjQ1LDFdLFxuICBcInllbGxvd1wiOiBbMjU1LDI1NSwwLDFdLCBcInllbGxvd2dyZWVuXCI6IFsxNTQsMjA1LDUwLDFdfVxuXG5mdW5jdGlvbiBjbGFtcF9jc3NfYnl0ZShpKSB7ICAvLyBDbGFtcCB0byBpbnRlZ2VyIDAgLi4gMjU1LlxuICBpID0gTWF0aC5yb3VuZChpKTsgIC8vIFNlZW1zIHRvIGJlIHdoYXQgQ2hyb21lIGRvZXMgKHZzIHRydW5jYXRpb24pLlxuICByZXR1cm4gaSA8IDAgPyAwIDogaSA+IDI1NSA/IDI1NSA6IGk7XG59XG5cbmZ1bmN0aW9uIGNsYW1wX2Nzc19mbG9hdChmKSB7ICAvLyBDbGFtcCB0byBmbG9hdCAwLjAgLi4gMS4wLlxuICByZXR1cm4gZiA8IDAgPyAwIDogZiA+IDEgPyAxIDogZjtcbn1cblxuZnVuY3Rpb24gcGFyc2VfY3NzX2ludChzdHIpIHsgIC8vIGludCBvciBwZXJjZW50YWdlLlxuICBpZiAoc3RyW3N0ci5sZW5ndGggLSAxXSA9PT0gJyUnKVxuICAgIHJldHVybiBjbGFtcF9jc3NfYnl0ZShwYXJzZUZsb2F0KHN0cikgLyAxMDAgKiAyNTUpO1xuICByZXR1cm4gY2xhbXBfY3NzX2J5dGUocGFyc2VJbnQoc3RyKSk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlX2Nzc19mbG9hdChzdHIpIHsgIC8vIGZsb2F0IG9yIHBlcmNlbnRhZ2UuXG4gIGlmIChzdHJbc3RyLmxlbmd0aCAtIDFdID09PSAnJScpXG4gICAgcmV0dXJuIGNsYW1wX2Nzc19mbG9hdChwYXJzZUZsb2F0KHN0cikgLyAxMDApO1xuICByZXR1cm4gY2xhbXBfY3NzX2Zsb2F0KHBhcnNlRmxvYXQoc3RyKSk7XG59XG5cbmZ1bmN0aW9uIGNzc19odWVfdG9fcmdiKG0xLCBtMiwgaCkge1xuICBpZiAoaCA8IDApIGggKz0gMTtcbiAgZWxzZSBpZiAoaCA+IDEpIGggLT0gMTtcblxuICBpZiAoaCAqIDYgPCAxKSByZXR1cm4gbTEgKyAobTIgLSBtMSkgKiBoICogNjtcbiAgaWYgKGggKiAyIDwgMSkgcmV0dXJuIG0yO1xuICBpZiAoaCAqIDMgPCAyKSByZXR1cm4gbTEgKyAobTIgLSBtMSkgKiAoMi8zIC0gaCkgKiA2O1xuICByZXR1cm4gbTE7XG59XG5cbmZ1bmN0aW9uIHBhcnNlQ1NTQ29sb3IoY3NzX3N0cikge1xuICAvLyBSZW1vdmUgYWxsIHdoaXRlc3BhY2UsIG5vdCBjb21wbGlhbnQsIGJ1dCBzaG91bGQganVzdCBiZSBtb3JlIGFjY2VwdGluZy5cbiAgdmFyIHN0ciA9IGNzc19zdHIucmVwbGFjZSgvIC9nLCAnJykudG9Mb3dlckNhc2UoKTtcblxuICAvLyBDb2xvciBrZXl3b3JkcyAoYW5kIHRyYW5zcGFyZW50KSBsb29rdXAuXG4gIGlmIChzdHIgaW4ga0NTU0NvbG9yVGFibGUpIHJldHVybiBrQ1NTQ29sb3JUYWJsZVtzdHJdLnNsaWNlKCk7ICAvLyBkdXAuXG5cbiAgLy8gI2FiYyBhbmQgI2FiYzEyMyBzeW50YXguXG4gIGlmIChzdHJbMF0gPT09ICcjJykge1xuICAgIGlmIChzdHIubGVuZ3RoID09PSA0KSB7XG4gICAgICB2YXIgaXYgPSBwYXJzZUludChzdHIuc3Vic3RyKDEpLCAxNik7ICAvLyBUT0RPKGRlYW5tKTogU3RyaWN0ZXIgcGFyc2luZy5cbiAgICAgIGlmICghKGl2ID49IDAgJiYgaXYgPD0gMHhmZmYpKSByZXR1cm4gbnVsbDsgIC8vIENvdmVycyBOYU4uXG4gICAgICByZXR1cm4gWygoaXYgJiAweGYwMCkgPj4gNCkgfCAoKGl2ICYgMHhmMDApID4+IDgpLFxuICAgICAgICAgICAgICAoaXYgJiAweGYwKSB8ICgoaXYgJiAweGYwKSA+PiA0KSxcbiAgICAgICAgICAgICAgKGl2ICYgMHhmKSB8ICgoaXYgJiAweGYpIDw8IDQpLFxuICAgICAgICAgICAgICAxXTtcbiAgICB9IGVsc2UgaWYgKHN0ci5sZW5ndGggPT09IDcpIHtcbiAgICAgIHZhciBpdiA9IHBhcnNlSW50KHN0ci5zdWJzdHIoMSksIDE2KTsgIC8vIFRPRE8oZGVhbm0pOiBTdHJpY3RlciBwYXJzaW5nLlxuICAgICAgaWYgKCEoaXYgPj0gMCAmJiBpdiA8PSAweGZmZmZmZikpIHJldHVybiBudWxsOyAgLy8gQ292ZXJzIE5hTi5cbiAgICAgIHJldHVybiBbKGl2ICYgMHhmZjAwMDApID4+IDE2LFxuICAgICAgICAgICAgICAoaXYgJiAweGZmMDApID4+IDgsXG4gICAgICAgICAgICAgIGl2ICYgMHhmZixcbiAgICAgICAgICAgICAgMV07XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB2YXIgb3AgPSBzdHIuaW5kZXhPZignKCcpLCBlcCA9IHN0ci5pbmRleE9mKCcpJyk7XG4gIGlmIChvcCAhPT0gLTEgJiYgZXAgKyAxID09PSBzdHIubGVuZ3RoKSB7XG4gICAgdmFyIGZuYW1lID0gc3RyLnN1YnN0cigwLCBvcCk7XG4gICAgdmFyIHBhcmFtcyA9IHN0ci5zdWJzdHIob3ArMSwgZXAtKG9wKzEpKS5zcGxpdCgnLCcpO1xuICAgIHZhciBhbHBoYSA9IDE7ICAvLyBUbyBhbGxvdyBjYXNlIGZhbGx0aHJvdWdoLlxuICAgIHN3aXRjaCAoZm5hbWUpIHtcbiAgICAgIGNhc2UgJ3JnYmEnOlxuICAgICAgICBpZiAocGFyYW1zLmxlbmd0aCAhPT0gNCkgcmV0dXJuIG51bGw7XG4gICAgICAgIGFscGhhID0gcGFyc2VfY3NzX2Zsb2F0KHBhcmFtcy5wb3AoKSk7XG4gICAgICAgIC8vIEZhbGwgdGhyb3VnaC5cbiAgICAgIGNhc2UgJ3JnYic6XG4gICAgICAgIGlmIChwYXJhbXMubGVuZ3RoICE9PSAzKSByZXR1cm4gbnVsbDtcbiAgICAgICAgcmV0dXJuIFtwYXJzZV9jc3NfaW50KHBhcmFtc1swXSksXG4gICAgICAgICAgICAgICAgcGFyc2VfY3NzX2ludChwYXJhbXNbMV0pLFxuICAgICAgICAgICAgICAgIHBhcnNlX2Nzc19pbnQocGFyYW1zWzJdKSxcbiAgICAgICAgICAgICAgICBhbHBoYV07XG4gICAgICBjYXNlICdoc2xhJzpcbiAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGggIT09IDQpIHJldHVybiBudWxsO1xuICAgICAgICBhbHBoYSA9IHBhcnNlX2Nzc19mbG9hdChwYXJhbXMucG9wKCkpO1xuICAgICAgICAvLyBGYWxsIHRocm91Z2guXG4gICAgICBjYXNlICdoc2wnOlxuICAgICAgICBpZiAocGFyYW1zLmxlbmd0aCAhPT0gMykgcmV0dXJuIG51bGw7XG4gICAgICAgIHZhciBoID0gKCgocGFyc2VGbG9hdChwYXJhbXNbMF0pICUgMzYwKSArIDM2MCkgJSAzNjApIC8gMzYwOyAgLy8gMCAuLiAxXG4gICAgICAgIC8vIE5PVEUoZGVhbm0pOiBBY2NvcmRpbmcgdG8gdGhlIENTUyBzcGVjIHMvbCBzaG91bGQgb25seSBiZVxuICAgICAgICAvLyBwZXJjZW50YWdlcywgYnV0IHdlIGRvbid0IGJvdGhlciBhbmQgbGV0IGZsb2F0IG9yIHBlcmNlbnRhZ2UuXG4gICAgICAgIHZhciBzID0gcGFyc2VfY3NzX2Zsb2F0KHBhcmFtc1sxXSk7XG4gICAgICAgIHZhciBsID0gcGFyc2VfY3NzX2Zsb2F0KHBhcmFtc1syXSk7XG4gICAgICAgIHZhciBtMiA9IGwgPD0gMC41ID8gbCAqIChzICsgMSkgOiBsICsgcyAtIGwgKiBzO1xuICAgICAgICB2YXIgbTEgPSBsICogMiAtIG0yO1xuICAgICAgICByZXR1cm4gW2NsYW1wX2Nzc19ieXRlKGNzc19odWVfdG9fcmdiKG0xLCBtMiwgaCsxLzMpICogMjU1KSxcbiAgICAgICAgICAgICAgICBjbGFtcF9jc3NfYnl0ZShjc3NfaHVlX3RvX3JnYihtMSwgbTIsIGgpICogMjU1KSxcbiAgICAgICAgICAgICAgICBjbGFtcF9jc3NfYnl0ZShjc3NfaHVlX3RvX3JnYihtMSwgbTIsIGgtMS8zKSAqIDI1NSksXG4gICAgICAgICAgICAgICAgYWxwaGFdO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbnRyeSB7IGV4cG9ydHMucGFyc2VDU1NDb2xvciA9IHBhcnNlQ1NTQ29sb3IgfSBjYXRjaChlKSB7IH1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7IHBhcnNlQ1NTQ29sb3IgfSBmcm9tICdjc3Njb2xvcnBhcnNlcic7XG5cbi8qKlxuICogQW4gUkdCQSBjb2xvciB2YWx1ZS4gQ3JlYXRlIGluc3RhbmNlcyBmcm9tIGNvbG9yIHN0cmluZ3MgdXNpbmcgdGhlIHN0YXRpY1xuICogbWV0aG9kIGBDb2xvci5wYXJzZWAuIFRoZSBjb25zdHJ1Y3RvciBhY2NlcHRzIFJHQiBjaGFubmVsIHZhbHVlcyBpbiB0aGUgcmFuZ2VcbiAqIGBbMCwgMV1gLCBwcmVtdWx0aXBsaWVkIGJ5IEEuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IHIgVGhlIHJlZCBjaGFubmVsLlxuICogQHBhcmFtIHtudW1iZXJ9IGcgVGhlIGdyZWVuIGNoYW5uZWwuXG4gKiBAcGFyYW0ge251bWJlcn0gYiBUaGUgYmx1ZSBjaGFubmVsLlxuICogQHBhcmFtIHtudW1iZXJ9IGEgVGhlIGFscGhhIGNoYW5uZWwuXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBDb2xvciB7XG4gICAgcjogbnVtYmVyO1xuICAgIGc6IG51bWJlcjtcbiAgICBiOiBudW1iZXI7XG4gICAgYTogbnVtYmVyO1xuXG4gICAgY29uc3RydWN0b3IocjogbnVtYmVyLCBnOiBudW1iZXIsIGI6IG51bWJlciwgYTogbnVtYmVyID0gMSkge1xuICAgICAgICB0aGlzLnIgPSByO1xuICAgICAgICB0aGlzLmcgPSBnO1xuICAgICAgICB0aGlzLmIgPSBiO1xuICAgICAgICB0aGlzLmEgPSBhO1xuICAgIH1cblxuICAgIHN0YXRpYyBibGFjazogQ29sb3I7XG4gICAgc3RhdGljIHdoaXRlOiBDb2xvcjtcbiAgICBzdGF0aWMgdHJhbnNwYXJlbnQ6IENvbG9yO1xuICAgIHN0YXRpYyByZWQ6IENvbG9yO1xuXG4gICAgLyoqXG4gICAgICogUGFyc2VzIHZhbGlkIENTUyBjb2xvciBzdHJpbmdzIGFuZCByZXR1cm5zIGEgYENvbG9yYCBpbnN0YW5jZS5cbiAgICAgKiBAcmV0dXJucyBBIGBDb2xvcmAgaW5zdGFuY2UsIG9yIGB1bmRlZmluZWRgIGlmIHRoZSBpbnB1dCBpcyBub3QgYSB2YWxpZCBjb2xvciBzdHJpbmcuXG4gICAgICovXG4gICAgc3RhdGljIHBhcnNlKGlucHV0OiA/c3RyaW5nKTogQ29sb3IgfCB2b2lkIHtcbiAgICAgICAgaWYgKCFpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIENvbG9yKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGlucHV0ICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJnYmEgPSBwYXJzZUNTU0NvbG9yKGlucHV0KTtcbiAgICAgICAgaWYgKCFyZ2JhKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBDb2xvcihcbiAgICAgICAgICAgIHJnYmFbMF0gLyAyNTUgKiByZ2JhWzNdLFxuICAgICAgICAgICAgcmdiYVsxXSAvIDI1NSAqIHJnYmFbM10sXG4gICAgICAgICAgICByZ2JhWzJdIC8gMjU1ICogcmdiYVszXSxcbiAgICAgICAgICAgIHJnYmFbM11cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIFJHQkEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgY29sb3IgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBBbiBSR0JBIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIHZhciBwdXJwbGUgPSBuZXcgQ29sb3IucGFyc2UoJ3B1cnBsZScpO1xuICAgICAqIHB1cnBsZS50b1N0cmluZzsgLy8gPSBcInJnYmEoMTI4LDAsMTI4LDEpXCJcbiAgICAgKiB2YXIgdHJhbnNsdWNlbnRHcmVlbiA9IG5ldyBDb2xvci5wYXJzZSgncmdiYSgyNiwgMjA3LCAyNiwgLjczKScpO1xuICAgICAqIHRyYW5zbHVjZW50R3JlZW4udG9TdHJpbmcoKTsgLy8gPSBcInJnYmEoMjYsMjA3LDI2LDAuNzMpXCJcbiAgICAgKi9cbiAgICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBbciwgZywgYiwgYV0gPSB0aGlzLnRvQXJyYXkoKTtcbiAgICAgICAgcmV0dXJuIGByZ2JhKCR7TWF0aC5yb3VuZChyKX0sJHtNYXRoLnJvdW5kKGcpfSwke01hdGgucm91bmQoYil9LCR7YX0pYDtcbiAgICB9XG5cbiAgICB0b0FycmF5KCk6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdIHtcbiAgICAgICAgY29uc3Qge3IsIGcsIGIsIGF9ID0gdGhpcztcbiAgICAgICAgcmV0dXJuIGEgPT09IDAgPyBbMCwgMCwgMCwgMF0gOiBbXG4gICAgICAgICAgICByICogMjU1IC8gYSxcbiAgICAgICAgICAgIGcgKiAyNTUgLyBhLFxuICAgICAgICAgICAgYiAqIDI1NSAvIGEsXG4gICAgICAgICAgICBhXG4gICAgICAgIF07XG4gICAgfVxufVxuXG5Db2xvci5ibGFjayA9IG5ldyBDb2xvcigwLCAwLCAwLCAxKTtcbkNvbG9yLndoaXRlID0gbmV3IENvbG9yKDEsIDEsIDEsIDEpO1xuQ29sb3IudHJhbnNwYXJlbnQgPSBuZXcgQ29sb3IoMCwgMCwgMCwgMCk7XG5Db2xvci5yZWQgPSBuZXcgQ29sb3IoMSwgMCwgMCwgMSk7XG5cbmV4cG9ydCBkZWZhdWx0IENvbG9yO1xuIiwiLy8gQGZsb3dcblxuLy8gRmxvdyB0eXBlIGRlY2xhcmF0aW9ucyBmb3IgSW50bCBjcmliYmVkIGZyb21cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9mbG93L2lzc3Vlcy8xMjcwXG5cbmRlY2xhcmUgdmFyIEludGw6IHtcbiAgICBDb2xsYXRvcjogQ2xhc3M8SW50bCRDb2xsYXRvcj5cbn07XG5cbmRlY2xhcmUgY2xhc3MgSW50bCRDb2xsYXRvciB7XG4gICAgY29uc3RydWN0b3IgKFxuICAgICAgICBsb2NhbGVzPzogc3RyaW5nIHwgc3RyaW5nW10sXG4gICAgICAgIG9wdGlvbnM/OiBDb2xsYXRvck9wdGlvbnNcbiAgICApOiBJbnRsJENvbGxhdG9yO1xuXG4gICAgc3RhdGljIChcbiAgICAgICAgbG9jYWxlcz86IHN0cmluZyB8IHN0cmluZ1tdLFxuICAgICAgICBvcHRpb25zPzogQ29sbGF0b3JPcHRpb25zXG4gICAgKTogSW50bCRDb2xsYXRvcjtcblxuICAgIGNvbXBhcmUgKGE6IHN0cmluZywgYjogc3RyaW5nKTogbnVtYmVyO1xuXG4gICAgcmVzb2x2ZWRPcHRpb25zKCk6IGFueTtcbn1cblxudHlwZSBDb2xsYXRvck9wdGlvbnMgPSB7XG4gICAgbG9jYWxlTWF0Y2hlcj86ICdsb29rdXAnIHwgJ2Jlc3QgZml0JyxcbiAgICB1c2FnZT86ICdzb3J0JyB8ICdzZWFyY2gnLFxuICAgIHNlbnNpdGl2aXR5PzogJ2Jhc2UnIHwgJ2FjY2VudCcgfCAnY2FzZScgfCAndmFyaWFudCcsXG4gICAgaWdub3JlUHVuY3R1YXRpb24/OiBib29sZWFuLFxuICAgIG51bWVyaWM/OiBib29sZWFuLFxuICAgIGNhc2VGaXJzdD86ICd1cHBlcicgfCAnbG93ZXInIHwgJ2ZhbHNlJ1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDb2xsYXRvciB7XG4gICAgbG9jYWxlOiBzdHJpbmcgfCBudWxsO1xuICAgIHNlbnNpdGl2aXR5OiAnYmFzZScgfCAnYWNjZW50JyB8ICdjYXNlJyB8ICd2YXJpYW50JztcbiAgICBjb2xsYXRvcjogSW50bCRDb2xsYXRvcjtcblxuICAgIGNvbnN0cnVjdG9yKGNhc2VTZW5zaXRpdmU6IGJvb2xlYW4sIGRpYWNyaXRpY1NlbnNpdGl2ZTogYm9vbGVhbiwgbG9jYWxlOiBzdHJpbmcgfCBudWxsKSB7XG4gICAgICAgIGlmIChjYXNlU2Vuc2l0aXZlKVxuICAgICAgICAgICAgdGhpcy5zZW5zaXRpdml0eSA9IGRpYWNyaXRpY1NlbnNpdGl2ZSA/ICd2YXJpYW50JyA6ICdjYXNlJztcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhpcy5zZW5zaXRpdml0eSA9IGRpYWNyaXRpY1NlbnNpdGl2ZSA/ICdhY2NlbnQnIDogJ2Jhc2UnO1xuXG4gICAgICAgIHRoaXMubG9jYWxlID0gbG9jYWxlO1xuICAgICAgICB0aGlzLmNvbGxhdG9yID0gbmV3IEludGwuQ29sbGF0b3IodGhpcy5sb2NhbGUgPyB0aGlzLmxvY2FsZSA6IFtdLFxuICAgICAgICAgICAgeyBzZW5zaXRpdml0eTogdGhpcy5zZW5zaXRpdml0eSwgdXNhZ2U6ICdzZWFyY2gnIH0pO1xuICAgIH1cblxuICAgIGNvbXBhcmUobGhzOiBzdHJpbmcsIHJoczogc3RyaW5nKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29sbGF0b3IuY29tcGFyZShsaHMsIHJocyk7XG4gICAgfVxuXG4gICAgcmVzb2x2ZWRMb2NhbGUoKTogc3RyaW5nIHtcbiAgICAgICAgLy8gV2UgY3JlYXRlIGEgQ29sbGF0b3Igd2l0aG91dCBcInVzYWdlOiBzZWFyY2hcIiBiZWNhdXNlIHdlIGRvbid0IHdhbnRcbiAgICAgICAgLy8gdGhlIHNlYXJjaCBvcHRpb25zIGVuY29kZWQgaW4gb3VyIHJlc3VsdCAoZS5nLiBcImVuLXUtY28tc2VhcmNoXCIpXG4gICAgICAgIHJldHVybiBuZXcgSW50bC5Db2xsYXRvcih0aGlzLmxvY2FsZSA/IHRoaXMubG9jYWxlIDogW10pXG4gICAgICAgICAgICAucmVzb2x2ZWRPcHRpb25zKCkubG9jYWxlO1xuICAgIH1cbn1cbiIsIi8vIEBmbG93XG5cbmV4cG9ydCBjbGFzcyBGb3JtYXR0ZWRTZWN0aW9uIHtcbiAgICB0ZXh0OiBzdHJpbmc7XG4gICAgc2NhbGU6IG51bWJlciB8IG51bGw7XG4gICAgZm9udFN0YWNrOiBzdHJpbmcgfCBudWxsO1xuXG4gICAgY29uc3RydWN0b3IodGV4dDogc3RyaW5nLCBzY2FsZTogbnVtYmVyIHwgbnVsbCwgZm9udFN0YWNrOiBzdHJpbmcgfCBudWxsKSB7XG4gICAgICAgIHRoaXMudGV4dCA9IHRleHQ7XG4gICAgICAgIHRoaXMuc2NhbGUgPSBzY2FsZTtcbiAgICAgICAgdGhpcy5mb250U3RhY2sgPSBmb250U3RhY2s7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBGb3JtYXR0ZWQge1xuICAgIHNlY3Rpb25zOiBBcnJheTxGb3JtYXR0ZWRTZWN0aW9uPjtcblxuICAgIGNvbnN0cnVjdG9yKHNlY3Rpb25zOiBBcnJheTxGb3JtYXR0ZWRTZWN0aW9uPikge1xuICAgICAgICB0aGlzLnNlY3Rpb25zID0gc2VjdGlvbnM7XG4gICAgfVxuXG4gICAgc3RhdGljIGZyb21TdHJpbmcodW5mb3JtYXR0ZWQ6IHN0cmluZyk6IEZvcm1hdHRlZCB7XG4gICAgICAgIHJldHVybiBuZXcgRm9ybWF0dGVkKFtuZXcgRm9ybWF0dGVkU2VjdGlvbih1bmZvcm1hdHRlZCwgbnVsbCwgbnVsbCldKTtcbiAgICB9XG5cbiAgICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5zZWN0aW9ucy5tYXAoc2VjdGlvbiA9PiBzZWN0aW9uLnRleHQpLmpvaW4oJycpO1xuICAgIH1cblxuICAgIHNlcmlhbGl6ZSgpIHtcbiAgICAgICAgY29uc3Qgc2VyaWFsaXplZCA9IFtcImZvcm1hdFwiXTtcbiAgICAgICAgZm9yIChjb25zdCBzZWN0aW9uIG9mIHRoaXMuc2VjdGlvbnMpIHtcbiAgICAgICAgICAgIHNlcmlhbGl6ZWQucHVzaChzZWN0aW9uLnRleHQpO1xuICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHt9O1xuICAgICAgICAgICAgaWYgKHNlY3Rpb24uZm9udFN0YWNrKSB7XG4gICAgICAgICAgICAgICAgb3B0aW9uc1tcInRleHQtZm9udFwiXSA9IFtcImxpdGVyYWxcIiwgc2VjdGlvbi5mb250U3RhY2suc3BsaXQoJywnKV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc2VjdGlvbi5zY2FsZSkge1xuICAgICAgICAgICAgICAgIG9wdGlvbnNbXCJmb250LXNjYWxlXCJdID0gc2VjdGlvbi5zY2FsZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNlcmlhbGl6ZWQucHVzaChvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2VyaWFsaXplZDtcbiAgICB9XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5cbmltcG9ydCBDb2xvciBmcm9tICcuLi91dGlsL2NvbG9yJztcbmltcG9ydCBDb2xsYXRvciBmcm9tICcuL3R5cGVzL2NvbGxhdG9yJztcbmltcG9ydCBGb3JtYXR0ZWQgZnJvbSAnLi90eXBlcy9mb3JtYXR0ZWQnO1xuaW1wb3J0IHsgTnVsbFR5cGUsIE51bWJlclR5cGUsIFN0cmluZ1R5cGUsIEJvb2xlYW5UeXBlLCBDb2xvclR5cGUsIE9iamVjdFR5cGUsIFZhbHVlVHlwZSwgQ29sbGF0b3JUeXBlLCBGb3JtYXR0ZWRUeXBlLCBhcnJheSB9IGZyb20gJy4vdHlwZXMnO1xuXG5pbXBvcnQgdHlwZSB7IFR5cGUgfSBmcm9tICcuL3R5cGVzJztcblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlUkdCQShyOiBtaXhlZCwgZzogbWl4ZWQsIGI6IG1peGVkLCBhPzogbWl4ZWQpOiA/c3RyaW5nIHtcbiAgICBpZiAoIShcbiAgICAgICAgdHlwZW9mIHIgPT09ICdudW1iZXInICYmIHIgPj0gMCAmJiByIDw9IDI1NSAmJlxuICAgICAgICB0eXBlb2YgZyA9PT0gJ251bWJlcicgJiYgZyA+PSAwICYmIGcgPD0gMjU1ICYmXG4gICAgICAgIHR5cGVvZiBiID09PSAnbnVtYmVyJyAmJiBiID49IDAgJiYgYiA8PSAyNTVcbiAgICApKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdHlwZW9mIGEgPT09ICdudW1iZXInID8gW3IsIGcsIGIsIGFdIDogW3IsIGcsIGJdO1xuICAgICAgICByZXR1cm4gYEludmFsaWQgcmdiYSB2YWx1ZSBbJHt2YWx1ZS5qb2luKCcsICcpfV06ICdyJywgJ2cnLCBhbmQgJ2InIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAyNTUuYDtcbiAgICB9XG5cbiAgICBpZiAoIShcbiAgICAgICAgdHlwZW9mIGEgPT09ICd1bmRlZmluZWQnIHx8ICh0eXBlb2YgYSA9PT0gJ251bWJlcicgJiYgYSA+PSAwICYmIGEgPD0gMSlcbiAgICApKSB7XG4gICAgICAgIHJldHVybiBgSW52YWxpZCByZ2JhIHZhbHVlIFske1tyLCBnLCBiLCBhXS5qb2luKCcsICcpfV06ICdhJyBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMS5gO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xufVxuXG5leHBvcnQgdHlwZSBWYWx1ZSA9IG51bGwgfCBzdHJpbmcgfCBib29sZWFuIHwgbnVtYmVyIHwgQ29sb3IgfCBDb2xsYXRvciB8IEZvcm1hdHRlZCB8ICRSZWFkT25seUFycmF5PFZhbHVlPiB8IHsgK1tzdHJpbmddOiBWYWx1ZSB9XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbHVlKG1peGVkOiBtaXhlZCk6IGJvb2xlYW4ge1xuICAgIGlmIChtaXhlZCA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBtaXhlZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgbWl4ZWQgPT09ICdib29sZWFuJykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBtaXhlZCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIGlmIChtaXhlZCBpbnN0YW5jZW9mIENvbG9yKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSBpZiAobWl4ZWQgaW5zdGFuY2VvZiBDb2xsYXRvcikge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKG1peGVkIGluc3RhbmNlb2YgRm9ybWF0dGVkKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShtaXhlZCkpIHtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIG1peGVkKSB7XG4gICAgICAgICAgICBpZiAoIWlzVmFsdWUoaXRlbSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgbWl4ZWQgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIG1peGVkKSB7XG4gICAgICAgICAgICBpZiAoIWlzVmFsdWUobWl4ZWRba2V5XSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHR5cGVPZih2YWx1ZTogVmFsdWUpOiBUeXBlIHtcbiAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIE51bGxUeXBlO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gU3RyaW5nVHlwZTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIHJldHVybiBCb29sZWFuVHlwZTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgcmV0dXJuIE51bWJlclR5cGU7XG4gICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIENvbG9yKSB7XG4gICAgICAgIHJldHVybiBDb2xvclR5cGU7XG4gICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIENvbGxhdG9yKSB7XG4gICAgICAgIHJldHVybiBDb2xsYXRvclR5cGU7XG4gICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEZvcm1hdHRlZCkge1xuICAgICAgICByZXR1cm4gRm9ybWF0dGVkVHlwZTtcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IHZhbHVlLmxlbmd0aDtcbiAgICAgICAgbGV0IGl0ZW1UeXBlOiA/VHlwZTtcblxuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdmFsdWUpIHtcbiAgICAgICAgICAgIGNvbnN0IHQgPSB0eXBlT2YoaXRlbSk7XG4gICAgICAgICAgICBpZiAoIWl0ZW1UeXBlKSB7XG4gICAgICAgICAgICAgICAgaXRlbVR5cGUgPSB0O1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpdGVtVHlwZSA9PT0gdCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpdGVtVHlwZSA9IFZhbHVlVHlwZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhcnJheShpdGVtVHlwZSB8fCBWYWx1ZVR5cGUsIGxlbmd0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgYXNzZXJ0KHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpO1xuICAgICAgICByZXR1cm4gT2JqZWN0VHlwZTtcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b1N0cmluZyh2YWx1ZTogVmFsdWUpIHtcbiAgICBjb25zdCB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnc3RyaW5nJyB8fCB0eXBlID09PSAnbnVtYmVyJyB8fCB0eXBlID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XG4gICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIENvbG9yIHx8IHZhbHVlIGluc3RhbmNlb2YgRm9ybWF0dGVkKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZS50b1N0cmluZygpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gICAgfVxufVxuXG5leHBvcnQgeyBDb2xvciwgQ29sbGF0b3IgfTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7IGlzVmFsdWUsIHR5cGVPZiwgQ29sb3IgfSBmcm9tICcuLi92YWx1ZXMnO1xuaW1wb3J0IEZvcm1hdHRlZCBmcm9tICcuLi90eXBlcy9mb3JtYXR0ZWQnO1xuXG5pbXBvcnQgdHlwZSB7IFR5cGUgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgdHlwZSB7IFZhbHVlIH0gIGZyb20gJy4uL3ZhbHVlcyc7XG5pbXBvcnQgdHlwZSB7IEV4cHJlc3Npb24gfSBmcm9tICcuLi9leHByZXNzaW9uJztcbmltcG9ydCB0eXBlIFBhcnNpbmdDb250ZXh0IGZyb20gJy4uL3BhcnNpbmdfY29udGV4dCc7XG5cbmNsYXNzIExpdGVyYWwgaW1wbGVtZW50cyBFeHByZXNzaW9uIHtcbiAgICB0eXBlOiBUeXBlO1xuICAgIHZhbHVlOiBWYWx1ZTtcblxuICAgIGNvbnN0cnVjdG9yKHR5cGU6IFR5cGUsIHZhbHVlOiBWYWx1ZSkge1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuXG4gICAgc3RhdGljIHBhcnNlKGFyZ3M6IEFycmF5PG1peGVkPiwgY29udGV4dDogUGFyc2luZ0NvbnRleHQpIHtcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoICE9PSAyKVxuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYCdsaXRlcmFsJyBleHByZXNzaW9uIHJlcXVpcmVzIGV4YWN0bHkgb25lIGFyZ3VtZW50LCBidXQgZm91bmQgJHthcmdzLmxlbmd0aCAtIDF9IGluc3RlYWQuYCk7XG5cbiAgICAgICAgaWYgKCFpc1ZhbHVlKGFyZ3NbMV0pKVxuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYGludmFsaWQgdmFsdWVgKTtcblxuICAgICAgICBjb25zdCB2YWx1ZSA9IChhcmdzWzFdOiBhbnkpO1xuICAgICAgICBsZXQgdHlwZSA9IHR5cGVPZih2YWx1ZSk7XG5cbiAgICAgICAgLy8gc3BlY2lhbCBjYXNlOiBpbmZlciB0aGUgaXRlbSB0eXBlIGlmIHBvc3NpYmxlIGZvciB6ZXJvLWxlbmd0aCBhcnJheXNcbiAgICAgICAgY29uc3QgZXhwZWN0ZWQgPSBjb250ZXh0LmV4cGVjdGVkVHlwZTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdHlwZS5raW5kID09PSAnYXJyYXknICYmXG4gICAgICAgICAgICB0eXBlLk4gPT09IDAgJiZcbiAgICAgICAgICAgIGV4cGVjdGVkICYmXG4gICAgICAgICAgICBleHBlY3RlZC5raW5kID09PSAnYXJyYXknICYmXG4gICAgICAgICAgICAodHlwZW9mIGV4cGVjdGVkLk4gIT09ICdudW1iZXInIHx8IGV4cGVjdGVkLk4gPT09IDApXG4gICAgICAgICkge1xuICAgICAgICAgICAgdHlwZSA9IGV4cGVjdGVkO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBMaXRlcmFsKHR5cGUsIHZhbHVlKTtcbiAgICB9XG5cbiAgICBldmFsdWF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWU7XG4gICAgfVxuXG4gICAgZWFjaENoaWxkKCkge31cblxuICAgIHBvc3NpYmxlT3V0cHV0cygpIHtcbiAgICAgICAgcmV0dXJuIFt0aGlzLnZhbHVlXTtcbiAgICB9XG5cbiAgICBzZXJpYWxpemUoKTogQXJyYXk8bWl4ZWQ+IHtcbiAgICAgICAgaWYgKHRoaXMudHlwZS5raW5kID09PSAnYXJyYXknIHx8IHRoaXMudHlwZS5raW5kID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgcmV0dXJuIFtcImxpdGVyYWxcIiwgdGhpcy52YWx1ZV07XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy52YWx1ZSBpbnN0YW5jZW9mIENvbG9yKSB7XG4gICAgICAgICAgICAvLyBDb25zdGFudC1mb2xkaW5nIGNhbiBnZW5lcmF0ZSBMaXRlcmFsIGV4cHJlc3Npb25zIHRoYXQgeW91XG4gICAgICAgICAgICAvLyBjb3VsZG4ndCBhY3R1YWxseSBnZW5lcmF0ZSB3aXRoIGEgXCJsaXRlcmFsXCIgZXhwcmVzc2lvbixcbiAgICAgICAgICAgIC8vIHNvIHdlIGhhdmUgdG8gaW1wbGVtZW50IGFuIGVxdWl2YWxlbnQgc2VyaWFsaXphdGlvbiBoZXJlXG4gICAgICAgICAgICByZXR1cm4gW1wicmdiYVwiXS5jb25jYXQodGhpcy52YWx1ZS50b0FycmF5KCkpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMudmFsdWUgaW5zdGFuY2VvZiBGb3JtYXR0ZWQpIHtcbiAgICAgICAgICAgIC8vIFNhbWUgYXMgQ29sb3JcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnZhbHVlLnNlcmlhbGl6ZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYXNzZXJ0KHRoaXMudmFsdWUgPT09IG51bGwgfHxcbiAgICAgICAgICAgICAgICB0eXBlb2YgdGhpcy52YWx1ZSA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgICAgICAgICB0eXBlb2YgdGhpcy52YWx1ZSA9PT0gJ251bWJlcicgfHxcbiAgICAgICAgICAgICAgICB0eXBlb2YgdGhpcy52YWx1ZSA9PT0gJ2Jvb2xlYW4nKTtcbiAgICAgICAgICAgIHJldHVybiAodGhpcy52YWx1ZTogYW55KTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgTGl0ZXJhbDtcbiIsIi8vIEBmbG93XG5cbmNsYXNzIFJ1bnRpbWVFcnJvciB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIG1lc3NhZ2U6IHN0cmluZztcblxuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgICAgICB0aGlzLm5hbWUgPSAnRXhwcmVzc2lvbkV2YWx1YXRpb25FcnJvcic7XG4gICAgICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgfVxuXG4gICAgdG9KU09OKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tZXNzYWdlO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgUnVudGltZUVycm9yO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5pbXBvcnQge1xuICAgIE9iamVjdFR5cGUsXG4gICAgVmFsdWVUeXBlLFxuICAgIFN0cmluZ1R5cGUsXG4gICAgTnVtYmVyVHlwZSxcbiAgICBCb29sZWFuVHlwZSxcbiAgICBjaGVja1N1YnR5cGUsXG4gICAgdG9TdHJpbmcsXG4gICAgYXJyYXlcbn0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IFJ1bnRpbWVFcnJvciBmcm9tICcuLi9ydW50aW1lX2Vycm9yJztcbmltcG9ydCB7IHR5cGVPZiB9IGZyb20gJy4uL3ZhbHVlcyc7XG5cbmltcG9ydCB0eXBlIHsgRXhwcmVzc2lvbiB9IGZyb20gJy4uL2V4cHJlc3Npb24nO1xuaW1wb3J0IHR5cGUgUGFyc2luZ0NvbnRleHQgZnJvbSAnLi4vcGFyc2luZ19jb250ZXh0JztcbmltcG9ydCB0eXBlIEV2YWx1YXRpb25Db250ZXh0IGZyb20gJy4uL2V2YWx1YXRpb25fY29udGV4dCc7XG5pbXBvcnQgdHlwZSB7IFZhbHVlIH0gZnJvbSAnLi4vdmFsdWVzJztcbmltcG9ydCB0eXBlIHsgVHlwZSB9IGZyb20gJy4uL3R5cGVzJztcblxuY29uc3QgdHlwZXMgPSB7XG4gICAgc3RyaW5nOiBTdHJpbmdUeXBlLFxuICAgIG51bWJlcjogTnVtYmVyVHlwZSxcbiAgICBib29sZWFuOiBCb29sZWFuVHlwZSxcbiAgICBvYmplY3Q6IE9iamVjdFR5cGVcbn07XG5cbmNsYXNzIEFzc2VydGlvbiBpbXBsZW1lbnRzIEV4cHJlc3Npb24ge1xuICAgIHR5cGU6IFR5cGU7XG4gICAgYXJnczogQXJyYXk8RXhwcmVzc2lvbj47XG5cbiAgICBjb25zdHJ1Y3Rvcih0eXBlOiBUeXBlLCBhcmdzOiBBcnJheTxFeHByZXNzaW9uPikge1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLmFyZ3MgPSBhcmdzO1xuICAgIH1cblxuICAgIHN0YXRpYyBwYXJzZShhcmdzOiBBcnJheTxtaXhlZD4sIGNvbnRleHQ6IFBhcnNpbmdDb250ZXh0KTogP0V4cHJlc3Npb24ge1xuICAgICAgICBpZiAoYXJncy5sZW5ndGggPCAyKVxuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYEV4cGVjdGVkIGF0IGxlYXN0IG9uZSBhcmd1bWVudC5gKTtcblxuICAgICAgICBsZXQgaSA9IDE7XG4gICAgICAgIGxldCB0eXBlO1xuXG4gICAgICAgIGNvbnN0IG5hbWU6IHN0cmluZyA9IChhcmdzWzBdOiBhbnkpO1xuICAgICAgICBpZiAobmFtZSA9PT0gJ2FycmF5Jykge1xuICAgICAgICAgICAgbGV0IGl0ZW1UeXBlO1xuICAgICAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID4gMikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHR5cGUgPSBhcmdzWzFdO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdHlwZSAhPT0gJ3N0cmluZycgfHwgISh0eXBlIGluIHR5cGVzKSB8fCB0eXBlID09PSAnb2JqZWN0JylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoJ1RoZSBpdGVtIHR5cGUgYXJndW1lbnQgb2YgXCJhcnJheVwiIG11c3QgYmUgb25lIG9mIHN0cmluZywgbnVtYmVyLCBib29sZWFuJywgMSk7XG4gICAgICAgICAgICAgICAgaXRlbVR5cGUgPSB0eXBlc1t0eXBlXTtcbiAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGl0ZW1UeXBlID0gVmFsdWVUeXBlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgTjtcbiAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA+IDMpIHtcbiAgICAgICAgICAgICAgICBpZiAoYXJnc1syXSAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgICAgICAodHlwZW9mIGFyZ3NbMl0gIT09ICdudW1iZXInIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmdzWzJdIDwgMCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgYXJnc1syXSAhPT0gTWF0aC5mbG9vcihhcmdzWzJdKSlcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoJ1RoZSBsZW5ndGggYXJndW1lbnQgdG8gXCJhcnJheVwiIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIGxpdGVyYWwnLCAyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgTiA9IGFyZ3NbMl07XG4gICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0eXBlID0gYXJyYXkoaXRlbVR5cGUsIE4pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYXNzZXJ0KHR5cGVzW25hbWVdLCBuYW1lKTtcbiAgICAgICAgICAgIHR5cGUgPSB0eXBlc1tuYW1lXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IFtdO1xuICAgICAgICBmb3IgKDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGlucHV0ID0gY29udGV4dC5wYXJzZShhcmdzW2ldLCBpLCBWYWx1ZVR5cGUpO1xuICAgICAgICAgICAgaWYgKCFpbnB1dCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBwYXJzZWQucHVzaChpbnB1dCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IEFzc2VydGlvbih0eXBlLCBwYXJzZWQpO1xuICAgIH1cblxuICAgIGV2YWx1YXRlKGN0eDogRXZhbHVhdGlvbkNvbnRleHQpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmFyZ3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5hcmdzW2ldLmV2YWx1YXRlKGN0eCk7XG4gICAgICAgICAgICBjb25zdCBlcnJvciA9IGNoZWNrU3VidHlwZSh0aGlzLnR5cGUsIHR5cGVPZih2YWx1ZSkpO1xuICAgICAgICAgICAgaWYgKCFlcnJvcikge1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaSA9PT0gdGhpcy5hcmdzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUVycm9yKGBFeHBlY3RlZCB2YWx1ZSB0byBiZSBvZiB0eXBlICR7dG9TdHJpbmcodGhpcy50eXBlKX0sIGJ1dCBmb3VuZCAke3RvU3RyaW5nKHR5cGVPZih2YWx1ZSkpfSBpbnN0ZWFkLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgYXNzZXJ0KGZhbHNlKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgZWFjaENoaWxkKGZuOiAoRXhwcmVzc2lvbikgPT4gdm9pZCkge1xuICAgICAgICB0aGlzLmFyZ3MuZm9yRWFjaChmbik7XG4gICAgfVxuXG4gICAgcG9zc2libGVPdXRwdXRzKCk6IEFycmF5PFZhbHVlIHwgdm9pZD4ge1xuICAgICAgICByZXR1cm4gW10uY29uY2F0KC4uLnRoaXMuYXJncy5tYXAoKGFyZykgPT4gYXJnLnBvc3NpYmxlT3V0cHV0cygpKSk7XG4gICAgfVxuXG4gICAgc2VyaWFsaXplKCk6IEFycmF5PG1peGVkPiB7XG4gICAgICAgIGNvbnN0IHR5cGUgPSB0aGlzLnR5cGU7XG4gICAgICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSBbdHlwZS5raW5kXTtcbiAgICAgICAgaWYgKHR5cGUua2luZCA9PT0gJ2FycmF5Jykge1xuICAgICAgICAgICAgY29uc3QgaXRlbVR5cGUgPSB0eXBlLml0ZW1UeXBlO1xuICAgICAgICAgICAgaWYgKGl0ZW1UeXBlLmtpbmQgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgICAgICAgaXRlbVR5cGUua2luZCA9PT0gJ251bWJlcicgfHxcbiAgICAgICAgICAgICAgICBpdGVtVHlwZS5raW5kID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkLnB1c2goaXRlbVR5cGUua2luZCk7XG4gICAgICAgICAgICAgICAgY29uc3QgTiA9IHR5cGUuTjtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIE4gPT09ICdudW1iZXInIHx8IHRoaXMuYXJncy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWQucHVzaChOKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZWQuY29uY2F0KHRoaXMuYXJncy5tYXAoYXJnID0+IGFyZy5zZXJpYWxpemUoKSkpO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQXNzZXJ0aW9uO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHsgTnVtYmVyVHlwZSwgVmFsdWVUeXBlLCBGb3JtYXR0ZWRUeXBlLCBhcnJheSwgU3RyaW5nVHlwZSB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCBGb3JtYXR0ZWQsIHsgRm9ybWF0dGVkU2VjdGlvbiB9IGZyb20gJy4uL3R5cGVzL2Zvcm1hdHRlZCc7XG5pbXBvcnQgeyB0b1N0cmluZyB9IGZyb20gJy4uL3ZhbHVlcyc7XG5cbmltcG9ydCB0eXBlIHsgRXhwcmVzc2lvbiB9IGZyb20gJy4uL2V4cHJlc3Npb24nO1xuaW1wb3J0IHR5cGUgRXZhbHVhdGlvbkNvbnRleHQgZnJvbSAnLi4vZXZhbHVhdGlvbl9jb250ZXh0JztcbmltcG9ydCB0eXBlIFBhcnNpbmdDb250ZXh0IGZyb20gJy4uL3BhcnNpbmdfY29udGV4dCc7XG5pbXBvcnQgdHlwZSB7IFR5cGUgfSBmcm9tICcuLi90eXBlcyc7XG5cbnR5cGUgRm9ybWF0dGVkU2VjdGlvbkV4cHJlc3Npb24gPSB7XG4gICAgdGV4dDogRXhwcmVzc2lvbixcbiAgICBzY2FsZTogRXhwcmVzc2lvbiB8IG51bGw7XG4gICAgZm9udDogRXhwcmVzc2lvbiB8IG51bGw7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZvcm1hdEV4cHJlc3Npb24gaW1wbGVtZW50cyBFeHByZXNzaW9uIHtcbiAgICB0eXBlOiBUeXBlO1xuICAgIHNlY3Rpb25zOiBBcnJheTxGb3JtYXR0ZWRTZWN0aW9uRXhwcmVzc2lvbj47XG5cbiAgICBjb25zdHJ1Y3RvcihzZWN0aW9uczogQXJyYXk8Rm9ybWF0dGVkU2VjdGlvbkV4cHJlc3Npb24+KSB7XG4gICAgICAgIHRoaXMudHlwZSA9IEZvcm1hdHRlZFR5cGU7XG4gICAgICAgIHRoaXMuc2VjdGlvbnMgPSBzZWN0aW9ucztcbiAgICB9XG5cbiAgICBzdGF0aWMgcGFyc2UoYXJnczogQXJyYXk8bWl4ZWQ+LCBjb250ZXh0OiBQYXJzaW5nQ29udGV4dCk6ID9FeHByZXNzaW9uIHtcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoIDwgMykge1xuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYEV4cGVjdGVkIGF0IGxlYXN0IHR3byBhcmd1bWVudHMuYCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoKGFyZ3MubGVuZ3RoIC0gMSkgJSAyICE9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgRXhwZWN0ZWQgYW4gZXZlbiBudW1iZXIgb2YgYXJndW1lbnRzLmApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2VjdGlvbnM6IEFycmF5PEZvcm1hdHRlZFNlY3Rpb25FeHByZXNzaW9uPiA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGFyZ3MubGVuZ3RoIC0gMTsgaSArPSAyKSB7XG4gICAgICAgICAgICBjb25zdCB0ZXh0ID0gY29udGV4dC5wYXJzZShhcmdzW2ldLCAxLCBWYWx1ZVR5cGUpO1xuICAgICAgICAgICAgaWYgKCF0ZXh0KSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IGtpbmQgPSB0ZXh0LnR5cGUua2luZDtcbiAgICAgICAgICAgIGlmIChraW5kICE9PSAnc3RyaW5nJyAmJiBraW5kICE9PSAndmFsdWUnICYmIGtpbmQgIT09ICdudWxsJylcbiAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgRm9ybWF0dGVkIHRleHQgdHlwZSBtdXN0IGJlICdzdHJpbmcnLCAndmFsdWUnLCBvciAnbnVsbCcuYCk7XG5cbiAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSAoYXJnc1tpICsgMV06IGFueSk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShvcHRpb25zKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgRm9ybWF0IG9wdGlvbnMgYXJndW1lbnQgbXVzdCBiZSBhbiBvYmplY3QuYCk7XG5cbiAgICAgICAgICAgIGxldCBzY2FsZSA9IG51bGw7XG4gICAgICAgICAgICBpZiAob3B0aW9uc1snZm9udC1zY2FsZSddKSB7XG4gICAgICAgICAgICAgICAgc2NhbGUgPSBjb250ZXh0LnBhcnNlKG9wdGlvbnNbJ2ZvbnQtc2NhbGUnXSwgMSwgTnVtYmVyVHlwZSk7XG4gICAgICAgICAgICAgICAgaWYgKCFzY2FsZSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBmb250ID0gbnVsbDtcbiAgICAgICAgICAgIGlmIChvcHRpb25zWyd0ZXh0LWZvbnQnXSkge1xuICAgICAgICAgICAgICAgIGZvbnQgPSBjb250ZXh0LnBhcnNlKG9wdGlvbnNbJ3RleHQtZm9udCddLCAxLCBhcnJheShTdHJpbmdUeXBlKSk7XG4gICAgICAgICAgICAgICAgaWYgKCFmb250KSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNlY3Rpb25zLnB1c2goe3RleHQsIHNjYWxlLCBmb250fSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IEZvcm1hdEV4cHJlc3Npb24oc2VjdGlvbnMpO1xuICAgIH1cblxuICAgIGV2YWx1YXRlKGN0eDogRXZhbHVhdGlvbkNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBGb3JtYXR0ZWQoXG4gICAgICAgICAgICB0aGlzLnNlY3Rpb25zLm1hcChzZWN0aW9uID0+XG4gICAgICAgICAgICAgICAgbmV3IEZvcm1hdHRlZFNlY3Rpb24oXG4gICAgICAgICAgICAgICAgICAgIHRvU3RyaW5nKHNlY3Rpb24udGV4dC5ldmFsdWF0ZShjdHgpKSxcbiAgICAgICAgICAgICAgICAgICAgc2VjdGlvbi5zY2FsZSA/IHNlY3Rpb24uc2NhbGUuZXZhbHVhdGUoY3R4KSA6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIHNlY3Rpb24uZm9udCA/IHNlY3Rpb24uZm9udC5ldmFsdWF0ZShjdHgpLmpvaW4oJywnKSA6IG51bGxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZWFjaENoaWxkKGZuOiAoRXhwcmVzc2lvbikgPT4gdm9pZCkge1xuICAgICAgICBmb3IgKGNvbnN0IHNlY3Rpb24gb2YgdGhpcy5zZWN0aW9ucykge1xuICAgICAgICAgICAgZm4oc2VjdGlvbi50ZXh0KTtcbiAgICAgICAgICAgIGlmIChzZWN0aW9uLnNjYWxlKSB7XG4gICAgICAgICAgICAgICAgZm4oc2VjdGlvbi5zY2FsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc2VjdGlvbi5mb250KSB7XG4gICAgICAgICAgICAgICAgZm4oc2VjdGlvbi5mb250KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHBvc3NpYmxlT3V0cHV0cygpIHtcbiAgICAgICAgLy8gVGVjaG5pY2FsbHkgdGhlIGNvbWJpbmF0b3JpYyBzZXQgb2YgYWxsIGNoaWxkcmVuXG4gICAgICAgIC8vIFVzdWFsbHksIHRoaXMudGV4dCB3aWxsIGJlIHVuZGVmaW5lZCBhbnl3YXlcbiAgICAgICAgcmV0dXJuIFt1bmRlZmluZWRdO1xuICAgIH1cblxuICAgIHNlcmlhbGl6ZSgpIHtcbiAgICAgICAgY29uc3Qgc2VyaWFsaXplZCA9IFtcImZvcm1hdFwiXTtcbiAgICAgICAgZm9yIChjb25zdCBzZWN0aW9uIG9mIHRoaXMuc2VjdGlvbnMpIHtcbiAgICAgICAgICAgIHNlcmlhbGl6ZWQucHVzaChzZWN0aW9uLnRleHQuc2VyaWFsaXplKCkpO1xuICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHt9O1xuICAgICAgICAgICAgaWYgKHNlY3Rpb24uc2NhbGUpIHtcbiAgICAgICAgICAgICAgICBvcHRpb25zWydmb250LXNjYWxlJ10gPSBzZWN0aW9uLnNjYWxlLnNlcmlhbGl6ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHNlY3Rpb24uZm9udCkge1xuICAgICAgICAgICAgICAgIG9wdGlvbnNbJ3RleHQtZm9udCddID0gc2VjdGlvbi5mb250LnNlcmlhbGl6ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2VyaWFsaXplZC5wdXNoKG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZXJpYWxpemVkO1xuICAgIH1cbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcblxuaW1wb3J0IHtCb29sZWFuVHlwZSwgQ29sb3JUeXBlLCBOdW1iZXJUeXBlLCBTdHJpbmdUeXBlLCBWYWx1ZVR5cGV9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7Q29sb3IsIHRvU3RyaW5nIGFzIHZhbHVlVG9TdHJpbmcsIHZhbGlkYXRlUkdCQX0gZnJvbSAnLi4vdmFsdWVzJztcbmltcG9ydCBSdW50aW1lRXJyb3IgZnJvbSAnLi4vcnVudGltZV9lcnJvcic7XG5pbXBvcnQgRm9ybWF0dGVkIGZyb20gJy4uL3R5cGVzL2Zvcm1hdHRlZCc7XG5pbXBvcnQgRm9ybWF0RXhwcmVzc2lvbiBmcm9tICcuLi9kZWZpbml0aW9ucy9mb3JtYXQnO1xuXG5pbXBvcnQgdHlwZSB7IEV4cHJlc3Npb24gfSBmcm9tICcuLi9leHByZXNzaW9uJztcbmltcG9ydCB0eXBlIFBhcnNpbmdDb250ZXh0IGZyb20gJy4uL3BhcnNpbmdfY29udGV4dCc7XG5pbXBvcnQgdHlwZSBFdmFsdWF0aW9uQ29udGV4dCBmcm9tICcuLi9ldmFsdWF0aW9uX2NvbnRleHQnO1xuaW1wb3J0IHR5cGUgeyBWYWx1ZSB9IGZyb20gJy4uL3ZhbHVlcyc7XG5pbXBvcnQgdHlwZSB7IFR5cGUgfSBmcm9tICcuLi90eXBlcyc7XG5cbmNvbnN0IHR5cGVzID0ge1xuICAgICd0by1ib29sZWFuJzogQm9vbGVhblR5cGUsXG4gICAgJ3RvLWNvbG9yJzogQ29sb3JUeXBlLFxuICAgICd0by1udW1iZXInOiBOdW1iZXJUeXBlLFxuICAgICd0by1zdHJpbmcnOiBTdHJpbmdUeXBlXG59O1xuXG4vKipcbiAqIFNwZWNpYWwgZm9ybSBmb3IgZXJyb3ItY29hbGVzY2luZyBjb2VyY2lvbiBleHByZXNzaW9ucyBcInRvLW51bWJlclwiLFxuICogXCJ0by1jb2xvclwiLiAgU2luY2UgdGhlc2UgY29lcmNpb25zIGNhbiBmYWlsIGF0IHJ1bnRpbWUsIHRoZXkgYWNjZXB0IG11bHRpcGxlXG4gKiBhcmd1bWVudHMsIG9ubHkgZXZhbHVhdGluZyBvbmUgYXQgYSB0aW1lIHVudGlsIG9uZSBzdWNjZWVkcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBDb2VyY2lvbiBpbXBsZW1lbnRzIEV4cHJlc3Npb24ge1xuICAgIHR5cGU6IFR5cGU7XG4gICAgYXJnczogQXJyYXk8RXhwcmVzc2lvbj47XG5cbiAgICBjb25zdHJ1Y3Rvcih0eXBlOiBUeXBlLCBhcmdzOiBBcnJheTxFeHByZXNzaW9uPikge1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLmFyZ3MgPSBhcmdzO1xuICAgIH1cblxuICAgIHN0YXRpYyBwYXJzZShhcmdzOiBBcnJheTxtaXhlZD4sIGNvbnRleHQ6IFBhcnNpbmdDb250ZXh0KTogP0V4cHJlc3Npb24ge1xuICAgICAgICBpZiAoYXJncy5sZW5ndGggPCAyKVxuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYEV4cGVjdGVkIGF0IGxlYXN0IG9uZSBhcmd1bWVudC5gKTtcblxuICAgICAgICBjb25zdCBuYW1lOiBzdHJpbmcgPSAoYXJnc1swXTogYW55KTtcbiAgICAgICAgYXNzZXJ0KHR5cGVzW25hbWVdLCBuYW1lKTtcblxuICAgICAgICBpZiAoKG5hbWUgPT09ICd0by1ib29sZWFuJyB8fCBuYW1lID09PSAndG8tc3RyaW5nJykgJiYgYXJncy5sZW5ndGggIT09IDIpXG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgRXhwZWN0ZWQgb25lIGFyZ3VtZW50LmApO1xuXG4gICAgICAgIGNvbnN0IHR5cGUgPSB0eXBlc1tuYW1lXTtcblxuICAgICAgICBjb25zdCBwYXJzZWQgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBpbnB1dCA9IGNvbnRleHQucGFyc2UoYXJnc1tpXSwgaSwgVmFsdWVUeXBlKTtcbiAgICAgICAgICAgIGlmICghaW5wdXQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgcGFyc2VkLnB1c2goaW5wdXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBDb2VyY2lvbih0eXBlLCBwYXJzZWQpO1xuICAgIH1cblxuICAgIGV2YWx1YXRlKGN0eDogRXZhbHVhdGlvbkNvbnRleHQpIHtcbiAgICAgICAgaWYgKHRoaXMudHlwZS5raW5kID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgIHJldHVybiBCb29sZWFuKHRoaXMuYXJnc1swXS5ldmFsdWF0ZShjdHgpKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnR5cGUua2luZCA9PT0gJ2NvbG9yJykge1xuICAgICAgICAgICAgbGV0IGlucHV0O1xuICAgICAgICAgICAgbGV0IGVycm9yO1xuICAgICAgICAgICAgZm9yIChjb25zdCBhcmcgb2YgdGhpcy5hcmdzKSB7XG4gICAgICAgICAgICAgICAgaW5wdXQgPSBhcmcuZXZhbHVhdGUoY3R4KTtcbiAgICAgICAgICAgICAgICBlcnJvciA9IG51bGw7XG4gICAgICAgICAgICAgICAgaWYgKGlucHV0IGluc3RhbmNlb2YgQ29sb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlucHV0O1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjID0gY3R4LnBhcnNlQ29sb3IoaW5wdXQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYykgcmV0dXJuIGM7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGlucHV0KSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXQubGVuZ3RoIDwgMyB8fCBpbnB1dC5sZW5ndGggPiA0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvciA9IGBJbnZhbGlkIHJiZ2EgdmFsdWUgJHtKU09OLnN0cmluZ2lmeShpbnB1dCl9OiBleHBlY3RlZCBhbiBhcnJheSBjb250YWluaW5nIGVpdGhlciB0aHJlZSBvciBmb3VyIG51bWVyaWMgdmFsdWVzLmA7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvciA9IHZhbGlkYXRlUkdCQShpbnB1dFswXSwgaW5wdXRbMV0sIGlucHV0WzJdLCBpbnB1dFszXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb2xvcigoaW5wdXRbMF06IGFueSkgLyAyNTUsIChpbnB1dFsxXTogYW55KSAvIDI1NSwgKGlucHV0WzJdOiBhbnkpIC8gMjU1LCAoaW5wdXRbM106IGFueSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFcnJvcihlcnJvciB8fCBgQ291bGQgbm90IHBhcnNlIGNvbG9yIGZyb20gdmFsdWUgJyR7dHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJyA/IGlucHV0IDogU3RyaW5nKEpTT04uc3RyaW5naWZ5KGlucHV0KSl9J2ApO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMudHlwZS5raW5kID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgbGV0IHZhbHVlID0gbnVsbDtcbiAgICAgICAgICAgIGZvciAoY29uc3QgYXJnIG9mIHRoaXMuYXJncykge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gYXJnLmV2YWx1YXRlKGN0eCk7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSBudWxsKSByZXR1cm4gMDtcbiAgICAgICAgICAgICAgICBjb25zdCBudW0gPSBOdW1iZXIodmFsdWUpO1xuICAgICAgICAgICAgICAgIGlmIChpc05hTihudW0pKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFcnJvcihgQ291bGQgbm90IGNvbnZlcnQgJHtKU09OLnN0cmluZ2lmeSh2YWx1ZSl9IHRvIG51bWJlci5gKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnR5cGUua2luZCA9PT0gJ2Zvcm1hdHRlZCcpIHtcbiAgICAgICAgICAgIC8vIFRoZXJlIGlzIG5vIGV4cGxpY2l0ICd0by1mb3JtYXR0ZWQnIGJ1dCB0aGlzIGNvZXJjaW9uIGNhbiBiZSBpbXBsaWNpdGx5XG4gICAgICAgICAgICAvLyBjcmVhdGVkIGJ5IHByb3BlcnRpZXMgdGhhdCBleHBlY3QgdGhlICdmb3JtYXR0ZWQnIHR5cGUuXG4gICAgICAgICAgICByZXR1cm4gRm9ybWF0dGVkLmZyb21TdHJpbmcodmFsdWVUb1N0cmluZyh0aGlzLmFyZ3NbMF0uZXZhbHVhdGUoY3R4KSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlVG9TdHJpbmcodGhpcy5hcmdzWzBdLmV2YWx1YXRlKGN0eCkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZWFjaENoaWxkKGZuOiAoRXhwcmVzc2lvbikgPT4gdm9pZCkge1xuICAgICAgICB0aGlzLmFyZ3MuZm9yRWFjaChmbik7XG4gICAgfVxuXG4gICAgcG9zc2libGVPdXRwdXRzKCk6IEFycmF5PFZhbHVlIHwgdm9pZD4ge1xuICAgICAgICByZXR1cm4gW10uY29uY2F0KC4uLnRoaXMuYXJncy5tYXAoKGFyZykgPT4gYXJnLnBvc3NpYmxlT3V0cHV0cygpKSk7XG4gICAgfVxuXG4gICAgc2VyaWFsaXplKCkge1xuICAgICAgICBpZiAodGhpcy50eXBlLmtpbmQgPT09ICdmb3JtYXR0ZWQnKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEZvcm1hdEV4cHJlc3Npb24oW3t0ZXh0OiB0aGlzLmFyZ3NbMF0sIHNjYWxlOiBudWxsLCBmb250OiBudWxsfV0pLnNlcmlhbGl6ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSBbYHRvLSR7dGhpcy50eXBlLmtpbmR9YF07XG4gICAgICAgIHRoaXMuZWFjaENoaWxkKGNoaWxkID0+IHsgc2VyaWFsaXplZC5wdXNoKGNoaWxkLnNlcmlhbGl6ZSgpKTsgfSk7XG4gICAgICAgIHJldHVybiBzZXJpYWxpemVkO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQ29lcmNpb247XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgeyBDb2xvciB9IGZyb20gJy4vdmFsdWVzJztcblxuaW1wb3J0IHR5cGUgeyBHbG9iYWxQcm9wZXJ0aWVzLCBGZWF0dXJlLCBGZWF0dXJlU3RhdGUgfSBmcm9tICcuL2luZGV4JztcblxuY29uc3QgZ2VvbWV0cnlUeXBlcyA9IFsnVW5rbm93bicsICdQb2ludCcsICdMaW5lU3RyaW5nJywgJ1BvbHlnb24nXTtcblxuY2xhc3MgRXZhbHVhdGlvbkNvbnRleHQge1xuICAgIGdsb2JhbHM6IEdsb2JhbFByb3BlcnRpZXM7XG4gICAgZmVhdHVyZTogP0ZlYXR1cmU7XG4gICAgZmVhdHVyZVN0YXRlOiA/RmVhdHVyZVN0YXRlO1xuXG4gICAgX3BhcnNlQ29sb3JDYWNoZToge1tzdHJpbmddOiA/Q29sb3J9O1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuZ2xvYmFscyA9IChudWxsOiBhbnkpO1xuICAgICAgICB0aGlzLmZlYXR1cmUgPSBudWxsO1xuICAgICAgICB0aGlzLmZlYXR1cmVTdGF0ZSA9IG51bGw7XG4gICAgICAgIHRoaXMuX3BhcnNlQ29sb3JDYWNoZSA9IHt9O1xuICAgIH1cblxuICAgIGlkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5mZWF0dXJlICYmICdpZCcgaW4gdGhpcy5mZWF0dXJlID8gdGhpcy5mZWF0dXJlLmlkIDogbnVsbDtcbiAgICB9XG5cbiAgICBnZW9tZXRyeVR5cGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZlYXR1cmUgPyB0eXBlb2YgdGhpcy5mZWF0dXJlLnR5cGUgPT09ICdudW1iZXInID8gZ2VvbWV0cnlUeXBlc1t0aGlzLmZlYXR1cmUudHlwZV0gOiB0aGlzLmZlYXR1cmUudHlwZSA6IG51bGw7XG4gICAgfVxuXG4gICAgcHJvcGVydGllcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmVhdHVyZSAmJiB0aGlzLmZlYXR1cmUucHJvcGVydGllcyB8fCB7fTtcbiAgICB9XG5cbiAgICBwYXJzZUNvbG9yKGlucHV0OiBzdHJpbmcpOiA/Q29sb3Ige1xuICAgICAgICBsZXQgY2FjaGVkID0gdGhpcy5fcGFyc2VDb2xvckNhY2hlW2lucHV0XTtcbiAgICAgICAgaWYgKCFjYWNoZWQpIHtcbiAgICAgICAgICAgIGNhY2hlZCA9IHRoaXMuX3BhcnNlQ29sb3JDYWNoZVtpbnB1dF0gPSBDb2xvci5wYXJzZShpbnB1dCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNhY2hlZDtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEV2YWx1YXRpb25Db250ZXh0O1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHsgdG9TdHJpbmcgfSBmcm9tICcuL3R5cGVzJztcblxuaW1wb3J0IFBhcnNpbmdDb250ZXh0IGZyb20gJy4vcGFyc2luZ19jb250ZXh0JztcbmltcG9ydCBFdmFsdWF0aW9uQ29udGV4dCBmcm9tICcuL2V2YWx1YXRpb25fY29udGV4dCc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5cbmltcG9ydCB0eXBlIHsgRXhwcmVzc2lvbiwgRXhwcmVzc2lvblJlZ2lzdHJ5IH0gZnJvbSAnLi9leHByZXNzaW9uJztcbmltcG9ydCB0eXBlIHsgVHlwZSB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBWYWx1ZSB9IGZyb20gJy4vdmFsdWVzJztcblxuZXhwb3J0IHR5cGUgVmFyYXJncyA9IHt8IHR5cGU6IFR5cGUgfH07XG50eXBlIFNpZ25hdHVyZSA9IEFycmF5PFR5cGU+IHwgVmFyYXJncztcbnR5cGUgRXZhbHVhdGUgPSAoRXZhbHVhdGlvbkNvbnRleHQsIEFycmF5PEV4cHJlc3Npb24+KSA9PiBWYWx1ZTtcbnR5cGUgRGVmaW5pdGlvbiA9IFtUeXBlLCBTaWduYXR1cmUsIEV2YWx1YXRlXSB8XG4gICAge3x0eXBlOiBUeXBlLCBvdmVybG9hZHM6IEFycmF5PFtTaWduYXR1cmUsIEV2YWx1YXRlXT58fTtcblxuY2xhc3MgQ29tcG91bmRFeHByZXNzaW9uIGltcGxlbWVudHMgRXhwcmVzc2lvbiB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIHR5cGU6IFR5cGU7XG4gICAgX2V2YWx1YXRlOiBFdmFsdWF0ZTtcbiAgICBhcmdzOiBBcnJheTxFeHByZXNzaW9uPjtcblxuICAgIHN0YXRpYyBkZWZpbml0aW9uczogeyBbc3RyaW5nXTogRGVmaW5pdGlvbiB9O1xuXG4gICAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nLCB0eXBlOiBUeXBlLCBldmFsdWF0ZTogRXZhbHVhdGUsIGFyZ3M6IEFycmF5PEV4cHJlc3Npb24+KSB7XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgIHRoaXMuX2V2YWx1YXRlID0gZXZhbHVhdGU7XG4gICAgICAgIHRoaXMuYXJncyA9IGFyZ3M7XG4gICAgfVxuXG4gICAgZXZhbHVhdGUoY3R4OiBFdmFsdWF0aW9uQ29udGV4dCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZXZhbHVhdGUoY3R4LCB0aGlzLmFyZ3MpO1xuICAgIH1cblxuICAgIGVhY2hDaGlsZChmbjogKEV4cHJlc3Npb24pID0+IHZvaWQpIHtcbiAgICAgICAgdGhpcy5hcmdzLmZvckVhY2goZm4pO1xuICAgIH1cblxuICAgIHBvc3NpYmxlT3V0cHV0cygpIHtcbiAgICAgICAgcmV0dXJuIFt1bmRlZmluZWRdO1xuICAgIH1cblxuICAgIHNlcmlhbGl6ZSgpOiBBcnJheTxtaXhlZD4ge1xuICAgICAgICByZXR1cm4gW3RoaXMubmFtZV0uY29uY2F0KHRoaXMuYXJncy5tYXAoYXJnID0+IGFyZy5zZXJpYWxpemUoKSkpO1xuICAgIH1cblxuICAgIHN0YXRpYyBwYXJzZShhcmdzOiBBcnJheTxtaXhlZD4sIGNvbnRleHQ6IFBhcnNpbmdDb250ZXh0KTogP0V4cHJlc3Npb24ge1xuICAgICAgICBjb25zdCBvcDogc3RyaW5nID0gKGFyZ3NbMF06IGFueSk7XG4gICAgICAgIGNvbnN0IGRlZmluaXRpb24gPSBDb21wb3VuZEV4cHJlc3Npb24uZGVmaW5pdGlvbnNbb3BdO1xuICAgICAgICBpZiAoIWRlZmluaXRpb24pIHtcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBVbmtub3duIGV4cHJlc3Npb24gXCIke29wfVwiLiBJZiB5b3Ugd2FudGVkIGEgbGl0ZXJhbCBhcnJheSwgdXNlIFtcImxpdGVyYWxcIiwgWy4uLl1dLmAsIDApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTm93IGNoZWNrIGFyZ3VtZW50IHR5cGVzIGFnYWluc3QgZWFjaCBzaWduYXR1cmVcbiAgICAgICAgY29uc3QgdHlwZSA9IEFycmF5LmlzQXJyYXkoZGVmaW5pdGlvbikgP1xuICAgICAgICAgICAgZGVmaW5pdGlvblswXSA6IGRlZmluaXRpb24udHlwZTtcblxuICAgICAgICBjb25zdCBhdmFpbGFibGVPdmVybG9hZHMgPSBBcnJheS5pc0FycmF5KGRlZmluaXRpb24pID9cbiAgICAgICAgICAgIFtbZGVmaW5pdGlvblsxXSwgZGVmaW5pdGlvblsyXV1dIDpcbiAgICAgICAgICAgIGRlZmluaXRpb24ub3ZlcmxvYWRzO1xuXG4gICAgICAgIGNvbnN0IG92ZXJsb2FkcyA9IGF2YWlsYWJsZU92ZXJsb2Fkcy5maWx0ZXIoKFtzaWduYXR1cmVdKSA9PiAoXG4gICAgICAgICAgICAhQXJyYXkuaXNBcnJheShzaWduYXR1cmUpIHx8IC8vIHZhcmFnc1xuICAgICAgICAgICAgc2lnbmF0dXJlLmxlbmd0aCA9PT0gYXJncy5sZW5ndGggLSAxIC8vIGNvcnJlY3QgcGFyYW0gY291bnRcbiAgICAgICAgKSk7XG5cbiAgICAgICAgbGV0IHNpZ25hdHVyZUNvbnRleHQ6IFBhcnNpbmdDb250ZXh0ID0gKG51bGw6IGFueSk7XG5cbiAgICAgICAgZm9yIChjb25zdCBbcGFyYW1zLCBldmFsdWF0ZV0gb2Ygb3ZlcmxvYWRzKSB7XG4gICAgICAgICAgICAvLyBVc2UgYSBmcmVzaCBjb250ZXh0IGZvciBlYWNoIGF0dGVtcHRlZCBzaWduYXR1cmUgc28gdGhhdCwgaWZcbiAgICAgICAgICAgIC8vIHdlIGV2ZW50dWFsbHkgc3VjY2VlZCwgd2UgaGF2ZW4ndCBwb2xsdXRlZCBgY29udGV4dC5lcnJvcnNgLlxuICAgICAgICAgICAgc2lnbmF0dXJlQ29udGV4dCA9IG5ldyBQYXJzaW5nQ29udGV4dChjb250ZXh0LnJlZ2lzdHJ5LCBjb250ZXh0LnBhdGgsIG51bGwsIGNvbnRleHQuc2NvcGUpO1xuXG4gICAgICAgICAgICAvLyBGaXJzdCBwYXJzZSBhbGwgdGhlIGFyZ3MsIHBvdGVudGlhbGx5IGNvZXJjaW5nIHRvIHRoZVxuICAgICAgICAgICAgLy8gdHlwZXMgZXhwZWN0ZWQgYnkgdGhpcyBvdmVybG9hZC5cbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZEFyZ3M6IEFycmF5PEV4cHJlc3Npb24+ID0gW107XG4gICAgICAgICAgICBsZXQgYXJnUGFyc2VGYWlsZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgYXJncy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFyZyA9IGFyZ3NbaV07XG4gICAgICAgICAgICAgICAgY29uc3QgZXhwZWN0ZWRUeXBlID0gQXJyYXkuaXNBcnJheShwYXJhbXMpID9cbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zW2kgLSAxXSA6XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtcy50eXBlO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkID0gc2lnbmF0dXJlQ29udGV4dC5wYXJzZShhcmcsIDEgKyBwYXJzZWRBcmdzLmxlbmd0aCwgZXhwZWN0ZWRUeXBlKTtcbiAgICAgICAgICAgICAgICBpZiAoIXBhcnNlZCkge1xuICAgICAgICAgICAgICAgICAgICBhcmdQYXJzZUZhaWxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwYXJzZWRBcmdzLnB1c2gocGFyc2VkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChhcmdQYXJzZUZhaWxlZCkge1xuICAgICAgICAgICAgICAgIC8vIENvdWxkbid0IGNvZXJjZSBhcmdzIG9mIHRoaXMgb3ZlcmxvYWQgdG8gZXhwZWN0ZWQgdHlwZSwgbW92ZVxuICAgICAgICAgICAgICAgIC8vIG9uIHRvIG5leHQgb25lLlxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShwYXJhbXMpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGggIT09IHBhcnNlZEFyZ3MubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZUNvbnRleHQuZXJyb3IoYEV4cGVjdGVkICR7cGFyYW1zLmxlbmd0aH0gYXJndW1lbnRzLCBidXQgZm91bmQgJHtwYXJzZWRBcmdzLmxlbmd0aH0gaW5zdGVhZC5gKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcnNlZEFyZ3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBleHBlY3RlZCA9IEFycmF5LmlzQXJyYXkocGFyYW1zKSA/IHBhcmFtc1tpXSA6IHBhcmFtcy50eXBlO1xuICAgICAgICAgICAgICAgIGNvbnN0IGFyZyA9IHBhcnNlZEFyZ3NbaV07XG4gICAgICAgICAgICAgICAgc2lnbmF0dXJlQ29udGV4dC5jb25jYXQoaSArIDEpLmNoZWNrU3VidHlwZShleHBlY3RlZCwgYXJnLnR5cGUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoc2lnbmF0dXJlQ29udGV4dC5lcnJvcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21wb3VuZEV4cHJlc3Npb24ob3AsIHR5cGUsIGV2YWx1YXRlLCBwYXJzZWRBcmdzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGFzc2VydCghc2lnbmF0dXJlQ29udGV4dCB8fCBzaWduYXR1cmVDb250ZXh0LmVycm9ycy5sZW5ndGggPiAwKTtcblxuICAgICAgICBpZiAob3ZlcmxvYWRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgY29udGV4dC5lcnJvcnMucHVzaCguLi5zaWduYXR1cmVDb250ZXh0LmVycm9ycyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBleHBlY3RlZCA9IG92ZXJsb2Fkcy5sZW5ndGggPyBvdmVybG9hZHMgOiBhdmFpbGFibGVPdmVybG9hZHM7XG4gICAgICAgICAgICBjb25zdCBzaWduYXR1cmVzID0gZXhwZWN0ZWRcbiAgICAgICAgICAgICAgICAubWFwKChbcGFyYW1zXSkgPT4gc3RyaW5naWZ5U2lnbmF0dXJlKHBhcmFtcykpXG4gICAgICAgICAgICAgICAgLmpvaW4oJyB8ICcpO1xuXG4gICAgICAgICAgICBjb25zdCBhY3R1YWxUeXBlcyA9IFtdO1xuICAgICAgICAgICAgLy8gRm9yIGVycm9yIG1lc3NhZ2UsIHJlLXBhcnNlIGFyZ3VtZW50cyB3aXRob3V0IHRyeWluZyB0b1xuICAgICAgICAgICAgLy8gYXBwbHkgYW55IGNvZXJjaW9uc1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkID0gY29udGV4dC5wYXJzZShhcmdzW2ldLCAxICsgYWN0dWFsVHlwZXMubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICBpZiAoIXBhcnNlZCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgYWN0dWFsVHlwZXMucHVzaCh0b1N0cmluZyhwYXJzZWQudHlwZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29udGV4dC5lcnJvcihgRXhwZWN0ZWQgYXJndW1lbnRzIG9mIHR5cGUgJHtzaWduYXR1cmVzfSwgYnV0IGZvdW5kICgke2FjdHVhbFR5cGVzLmpvaW4oJywgJyl9KSBpbnN0ZWFkLmApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgc3RhdGljIHJlZ2lzdGVyKFxuICAgICAgICByZWdpc3RyeTogRXhwcmVzc2lvblJlZ2lzdHJ5LFxuICAgICAgICBkZWZpbml0aW9uczogeyBbc3RyaW5nXTogRGVmaW5pdGlvbiB9XG4gICAgKSB7XG4gICAgICAgIGFzc2VydCghQ29tcG91bmRFeHByZXNzaW9uLmRlZmluaXRpb25zKTtcbiAgICAgICAgQ29tcG91bmRFeHByZXNzaW9uLmRlZmluaXRpb25zID0gZGVmaW5pdGlvbnM7XG4gICAgICAgIGZvciAoY29uc3QgbmFtZSBpbiBkZWZpbml0aW9ucykge1xuICAgICAgICAgICAgcmVnaXN0cnlbbmFtZV0gPSBDb21wb3VuZEV4cHJlc3Npb247XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeVNpZ25hdHVyZShzaWduYXR1cmU6IFNpZ25hdHVyZSk6IHN0cmluZyB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoc2lnbmF0dXJlKSkge1xuICAgICAgICByZXR1cm4gYCgke3NpZ25hdHVyZS5tYXAodG9TdHJpbmcpLmpvaW4oJywgJyl9KWA7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGAoJHt0b1N0cmluZyhzaWduYXR1cmUudHlwZSl9Li4uKWA7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBDb21wb3VuZEV4cHJlc3Npb247XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgeyBTdHJpbmdUeXBlLCBCb29sZWFuVHlwZSwgQ29sbGF0b3JUeXBlIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IENvbGxhdG9yIGZyb20gJy4uL3R5cGVzL2NvbGxhdG9yJztcblxuaW1wb3J0IHR5cGUgeyBFeHByZXNzaW9uIH0gZnJvbSAnLi4vZXhwcmVzc2lvbic7XG5pbXBvcnQgdHlwZSBFdmFsdWF0aW9uQ29udGV4dCBmcm9tICcuLi9ldmFsdWF0aW9uX2NvbnRleHQnO1xuaW1wb3J0IHR5cGUgUGFyc2luZ0NvbnRleHQgZnJvbSAnLi4vcGFyc2luZ19jb250ZXh0JztcbmltcG9ydCB0eXBlIHsgVHlwZSB9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ29sbGF0b3JFeHByZXNzaW9uIGltcGxlbWVudHMgRXhwcmVzc2lvbiB7XG4gICAgdHlwZTogVHlwZTtcbiAgICBjYXNlU2Vuc2l0aXZlOiBFeHByZXNzaW9uO1xuICAgIGRpYWNyaXRpY1NlbnNpdGl2ZTogRXhwcmVzc2lvbjtcbiAgICBsb2NhbGU6IEV4cHJlc3Npb24gfCBudWxsO1xuXG4gICAgY29uc3RydWN0b3IoY2FzZVNlbnNpdGl2ZTogRXhwcmVzc2lvbiwgZGlhY3JpdGljU2Vuc2l0aXZlOiBFeHByZXNzaW9uLCBsb2NhbGU6IEV4cHJlc3Npb24gfCBudWxsKSB7XG4gICAgICAgIHRoaXMudHlwZSA9IENvbGxhdG9yVHlwZTtcbiAgICAgICAgdGhpcy5sb2NhbGUgPSBsb2NhbGU7XG4gICAgICAgIHRoaXMuY2FzZVNlbnNpdGl2ZSA9IGNhc2VTZW5zaXRpdmU7XG4gICAgICAgIHRoaXMuZGlhY3JpdGljU2Vuc2l0aXZlID0gZGlhY3JpdGljU2Vuc2l0aXZlO1xuICAgIH1cblxuICAgIHN0YXRpYyBwYXJzZShhcmdzOiBBcnJheTxtaXhlZD4sIGNvbnRleHQ6IFBhcnNpbmdDb250ZXh0KTogP0V4cHJlc3Npb24ge1xuICAgICAgICBpZiAoYXJncy5sZW5ndGggIT09IDIpXG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgRXhwZWN0ZWQgb25lIGFyZ3VtZW50LmApO1xuXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSAoYXJnc1sxXTogYW55KTtcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkob3B0aW9ucykpXG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgQ29sbGF0b3Igb3B0aW9ucyBhcmd1bWVudCBtdXN0IGJlIGFuIG9iamVjdC5gKTtcblxuICAgICAgICBjb25zdCBjYXNlU2Vuc2l0aXZlID0gY29udGV4dC5wYXJzZShcbiAgICAgICAgICAgIG9wdGlvbnNbJ2Nhc2Utc2Vuc2l0aXZlJ10gPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogb3B0aW9uc1snY2FzZS1zZW5zaXRpdmUnXSwgMSwgQm9vbGVhblR5cGUpO1xuICAgICAgICBpZiAoIWNhc2VTZW5zaXRpdmUpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IGRpYWNyaXRpY1NlbnNpdGl2ZSA9IGNvbnRleHQucGFyc2UoXG4gICAgICAgICAgICBvcHRpb25zWydkaWFjcml0aWMtc2Vuc2l0aXZlJ10gPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogb3B0aW9uc1snZGlhY3JpdGljLXNlbnNpdGl2ZSddLCAxLCBCb29sZWFuVHlwZSk7XG4gICAgICAgIGlmICghZGlhY3JpdGljU2Vuc2l0aXZlKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBsZXQgbG9jYWxlID0gbnVsbDtcbiAgICAgICAgaWYgKG9wdGlvbnNbJ2xvY2FsZSddKSB7XG4gICAgICAgICAgICBsb2NhbGUgPSBjb250ZXh0LnBhcnNlKG9wdGlvbnNbJ2xvY2FsZSddLCAxLCBTdHJpbmdUeXBlKTtcbiAgICAgICAgICAgIGlmICghbG9jYWxlKSByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgQ29sbGF0b3JFeHByZXNzaW9uKGNhc2VTZW5zaXRpdmUsIGRpYWNyaXRpY1NlbnNpdGl2ZSwgbG9jYWxlKTtcbiAgICB9XG5cbiAgICBldmFsdWF0ZShjdHg6IEV2YWx1YXRpb25Db250ZXh0KSB7XG4gICAgICAgIHJldHVybiBuZXcgQ29sbGF0b3IodGhpcy5jYXNlU2Vuc2l0aXZlLmV2YWx1YXRlKGN0eCksIHRoaXMuZGlhY3JpdGljU2Vuc2l0aXZlLmV2YWx1YXRlKGN0eCksIHRoaXMubG9jYWxlID8gdGhpcy5sb2NhbGUuZXZhbHVhdGUoY3R4KSA6IG51bGwpO1xuICAgIH1cblxuICAgIGVhY2hDaGlsZChmbjogKEV4cHJlc3Npb24pID0+IHZvaWQpIHtcbiAgICAgICAgZm4odGhpcy5jYXNlU2Vuc2l0aXZlKTtcbiAgICAgICAgZm4odGhpcy5kaWFjcml0aWNTZW5zaXRpdmUpO1xuICAgICAgICBpZiAodGhpcy5sb2NhbGUpIHtcbiAgICAgICAgICAgIGZuKHRoaXMubG9jYWxlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHBvc3NpYmxlT3V0cHV0cygpIHtcbiAgICAgICAgLy8gVGVjaG5pY2FsbHkgdGhlIHNldCBvZiBwb3NzaWJsZSBvdXRwdXRzIGlzIHRoZSBjb21iaW5hdG9yaWMgc2V0IG9mIENvbGxhdG9ycyBwcm9kdWNlZFxuICAgICAgICAvLyBieSBhbGwgcG9zc2libGVPdXRwdXRzIG9mIGxvY2FsZS9jYXNlU2Vuc2l0aXZlL2RpYWNyaXRpY1NlbnNpdGl2ZVxuICAgICAgICAvLyBCdXQgZm9yIHRoZSBwcmltYXJ5IHVzZSBvZiBDb2xsYXRvcnMgaW4gY29tcGFyaXNvbiBvcGVyYXRvcnMsIHdlIGlnbm9yZSB0aGUgQ29sbGF0b3Inc1xuICAgICAgICAvLyBwb3NzaWJsZU91dHB1dHMgYW55d2F5LCBzbyB3ZSBjYW4gZ2V0IGF3YXkgd2l0aCBsZWF2aW5nIHRoaXMgdW5kZWZpbmVkIGZvciBub3cuXG4gICAgICAgIHJldHVybiBbdW5kZWZpbmVkXTtcbiAgICB9XG5cbiAgICBzZXJpYWxpemUoKSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7fTtcbiAgICAgICAgb3B0aW9uc1snY2FzZS1zZW5zaXRpdmUnXSA9IHRoaXMuY2FzZVNlbnNpdGl2ZS5zZXJpYWxpemUoKTtcbiAgICAgICAgb3B0aW9uc1snZGlhY3JpdGljLXNlbnNpdGl2ZSddID0gdGhpcy5kaWFjcml0aWNTZW5zaXRpdmUuc2VyaWFsaXplKCk7XG4gICAgICAgIGlmICh0aGlzLmxvY2FsZSkge1xuICAgICAgICAgICAgb3B0aW9uc1snbG9jYWxlJ10gPSB0aGlzLmxvY2FsZS5zZXJpYWxpemUoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW1wiY29sbGF0b3JcIiwgb3B0aW9uc107XG4gICAgfVxufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IENvbXBvdW5kRXhwcmVzc2lvbiBmcm9tICcuL2NvbXBvdW5kX2V4cHJlc3Npb24nO1xuXG5pbXBvcnQgdHlwZSB7IEV4cHJlc3Npb24gfSBmcm9tICcuL2V4cHJlc3Npb24uanMnO1xuXG5mdW5jdGlvbiBpc0ZlYXR1cmVDb25zdGFudChlOiBFeHByZXNzaW9uKSB7XG4gICAgaWYgKGUgaW5zdGFuY2VvZiBDb21wb3VuZEV4cHJlc3Npb24pIHtcbiAgICAgICAgaWYgKGUubmFtZSA9PT0gJ2dldCcgJiYgZS5hcmdzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9IGVsc2UgaWYgKGUubmFtZSA9PT0gJ2ZlYXR1cmUtc3RhdGUnKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0gZWxzZSBpZiAoZS5uYW1lID09PSAnaGFzJyAmJiBlLmFyZ3MubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICBlLm5hbWUgPT09ICdwcm9wZXJ0aWVzJyB8fFxuICAgICAgICAgICAgZS5uYW1lID09PSAnZ2VvbWV0cnktdHlwZScgfHxcbiAgICAgICAgICAgIGUubmFtZSA9PT0gJ2lkJ1xuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSBlbHNlIGlmICgvXmZpbHRlci0vLnRlc3QoZS5uYW1lKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbGV0IHJlc3VsdCA9IHRydWU7XG4gICAgZS5lYWNoQ2hpbGQoYXJnID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdCAmJiAhaXNGZWF0dXJlQ29uc3RhbnQoYXJnKSkgeyByZXN1bHQgPSBmYWxzZTsgfVxuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGlzU3RhdGVDb25zdGFudChlOiBFeHByZXNzaW9uKSB7XG4gICAgaWYgKGUgaW5zdGFuY2VvZiBDb21wb3VuZEV4cHJlc3Npb24pIHtcbiAgICAgICAgaWYgKGUubmFtZSA9PT0gJ2ZlYXR1cmUtc3RhdGUnKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbGV0IHJlc3VsdCA9IHRydWU7XG4gICAgZS5lYWNoQ2hpbGQoYXJnID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdCAmJiAhaXNTdGF0ZUNvbnN0YW50KGFyZykpIHsgcmVzdWx0ID0gZmFsc2U7IH1cbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBpc0dsb2JhbFByb3BlcnR5Q29uc3RhbnQoZTogRXhwcmVzc2lvbiwgcHJvcGVydGllczogQXJyYXk8c3RyaW5nPikge1xuICAgIGlmIChlIGluc3RhbmNlb2YgQ29tcG91bmRFeHByZXNzaW9uICYmIHByb3BlcnRpZXMuaW5kZXhPZihlLm5hbWUpID49IDApIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgbGV0IHJlc3VsdCA9IHRydWU7XG4gICAgZS5lYWNoQ2hpbGQoKGFyZykgPT4ge1xuICAgICAgICBpZiAocmVzdWx0ICYmICFpc0dsb2JhbFByb3BlcnR5Q29uc3RhbnQoYXJnLCBwcm9wZXJ0aWVzKSkgeyByZXN1bHQgPSBmYWxzZTsgfVxuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCB7IGlzRmVhdHVyZUNvbnN0YW50LCBpc0dsb2JhbFByb3BlcnR5Q29uc3RhbnQsIGlzU3RhdGVDb25zdGFudCB9O1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHR5cGUgeyBUeXBlIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBFeHByZXNzaW9uIH0gZnJvbSAnLi4vZXhwcmVzc2lvbic7XG5pbXBvcnQgdHlwZSBQYXJzaW5nQ29udGV4dCBmcm9tICcuLi9wYXJzaW5nX2NvbnRleHQnO1xuaW1wb3J0IHR5cGUgRXZhbHVhdGlvbkNvbnRleHQgIGZyb20gJy4uL2V2YWx1YXRpb25fY29udGV4dCc7XG5cbmNsYXNzIFZhciBpbXBsZW1lbnRzIEV4cHJlc3Npb24ge1xuICAgIHR5cGU6IFR5cGU7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGJvdW5kRXhwcmVzc2lvbjogRXhwcmVzc2lvbjtcblxuICAgIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZywgYm91bmRFeHByZXNzaW9uOiBFeHByZXNzaW9uKSB7XG4gICAgICAgIHRoaXMudHlwZSA9IGJvdW5kRXhwcmVzc2lvbi50eXBlO1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLmJvdW5kRXhwcmVzc2lvbiA9IGJvdW5kRXhwcmVzc2lvbjtcbiAgICB9XG5cbiAgICBzdGF0aWMgcGFyc2UoYXJnczogQXJyYXk8bWl4ZWQ+LCBjb250ZXh0OiBQYXJzaW5nQ29udGV4dCkge1xuICAgICAgICBpZiAoYXJncy5sZW5ndGggIT09IDIgfHwgdHlwZW9mIGFyZ3NbMV0gIT09ICdzdHJpbmcnKVxuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYCd2YXInIGV4cHJlc3Npb24gcmVxdWlyZXMgZXhhY3RseSBvbmUgc3RyaW5nIGxpdGVyYWwgYXJndW1lbnQuYCk7XG5cbiAgICAgICAgY29uc3QgbmFtZSA9IGFyZ3NbMV07XG4gICAgICAgIGlmICghY29udGV4dC5zY29wZS5oYXMobmFtZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBVbmtub3duIHZhcmlhYmxlIFwiJHtuYW1lfVwiLiBNYWtlIHN1cmUgXCIke25hbWV9XCIgaGFzIGJlZW4gYm91bmQgaW4gYW4gZW5jbG9zaW5nIFwibGV0XCIgZXhwcmVzc2lvbiBiZWZvcmUgdXNpbmcgaXQuYCwgMSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IFZhcihuYW1lLCBjb250ZXh0LnNjb3BlLmdldChuYW1lKSk7XG4gICAgfVxuXG4gICAgZXZhbHVhdGUoY3R4OiBFdmFsdWF0aW9uQ29udGV4dCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ib3VuZEV4cHJlc3Npb24uZXZhbHVhdGUoY3R4KTtcbiAgICB9XG5cbiAgICBlYWNoQ2hpbGQoKSB7fVxuXG4gICAgcG9zc2libGVPdXRwdXRzKCkge1xuICAgICAgICByZXR1cm4gW3VuZGVmaW5lZF07XG4gICAgfVxuXG4gICAgc2VyaWFsaXplKCkge1xuICAgICAgICByZXR1cm4gW1widmFyXCIsIHRoaXMubmFtZV07XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBWYXI7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgU2NvcGUgZnJvbSAnLi9zY29wZSc7XG5pbXBvcnQgeyBjaGVja1N1YnR5cGUgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCBQYXJzaW5nRXJyb3IgZnJvbSAnLi9wYXJzaW5nX2Vycm9yJztcbmltcG9ydCBMaXRlcmFsIGZyb20gJy4vZGVmaW5pdGlvbnMvbGl0ZXJhbCc7XG5pbXBvcnQgQXNzZXJ0aW9uIGZyb20gJy4vZGVmaW5pdGlvbnMvYXNzZXJ0aW9uJztcbmltcG9ydCBDb2VyY2lvbiBmcm9tICcuL2RlZmluaXRpb25zL2NvZXJjaW9uJztcbmltcG9ydCBFdmFsdWF0aW9uQ29udGV4dCBmcm9tICcuL2V2YWx1YXRpb25fY29udGV4dCc7XG5pbXBvcnQgQ29tcG91bmRFeHByZXNzaW9uIGZyb20gJy4vY29tcG91bmRfZXhwcmVzc2lvbic7XG5pbXBvcnQgQ29sbGF0b3JFeHByZXNzaW9uIGZyb20gJy4vZGVmaW5pdGlvbnMvY29sbGF0b3InO1xuaW1wb3J0IHtpc0dsb2JhbFByb3BlcnR5Q29uc3RhbnQsIGlzRmVhdHVyZUNvbnN0YW50fSBmcm9tICcuL2lzX2NvbnN0YW50JztcbmltcG9ydCBWYXIgZnJvbSAnLi9kZWZpbml0aW9ucy92YXInO1xuXG5cbmltcG9ydCB0eXBlIHtFeHByZXNzaW9uLCBFeHByZXNzaW9uUmVnaXN0cnl9IGZyb20gJy4vZXhwcmVzc2lvbic7XG5pbXBvcnQgdHlwZSB7VHlwZX0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICogU3RhdGUgYXNzb2NpYXRlZCBwYXJzaW5nIGF0IGEgZ2l2ZW4gcG9pbnQgaW4gYW4gZXhwcmVzc2lvbiB0cmVlLlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgUGFyc2luZ0NvbnRleHQge1xuICAgIHJlZ2lzdHJ5OiBFeHByZXNzaW9uUmVnaXN0cnk7XG4gICAgcGF0aDogQXJyYXk8bnVtYmVyPjtcbiAgICBrZXk6IHN0cmluZztcbiAgICBzY29wZTogU2NvcGU7XG4gICAgZXJyb3JzOiBBcnJheTxQYXJzaW5nRXJyb3I+O1xuXG4gICAgLy8gVGhlIGV4cGVjdGVkIHR5cGUgb2YgdGhpcyBleHByZXNzaW9uLiBQcm92aWRlZCBvbmx5IHRvIGFsbG93IEV4cHJlc3Npb25cbiAgICAvLyBpbXBsZW1lbnRhdGlvbnMgdG8gaW5mZXIgYXJndW1lbnQgdHlwZXM6IEV4cHJlc3Npb24jcGFyc2UoKSBuZWVkIG5vdFxuICAgIC8vIGNoZWNrIHRoYXQgdGhlIG91dHB1dCB0eXBlIG9mIHRoZSBwYXJzZWQgZXhwcmVzc2lvbiBtYXRjaGVzXG4gICAgLy8gYGV4cGVjdGVkVHlwZWAuXG4gICAgZXhwZWN0ZWRUeXBlOiA/VHlwZTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICByZWdpc3RyeTogRXhwcmVzc2lvblJlZ2lzdHJ5LFxuICAgICAgICBwYXRoOiBBcnJheTxudW1iZXI+ID0gW10sXG4gICAgICAgIGV4cGVjdGVkVHlwZTogP1R5cGUsXG4gICAgICAgIHNjb3BlOiBTY29wZSA9IG5ldyBTY29wZSgpLFxuICAgICAgICBlcnJvcnM6IEFycmF5PFBhcnNpbmdFcnJvcj4gPSBbXVxuICAgICkge1xuICAgICAgICB0aGlzLnJlZ2lzdHJ5ID0gcmVnaXN0cnk7XG4gICAgICAgIHRoaXMucGF0aCA9IHBhdGg7XG4gICAgICAgIHRoaXMua2V5ID0gcGF0aC5tYXAocGFydCA9PiBgWyR7cGFydH1dYCkuam9pbignJyk7XG4gICAgICAgIHRoaXMuc2NvcGUgPSBzY29wZTtcbiAgICAgICAgdGhpcy5lcnJvcnMgPSBlcnJvcnM7XG4gICAgICAgIHRoaXMuZXhwZWN0ZWRUeXBlID0gZXhwZWN0ZWRUeXBlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBleHByIHRoZSBKU09OIGV4cHJlc3Npb24gdG8gcGFyc2VcbiAgICAgKiBAcGFyYW0gaW5kZXggdGhlIG9wdGlvbmFsIGFyZ3VtZW50IGluZGV4IGlmIHRoaXMgZXhwcmVzc2lvbiBpcyBhbiBhcmd1bWVudCBvZiBhIHBhcmVudCBleHByZXNzaW9uIHRoYXQncyBiZWluZyBwYXJzZWRcbiAgICAgKiBAcGFyYW0gb3B0aW9uc1xuICAgICAqIEBwYXJhbSBvcHRpb25zLm9taXRUeXBlQW5ub3RhdGlvbnMgc2V0IHRydWUgdG8gb21pdCBpbmZlcnJlZCB0eXBlIGFubm90YXRpb25zLiAgQ2FsbGVyIGJld2FyZTogd2l0aCB0aGlzIG9wdGlvbiBzZXQsIHRoZSBwYXJzZWQgZXhwcmVzc2lvbidzIHR5cGUgd2lsbCBOT1Qgc2F0aXNmeSBgZXhwZWN0ZWRUeXBlYCBpZiBpdCB3b3VsZCBub3JtYWxseSBiZSB3cmFwcGVkIGluIGFuIGluZmVycmVkIGFubm90YXRpb24uXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwYXJzZShcbiAgICAgICAgZXhwcjogbWl4ZWQsXG4gICAgICAgIGluZGV4PzogbnVtYmVyLFxuICAgICAgICBleHBlY3RlZFR5cGU/OiA/VHlwZSxcbiAgICAgICAgYmluZGluZ3M/OiBBcnJheTxbc3RyaW5nLCBFeHByZXNzaW9uXT4sXG4gICAgICAgIG9wdGlvbnM6IHt0eXBlQW5ub3RhdGlvbj86ICdhc3NlcnQnIHwgJ2NvZXJjZScgfCAnb21pdCd9ID0ge31cbiAgICApOiA/RXhwcmVzc2lvbiB7XG4gICAgICAgIGlmIChpbmRleCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29uY2F0KGluZGV4LCBleHBlY3RlZFR5cGUsIGJpbmRpbmdzKS5fcGFyc2UoZXhwciwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcnNlKGV4cHIsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIF9wYXJzZShleHByOiBtaXhlZCwgb3B0aW9uczoge3R5cGVBbm5vdGF0aW9uPzogJ2Fzc2VydCcgfCAnY29lcmNlJyB8ICdvbWl0J30pOiA/RXhwcmVzc2lvbiB7XG4gICAgICAgIGlmIChleHByID09PSBudWxsIHx8IHR5cGVvZiBleHByID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgZXhwciA9PT0gJ2Jvb2xlYW4nIHx8IHR5cGVvZiBleHByID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgZXhwciA9IFsnbGl0ZXJhbCcsIGV4cHJdO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gYW5ub3RhdGUocGFyc2VkLCB0eXBlLCB0eXBlQW5ub3RhdGlvbjogJ2Fzc2VydCcgfCAnY29lcmNlJyB8ICdvbWl0Jykge1xuICAgICAgICAgICAgaWYgKHR5cGVBbm5vdGF0aW9uID09PSAnYXNzZXJ0Jykge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQXNzZXJ0aW9uKHR5cGUsIFtwYXJzZWRdKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZUFubm90YXRpb24gPT09ICdjb2VyY2UnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb2VyY2lvbih0eXBlLCBbcGFyc2VkXSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShleHByKSkge1xuICAgICAgICAgICAgaWYgKGV4cHIubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXJyb3IoYEV4cGVjdGVkIGFuIGFycmF5IHdpdGggYXQgbGVhc3Qgb25lIGVsZW1lbnQuIElmIHlvdSB3YW50ZWQgYSBsaXRlcmFsIGFycmF5LCB1c2UgW1wibGl0ZXJhbFwiLCBbXV0uYCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IG9wID0gZXhwclswXTtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb3AgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lcnJvcihgRXhwcmVzc2lvbiBuYW1lIG11c3QgYmUgYSBzdHJpbmcsIGJ1dCBmb3VuZCAke3R5cGVvZiBvcH0gaW5zdGVhZC4gSWYgeW91IHdhbnRlZCBhIGxpdGVyYWwgYXJyYXksIHVzZSBbXCJsaXRlcmFsXCIsIFsuLi5dXS5gLCAwKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgRXhwciA9IHRoaXMucmVnaXN0cnlbb3BdO1xuICAgICAgICAgICAgaWYgKEV4cHIpIHtcbiAgICAgICAgICAgICAgICBsZXQgcGFyc2VkID0gRXhwci5wYXJzZShleHByLCB0aGlzKTtcbiAgICAgICAgICAgICAgICBpZiAoIXBhcnNlZCkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5leHBlY3RlZFR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXhwZWN0ZWQgPSB0aGlzLmV4cGVjdGVkVHlwZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWN0dWFsID0gcGFyc2VkLnR5cGU7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gV2hlbiB3ZSBleHBlY3QgYSBudW1iZXIsIHN0cmluZywgYm9vbGVhbiwgb3IgYXJyYXkgYnV0IGhhdmUgYSB2YWx1ZSwgd3JhcCBpdCBpbiBhbiBhc3NlcnRpb24uXG4gICAgICAgICAgICAgICAgICAgIC8vIFdoZW4gd2UgZXhwZWN0IGEgY29sb3Igb3IgZm9ybWF0dGVkIHN0cmluZywgYnV0IGhhdmUgYSBzdHJpbmcgb3IgdmFsdWUsIHdyYXAgaXQgaW4gYSBjb2VyY2lvbi5cbiAgICAgICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCB3ZSBkbyBzdGF0aWMgdHlwZS1jaGVja2luZy5cbiAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgLy8gVGhlc2UgYmVoYXZpb3JzIGFyZSBvdmVycmlkYWJsZSBmb3I6XG4gICAgICAgICAgICAgICAgICAgIC8vICAgKiBUaGUgXCJjb2FsZXNjZVwiIG9wZXJhdG9yLCB3aGljaCBuZWVkcyB0byBvbWl0IHR5cGUgYW5ub3RhdGlvbnMuXG4gICAgICAgICAgICAgICAgICAgIC8vICAgKiBTdHJpbmctdmFsdWVkIHByb3BlcnRpZXMgKGUuZy4gYHRleHQtZmllbGRgKSwgd2hlcmUgY29lcmNpb24gaXMgbW9yZSBjb252ZW5pZW50IHRoYW4gYXNzZXJ0aW9uLlxuICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICBpZiAoKGV4cGVjdGVkLmtpbmQgPT09ICdzdHJpbmcnIHx8IGV4cGVjdGVkLmtpbmQgPT09ICdudW1iZXInIHx8IGV4cGVjdGVkLmtpbmQgPT09ICdib29sZWFuJyB8fCBleHBlY3RlZC5raW5kID09PSAnb2JqZWN0JyB8fCBleHBlY3RlZC5raW5kID09PSAnYXJyYXknKSAmJiBhY3R1YWwua2luZCA9PT0gJ3ZhbHVlJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VkID0gYW5ub3RhdGUocGFyc2VkLCBleHBlY3RlZCwgb3B0aW9ucy50eXBlQW5ub3RhdGlvbiB8fCAnYXNzZXJ0Jyk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKGV4cGVjdGVkLmtpbmQgPT09ICdjb2xvcicgfHwgZXhwZWN0ZWQua2luZCA9PT0gJ2Zvcm1hdHRlZCcpICYmIChhY3R1YWwua2luZCA9PT0gJ3ZhbHVlJyB8fCBhY3R1YWwua2luZCA9PT0gJ3N0cmluZycpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJzZWQgPSBhbm5vdGF0ZShwYXJzZWQsIGV4cGVjdGVkLCBvcHRpb25zLnR5cGVBbm5vdGF0aW9uIHx8ICdjb2VyY2UnKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNoZWNrU3VidHlwZShleHBlY3RlZCwgYWN0dWFsKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBJZiBhbiBleHByZXNzaW9uJ3MgYXJndW1lbnRzIGFyZSBhbGwgbGl0ZXJhbHMsIHdlIGNhbiBldmFsdWF0ZVxuICAgICAgICAgICAgICAgIC8vIGl0IGltbWVkaWF0ZWx5IGFuZCByZXBsYWNlIGl0IHdpdGggYSBsaXRlcmFsIHZhbHVlIGluIHRoZVxuICAgICAgICAgICAgICAgIC8vIHBhcnNlZC9jb21waWxlZCByZXN1bHQuXG4gICAgICAgICAgICAgICAgaWYgKCEocGFyc2VkIGluc3RhbmNlb2YgTGl0ZXJhbCkgJiYgaXNDb25zdGFudChwYXJzZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVjID0gbmV3IEV2YWx1YXRpb25Db250ZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJzZWQgPSBuZXcgTGl0ZXJhbChwYXJzZWQudHlwZSwgcGFyc2VkLmV2YWx1YXRlKGVjKSk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXJyb3IoZS5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlZDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXJyb3IoYFVua25vd24gZXhwcmVzc2lvbiBcIiR7b3B9XCIuIElmIHlvdSB3YW50ZWQgYSBsaXRlcmFsIGFycmF5LCB1c2UgW1wibGl0ZXJhbFwiLCBbLi4uXV0uYCwgMCk7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGV4cHIgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lcnJvcihgJ3VuZGVmaW5lZCcgdmFsdWUgaW52YWxpZC4gVXNlIG51bGwgaW5zdGVhZC5gKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZXhwciA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmVycm9yKGBCYXJlIG9iamVjdHMgaW52YWxpZC4gVXNlIFtcImxpdGVyYWxcIiwgey4uLn1dIGluc3RlYWQuYCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lcnJvcihgRXhwZWN0ZWQgYW4gYXJyYXksIGJ1dCBmb3VuZCAke3R5cGVvZiBleHByfSBpbnN0ZWFkLmApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIGNvcHkgb2YgdGhpcyBjb250ZXh0IHN1aXRhYmxlIGZvciBwYXJzaW5nIHRoZSBzdWJleHByZXNzaW9uIGF0XG4gICAgICogaW5kZXggYGluZGV4YCwgb3B0aW9uYWxseSBhcHBlbmRpbmcgdG8gJ2xldCcgYmluZGluZyBtYXAuXG4gICAgICpcbiAgICAgKiBOb3RlIHRoYXQgYGVycm9yc2AgcHJvcGVydHksIGludGVuZGVkIGZvciBjb2xsZWN0aW5nIGVycm9ycyB3aGlsZVxuICAgICAqIHBhcnNpbmcsIGlzIGNvcGllZCBieSByZWZlcmVuY2UgcmF0aGVyIHRoYW4gY2xvbmVkLlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgY29uY2F0KGluZGV4OiBudW1iZXIsIGV4cGVjdGVkVHlwZT86ID9UeXBlLCBiaW5kaW5ncz86IEFycmF5PFtzdHJpbmcsIEV4cHJlc3Npb25dPikge1xuICAgICAgICBjb25zdCBwYXRoID0gdHlwZW9mIGluZGV4ID09PSAnbnVtYmVyJyA/IHRoaXMucGF0aC5jb25jYXQoaW5kZXgpIDogdGhpcy5wYXRoO1xuICAgICAgICBjb25zdCBzY29wZSA9IGJpbmRpbmdzID8gdGhpcy5zY29wZS5jb25jYXQoYmluZGluZ3MpIDogdGhpcy5zY29wZTtcbiAgICAgICAgcmV0dXJuIG5ldyBQYXJzaW5nQ29udGV4dChcbiAgICAgICAgICAgIHRoaXMucmVnaXN0cnksXG4gICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgZXhwZWN0ZWRUeXBlIHx8IG51bGwsXG4gICAgICAgICAgICBzY29wZSxcbiAgICAgICAgICAgIHRoaXMuZXJyb3JzXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHVzaCBhIHBhcnNpbmcgKG9yIHR5cGUgY2hlY2tpbmcpIGVycm9yIGludG8gdGhlIGB0aGlzLmVycm9yc2BcbiAgICAgKiBAcGFyYW0gZXJyb3IgVGhlIG1lc3NhZ2VcbiAgICAgKiBAcGFyYW0ga2V5cyBPcHRpb25hbGx5IHNwZWNpZnkgdGhlIHNvdXJjZSBvZiB0aGUgZXJyb3IgYXQgYSBjaGlsZFxuICAgICAqIG9mIHRoZSBjdXJyZW50IGV4cHJlc3Npb24gYXQgYHRoaXMua2V5YC5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGVycm9yKGVycm9yOiBzdHJpbmcsIC4uLmtleXM6IEFycmF5PG51bWJlcj4pIHtcbiAgICAgICAgY29uc3Qga2V5ID0gYCR7dGhpcy5rZXl9JHtrZXlzLm1hcChrID0+IGBbJHtrfV1gKS5qb2luKCcnKX1gO1xuICAgICAgICB0aGlzLmVycm9ycy5wdXNoKG5ldyBQYXJzaW5nRXJyb3Ioa2V5LCBlcnJvcikpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgbnVsbCBpZiBgdGAgaXMgYSBzdWJ0eXBlIG9mIGBleHBlY3RlZGA7IG90aGVyd2lzZSByZXR1cm5zIGFuXG4gICAgICogZXJyb3IgbWVzc2FnZSBhbmQgYWxzbyBwdXNoZXMgaXQgdG8gYHRoaXMuZXJyb3JzYC5cbiAgICAgKi9cbiAgICBjaGVja1N1YnR5cGUoZXhwZWN0ZWQ6IFR5cGUsIHQ6IFR5cGUpOiA/c3RyaW5nIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBjaGVja1N1YnR5cGUoZXhwZWN0ZWQsIHQpO1xuICAgICAgICBpZiAoZXJyb3IpIHRoaXMuZXJyb3IoZXJyb3IpO1xuICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBQYXJzaW5nQ29udGV4dDtcblxuZnVuY3Rpb24gaXNDb25zdGFudChleHByZXNzaW9uOiBFeHByZXNzaW9uKSB7XG4gICAgaWYgKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBWYXIpIHtcbiAgICAgICAgcmV0dXJuIGlzQ29uc3RhbnQoZXhwcmVzc2lvbi5ib3VuZEV4cHJlc3Npb24pO1xuICAgIH0gZWxzZSBpZiAoZXhwcmVzc2lvbiBpbnN0YW5jZW9mIENvbXBvdW5kRXhwcmVzc2lvbiAmJiBleHByZXNzaW9uLm5hbWUgPT09ICdlcnJvcicpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSBpZiAoZXhwcmVzc2lvbiBpbnN0YW5jZW9mIENvbGxhdG9yRXhwcmVzc2lvbikge1xuICAgICAgICAvLyBBbHRob3VnaCB0aGUgcmVzdWx0cyBvZiBhIENvbGxhdG9yIGV4cHJlc3Npb24gd2l0aCBmaXhlZCBhcmd1bWVudHNcbiAgICAgICAgLy8gZ2VuZXJhbGx5IHNob3VsZG4ndCBjaGFuZ2UgYmV0d2VlbiBleGVjdXRpb25zLCB3ZSBjYW4ndCBzZXJpYWxpemUgdGhlbVxuICAgICAgICAvLyBhcyBjb25zdGFudCBleHByZXNzaW9ucyBiZWNhdXNlIHJlc3VsdHMgY2hhbmdlIGJhc2VkIG9uIGVudmlyb25tZW50LlxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgaXNUeXBlQW5ub3RhdGlvbiA9IGV4cHJlc3Npb24gaW5zdGFuY2VvZiBDb2VyY2lvbiB8fFxuICAgICAgICBleHByZXNzaW9uIGluc3RhbmNlb2YgQXNzZXJ0aW9uO1xuXG4gICAgbGV0IGNoaWxkcmVuQ29uc3RhbnQgPSB0cnVlO1xuICAgIGV4cHJlc3Npb24uZWFjaENoaWxkKGNoaWxkID0+IHtcbiAgICAgICAgLy8gV2UgY2FuIF9hbG1vc3RfIGFzc3VtZSB0aGF0IGlmIGBleHByZXNzaW9uc2AgY2hpbGRyZW4gYXJlIGNvbnN0YW50LFxuICAgICAgICAvLyB0aGV5IHdvdWxkIGFscmVhZHkgaGF2ZSBiZWVuIGV2YWx1YXRlZCB0byBMaXRlcmFsIHZhbHVlcyB3aGVuIHRoZXlcbiAgICAgICAgLy8gd2VyZSBwYXJzZWQuICBUeXBlIGFubm90YXRpb25zIGFyZSB0aGUgZXhjZXB0aW9uLCBiZWNhdXNlIHRoZXkgbWlnaHRcbiAgICAgICAgLy8gaGF2ZSBiZWVuIGluZmVycmVkIGFuZCBhZGRlZCBhZnRlciBhIGNoaWxkIHdhcyBwYXJzZWQuXG5cbiAgICAgICAgLy8gU28gd2UgcmVjdXJzZSBpbnRvIGlzQ29uc3RhbnQoKSBmb3IgdGhlIGNoaWxkcmVuIG9mIHR5cGUgYW5ub3RhdGlvbnMsXG4gICAgICAgIC8vIGJ1dCBvdGhlcndpc2Ugc2ltcGx5IGNoZWNrIHdoZXRoZXIgdGhleSBhcmUgTGl0ZXJhbHMuXG4gICAgICAgIGlmIChpc1R5cGVBbm5vdGF0aW9uKSB7XG4gICAgICAgICAgICBjaGlsZHJlbkNvbnN0YW50ID0gY2hpbGRyZW5Db25zdGFudCAmJiBpc0NvbnN0YW50KGNoaWxkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNoaWxkcmVuQ29uc3RhbnQgPSBjaGlsZHJlbkNvbnN0YW50ICYmIGNoaWxkIGluc3RhbmNlb2YgTGl0ZXJhbDtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIGlmICghY2hpbGRyZW5Db25zdGFudCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIGlzRmVhdHVyZUNvbnN0YW50KGV4cHJlc3Npb24pICYmXG4gICAgICAgIGlzR2xvYmFsUHJvcGVydHlDb25zdGFudChleHByZXNzaW9uLCBbJ3pvb20nLCAnaGVhdG1hcC1kZW5zaXR5JywgJ2xpbmUtcHJvZ3Jlc3MnLCAnYWNjdW11bGF0ZWQnLCAnaXMtc3VwcG9ydGVkLXNjcmlwdCddKTtcbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCBSdW50aW1lRXJyb3IgZnJvbSAnLi9ydW50aW1lX2Vycm9yJztcblxuaW1wb3J0IHR5cGUgeyBFeHByZXNzaW9uIH0gZnJvbSAnLi9leHByZXNzaW9uJztcblxuZXhwb3J0IHR5cGUgU3RvcHMgPSBBcnJheTxbbnVtYmVyLCBFeHByZXNzaW9uXT47XG5cbi8qKlxuICogUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGxhc3Qgc3RvcCA8PSBpbnB1dCwgb3IgMCBpZiBpdCBkb2Vzbid0IGV4aXN0LlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmRTdG9wTGVzc1RoYW5PckVxdWFsVG8oc3RvcHM6IEFycmF5PG51bWJlcj4sIGlucHV0OiBudW1iZXIpIHtcbiAgICBjb25zdCBuID0gc3RvcHMubGVuZ3RoO1xuICAgIGxldCBsb3dlckluZGV4ID0gMDtcbiAgICBsZXQgdXBwZXJJbmRleCA9IG4gLSAxO1xuICAgIGxldCBjdXJyZW50SW5kZXggPSAwO1xuICAgIGxldCBjdXJyZW50VmFsdWUsIHVwcGVyVmFsdWU7XG5cbiAgICB3aGlsZSAobG93ZXJJbmRleCA8PSB1cHBlckluZGV4KSB7XG4gICAgICAgIGN1cnJlbnRJbmRleCA9IE1hdGguZmxvb3IoKGxvd2VySW5kZXggKyB1cHBlckluZGV4KSAvIDIpO1xuICAgICAgICBjdXJyZW50VmFsdWUgPSBzdG9wc1tjdXJyZW50SW5kZXhdO1xuICAgICAgICB1cHBlclZhbHVlID0gc3RvcHNbY3VycmVudEluZGV4ICsgMV07XG4gICAgICAgIGlmIChpbnB1dCA9PT0gY3VycmVudFZhbHVlIHx8IGlucHV0ID4gY3VycmVudFZhbHVlICYmIGlucHV0IDwgdXBwZXJWYWx1ZSkgeyAvLyBTZWFyY2ggY29tcGxldGVcbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50SW5kZXg7XG4gICAgICAgIH0gZWxzZSBpZiAoY3VycmVudFZhbHVlIDwgaW5wdXQpIHtcbiAgICAgICAgICAgIGxvd2VySW5kZXggPSBjdXJyZW50SW5kZXggKyAxO1xuICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRWYWx1ZSA+IGlucHV0KSB7XG4gICAgICAgICAgICB1cHBlckluZGV4ID0gY3VycmVudEluZGV4IC0gMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXJyb3IoJ0lucHV0IGlzIG5vdCBhIG51bWJlci4nKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBNYXRoLm1heChjdXJyZW50SW5kZXggLSAxLCAwKTtcbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7IE51bWJlclR5cGUgfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7IGZpbmRTdG9wTGVzc1RoYW5PckVxdWFsVG8gfSBmcm9tICcuLi9zdG9wcyc7XG5cbmltcG9ydCB0eXBlIHsgU3RvcHMgfSBmcm9tICcuLi9zdG9wcyc7XG5pbXBvcnQgdHlwZSB7IEV4cHJlc3Npb24gfSBmcm9tICcuLi9leHByZXNzaW9uJztcbmltcG9ydCB0eXBlIFBhcnNpbmdDb250ZXh0IGZyb20gJy4uL3BhcnNpbmdfY29udGV4dCc7XG5pbXBvcnQgdHlwZSBFdmFsdWF0aW9uQ29udGV4dCBmcm9tICcuLi9ldmFsdWF0aW9uX2NvbnRleHQnO1xuaW1wb3J0IHR5cGUgeyBWYWx1ZSB9IGZyb20gJy4uL3ZhbHVlcyc7XG5pbXBvcnQgdHlwZSB7IFR5cGUgfSBmcm9tICcuLi90eXBlcyc7XG5cbmNsYXNzIFN0ZXAgaW1wbGVtZW50cyBFeHByZXNzaW9uIHtcbiAgICB0eXBlOiBUeXBlO1xuXG4gICAgaW5wdXQ6IEV4cHJlc3Npb247XG4gICAgbGFiZWxzOiBBcnJheTxudW1iZXI+O1xuICAgIG91dHB1dHM6IEFycmF5PEV4cHJlc3Npb24+O1xuXG4gICAgY29uc3RydWN0b3IodHlwZTogVHlwZSwgaW5wdXQ6IEV4cHJlc3Npb24sIHN0b3BzOiBTdG9wcykge1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLmlucHV0ID0gaW5wdXQ7XG5cbiAgICAgICAgdGhpcy5sYWJlbHMgPSBbXTtcbiAgICAgICAgdGhpcy5vdXRwdXRzID0gW107XG4gICAgICAgIGZvciAoY29uc3QgW2xhYmVsLCBleHByZXNzaW9uXSBvZiBzdG9wcykge1xuICAgICAgICAgICAgdGhpcy5sYWJlbHMucHVzaChsYWJlbCk7XG4gICAgICAgICAgICB0aGlzLm91dHB1dHMucHVzaChleHByZXNzaW9uKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBwYXJzZShhcmdzOiBBcnJheTxtaXhlZD4sIGNvbnRleHQ6IFBhcnNpbmdDb250ZXh0KSB7XG4gICAgICAgIGxldCBbICwgaW5wdXQsIC4uLnJlc3RdID0gYXJncztcblxuICAgICAgICBpZiAoYXJncy5sZW5ndGggLSAxIDwgNCkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYEV4cGVjdGVkIGF0IGxlYXN0IDQgYXJndW1lbnRzLCBidXQgZm91bmQgb25seSAke2FyZ3MubGVuZ3RoIC0gMX0uYCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoKGFyZ3MubGVuZ3RoIC0gMSkgJSAyICE9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgRXhwZWN0ZWQgYW4gZXZlbiBudW1iZXIgb2YgYXJndW1lbnRzLmApO1xuICAgICAgICB9XG5cbiAgICAgICAgaW5wdXQgPSBjb250ZXh0LnBhcnNlKGlucHV0LCAxLCBOdW1iZXJUeXBlKTtcbiAgICAgICAgaWYgKCFpbnB1dCkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgY29uc3Qgc3RvcHM6IFN0b3BzID0gW107XG5cbiAgICAgICAgbGV0IG91dHB1dFR5cGU6IFR5cGUgPSAobnVsbDogYW55KTtcbiAgICAgICAgaWYgKGNvbnRleHQuZXhwZWN0ZWRUeXBlICYmIGNvbnRleHQuZXhwZWN0ZWRUeXBlLmtpbmQgIT09ICd2YWx1ZScpIHtcbiAgICAgICAgICAgIG91dHB1dFR5cGUgPSBjb250ZXh0LmV4cGVjdGVkVHlwZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlc3QudW5zaGlmdCgtSW5maW5pdHkpO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzdC5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgICAgICAgY29uc3QgbGFiZWwgPSByZXN0W2ldO1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSByZXN0W2kgKyAxXTtcblxuICAgICAgICAgICAgY29uc3QgbGFiZWxLZXkgPSBpICsgMTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlS2V5ID0gaSArIDI7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgbGFiZWwgIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoJ0lucHV0L291dHB1dCBwYWlycyBmb3IgXCJzdGVwXCIgZXhwcmVzc2lvbnMgbXVzdCBiZSBkZWZpbmVkIHVzaW5nIGxpdGVyYWwgbnVtZXJpYyB2YWx1ZXMgKG5vdCBjb21wdXRlZCBleHByZXNzaW9ucykgZm9yIHRoZSBpbnB1dCB2YWx1ZXMuJywgbGFiZWxLZXkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoc3RvcHMubGVuZ3RoICYmIHN0b3BzW3N0b3BzLmxlbmd0aCAtIDFdWzBdID49IGxhYmVsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoJ0lucHV0L291dHB1dCBwYWlycyBmb3IgXCJzdGVwXCIgZXhwcmVzc2lvbnMgbXVzdCBiZSBhcnJhbmdlZCB3aXRoIGlucHV0IHZhbHVlcyBpbiBzdHJpY3RseSBhc2NlbmRpbmcgb3JkZXIuJywgbGFiZWxLZXkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBwYXJzZWQgPSBjb250ZXh0LnBhcnNlKHZhbHVlLCB2YWx1ZUtleSwgb3V0cHV0VHlwZSk7XG4gICAgICAgICAgICBpZiAoIXBhcnNlZCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBvdXRwdXRUeXBlID0gb3V0cHV0VHlwZSB8fCBwYXJzZWQudHlwZTtcbiAgICAgICAgICAgIHN0b3BzLnB1c2goW2xhYmVsLCBwYXJzZWRdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgU3RlcChvdXRwdXRUeXBlLCBpbnB1dCwgc3RvcHMpO1xuICAgIH1cblxuICAgIGV2YWx1YXRlKGN0eDogRXZhbHVhdGlvbkNvbnRleHQpIHtcbiAgICAgICAgY29uc3QgbGFiZWxzID0gdGhpcy5sYWJlbHM7XG4gICAgICAgIGNvbnN0IG91dHB1dHMgPSB0aGlzLm91dHB1dHM7XG5cbiAgICAgICAgaWYgKGxhYmVscy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiBvdXRwdXRzWzBdLmV2YWx1YXRlKGN0eCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB2YWx1ZSA9ICgodGhpcy5pbnB1dC5ldmFsdWF0ZShjdHgpOiBhbnkpOiBudW1iZXIpO1xuICAgICAgICBpZiAodmFsdWUgPD0gbGFiZWxzWzBdKSB7XG4gICAgICAgICAgICByZXR1cm4gb3V0cHV0c1swXS5ldmFsdWF0ZShjdHgpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3RvcENvdW50ID0gbGFiZWxzLmxlbmd0aDtcbiAgICAgICAgaWYgKHZhbHVlID49IGxhYmVsc1tzdG9wQ291bnQgLSAxXSkge1xuICAgICAgICAgICAgcmV0dXJuIG91dHB1dHNbc3RvcENvdW50IC0gMV0uZXZhbHVhdGUoY3R4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGluZGV4ID0gZmluZFN0b3BMZXNzVGhhbk9yRXF1YWxUbyhsYWJlbHMsIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIG91dHB1dHNbaW5kZXhdLmV2YWx1YXRlKGN0eCk7XG4gICAgfVxuXG4gICAgZWFjaENoaWxkKGZuOiAoRXhwcmVzc2lvbikgPT4gdm9pZCkge1xuICAgICAgICBmbih0aGlzLmlucHV0KTtcbiAgICAgICAgZm9yIChjb25zdCBleHByZXNzaW9uIG9mIHRoaXMub3V0cHV0cykge1xuICAgICAgICAgICAgZm4oZXhwcmVzc2lvbik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwb3NzaWJsZU91dHB1dHMoKTogQXJyYXk8VmFsdWUgfCB2b2lkPiB7XG4gICAgICAgIHJldHVybiBbXS5jb25jYXQoLi4udGhpcy5vdXRwdXRzLm1hcCgob3V0cHV0KSA9PiBvdXRwdXQucG9zc2libGVPdXRwdXRzKCkpKTtcbiAgICB9XG5cbiAgICBzZXJpYWxpemUoKSB7XG4gICAgICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSBbXCJzdGVwXCIsIHRoaXMuaW5wdXQuc2VyaWFsaXplKCldO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubGFiZWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoaSA+IDApIHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkLnB1c2godGhpcy5sYWJlbHNbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2VyaWFsaXplZC5wdXNoKHRoaXMub3V0cHV0c1tpXS5zZXJpYWxpemUoKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZWQ7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBTdGVwO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IENvbG9yIGZyb20gJy4vY29sb3InO1xuXG5leHBvcnQgZnVuY3Rpb24gbnVtYmVyKGE6IG51bWJlciwgYjogbnVtYmVyLCB0OiBudW1iZXIpIHtcbiAgICByZXR1cm4gKGEgKiAoMSAtIHQpKSArIChiICogdCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb2xvcihmcm9tOiBDb2xvciwgdG86IENvbG9yLCB0OiBudW1iZXIpIHtcbiAgICByZXR1cm4gbmV3IENvbG9yKFxuICAgICAgICBudW1iZXIoZnJvbS5yLCB0by5yLCB0KSxcbiAgICAgICAgbnVtYmVyKGZyb20uZywgdG8uZywgdCksXG4gICAgICAgIG51bWJlcihmcm9tLmIsIHRvLmIsIHQpLFxuICAgICAgICBudW1iZXIoZnJvbS5hLCB0by5hLCB0KVxuICAgICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcnJheShmcm9tOiBBcnJheTxudW1iZXI+LCB0bzogQXJyYXk8bnVtYmVyPiwgdDogbnVtYmVyKTogQXJyYXk8bnVtYmVyPiB7XG4gICAgcmV0dXJuIGZyb20ubWFwKChkLCBpKSA9PiB7XG4gICAgICAgIHJldHVybiBudW1iZXIoZCwgdG9baV0sIHQpO1xuICAgIH0pO1xufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IENvbG9yIGZyb20gJy4vY29sb3InO1xuXG5pbXBvcnQge251bWJlciBhcyBpbnRlcnBvbGF0ZU51bWJlcn0gZnJvbSAnLi9pbnRlcnBvbGF0ZSc7XG5cbnR5cGUgTEFCQ29sb3IgPSB7XG4gICAgbDogbnVtYmVyLFxuICAgIGE6IG51bWJlcixcbiAgICBiOiBudW1iZXIsXG4gICAgYWxwaGE6IG51bWJlclxufTtcblxudHlwZSBIQ0xDb2xvciA9IHtcbiAgICBoOiBudW1iZXIsXG4gICAgYzogbnVtYmVyLFxuICAgIGw6IG51bWJlcixcbiAgICBhbHBoYTogbnVtYmVyXG59O1xuXG4vLyBDb25zdGFudHNcbmNvbnN0IFhuID0gMC45NTA0NzAsIC8vIEQ2NSBzdGFuZGFyZCByZWZlcmVudFxuICAgIFluID0gMSxcbiAgICBabiA9IDEuMDg4ODMwLFxuICAgIHQwID0gNCAvIDI5LFxuICAgIHQxID0gNiAvIDI5LFxuICAgIHQyID0gMyAqIHQxICogdDEsXG4gICAgdDMgPSB0MSAqIHQxICogdDEsXG4gICAgZGVnMnJhZCA9IE1hdGguUEkgLyAxODAsXG4gICAgcmFkMmRlZyA9IDE4MCAvIE1hdGguUEk7XG5cbi8vIFV0aWxpdGllc1xuZnVuY3Rpb24geHl6MmxhYih0KSB7XG4gICAgcmV0dXJuIHQgPiB0MyA/IE1hdGgucG93KHQsIDEgLyAzKSA6IHQgLyB0MiArIHQwO1xufVxuXG5mdW5jdGlvbiBsYWIyeHl6KHQpIHtcbiAgICByZXR1cm4gdCA+IHQxID8gdCAqIHQgKiB0IDogdDIgKiAodCAtIHQwKTtcbn1cblxuZnVuY3Rpb24geHl6MnJnYih4KSB7XG4gICAgcmV0dXJuIDI1NSAqICh4IDw9IDAuMDAzMTMwOCA/IDEyLjkyICogeCA6IDEuMDU1ICogTWF0aC5wb3coeCwgMSAvIDIuNCkgLSAwLjA1NSk7XG59XG5cbmZ1bmN0aW9uIHJnYjJ4eXooeCkge1xuICAgIHggLz0gMjU1O1xuICAgIHJldHVybiB4IDw9IDAuMDQwNDUgPyB4IC8gMTIuOTIgOiBNYXRoLnBvdygoeCArIDAuMDU1KSAvIDEuMDU1LCAyLjQpO1xufVxuXG4vLyBMQUJcbmZ1bmN0aW9uIHJnYlRvTGFiKHJnYkNvbG9yOiBDb2xvcik6IExBQkNvbG9yIHtcbiAgICBjb25zdCBiID0gcmdiMnh5eihyZ2JDb2xvci5yKSxcbiAgICAgICAgYSA9IHJnYjJ4eXoocmdiQ29sb3IuZyksXG4gICAgICAgIGwgPSByZ2IyeHl6KHJnYkNvbG9yLmIpLFxuICAgICAgICB4ID0geHl6MmxhYigoMC40MTI0NTY0ICogYiArIDAuMzU3NTc2MSAqIGEgKyAwLjE4MDQzNzUgKiBsKSAvIFhuKSxcbiAgICAgICAgeSA9IHh5ejJsYWIoKDAuMjEyNjcyOSAqIGIgKyAwLjcxNTE1MjIgKiBhICsgMC4wNzIxNzUwICogbCkgLyBZbiksXG4gICAgICAgIHogPSB4eXoybGFiKCgwLjAxOTMzMzkgKiBiICsgMC4xMTkxOTIwICogYSArIDAuOTUwMzA0MSAqIGwpIC8gWm4pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgbDogMTE2ICogeSAtIDE2LFxuICAgICAgICBhOiA1MDAgKiAoeCAtIHkpLFxuICAgICAgICBiOiAyMDAgKiAoeSAtIHopLFxuICAgICAgICBhbHBoYTogcmdiQ29sb3IuYVxuICAgIH07XG59XG5cbmZ1bmN0aW9uIGxhYlRvUmdiKGxhYkNvbG9yOiBMQUJDb2xvcik6IENvbG9yIHtcbiAgICBsZXQgeSA9IChsYWJDb2xvci5sICsgMTYpIC8gMTE2LFxuICAgICAgICB4ID0gaXNOYU4obGFiQ29sb3IuYSkgPyB5IDogeSArIGxhYkNvbG9yLmEgLyA1MDAsXG4gICAgICAgIHogPSBpc05hTihsYWJDb2xvci5iKSA/IHkgOiB5IC0gbGFiQ29sb3IuYiAvIDIwMDtcbiAgICB5ID0gWW4gKiBsYWIyeHl6KHkpO1xuICAgIHggPSBYbiAqIGxhYjJ4eXooeCk7XG4gICAgeiA9IFpuICogbGFiMnh5eih6KTtcbiAgICByZXR1cm4gbmV3IENvbG9yKFxuICAgICAgICB4eXoycmdiKDMuMjQwNDU0MiAqIHggLSAxLjUzNzEzODUgKiB5IC0gMC40OTg1MzE0ICogeiksIC8vIEQ2NSAtPiBzUkdCXG4gICAgICAgIHh5ejJyZ2IoLTAuOTY5MjY2MCAqIHggKyAxLjg3NjAxMDggKiB5ICsgMC4wNDE1NTYwICogeiksXG4gICAgICAgIHh5ejJyZ2IoMC4wNTU2NDM0ICogeCAtIDAuMjA0MDI1OSAqIHkgKyAxLjA1NzIyNTIgKiB6KSxcbiAgICAgICAgbGFiQ29sb3IuYWxwaGFcbiAgICApO1xufVxuXG5mdW5jdGlvbiBpbnRlcnBvbGF0ZUxhYihmcm9tOiBMQUJDb2xvciwgdG86IExBQkNvbG9yLCB0OiBudW1iZXIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBsOiBpbnRlcnBvbGF0ZU51bWJlcihmcm9tLmwsIHRvLmwsIHQpLFxuICAgICAgICBhOiBpbnRlcnBvbGF0ZU51bWJlcihmcm9tLmEsIHRvLmEsIHQpLFxuICAgICAgICBiOiBpbnRlcnBvbGF0ZU51bWJlcihmcm9tLmIsIHRvLmIsIHQpLFxuICAgICAgICBhbHBoYTogaW50ZXJwb2xhdGVOdW1iZXIoZnJvbS5hbHBoYSwgdG8uYWxwaGEsIHQpXG4gICAgfTtcbn1cblxuLy8gSENMXG5mdW5jdGlvbiByZ2JUb0hjbChyZ2JDb2xvcjogQ29sb3IpOiBIQ0xDb2xvciB7XG4gICAgY29uc3Qge2wsIGEsIGJ9ID0gcmdiVG9MYWIocmdiQ29sb3IpO1xuICAgIGNvbnN0IGggPSBNYXRoLmF0YW4yKGIsIGEpICogcmFkMmRlZztcbiAgICByZXR1cm4ge1xuICAgICAgICBoOiBoIDwgMCA/IGggKyAzNjAgOiBoLFxuICAgICAgICBjOiBNYXRoLnNxcnQoYSAqIGEgKyBiICogYiksXG4gICAgICAgIGwsXG4gICAgICAgIGFscGhhOiByZ2JDb2xvci5hXG4gICAgfTtcbn1cblxuZnVuY3Rpb24gaGNsVG9SZ2IoaGNsQ29sb3I6IEhDTENvbG9yKTogQ29sb3Ige1xuICAgIGNvbnN0IGggPSBoY2xDb2xvci5oICogZGVnMnJhZCxcbiAgICAgICAgYyA9IGhjbENvbG9yLmMsXG4gICAgICAgIGwgPSBoY2xDb2xvci5sO1xuICAgIHJldHVybiBsYWJUb1JnYih7XG4gICAgICAgIGwsXG4gICAgICAgIGE6IE1hdGguY29zKGgpICogYyxcbiAgICAgICAgYjogTWF0aC5zaW4oaCkgKiBjLFxuICAgICAgICBhbHBoYTogaGNsQ29sb3IuYWxwaGFcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gaW50ZXJwb2xhdGVIdWUoYTogbnVtYmVyLCBiOiBudW1iZXIsIHQ6IG51bWJlcikge1xuICAgIGNvbnN0IGQgPSBiIC0gYTtcbiAgICByZXR1cm4gYSArIHQgKiAoZCA+IDE4MCB8fCBkIDwgLTE4MCA/IGQgLSAzNjAgKiBNYXRoLnJvdW5kKGQgLyAzNjApIDogZCk7XG59XG5cbmZ1bmN0aW9uIGludGVycG9sYXRlSGNsKGZyb206IEhDTENvbG9yLCB0bzogSENMQ29sb3IsIHQ6IG51bWJlcikge1xuICAgIHJldHVybiB7XG4gICAgICAgIGg6IGludGVycG9sYXRlSHVlKGZyb20uaCwgdG8uaCwgdCksXG4gICAgICAgIGM6IGludGVycG9sYXRlTnVtYmVyKGZyb20uYywgdG8uYywgdCksXG4gICAgICAgIGw6IGludGVycG9sYXRlTnVtYmVyKGZyb20ubCwgdG8ubCwgdCksXG4gICAgICAgIGFscGhhOiBpbnRlcnBvbGF0ZU51bWJlcihmcm9tLmFscGhhLCB0by5hbHBoYSwgdClcbiAgICB9O1xufVxuXG5leHBvcnQgY29uc3QgbGFiID0ge1xuICAgIGZvcndhcmQ6IHJnYlRvTGFiLFxuICAgIHJldmVyc2U6IGxhYlRvUmdiLFxuICAgIGludGVycG9sYXRlOiBpbnRlcnBvbGF0ZUxhYlxufTtcblxuZXhwb3J0IGNvbnN0IGhjbCA9IHtcbiAgICBmb3J3YXJkOiByZ2JUb0hjbCxcbiAgICByZXZlcnNlOiBoY2xUb1JnYixcbiAgICBpbnRlcnBvbGF0ZTogaW50ZXJwb2xhdGVIY2xcbn07XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgVW5pdEJlemllciBmcm9tICdAbWFwYm94L3VuaXRiZXppZXInO1xuXG5pbXBvcnQgKiBhcyBpbnRlcnBvbGF0ZSBmcm9tICcuLi8uLi91dGlsL2ludGVycG9sYXRlJztcbmltcG9ydCB7IHRvU3RyaW5nLCBOdW1iZXJUeXBlLCBDb2xvclR5cGUgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBmaW5kU3RvcExlc3NUaGFuT3JFcXVhbFRvIH0gZnJvbSAnLi4vc3RvcHMnO1xuaW1wb3J0IHsgaGNsLCBsYWIgfSBmcm9tICcuLi8uLi91dGlsL2NvbG9yX3NwYWNlcyc7XG5cbmltcG9ydCB0eXBlIHsgU3RvcHMgfSBmcm9tICcuLi9zdG9wcyc7XG5pbXBvcnQgdHlwZSB7IEV4cHJlc3Npb24gfSBmcm9tICcuLi9leHByZXNzaW9uJztcbmltcG9ydCB0eXBlIFBhcnNpbmdDb250ZXh0IGZyb20gJy4uL3BhcnNpbmdfY29udGV4dCc7XG5pbXBvcnQgdHlwZSBFdmFsdWF0aW9uQ29udGV4dCBmcm9tICcuLi9ldmFsdWF0aW9uX2NvbnRleHQnO1xuaW1wb3J0IHR5cGUgeyBWYWx1ZSB9IGZyb20gJy4uL3ZhbHVlcyc7XG5pbXBvcnQgdHlwZSB7IFR5cGUgfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCB0eXBlIEludGVycG9sYXRpb25UeXBlID1cbiAgICB7IG5hbWU6ICdsaW5lYXInIH0gfFxuICAgIHsgbmFtZTogJ2V4cG9uZW50aWFsJywgYmFzZTogbnVtYmVyIH0gfFxuICAgIHsgbmFtZTogJ2N1YmljLWJlemllcicsIGNvbnRyb2xQb2ludHM6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdIH07XG5cbmNsYXNzIEludGVycG9sYXRlIGltcGxlbWVudHMgRXhwcmVzc2lvbiB7XG4gICAgdHlwZTogVHlwZTtcblxuICAgIG9wZXJhdG9yOiAnaW50ZXJwb2xhdGUnIHwgJ2ludGVycG9sYXRlLWhjbCcgfCAnaW50ZXJwb2xhdGUtbGFiJztcbiAgICBpbnRlcnBvbGF0aW9uOiBJbnRlcnBvbGF0aW9uVHlwZTtcbiAgICBpbnB1dDogRXhwcmVzc2lvbjtcbiAgICBsYWJlbHM6IEFycmF5PG51bWJlcj47XG4gICAgb3V0cHV0czogQXJyYXk8RXhwcmVzc2lvbj47XG5cbiAgICBjb25zdHJ1Y3Rvcih0eXBlOiBUeXBlLCBvcGVyYXRvcjogJ2ludGVycG9sYXRlJyB8ICdpbnRlcnBvbGF0ZS1oY2wnIHwgJ2ludGVycG9sYXRlLWxhYicsIGludGVycG9sYXRpb246IEludGVycG9sYXRpb25UeXBlLCBpbnB1dDogRXhwcmVzc2lvbiwgc3RvcHM6IFN0b3BzKSB7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgIHRoaXMub3BlcmF0b3IgPSBvcGVyYXRvcjtcbiAgICAgICAgdGhpcy5pbnRlcnBvbGF0aW9uID0gaW50ZXJwb2xhdGlvbjtcbiAgICAgICAgdGhpcy5pbnB1dCA9IGlucHV0O1xuXG4gICAgICAgIHRoaXMubGFiZWxzID0gW107XG4gICAgICAgIHRoaXMub3V0cHV0cyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IFtsYWJlbCwgZXhwcmVzc2lvbl0gb2Ygc3RvcHMpIHtcbiAgICAgICAgICAgIHRoaXMubGFiZWxzLnB1c2gobGFiZWwpO1xuICAgICAgICAgICAgdGhpcy5vdXRwdXRzLnB1c2goZXhwcmVzc2lvbik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgaW50ZXJwb2xhdGlvbkZhY3RvcihpbnRlcnBvbGF0aW9uOiBJbnRlcnBvbGF0aW9uVHlwZSwgaW5wdXQ6IG51bWJlciwgbG93ZXI6IG51bWJlciwgdXBwZXI6IG51bWJlcikge1xuICAgICAgICBsZXQgdCA9IDA7XG4gICAgICAgIGlmIChpbnRlcnBvbGF0aW9uLm5hbWUgPT09ICdleHBvbmVudGlhbCcpIHtcbiAgICAgICAgICAgIHQgPSBleHBvbmVudGlhbEludGVycG9sYXRpb24oaW5wdXQsIGludGVycG9sYXRpb24uYmFzZSwgbG93ZXIsIHVwcGVyKTtcbiAgICAgICAgfSBlbHNlIGlmIChpbnRlcnBvbGF0aW9uLm5hbWUgPT09ICdsaW5lYXInKSB7XG4gICAgICAgICAgICB0ID0gZXhwb25lbnRpYWxJbnRlcnBvbGF0aW9uKGlucHV0LCAxLCBsb3dlciwgdXBwZXIpO1xuICAgICAgICB9IGVsc2UgaWYgKGludGVycG9sYXRpb24ubmFtZSA9PT0gJ2N1YmljLWJlemllcicpIHtcbiAgICAgICAgICAgIGNvbnN0IGMgPSBpbnRlcnBvbGF0aW9uLmNvbnRyb2xQb2ludHM7XG4gICAgICAgICAgICBjb25zdCB1YiA9IG5ldyBVbml0QmV6aWVyKGNbMF0sIGNbMV0sIGNbMl0sIGNbM10pO1xuICAgICAgICAgICAgdCA9IHViLnNvbHZlKGV4cG9uZW50aWFsSW50ZXJwb2xhdGlvbihpbnB1dCwgMSwgbG93ZXIsIHVwcGVyKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHQ7XG4gICAgfVxuXG4gICAgc3RhdGljIHBhcnNlKGFyZ3M6IEFycmF5PG1peGVkPiwgY29udGV4dDogUGFyc2luZ0NvbnRleHQpIHtcbiAgICAgICAgbGV0IFtvcGVyYXRvciwgaW50ZXJwb2xhdGlvbiwgaW5wdXQsIC4uLnJlc3RdID0gYXJncztcblxuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoaW50ZXJwb2xhdGlvbikgfHwgaW50ZXJwb2xhdGlvbi5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBFeHBlY3RlZCBhbiBpbnRlcnBvbGF0aW9uIHR5cGUgZXhwcmVzc2lvbi5gLCAxKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpbnRlcnBvbGF0aW9uWzBdID09PSAnbGluZWFyJykge1xuICAgICAgICAgICAgaW50ZXJwb2xhdGlvbiA9IHsgbmFtZTogJ2xpbmVhcicgfTtcbiAgICAgICAgfSBlbHNlIGlmIChpbnRlcnBvbGF0aW9uWzBdID09PSAnZXhwb25lbnRpYWwnKSB7XG4gICAgICAgICAgICBjb25zdCBiYXNlID0gaW50ZXJwb2xhdGlvblsxXTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgYmFzZSAhPT0gJ251bWJlcicpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYEV4cG9uZW50aWFsIGludGVycG9sYXRpb24gcmVxdWlyZXMgYSBudW1lcmljIGJhc2UuYCwgMSwgMSk7XG4gICAgICAgICAgICBpbnRlcnBvbGF0aW9uID0ge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdleHBvbmVudGlhbCcsXG4gICAgICAgICAgICAgICAgYmFzZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIGlmIChpbnRlcnBvbGF0aW9uWzBdID09PSAnY3ViaWMtYmV6aWVyJykge1xuICAgICAgICAgICAgY29uc3QgY29udHJvbFBvaW50cyA9IGludGVycG9sYXRpb24uc2xpY2UoMSk7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgY29udHJvbFBvaW50cy5sZW5ndGggIT09IDQgfHxcbiAgICAgICAgICAgICAgICBjb250cm9sUG9pbnRzLnNvbWUodCA9PiB0eXBlb2YgdCAhPT0gJ251bWJlcicgfHwgdCA8IDAgfHwgdCA+IDEpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcignQ3ViaWMgYmV6aWVyIGludGVycG9sYXRpb24gcmVxdWlyZXMgZm91ciBudW1lcmljIGFyZ3VtZW50cyB3aXRoIHZhbHVlcyBiZXR3ZWVuIDAgYW5kIDEuJywgMSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGludGVycG9sYXRpb24gPSB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ2N1YmljLWJlemllcicsXG4gICAgICAgICAgICAgICAgY29udHJvbFBvaW50czogKGNvbnRyb2xQb2ludHM6IGFueSlcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgVW5rbm93biBpbnRlcnBvbGF0aW9uIHR5cGUgJHtTdHJpbmcoaW50ZXJwb2xhdGlvblswXSl9YCwgMSwgMCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYXJncy5sZW5ndGggLSAxIDwgNCkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYEV4cGVjdGVkIGF0IGxlYXN0IDQgYXJndW1lbnRzLCBidXQgZm91bmQgb25seSAke2FyZ3MubGVuZ3RoIC0gMX0uYCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoKGFyZ3MubGVuZ3RoIC0gMSkgJSAyICE9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgRXhwZWN0ZWQgYW4gZXZlbiBudW1iZXIgb2YgYXJndW1lbnRzLmApO1xuICAgICAgICB9XG5cbiAgICAgICAgaW5wdXQgPSBjb250ZXh0LnBhcnNlKGlucHV0LCAyLCBOdW1iZXJUeXBlKTtcbiAgICAgICAgaWYgKCFpbnB1dCkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgY29uc3Qgc3RvcHM6IFN0b3BzID0gW107XG5cbiAgICAgICAgbGV0IG91dHB1dFR5cGU6IFR5cGUgPSAobnVsbDogYW55KTtcbiAgICAgICAgaWYgKG9wZXJhdG9yID09PSAnaW50ZXJwb2xhdGUtaGNsJyB8fCBvcGVyYXRvciA9PT0gJ2ludGVycG9sYXRlLWxhYicpIHtcbiAgICAgICAgICAgIG91dHB1dFR5cGUgPSBDb2xvclR5cGU7XG4gICAgICAgIH0gZWxzZSBpZiAoY29udGV4dC5leHBlY3RlZFR5cGUgJiYgY29udGV4dC5leHBlY3RlZFR5cGUua2luZCAhPT0gJ3ZhbHVlJykge1xuICAgICAgICAgICAgb3V0cHV0VHlwZSA9IGNvbnRleHQuZXhwZWN0ZWRUeXBlO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXN0Lmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICAgICAgICBjb25zdCBsYWJlbCA9IHJlc3RbaV07XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHJlc3RbaSArIDFdO1xuXG4gICAgICAgICAgICBjb25zdCBsYWJlbEtleSA9IGkgKyAzO1xuICAgICAgICAgICAgY29uc3QgdmFsdWVLZXkgPSBpICsgNDtcblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBsYWJlbCAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcignSW5wdXQvb3V0cHV0IHBhaXJzIGZvciBcImludGVycG9sYXRlXCIgZXhwcmVzc2lvbnMgbXVzdCBiZSBkZWZpbmVkIHVzaW5nIGxpdGVyYWwgbnVtZXJpYyB2YWx1ZXMgKG5vdCBjb21wdXRlZCBleHByZXNzaW9ucykgZm9yIHRoZSBpbnB1dCB2YWx1ZXMuJywgbGFiZWxLZXkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoc3RvcHMubGVuZ3RoICYmIHN0b3BzW3N0b3BzLmxlbmd0aCAtIDFdWzBdID49IGxhYmVsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoJ0lucHV0L291dHB1dCBwYWlycyBmb3IgXCJpbnRlcnBvbGF0ZVwiIGV4cHJlc3Npb25zIG11c3QgYmUgYXJyYW5nZWQgd2l0aCBpbnB1dCB2YWx1ZXMgaW4gc3RyaWN0bHkgYXNjZW5kaW5nIG9yZGVyLicsIGxhYmVsS2V5KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgcGFyc2VkID0gY29udGV4dC5wYXJzZSh2YWx1ZSwgdmFsdWVLZXksIG91dHB1dFR5cGUpO1xuICAgICAgICAgICAgaWYgKCFwYXJzZWQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgb3V0cHV0VHlwZSA9IG91dHB1dFR5cGUgfHwgcGFyc2VkLnR5cGU7XG4gICAgICAgICAgICBzdG9wcy5wdXNoKFtsYWJlbCwgcGFyc2VkXSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3V0cHV0VHlwZS5raW5kICE9PSAnbnVtYmVyJyAmJlxuICAgICAgICAgICAgb3V0cHV0VHlwZS5raW5kICE9PSAnY29sb3InICYmXG4gICAgICAgICAgICAhKFxuICAgICAgICAgICAgICAgIG91dHB1dFR5cGUua2luZCA9PT0gJ2FycmF5JyAmJlxuICAgICAgICAgICAgICAgIG91dHB1dFR5cGUuaXRlbVR5cGUua2luZCA9PT0gJ251bWJlcicgJiZcbiAgICAgICAgICAgICAgICB0eXBlb2Ygb3V0cHV0VHlwZS5OID09PSAnbnVtYmVyJ1xuICAgICAgICAgICAgKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBUeXBlICR7dG9TdHJpbmcob3V0cHV0VHlwZSl9IGlzIG5vdCBpbnRlcnBvbGF0YWJsZS5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgSW50ZXJwb2xhdGUob3V0cHV0VHlwZSwgKG9wZXJhdG9yOiBhbnkpLCBpbnRlcnBvbGF0aW9uLCBpbnB1dCwgc3RvcHMpO1xuICAgIH1cblxuICAgIGV2YWx1YXRlKGN0eDogRXZhbHVhdGlvbkNvbnRleHQpIHtcbiAgICAgICAgY29uc3QgbGFiZWxzID0gdGhpcy5sYWJlbHM7XG4gICAgICAgIGNvbnN0IG91dHB1dHMgPSB0aGlzLm91dHB1dHM7XG5cbiAgICAgICAgaWYgKGxhYmVscy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiBvdXRwdXRzWzBdLmV2YWx1YXRlKGN0eCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB2YWx1ZSA9ICgodGhpcy5pbnB1dC5ldmFsdWF0ZShjdHgpOiBhbnkpOiBudW1iZXIpO1xuICAgICAgICBpZiAodmFsdWUgPD0gbGFiZWxzWzBdKSB7XG4gICAgICAgICAgICByZXR1cm4gb3V0cHV0c1swXS5ldmFsdWF0ZShjdHgpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3RvcENvdW50ID0gbGFiZWxzLmxlbmd0aDtcbiAgICAgICAgaWYgKHZhbHVlID49IGxhYmVsc1tzdG9wQ291bnQgLSAxXSkge1xuICAgICAgICAgICAgcmV0dXJuIG91dHB1dHNbc3RvcENvdW50IC0gMV0uZXZhbHVhdGUoY3R4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGluZGV4ID0gZmluZFN0b3BMZXNzVGhhbk9yRXF1YWxUbyhsYWJlbHMsIHZhbHVlKTtcbiAgICAgICAgY29uc3QgbG93ZXIgPSBsYWJlbHNbaW5kZXhdO1xuICAgICAgICBjb25zdCB1cHBlciA9IGxhYmVsc1tpbmRleCArIDFdO1xuICAgICAgICBjb25zdCB0ID0gSW50ZXJwb2xhdGUuaW50ZXJwb2xhdGlvbkZhY3Rvcih0aGlzLmludGVycG9sYXRpb24sIHZhbHVlLCBsb3dlciwgdXBwZXIpO1xuXG4gICAgICAgIGNvbnN0IG91dHB1dExvd2VyID0gb3V0cHV0c1tpbmRleF0uZXZhbHVhdGUoY3R4KTtcbiAgICAgICAgY29uc3Qgb3V0cHV0VXBwZXIgPSBvdXRwdXRzW2luZGV4ICsgMV0uZXZhbHVhdGUoY3R4KTtcblxuICAgICAgICBpZiAodGhpcy5vcGVyYXRvciA9PT0gJ2ludGVycG9sYXRlJykge1xuICAgICAgICAgICAgcmV0dXJuIChpbnRlcnBvbGF0ZVt0aGlzLnR5cGUua2luZC50b0xvd2VyQ2FzZSgpXTogYW55KShvdXRwdXRMb3dlciwgb3V0cHV0VXBwZXIsIHQpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGltcG9ydC9uYW1lc3BhY2VcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLm9wZXJhdG9yID09PSAnaW50ZXJwb2xhdGUtaGNsJykge1xuICAgICAgICAgICAgcmV0dXJuIGhjbC5yZXZlcnNlKGhjbC5pbnRlcnBvbGF0ZShoY2wuZm9yd2FyZChvdXRwdXRMb3dlciksIGhjbC5mb3J3YXJkKG91dHB1dFVwcGVyKSwgdCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGxhYi5yZXZlcnNlKGxhYi5pbnRlcnBvbGF0ZShsYWIuZm9yd2FyZChvdXRwdXRMb3dlciksIGxhYi5mb3J3YXJkKG91dHB1dFVwcGVyKSwgdCkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZWFjaENoaWxkKGZuOiAoRXhwcmVzc2lvbikgPT4gdm9pZCkge1xuICAgICAgICBmbih0aGlzLmlucHV0KTtcbiAgICAgICAgZm9yIChjb25zdCBleHByZXNzaW9uIG9mIHRoaXMub3V0cHV0cykge1xuICAgICAgICAgICAgZm4oZXhwcmVzc2lvbik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwb3NzaWJsZU91dHB1dHMoKTogQXJyYXk8VmFsdWUgfCB2b2lkPiB7XG4gICAgICAgIHJldHVybiBbXS5jb25jYXQoLi4udGhpcy5vdXRwdXRzLm1hcCgob3V0cHV0KSA9PiBvdXRwdXQucG9zc2libGVPdXRwdXRzKCkpKTtcbiAgICB9XG5cbiAgICBzZXJpYWxpemUoKTogQXJyYXk8bWl4ZWQ+IHtcbiAgICAgICAgbGV0IGludGVycG9sYXRpb247XG4gICAgICAgIGlmICh0aGlzLmludGVycG9sYXRpb24ubmFtZSA9PT0gJ2xpbmVhcicpIHtcbiAgICAgICAgICAgIGludGVycG9sYXRpb24gPSBbXCJsaW5lYXJcIl07XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5pbnRlcnBvbGF0aW9uLm5hbWUgPT09ICdleHBvbmVudGlhbCcpIHtcbiAgICAgICAgICAgIGlmICAodGhpcy5pbnRlcnBvbGF0aW9uLmJhc2UgPT09IDEpIHtcbiAgICAgICAgICAgICAgICBpbnRlcnBvbGF0aW9uID0gW1wibGluZWFyXCJdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpbnRlcnBvbGF0aW9uID0gW1wiZXhwb25lbnRpYWxcIiwgdGhpcy5pbnRlcnBvbGF0aW9uLmJhc2VdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaW50ZXJwb2xhdGlvbiA9IFtcImN1YmljLWJlemllclwiIF0uY29uY2F0KHRoaXMuaW50ZXJwb2xhdGlvbi5jb250cm9sUG9pbnRzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSBbdGhpcy5vcGVyYXRvciwgaW50ZXJwb2xhdGlvbiwgdGhpcy5pbnB1dC5zZXJpYWxpemUoKV07XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmxhYmVscy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgc2VyaWFsaXplZC5wdXNoKFxuICAgICAgICAgICAgICAgIHRoaXMubGFiZWxzW2ldLFxuICAgICAgICAgICAgICAgIHRoaXMub3V0cHV0c1tpXS5zZXJpYWxpemUoKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2VyaWFsaXplZDtcbiAgICB9XG59XG5cbi8qKlxuICogUmV0dXJucyBhIHJhdGlvIHRoYXQgY2FuIGJlIHVzZWQgdG8gaW50ZXJwb2xhdGUgYmV0d2VlbiBleHBvbmVudGlhbCBmdW5jdGlvblxuICogc3RvcHMuXG4gKiBIb3cgaXQgd29ya3M6IFR3byBjb25zZWN1dGl2ZSBzdG9wIHZhbHVlcyBkZWZpbmUgYSAoc2NhbGVkIGFuZCBzaGlmdGVkKSBleHBvbmVudGlhbCBmdW5jdGlvbiBgZih4KSA9IGEgKiBiYXNlXnggKyBiYCwgd2hlcmUgYGJhc2VgIGlzIHRoZSB1c2VyLXNwZWNpZmllZCBiYXNlLFxuICogYW5kIGBhYCBhbmQgYGJgIGFyZSBjb25zdGFudHMgYWZmb3JkaW5nIHN1ZmZpY2llbnQgZGVncmVlcyBvZiBmcmVlZG9tIHRvIGZpdFxuICogdGhlIGZ1bmN0aW9uIHRvIHRoZSBnaXZlbiBzdG9wcy5cbiAqXG4gKiBIZXJlJ3MgYSBiaXQgb2YgYWxnZWJyYSB0aGF0IGxldHMgdXMgY29tcHV0ZSBgZih4KWAgZGlyZWN0bHkgZnJvbSB0aGUgc3RvcFxuICogdmFsdWVzIHdpdGhvdXQgZXhwbGljaXRseSBzb2x2aW5nIGZvciBgYWAgYW5kIGBiYDpcbiAqXG4gKiBGaXJzdCBzdG9wIHZhbHVlOiBgZih4MCkgPSB5MCA9IGEgKiBiYXNlXngwICsgYmBcbiAqIFNlY29uZCBzdG9wIHZhbHVlOiBgZih4MSkgPSB5MSA9IGEgKiBiYXNlXngxICsgYmBcbiAqID0+IGB5MSAtIHkwID0gYShiYXNlXngxIC0gYmFzZV54MClgXG4gKiA9PiBgYSA9ICh5MSAtIHkwKS8oYmFzZV54MSAtIGJhc2VeeDApYFxuICpcbiAqIERlc2lyZWQgdmFsdWU6IGBmKHgpID0geSA9IGEgKiBiYXNlXnggKyBiYFxuICogPT4gYGYoeCkgPSB5MCArIGEgKiAoYmFzZV54IC0gYmFzZV54MClgXG4gKlxuICogRnJvbSB0aGUgYWJvdmUsIHdlIGNhbiByZXBsYWNlIHRoZSBgYWAgaW4gYGEgKiAoYmFzZV54IC0gYmFzZV54MClgIGFuZCBkbyBhXG4gKiBsaXR0bGUgYWxnZWJyYTpcbiAqIGBgYFxuICogYSAqIChiYXNlXnggLSBiYXNlXngwKSA9ICh5MSAtIHkwKS8oYmFzZV54MSAtIGJhc2VeeDApICogKGJhc2VeeCAtIGJhc2VeeDApXG4gKiAgICAgICAgICAgICAgICAgICAgID0gKHkxIC0geTApICogKGJhc2VeeCAtIGJhc2VeeDApIC8gKGJhc2VeeDEgLSBiYXNlXngwKVxuICogYGBgXG4gKlxuICogSWYgd2UgbGV0IGAoYmFzZV54IC0gYmFzZV54MCkgLyAoYmFzZV54MSBiYXNlXngwKWAsIHRoZW4gd2UgaGF2ZVxuICogYGYoeCkgPSB5MCArICh5MSAtIHkwKSAqIHJhdGlvYC4gIEluIG90aGVyIHdvcmRzLCBgcmF0aW9gIG1heSBiZSB0cmVhdGVkIGFzXG4gKiBhbiBpbnRlcnBvbGF0aW9uIGZhY3RvciBiZXR3ZWVuIHRoZSB0d28gc3RvcHMnIG91dHB1dCB2YWx1ZXMuXG4gKlxuICogKE5vdGU6IGEgc2xpZ2h0bHkgZGlmZmVyZW50IGZvcm0gZm9yIGByYXRpb2AsXG4gKiBgKGJhc2VeKHgteDApIC0gMSkgLyAoYmFzZV4oeDEteDApIC0gMSkgYCwgaXMgZXF1aXZhbGVudCwgYnV0IHJlcXVpcmVzIGZld2VyXG4gKiBleHBlbnNpdmUgYE1hdGgucG93KClgIG9wZXJhdGlvbnMuKVxuICpcbiAqIEBwcml2YXRlXG4qL1xuZnVuY3Rpb24gZXhwb25lbnRpYWxJbnRlcnBvbGF0aW9uKGlucHV0LCBiYXNlLCBsb3dlclZhbHVlLCB1cHBlclZhbHVlKSB7XG4gICAgY29uc3QgZGlmZmVyZW5jZSA9IHVwcGVyVmFsdWUgLSBsb3dlclZhbHVlO1xuICAgIGNvbnN0IHByb2dyZXNzID0gaW5wdXQgLSBsb3dlclZhbHVlO1xuXG4gICAgaWYgKGRpZmZlcmVuY2UgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfSBlbHNlIGlmIChiYXNlID09PSAxKSB7XG4gICAgICAgIHJldHVybiBwcm9ncmVzcyAvIGRpZmZlcmVuY2U7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIChNYXRoLnBvdyhiYXNlLCBwcm9ncmVzcykgLSAxKSAvIChNYXRoLnBvdyhiYXNlLCBkaWZmZXJlbmNlKSAtIDEpO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgSW50ZXJwb2xhdGU7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5cbmltcG9ydCB7IGNoZWNrU3VidHlwZSwgVmFsdWVUeXBlIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQgdHlwZSB7IEV4cHJlc3Npb24gfSBmcm9tICcuLi9leHByZXNzaW9uJztcbmltcG9ydCB0eXBlIFBhcnNpbmdDb250ZXh0IGZyb20gJy4uL3BhcnNpbmdfY29udGV4dCc7XG5pbXBvcnQgdHlwZSBFdmFsdWF0aW9uQ29udGV4dCBmcm9tICcuLi9ldmFsdWF0aW9uX2NvbnRleHQnO1xuaW1wb3J0IHR5cGUgeyBWYWx1ZSB9IGZyb20gJy4uL3ZhbHVlcyc7XG5pbXBvcnQgdHlwZSB7IFR5cGUgfSBmcm9tICcuLi90eXBlcyc7XG5cbmNsYXNzIENvYWxlc2NlIGltcGxlbWVudHMgRXhwcmVzc2lvbiB7XG4gICAgdHlwZTogVHlwZTtcbiAgICBhcmdzOiBBcnJheTxFeHByZXNzaW9uPjtcblxuICAgIGNvbnN0cnVjdG9yKHR5cGU6IFR5cGUsIGFyZ3M6IEFycmF5PEV4cHJlc3Npb24+KSB7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgIHRoaXMuYXJncyA9IGFyZ3M7XG4gICAgfVxuXG4gICAgc3RhdGljIHBhcnNlKGFyZ3M6IEFycmF5PG1peGVkPiwgY29udGV4dDogUGFyc2luZ0NvbnRleHQpIHtcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoIDwgMikge1xuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoXCJFeHBlY3RlY3RlZCBhdCBsZWFzdCBvbmUgYXJndW1lbnQuXCIpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBvdXRwdXRUeXBlOiBUeXBlID0gKG51bGw6IGFueSk7XG4gICAgICAgIGNvbnN0IGV4cGVjdGVkVHlwZSA9IGNvbnRleHQuZXhwZWN0ZWRUeXBlO1xuICAgICAgICBpZiAoZXhwZWN0ZWRUeXBlICYmIGV4cGVjdGVkVHlwZS5raW5kICE9PSAndmFsdWUnKSB7XG4gICAgICAgICAgICBvdXRwdXRUeXBlID0gZXhwZWN0ZWRUeXBlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhcnNlZEFyZ3MgPSBbXTtcblxuICAgICAgICBmb3IgKGNvbnN0IGFyZyBvZiBhcmdzLnNsaWNlKDEpKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJzZWQgPSBjb250ZXh0LnBhcnNlKGFyZywgMSArIHBhcnNlZEFyZ3MubGVuZ3RoLCBvdXRwdXRUeXBlLCB1bmRlZmluZWQsIHt0eXBlQW5ub3RhdGlvbjogJ29taXQnfSk7XG4gICAgICAgICAgICBpZiAoIXBhcnNlZCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBvdXRwdXRUeXBlID0gb3V0cHV0VHlwZSB8fCBwYXJzZWQudHlwZTtcbiAgICAgICAgICAgIHBhcnNlZEFyZ3MucHVzaChwYXJzZWQpO1xuICAgICAgICB9XG4gICAgICAgIGFzc2VydChvdXRwdXRUeXBlKTtcblxuICAgICAgICAvLyBBYm92ZSwgd2UgcGFyc2UgYXJndW1lbnRzIHdpdGhvdXQgaW5mZXJyZWQgdHlwZSBhbm5vdGF0aW9uIHNvIHRoYXRcbiAgICAgICAgLy8gdGhleSBkb24ndCBwcm9kdWNlIGEgcnVudGltZSBlcnJvciBmb3IgYG51bGxgIGlucHV0LCB3aGljaCB3b3VsZFxuICAgICAgICAvLyBwcmVlbXB0IHRoZSBkZXNpcmVkIG51bGwtY29hbGVzY2luZyBiZWhhdmlvci5cbiAgICAgICAgLy8gVGh1cywgaWYgYW55IG9mIG91ciBhcmd1bWVudHMgd291bGQgaGF2ZSBuZWVkZWQgYW4gYW5ub3RhdGlvbiwgd2VcbiAgICAgICAgLy8gbmVlZCB0byB3cmFwIHRoZSBlbmNsb3NpbmcgY29hbGVzY2UgZXhwcmVzc2lvbiB3aXRoIGl0IGluc3RlYWQuXG4gICAgICAgIGNvbnN0IG5lZWRzQW5ub3RhdGlvbiA9IGV4cGVjdGVkVHlwZSAmJlxuICAgICAgICAgICAgcGFyc2VkQXJncy5zb21lKGFyZyA9PiBjaGVja1N1YnR5cGUoZXhwZWN0ZWRUeXBlLCBhcmcudHlwZSkpO1xuXG4gICAgICAgIHJldHVybiBuZWVkc0Fubm90YXRpb24gP1xuICAgICAgICAgICAgbmV3IENvYWxlc2NlKFZhbHVlVHlwZSwgcGFyc2VkQXJncykgOlxuICAgICAgICAgICAgbmV3IENvYWxlc2NlKChvdXRwdXRUeXBlOiBhbnkpLCBwYXJzZWRBcmdzKTtcbiAgICB9XG5cbiAgICBldmFsdWF0ZShjdHg6IEV2YWx1YXRpb25Db250ZXh0KSB7XG4gICAgICAgIGxldCByZXN1bHQgPSBudWxsO1xuICAgICAgICBmb3IgKGNvbnN0IGFyZyBvZiB0aGlzLmFyZ3MpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGFyZy5ldmFsdWF0ZShjdHgpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdCAhPT0gbnVsbCkgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBlYWNoQ2hpbGQoZm46IChFeHByZXNzaW9uKSA9PiB2b2lkKSB7XG4gICAgICAgIHRoaXMuYXJncy5mb3JFYWNoKGZuKTtcbiAgICB9XG5cbiAgICBwb3NzaWJsZU91dHB1dHMoKTogQXJyYXk8VmFsdWUgfCB2b2lkPiB7XG4gICAgICAgIHJldHVybiBbXS5jb25jYXQoLi4udGhpcy5hcmdzLm1hcCgoYXJnKSA9PiBhcmcucG9zc2libGVPdXRwdXRzKCkpKTtcbiAgICB9XG5cbiAgICBzZXJpYWxpemUoKSB7XG4gICAgICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSBbXCJjb2FsZXNjZVwiXTtcbiAgICAgICAgdGhpcy5lYWNoQ2hpbGQoY2hpbGQgPT4geyBzZXJpYWxpemVkLnB1c2goY2hpbGQuc2VyaWFsaXplKCkpOyB9KTtcbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZWQ7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBDb2FsZXNjZTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB0eXBlIHsgVHlwZSB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB0eXBlIHsgRXhwcmVzc2lvbiB9IGZyb20gJy4uL2V4cHJlc3Npb24nO1xuaW1wb3J0IHR5cGUgUGFyc2luZ0NvbnRleHQgZnJvbSAnLi4vcGFyc2luZ19jb250ZXh0JztcbmltcG9ydCB0eXBlIEV2YWx1YXRpb25Db250ZXh0ICBmcm9tICcuLi9ldmFsdWF0aW9uX2NvbnRleHQnO1xuXG5jbGFzcyBMZXQgaW1wbGVtZW50cyBFeHByZXNzaW9uIHtcbiAgICB0eXBlOiBUeXBlO1xuICAgIGJpbmRpbmdzOiBBcnJheTxbc3RyaW5nLCBFeHByZXNzaW9uXT47XG4gICAgcmVzdWx0OiBFeHByZXNzaW9uO1xuXG4gICAgY29uc3RydWN0b3IoYmluZGluZ3M6IEFycmF5PFtzdHJpbmcsIEV4cHJlc3Npb25dPiwgcmVzdWx0OiBFeHByZXNzaW9uKSB7XG4gICAgICAgIHRoaXMudHlwZSA9IHJlc3VsdC50eXBlO1xuICAgICAgICB0aGlzLmJpbmRpbmdzID0gW10uY29uY2F0KGJpbmRpbmdzKTtcbiAgICAgICAgdGhpcy5yZXN1bHQgPSByZXN1bHQ7XG4gICAgfVxuXG4gICAgZXZhbHVhdGUoY3R4OiBFdmFsdWF0aW9uQ29udGV4dCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXN1bHQuZXZhbHVhdGUoY3R4KTtcbiAgICB9XG5cbiAgICBlYWNoQ2hpbGQoZm46IChFeHByZXNzaW9uKSA9PiB2b2lkKSB7XG4gICAgICAgIGZvciAoY29uc3QgYmluZGluZyBvZiB0aGlzLmJpbmRpbmdzKSB7XG4gICAgICAgICAgICBmbihiaW5kaW5nWzFdKTtcbiAgICAgICAgfVxuICAgICAgICBmbih0aGlzLnJlc3VsdCk7XG4gICAgfVxuXG4gICAgc3RhdGljIHBhcnNlKGFyZ3M6IEFycmF5PG1peGVkPiwgY29udGV4dDogUGFyc2luZ0NvbnRleHQpIHtcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoIDwgNClcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBFeHBlY3RlZCBhdCBsZWFzdCAzIGFyZ3VtZW50cywgYnV0IGZvdW5kICR7YXJncy5sZW5ndGggLSAxfSBpbnN0ZWFkLmApO1xuXG4gICAgICAgIGNvbnN0IGJpbmRpbmdzOiBBcnJheTxbc3RyaW5nLCBFeHByZXNzaW9uXT4gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBhcmdzLmxlbmd0aCAtIDE7IGkgKz0gMikge1xuICAgICAgICAgICAgY29uc3QgbmFtZSA9IGFyZ3NbaV07XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgRXhwZWN0ZWQgc3RyaW5nLCBidXQgZm91bmQgJHt0eXBlb2YgbmFtZX0gaW5zdGVhZC5gLCBpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKC9bXmEtekEtWjAtOV9dLy50ZXN0KG5hbWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYFZhcmlhYmxlIG5hbWVzIG11c3QgY29udGFpbiBvbmx5IGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIG9yICdfJy5gLCBpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBjb250ZXh0LnBhcnNlKGFyZ3NbaSArIDFdLCBpICsgMSk7XG4gICAgICAgICAgICBpZiAoIXZhbHVlKSByZXR1cm4gbnVsbDtcblxuICAgICAgICAgICAgYmluZGluZ3MucHVzaChbbmFtZSwgdmFsdWVdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbnRleHQucGFyc2UoYXJnc1thcmdzLmxlbmd0aCAtIDFdLCBhcmdzLmxlbmd0aCAtIDEsIGNvbnRleHQuZXhwZWN0ZWRUeXBlLCBiaW5kaW5ncyk7XG4gICAgICAgIGlmICghcmVzdWx0KSByZXR1cm4gbnVsbDtcblxuICAgICAgICByZXR1cm4gbmV3IExldChiaW5kaW5ncywgcmVzdWx0KTtcbiAgICB9XG5cbiAgICBwb3NzaWJsZU91dHB1dHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlc3VsdC5wb3NzaWJsZU91dHB1dHMoKTtcbiAgICB9XG5cbiAgICBzZXJpYWxpemUoKSB7XG4gICAgICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSBbXCJsZXRcIl07XG4gICAgICAgIGZvciAoY29uc3QgW25hbWUsIGV4cHJdIG9mIHRoaXMuYmluZGluZ3MpIHtcbiAgICAgICAgICAgIHNlcmlhbGl6ZWQucHVzaChuYW1lLCBleHByLnNlcmlhbGl6ZSgpKTtcbiAgICAgICAgfVxuICAgICAgICBzZXJpYWxpemVkLnB1c2godGhpcy5yZXN1bHQuc2VyaWFsaXplKCkpO1xuICAgICAgICByZXR1cm4gc2VyaWFsaXplZDtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IExldDtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7IGFycmF5LCBWYWx1ZVR5cGUsIE51bWJlclR5cGUgfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCBSdW50aW1lRXJyb3IgZnJvbSAnLi4vcnVudGltZV9lcnJvcic7XG5cbmltcG9ydCB0eXBlIHsgRXhwcmVzc2lvbiB9IGZyb20gJy4uL2V4cHJlc3Npb24nO1xuaW1wb3J0IHR5cGUgUGFyc2luZ0NvbnRleHQgZnJvbSAnLi4vcGFyc2luZ19jb250ZXh0JztcbmltcG9ydCB0eXBlIEV2YWx1YXRpb25Db250ZXh0IGZyb20gJy4uL2V2YWx1YXRpb25fY29udGV4dCc7XG5pbXBvcnQgdHlwZSB7IFR5cGUsIEFycmF5VHlwZSB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB0eXBlIHsgVmFsdWUgfSBmcm9tICcuLi92YWx1ZXMnO1xuXG5jbGFzcyBBdCBpbXBsZW1lbnRzIEV4cHJlc3Npb24ge1xuICAgIHR5cGU6IFR5cGU7XG4gICAgaW5kZXg6IEV4cHJlc3Npb247XG4gICAgaW5wdXQ6IEV4cHJlc3Npb247XG5cbiAgICBjb25zdHJ1Y3Rvcih0eXBlOiBUeXBlLCBpbmRleDogRXhwcmVzc2lvbiwgaW5wdXQ6IEV4cHJlc3Npb24pIHtcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICAgICAgdGhpcy5pbmRleCA9IGluZGV4O1xuICAgICAgICB0aGlzLmlucHV0ID0gaW5wdXQ7XG4gICAgfVxuXG4gICAgc3RhdGljIHBhcnNlKGFyZ3M6IEFycmF5PG1peGVkPiwgY29udGV4dDogUGFyc2luZ0NvbnRleHQpIHtcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoICE9PSAzKVxuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYEV4cGVjdGVkIDIgYXJndW1lbnRzLCBidXQgZm91bmQgJHthcmdzLmxlbmd0aCAtIDF9IGluc3RlYWQuYCk7XG5cbiAgICAgICAgY29uc3QgaW5kZXggPSBjb250ZXh0LnBhcnNlKGFyZ3NbMV0sIDEsIE51bWJlclR5cGUpO1xuICAgICAgICBjb25zdCBpbnB1dCA9IGNvbnRleHQucGFyc2UoYXJnc1syXSwgMiwgYXJyYXkoY29udGV4dC5leHBlY3RlZFR5cGUgfHwgVmFsdWVUeXBlKSk7XG5cbiAgICAgICAgaWYgKCFpbmRleCB8fCAhaW5wdXQpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IHQ6IEFycmF5VHlwZSA9IChpbnB1dC50eXBlOiBhbnkpO1xuICAgICAgICByZXR1cm4gbmV3IEF0KHQuaXRlbVR5cGUsIGluZGV4LCBpbnB1dCk7XG4gICAgfVxuXG4gICAgZXZhbHVhdGUoY3R4OiBFdmFsdWF0aW9uQ29udGV4dCkge1xuICAgICAgICBjb25zdCBpbmRleCA9ICgodGhpcy5pbmRleC5ldmFsdWF0ZShjdHgpOiBhbnkpOiBudW1iZXIpO1xuICAgICAgICBjb25zdCBhcnJheSA9ICgodGhpcy5pbnB1dC5ldmFsdWF0ZShjdHgpOiBhbnkpOiBBcnJheTxWYWx1ZT4pO1xuXG4gICAgICAgIGlmIChpbmRleCA8IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXJyb3IoYEFycmF5IGluZGV4IG91dCBvZiBib3VuZHM6ICR7aW5kZXh9IDwgMC5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpbmRleCA+PSBhcnJheS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXJyb3IoYEFycmF5IGluZGV4IG91dCBvZiBib3VuZHM6ICR7aW5kZXh9ID4gJHthcnJheS5sZW5ndGggLSAxfS5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpbmRleCAhPT0gTWF0aC5mbG9vcihpbmRleCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXJyb3IoYEFycmF5IGluZGV4IG11c3QgYmUgYW4gaW50ZWdlciwgYnV0IGZvdW5kICR7aW5kZXh9IGluc3RlYWQuYCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXJyYXlbaW5kZXhdO1xuICAgIH1cblxuICAgIGVhY2hDaGlsZChmbjogKEV4cHJlc3Npb24pID0+IHZvaWQpIHtcbiAgICAgICAgZm4odGhpcy5pbmRleCk7XG4gICAgICAgIGZuKHRoaXMuaW5wdXQpO1xuICAgIH1cblxuICAgIHBvc3NpYmxlT3V0cHV0cygpIHtcbiAgICAgICAgcmV0dXJuIFt1bmRlZmluZWRdO1xuICAgIH1cblxuICAgIHNlcmlhbGl6ZSgpIHtcbiAgICAgICAgcmV0dXJuIFtcImF0XCIsIHRoaXMuaW5kZXguc2VyaWFsaXplKCksIHRoaXMuaW5wdXQuc2VyaWFsaXplKCldO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQXQ7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5cbmltcG9ydCB7IHR5cGVPZiB9IGZyb20gJy4uL3ZhbHVlcyc7XG5pbXBvcnQgeyBWYWx1ZVR5cGUsIHR5cGUgVHlwZSB9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHR5cGUgeyBFeHByZXNzaW9uIH0gZnJvbSAnLi4vZXhwcmVzc2lvbic7XG5pbXBvcnQgdHlwZSBQYXJzaW5nQ29udGV4dCBmcm9tICcuLi9wYXJzaW5nX2NvbnRleHQnO1xuaW1wb3J0IHR5cGUgRXZhbHVhdGlvbkNvbnRleHQgZnJvbSAnLi4vZXZhbHVhdGlvbl9jb250ZXh0JztcbmltcG9ydCB0eXBlIHsgVmFsdWUgfSBmcm9tICcuLi92YWx1ZXMnO1xuXG4vLyBNYXAgaW5wdXQgbGFiZWwgdmFsdWVzIHRvIG91dHB1dCBleHByZXNzaW9uIGluZGV4XG50eXBlIENhc2VzID0ge1tudW1iZXIgfCBzdHJpbmddOiBudW1iZXJ9O1xuXG5jbGFzcyBNYXRjaCBpbXBsZW1lbnRzIEV4cHJlc3Npb24ge1xuICAgIHR5cGU6IFR5cGU7XG4gICAgaW5wdXRUeXBlOiBUeXBlO1xuXG4gICAgaW5wdXQ6IEV4cHJlc3Npb247XG4gICAgY2FzZXM6IENhc2VzO1xuICAgIG91dHB1dHM6IEFycmF5PEV4cHJlc3Npb24+O1xuICAgIG90aGVyd2lzZTogRXhwcmVzc2lvbjtcblxuICAgIGNvbnN0cnVjdG9yKGlucHV0VHlwZTogVHlwZSwgb3V0cHV0VHlwZTogVHlwZSwgaW5wdXQ6IEV4cHJlc3Npb24sIGNhc2VzOiBDYXNlcywgb3V0cHV0czogQXJyYXk8RXhwcmVzc2lvbj4sIG90aGVyd2lzZTogRXhwcmVzc2lvbikge1xuICAgICAgICB0aGlzLmlucHV0VHlwZSA9IGlucHV0VHlwZTtcbiAgICAgICAgdGhpcy50eXBlID0gb3V0cHV0VHlwZTtcbiAgICAgICAgdGhpcy5pbnB1dCA9IGlucHV0O1xuICAgICAgICB0aGlzLmNhc2VzID0gY2FzZXM7XG4gICAgICAgIHRoaXMub3V0cHV0cyA9IG91dHB1dHM7XG4gICAgICAgIHRoaXMub3RoZXJ3aXNlID0gb3RoZXJ3aXNlO1xuICAgIH1cblxuICAgIHN0YXRpYyBwYXJzZShhcmdzOiBBcnJheTxtaXhlZD4sIGNvbnRleHQ6IFBhcnNpbmdDb250ZXh0KSB7XG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCA8IDUpXG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgRXhwZWN0ZWQgYXQgbGVhc3QgNCBhcmd1bWVudHMsIGJ1dCBmb3VuZCBvbmx5ICR7YXJncy5sZW5ndGggLSAxfS5gKTtcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoICUgMiAhPT0gMSlcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBFeHBlY3RlZCBhbiBldmVuIG51bWJlciBvZiBhcmd1bWVudHMuYCk7XG5cbiAgICAgICAgbGV0IGlucHV0VHlwZTtcbiAgICAgICAgbGV0IG91dHB1dFR5cGU7XG4gICAgICAgIGlmIChjb250ZXh0LmV4cGVjdGVkVHlwZSAmJiBjb250ZXh0LmV4cGVjdGVkVHlwZS5raW5kICE9PSAndmFsdWUnKSB7XG4gICAgICAgICAgICBvdXRwdXRUeXBlID0gY29udGV4dC5leHBlY3RlZFR5cGU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2FzZXMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3V0cHV0cyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMjsgaSA8IGFyZ3MubGVuZ3RoIC0gMTsgaSArPSAyKSB7XG4gICAgICAgICAgICBsZXQgbGFiZWxzID0gYXJnc1tpXTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gYXJnc1tpICsgMV07XG5cbiAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShsYWJlbHMpKSB7XG4gICAgICAgICAgICAgICAgbGFiZWxzID0gW2xhYmVsc107XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxhYmVsQ29udGV4dCA9IGNvbnRleHQuY29uY2F0KGkpO1xuICAgICAgICAgICAgaWYgKGxhYmVscy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbGFiZWxDb250ZXh0LmVycm9yKCdFeHBlY3RlZCBhdCBsZWFzdCBvbmUgYnJhbmNoIGxhYmVsLicpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGxhYmVsIG9mIGxhYmVscykge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgbGFiZWwgIT09ICdudW1iZXInICYmIHR5cGVvZiBsYWJlbCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxhYmVsQ29udGV4dC5lcnJvcihgQnJhbmNoIGxhYmVscyBtdXN0IGJlIG51bWJlcnMgb3Igc3RyaW5ncy5gKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBsYWJlbCA9PT0gJ251bWJlcicgJiYgTWF0aC5hYnMobGFiZWwpID4gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxhYmVsQ29udGV4dC5lcnJvcihgQnJhbmNoIGxhYmVscyBtdXN0IGJlIGludGVnZXJzIG5vIGxhcmdlciB0aGFuICR7TnVtYmVyLk1BWF9TQUZFX0lOVEVHRVJ9LmApO1xuXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgbGFiZWwgPT09ICdudW1iZXInICYmIE1hdGguZmxvb3IobGFiZWwpICE9PSBsYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGFiZWxDb250ZXh0LmVycm9yKGBOdW1lcmljIGJyYW5jaCBsYWJlbHMgbXVzdCBiZSBpbnRlZ2VyIHZhbHVlcy5gKTtcblxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWlucHV0VHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBpbnB1dFR5cGUgPSB0eXBlT2YobGFiZWwpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobGFiZWxDb250ZXh0LmNoZWNrU3VidHlwZShpbnB1dFR5cGUsIHR5cGVPZihsYWJlbCkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY2FzZXNbU3RyaW5nKGxhYmVsKV0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBsYWJlbENvbnRleHQuZXJyb3IoJ0JyYW5jaCBsYWJlbHMgbXVzdCBiZSB1bmlxdWUuJyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY2FzZXNbU3RyaW5nKGxhYmVsKV0gPSBvdXRwdXRzLmxlbmd0aDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gY29udGV4dC5wYXJzZSh2YWx1ZSwgaSwgb3V0cHV0VHlwZSk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBvdXRwdXRUeXBlID0gb3V0cHV0VHlwZSB8fCByZXN1bHQudHlwZTtcbiAgICAgICAgICAgIG91dHB1dHMucHVzaChyZXN1bHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaW5wdXQgPSBjb250ZXh0LnBhcnNlKGFyZ3NbMV0sIDEsIFZhbHVlVHlwZSk7XG4gICAgICAgIGlmICghaW5wdXQpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IG90aGVyd2lzZSA9IGNvbnRleHQucGFyc2UoYXJnc1thcmdzLmxlbmd0aCAtIDFdLCBhcmdzLmxlbmd0aCAtIDEsIG91dHB1dFR5cGUpO1xuICAgICAgICBpZiAoIW90aGVyd2lzZSkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgYXNzZXJ0KGlucHV0VHlwZSAmJiBvdXRwdXRUeXBlKTtcblxuICAgICAgICBpZiAoaW5wdXQudHlwZS5raW5kICE9PSAndmFsdWUnICYmIGNvbnRleHQuY29uY2F0KDEpLmNoZWNrU3VidHlwZSgoaW5wdXRUeXBlOiBhbnkpLCBpbnB1dC50eXBlKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IE1hdGNoKChpbnB1dFR5cGU6IGFueSksIChvdXRwdXRUeXBlOiBhbnkpLCBpbnB1dCwgY2FzZXMsIG91dHB1dHMsIG90aGVyd2lzZSk7XG4gICAgfVxuXG4gICAgZXZhbHVhdGUoY3R4OiBFdmFsdWF0aW9uQ29udGV4dCkge1xuICAgICAgICBjb25zdCBpbnB1dCA9ICh0aGlzLmlucHV0LmV2YWx1YXRlKGN0eCk6IGFueSk7XG4gICAgICAgIGNvbnN0IG91dHB1dCA9ICh0eXBlT2YoaW5wdXQpID09PSB0aGlzLmlucHV0VHlwZSAmJiB0aGlzLm91dHB1dHNbdGhpcy5jYXNlc1tpbnB1dF1dKSB8fCB0aGlzLm90aGVyd2lzZTtcbiAgICAgICAgcmV0dXJuIG91dHB1dC5ldmFsdWF0ZShjdHgpO1xuICAgIH1cblxuICAgIGVhY2hDaGlsZChmbjogKEV4cHJlc3Npb24pID0+IHZvaWQpIHtcbiAgICAgICAgZm4odGhpcy5pbnB1dCk7XG4gICAgICAgIHRoaXMub3V0cHV0cy5mb3JFYWNoKGZuKTtcbiAgICAgICAgZm4odGhpcy5vdGhlcndpc2UpO1xuICAgIH1cblxuICAgIHBvc3NpYmxlT3V0cHV0cygpOiBBcnJheTxWYWx1ZSB8IHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIFtdXG4gICAgICAgICAgICAuY29uY2F0KC4uLnRoaXMub3V0cHV0cy5tYXAoKG91dCkgPT4gb3V0LnBvc3NpYmxlT3V0cHV0cygpKSlcbiAgICAgICAgICAgIC5jb25jYXQodGhpcy5vdGhlcndpc2UucG9zc2libGVPdXRwdXRzKCkpO1xuICAgIH1cblxuICAgIHNlcmlhbGl6ZSgpOiBBcnJheTxtaXhlZD4ge1xuICAgICAgICBjb25zdCBzZXJpYWxpemVkID0gW1wibWF0Y2hcIiwgdGhpcy5pbnB1dC5zZXJpYWxpemUoKV07XG5cbiAgICAgICAgLy8gU29ydCBzbyBzZXJpYWxpemF0aW9uIGhhcyBhbiBhcmJpdHJhcnkgZGVmaW5lZCBvcmRlciwgZXZlbiB0aG91Z2hcbiAgICAgICAgLy8gYnJhbmNoIG9yZGVyIGRvZXNuJ3QgYWZmZWN0IGV2YWx1YXRpb25cbiAgICAgICAgY29uc3Qgc29ydGVkTGFiZWxzID0gT2JqZWN0LmtleXModGhpcy5jYXNlcykuc29ydCgpO1xuXG4gICAgICAgIC8vIEdyb3VwIGJyYW5jaGVzIGJ5IHVuaXF1ZSBtYXRjaCBleHByZXNzaW9uIHRvIHN1cHBvcnQgY29uZGVuc2VkXG4gICAgICAgIC8vIHNlcmlhbGl6YXRpb25zIG9mIHRoZSBmb3JtIFtjYXNlMSwgY2FzZTIsIC4uLl0gLT4gbWF0Y2hFeHByZXNzaW9uXG4gICAgICAgIGNvbnN0IGdyb3VwZWRCeU91dHB1dDogQXJyYXk8W251bWJlciwgQXJyYXk8bnVtYmVyIHwgc3RyaW5nPl0+ID0gW107XG4gICAgICAgIGNvbnN0IG91dHB1dExvb2t1cDoge1tpbmRleDogbnVtYmVyXTogbnVtYmVyfSA9IHt9OyAvLyBsb29rdXAgaW5kZXggaW50byBncm91cGVkQnlPdXRwdXQgZm9yIGEgZ2l2ZW4gb3V0cHV0IGV4cHJlc3Npb25cbiAgICAgICAgZm9yIChjb25zdCBsYWJlbCBvZiBzb3J0ZWRMYWJlbHMpIHtcbiAgICAgICAgICAgIGNvbnN0IG91dHB1dEluZGV4ID0gb3V0cHV0TG9va3VwW3RoaXMuY2FzZXNbbGFiZWxdXTtcbiAgICAgICAgICAgIGlmIChvdXRwdXRJbmRleCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgLy8gRmlyc3QgdGltZSBzZWVpbmcgdGhpcyBvdXRwdXQsIGFkZCBpdCB0byB0aGUgZW5kIG9mIHRoZSBncm91cGVkIGxpc3RcbiAgICAgICAgICAgICAgICBvdXRwdXRMb29rdXBbdGhpcy5jYXNlc1tsYWJlbF1dID0gZ3JvdXBlZEJ5T3V0cHV0Lmxlbmd0aDtcbiAgICAgICAgICAgICAgICBncm91cGVkQnlPdXRwdXQucHVzaChbdGhpcy5jYXNlc1tsYWJlbF0sIFtsYWJlbF1dKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gV2UndmUgc2VlbiB0aGlzIGV4cHJlc3Npb24gYmVmb3JlLCBhZGQgdGhlIGxhYmVsIHRvIHRoYXQgb3V0cHV0J3MgZ3JvdXBcbiAgICAgICAgICAgICAgICBncm91cGVkQnlPdXRwdXRbb3V0cHV0SW5kZXhdWzFdLnB1c2gobGFiZWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29lcmNlTGFiZWwgPSAobGFiZWwpID0+IHRoaXMuaW5wdXRUeXBlLmtpbmQgPT09ICdudW1iZXInID8gTnVtYmVyKGxhYmVsKSA6IGxhYmVsO1xuXG4gICAgICAgIGZvciAoY29uc3QgW291dHB1dEluZGV4LCBsYWJlbHNdIG9mIGdyb3VwZWRCeU91dHB1dCkge1xuICAgICAgICAgICAgaWYgKGxhYmVscy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICAvLyBPbmx5IGEgc2luZ2xlIGxhYmVsIG1hdGNoZXMgdGhpcyBvdXRwdXQgZXhwcmVzc2lvblxuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWQucHVzaChjb2VyY2VMYWJlbChsYWJlbHNbMF0pKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gQXJyYXkgb2YgbGl0ZXJhbCBsYWJlbHMgcG9pbnRpbmcgdG8gdGhpcyBvdXRwdXQgZXhwcmVzc2lvblxuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWQucHVzaChsYWJlbHMubWFwKGNvZXJjZUxhYmVsKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZXJpYWxpemVkLnB1c2godGhpcy5vdXRwdXRzW291dHB1dEluZGV4XS5zZXJpYWxpemUoKSk7XG4gICAgICAgIH1cbiAgICAgICAgc2VyaWFsaXplZC5wdXNoKHRoaXMub3RoZXJ3aXNlLnNlcmlhbGl6ZSgpKTtcbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZWQ7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBNYXRjaDtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcblxuaW1wb3J0IHsgQm9vbGVhblR5cGUgfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB0eXBlIHsgRXhwcmVzc2lvbiB9IGZyb20gJy4uL2V4cHJlc3Npb24nO1xuaW1wb3J0IHR5cGUgUGFyc2luZ0NvbnRleHQgZnJvbSAnLi4vcGFyc2luZ19jb250ZXh0JztcbmltcG9ydCB0eXBlIEV2YWx1YXRpb25Db250ZXh0IGZyb20gJy4uL2V2YWx1YXRpb25fY29udGV4dCc7XG5pbXBvcnQgdHlwZSB7IFZhbHVlIH0gZnJvbSAnLi4vdmFsdWVzJztcbmltcG9ydCB0eXBlIHsgVHlwZSB9IGZyb20gJy4uL3R5cGVzJztcblxudHlwZSBCcmFuY2hlcyA9IEFycmF5PFtFeHByZXNzaW9uLCBFeHByZXNzaW9uXT47XG5cbmNsYXNzIENhc2UgaW1wbGVtZW50cyBFeHByZXNzaW9uIHtcbiAgICB0eXBlOiBUeXBlO1xuXG4gICAgYnJhbmNoZXM6IEJyYW5jaGVzO1xuICAgIG90aGVyd2lzZTogRXhwcmVzc2lvbjtcblxuICAgIGNvbnN0cnVjdG9yKHR5cGU6IFR5cGUsIGJyYW5jaGVzOiBCcmFuY2hlcywgb3RoZXJ3aXNlOiBFeHByZXNzaW9uKSB7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgIHRoaXMuYnJhbmNoZXMgPSBicmFuY2hlcztcbiAgICAgICAgdGhpcy5vdGhlcndpc2UgPSBvdGhlcndpc2U7XG4gICAgfVxuXG4gICAgc3RhdGljIHBhcnNlKGFyZ3M6IEFycmF5PG1peGVkPiwgY29udGV4dDogUGFyc2luZ0NvbnRleHQpIHtcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoIDwgNClcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBFeHBlY3RlZCBhdCBsZWFzdCAzIGFyZ3VtZW50cywgYnV0IGZvdW5kIG9ubHkgJHthcmdzLmxlbmd0aCAtIDF9LmApO1xuICAgICAgICBpZiAoYXJncy5sZW5ndGggJSAyICE9PSAwKVxuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYEV4cGVjdGVkIGFuIG9kZCBudW1iZXIgb2YgYXJndW1lbnRzLmApO1xuXG4gICAgICAgIGxldCBvdXRwdXRUeXBlOiA/VHlwZTtcbiAgICAgICAgaWYgKGNvbnRleHQuZXhwZWN0ZWRUeXBlICYmIGNvbnRleHQuZXhwZWN0ZWRUeXBlLmtpbmQgIT09ICd2YWx1ZScpIHtcbiAgICAgICAgICAgIG91dHB1dFR5cGUgPSBjb250ZXh0LmV4cGVjdGVkVHlwZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGJyYW5jaGVzID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgYXJncy5sZW5ndGggLSAxOyBpICs9IDIpIHtcbiAgICAgICAgICAgIGNvbnN0IHRlc3QgPSBjb250ZXh0LnBhcnNlKGFyZ3NbaV0sIGksIEJvb2xlYW5UeXBlKTtcbiAgICAgICAgICAgIGlmICghdGVzdCkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbnRleHQucGFyc2UoYXJnc1tpICsgMV0sIGkgKyAxLCBvdXRwdXRUeXBlKTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KSByZXR1cm4gbnVsbDtcblxuICAgICAgICAgICAgYnJhbmNoZXMucHVzaChbdGVzdCwgcmVzdWx0XSk7XG5cbiAgICAgICAgICAgIG91dHB1dFR5cGUgPSBvdXRwdXRUeXBlIHx8IHJlc3VsdC50eXBlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgb3RoZXJ3aXNlID0gY29udGV4dC5wYXJzZShhcmdzW2FyZ3MubGVuZ3RoIC0gMV0sIGFyZ3MubGVuZ3RoIC0gMSwgb3V0cHV0VHlwZSk7XG4gICAgICAgIGlmICghb3RoZXJ3aXNlKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBhc3NlcnQob3V0cHV0VHlwZSk7XG4gICAgICAgIHJldHVybiBuZXcgQ2FzZSgob3V0cHV0VHlwZTogYW55KSwgYnJhbmNoZXMsIG90aGVyd2lzZSk7XG4gICAgfVxuXG4gICAgZXZhbHVhdGUoY3R4OiBFdmFsdWF0aW9uQ29udGV4dCkge1xuICAgICAgICBmb3IgKGNvbnN0IFt0ZXN0LCBleHByZXNzaW9uXSBvZiB0aGlzLmJyYW5jaGVzKSB7XG4gICAgICAgICAgICBpZiAodGVzdC5ldmFsdWF0ZShjdHgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGV4cHJlc3Npb24uZXZhbHVhdGUoY3R4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5vdGhlcndpc2UuZXZhbHVhdGUoY3R4KTtcbiAgICB9XG5cbiAgICBlYWNoQ2hpbGQoZm46IChFeHByZXNzaW9uKSA9PiB2b2lkKSB7XG4gICAgICAgIGZvciAoY29uc3QgW3Rlc3QsIGV4cHJlc3Npb25dIG9mIHRoaXMuYnJhbmNoZXMpIHtcbiAgICAgICAgICAgIGZuKHRlc3QpO1xuICAgICAgICAgICAgZm4oZXhwcmVzc2lvbik7XG4gICAgICAgIH1cbiAgICAgICAgZm4odGhpcy5vdGhlcndpc2UpO1xuICAgIH1cblxuICAgIHBvc3NpYmxlT3V0cHV0cygpOiBBcnJheTxWYWx1ZSB8IHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIFtdXG4gICAgICAgICAgICAuY29uY2F0KC4uLnRoaXMuYnJhbmNoZXMubWFwKChbXywgb3V0XSkgPT4gb3V0LnBvc3NpYmxlT3V0cHV0cygpKSlcbiAgICAgICAgICAgIC5jb25jYXQodGhpcy5vdGhlcndpc2UucG9zc2libGVPdXRwdXRzKCkpO1xuICAgIH1cblxuICAgIHNlcmlhbGl6ZSgpIHtcbiAgICAgICAgY29uc3Qgc2VyaWFsaXplZCA9IFtcImNhc2VcIl07XG4gICAgICAgIHRoaXMuZWFjaENoaWxkKGNoaWxkID0+IHsgc2VyaWFsaXplZC5wdXNoKGNoaWxkLnNlcmlhbGl6ZSgpKTsgfSk7XG4gICAgICAgIHJldHVybiBzZXJpYWxpemVkO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQ2FzZTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7IHRvU3RyaW5nLCBWYWx1ZVR5cGUsIEJvb2xlYW5UeXBlLCBDb2xsYXRvclR5cGUgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgQXNzZXJ0aW9uIGZyb20gJy4vYXNzZXJ0aW9uJztcbmltcG9ydCB7IHR5cGVPZiB9IGZyb20gJy4uL3ZhbHVlcyc7XG5pbXBvcnQgUnVudGltZUVycm9yIGZyb20gJy4uL3J1bnRpbWVfZXJyb3InO1xuXG5pbXBvcnQgdHlwZSB7IEV4cHJlc3Npb24gfSBmcm9tICcuLi9leHByZXNzaW9uJztcbmltcG9ydCB0eXBlIEV2YWx1YXRpb25Db250ZXh0IGZyb20gJy4uL2V2YWx1YXRpb25fY29udGV4dCc7XG5pbXBvcnQgdHlwZSBQYXJzaW5nQ29udGV4dCBmcm9tICcuLi9wYXJzaW5nX2NvbnRleHQnO1xuaW1wb3J0IHR5cGUgeyBUeXBlIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG50eXBlIENvbXBhcmlzb25PcGVyYXRvciA9ICc9PScgfCAnIT0nIHwgJzwnIHwgJz4nIHwgJzw9JyB8ICc+PScgO1xuXG5mdW5jdGlvbiBpc0NvbXBhcmFibGVUeXBlKG9wOiBDb21wYXJpc29uT3BlcmF0b3IsIHR5cGU6IFR5cGUpIHtcbiAgICBpZiAob3AgPT09ICc9PScgfHwgb3AgPT09ICchPScpIHtcbiAgICAgICAgLy8gZXF1YWxpdHkgb3BlcmF0b3JcbiAgICAgICAgcmV0dXJuIHR5cGUua2luZCA9PT0gJ2Jvb2xlYW4nIHx8XG4gICAgICAgICAgICB0eXBlLmtpbmQgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgICB0eXBlLmtpbmQgPT09ICdudW1iZXInIHx8XG4gICAgICAgICAgICB0eXBlLmtpbmQgPT09ICdudWxsJyB8fFxuICAgICAgICAgICAgdHlwZS5raW5kID09PSAndmFsdWUnO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIG9yZGVyaW5nIG9wZXJhdG9yXG4gICAgICAgIHJldHVybiB0eXBlLmtpbmQgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgICB0eXBlLmtpbmQgPT09ICdudW1iZXInIHx8XG4gICAgICAgICAgICB0eXBlLmtpbmQgPT09ICd2YWx1ZSc7XG4gICAgfVxufVxuXG5cbmZ1bmN0aW9uIGVxKGN0eCwgYSwgYikgeyByZXR1cm4gYSA9PT0gYjsgfVxuZnVuY3Rpb24gbmVxKGN0eCwgYSwgYikgeyByZXR1cm4gYSAhPT0gYjsgfVxuZnVuY3Rpb24gbHQoY3R4LCBhLCBiKSB7IHJldHVybiBhIDwgYjsgfVxuZnVuY3Rpb24gZ3QoY3R4LCBhLCBiKSB7IHJldHVybiBhID4gYjsgfVxuZnVuY3Rpb24gbHRlcShjdHgsIGEsIGIpIHsgcmV0dXJuIGEgPD0gYjsgfVxuZnVuY3Rpb24gZ3RlcShjdHgsIGEsIGIpIHsgcmV0dXJuIGEgPj0gYjsgfVxuXG5mdW5jdGlvbiBlcUNvbGxhdGUoY3R4LCBhLCBiLCBjKSB7IHJldHVybiBjLmNvbXBhcmUoYSwgYikgPT09IDA7IH1cbmZ1bmN0aW9uIG5lcUNvbGxhdGUoY3R4LCBhLCBiLCBjKSB7IHJldHVybiAhZXFDb2xsYXRlKGN0eCwgYSwgYiwgYyk7IH1cbmZ1bmN0aW9uIGx0Q29sbGF0ZShjdHgsIGEsIGIsIGMpIHsgcmV0dXJuIGMuY29tcGFyZShhLCBiKSA8IDA7IH1cbmZ1bmN0aW9uIGd0Q29sbGF0ZShjdHgsIGEsIGIsIGMpIHsgcmV0dXJuIGMuY29tcGFyZShhLCBiKSA+IDA7IH1cbmZ1bmN0aW9uIGx0ZXFDb2xsYXRlKGN0eCwgYSwgYiwgYykgeyByZXR1cm4gYy5jb21wYXJlKGEsIGIpIDw9IDA7IH1cbmZ1bmN0aW9uIGd0ZXFDb2xsYXRlKGN0eCwgYSwgYiwgYykgeyByZXR1cm4gYy5jb21wYXJlKGEsIGIpID49IDA7IH1cblxuLyoqXG4gKiBTcGVjaWFsIGZvcm0gZm9yIGNvbXBhcmlzb24gb3BlcmF0b3JzLCBpbXBsZW1lbnRpbmcgdGhlIHNpZ25hdHVyZXM6XG4gKiAtIChULCBULCA/Q29sbGF0b3IpID0+IGJvb2xlYW5cbiAqIC0gKFQsIHZhbHVlLCA/Q29sbGF0b3IpID0+IGJvb2xlYW5cbiAqIC0gKHZhbHVlLCBULCA/Q29sbGF0b3IpID0+IGJvb2xlYW5cbiAqXG4gKiBGb3IgaW5lcXVhbGl0aWVzLCBUIG11c3QgYmUgZWl0aGVyIHZhbHVlLCBzdHJpbmcsIG9yIG51bWJlci4gRm9yID09LyE9LCBpdFxuICogY2FuIGFsc28gYmUgYm9vbGVhbiBvciBudWxsLlxuICpcbiAqIEVxdWFsaXR5IHNlbWFudGljcyBhcmUgZXF1aXZhbGVudCB0byBKYXZhc2NyaXB0J3Mgc3RyaWN0IGVxdWFsaXR5ICg9PT0vIT09KVxuICogLS0gaS5lLiwgd2hlbiB0aGUgYXJndW1lbnRzJyB0eXBlcyBkb24ndCBtYXRjaCwgPT0gZXZhbHVhdGVzIHRvIGZhbHNlLCAhPSB0b1xuICogdHJ1ZS5cbiAqXG4gKiBXaGVuIHR5cGVzIGRvbid0IG1hdGNoIGluIGFuIG9yZGVyaW5nIGNvbXBhcmlzb24sIGEgcnVudGltZSBlcnJvciBpcyB0aHJvd24uXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gbWFrZUNvbXBhcmlzb24ob3A6IENvbXBhcmlzb25PcGVyYXRvciwgY29tcGFyZUJhc2ljLCBjb21wYXJlV2l0aENvbGxhdG9yKSB7XG4gICAgY29uc3QgaXNPcmRlckNvbXBhcmlzb24gPSBvcCAhPT0gJz09JyAmJiBvcCAhPT0gJyE9JztcblxuICAgIHJldHVybiBjbGFzcyBDb21wYXJpc29uIGltcGxlbWVudHMgRXhwcmVzc2lvbiB7XG4gICAgICAgIHR5cGU6IFR5cGU7XG4gICAgICAgIGxoczogRXhwcmVzc2lvbjtcbiAgICAgICAgcmhzOiBFeHByZXNzaW9uO1xuICAgICAgICBjb2xsYXRvcjogP0V4cHJlc3Npb247XG4gICAgICAgIGhhc1VudHlwZWRBcmd1bWVudDogYm9vbGVhbjtcblxuICAgICAgICBjb25zdHJ1Y3RvcihsaHM6IEV4cHJlc3Npb24sIHJoczogRXhwcmVzc2lvbiwgY29sbGF0b3I6ID9FeHByZXNzaW9uKSB7XG4gICAgICAgICAgICB0aGlzLnR5cGUgPSBCb29sZWFuVHlwZTtcbiAgICAgICAgICAgIHRoaXMubGhzID0gbGhzO1xuICAgICAgICAgICAgdGhpcy5yaHMgPSByaHM7XG4gICAgICAgICAgICB0aGlzLmNvbGxhdG9yID0gY29sbGF0b3I7XG4gICAgICAgICAgICB0aGlzLmhhc1VudHlwZWRBcmd1bWVudCA9IGxocy50eXBlLmtpbmQgPT09ICd2YWx1ZScgfHwgcmhzLnR5cGUua2luZCA9PT0gJ3ZhbHVlJztcbiAgICAgICAgfVxuXG4gICAgICAgIHN0YXRpYyBwYXJzZShhcmdzOiBBcnJheTxtaXhlZD4sIGNvbnRleHQ6IFBhcnNpbmdDb250ZXh0KTogP0V4cHJlc3Npb24ge1xuICAgICAgICAgICAgaWYgKGFyZ3MubGVuZ3RoICE9PSAzICYmIGFyZ3MubGVuZ3RoICE9PSA0KVxuICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBFeHBlY3RlZCB0d28gb3IgdGhyZWUgYXJndW1lbnRzLmApO1xuXG4gICAgICAgICAgICBjb25zdCBvcDogQ29tcGFyaXNvbk9wZXJhdG9yID0gKGFyZ3NbMF06IGFueSk7XG5cbiAgICAgICAgICAgIGxldCBsaHMgPSBjb250ZXh0LnBhcnNlKGFyZ3NbMV0sIDEsIFZhbHVlVHlwZSk7XG4gICAgICAgICAgICBpZiAoIWxocykgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBpZiAoIWlzQ29tcGFyYWJsZVR5cGUob3AsIGxocy50eXBlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmNvbmNhdCgxKS5lcnJvcihgXCIke29wfVwiIGNvbXBhcmlzb25zIGFyZSBub3Qgc3VwcG9ydGVkIGZvciB0eXBlICcke3RvU3RyaW5nKGxocy50eXBlKX0nLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHJocyA9IGNvbnRleHQucGFyc2UoYXJnc1syXSwgMiwgVmFsdWVUeXBlKTtcbiAgICAgICAgICAgIGlmICghcmhzKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGlmICghaXNDb21wYXJhYmxlVHlwZShvcCwgcmhzLnR5cGUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuY29uY2F0KDIpLmVycm9yKGBcIiR7b3B9XCIgY29tcGFyaXNvbnMgYXJlIG5vdCBzdXBwb3J0ZWQgZm9yIHR5cGUgJyR7dG9TdHJpbmcocmhzLnR5cGUpfScuYCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBsaHMudHlwZS5raW5kICE9PSByaHMudHlwZS5raW5kICYmXG4gICAgICAgICAgICAgICAgbGhzLnR5cGUua2luZCAhPT0gJ3ZhbHVlJyAmJlxuICAgICAgICAgICAgICAgIHJocy50eXBlLmtpbmQgIT09ICd2YWx1ZSdcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBDYW5ub3QgY29tcGFyZSB0eXBlcyAnJHt0b1N0cmluZyhsaHMudHlwZSl9JyBhbmQgJyR7dG9TdHJpbmcocmhzLnR5cGUpfScuYCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChpc09yZGVyQ29tcGFyaXNvbikge1xuICAgICAgICAgICAgICAgIC8vIHR5cGluZyBydWxlcyBzcGVjaWZpYyB0byBsZXNzL2dyZWF0ZXIgdGhhbiBvcGVyYXRvcnNcbiAgICAgICAgICAgICAgICBpZiAobGhzLnR5cGUua2luZCA9PT0gJ3ZhbHVlJyAmJiByaHMudHlwZS5raW5kICE9PSAndmFsdWUnKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vICh2YWx1ZSwgVClcbiAgICAgICAgICAgICAgICAgICAgbGhzID0gbmV3IEFzc2VydGlvbihyaHMudHlwZSwgW2xoc10pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobGhzLnR5cGUua2luZCAhPT0gJ3ZhbHVlJyAmJiByaHMudHlwZS5raW5kID09PSAndmFsdWUnKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIChULCB2YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgcmhzID0gbmV3IEFzc2VydGlvbihsaHMudHlwZSwgW3Joc10pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IGNvbGxhdG9yID0gbnVsbDtcbiAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gNCkge1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgbGhzLnR5cGUua2luZCAhPT0gJ3N0cmluZycgJiZcbiAgICAgICAgICAgICAgICAgICAgcmhzLnR5cGUua2luZCAhPT0gJ3N0cmluZycgJiZcbiAgICAgICAgICAgICAgICAgICAgbGhzLnR5cGUua2luZCAhPT0gJ3ZhbHVlJyAmJlxuICAgICAgICAgICAgICAgICAgICByaHMudHlwZS5raW5kICE9PSAndmFsdWUnXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBDYW5ub3QgdXNlIGNvbGxhdG9yIHRvIGNvbXBhcmUgbm9uLXN0cmluZyB0eXBlcy5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29sbGF0b3IgPSBjb250ZXh0LnBhcnNlKGFyZ3NbM10sIDMsIENvbGxhdG9yVHlwZSk7XG4gICAgICAgICAgICAgICAgaWYgKCFjb2xsYXRvcikgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGFyaXNvbihsaHMsIHJocywgY29sbGF0b3IpO1xuICAgICAgICB9XG5cbiAgICAgICAgZXZhbHVhdGUoY3R4OiBFdmFsdWF0aW9uQ29udGV4dCkge1xuICAgICAgICAgICAgY29uc3QgbGhzID0gdGhpcy5saHMuZXZhbHVhdGUoY3R4KTtcbiAgICAgICAgICAgIGNvbnN0IHJocyA9IHRoaXMucmhzLmV2YWx1YXRlKGN0eCk7XG5cbiAgICAgICAgICAgIGlmIChpc09yZGVyQ29tcGFyaXNvbiAmJiB0aGlzLmhhc1VudHlwZWRBcmd1bWVudCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGx0ID0gdHlwZU9mKGxocyk7XG4gICAgICAgICAgICAgICAgY29uc3QgcnQgPSB0eXBlT2YocmhzKTtcbiAgICAgICAgICAgICAgICAvLyBjaGVjayB0aGF0IHR5cGUgaXMgc3RyaW5nIG9yIG51bWJlciwgYW5kIGVxdWFsXG4gICAgICAgICAgICAgICAgaWYgKGx0LmtpbmQgIT09IHJ0LmtpbmQgfHwgIShsdC5raW5kID09PSAnc3RyaW5nJyB8fCBsdC5raW5kID09PSAnbnVtYmVyJykpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFcnJvcihgRXhwZWN0ZWQgYXJndW1lbnRzIGZvciBcIiR7b3B9XCIgdG8gYmUgKHN0cmluZywgc3RyaW5nKSBvciAobnVtYmVyLCBudW1iZXIpLCBidXQgZm91bmQgKCR7bHQua2luZH0sICR7cnQua2luZH0pIGluc3RlYWQuYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5jb2xsYXRvciAmJiAhaXNPcmRlckNvbXBhcmlzb24gJiYgdGhpcy5oYXNVbnR5cGVkQXJndW1lbnQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsdCA9IHR5cGVPZihsaHMpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJ0ID0gdHlwZU9mKHJocyk7XG4gICAgICAgICAgICAgICAgaWYgKGx0LmtpbmQgIT09ICdzdHJpbmcnIHx8IHJ0LmtpbmQgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjb21wYXJlQmFzaWMoY3R4LCBsaHMsIHJocyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb2xsYXRvciA/XG4gICAgICAgICAgICAgICAgY29tcGFyZVdpdGhDb2xsYXRvcihjdHgsIGxocywgcmhzLCB0aGlzLmNvbGxhdG9yLmV2YWx1YXRlKGN0eCkpIDpcbiAgICAgICAgICAgICAgICBjb21wYXJlQmFzaWMoY3R4LCBsaHMsIHJocyk7XG4gICAgICAgIH1cblxuICAgICAgICBlYWNoQ2hpbGQoZm46IChFeHByZXNzaW9uKSA9PiB2b2lkKSB7XG4gICAgICAgICAgICBmbih0aGlzLmxocyk7XG4gICAgICAgICAgICBmbih0aGlzLnJocyk7XG4gICAgICAgICAgICBpZiAodGhpcy5jb2xsYXRvcikge1xuICAgICAgICAgICAgICAgIGZuKHRoaXMuY29sbGF0b3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcG9zc2libGVPdXRwdXRzKCkge1xuICAgICAgICAgICAgcmV0dXJuIFt0cnVlLCBmYWxzZV07XG4gICAgICAgIH1cblxuICAgICAgICBzZXJpYWxpemUoKSB7XG4gICAgICAgICAgICBjb25zdCBzZXJpYWxpemVkID0gW29wXTtcbiAgICAgICAgICAgIHRoaXMuZWFjaENoaWxkKGNoaWxkID0+IHsgc2VyaWFsaXplZC5wdXNoKGNoaWxkLnNlcmlhbGl6ZSgpKTsgfSk7XG4gICAgICAgICAgICByZXR1cm4gc2VyaWFsaXplZDtcbiAgICAgICAgfVxuICAgIH07XG59XG5cbmV4cG9ydCBjb25zdCBFcXVhbHMgPSBtYWtlQ29tcGFyaXNvbignPT0nLCBlcSwgZXFDb2xsYXRlKTtcbmV4cG9ydCBjb25zdCBOb3RFcXVhbHMgPSBtYWtlQ29tcGFyaXNvbignIT0nLCBuZXEsIG5lcUNvbGxhdGUpO1xuZXhwb3J0IGNvbnN0IExlc3NUaGFuID0gbWFrZUNvbXBhcmlzb24oJzwnLCBsdCwgbHRDb2xsYXRlKTtcbmV4cG9ydCBjb25zdCBHcmVhdGVyVGhhbiA9IG1ha2VDb21wYXJpc29uKCc+JywgZ3QsIGd0Q29sbGF0ZSk7XG5leHBvcnQgY29uc3QgTGVzc1RoYW5PckVxdWFsID0gbWFrZUNvbXBhcmlzb24oJzw9JywgbHRlcSwgbHRlcUNvbGxhdGUpO1xuZXhwb3J0IGNvbnN0IEdyZWF0ZXJUaGFuT3JFcXVhbCA9IG1ha2VDb21wYXJpc29uKCc+PScsIGd0ZXEsIGd0ZXFDb2xsYXRlKTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7IFN0cmluZ1R5cGUsIE51bWJlclR5cGUgfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB0eXBlIHsgRXhwcmVzc2lvbiB9IGZyb20gJy4uL2V4cHJlc3Npb24nO1xuaW1wb3J0IHR5cGUgRXZhbHVhdGlvbkNvbnRleHQgZnJvbSAnLi4vZXZhbHVhdGlvbl9jb250ZXh0JztcbmltcG9ydCB0eXBlIFBhcnNpbmdDb250ZXh0IGZyb20gJy4uL3BhcnNpbmdfY29udGV4dCc7XG5pbXBvcnQgdHlwZSB7IFR5cGUgfSBmcm9tICcuLi90eXBlcyc7XG5cbmRlY2xhcmUgdmFyIEludGw6IHtcbiAgICBOdW1iZXJGb3JtYXQ6IENsYXNzPEludGwkTnVtYmVyRm9ybWF0PlxufTtcblxuZGVjbGFyZSBjbGFzcyBJbnRsJE51bWJlckZvcm1hdCB7XG4gICAgY29uc3RydWN0b3IgKFxuICAgICAgICBsb2NhbGVzPzogc3RyaW5nIHwgc3RyaW5nW10sXG4gICAgICAgIG9wdGlvbnM/OiBOdW1iZXJGb3JtYXRPcHRpb25zXG4gICAgKTogSW50bCROdW1iZXJGb3JtYXQ7XG5cbiAgICBzdGF0aWMgKFxuICAgICAgICBsb2NhbGVzPzogc3RyaW5nIHwgc3RyaW5nW10sXG4gICAgICAgIG9wdGlvbnM/OiBOdW1iZXJGb3JtYXRPcHRpb25zXG4gICAgKTogSW50bCROdW1iZXJGb3JtYXQ7XG5cbiAgICBmb3JtYXQoYTogbnVtYmVyKTogc3RyaW5nO1xuXG4gICAgcmVzb2x2ZWRPcHRpb25zKCk6IGFueTtcbn1cblxudHlwZSBOdW1iZXJGb3JtYXRPcHRpb25zID0ge1xuICAgIHN0eWxlPzogJ2RlY2ltYWwnIHwgJ2N1cnJlbmN5JyB8ICdwZXJjZW50JztcbiAgICBjdXJyZW5jeT86IG51bGwgfCBzdHJpbmc7XG4gICAgbWluaW11bUZyYWN0aW9uRGlnaXRzPzogbnVsbCB8IHN0cmluZztcbiAgICBtYXhpbXVtRnJhY3Rpb25EaWdpdHM/OiBudWxsIHwgc3RyaW5nO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTnVtYmVyRm9ybWF0IGltcGxlbWVudHMgRXhwcmVzc2lvbiB7XG4gICAgdHlwZTogVHlwZTtcbiAgICBudW1iZXI6IEV4cHJlc3Npb247XG4gICAgbG9jYWxlOiBFeHByZXNzaW9uIHwgbnVsbDsgICAvLyBCQ1AgNDcgbGFuZ3VhZ2UgdGFnXG4gICAgY3VycmVuY3k6IEV4cHJlc3Npb24gfCBudWxsOyAvLyBJU08gNDIxNyBjdXJyZW5jeSBjb2RlLCByZXF1aXJlZCBpZiBzdHlsZT1jdXJyZW5jeVxuICAgIG1pbkZyYWN0aW9uRGlnaXRzOiBFeHByZXNzaW9uIHwgbnVsbDsgLy8gRGVmYXVsdCAwXG4gICAgbWF4RnJhY3Rpb25EaWdpdHM6IEV4cHJlc3Npb24gfCBudWxsOyAvLyBEZWZhdWx0IDNcblxuICAgIGNvbnN0cnVjdG9yKG51bWJlcjogRXhwcmVzc2lvbixcbiAgICAgICAgICAgICAgICBsb2NhbGU6IEV4cHJlc3Npb24gfCBudWxsLFxuICAgICAgICAgICAgICAgIGN1cnJlbmN5OiBFeHByZXNzaW9uIHwgbnVsbCxcbiAgICAgICAgICAgICAgICBtaW5GcmFjdGlvbkRpZ2l0czogRXhwcmVzc2lvbiB8IG51bGwsXG4gICAgICAgICAgICAgICAgbWF4RnJhY3Rpb25EaWdpdHM6IEV4cHJlc3Npb24gfCBudWxsKSB7XG4gICAgICAgIHRoaXMudHlwZSA9IFN0cmluZ1R5cGU7XG4gICAgICAgIHRoaXMubnVtYmVyID0gbnVtYmVyO1xuICAgICAgICB0aGlzLmxvY2FsZSA9IGxvY2FsZTtcbiAgICAgICAgdGhpcy5jdXJyZW5jeSA9IGN1cnJlbmN5O1xuICAgICAgICB0aGlzLm1pbkZyYWN0aW9uRGlnaXRzID0gbWluRnJhY3Rpb25EaWdpdHM7XG4gICAgICAgIHRoaXMubWF4RnJhY3Rpb25EaWdpdHMgPSBtYXhGcmFjdGlvbkRpZ2l0cztcbiAgICB9XG5cbiAgICBzdGF0aWMgcGFyc2UoYXJnczogQXJyYXk8bWl4ZWQ+LCBjb250ZXh0OiBQYXJzaW5nQ29udGV4dCk6ID9FeHByZXNzaW9uIHtcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoICE9PSAzKVxuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYEV4cGVjdGVkIHR3byBhcmd1bWVudHMuYCk7XG5cbiAgICAgICAgY29uc3QgbnVtYmVyID0gY29udGV4dC5wYXJzZShhcmdzWzFdLCAxLCBOdW1iZXJUeXBlKTtcbiAgICAgICAgaWYgKCFudW1iZXIpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSAoYXJnc1syXTogYW55KTtcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkob3B0aW9ucykpXG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgTnVtYmVyRm9ybWF0IG9wdGlvbnMgYXJndW1lbnQgbXVzdCBiZSBhbiBvYmplY3QuYCk7XG5cbiAgICAgICAgbGV0IGxvY2FsZSA9IG51bGw7XG4gICAgICAgIGlmIChvcHRpb25zWydsb2NhbGUnXSkge1xuICAgICAgICAgICAgbG9jYWxlID0gY29udGV4dC5wYXJzZShvcHRpb25zWydsb2NhbGUnXSwgMSwgU3RyaW5nVHlwZSk7XG4gICAgICAgICAgICBpZiAoIWxvY2FsZSkgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgY3VycmVuY3kgPSBudWxsO1xuICAgICAgICBpZiAob3B0aW9uc1snY3VycmVuY3knXSkge1xuICAgICAgICAgICAgY3VycmVuY3kgPSBjb250ZXh0LnBhcnNlKG9wdGlvbnNbJ2N1cnJlbmN5J10sIDEsIFN0cmluZ1R5cGUpO1xuICAgICAgICAgICAgaWYgKCFjdXJyZW5jeSkgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbWluRnJhY3Rpb25EaWdpdHMgPSBudWxsO1xuICAgICAgICBpZiAob3B0aW9uc1snbWluLWZyYWN0aW9uLWRpZ2l0cyddKSB7XG4gICAgICAgICAgICBtaW5GcmFjdGlvbkRpZ2l0cyA9IGNvbnRleHQucGFyc2Uob3B0aW9uc1snbWluLWZyYWN0aW9uLWRpZ2l0cyddLCAxLCBOdW1iZXJUeXBlKTtcbiAgICAgICAgICAgIGlmICghbWluRnJhY3Rpb25EaWdpdHMpIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IG1heEZyYWN0aW9uRGlnaXRzID0gbnVsbDtcbiAgICAgICAgaWYgKG9wdGlvbnNbJ21heC1mcmFjdGlvbi1kaWdpdHMnXSkge1xuICAgICAgICAgICAgbWF4RnJhY3Rpb25EaWdpdHMgPSBjb250ZXh0LnBhcnNlKG9wdGlvbnNbJ21heC1mcmFjdGlvbi1kaWdpdHMnXSwgMSwgTnVtYmVyVHlwZSk7XG4gICAgICAgICAgICBpZiAoIW1heEZyYWN0aW9uRGlnaXRzKSByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgTnVtYmVyRm9ybWF0KG51bWJlciwgbG9jYWxlLCBjdXJyZW5jeSwgbWluRnJhY3Rpb25EaWdpdHMsIG1heEZyYWN0aW9uRGlnaXRzKTtcbiAgICB9XG5cbiAgICBldmFsdWF0ZShjdHg6IEV2YWx1YXRpb25Db250ZXh0KSB7XG4gICAgICAgIHJldHVybiBuZXcgSW50bC5OdW1iZXJGb3JtYXQodGhpcy5sb2NhbGUgPyB0aGlzLmxvY2FsZS5ldmFsdWF0ZShjdHgpIDogW10sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgc3R5bGU6IHRoaXMuY3VycmVuY3kgPyBcImN1cnJlbmN5XCIgOiBcImRlY2ltYWxcIixcbiAgICAgICAgICAgICAgICBjdXJyZW5jeTogdGhpcy5jdXJyZW5jeSA/IHRoaXMuY3VycmVuY3kuZXZhbHVhdGUoY3R4KSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBtaW5pbXVtRnJhY3Rpb25EaWdpdHM6IHRoaXMubWluRnJhY3Rpb25EaWdpdHMgPyB0aGlzLm1pbkZyYWN0aW9uRGlnaXRzLmV2YWx1YXRlKGN0eCkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgbWF4aW11bUZyYWN0aW9uRGlnaXRzOiB0aGlzLm1heEZyYWN0aW9uRGlnaXRzID8gdGhpcy5tYXhGcmFjdGlvbkRpZ2l0cy5ldmFsdWF0ZShjdHgpIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgfSkuZm9ybWF0KHRoaXMubnVtYmVyLmV2YWx1YXRlKGN0eCkpO1xuICAgIH1cblxuICAgIGVhY2hDaGlsZChmbjogKEV4cHJlc3Npb24pID0+IHZvaWQpIHtcbiAgICAgICAgZm4odGhpcy5udW1iZXIpO1xuICAgICAgICBpZiAodGhpcy5sb2NhbGUpIHtcbiAgICAgICAgICAgIGZuKHRoaXMubG9jYWxlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jdXJyZW5jeSkge1xuICAgICAgICAgICAgZm4odGhpcy5jdXJyZW5jeSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubWluRnJhY3Rpb25EaWdpdHMpIHtcbiAgICAgICAgICAgIGZuKHRoaXMubWluRnJhY3Rpb25EaWdpdHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm1heEZyYWN0aW9uRGlnaXRzKSB7XG4gICAgICAgICAgICBmbih0aGlzLm1heEZyYWN0aW9uRGlnaXRzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHBvc3NpYmxlT3V0cHV0cygpIHtcbiAgICAgICAgcmV0dXJuIFt1bmRlZmluZWRdO1xuICAgIH1cblxuICAgIHNlcmlhbGl6ZSgpIHtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHt9O1xuICAgICAgICBpZiAodGhpcy5sb2NhbGUpIHtcbiAgICAgICAgICAgIG9wdGlvbnNbJ2xvY2FsZSddID0gdGhpcy5sb2NhbGUuc2VyaWFsaXplKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuY3VycmVuY3kpIHtcbiAgICAgICAgICAgIG9wdGlvbnNbJ2N1cnJlbmN5J10gPSB0aGlzLmN1cnJlbmN5LnNlcmlhbGl6ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm1pbkZyYWN0aW9uRGlnaXRzKSB7XG4gICAgICAgICAgICBvcHRpb25zWydtaW4tZnJhY3Rpb24tZGlnaXRzJ10gPSB0aGlzLm1pbkZyYWN0aW9uRGlnaXRzLnNlcmlhbGl6ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm1heEZyYWN0aW9uRGlnaXRzKSB7XG4gICAgICAgICAgICBvcHRpb25zWydtYXgtZnJhY3Rpb24tZGlnaXRzJ10gPSB0aGlzLm1heEZyYWN0aW9uRGlnaXRzLnNlcmlhbGl6ZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbXCJudW1iZXItZm9ybWF0XCIsIHRoaXMubnVtYmVyLnNlcmlhbGl6ZSgpLCBvcHRpb25zXTtcbiAgICB9XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgeyBOdW1iZXJUeXBlLCB0b1N0cmluZyB9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHsgdHlwZU9mIH0gZnJvbSAnLi4vdmFsdWVzJztcbmltcG9ydCBSdW50aW1lRXJyb3IgZnJvbSAnLi4vcnVudGltZV9lcnJvcic7XG5cbmltcG9ydCB0eXBlIHsgRXhwcmVzc2lvbiB9IGZyb20gJy4uL2V4cHJlc3Npb24nO1xuaW1wb3J0IHR5cGUgUGFyc2luZ0NvbnRleHQgZnJvbSAnLi4vcGFyc2luZ19jb250ZXh0JztcbmltcG9ydCB0eXBlIEV2YWx1YXRpb25Db250ZXh0IGZyb20gJy4uL2V2YWx1YXRpb25fY29udGV4dCc7XG5pbXBvcnQgdHlwZSB7IFR5cGUgfSBmcm9tICcuLi90eXBlcyc7XG5cbmNsYXNzIExlbmd0aCBpbXBsZW1lbnRzIEV4cHJlc3Npb24ge1xuICAgIHR5cGU6IFR5cGU7XG4gICAgaW5wdXQ6IEV4cHJlc3Npb247XG5cbiAgICBjb25zdHJ1Y3RvcihpbnB1dDogRXhwcmVzc2lvbikge1xuICAgICAgICB0aGlzLnR5cGUgPSBOdW1iZXJUeXBlO1xuICAgICAgICB0aGlzLmlucHV0ID0gaW5wdXQ7XG4gICAgfVxuXG4gICAgc3RhdGljIHBhcnNlKGFyZ3M6IEFycmF5PG1peGVkPiwgY29udGV4dDogUGFyc2luZ0NvbnRleHQpIHtcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoICE9PSAyKVxuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYEV4cGVjdGVkIDEgYXJndW1lbnQsIGJ1dCBmb3VuZCAke2FyZ3MubGVuZ3RoIC0gMX0gaW5zdGVhZC5gKTtcblxuICAgICAgICBjb25zdCBpbnB1dCA9IGNvbnRleHQucGFyc2UoYXJnc1sxXSwgMSk7XG4gICAgICAgIGlmICghaW5wdXQpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGlmIChpbnB1dC50eXBlLmtpbmQgIT09ICdhcnJheScgJiYgaW5wdXQudHlwZS5raW5kICE9PSAnc3RyaW5nJyAmJiBpbnB1dC50eXBlLmtpbmQgIT09ICd2YWx1ZScpXG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgRXhwZWN0ZWQgYXJndW1lbnQgb2YgdHlwZSBzdHJpbmcgb3IgYXJyYXksIGJ1dCBmb3VuZCAke3RvU3RyaW5nKGlucHV0LnR5cGUpfSBpbnN0ZWFkLmApO1xuXG4gICAgICAgIHJldHVybiBuZXcgTGVuZ3RoKGlucHV0KTtcbiAgICB9XG5cbiAgICBldmFsdWF0ZShjdHg6IEV2YWx1YXRpb25Db250ZXh0KSB7XG4gICAgICAgIGNvbnN0IGlucHV0ID0gdGhpcy5pbnB1dC5ldmFsdWF0ZShjdHgpO1xuICAgICAgICBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIGlucHV0Lmxlbmd0aDtcbiAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGlucHV0KSkge1xuICAgICAgICAgICAgcmV0dXJuIGlucHV0Lmxlbmd0aDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXJyb3IoYEV4cGVjdGVkIHZhbHVlIHRvIGJlIG9mIHR5cGUgc3RyaW5nIG9yIGFycmF5LCBidXQgZm91bmQgJHt0b1N0cmluZyh0eXBlT2YoaW5wdXQpKX0gaW5zdGVhZC5gKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGVhY2hDaGlsZChmbjogKEV4cHJlc3Npb24pID0+IHZvaWQpIHtcbiAgICAgICAgZm4odGhpcy5pbnB1dCk7XG4gICAgfVxuXG4gICAgcG9zc2libGVPdXRwdXRzKCkge1xuICAgICAgICByZXR1cm4gW3VuZGVmaW5lZF07XG4gICAgfVxuXG4gICAgc2VyaWFsaXplKCkge1xuICAgICAgICBjb25zdCBzZXJpYWxpemVkID0gW1wibGVuZ3RoXCJdO1xuICAgICAgICB0aGlzLmVhY2hDaGlsZChjaGlsZCA9PiB7IHNlcmlhbGl6ZWQucHVzaChjaGlsZC5zZXJpYWxpemUoKSk7IH0pO1xuICAgICAgICByZXR1cm4gc2VyaWFsaXplZDtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IExlbmd0aDtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7XG4gICAgdHlwZSBUeXBlLFxuICAgIE51bWJlclR5cGUsXG4gICAgU3RyaW5nVHlwZSxcbiAgICBCb29sZWFuVHlwZSxcbiAgICBDb2xvclR5cGUsXG4gICAgT2JqZWN0VHlwZSxcbiAgICBWYWx1ZVR5cGUsXG4gICAgRXJyb3JUeXBlLFxuICAgIENvbGxhdG9yVHlwZSxcbiAgICBhcnJheSxcbiAgICB0b1N0cmluZyBhcyB0eXBlVG9TdHJpbmdcbn0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQgeyB0eXBlT2YsIENvbG9yLCB2YWxpZGF0ZVJHQkEsIHRvU3RyaW5nIGFzIHZhbHVlVG9TdHJpbmcgfSBmcm9tICcuLi92YWx1ZXMnO1xuaW1wb3J0IENvbXBvdW5kRXhwcmVzc2lvbiBmcm9tICcuLi9jb21wb3VuZF9leHByZXNzaW9uJztcbmltcG9ydCBSdW50aW1lRXJyb3IgZnJvbSAnLi4vcnVudGltZV9lcnJvcic7XG5pbXBvcnQgTGV0IGZyb20gJy4vbGV0JztcbmltcG9ydCBWYXIgZnJvbSAnLi92YXInO1xuaW1wb3J0IExpdGVyYWwgZnJvbSAnLi9saXRlcmFsJztcbmltcG9ydCBBc3NlcnRpb24gZnJvbSAnLi9hc3NlcnRpb24nO1xuaW1wb3J0IENvZXJjaW9uIGZyb20gJy4vY29lcmNpb24nO1xuaW1wb3J0IEF0IGZyb20gJy4vYXQnO1xuaW1wb3J0IE1hdGNoIGZyb20gJy4vbWF0Y2gnO1xuaW1wb3J0IENhc2UgZnJvbSAnLi9jYXNlJztcbmltcG9ydCBTdGVwIGZyb20gJy4vc3RlcCc7XG5pbXBvcnQgSW50ZXJwb2xhdGUgZnJvbSAnLi9pbnRlcnBvbGF0ZSc7XG5pbXBvcnQgQ29hbGVzY2UgZnJvbSAnLi9jb2FsZXNjZSc7XG5pbXBvcnQge1xuICAgIEVxdWFscyxcbiAgICBOb3RFcXVhbHMsXG4gICAgTGVzc1RoYW4sXG4gICAgR3JlYXRlclRoYW4sXG4gICAgTGVzc1RoYW5PckVxdWFsLFxuICAgIEdyZWF0ZXJUaGFuT3JFcXVhbFxufSBmcm9tICcuL2NvbXBhcmlzb24nO1xuaW1wb3J0IENvbGxhdG9yRXhwcmVzc2lvbiBmcm9tICcuL2NvbGxhdG9yJztcbmltcG9ydCBOdW1iZXJGb3JtYXQgZnJvbSAnLi9udW1iZXJfZm9ybWF0JztcbmltcG9ydCBGb3JtYXRFeHByZXNzaW9uIGZyb20gJy4vZm9ybWF0JztcbmltcG9ydCBMZW5ndGggZnJvbSAnLi9sZW5ndGgnO1xuXG5pbXBvcnQgdHlwZSB7IFZhcmFyZ3MgfSBmcm9tICcuLi9jb21wb3VuZF9leHByZXNzaW9uJztcbmltcG9ydCB0eXBlIHsgRXhwcmVzc2lvblJlZ2lzdHJ5IH0gZnJvbSAnLi4vZXhwcmVzc2lvbic7XG5cbmNvbnN0IGV4cHJlc3Npb25zOiBFeHByZXNzaW9uUmVnaXN0cnkgPSB7XG4gICAgLy8gc3BlY2lhbCBmb3Jtc1xuICAgICc9PSc6IEVxdWFscyxcbiAgICAnIT0nOiBOb3RFcXVhbHMsXG4gICAgJz4nOiBHcmVhdGVyVGhhbixcbiAgICAnPCc6IExlc3NUaGFuLFxuICAgICc+PSc6IEdyZWF0ZXJUaGFuT3JFcXVhbCxcbiAgICAnPD0nOiBMZXNzVGhhbk9yRXF1YWwsXG4gICAgJ2FycmF5JzogQXNzZXJ0aW9uLFxuICAgICdhdCc6IEF0LFxuICAgICdib29sZWFuJzogQXNzZXJ0aW9uLFxuICAgICdjYXNlJzogQ2FzZSxcbiAgICAnY29hbGVzY2UnOiBDb2FsZXNjZSxcbiAgICAnY29sbGF0b3InOiBDb2xsYXRvckV4cHJlc3Npb24sXG4gICAgJ2Zvcm1hdCc6IEZvcm1hdEV4cHJlc3Npb24sXG4gICAgJ2ludGVycG9sYXRlJzogSW50ZXJwb2xhdGUsXG4gICAgJ2ludGVycG9sYXRlLWhjbCc6IEludGVycG9sYXRlLFxuICAgICdpbnRlcnBvbGF0ZS1sYWInOiBJbnRlcnBvbGF0ZSxcbiAgICAnbGVuZ3RoJzogTGVuZ3RoLFxuICAgICdsZXQnOiBMZXQsXG4gICAgJ2xpdGVyYWwnOiBMaXRlcmFsLFxuICAgICdtYXRjaCc6IE1hdGNoLFxuICAgICdudW1iZXInOiBBc3NlcnRpb24sXG4gICAgJ251bWJlci1mb3JtYXQnOiBOdW1iZXJGb3JtYXQsXG4gICAgJ29iamVjdCc6IEFzc2VydGlvbixcbiAgICAnc3RlcCc6IFN0ZXAsXG4gICAgJ3N0cmluZyc6IEFzc2VydGlvbixcbiAgICAndG8tYm9vbGVhbic6IENvZXJjaW9uLFxuICAgICd0by1jb2xvcic6IENvZXJjaW9uLFxuICAgICd0by1udW1iZXInOiBDb2VyY2lvbixcbiAgICAndG8tc3RyaW5nJzogQ29lcmNpb24sXG4gICAgJ3Zhcic6IFZhclxufTtcblxuZnVuY3Rpb24gcmdiYShjdHgsIFtyLCBnLCBiLCBhXSkge1xuICAgIHIgPSByLmV2YWx1YXRlKGN0eCk7XG4gICAgZyA9IGcuZXZhbHVhdGUoY3R4KTtcbiAgICBiID0gYi5ldmFsdWF0ZShjdHgpO1xuICAgIGNvbnN0IGFscGhhID0gYSA/IGEuZXZhbHVhdGUoY3R4KSA6IDE7XG4gICAgY29uc3QgZXJyb3IgPSB2YWxpZGF0ZVJHQkEociwgZywgYiwgYWxwaGEpO1xuICAgIGlmIChlcnJvcikgdGhyb3cgbmV3IFJ1bnRpbWVFcnJvcihlcnJvcik7XG4gICAgcmV0dXJuIG5ldyBDb2xvcihyIC8gMjU1ICogYWxwaGEsIGcgLyAyNTUgKiBhbHBoYSwgYiAvIDI1NSAqIGFscGhhLCBhbHBoYSk7XG59XG5cbmZ1bmN0aW9uIGhhcyhrZXksIG9iaikge1xuICAgIHJldHVybiBrZXkgaW4gb2JqO1xufVxuXG5mdW5jdGlvbiBnZXQoa2V5LCBvYmopIHtcbiAgICBjb25zdCB2ID0gb2JqW2tleV07XG4gICAgcmV0dXJuIHR5cGVvZiB2ID09PSAndW5kZWZpbmVkJyA/IG51bGwgOiB2O1xufVxuXG5mdW5jdGlvbiBiaW5hcnlTZWFyY2godiwgYSwgaSwgaikge1xuICAgIHdoaWxlIChpIDw9IGopIHtcbiAgICAgICAgY29uc3QgbSA9IChpICsgaikgPj4gMTtcbiAgICAgICAgaWYgKGFbbV0gPT09IHYpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKGFbbV0gPiB2KVxuICAgICAgICAgICAgaiA9IG0gLSAxO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBpID0gbSArIDE7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gdmFyYXJncyh0eXBlOiBUeXBlKTogVmFyYXJncyB7XG4gICAgcmV0dXJuIHsgdHlwZSB9O1xufVxuXG5Db21wb3VuZEV4cHJlc3Npb24ucmVnaXN0ZXIoZXhwcmVzc2lvbnMsIHtcbiAgICAnZXJyb3InOiBbXG4gICAgICAgIEVycm9yVHlwZSxcbiAgICAgICAgW1N0cmluZ1R5cGVdLFxuICAgICAgICAoY3R4LCBbdl0pID0+IHsgdGhyb3cgbmV3IFJ1bnRpbWVFcnJvcih2LmV2YWx1YXRlKGN0eCkpOyB9XG4gICAgXSxcbiAgICAndHlwZW9mJzogW1xuICAgICAgICBTdHJpbmdUeXBlLFxuICAgICAgICBbVmFsdWVUeXBlXSxcbiAgICAgICAgKGN0eCwgW3ZdKSA9PiB0eXBlVG9TdHJpbmcodHlwZU9mKHYuZXZhbHVhdGUoY3R4KSkpXG4gICAgXSxcbiAgICAndG8tcmdiYSc6IFtcbiAgICAgICAgYXJyYXkoTnVtYmVyVHlwZSwgNCksXG4gICAgICAgIFtDb2xvclR5cGVdLFxuICAgICAgICAoY3R4LCBbdl0pID0+IHtcbiAgICAgICAgICAgIHJldHVybiB2LmV2YWx1YXRlKGN0eCkudG9BcnJheSgpO1xuICAgICAgICB9XG4gICAgXSxcbiAgICAncmdiJzogW1xuICAgICAgICBDb2xvclR5cGUsXG4gICAgICAgIFtOdW1iZXJUeXBlLCBOdW1iZXJUeXBlLCBOdW1iZXJUeXBlXSxcbiAgICAgICAgcmdiYVxuICAgIF0sXG4gICAgJ3JnYmEnOiBbXG4gICAgICAgIENvbG9yVHlwZSxcbiAgICAgICAgW051bWJlclR5cGUsIE51bWJlclR5cGUsIE51bWJlclR5cGUsIE51bWJlclR5cGVdLFxuICAgICAgICByZ2JhXG4gICAgXSxcbiAgICAnaGFzJzoge1xuICAgICAgICB0eXBlOiBCb29sZWFuVHlwZSxcbiAgICAgICAgb3ZlcmxvYWRzOiBbXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgW1N0cmluZ1R5cGVdLFxuICAgICAgICAgICAgICAgIChjdHgsIFtrZXldKSA9PiBoYXMoa2V5LmV2YWx1YXRlKGN0eCksIGN0eC5wcm9wZXJ0aWVzKCkpXG4gICAgICAgICAgICBdLCBbXG4gICAgICAgICAgICAgICAgW1N0cmluZ1R5cGUsIE9iamVjdFR5cGVdLFxuICAgICAgICAgICAgICAgIChjdHgsIFtrZXksIG9ial0pID0+IGhhcyhrZXkuZXZhbHVhdGUoY3R4KSwgb2JqLmV2YWx1YXRlKGN0eCkpXG4gICAgICAgICAgICBdXG4gICAgICAgIF1cbiAgICB9LFxuICAgICdnZXQnOiB7XG4gICAgICAgIHR5cGU6IFZhbHVlVHlwZSxcbiAgICAgICAgb3ZlcmxvYWRzOiBbXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgW1N0cmluZ1R5cGVdLFxuICAgICAgICAgICAgICAgIChjdHgsIFtrZXldKSA9PiBnZXQoa2V5LmV2YWx1YXRlKGN0eCksIGN0eC5wcm9wZXJ0aWVzKCkpXG4gICAgICAgICAgICBdLCBbXG4gICAgICAgICAgICAgICAgW1N0cmluZ1R5cGUsIE9iamVjdFR5cGVdLFxuICAgICAgICAgICAgICAgIChjdHgsIFtrZXksIG9ial0pID0+IGdldChrZXkuZXZhbHVhdGUoY3R4KSwgb2JqLmV2YWx1YXRlKGN0eCkpXG4gICAgICAgICAgICBdXG4gICAgICAgIF1cbiAgICB9LFxuICAgICdmZWF0dXJlLXN0YXRlJzogW1xuICAgICAgICBWYWx1ZVR5cGUsXG4gICAgICAgIFtTdHJpbmdUeXBlXSxcbiAgICAgICAgKGN0eCwgW2tleV0pID0+IGdldChrZXkuZXZhbHVhdGUoY3R4KSwgY3R4LmZlYXR1cmVTdGF0ZSB8fCB7fSlcbiAgICBdLFxuICAgICdwcm9wZXJ0aWVzJzogW1xuICAgICAgICBPYmplY3RUeXBlLFxuICAgICAgICBbXSxcbiAgICAgICAgKGN0eCkgPT4gY3R4LnByb3BlcnRpZXMoKVxuICAgIF0sXG4gICAgJ2dlb21ldHJ5LXR5cGUnOiBbXG4gICAgICAgIFN0cmluZ1R5cGUsXG4gICAgICAgIFtdLFxuICAgICAgICAoY3R4KSA9PiBjdHguZ2VvbWV0cnlUeXBlKClcbiAgICBdLFxuICAgICdpZCc6IFtcbiAgICAgICAgVmFsdWVUeXBlLFxuICAgICAgICBbXSxcbiAgICAgICAgKGN0eCkgPT4gY3R4LmlkKClcbiAgICBdLFxuICAgICd6b29tJzogW1xuICAgICAgICBOdW1iZXJUeXBlLFxuICAgICAgICBbXSxcbiAgICAgICAgKGN0eCkgPT4gY3R4Lmdsb2JhbHMuem9vbVxuICAgIF0sXG4gICAgJ2hlYXRtYXAtZGVuc2l0eSc6IFtcbiAgICAgICAgTnVtYmVyVHlwZSxcbiAgICAgICAgW10sXG4gICAgICAgIChjdHgpID0+IGN0eC5nbG9iYWxzLmhlYXRtYXBEZW5zaXR5IHx8IDBcbiAgICBdLFxuICAgICdsaW5lLXByb2dyZXNzJzogW1xuICAgICAgICBOdW1iZXJUeXBlLFxuICAgICAgICBbXSxcbiAgICAgICAgKGN0eCkgPT4gY3R4Lmdsb2JhbHMubGluZVByb2dyZXNzIHx8IDBcbiAgICBdLFxuICAgICdhY2N1bXVsYXRlZCc6IFtcbiAgICAgICAgVmFsdWVUeXBlLFxuICAgICAgICBbXSxcbiAgICAgICAgKGN0eCkgPT4gY3R4Lmdsb2JhbHMuYWNjdW11bGF0ZWQgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBjdHguZ2xvYmFscy5hY2N1bXVsYXRlZFxuICAgIF0sXG4gICAgJysnOiBbXG4gICAgICAgIE51bWJlclR5cGUsXG4gICAgICAgIHZhcmFyZ3MoTnVtYmVyVHlwZSksXG4gICAgICAgIChjdHgsIGFyZ3MpID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSAwO1xuICAgICAgICAgICAgZm9yIChjb25zdCBhcmcgb2YgYXJncykge1xuICAgICAgICAgICAgICAgIHJlc3VsdCArPSBhcmcuZXZhbHVhdGUoY3R4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICBdLFxuICAgICcqJzogW1xuICAgICAgICBOdW1iZXJUeXBlLFxuICAgICAgICB2YXJhcmdzKE51bWJlclR5cGUpLFxuICAgICAgICAoY3R4LCBhcmdzKSA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gMTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgYXJnIG9mIGFyZ3MpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgKj0gYXJnLmV2YWx1YXRlKGN0eCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgXSxcbiAgICAnLSc6IHtcbiAgICAgICAgdHlwZTogTnVtYmVyVHlwZSxcbiAgICAgICAgb3ZlcmxvYWRzOiBbXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgW051bWJlclR5cGUsIE51bWJlclR5cGVdLFxuICAgICAgICAgICAgICAgIChjdHgsIFthLCBiXSkgPT4gYS5ldmFsdWF0ZShjdHgpIC0gYi5ldmFsdWF0ZShjdHgpXG4gICAgICAgICAgICBdLCBbXG4gICAgICAgICAgICAgICAgW051bWJlclR5cGVdLFxuICAgICAgICAgICAgICAgIChjdHgsIFthXSkgPT4gLWEuZXZhbHVhdGUoY3R4KVxuICAgICAgICAgICAgXVxuICAgICAgICBdXG4gICAgfSxcbiAgICAnLyc6IFtcbiAgICAgICAgTnVtYmVyVHlwZSxcbiAgICAgICAgW051bWJlclR5cGUsIE51bWJlclR5cGVdLFxuICAgICAgICAoY3R4LCBbYSwgYl0pID0+IGEuZXZhbHVhdGUoY3R4KSAvIGIuZXZhbHVhdGUoY3R4KVxuICAgIF0sXG4gICAgJyUnOiBbXG4gICAgICAgIE51bWJlclR5cGUsXG4gICAgICAgIFtOdW1iZXJUeXBlLCBOdW1iZXJUeXBlXSxcbiAgICAgICAgKGN0eCwgW2EsIGJdKSA9PiBhLmV2YWx1YXRlKGN0eCkgJSBiLmV2YWx1YXRlKGN0eClcbiAgICBdLFxuICAgICdsbjInOiBbXG4gICAgICAgIE51bWJlclR5cGUsXG4gICAgICAgIFtdLFxuICAgICAgICAoKSA9PiBNYXRoLkxOMlxuICAgIF0sXG4gICAgJ3BpJzogW1xuICAgICAgICBOdW1iZXJUeXBlLFxuICAgICAgICBbXSxcbiAgICAgICAgKCkgPT4gTWF0aC5QSVxuICAgIF0sXG4gICAgJ2UnOiBbXG4gICAgICAgIE51bWJlclR5cGUsXG4gICAgICAgIFtdLFxuICAgICAgICAoKSA9PiBNYXRoLkVcbiAgICBdLFxuICAgICdeJzogW1xuICAgICAgICBOdW1iZXJUeXBlLFxuICAgICAgICBbTnVtYmVyVHlwZSwgTnVtYmVyVHlwZV0sXG4gICAgICAgIChjdHgsIFtiLCBlXSkgPT4gTWF0aC5wb3coYi5ldmFsdWF0ZShjdHgpLCBlLmV2YWx1YXRlKGN0eCkpXG4gICAgXSxcbiAgICAnc3FydCc6IFtcbiAgICAgICAgTnVtYmVyVHlwZSxcbiAgICAgICAgW051bWJlclR5cGVdLFxuICAgICAgICAoY3R4LCBbeF0pID0+IE1hdGguc3FydCh4LmV2YWx1YXRlKGN0eCkpXG4gICAgXSxcbiAgICAnbG9nMTAnOiBbXG4gICAgICAgIE51bWJlclR5cGUsXG4gICAgICAgIFtOdW1iZXJUeXBlXSxcbiAgICAgICAgKGN0eCwgW25dKSA9PiBNYXRoLmxvZyhuLmV2YWx1YXRlKGN0eCkpIC8gTWF0aC5MTjEwXG4gICAgXSxcbiAgICAnbG4nOiBbXG4gICAgICAgIE51bWJlclR5cGUsXG4gICAgICAgIFtOdW1iZXJUeXBlXSxcbiAgICAgICAgKGN0eCwgW25dKSA9PiBNYXRoLmxvZyhuLmV2YWx1YXRlKGN0eCkpXG4gICAgXSxcbiAgICAnbG9nMic6IFtcbiAgICAgICAgTnVtYmVyVHlwZSxcbiAgICAgICAgW051bWJlclR5cGVdLFxuICAgICAgICAoY3R4LCBbbl0pID0+IE1hdGgubG9nKG4uZXZhbHVhdGUoY3R4KSkgLyBNYXRoLkxOMlxuICAgIF0sXG4gICAgJ3Npbic6IFtcbiAgICAgICAgTnVtYmVyVHlwZSxcbiAgICAgICAgW051bWJlclR5cGVdLFxuICAgICAgICAoY3R4LCBbbl0pID0+IE1hdGguc2luKG4uZXZhbHVhdGUoY3R4KSlcbiAgICBdLFxuICAgICdjb3MnOiBbXG4gICAgICAgIE51bWJlclR5cGUsXG4gICAgICAgIFtOdW1iZXJUeXBlXSxcbiAgICAgICAgKGN0eCwgW25dKSA9PiBNYXRoLmNvcyhuLmV2YWx1YXRlKGN0eCkpXG4gICAgXSxcbiAgICAndGFuJzogW1xuICAgICAgICBOdW1iZXJUeXBlLFxuICAgICAgICBbTnVtYmVyVHlwZV0sXG4gICAgICAgIChjdHgsIFtuXSkgPT4gTWF0aC50YW4obi5ldmFsdWF0ZShjdHgpKVxuICAgIF0sXG4gICAgJ2FzaW4nOiBbXG4gICAgICAgIE51bWJlclR5cGUsXG4gICAgICAgIFtOdW1iZXJUeXBlXSxcbiAgICAgICAgKGN0eCwgW25dKSA9PiBNYXRoLmFzaW4obi5ldmFsdWF0ZShjdHgpKVxuICAgIF0sXG4gICAgJ2Fjb3MnOiBbXG4gICAgICAgIE51bWJlclR5cGUsXG4gICAgICAgIFtOdW1iZXJUeXBlXSxcbiAgICAgICAgKGN0eCwgW25dKSA9PiBNYXRoLmFjb3Mobi5ldmFsdWF0ZShjdHgpKVxuICAgIF0sXG4gICAgJ2F0YW4nOiBbXG4gICAgICAgIE51bWJlclR5cGUsXG4gICAgICAgIFtOdW1iZXJUeXBlXSxcbiAgICAgICAgKGN0eCwgW25dKSA9PiBNYXRoLmF0YW4obi5ldmFsdWF0ZShjdHgpKVxuICAgIF0sXG4gICAgJ21pbic6IFtcbiAgICAgICAgTnVtYmVyVHlwZSxcbiAgICAgICAgdmFyYXJncyhOdW1iZXJUeXBlKSxcbiAgICAgICAgKGN0eCwgYXJncykgPT4gTWF0aC5taW4oLi4uYXJncy5tYXAoYXJnID0+IGFyZy5ldmFsdWF0ZShjdHgpKSlcbiAgICBdLFxuICAgICdtYXgnOiBbXG4gICAgICAgIE51bWJlclR5cGUsXG4gICAgICAgIHZhcmFyZ3MoTnVtYmVyVHlwZSksXG4gICAgICAgIChjdHgsIGFyZ3MpID0+IE1hdGgubWF4KC4uLmFyZ3MubWFwKGFyZyA9PiBhcmcuZXZhbHVhdGUoY3R4KSkpXG4gICAgXSxcbiAgICAnYWJzJzogW1xuICAgICAgICBOdW1iZXJUeXBlLFxuICAgICAgICBbTnVtYmVyVHlwZV0sXG4gICAgICAgIChjdHgsIFtuXSkgPT4gTWF0aC5hYnMobi5ldmFsdWF0ZShjdHgpKVxuICAgIF0sXG4gICAgJ3JvdW5kJzogW1xuICAgICAgICBOdW1iZXJUeXBlLFxuICAgICAgICBbTnVtYmVyVHlwZV0sXG4gICAgICAgIChjdHgsIFtuXSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdiA9IG4uZXZhbHVhdGUoY3R4KTtcbiAgICAgICAgICAgIC8vIEphdmFzY3JpcHQncyBNYXRoLnJvdW5kKCkgcm91bmRzIHRvd2FyZHMgK0luZmluaXR5IGZvciBoYWxmd2F5XG4gICAgICAgICAgICAvLyB2YWx1ZXMsIGV2ZW4gd2hlbiB0aGV5J3JlIG5lZ2F0aXZlLiBJdCdzIG1vcmUgY29tbW9uIHRvIHJvdW5kXG4gICAgICAgICAgICAvLyBhd2F5IGZyb20gMCAoZS5nLiwgdGhpcyBpcyB3aGF0IHB5dGhvbiBhbmQgQysrIGRvKVxuICAgICAgICAgICAgcmV0dXJuIHYgPCAwID8gLU1hdGgucm91bmQoLXYpIDogTWF0aC5yb3VuZCh2KTtcbiAgICAgICAgfVxuICAgIF0sXG4gICAgJ2Zsb29yJzogW1xuICAgICAgICBOdW1iZXJUeXBlLFxuICAgICAgICBbTnVtYmVyVHlwZV0sXG4gICAgICAgIChjdHgsIFtuXSkgPT4gTWF0aC5mbG9vcihuLmV2YWx1YXRlKGN0eCkpXG4gICAgXSxcbiAgICAnY2VpbCc6IFtcbiAgICAgICAgTnVtYmVyVHlwZSxcbiAgICAgICAgW051bWJlclR5cGVdLFxuICAgICAgICAoY3R4LCBbbl0pID0+IE1hdGguY2VpbChuLmV2YWx1YXRlKGN0eCkpXG4gICAgXSxcbiAgICAnZmlsdGVyLT09JzogW1xuICAgICAgICBCb29sZWFuVHlwZSxcbiAgICAgICAgW1N0cmluZ1R5cGUsIFZhbHVlVHlwZV0sXG4gICAgICAgIChjdHgsIFtrLCB2XSkgPT4gY3R4LnByb3BlcnRpZXMoKVsoazogYW55KS52YWx1ZV0gPT09ICh2OiBhbnkpLnZhbHVlXG4gICAgXSxcbiAgICAnZmlsdGVyLWlkLT09JzogW1xuICAgICAgICBCb29sZWFuVHlwZSxcbiAgICAgICAgW1ZhbHVlVHlwZV0sXG4gICAgICAgIChjdHgsIFt2XSkgPT4gY3R4LmlkKCkgPT09ICh2OiBhbnkpLnZhbHVlXG4gICAgXSxcbiAgICAnZmlsdGVyLXR5cGUtPT0nOiBbXG4gICAgICAgIEJvb2xlYW5UeXBlLFxuICAgICAgICBbU3RyaW5nVHlwZV0sXG4gICAgICAgIChjdHgsIFt2XSkgPT4gY3R4Lmdlb21ldHJ5VHlwZSgpID09PSAodjogYW55KS52YWx1ZVxuICAgIF0sXG4gICAgJ2ZpbHRlci08JzogW1xuICAgICAgICBCb29sZWFuVHlwZSxcbiAgICAgICAgW1N0cmluZ1R5cGUsIFZhbHVlVHlwZV0sXG4gICAgICAgIChjdHgsIFtrLCB2XSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYSA9IGN0eC5wcm9wZXJ0aWVzKClbKGs6IGFueSkudmFsdWVdO1xuICAgICAgICAgICAgY29uc3QgYiA9ICh2OiBhbnkpLnZhbHVlO1xuICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBhID09PSB0eXBlb2YgYiAmJiBhIDwgYjtcbiAgICAgICAgfVxuICAgIF0sXG4gICAgJ2ZpbHRlci1pZC08JzogW1xuICAgICAgICBCb29sZWFuVHlwZSxcbiAgICAgICAgW1ZhbHVlVHlwZV0sXG4gICAgICAgIChjdHgsIFt2XSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYSA9IGN0eC5pZCgpO1xuICAgICAgICAgICAgY29uc3QgYiA9ICh2OiBhbnkpLnZhbHVlO1xuICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBhID09PSB0eXBlb2YgYiAmJiBhIDwgYjtcbiAgICAgICAgfVxuICAgIF0sXG4gICAgJ2ZpbHRlci0+JzogW1xuICAgICAgICBCb29sZWFuVHlwZSxcbiAgICAgICAgW1N0cmluZ1R5cGUsIFZhbHVlVHlwZV0sXG4gICAgICAgIChjdHgsIFtrLCB2XSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYSA9IGN0eC5wcm9wZXJ0aWVzKClbKGs6IGFueSkudmFsdWVdO1xuICAgICAgICAgICAgY29uc3QgYiA9ICh2OiBhbnkpLnZhbHVlO1xuICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBhID09PSB0eXBlb2YgYiAmJiBhID4gYjtcbiAgICAgICAgfVxuICAgIF0sXG4gICAgJ2ZpbHRlci1pZC0+JzogW1xuICAgICAgICBCb29sZWFuVHlwZSxcbiAgICAgICAgW1ZhbHVlVHlwZV0sXG4gICAgICAgIChjdHgsIFt2XSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYSA9IGN0eC5pZCgpO1xuICAgICAgICAgICAgY29uc3QgYiA9ICh2OiBhbnkpLnZhbHVlO1xuICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBhID09PSB0eXBlb2YgYiAmJiBhID4gYjtcbiAgICAgICAgfVxuICAgIF0sXG4gICAgJ2ZpbHRlci08PSc6IFtcbiAgICAgICAgQm9vbGVhblR5cGUsXG4gICAgICAgIFtTdHJpbmdUeXBlLCBWYWx1ZVR5cGVdLFxuICAgICAgICAoY3R4LCBbaywgdl0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGEgPSBjdHgucHJvcGVydGllcygpWyhrOiBhbnkpLnZhbHVlXTtcbiAgICAgICAgICAgIGNvbnN0IGIgPSAodjogYW55KS52YWx1ZTtcbiAgICAgICAgICAgIHJldHVybiB0eXBlb2YgYSA9PT0gdHlwZW9mIGIgJiYgYSA8PSBiO1xuICAgICAgICB9XG4gICAgXSxcbiAgICAnZmlsdGVyLWlkLTw9JzogW1xuICAgICAgICBCb29sZWFuVHlwZSxcbiAgICAgICAgW1ZhbHVlVHlwZV0sXG4gICAgICAgIChjdHgsIFt2XSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYSA9IGN0eC5pZCgpO1xuICAgICAgICAgICAgY29uc3QgYiA9ICh2OiBhbnkpLnZhbHVlO1xuICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBhID09PSB0eXBlb2YgYiAmJiBhIDw9IGI7XG4gICAgICAgIH1cbiAgICBdLFxuICAgICdmaWx0ZXItPj0nOiBbXG4gICAgICAgIEJvb2xlYW5UeXBlLFxuICAgICAgICBbU3RyaW5nVHlwZSwgVmFsdWVUeXBlXSxcbiAgICAgICAgKGN0eCwgW2ssIHZdKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhID0gY3R4LnByb3BlcnRpZXMoKVsoazogYW55KS52YWx1ZV07XG4gICAgICAgICAgICBjb25zdCBiID0gKHY6IGFueSkudmFsdWU7XG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIGEgPT09IHR5cGVvZiBiICYmIGEgPj0gYjtcbiAgICAgICAgfVxuICAgIF0sXG4gICAgJ2ZpbHRlci1pZC0+PSc6IFtcbiAgICAgICAgQm9vbGVhblR5cGUsXG4gICAgICAgIFtWYWx1ZVR5cGVdLFxuICAgICAgICAoY3R4LCBbdl0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGEgPSBjdHguaWQoKTtcbiAgICAgICAgICAgIGNvbnN0IGIgPSAodjogYW55KS52YWx1ZTtcbiAgICAgICAgICAgIHJldHVybiB0eXBlb2YgYSA9PT0gdHlwZW9mIGIgJiYgYSA+PSBiO1xuICAgICAgICB9XG4gICAgXSxcbiAgICAnZmlsdGVyLWhhcyc6IFtcbiAgICAgICAgQm9vbGVhblR5cGUsXG4gICAgICAgIFtWYWx1ZVR5cGVdLFxuICAgICAgICAoY3R4LCBba10pID0+IChrOiBhbnkpLnZhbHVlIGluIGN0eC5wcm9wZXJ0aWVzKClcbiAgICBdLFxuICAgICdmaWx0ZXItaGFzLWlkJzogW1xuICAgICAgICBCb29sZWFuVHlwZSxcbiAgICAgICAgW10sXG4gICAgICAgIChjdHgpID0+IGN0eC5pZCgpICE9PSBudWxsXG4gICAgXSxcbiAgICAnZmlsdGVyLXR5cGUtaW4nOiBbXG4gICAgICAgIEJvb2xlYW5UeXBlLFxuICAgICAgICBbYXJyYXkoU3RyaW5nVHlwZSldLFxuICAgICAgICAoY3R4LCBbdl0pID0+ICh2OiBhbnkpLnZhbHVlLmluZGV4T2YoY3R4Lmdlb21ldHJ5VHlwZSgpKSA+PSAwXG4gICAgXSxcbiAgICAnZmlsdGVyLWlkLWluJzogW1xuICAgICAgICBCb29sZWFuVHlwZSxcbiAgICAgICAgW2FycmF5KFZhbHVlVHlwZSldLFxuICAgICAgICAoY3R4LCBbdl0pID0+ICh2OiBhbnkpLnZhbHVlLmluZGV4T2YoY3R4LmlkKCkpID49IDBcbiAgICBdLFxuICAgICdmaWx0ZXItaW4tc21hbGwnOiBbXG4gICAgICAgIEJvb2xlYW5UeXBlLFxuICAgICAgICBbU3RyaW5nVHlwZSwgYXJyYXkoVmFsdWVUeXBlKV0sXG4gICAgICAgIC8vIGFzc3VtZXMgdiBpcyBhbiBhcnJheSBsaXRlcmFsXG4gICAgICAgIChjdHgsIFtrLCB2XSkgPT4gKHY6IGFueSkudmFsdWUuaW5kZXhPZihjdHgucHJvcGVydGllcygpWyhrOiBhbnkpLnZhbHVlXSkgPj0gMFxuICAgIF0sXG4gICAgJ2ZpbHRlci1pbi1sYXJnZSc6IFtcbiAgICAgICAgQm9vbGVhblR5cGUsXG4gICAgICAgIFtTdHJpbmdUeXBlLCBhcnJheShWYWx1ZVR5cGUpXSxcbiAgICAgICAgLy8gYXNzdW1lcyB2IGlzIGEgYXJyYXkgbGl0ZXJhbCB3aXRoIHZhbHVlcyBzb3J0ZWQgaW4gYXNjZW5kaW5nIG9yZGVyIGFuZCBvZiBhIHNpbmdsZSB0eXBlXG4gICAgICAgIChjdHgsIFtrLCB2XSkgPT4gYmluYXJ5U2VhcmNoKGN0eC5wcm9wZXJ0aWVzKClbKGs6IGFueSkudmFsdWVdLCAodjogYW55KS52YWx1ZSwgMCwgKHY6IGFueSkudmFsdWUubGVuZ3RoIC0gMSlcbiAgICBdLFxuICAgICdhbGwnOiB7XG4gICAgICAgIHR5cGU6IEJvb2xlYW5UeXBlLFxuICAgICAgICBvdmVybG9hZHM6IFtcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICBbQm9vbGVhblR5cGUsIEJvb2xlYW5UeXBlXSxcbiAgICAgICAgICAgICAgICAoY3R4LCBbYSwgYl0pID0+IGEuZXZhbHVhdGUoY3R4KSAmJiBiLmV2YWx1YXRlKGN0eClcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgdmFyYXJncyhCb29sZWFuVHlwZSksXG4gICAgICAgICAgICAgICAgKGN0eCwgYXJncykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGFyZyBvZiBhcmdzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWFyZy5ldmFsdWF0ZShjdHgpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdXG4gICAgICAgIF1cbiAgICB9LFxuICAgICdhbnknOiB7XG4gICAgICAgIHR5cGU6IEJvb2xlYW5UeXBlLFxuICAgICAgICBvdmVybG9hZHM6IFtcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICBbQm9vbGVhblR5cGUsIEJvb2xlYW5UeXBlXSxcbiAgICAgICAgICAgICAgICAoY3R4LCBbYSwgYl0pID0+IGEuZXZhbHVhdGUoY3R4KSB8fCBiLmV2YWx1YXRlKGN0eClcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgdmFyYXJncyhCb29sZWFuVHlwZSksXG4gICAgICAgICAgICAgICAgKGN0eCwgYXJncykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGFyZyBvZiBhcmdzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJnLmV2YWx1YXRlKGN0eCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgXVxuICAgIH0sXG4gICAgJyEnOiBbXG4gICAgICAgIEJvb2xlYW5UeXBlLFxuICAgICAgICBbQm9vbGVhblR5cGVdLFxuICAgICAgICAoY3R4LCBbYl0pID0+ICFiLmV2YWx1YXRlKGN0eClcbiAgICBdLFxuICAgICdpcy1zdXBwb3J0ZWQtc2NyaXB0JzogW1xuICAgICAgICBCb29sZWFuVHlwZSxcbiAgICAgICAgW1N0cmluZ1R5cGVdLFxuICAgICAgICAvLyBBdCBwYXJzZSB0aW1lIHRoaXMgd2lsbCBhbHdheXMgcmV0dXJuIHRydWUsIHNvIHdlIG5lZWQgdG8gZXhjbHVkZSB0aGlzIGV4cHJlc3Npb24gd2l0aCBpc0dsb2JhbFByb3BlcnR5Q29uc3RhbnRcbiAgICAgICAgKGN0eCwgW3NdKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpc1N1cHBvcnRlZFNjcmlwdCA9IGN0eC5nbG9iYWxzICYmIGN0eC5nbG9iYWxzLmlzU3VwcG9ydGVkU2NyaXB0O1xuICAgICAgICAgICAgaWYgKGlzU3VwcG9ydGVkU2NyaXB0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzU3VwcG9ydGVkU2NyaXB0KHMuZXZhbHVhdGUoY3R4KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIF0sXG4gICAgJ3VwY2FzZSc6IFtcbiAgICAgICAgU3RyaW5nVHlwZSxcbiAgICAgICAgW1N0cmluZ1R5cGVdLFxuICAgICAgICAoY3R4LCBbc10pID0+IHMuZXZhbHVhdGUoY3R4KS50b1VwcGVyQ2FzZSgpXG4gICAgXSxcbiAgICAnZG93bmNhc2UnOiBbXG4gICAgICAgIFN0cmluZ1R5cGUsXG4gICAgICAgIFtTdHJpbmdUeXBlXSxcbiAgICAgICAgKGN0eCwgW3NdKSA9PiBzLmV2YWx1YXRlKGN0eCkudG9Mb3dlckNhc2UoKVxuICAgIF0sXG4gICAgJ2NvbmNhdCc6IFtcbiAgICAgICAgU3RyaW5nVHlwZSxcbiAgICAgICAgdmFyYXJncyhWYWx1ZVR5cGUpLFxuICAgICAgICAoY3R4LCBhcmdzKSA9PiBhcmdzLm1hcChhcmcgPT4gdmFsdWVUb1N0cmluZyhhcmcuZXZhbHVhdGUoY3R4KSkpLmpvaW4oJycpXG4gICAgXSxcbiAgICAncmVzb2x2ZWQtbG9jYWxlJzogW1xuICAgICAgICBTdHJpbmdUeXBlLFxuICAgICAgICBbQ29sbGF0b3JUeXBlXSxcbiAgICAgICAgKGN0eCwgW2NvbGxhdG9yXSkgPT4gY29sbGF0b3IuZXZhbHVhdGUoY3R4KS5yZXNvbHZlZExvY2FsZSgpXG4gICAgXVxufSk7XG5cbmV4cG9ydCBkZWZhdWx0IGV4cHJlc3Npb25zO1xuIiwiLy8gQGZsb3dcblxuLyoqXG4gKiBBIHR5cGUgdXNlZCBmb3IgcmV0dXJuaW5nIGFuZCBwcm9wYWdhdGluZyBlcnJvcnMuIFRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSB1bmlvblxuICogcmVwcmVzZW50cyBzdWNjZXNzIGFuZCBjb250YWlucyBhIHZhbHVlLCBhbmQgdGhlIHNlY29uZCByZXByZXNlbnRzIGFuIGVycm9yIGFuZFxuICogY29udGFpbnMgYW4gZXJyb3IgdmFsdWUuXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgdHlwZSBSZXN1bHQ8VCwgRT4gPVxuICAgIHwge3wgcmVzdWx0OiAnc3VjY2VzcycsIHZhbHVlOiBUIHx9XG4gICAgfCB7fCByZXN1bHQ6ICdlcnJvcicsIHZhbHVlOiBFIHx9O1xuXG5leHBvcnQgZnVuY3Rpb24gc3VjY2VzczxULCBFPih2YWx1ZTogVCk6IFJlc3VsdDxULCBFPiB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiAnc3VjY2VzcycsIHZhbHVlIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlcnJvcjxULCBFPih2YWx1ZTogRSk6IFJlc3VsdDxULCBFPiB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiAnZXJyb3InLCB2YWx1ZSB9O1xufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHR5cGUge1N0eWxlUHJvcGVydHlTcGVjaWZpY2F0aW9ufSBmcm9tICcuLi9zdHlsZS1zcGVjJztcblxuZXhwb3J0IGZ1bmN0aW9uIHN1cHBvcnRzUHJvcGVydHlFeHByZXNzaW9uKHNwZWM6IFN0eWxlUHJvcGVydHlTcGVjaWZpY2F0aW9uKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHNwZWNbJ3Byb3BlcnR5LXR5cGUnXSA9PT0gJ2RhdGEtZHJpdmVuJyB8fCBzcGVjWydwcm9wZXJ0eS10eXBlJ10gPT09ICdjcm9zcy1mYWRlZC1kYXRhLWRyaXZlbic7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzdXBwb3J0c1pvb21FeHByZXNzaW9uKHNwZWM6IFN0eWxlUHJvcGVydHlTcGVjaWZpY2F0aW9uKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhc3BlYy5leHByZXNzaW9uICYmIHNwZWMuZXhwcmVzc2lvbi5wYXJhbWV0ZXJzLmluZGV4T2YoJ3pvb20nKSA+IC0xO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3VwcG9ydHNJbnRlcnBvbGF0aW9uKHNwZWM6IFN0eWxlUHJvcGVydHlTcGVjaWZpY2F0aW9uKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhc3BlYy5leHByZXNzaW9uICYmIHNwZWMuZXhwcmVzc2lvbi5pbnRlcnBvbGF0ZWQ7XG59XG4iLCJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFR5cGUodmFsKSB7XG4gICAgaWYgKHZhbCBpbnN0YW5jZW9mIE51bWJlcikge1xuICAgICAgICByZXR1cm4gJ251bWJlcic7XG4gICAgfSBlbHNlIGlmICh2YWwgaW5zdGFuY2VvZiBTdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuICdzdHJpbmcnO1xuICAgIH0gZWxzZSBpZiAodmFsIGluc3RhbmNlb2YgQm9vbGVhbikge1xuICAgICAgICByZXR1cm4gJ2Jvb2xlYW4nO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgICAgIHJldHVybiAnYXJyYXknO1xuICAgIH0gZWxzZSBpZiAodmFsID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiAnbnVsbCc7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWw7XG4gICAgfVxufVxuIiwiXG5pbXBvcnQgKiBhcyBjb2xvclNwYWNlcyBmcm9tICcuLi91dGlsL2NvbG9yX3NwYWNlcyc7XG5pbXBvcnQgQ29sb3IgZnJvbSAnLi4vdXRpbC9jb2xvcic7XG5pbXBvcnQgZXh0ZW5kIGZyb20gJy4uL3V0aWwvZXh0ZW5kJztcbmltcG9ydCBnZXRUeXBlIGZyb20gJy4uL3V0aWwvZ2V0X3R5cGUnO1xuaW1wb3J0ICogYXMgaW50ZXJwb2xhdGUgZnJvbSAnLi4vdXRpbC9pbnRlcnBvbGF0ZSc7XG5pbXBvcnQgSW50ZXJwb2xhdGUgZnJvbSAnLi4vZXhwcmVzc2lvbi9kZWZpbml0aW9ucy9pbnRlcnBvbGF0ZSc7XG5pbXBvcnQgRm9ybWF0dGVkIGZyb20gJy4uL2V4cHJlc3Npb24vdHlwZXMvZm9ybWF0dGVkJztcbmltcG9ydCB7IHN1cHBvcnRzSW50ZXJwb2xhdGlvbiB9IGZyb20gJy4uL3V0aWwvcHJvcGVydGllcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0Z1bmN0aW9uKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpO1xufVxuXG5mdW5jdGlvbiBpZGVudGl0eUZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4geDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUZ1bmN0aW9uKHBhcmFtZXRlcnMsIHByb3BlcnR5U3BlYykge1xuICAgIGNvbnN0IGlzQ29sb3IgPSBwcm9wZXJ0eVNwZWMudHlwZSA9PT0gJ2NvbG9yJztcbiAgICBjb25zdCB6b29tQW5kRmVhdHVyZURlcGVuZGVudCA9IHBhcmFtZXRlcnMuc3RvcHMgJiYgdHlwZW9mIHBhcmFtZXRlcnMuc3RvcHNbMF1bMF0gPT09ICdvYmplY3QnO1xuICAgIGNvbnN0IGZlYXR1cmVEZXBlbmRlbnQgPSB6b29tQW5kRmVhdHVyZURlcGVuZGVudCB8fCBwYXJhbWV0ZXJzLnByb3BlcnR5ICE9PSB1bmRlZmluZWQ7XG4gICAgY29uc3Qgem9vbURlcGVuZGVudCA9IHpvb21BbmRGZWF0dXJlRGVwZW5kZW50IHx8ICFmZWF0dXJlRGVwZW5kZW50O1xuICAgIGNvbnN0IHR5cGUgPSBwYXJhbWV0ZXJzLnR5cGUgfHwgKHN1cHBvcnRzSW50ZXJwb2xhdGlvbihwcm9wZXJ0eVNwZWMpID8gJ2V4cG9uZW50aWFsJyA6ICdpbnRlcnZhbCcpO1xuXG4gICAgaWYgKGlzQ29sb3IpIHtcbiAgICAgICAgcGFyYW1ldGVycyA9IGV4dGVuZCh7fSwgcGFyYW1ldGVycyk7XG5cbiAgICAgICAgaWYgKHBhcmFtZXRlcnMuc3RvcHMpIHtcbiAgICAgICAgICAgIHBhcmFtZXRlcnMuc3RvcHMgPSBwYXJhbWV0ZXJzLnN0b3BzLm1hcCgoc3RvcCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBbc3RvcFswXSwgQ29sb3IucGFyc2Uoc3RvcFsxXSldO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGFyYW1ldGVycy5kZWZhdWx0KSB7XG4gICAgICAgICAgICBwYXJhbWV0ZXJzLmRlZmF1bHQgPSBDb2xvci5wYXJzZShwYXJhbWV0ZXJzLmRlZmF1bHQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGFyYW1ldGVycy5kZWZhdWx0ID0gQ29sb3IucGFyc2UocHJvcGVydHlTcGVjLmRlZmF1bHQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtZXRlcnMuY29sb3JTcGFjZSAmJiBwYXJhbWV0ZXJzLmNvbG9yU3BhY2UgIT09ICdyZ2InICYmICFjb2xvclNwYWNlc1twYXJhbWV0ZXJzLmNvbG9yU3BhY2VdKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgaW1wb3J0L25hbWVzcGFjZVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gY29sb3Igc3BhY2U6ICR7cGFyYW1ldGVycy5jb2xvclNwYWNlfWApO1xuICAgIH1cblxuICAgIGxldCBpbm5lckZ1bjtcbiAgICBsZXQgaGFzaGVkU3RvcHM7XG4gICAgbGV0IGNhdGVnb3JpY2FsS2V5VHlwZTtcbiAgICBpZiAodHlwZSA9PT0gJ2V4cG9uZW50aWFsJykge1xuICAgICAgICBpbm5lckZ1biA9IGV2YWx1YXRlRXhwb25lbnRpYWxGdW5jdGlvbjtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdpbnRlcnZhbCcpIHtcbiAgICAgICAgaW5uZXJGdW4gPSBldmFsdWF0ZUludGVydmFsRnVuY3Rpb247XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnY2F0ZWdvcmljYWwnKSB7XG4gICAgICAgIGlubmVyRnVuID0gZXZhbHVhdGVDYXRlZ29yaWNhbEZ1bmN0aW9uO1xuXG4gICAgICAgIC8vIEZvciBjYXRlZ29yaWNhbCBmdW5jdGlvbnMsIGdlbmVyYXRlIGFuIE9iamVjdCBhcyBhIGhhc2htYXAgb2YgdGhlIHN0b3BzIGZvciBmYXN0IHNlYXJjaGluZ1xuICAgICAgICBoYXNoZWRTdG9wcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIGZvciAoY29uc3Qgc3RvcCBvZiBwYXJhbWV0ZXJzLnN0b3BzKSB7XG4gICAgICAgICAgICBoYXNoZWRTdG9wc1tzdG9wWzBdXSA9IHN0b3BbMV07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJbmZlciBrZXkgdHlwZSBiYXNlZCBvbiBmaXJzdCBzdG9wIGtleS0tIHVzZWQgdG8gZW5jZm9yY2Ugc3RyaWN0IHR5cGUgY2hlY2tpbmcgbGF0ZXJcbiAgICAgICAgY2F0ZWdvcmljYWxLZXlUeXBlID0gdHlwZW9mIHBhcmFtZXRlcnMuc3RvcHNbMF1bMF07XG5cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdpZGVudGl0eScpIHtcbiAgICAgICAgaW5uZXJGdW4gPSBldmFsdWF0ZUlkZW50aXR5RnVuY3Rpb247XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGZ1bmN0aW9uIHR5cGUgXCIke3R5cGV9XCJgKTtcbiAgICB9XG5cbiAgICBpZiAoem9vbUFuZEZlYXR1cmVEZXBlbmRlbnQpIHtcbiAgICAgICAgY29uc3QgZmVhdHVyZUZ1bmN0aW9ucyA9IHt9O1xuICAgICAgICBjb25zdCB6b29tU3RvcHMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgcyA9IDA7IHMgPCBwYXJhbWV0ZXJzLnN0b3BzLmxlbmd0aDsgcysrKSB7XG4gICAgICAgICAgICBjb25zdCBzdG9wID0gcGFyYW1ldGVycy5zdG9wc1tzXTtcbiAgICAgICAgICAgIGNvbnN0IHpvb20gPSBzdG9wWzBdLnpvb207XG4gICAgICAgICAgICBpZiAoZmVhdHVyZUZ1bmN0aW9uc1t6b29tXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgZmVhdHVyZUZ1bmN0aW9uc1t6b29tXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgem9vbSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogcGFyYW1ldGVycy50eXBlLFxuICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eTogcGFyYW1ldGVycy5wcm9wZXJ0eSxcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogcGFyYW1ldGVycy5kZWZhdWx0LFxuICAgICAgICAgICAgICAgICAgICBzdG9wczogW11cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHpvb21TdG9wcy5wdXNoKHpvb20pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmVhdHVyZUZ1bmN0aW9uc1t6b29tXS5zdG9wcy5wdXNoKFtzdG9wWzBdLnZhbHVlLCBzdG9wWzFdXSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmZWF0dXJlRnVuY3Rpb25TdG9wcyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHogb2Ygem9vbVN0b3BzKSB7XG4gICAgICAgICAgICBmZWF0dXJlRnVuY3Rpb25TdG9wcy5wdXNoKFtmZWF0dXJlRnVuY3Rpb25zW3pdLnpvb20sIGNyZWF0ZUZ1bmN0aW9uKGZlYXR1cmVGdW5jdGlvbnNbel0sIHByb3BlcnR5U3BlYyldKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBraW5kOiAnY29tcG9zaXRlJyxcbiAgICAgICAgICAgIGludGVycG9sYXRpb25GYWN0b3I6IEludGVycG9sYXRlLmludGVycG9sYXRpb25GYWN0b3IuYmluZCh1bmRlZmluZWQsIHtuYW1lOiAnbGluZWFyJ30pLFxuICAgICAgICAgICAgem9vbVN0b3BzOiBmZWF0dXJlRnVuY3Rpb25TdG9wcy5tYXAocyA9PiBzWzBdKSxcbiAgICAgICAgICAgIGV2YWx1YXRlKHt6b29tfSwgcHJvcGVydGllcykge1xuICAgICAgICAgICAgICAgIHJldHVybiBldmFsdWF0ZUV4cG9uZW50aWFsRnVuY3Rpb24oe1xuICAgICAgICAgICAgICAgICAgICBzdG9wczogZmVhdHVyZUZ1bmN0aW9uU3RvcHMsXG4gICAgICAgICAgICAgICAgICAgIGJhc2U6IHBhcmFtZXRlcnMuYmFzZVxuICAgICAgICAgICAgICAgIH0sIHByb3BlcnR5U3BlYywgem9vbSkuZXZhbHVhdGUoem9vbSwgcHJvcGVydGllcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfSBlbHNlIGlmICh6b29tRGVwZW5kZW50KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBraW5kOiAnY2FtZXJhJyxcbiAgICAgICAgICAgIGludGVycG9sYXRpb25GYWN0b3I6IHR5cGUgPT09ICdleHBvbmVudGlhbCcgP1xuICAgICAgICAgICAgICAgIEludGVycG9sYXRlLmludGVycG9sYXRpb25GYWN0b3IuYmluZCh1bmRlZmluZWQsIHtuYW1lOiAnZXhwb25lbnRpYWwnLCBiYXNlOiBwYXJhbWV0ZXJzLmJhc2UgIT09IHVuZGVmaW5lZCA/IHBhcmFtZXRlcnMuYmFzZSA6IDF9KSA6XG4gICAgICAgICAgICAgICAgKCkgPT4gMCxcbiAgICAgICAgICAgIHpvb21TdG9wczogcGFyYW1ldGVycy5zdG9wcy5tYXAocyA9PiBzWzBdKSxcbiAgICAgICAgICAgIGV2YWx1YXRlOiAoe3pvb219KSA9PiBpbm5lckZ1bihwYXJhbWV0ZXJzLCBwcm9wZXJ0eVNwZWMsIHpvb20sIGhhc2hlZFN0b3BzLCBjYXRlZ29yaWNhbEtleVR5cGUpXG4gICAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGtpbmQ6ICdzb3VyY2UnLFxuICAgICAgICAgICAgZXZhbHVhdGUoXywgZmVhdHVyZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZmVhdHVyZSAmJiBmZWF0dXJlLnByb3BlcnRpZXMgPyBmZWF0dXJlLnByb3BlcnRpZXNbcGFyYW1ldGVycy5wcm9wZXJ0eV0gOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvYWxlc2NlKHBhcmFtZXRlcnMuZGVmYXVsdCwgcHJvcGVydHlTcGVjLmRlZmF1bHQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gaW5uZXJGdW4ocGFyYW1ldGVycywgcHJvcGVydHlTcGVjLCB2YWx1ZSwgaGFzaGVkU3RvcHMsIGNhdGVnb3JpY2FsS2V5VHlwZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxufVxuXG5mdW5jdGlvbiBjb2FsZXNjZShhLCBiLCBjKSB7XG4gICAgaWYgKGEgIT09IHVuZGVmaW5lZCkgcmV0dXJuIGE7XG4gICAgaWYgKGIgIT09IHVuZGVmaW5lZCkgcmV0dXJuIGI7XG4gICAgaWYgKGMgIT09IHVuZGVmaW5lZCkgcmV0dXJuIGM7XG59XG5cbmZ1bmN0aW9uIGV2YWx1YXRlQ2F0ZWdvcmljYWxGdW5jdGlvbihwYXJhbWV0ZXJzLCBwcm9wZXJ0eVNwZWMsIGlucHV0LCBoYXNoZWRTdG9wcywga2V5VHlwZSkge1xuICAgIGNvbnN0IGV2YWx1YXRlZCA9IHR5cGVvZiBpbnB1dCA9PT0ga2V5VHlwZSA/IGhhc2hlZFN0b3BzW2lucHV0XSA6IHVuZGVmaW5lZDsgLy8gRW5mb3JjZSBzdHJpY3QgdHlwaW5nIG9uIGlucHV0XG4gICAgcmV0dXJuIGNvYWxlc2NlKGV2YWx1YXRlZCwgcGFyYW1ldGVycy5kZWZhdWx0LCBwcm9wZXJ0eVNwZWMuZGVmYXVsdCk7XG59XG5cbmZ1bmN0aW9uIGV2YWx1YXRlSW50ZXJ2YWxGdW5jdGlvbihwYXJhbWV0ZXJzLCBwcm9wZXJ0eVNwZWMsIGlucHV0KSB7XG4gICAgLy8gRWRnZSBjYXNlc1xuICAgIGlmIChnZXRUeXBlKGlucHV0KSAhPT0gJ251bWJlcicpIHJldHVybiBjb2FsZXNjZShwYXJhbWV0ZXJzLmRlZmF1bHQsIHByb3BlcnR5U3BlYy5kZWZhdWx0KTtcbiAgICBjb25zdCBuID0gcGFyYW1ldGVycy5zdG9wcy5sZW5ndGg7XG4gICAgaWYgKG4gPT09IDEpIHJldHVybiBwYXJhbWV0ZXJzLnN0b3BzWzBdWzFdO1xuICAgIGlmIChpbnB1dCA8PSBwYXJhbWV0ZXJzLnN0b3BzWzBdWzBdKSByZXR1cm4gcGFyYW1ldGVycy5zdG9wc1swXVsxXTtcbiAgICBpZiAoaW5wdXQgPj0gcGFyYW1ldGVycy5zdG9wc1tuIC0gMV1bMF0pIHJldHVybiBwYXJhbWV0ZXJzLnN0b3BzW24gLSAxXVsxXTtcblxuICAgIGNvbnN0IGluZGV4ID0gZmluZFN0b3BMZXNzVGhhbk9yRXF1YWxUbyhwYXJhbWV0ZXJzLnN0b3BzLCBpbnB1dCk7XG5cbiAgICByZXR1cm4gcGFyYW1ldGVycy5zdG9wc1tpbmRleF1bMV07XG59XG5cbmZ1bmN0aW9uIGV2YWx1YXRlRXhwb25lbnRpYWxGdW5jdGlvbihwYXJhbWV0ZXJzLCBwcm9wZXJ0eVNwZWMsIGlucHV0KSB7XG4gICAgY29uc3QgYmFzZSA9IHBhcmFtZXRlcnMuYmFzZSAhPT0gdW5kZWZpbmVkID8gcGFyYW1ldGVycy5iYXNlIDogMTtcblxuICAgIC8vIEVkZ2UgY2FzZXNcbiAgICBpZiAoZ2V0VHlwZShpbnB1dCkgIT09ICdudW1iZXInKSByZXR1cm4gY29hbGVzY2UocGFyYW1ldGVycy5kZWZhdWx0LCBwcm9wZXJ0eVNwZWMuZGVmYXVsdCk7XG4gICAgY29uc3QgbiA9IHBhcmFtZXRlcnMuc3RvcHMubGVuZ3RoO1xuICAgIGlmIChuID09PSAxKSByZXR1cm4gcGFyYW1ldGVycy5zdG9wc1swXVsxXTtcbiAgICBpZiAoaW5wdXQgPD0gcGFyYW1ldGVycy5zdG9wc1swXVswXSkgcmV0dXJuIHBhcmFtZXRlcnMuc3RvcHNbMF1bMV07XG4gICAgaWYgKGlucHV0ID49IHBhcmFtZXRlcnMuc3RvcHNbbiAtIDFdWzBdKSByZXR1cm4gcGFyYW1ldGVycy5zdG9wc1tuIC0gMV1bMV07XG5cbiAgICBjb25zdCBpbmRleCA9IGZpbmRTdG9wTGVzc1RoYW5PckVxdWFsVG8ocGFyYW1ldGVycy5zdG9wcywgaW5wdXQpO1xuICAgIGNvbnN0IHQgPSBpbnRlcnBvbGF0aW9uRmFjdG9yKFxuICAgICAgICBpbnB1dCwgYmFzZSxcbiAgICAgICAgcGFyYW1ldGVycy5zdG9wc1tpbmRleF1bMF0sXG4gICAgICAgIHBhcmFtZXRlcnMuc3RvcHNbaW5kZXggKyAxXVswXSk7XG5cbiAgICBjb25zdCBvdXRwdXRMb3dlciA9IHBhcmFtZXRlcnMuc3RvcHNbaW5kZXhdWzFdO1xuICAgIGNvbnN0IG91dHB1dFVwcGVyID0gcGFyYW1ldGVycy5zdG9wc1tpbmRleCArIDFdWzFdO1xuICAgIGxldCBpbnRlcnAgPSBpbnRlcnBvbGF0ZVtwcm9wZXJ0eVNwZWMudHlwZV0gfHwgaWRlbnRpdHlGdW5jdGlvbjsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBpbXBvcnQvbmFtZXNwYWNlXG5cbiAgICBpZiAocGFyYW1ldGVycy5jb2xvclNwYWNlICYmIHBhcmFtZXRlcnMuY29sb3JTcGFjZSAhPT0gJ3JnYicpIHtcbiAgICAgICAgY29uc3QgY29sb3JzcGFjZSA9IGNvbG9yU3BhY2VzW3BhcmFtZXRlcnMuY29sb3JTcGFjZV07IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgaW1wb3J0L25hbWVzcGFjZVxuICAgICAgICBpbnRlcnAgPSAoYSwgYikgPT4gY29sb3JzcGFjZS5yZXZlcnNlKGNvbG9yc3BhY2UuaW50ZXJwb2xhdGUoY29sb3JzcGFjZS5mb3J3YXJkKGEpLCBjb2xvcnNwYWNlLmZvcndhcmQoYiksIHQpKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG91dHB1dExvd2VyLmV2YWx1YXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBldmFsdWF0ZSguLi5hcmdzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXZhbHVhdGVkTG93ZXIgPSBvdXRwdXRMb3dlci5ldmFsdWF0ZS5hcHBseSh1bmRlZmluZWQsIGFyZ3MpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGV2YWx1YXRlZFVwcGVyID0gb3V0cHV0VXBwZXIuZXZhbHVhdGUuYXBwbHkodW5kZWZpbmVkLCBhcmdzKTtcbiAgICAgICAgICAgICAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIGZpbGwtb3V0bGluZS1jb2xvciwgd2hpY2ggaGFzIG5vIHNwZWMgZGVmYXVsdC5cbiAgICAgICAgICAgICAgICBpZiAoZXZhbHVhdGVkTG93ZXIgPT09IHVuZGVmaW5lZCB8fCBldmFsdWF0ZWRVcHBlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBpbnRlcnAoZXZhbHVhdGVkTG93ZXIsIGV2YWx1YXRlZFVwcGVyLCB0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gaW50ZXJwKG91dHB1dExvd2VyLCBvdXRwdXRVcHBlciwgdCk7XG59XG5cbmZ1bmN0aW9uIGV2YWx1YXRlSWRlbnRpdHlGdW5jdGlvbihwYXJhbWV0ZXJzLCBwcm9wZXJ0eVNwZWMsIGlucHV0KSB7XG4gICAgaWYgKHByb3BlcnR5U3BlYy50eXBlID09PSAnY29sb3InKSB7XG4gICAgICAgIGlucHV0ID0gQ29sb3IucGFyc2UoaW5wdXQpO1xuICAgIH0gZWxzZSBpZiAocHJvcGVydHlTcGVjLnR5cGUgPT09ICdmb3JtYXR0ZWQnKSB7XG4gICAgICAgIGlucHV0ID0gRm9ybWF0dGVkLmZyb21TdHJpbmcoaW5wdXQudG9TdHJpbmcoKSk7XG4gICAgfSBlbHNlIGlmIChnZXRUeXBlKGlucHV0KSAhPT0gcHJvcGVydHlTcGVjLnR5cGUgJiYgKHByb3BlcnR5U3BlYy50eXBlICE9PSAnZW51bScgfHwgIXByb3BlcnR5U3BlYy52YWx1ZXNbaW5wdXRdKSkge1xuICAgICAgICBpbnB1dCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIGNvYWxlc2NlKGlucHV0LCBwYXJhbWV0ZXJzLmRlZmF1bHQsIHByb3BlcnR5U3BlYy5kZWZhdWx0KTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbGFzdCBzdG9wIDw9IGlucHV0LCBvciAwIGlmIGl0IGRvZXNuJ3QgZXhpc3QuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gZmluZFN0b3BMZXNzVGhhbk9yRXF1YWxUbyhzdG9wcywgaW5wdXQpIHtcbiAgICBjb25zdCBuID0gc3RvcHMubGVuZ3RoO1xuICAgIGxldCBsb3dlckluZGV4ID0gMDtcbiAgICBsZXQgdXBwZXJJbmRleCA9IG4gLSAxO1xuICAgIGxldCBjdXJyZW50SW5kZXggPSAwO1xuICAgIGxldCBjdXJyZW50VmFsdWUsIHVwcGVyVmFsdWU7XG5cbiAgICB3aGlsZSAobG93ZXJJbmRleCA8PSB1cHBlckluZGV4KSB7XG4gICAgICAgIGN1cnJlbnRJbmRleCA9IE1hdGguZmxvb3IoKGxvd2VySW5kZXggKyB1cHBlckluZGV4KSAvIDIpO1xuICAgICAgICBjdXJyZW50VmFsdWUgPSBzdG9wc1tjdXJyZW50SW5kZXhdWzBdO1xuICAgICAgICB1cHBlclZhbHVlID0gc3RvcHNbY3VycmVudEluZGV4ICsgMV1bMF07XG4gICAgICAgIGlmIChpbnB1dCA9PT0gY3VycmVudFZhbHVlIHx8IGlucHV0ID4gY3VycmVudFZhbHVlICYmIGlucHV0IDwgdXBwZXJWYWx1ZSkgeyAvLyBTZWFyY2ggY29tcGxldGVcbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50SW5kZXg7XG4gICAgICAgIH0gZWxzZSBpZiAoY3VycmVudFZhbHVlIDwgaW5wdXQpIHtcbiAgICAgICAgICAgIGxvd2VySW5kZXggPSBjdXJyZW50SW5kZXggKyAxO1xuICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRWYWx1ZSA+IGlucHV0KSB7XG4gICAgICAgICAgICB1cHBlckluZGV4ID0gY3VycmVudEluZGV4IC0gMTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBNYXRoLm1heChjdXJyZW50SW5kZXggLSAxLCAwKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgcmF0aW8gdGhhdCBjYW4gYmUgdXNlZCB0byBpbnRlcnBvbGF0ZSBiZXR3ZWVuIGV4cG9uZW50aWFsIGZ1bmN0aW9uXG4gKiBzdG9wcy5cbiAqXG4gKiBIb3cgaXQgd29ya3M6XG4gKiBUd28gY29uc2VjdXRpdmUgc3RvcCB2YWx1ZXMgZGVmaW5lIGEgKHNjYWxlZCBhbmQgc2hpZnRlZCkgZXhwb25lbnRpYWxcbiAqIGZ1bmN0aW9uIGBmKHgpID0gYSAqIGJhc2VeeCArIGJgLCB3aGVyZSBgYmFzZWAgaXMgdGhlIHVzZXItc3BlY2lmaWVkIGJhc2UsXG4gKiBhbmQgYGFgIGFuZCBgYmAgYXJlIGNvbnN0YW50cyBhZmZvcmRpbmcgc3VmZmljaWVudCBkZWdyZWVzIG9mIGZyZWVkb20gdG8gZml0XG4gKiB0aGUgZnVuY3Rpb24gdG8gdGhlIGdpdmVuIHN0b3BzLlxuICpcbiAqIEhlcmUncyBhIGJpdCBvZiBhbGdlYnJhIHRoYXQgbGV0cyB1cyBjb21wdXRlIGBmKHgpYCBkaXJlY3RseSBmcm9tIHRoZSBzdG9wXG4gKiB2YWx1ZXMgd2l0aG91dCBleHBsaWNpdGx5IHNvbHZpbmcgZm9yIGBhYCBhbmQgYGJgOlxuICpcbiAqIEZpcnN0IHN0b3AgdmFsdWU6IGBmKHgwKSA9IHkwID0gYSAqIGJhc2VeeDAgKyBiYFxuICogU2Vjb25kIHN0b3AgdmFsdWU6IGBmKHgxKSA9IHkxID0gYSAqIGJhc2VeeDEgKyBiYFxuICogPT4gYHkxIC0geTAgPSBhKGJhc2VeeDEgLSBiYXNlXngwKWBcbiAqID0+IGBhID0gKHkxIC0geTApLyhiYXNlXngxIC0gYmFzZV54MClgXG4gKlxuICogRGVzaXJlZCB2YWx1ZTogYGYoeCkgPSB5ID0gYSAqIGJhc2VeeCArIGJgXG4gKiA9PiBgZih4KSA9IHkwICsgYSAqIChiYXNlXnggLSBiYXNlXngwKWBcbiAqXG4gKiBGcm9tIHRoZSBhYm92ZSwgd2UgY2FuIHJlcGxhY2UgdGhlIGBhYCBpbiBgYSAqIChiYXNlXnggLSBiYXNlXngwKWAgYW5kIGRvIGFcbiAqIGxpdHRsZSBhbGdlYnJhOlxuICogYGBgXG4gKiBhICogKGJhc2VeeCAtIGJhc2VeeDApID0gKHkxIC0geTApLyhiYXNlXngxIC0gYmFzZV54MCkgKiAoYmFzZV54IC0gYmFzZV54MClcbiAqICAgICAgICAgICAgICAgICAgICAgPSAoeTEgLSB5MCkgKiAoYmFzZV54IC0gYmFzZV54MCkgLyAoYmFzZV54MSAtIGJhc2VeeDApXG4gKiBgYGBcbiAqXG4gKiBJZiB3ZSBsZXQgYChiYXNlXnggLSBiYXNlXngwKSAvIChiYXNlXngxIGJhc2VeeDApYCwgdGhlbiB3ZSBoYXZlXG4gKiBgZih4KSA9IHkwICsgKHkxIC0geTApICogcmF0aW9gLiAgSW4gb3RoZXIgd29yZHMsIGByYXRpb2AgbWF5IGJlIHRyZWF0ZWQgYXNcbiAqIGFuIGludGVycG9sYXRpb24gZmFjdG9yIGJldHdlZW4gdGhlIHR3byBzdG9wcycgb3V0cHV0IHZhbHVlcy5cbiAqXG4gKiAoTm90ZTogYSBzbGlnaHRseSBkaWZmZXJlbnQgZm9ybSBmb3IgYHJhdGlvYCxcbiAqIGAoYmFzZV4oeC14MCkgLSAxKSAvIChiYXNlXih4MS14MCkgLSAxKSBgLCBpcyBlcXVpdmFsZW50LCBidXQgcmVxdWlyZXMgZmV3ZXJcbiAqIGV4cGVuc2l2ZSBgTWF0aC5wb3coKWAgb3BlcmF0aW9ucy4pXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gaW50ZXJwb2xhdGlvbkZhY3RvcihpbnB1dCwgYmFzZSwgbG93ZXJWYWx1ZSwgdXBwZXJWYWx1ZSkge1xuICAgIGNvbnN0IGRpZmZlcmVuY2UgPSB1cHBlclZhbHVlIC0gbG93ZXJWYWx1ZTtcbiAgICBjb25zdCBwcm9ncmVzcyA9IGlucHV0IC0gbG93ZXJWYWx1ZTtcblxuICAgIGlmIChkaWZmZXJlbmNlID09PSAwKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH0gZWxzZSBpZiAoYmFzZSA9PT0gMSkge1xuICAgICAgICByZXR1cm4gcHJvZ3Jlc3MgLyBkaWZmZXJlbmNlO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiAoTWF0aC5wb3coYmFzZSwgcHJvZ3Jlc3MpIC0gMSkgLyAoTWF0aC5wb3coYmFzZSwgZGlmZmVyZW5jZSkgLSAxKTtcbiAgICB9XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5cbmltcG9ydCBleHRlbmQgZnJvbSAnLi4vdXRpbC9leHRlbmQnO1xuaW1wb3J0IFBhcnNpbmdFcnJvciBmcm9tICcuL3BhcnNpbmdfZXJyb3InO1xuaW1wb3J0IFBhcnNpbmdDb250ZXh0IGZyb20gJy4vcGFyc2luZ19jb250ZXh0JztcbmltcG9ydCBFdmFsdWF0aW9uQ29udGV4dCBmcm9tICcuL2V2YWx1YXRpb25fY29udGV4dCc7XG5pbXBvcnQgQ29tcG91bmRFeHByZXNzaW9uIGZyb20gJy4vY29tcG91bmRfZXhwcmVzc2lvbic7XG5pbXBvcnQgU3RlcCBmcm9tICcuL2RlZmluaXRpb25zL3N0ZXAnO1xuaW1wb3J0IEludGVycG9sYXRlIGZyb20gJy4vZGVmaW5pdGlvbnMvaW50ZXJwb2xhdGUnO1xuaW1wb3J0IENvYWxlc2NlIGZyb20gJy4vZGVmaW5pdGlvbnMvY29hbGVzY2UnO1xuaW1wb3J0IExldCBmcm9tICcuL2RlZmluaXRpb25zL2xldCc7XG5pbXBvcnQgZGVmaW5pdGlvbnMgZnJvbSAnLi9kZWZpbml0aW9ucyc7XG5pbXBvcnQgKiBhcyBpc0NvbnN0YW50IGZyb20gJy4vaXNfY29uc3RhbnQnO1xuaW1wb3J0IFJ1bnRpbWVFcnJvciBmcm9tICcuL3J1bnRpbWVfZXJyb3InO1xuaW1wb3J0IHsgc3VjY2VzcywgZXJyb3IgfSBmcm9tICcuLi91dGlsL3Jlc3VsdCc7XG5pbXBvcnQgeyBzdXBwb3J0c1Byb3BlcnR5RXhwcmVzc2lvbiwgc3VwcG9ydHNab29tRXhwcmVzc2lvbiwgc3VwcG9ydHNJbnRlcnBvbGF0aW9uIH0gZnJvbSAnLi4vdXRpbC9wcm9wZXJ0aWVzJztcblxuaW1wb3J0IHR5cGUge1R5cGUsIEV2YWx1YXRpb25LaW5kfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB0eXBlIHtWYWx1ZX0gZnJvbSAnLi92YWx1ZXMnO1xuaW1wb3J0IHR5cGUge0V4cHJlc3Npb259IGZyb20gJy4vZXhwcmVzc2lvbic7XG5pbXBvcnQgdHlwZSB7U3R5bGVQcm9wZXJ0eVNwZWNpZmljYXRpb259IGZyb20gJy4uL3N0eWxlLXNwZWMnO1xuaW1wb3J0IHR5cGUge1Jlc3VsdH0gZnJvbSAnLi4vdXRpbC9yZXN1bHQnO1xuaW1wb3J0IHR5cGUge0ludGVycG9sYXRpb25UeXBlfSBmcm9tICcuL2RlZmluaXRpb25zL2ludGVycG9sYXRlJztcbmltcG9ydCB0eXBlIHtQcm9wZXJ0eVZhbHVlU3BlY2lmaWNhdGlvbn0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgdHlwZSBGZWF0dXJlID0ge1xuICAgICt0eXBlOiAxIHwgMiB8IDMgfCAnVW5rbm93bicgfCAnUG9pbnQnIHwgJ011bHRpUG9pbnQnIHwgJ0xpbmVTdHJpbmcnIHwgJ011bHRpTGluZVN0cmluZycgfCAnUG9seWdvbicgfCAnTXVsdGlQb2x5Z29uJyxcbiAgICAraWQ/OiBhbnksXG4gICAgK3Byb3BlcnRpZXM6IHtbc3RyaW5nXTogYW55fSxcbiAgICArcGF0dGVybnM/OiB7W3N0cmluZ106IHtcIm1pblwiOiBzdHJpbmcsIFwibWlkXCI6IHN0cmluZywgXCJtYXhcIjogc3RyaW5nfX1cbn07XG5cbmV4cG9ydCB0eXBlIEZlYXR1cmVTdGF0ZSA9IHtbc3RyaW5nXTogYW55fTtcblxuZXhwb3J0IHR5cGUgR2xvYmFsUHJvcGVydGllcyA9ICRSZWFkT25seTx7XG4gICAgem9vbTogbnVtYmVyLFxuICAgIGhlYXRtYXBEZW5zaXR5PzogbnVtYmVyLFxuICAgIGxpbmVQcm9ncmVzcz86IG51bWJlcixcbiAgICBpc1N1cHBvcnRlZFNjcmlwdD86IChzdHJpbmcpID0+IGJvb2xlYW4sXG4gICAgYWNjdW11bGF0ZWQ/OiBWYWx1ZVxufT47XG5cbmV4cG9ydCBjbGFzcyBTdHlsZUV4cHJlc3Npb24ge1xuICAgIGV4cHJlc3Npb246IEV4cHJlc3Npb247XG5cbiAgICBfZXZhbHVhdG9yOiBFdmFsdWF0aW9uQ29udGV4dDtcbiAgICBfZGVmYXVsdFZhbHVlOiBWYWx1ZTtcbiAgICBfd2FybmluZ0hpc3Rvcnk6IHtba2V5OiBzdHJpbmddOiBib29sZWFufTtcbiAgICBfZW51bVZhbHVlczogP3tbc3RyaW5nXTogYW55fTtcblxuICAgIGNvbnN0cnVjdG9yKGV4cHJlc3Npb246IEV4cHJlc3Npb24sIHByb3BlcnR5U3BlYzogP1N0eWxlUHJvcGVydHlTcGVjaWZpY2F0aW9uKSB7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbiA9IGV4cHJlc3Npb247XG4gICAgICAgIHRoaXMuX3dhcm5pbmdIaXN0b3J5ID0ge307XG4gICAgICAgIHRoaXMuX2V2YWx1YXRvciA9IG5ldyBFdmFsdWF0aW9uQ29udGV4dCgpO1xuICAgICAgICB0aGlzLl9kZWZhdWx0VmFsdWUgPSBwcm9wZXJ0eVNwZWMgPyBnZXREZWZhdWx0VmFsdWUocHJvcGVydHlTcGVjKSA6IG51bGw7XG4gICAgICAgIHRoaXMuX2VudW1WYWx1ZXMgPSBwcm9wZXJ0eVNwZWMgJiYgcHJvcGVydHlTcGVjLnR5cGUgPT09ICdlbnVtJyA/IHByb3BlcnR5U3BlYy52YWx1ZXMgOiBudWxsO1xuICAgIH1cblxuICAgIGV2YWx1YXRlV2l0aG91dEVycm9ySGFuZGxpbmcoZ2xvYmFsczogR2xvYmFsUHJvcGVydGllcywgZmVhdHVyZT86IEZlYXR1cmUsIGZlYXR1cmVTdGF0ZT86IEZlYXR1cmVTdGF0ZSk6IGFueSB7XG4gICAgICAgIHRoaXMuX2V2YWx1YXRvci5nbG9iYWxzID0gZ2xvYmFscztcbiAgICAgICAgdGhpcy5fZXZhbHVhdG9yLmZlYXR1cmUgPSBmZWF0dXJlO1xuICAgICAgICB0aGlzLl9ldmFsdWF0b3IuZmVhdHVyZVN0YXRlID0gZmVhdHVyZVN0YXRlO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmV4cHJlc3Npb24uZXZhbHVhdGUodGhpcy5fZXZhbHVhdG9yKTtcbiAgICB9XG5cbiAgICBldmFsdWF0ZShnbG9iYWxzOiBHbG9iYWxQcm9wZXJ0aWVzLCBmZWF0dXJlPzogRmVhdHVyZSwgZmVhdHVyZVN0YXRlPzogRmVhdHVyZVN0YXRlKTogYW55IHtcbiAgICAgICAgdGhpcy5fZXZhbHVhdG9yLmdsb2JhbHMgPSBnbG9iYWxzO1xuICAgICAgICB0aGlzLl9ldmFsdWF0b3IuZmVhdHVyZSA9IGZlYXR1cmUgfHwgbnVsbDtcbiAgICAgICAgdGhpcy5fZXZhbHVhdG9yLmZlYXR1cmVTdGF0ZSA9IGZlYXR1cmVTdGF0ZSB8fCBudWxsO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB2YWwgPSB0aGlzLmV4cHJlc3Npb24uZXZhbHVhdGUodGhpcy5fZXZhbHVhdG9yKTtcbiAgICAgICAgICAgIGlmICh2YWwgPT09IG51bGwgfHwgdmFsID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZGVmYXVsdFZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuX2VudW1WYWx1ZXMgJiYgISh2YWwgaW4gdGhpcy5fZW51bVZhbHVlcykpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUVycm9yKGBFeHBlY3RlZCB2YWx1ZSB0byBiZSBvbmUgb2YgJHtPYmplY3Qua2V5cyh0aGlzLl9lbnVtVmFsdWVzKS5tYXAodiA9PiBKU09OLnN0cmluZ2lmeSh2KSkuam9pbignLCAnKX0sIGJ1dCBmb3VuZCAke0pTT04uc3RyaW5naWZ5KHZhbCl9IGluc3RlYWQuYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdmFsO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX3dhcm5pbmdIaXN0b3J5W2UubWVzc2FnZV0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLl93YXJuaW5nSGlzdG9yeVtlLm1lc3NhZ2VdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihlLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9kZWZhdWx0VmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0V4cHJlc3Npb24oZXhwcmVzc2lvbjogbWl4ZWQpIHtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheShleHByZXNzaW9uKSAmJiBleHByZXNzaW9uLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgdHlwZW9mIGV4cHJlc3Npb25bMF0gPT09ICdzdHJpbmcnICYmIGV4cHJlc3Npb25bMF0gaW4gZGVmaW5pdGlvbnM7XG59XG5cbi8qKlxuICogUGFyc2UgYW5kIHR5cGVjaGVjayB0aGUgZ2l2ZW4gc3R5bGUgc3BlYyBKU09OIGV4cHJlc3Npb24uICBJZlxuICogb3B0aW9ucy5kZWZhdWx0VmFsdWUgaXMgcHJvdmlkZWQsIHRoZW4gdGhlIHJlc3VsdGluZyBTdHlsZUV4cHJlc3Npb24nc1xuICogYGV2YWx1YXRlKClgIG1ldGhvZCB3aWxsIGhhbmRsZSBlcnJvcnMgYnkgbG9nZ2luZyBhIHdhcm5pbmcgKG9uY2UgcGVyXG4gKiBtZXNzYWdlKSBhbmQgcmV0dXJuaW5nIHRoZSBkZWZhdWx0IHZhbHVlLiAgT3RoZXJ3aXNlLCBpdCB3aWxsIHRocm93XG4gKiBldmFsdWF0aW9uIGVycm9ycy5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRXhwcmVzc2lvbihleHByZXNzaW9uOiBtaXhlZCwgcHJvcGVydHlTcGVjOiA/U3R5bGVQcm9wZXJ0eVNwZWNpZmljYXRpb24pOiBSZXN1bHQ8U3R5bGVFeHByZXNzaW9uLCBBcnJheTxQYXJzaW5nRXJyb3I+PiB7XG4gICAgY29uc3QgcGFyc2VyID0gbmV3IFBhcnNpbmdDb250ZXh0KGRlZmluaXRpb25zLCBbXSwgcHJvcGVydHlTcGVjID8gZ2V0RXhwZWN0ZWRUeXBlKHByb3BlcnR5U3BlYykgOiB1bmRlZmluZWQpO1xuXG4gICAgLy8gRm9yIHN0cmluZy12YWx1ZWQgcHJvcGVydGllcywgY29lcmNlIHRvIHN0cmluZyBhdCB0aGUgdG9wIGxldmVsIHJhdGhlciB0aGFuIGFzc2VydGluZy5cbiAgICBjb25zdCBwYXJzZWQgPSBwYXJzZXIucGFyc2UoZXhwcmVzc2lvbiwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCxcbiAgICAgICAgcHJvcGVydHlTcGVjICYmIHByb3BlcnR5U3BlYy50eXBlID09PSAnc3RyaW5nJyA/IHt0eXBlQW5ub3RhdGlvbjogJ2NvZXJjZSd9IDogdW5kZWZpbmVkKTtcblxuICAgIGlmICghcGFyc2VkKSB7XG4gICAgICAgIGFzc2VydChwYXJzZXIuZXJyb3JzLmxlbmd0aCA+IDApO1xuICAgICAgICByZXR1cm4gZXJyb3IocGFyc2VyLmVycm9ycyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN1Y2Nlc3MobmV3IFN0eWxlRXhwcmVzc2lvbihwYXJzZWQsIHByb3BlcnR5U3BlYykpO1xufVxuXG5leHBvcnQgY2xhc3MgWm9vbUNvbnN0YW50RXhwcmVzc2lvbjxLaW5kOiBFdmFsdWF0aW9uS2luZD4ge1xuICAgIGtpbmQ6IEtpbmQ7XG4gICAgaXNTdGF0ZURlcGVuZGVudDogYm9vbGVhbjtcbiAgICBfc3R5bGVFeHByZXNzaW9uOiBTdHlsZUV4cHJlc3Npb247XG5cbiAgICBjb25zdHJ1Y3RvcihraW5kOiBLaW5kLCBleHByZXNzaW9uOiBTdHlsZUV4cHJlc3Npb24pIHtcbiAgICAgICAgdGhpcy5raW5kID0ga2luZDtcbiAgICAgICAgdGhpcy5fc3R5bGVFeHByZXNzaW9uID0gZXhwcmVzc2lvbjtcbiAgICAgICAgdGhpcy5pc1N0YXRlRGVwZW5kZW50ID0ga2luZCAhPT0gKCdjb25zdGFudCc6IEV2YWx1YXRpb25LaW5kKSAmJiAhaXNDb25zdGFudC5pc1N0YXRlQ29uc3RhbnQoZXhwcmVzc2lvbi5leHByZXNzaW9uKTtcbiAgICB9XG5cbiAgICBldmFsdWF0ZVdpdGhvdXRFcnJvckhhbmRsaW5nKGdsb2JhbHM6IEdsb2JhbFByb3BlcnRpZXMsIGZlYXR1cmU/OiBGZWF0dXJlLCBmZWF0dXJlU3RhdGU/OiBGZWF0dXJlU3RhdGUpOiBhbnkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3R5bGVFeHByZXNzaW9uLmV2YWx1YXRlV2l0aG91dEVycm9ySGFuZGxpbmcoZ2xvYmFscywgZmVhdHVyZSwgZmVhdHVyZVN0YXRlKTtcbiAgICB9XG5cbiAgICBldmFsdWF0ZShnbG9iYWxzOiBHbG9iYWxQcm9wZXJ0aWVzLCBmZWF0dXJlPzogRmVhdHVyZSwgZmVhdHVyZVN0YXRlPzogRmVhdHVyZVN0YXRlKTogYW55IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0eWxlRXhwcmVzc2lvbi5ldmFsdWF0ZShnbG9iYWxzLCBmZWF0dXJlLCBmZWF0dXJlU3RhdGUpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFpvb21EZXBlbmRlbnRFeHByZXNzaW9uPEtpbmQ6IEV2YWx1YXRpb25LaW5kPiB7XG4gICAga2luZDogS2luZDtcbiAgICB6b29tU3RvcHM6IEFycmF5PG51bWJlcj47XG4gICAgaXNTdGF0ZURlcGVuZGVudDogYm9vbGVhbjtcblxuICAgIF9zdHlsZUV4cHJlc3Npb246IFN0eWxlRXhwcmVzc2lvbjtcbiAgICBfaW50ZXJwb2xhdGlvblR5cGU6ID9JbnRlcnBvbGF0aW9uVHlwZTtcblxuICAgIGNvbnN0cnVjdG9yKGtpbmQ6IEtpbmQsIGV4cHJlc3Npb246IFN0eWxlRXhwcmVzc2lvbiwgem9vbUN1cnZlOiBTdGVwIHwgSW50ZXJwb2xhdGUpIHtcbiAgICAgICAgdGhpcy5raW5kID0ga2luZDtcbiAgICAgICAgdGhpcy56b29tU3RvcHMgPSB6b29tQ3VydmUubGFiZWxzO1xuICAgICAgICB0aGlzLl9zdHlsZUV4cHJlc3Npb24gPSBleHByZXNzaW9uO1xuICAgICAgICB0aGlzLmlzU3RhdGVEZXBlbmRlbnQgPSBraW5kICE9PSAoJ2NhbWVyYSc6IEV2YWx1YXRpb25LaW5kKSAmJiAhaXNDb25zdGFudC5pc1N0YXRlQ29uc3RhbnQoZXhwcmVzc2lvbi5leHByZXNzaW9uKTtcbiAgICAgICAgaWYgKHpvb21DdXJ2ZSBpbnN0YW5jZW9mIEludGVycG9sYXRlKSB7XG4gICAgICAgICAgICB0aGlzLl9pbnRlcnBvbGF0aW9uVHlwZSA9IHpvb21DdXJ2ZS5pbnRlcnBvbGF0aW9uO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZXZhbHVhdGVXaXRob3V0RXJyb3JIYW5kbGluZyhnbG9iYWxzOiBHbG9iYWxQcm9wZXJ0aWVzLCBmZWF0dXJlPzogRmVhdHVyZSwgZmVhdHVyZVN0YXRlPzogRmVhdHVyZVN0YXRlKTogYW55IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0eWxlRXhwcmVzc2lvbi5ldmFsdWF0ZVdpdGhvdXRFcnJvckhhbmRsaW5nKGdsb2JhbHMsIGZlYXR1cmUsIGZlYXR1cmVTdGF0ZSk7XG4gICAgfVxuXG4gICAgZXZhbHVhdGUoZ2xvYmFsczogR2xvYmFsUHJvcGVydGllcywgZmVhdHVyZT86IEZlYXR1cmUsIGZlYXR1cmVTdGF0ZT86IEZlYXR1cmVTdGF0ZSk6IGFueSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdHlsZUV4cHJlc3Npb24uZXZhbHVhdGUoZ2xvYmFscywgZmVhdHVyZSwgZmVhdHVyZVN0YXRlKTtcbiAgICB9XG5cbiAgICBpbnRlcnBvbGF0aW9uRmFjdG9yKGlucHV0OiBudW1iZXIsIGxvd2VyOiBudW1iZXIsIHVwcGVyOiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICBpZiAodGhpcy5faW50ZXJwb2xhdGlvblR5cGUpIHtcbiAgICAgICAgICAgIHJldHVybiBJbnRlcnBvbGF0ZS5pbnRlcnBvbGF0aW9uRmFjdG9yKHRoaXMuX2ludGVycG9sYXRpb25UeXBlLCBpbnB1dCwgbG93ZXIsIHVwcGVyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgdHlwZSBDb25zdGFudEV4cHJlc3Npb24gPSB7XG4gICAga2luZDogJ2NvbnN0YW50JyxcbiAgICArZXZhbHVhdGU6IChnbG9iYWxzOiBHbG9iYWxQcm9wZXJ0aWVzLCBmZWF0dXJlPzogRmVhdHVyZSkgPT4gYW55LFxufVxuXG5leHBvcnQgdHlwZSBTb3VyY2VFeHByZXNzaW9uID0ge1xuICAgIGtpbmQ6ICdzb3VyY2UnLFxuICAgIGlzU3RhdGVEZXBlbmRlbnQ6IGJvb2xlYW4sXG4gICAgK2V2YWx1YXRlOiAoZ2xvYmFsczogR2xvYmFsUHJvcGVydGllcywgZmVhdHVyZT86IEZlYXR1cmUsIGZlYXR1cmVTdGF0ZT86IEZlYXR1cmVTdGF0ZSkgPT4gYW55LFxufTtcblxuZXhwb3J0IHR5cGUgQ2FtZXJhRXhwcmVzc2lvbiA9IHtcbiAgICBraW5kOiAnY2FtZXJhJyxcbiAgICArZXZhbHVhdGU6IChnbG9iYWxzOiBHbG9iYWxQcm9wZXJ0aWVzLCBmZWF0dXJlPzogRmVhdHVyZSwgZmVhdHVyZVN0YXRlPzogRmVhdHVyZVN0YXRlKSA9PiBhbnksXG4gICAgK2ludGVycG9sYXRpb25GYWN0b3I6IChpbnB1dDogbnVtYmVyLCBsb3dlcjogbnVtYmVyLCB1cHBlcjogbnVtYmVyKSA9PiBudW1iZXIsXG4gICAgem9vbVN0b3BzOiBBcnJheTxudW1iZXI+XG59O1xuXG5leHBvcnQgdHlwZSBDb21wb3NpdGVFeHByZXNzaW9uID0ge1xuICAgIGtpbmQ6ICdjb21wb3NpdGUnLFxuICAgIGlzU3RhdGVEZXBlbmRlbnQ6IGJvb2xlYW4sXG4gICAgK2V2YWx1YXRlOiAoZ2xvYmFsczogR2xvYmFsUHJvcGVydGllcywgZmVhdHVyZT86IEZlYXR1cmUsIGZlYXR1cmVTdGF0ZT86IEZlYXR1cmVTdGF0ZSkgPT4gYW55LFxuICAgICtpbnRlcnBvbGF0aW9uRmFjdG9yOiAoaW5wdXQ6IG51bWJlciwgbG93ZXI6IG51bWJlciwgdXBwZXI6IG51bWJlcikgPT4gbnVtYmVyLFxuICAgIHpvb21TdG9wczogQXJyYXk8bnVtYmVyPlxufTtcblxuZXhwb3J0IHR5cGUgU3R5bGVQcm9wZXJ0eUV4cHJlc3Npb24gPVxuICAgIHwgQ29uc3RhbnRFeHByZXNzaW9uXG4gICAgfCBTb3VyY2VFeHByZXNzaW9uXG4gICAgfCBDYW1lcmFFeHByZXNzaW9uXG4gICAgfCBDb21wb3NpdGVFeHByZXNzaW9uO1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUHJvcGVydHlFeHByZXNzaW9uKGV4cHJlc3Npb246IG1peGVkLCBwcm9wZXJ0eVNwZWM6IFN0eWxlUHJvcGVydHlTcGVjaWZpY2F0aW9uKTogUmVzdWx0PFN0eWxlUHJvcGVydHlFeHByZXNzaW9uLCBBcnJheTxQYXJzaW5nRXJyb3I+PiB7XG4gICAgZXhwcmVzc2lvbiA9IGNyZWF0ZUV4cHJlc3Npb24oZXhwcmVzc2lvbiwgcHJvcGVydHlTcGVjKTtcbiAgICBpZiAoZXhwcmVzc2lvbi5yZXN1bHQgPT09ICdlcnJvcicpIHtcbiAgICAgICAgcmV0dXJuIGV4cHJlc3Npb247XG4gICAgfVxuXG4gICAgY29uc3QgcGFyc2VkID0gZXhwcmVzc2lvbi52YWx1ZS5leHByZXNzaW9uO1xuXG4gICAgY29uc3QgaXNGZWF0dXJlQ29uc3RhbnQgPSBpc0NvbnN0YW50LmlzRmVhdHVyZUNvbnN0YW50KHBhcnNlZCk7XG4gICAgaWYgKCFpc0ZlYXR1cmVDb25zdGFudCAmJiAhc3VwcG9ydHNQcm9wZXJ0eUV4cHJlc3Npb24ocHJvcGVydHlTcGVjKSkge1xuICAgICAgICByZXR1cm4gZXJyb3IoW25ldyBQYXJzaW5nRXJyb3IoJycsICdkYXRhIGV4cHJlc3Npb25zIG5vdCBzdXBwb3J0ZWQnKV0pO1xuICAgIH1cblxuICAgIGNvbnN0IGlzWm9vbUNvbnN0YW50ID0gaXNDb25zdGFudC5pc0dsb2JhbFByb3BlcnR5Q29uc3RhbnQocGFyc2VkLCBbJ3pvb20nXSk7XG4gICAgaWYgKCFpc1pvb21Db25zdGFudCAmJiAhc3VwcG9ydHNab29tRXhwcmVzc2lvbihwcm9wZXJ0eVNwZWMpKSB7XG4gICAgICAgIHJldHVybiBlcnJvcihbbmV3IFBhcnNpbmdFcnJvcignJywgJ3pvb20gZXhwcmVzc2lvbnMgbm90IHN1cHBvcnRlZCcpXSk7XG4gICAgfVxuXG4gICAgY29uc3Qgem9vbUN1cnZlID0gZmluZFpvb21DdXJ2ZShwYXJzZWQpO1xuICAgIGlmICghem9vbUN1cnZlICYmICFpc1pvb21Db25zdGFudCkge1xuICAgICAgICByZXR1cm4gZXJyb3IoW25ldyBQYXJzaW5nRXJyb3IoJycsICdcInpvb21cIiBleHByZXNzaW9uIG1heSBvbmx5IGJlIHVzZWQgYXMgaW5wdXQgdG8gYSB0b3AtbGV2ZWwgXCJzdGVwXCIgb3IgXCJpbnRlcnBvbGF0ZVwiIGV4cHJlc3Npb24uJyldKTtcbiAgICB9IGVsc2UgaWYgKHpvb21DdXJ2ZSBpbnN0YW5jZW9mIFBhcnNpbmdFcnJvcikge1xuICAgICAgICByZXR1cm4gZXJyb3IoW3pvb21DdXJ2ZV0pO1xuICAgIH0gZWxzZSBpZiAoem9vbUN1cnZlIGluc3RhbmNlb2YgSW50ZXJwb2xhdGUgJiYgIXN1cHBvcnRzSW50ZXJwb2xhdGlvbihwcm9wZXJ0eVNwZWMpKSB7XG4gICAgICAgIHJldHVybiBlcnJvcihbbmV3IFBhcnNpbmdFcnJvcignJywgJ1wiaW50ZXJwb2xhdGVcIiBleHByZXNzaW9ucyBjYW5ub3QgYmUgdXNlZCB3aXRoIHRoaXMgcHJvcGVydHknKV0pO1xuICAgIH1cblxuICAgIGlmICghem9vbUN1cnZlKSB7XG4gICAgICAgIHJldHVybiBzdWNjZXNzKGlzRmVhdHVyZUNvbnN0YW50ID9cbiAgICAgICAgICAgIChuZXcgWm9vbUNvbnN0YW50RXhwcmVzc2lvbignY29uc3RhbnQnLCBleHByZXNzaW9uLnZhbHVlKTogQ29uc3RhbnRFeHByZXNzaW9uKSA6XG4gICAgICAgICAgICAobmV3IFpvb21Db25zdGFudEV4cHJlc3Npb24oJ3NvdXJjZScsIGV4cHJlc3Npb24udmFsdWUpOiBTb3VyY2VFeHByZXNzaW9uKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN1Y2Nlc3MoaXNGZWF0dXJlQ29uc3RhbnQgP1xuICAgICAgICAobmV3IFpvb21EZXBlbmRlbnRFeHByZXNzaW9uKCdjYW1lcmEnLCBleHByZXNzaW9uLnZhbHVlLCB6b29tQ3VydmUpOiBDYW1lcmFFeHByZXNzaW9uKSA6XG4gICAgICAgIChuZXcgWm9vbURlcGVuZGVudEV4cHJlc3Npb24oJ2NvbXBvc2l0ZScsIGV4cHJlc3Npb24udmFsdWUsIHpvb21DdXJ2ZSk6IENvbXBvc2l0ZUV4cHJlc3Npb24pKTtcbn1cblxuaW1wb3J0IHsgaXNGdW5jdGlvbiwgY3JlYXRlRnVuY3Rpb24gfSBmcm9tICcuLi9mdW5jdGlvbic7XG5pbXBvcnQgeyBDb2xvciB9IGZyb20gJy4vdmFsdWVzJztcblxuLy8gc2VyaWFsaXphdGlvbiB3cmFwcGVyIGZvciBvbGQtc3R5bGUgc3RvcCBmdW5jdGlvbnMgbm9ybWFsaXplZCB0byB0aGVcbi8vIGV4cHJlc3Npb24gaW50ZXJmYWNlXG5leHBvcnQgY2xhc3MgU3R5bGVQcm9wZXJ0eUZ1bmN0aW9uPFQ+IHtcbiAgICBfcGFyYW1ldGVyczogUHJvcGVydHlWYWx1ZVNwZWNpZmljYXRpb248VD47XG4gICAgX3NwZWNpZmljYXRpb246IFN0eWxlUHJvcGVydHlTcGVjaWZpY2F0aW9uO1xuXG4gICAga2luZDogRXZhbHVhdGlvbktpbmQ7XG4gICAgZXZhbHVhdGU6IChnbG9iYWxzOiBHbG9iYWxQcm9wZXJ0aWVzLCBmZWF0dXJlPzogRmVhdHVyZSkgPT4gYW55O1xuICAgIGludGVycG9sYXRpb25GYWN0b3I6ID8oaW5wdXQ6IG51bWJlciwgbG93ZXI6IG51bWJlciwgdXBwZXI6IG51bWJlcikgPT4gbnVtYmVyO1xuICAgIHpvb21TdG9wczogP0FycmF5PG51bWJlcj47XG5cbiAgICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzOiBQcm9wZXJ0eVZhbHVlU3BlY2lmaWNhdGlvbjxUPiwgc3BlY2lmaWNhdGlvbjogU3R5bGVQcm9wZXJ0eVNwZWNpZmljYXRpb24pIHtcbiAgICAgICAgdGhpcy5fcGFyYW1ldGVycyA9IHBhcmFtZXRlcnM7XG4gICAgICAgIHRoaXMuX3NwZWNpZmljYXRpb24gPSBzcGVjaWZpY2F0aW9uO1xuICAgICAgICBleHRlbmQodGhpcywgY3JlYXRlRnVuY3Rpb24odGhpcy5fcGFyYW1ldGVycywgdGhpcy5fc3BlY2lmaWNhdGlvbikpO1xuICAgIH1cblxuICAgIHN0YXRpYyBkZXNlcmlhbGl6ZShzZXJpYWxpemVkOiB7X3BhcmFtZXRlcnM6IFByb3BlcnR5VmFsdWVTcGVjaWZpY2F0aW9uPFQ+LCBfc3BlY2lmaWNhdGlvbjogU3R5bGVQcm9wZXJ0eVNwZWNpZmljYXRpb259KSB7XG4gICAgICAgIHJldHVybiAoKG5ldyBTdHlsZVByb3BlcnR5RnVuY3Rpb24oc2VyaWFsaXplZC5fcGFyYW1ldGVycywgc2VyaWFsaXplZC5fc3BlY2lmaWNhdGlvbikpOiBTdHlsZVByb3BlcnR5RnVuY3Rpb248VD4pO1xuICAgIH1cblxuICAgIHN0YXRpYyBzZXJpYWxpemUoaW5wdXQ6IFN0eWxlUHJvcGVydHlGdW5jdGlvbjxUPikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgX3BhcmFtZXRlcnM6IGlucHV0Ll9wYXJhbWV0ZXJzLFxuICAgICAgICAgICAgX3NwZWNpZmljYXRpb246IGlucHV0Ll9zcGVjaWZpY2F0aW9uXG4gICAgICAgIH07XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplUHJvcGVydHlFeHByZXNzaW9uPFQ+KHZhbHVlOiBQcm9wZXJ0eVZhbHVlU3BlY2lmaWNhdGlvbjxUPiwgc3BlY2lmaWNhdGlvbjogU3R5bGVQcm9wZXJ0eVNwZWNpZmljYXRpb24pOiBTdHlsZVByb3BlcnR5RXhwcmVzc2lvbiB7XG4gICAgaWYgKGlzRnVuY3Rpb24odmFsdWUpKSB7XG4gICAgICAgIHJldHVybiAobmV3IFN0eWxlUHJvcGVydHlGdW5jdGlvbih2YWx1ZSwgc3BlY2lmaWNhdGlvbik6IGFueSk7XG5cbiAgICB9IGVsc2UgaWYgKGlzRXhwcmVzc2lvbih2YWx1ZSkpIHtcbiAgICAgICAgY29uc3QgZXhwcmVzc2lvbiA9IGNyZWF0ZVByb3BlcnR5RXhwcmVzc2lvbih2YWx1ZSwgc3BlY2lmaWNhdGlvbik7XG4gICAgICAgIGlmIChleHByZXNzaW9uLnJlc3VsdCA9PT0gJ2Vycm9yJykge1xuICAgICAgICAgICAgLy8gdGhpcyBzaG91bGQgaGF2ZSBiZWVuIGNhdWdodCBpbiB2YWxpZGF0aW9uXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZXhwcmVzc2lvbi52YWx1ZS5tYXAoZXJyID0+IGAke2Vyci5rZXl9OiAke2Vyci5tZXNzYWdlfWApLmpvaW4oJywgJykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBleHByZXNzaW9uLnZhbHVlO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IGNvbnN0YW50OiBhbnkgPSB2YWx1ZTtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgc3BlY2lmaWNhdGlvbi50eXBlID09PSAnY29sb3InKSB7XG4gICAgICAgICAgICBjb25zdGFudCA9IENvbG9yLnBhcnNlKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAga2luZDogJ2NvbnN0YW50JyxcbiAgICAgICAgICAgIGV2YWx1YXRlOiAoKSA9PiBjb25zdGFudFxuICAgICAgICB9O1xuICAgIH1cbn1cblxuLy8gWm9vbS1kZXBlbmRlbnQgZXhwcmVzc2lvbnMgbWF5IG9ubHkgdXNlIFtcInpvb21cIl0gYXMgdGhlIGlucHV0IHRvIGEgdG9wLWxldmVsIFwic3RlcFwiIG9yIFwiaW50ZXJwb2xhdGVcIlxuLy8gZXhwcmVzc2lvbiAoY29sbGVjdGl2ZWx5IHJlZmVycmVkIHRvIGFzIGEgXCJjdXJ2ZVwiKS4gVGhlIGN1cnZlIG1heSBiZSB3cmFwcGVkIGluIG9uZSBvciBtb3JlIFwibGV0XCIgb3Jcbi8vIFwiY29hbGVzY2VcIiBleHByZXNzaW9ucy5cbmZ1bmN0aW9uIGZpbmRab29tQ3VydmUoZXhwcmVzc2lvbjogRXhwcmVzc2lvbik6IFN0ZXAgfCBJbnRlcnBvbGF0ZSB8IFBhcnNpbmdFcnJvciB8IG51bGwge1xuICAgIGxldCByZXN1bHQgPSBudWxsO1xuICAgIGlmIChleHByZXNzaW9uIGluc3RhbmNlb2YgTGV0KSB7XG4gICAgICAgIHJlc3VsdCA9IGZpbmRab29tQ3VydmUoZXhwcmVzc2lvbi5yZXN1bHQpO1xuXG4gICAgfSBlbHNlIGlmIChleHByZXNzaW9uIGluc3RhbmNlb2YgQ29hbGVzY2UpIHtcbiAgICAgICAgZm9yIChjb25zdCBhcmcgb2YgZXhwcmVzc2lvbi5hcmdzKSB7XG4gICAgICAgICAgICByZXN1bHQgPSBmaW5kWm9vbUN1cnZlKGFyZyk7XG4gICAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgIH0gZWxzZSBpZiAoKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBTdGVwIHx8IGV4cHJlc3Npb24gaW5zdGFuY2VvZiBJbnRlcnBvbGF0ZSkgJiZcbiAgICAgICAgZXhwcmVzc2lvbi5pbnB1dCBpbnN0YW5jZW9mIENvbXBvdW5kRXhwcmVzc2lvbiAmJlxuICAgICAgICBleHByZXNzaW9uLmlucHV0Lm5hbWUgPT09ICd6b29tJykge1xuXG4gICAgICAgIHJlc3VsdCA9IGV4cHJlc3Npb247XG4gICAgfVxuXG4gICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFBhcnNpbmdFcnJvcikge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGV4cHJlc3Npb24uZWFjaENoaWxkKChjaGlsZCkgPT4ge1xuICAgICAgICBjb25zdCBjaGlsZFJlc3VsdCA9IGZpbmRab29tQ3VydmUoY2hpbGQpO1xuICAgICAgICBpZiAoY2hpbGRSZXN1bHQgaW5zdGFuY2VvZiBQYXJzaW5nRXJyb3IpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGNoaWxkUmVzdWx0O1xuICAgICAgICB9IGVsc2UgaWYgKCFyZXN1bHQgJiYgY2hpbGRSZXN1bHQpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBQYXJzaW5nRXJyb3IoJycsICdcInpvb21cIiBleHByZXNzaW9uIG1heSBvbmx5IGJlIHVzZWQgYXMgaW5wdXQgdG8gYSB0b3AtbGV2ZWwgXCJzdGVwXCIgb3IgXCJpbnRlcnBvbGF0ZVwiIGV4cHJlc3Npb24uJyk7XG4gICAgICAgIH0gZWxzZSBpZiAocmVzdWx0ICYmIGNoaWxkUmVzdWx0ICYmIHJlc3VsdCAhPT0gY2hpbGRSZXN1bHQpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBQYXJzaW5nRXJyb3IoJycsICdPbmx5IG9uZSB6b29tLWJhc2VkIFwic3RlcFwiIG9yIFwiaW50ZXJwb2xhdGVcIiBzdWJleHByZXNzaW9uIG1heSBiZSB1c2VkIGluIGFuIGV4cHJlc3Npb24uJyk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbmltcG9ydCB7IENvbG9yVHlwZSwgU3RyaW5nVHlwZSwgTnVtYmVyVHlwZSwgQm9vbGVhblR5cGUsIFZhbHVlVHlwZSwgRm9ybWF0dGVkVHlwZSwgYXJyYXkgfSBmcm9tICcuL3R5cGVzJztcblxuZnVuY3Rpb24gZ2V0RXhwZWN0ZWRUeXBlKHNwZWM6IFN0eWxlUHJvcGVydHlTcGVjaWZpY2F0aW9uKTogVHlwZSB7XG4gICAgY29uc3QgdHlwZXMgPSB7XG4gICAgICAgIGNvbG9yOiBDb2xvclR5cGUsXG4gICAgICAgIHN0cmluZzogU3RyaW5nVHlwZSxcbiAgICAgICAgbnVtYmVyOiBOdW1iZXJUeXBlLFxuICAgICAgICBlbnVtOiBTdHJpbmdUeXBlLFxuICAgICAgICBib29sZWFuOiBCb29sZWFuVHlwZSxcbiAgICAgICAgZm9ybWF0dGVkOiBGb3JtYXR0ZWRUeXBlXG4gICAgfTtcblxuICAgIGlmIChzcGVjLnR5cGUgPT09ICdhcnJheScpIHtcbiAgICAgICAgcmV0dXJuIGFycmF5KHR5cGVzW3NwZWMudmFsdWVdIHx8IFZhbHVlVHlwZSwgc3BlYy5sZW5ndGgpO1xuICAgIH1cblxuICAgIHJldHVybiB0eXBlc1tzcGVjLnR5cGVdO1xufVxuXG5mdW5jdGlvbiBnZXREZWZhdWx0VmFsdWUoc3BlYzogU3R5bGVQcm9wZXJ0eVNwZWNpZmljYXRpb24pOiBWYWx1ZSB7XG4gICAgaWYgKHNwZWMudHlwZSA9PT0gJ2NvbG9yJyAmJiBpc0Z1bmN0aW9uKHNwZWMuZGVmYXVsdCkpIHtcbiAgICAgICAgLy8gU3BlY2lhbCBjYXNlIGZvciBoZWF0bWFwLWNvbG9yOiBpdCB1c2VzIHRoZSAnZGVmYXVsdDonIHRvIGRlZmluZSBhXG4gICAgICAgIC8vIGRlZmF1bHQgY29sb3IgcmFtcCwgYnV0IGNyZWF0ZUV4cHJlc3Npb24gZXhwZWN0cyBhIHNpbXBsZSB2YWx1ZSB0byBmYWxsXG4gICAgICAgIC8vIGJhY2sgdG8gaW4gY2FzZSBvZiBydW50aW1lIGVycm9yc1xuICAgICAgICByZXR1cm4gbmV3IENvbG9yKDAsIDAsIDAsIDApO1xuICAgIH0gZWxzZSBpZiAoc3BlYy50eXBlID09PSAnY29sb3InKSB7XG4gICAgICAgIHJldHVybiBDb2xvci5wYXJzZShzcGVjLmRlZmF1bHQpIHx8IG51bGw7XG4gICAgfSBlbHNlIGlmIChzcGVjLmRlZmF1bHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gc3BlYy5kZWZhdWx0O1xuICAgIH1cbn1cbiIsIlxuaW1wb3J0IFZhbGlkYXRpb25FcnJvciBmcm9tICcuLi9lcnJvci92YWxpZGF0aW9uX2Vycm9yJztcbmltcG9ydCBnZXRUeXBlIGZyb20gJy4uL3V0aWwvZ2V0X3R5cGUnO1xuaW1wb3J0IHZhbGlkYXRlU3BlYyBmcm9tICcuL3ZhbGlkYXRlJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdmFsaWRhdGVPYmplY3Qob3B0aW9ucykge1xuICAgIGNvbnN0IGtleSA9IG9wdGlvbnMua2V5O1xuICAgIGNvbnN0IG9iamVjdCA9IG9wdGlvbnMudmFsdWU7XG4gICAgY29uc3QgZWxlbWVudFNwZWNzID0gb3B0aW9ucy52YWx1ZVNwZWMgfHwge307XG4gICAgY29uc3QgZWxlbWVudFZhbGlkYXRvcnMgPSBvcHRpb25zLm9iamVjdEVsZW1lbnRWYWxpZGF0b3JzIHx8IHt9O1xuICAgIGNvbnN0IHN0eWxlID0gb3B0aW9ucy5zdHlsZTtcbiAgICBjb25zdCBzdHlsZVNwZWMgPSBvcHRpb25zLnN0eWxlU3BlYztcbiAgICBsZXQgZXJyb3JzID0gW107XG5cbiAgICBjb25zdCB0eXBlID0gZ2V0VHlwZShvYmplY3QpO1xuICAgIGlmICh0eXBlICE9PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gW25ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCBvYmplY3QsIGBvYmplY3QgZXhwZWN0ZWQsICR7dHlwZX0gZm91bmRgKV07XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBvYmplY3RLZXkgaW4gb2JqZWN0KSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRTcGVjS2V5ID0gb2JqZWN0S2V5LnNwbGl0KCcuJylbMF07IC8vIHRyZWF0ICdwYWludC4qJyBhcyAncGFpbnQnXG4gICAgICAgIGNvbnN0IGVsZW1lbnRTcGVjID0gZWxlbWVudFNwZWNzW2VsZW1lbnRTcGVjS2V5XSB8fCBlbGVtZW50U3BlY3NbJyonXTtcblxuICAgICAgICBsZXQgdmFsaWRhdGVFbGVtZW50O1xuICAgICAgICBpZiAoZWxlbWVudFZhbGlkYXRvcnNbZWxlbWVudFNwZWNLZXldKSB7XG4gICAgICAgICAgICB2YWxpZGF0ZUVsZW1lbnQgPSBlbGVtZW50VmFsaWRhdG9yc1tlbGVtZW50U3BlY0tleV07XG4gICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudFNwZWNzW2VsZW1lbnRTcGVjS2V5XSkge1xuICAgICAgICAgICAgdmFsaWRhdGVFbGVtZW50ID0gdmFsaWRhdGVTcGVjO1xuICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnRWYWxpZGF0b3JzWycqJ10pIHtcbiAgICAgICAgICAgIHZhbGlkYXRlRWxlbWVudCA9IGVsZW1lbnRWYWxpZGF0b3JzWycqJ107XG4gICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudFNwZWNzWycqJ10pIHtcbiAgICAgICAgICAgIHZhbGlkYXRlRWxlbWVudCA9IHZhbGlkYXRlU3BlYztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCBvYmplY3Rbb2JqZWN0S2V5XSwgYHVua25vd24gcHJvcGVydHkgXCIke29iamVjdEtleX1cImApKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgZXJyb3JzID0gZXJyb3JzLmNvbmNhdCh2YWxpZGF0ZUVsZW1lbnQoe1xuICAgICAgICAgICAga2V5OiAoa2V5ID8gYCR7a2V5fS5gIDoga2V5KSArIG9iamVjdEtleSxcbiAgICAgICAgICAgIHZhbHVlOiBvYmplY3Rbb2JqZWN0S2V5XSxcbiAgICAgICAgICAgIHZhbHVlU3BlYzogZWxlbWVudFNwZWMsXG4gICAgICAgICAgICBzdHlsZSxcbiAgICAgICAgICAgIHN0eWxlU3BlYyxcbiAgICAgICAgICAgIG9iamVjdCxcbiAgICAgICAgICAgIG9iamVjdEtleVxuICAgICAgICB9LCBvYmplY3QpKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGVsZW1lbnRTcGVjS2V5IGluIGVsZW1lbnRTcGVjcykge1xuICAgICAgICAvLyBEb24ndCBjaGVjayBgcmVxdWlyZWRgIHdoZW4gdGhlcmUncyBhIGN1c3RvbSB2YWxpZGF0b3IgZm9yIHRoYXQgcHJvcGVydHkuXG4gICAgICAgIGlmIChlbGVtZW50VmFsaWRhdG9yc1tlbGVtZW50U3BlY0tleV0pIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVsZW1lbnRTcGVjc1tlbGVtZW50U3BlY0tleV0ucmVxdWlyZWQgJiYgZWxlbWVudFNwZWNzW2VsZW1lbnRTcGVjS2V5XVsnZGVmYXVsdCddID09PSB1bmRlZmluZWQgJiYgb2JqZWN0W2VsZW1lbnRTcGVjS2V5XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBlcnJvcnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgb2JqZWN0LCBgbWlzc2luZyByZXF1aXJlZCBwcm9wZXJ0eSBcIiR7ZWxlbWVudFNwZWNLZXl9XCJgKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZXJyb3JzO1xufVxuIiwiXG5pbXBvcnQgZ2V0VHlwZSBmcm9tICcuLi91dGlsL2dldF90eXBlJztcbmltcG9ydCB2YWxpZGF0ZSBmcm9tICcuL3ZhbGlkYXRlJztcbmltcG9ydCBWYWxpZGF0aW9uRXJyb3IgZnJvbSAnLi4vZXJyb3IvdmFsaWRhdGlvbl9lcnJvcic7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHZhbGlkYXRlQXJyYXkob3B0aW9ucykge1xuICAgIGNvbnN0IGFycmF5ID0gb3B0aW9ucy52YWx1ZTtcbiAgICBjb25zdCBhcnJheVNwZWMgPSBvcHRpb25zLnZhbHVlU3BlYztcbiAgICBjb25zdCBzdHlsZSA9IG9wdGlvbnMuc3R5bGU7XG4gICAgY29uc3Qgc3R5bGVTcGVjID0gb3B0aW9ucy5zdHlsZVNwZWM7XG4gICAgY29uc3Qga2V5ID0gb3B0aW9ucy5rZXk7XG4gICAgY29uc3QgdmFsaWRhdGVBcnJheUVsZW1lbnQgPSBvcHRpb25zLmFycmF5RWxlbWVudFZhbGlkYXRvciB8fCB2YWxpZGF0ZTtcblxuICAgIGlmIChnZXRUeXBlKGFycmF5KSAhPT0gJ2FycmF5Jykge1xuICAgICAgICByZXR1cm4gW25ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCBhcnJheSwgYGFycmF5IGV4cGVjdGVkLCAke2dldFR5cGUoYXJyYXkpfSBmb3VuZGApXTtcbiAgICB9XG5cbiAgICBpZiAoYXJyYXlTcGVjLmxlbmd0aCAmJiBhcnJheS5sZW5ndGggIT09IGFycmF5U3BlYy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgYXJyYXksIGBhcnJheSBsZW5ndGggJHthcnJheVNwZWMubGVuZ3RofSBleHBlY3RlZCwgbGVuZ3RoICR7YXJyYXkubGVuZ3RofSBmb3VuZGApXTtcbiAgICB9XG5cbiAgICBpZiAoYXJyYXlTcGVjWydtaW4tbGVuZ3RoJ10gJiYgYXJyYXkubGVuZ3RoIDwgYXJyYXlTcGVjWydtaW4tbGVuZ3RoJ10pIHtcbiAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgYXJyYXksIGBhcnJheSBsZW5ndGggYXQgbGVhc3QgJHthcnJheVNwZWNbJ21pbi1sZW5ndGgnXX0gZXhwZWN0ZWQsIGxlbmd0aCAke2FycmF5Lmxlbmd0aH0gZm91bmRgKV07XG4gICAgfVxuXG4gICAgbGV0IGFycmF5RWxlbWVudFNwZWMgPSB7XG4gICAgICAgIFwidHlwZVwiOiBhcnJheVNwZWMudmFsdWUsXG4gICAgICAgIFwidmFsdWVzXCI6IGFycmF5U3BlYy52YWx1ZXNcbiAgICB9O1xuXG4gICAgaWYgKHN0eWxlU3BlYy4kdmVyc2lvbiA8IDcpIHtcbiAgICAgICAgYXJyYXlFbGVtZW50U3BlYy5mdW5jdGlvbiA9IGFycmF5U3BlYy5mdW5jdGlvbjtcbiAgICB9XG5cbiAgICBpZiAoZ2V0VHlwZShhcnJheVNwZWMudmFsdWUpID09PSAnb2JqZWN0Jykge1xuICAgICAgICBhcnJheUVsZW1lbnRTcGVjID0gYXJyYXlTcGVjLnZhbHVlO1xuICAgIH1cblxuICAgIGxldCBlcnJvcnMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGVycm9ycyA9IGVycm9ycy5jb25jYXQodmFsaWRhdGVBcnJheUVsZW1lbnQoe1xuICAgICAgICAgICAgYXJyYXksXG4gICAgICAgICAgICBhcnJheUluZGV4OiBpLFxuICAgICAgICAgICAgdmFsdWU6IGFycmF5W2ldLFxuICAgICAgICAgICAgdmFsdWVTcGVjOiBhcnJheUVsZW1lbnRTcGVjLFxuICAgICAgICAgICAgc3R5bGUsXG4gICAgICAgICAgICBzdHlsZVNwZWMsXG4gICAgICAgICAgICBrZXk6IGAke2tleX1bJHtpfV1gXG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgcmV0dXJuIGVycm9ycztcbn1cbiIsIlxuaW1wb3J0IGdldFR5cGUgZnJvbSAnLi4vdXRpbC9nZXRfdHlwZSc7XG5pbXBvcnQgVmFsaWRhdGlvbkVycm9yIGZyb20gJy4uL2Vycm9yL3ZhbGlkYXRpb25fZXJyb3InO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB2YWxpZGF0ZU51bWJlcihvcHRpb25zKSB7XG4gICAgY29uc3Qga2V5ID0gb3B0aW9ucy5rZXk7XG4gICAgY29uc3QgdmFsdWUgPSBvcHRpb25zLnZhbHVlO1xuICAgIGNvbnN0IHZhbHVlU3BlYyA9IG9wdGlvbnMudmFsdWVTcGVjO1xuICAgIGNvbnN0IHR5cGUgPSBnZXRUeXBlKHZhbHVlKTtcblxuICAgIGlmICh0eXBlICE9PSAnbnVtYmVyJykge1xuICAgICAgICByZXR1cm4gW25ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCB2YWx1ZSwgYG51bWJlciBleHBlY3RlZCwgJHt0eXBlfSBmb3VuZGApXTtcbiAgICB9XG5cbiAgICBpZiAoJ21pbmltdW0nIGluIHZhbHVlU3BlYyAmJiB2YWx1ZSA8IHZhbHVlU3BlYy5taW5pbXVtKSB7XG4gICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihrZXksIHZhbHVlLCBgJHt2YWx1ZX0gaXMgbGVzcyB0aGFuIHRoZSBtaW5pbXVtIHZhbHVlICR7dmFsdWVTcGVjLm1pbmltdW19YCldO1xuICAgIH1cblxuICAgIGlmICgnbWF4aW11bScgaW4gdmFsdWVTcGVjICYmIHZhbHVlID4gdmFsdWVTcGVjLm1heGltdW0pIHtcbiAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsIGAke3ZhbHVlfSBpcyBncmVhdGVyIHRoYW4gdGhlIG1heGltdW0gdmFsdWUgJHt2YWx1ZVNwZWMubWF4aW11bX1gKV07XG4gICAgfVxuXG4gICAgcmV0dXJuIFtdO1xufVxuIiwiXG5pbXBvcnQgVmFsaWRhdGlvbkVycm9yIGZyb20gJy4uL2Vycm9yL3ZhbGlkYXRpb25fZXJyb3InO1xuaW1wb3J0IGdldFR5cGUgZnJvbSAnLi4vdXRpbC9nZXRfdHlwZSc7XG5pbXBvcnQgdmFsaWRhdGUgZnJvbSAnLi92YWxpZGF0ZSc7XG5pbXBvcnQgdmFsaWRhdGVPYmplY3QgZnJvbSAnLi92YWxpZGF0ZV9vYmplY3QnO1xuaW1wb3J0IHZhbGlkYXRlQXJyYXkgZnJvbSAnLi92YWxpZGF0ZV9hcnJheSc7XG5pbXBvcnQgdmFsaWRhdGVOdW1iZXIgZnJvbSAnLi92YWxpZGF0ZV9udW1iZXInO1xuaW1wb3J0IHsgaXNFeHByZXNzaW9uIH0gZnJvbSAnLi4vZXhwcmVzc2lvbic7XG5pbXBvcnQgeyB1bmJ1bmRsZSwgZGVlcFVuYnVuZGxlIH0gZnJvbSAnLi4vdXRpbC91bmJ1bmRsZV9qc29ubGludCc7XG5pbXBvcnQge1xuICAgIHN1cHBvcnRzUHJvcGVydHlFeHByZXNzaW9uLFxuICAgIHN1cHBvcnRzWm9vbUV4cHJlc3Npb24sXG4gICAgc3VwcG9ydHNJbnRlcnBvbGF0aW9uXG59IGZyb20gJy4uL3V0aWwvcHJvcGVydGllcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHZhbGlkYXRlRnVuY3Rpb24ob3B0aW9ucykge1xuICAgIGNvbnN0IGZ1bmN0aW9uVmFsdWVTcGVjID0gb3B0aW9ucy52YWx1ZVNwZWM7XG4gICAgY29uc3QgZnVuY3Rpb25UeXBlID0gdW5idW5kbGUob3B0aW9ucy52YWx1ZS50eXBlKTtcbiAgICBsZXQgc3RvcEtleVR5cGU7XG4gICAgbGV0IHN0b3BEb21haW5WYWx1ZXMgPSB7fTtcbiAgICBsZXQgcHJldmlvdXNTdG9wRG9tYWluVmFsdWU7XG4gICAgbGV0IHByZXZpb3VzU3RvcERvbWFpblpvb207XG5cbiAgICBjb25zdCBpc1pvb21GdW5jdGlvbiA9IGZ1bmN0aW9uVHlwZSAhPT0gJ2NhdGVnb3JpY2FsJyAmJiBvcHRpb25zLnZhbHVlLnByb3BlcnR5ID09PSB1bmRlZmluZWQ7XG4gICAgY29uc3QgaXNQcm9wZXJ0eUZ1bmN0aW9uID0gIWlzWm9vbUZ1bmN0aW9uO1xuICAgIGNvbnN0IGlzWm9vbUFuZFByb3BlcnR5RnVuY3Rpb24gPVxuICAgICAgICBnZXRUeXBlKG9wdGlvbnMudmFsdWUuc3RvcHMpID09PSAnYXJyYXknICYmXG4gICAgICAgIGdldFR5cGUob3B0aW9ucy52YWx1ZS5zdG9wc1swXSkgPT09ICdhcnJheScgJiZcbiAgICAgICAgZ2V0VHlwZShvcHRpb25zLnZhbHVlLnN0b3BzWzBdWzBdKSA9PT0gJ29iamVjdCc7XG5cbiAgICBjb25zdCBlcnJvcnMgPSB2YWxpZGF0ZU9iamVjdCh7XG4gICAgICAgIGtleTogb3B0aW9ucy5rZXksXG4gICAgICAgIHZhbHVlOiBvcHRpb25zLnZhbHVlLFxuICAgICAgICB2YWx1ZVNwZWM6IG9wdGlvbnMuc3R5bGVTcGVjLmZ1bmN0aW9uLFxuICAgICAgICBzdHlsZTogb3B0aW9ucy5zdHlsZSxcbiAgICAgICAgc3R5bGVTcGVjOiBvcHRpb25zLnN0eWxlU3BlYyxcbiAgICAgICAgb2JqZWN0RWxlbWVudFZhbGlkYXRvcnM6IHtcbiAgICAgICAgICAgIHN0b3BzOiB2YWxpZGF0ZUZ1bmN0aW9uU3RvcHMsXG4gICAgICAgICAgICBkZWZhdWx0OiB2YWxpZGF0ZUZ1bmN0aW9uRGVmYXVsdFxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAoZnVuY3Rpb25UeXBlID09PSAnaWRlbnRpdHknICYmIGlzWm9vbUZ1bmN0aW9uKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Iob3B0aW9ucy5rZXksIG9wdGlvbnMudmFsdWUsICdtaXNzaW5nIHJlcXVpcmVkIHByb3BlcnR5IFwicHJvcGVydHlcIicpKTtcbiAgICB9XG5cbiAgICBpZiAoZnVuY3Rpb25UeXBlICE9PSAnaWRlbnRpdHknICYmICFvcHRpb25zLnZhbHVlLnN0b3BzKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Iob3B0aW9ucy5rZXksIG9wdGlvbnMudmFsdWUsICdtaXNzaW5nIHJlcXVpcmVkIHByb3BlcnR5IFwic3RvcHNcIicpKTtcbiAgICB9XG5cbiAgICBpZiAoZnVuY3Rpb25UeXBlID09PSAnZXhwb25lbnRpYWwnICYmIG9wdGlvbnMudmFsdWVTcGVjLmV4cHJlc3Npb24gJiYgIXN1cHBvcnRzSW50ZXJwb2xhdGlvbihvcHRpb25zLnZhbHVlU3BlYykpIHtcbiAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihvcHRpb25zLmtleSwgb3B0aW9ucy52YWx1ZSwgJ2V4cG9uZW50aWFsIGZ1bmN0aW9ucyBub3Qgc3VwcG9ydGVkJykpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLnN0eWxlU3BlYy4kdmVyc2lvbiA+PSA4KSB7XG4gICAgICAgIGlmIChpc1Byb3BlcnR5RnVuY3Rpb24gJiYgIXN1cHBvcnRzUHJvcGVydHlFeHByZXNzaW9uKG9wdGlvbnMudmFsdWVTcGVjKSkge1xuICAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihvcHRpb25zLmtleSwgb3B0aW9ucy52YWx1ZSwgJ3Byb3BlcnR5IGZ1bmN0aW9ucyBub3Qgc3VwcG9ydGVkJykpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzWm9vbUZ1bmN0aW9uICYmICFzdXBwb3J0c1pvb21FeHByZXNzaW9uKG9wdGlvbnMudmFsdWVTcGVjKSkge1xuICAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihvcHRpb25zLmtleSwgb3B0aW9ucy52YWx1ZSwgJ3pvb20gZnVuY3Rpb25zIG5vdCBzdXBwb3J0ZWQnKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoKGZ1bmN0aW9uVHlwZSA9PT0gJ2NhdGVnb3JpY2FsJyB8fCBpc1pvb21BbmRQcm9wZXJ0eUZ1bmN0aW9uKSAmJiBvcHRpb25zLnZhbHVlLnByb3BlcnR5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihvcHRpb25zLmtleSwgb3B0aW9ucy52YWx1ZSwgJ1wicHJvcGVydHlcIiBwcm9wZXJ0eSBpcyByZXF1aXJlZCcpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZXJyb3JzO1xuXG4gICAgZnVuY3Rpb24gdmFsaWRhdGVGdW5jdGlvblN0b3BzKG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKGZ1bmN0aW9uVHlwZSA9PT0gJ2lkZW50aXR5Jykge1xuICAgICAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKG9wdGlvbnMua2V5LCBvcHRpb25zLnZhbHVlLCAnaWRlbnRpdHkgZnVuY3Rpb24gbWF5IG5vdCBoYXZlIGEgXCJzdG9wc1wiIHByb3BlcnR5JyldO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGVycm9ycyA9IFtdO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IG9wdGlvbnMudmFsdWU7XG5cbiAgICAgICAgZXJyb3JzID0gZXJyb3JzLmNvbmNhdCh2YWxpZGF0ZUFycmF5KHtcbiAgICAgICAgICAgIGtleTogb3B0aW9ucy5rZXksXG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIHZhbHVlU3BlYzogb3B0aW9ucy52YWx1ZVNwZWMsXG4gICAgICAgICAgICBzdHlsZTogb3B0aW9ucy5zdHlsZSxcbiAgICAgICAgICAgIHN0eWxlU3BlYzogb3B0aW9ucy5zdHlsZVNwZWMsXG4gICAgICAgICAgICBhcnJheUVsZW1lbnRWYWxpZGF0b3I6IHZhbGlkYXRlRnVuY3Rpb25TdG9wXG4gICAgICAgIH0pKTtcblxuICAgICAgICBpZiAoZ2V0VHlwZSh2YWx1ZSkgPT09ICdhcnJheScgJiYgdmFsdWUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBlcnJvcnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKG9wdGlvbnMua2V5LCB2YWx1ZSwgJ2FycmF5IG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgc3RvcCcpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlcnJvcnM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdmFsaWRhdGVGdW5jdGlvblN0b3Aob3B0aW9ucykge1xuICAgICAgICBsZXQgZXJyb3JzID0gW107XG4gICAgICAgIGNvbnN0IHZhbHVlID0gb3B0aW9ucy52YWx1ZTtcbiAgICAgICAgY29uc3Qga2V5ID0gb3B0aW9ucy5rZXk7XG5cbiAgICAgICAgaWYgKGdldFR5cGUodmFsdWUpICE9PSAnYXJyYXknKSB7XG4gICAgICAgICAgICByZXR1cm4gW25ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCB2YWx1ZSwgYGFycmF5IGV4cGVjdGVkLCAke2dldFR5cGUodmFsdWUpfSBmb3VuZGApXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZS5sZW5ndGggIT09IDIpIHtcbiAgICAgICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihrZXksIHZhbHVlLCBgYXJyYXkgbGVuZ3RoIDIgZXhwZWN0ZWQsIGxlbmd0aCAke3ZhbHVlLmxlbmd0aH0gZm91bmRgKV07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNab29tQW5kUHJvcGVydHlGdW5jdGlvbikge1xuICAgICAgICAgICAgaWYgKGdldFR5cGUodmFsdWVbMF0pICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihrZXksIHZhbHVlLCBgb2JqZWN0IGV4cGVjdGVkLCAke2dldFR5cGUodmFsdWVbMF0pfSBmb3VuZGApXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh2YWx1ZVswXS56b29tID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW25ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCB2YWx1ZSwgJ29iamVjdCBzdG9wIGtleSBtdXN0IGhhdmUgem9vbScpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh2YWx1ZVswXS52YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsICdvYmplY3Qgc3RvcCBrZXkgbXVzdCBoYXZlIHZhbHVlJyldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHByZXZpb3VzU3RvcERvbWFpblpvb20gJiYgcHJldmlvdXNTdG9wRG9tYWluWm9vbSA+IHVuYnVuZGxlKHZhbHVlWzBdLnpvb20pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWVbMF0uem9vbSwgJ3N0b3Agem9vbSB2YWx1ZXMgbXVzdCBhcHBlYXIgaW4gYXNjZW5kaW5nIG9yZGVyJyldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHVuYnVuZGxlKHZhbHVlWzBdLnpvb20pICE9PSBwcmV2aW91c1N0b3BEb21haW5ab29tKSB7XG4gICAgICAgICAgICAgICAgcHJldmlvdXNTdG9wRG9tYWluWm9vbSA9IHVuYnVuZGxlKHZhbHVlWzBdLnpvb20pO1xuICAgICAgICAgICAgICAgIHByZXZpb3VzU3RvcERvbWFpblZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHN0b3BEb21haW5WYWx1ZXMgPSB7fTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVycm9ycyA9IGVycm9ycy5jb25jYXQodmFsaWRhdGVPYmplY3Qoe1xuICAgICAgICAgICAgICAgIGtleTogYCR7a2V5fVswXWAsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlWzBdLFxuICAgICAgICAgICAgICAgIHZhbHVlU3BlYzogeyB6b29tOiB7fSB9LFxuICAgICAgICAgICAgICAgIHN0eWxlOiBvcHRpb25zLnN0eWxlLFxuICAgICAgICAgICAgICAgIHN0eWxlU3BlYzogb3B0aW9ucy5zdHlsZVNwZWMsXG4gICAgICAgICAgICAgICAgb2JqZWN0RWxlbWVudFZhbGlkYXRvcnM6IHsgem9vbTogdmFsaWRhdGVOdW1iZXIsIHZhbHVlOiB2YWxpZGF0ZVN0b3BEb21haW5WYWx1ZSB9XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlcnJvcnMgPSBlcnJvcnMuY29uY2F0KHZhbGlkYXRlU3RvcERvbWFpblZhbHVlKHtcbiAgICAgICAgICAgICAgICBrZXk6IGAke2tleX1bMF1gLFxuICAgICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZVswXSxcbiAgICAgICAgICAgICAgICB2YWx1ZVNwZWM6IHt9LFxuICAgICAgICAgICAgICAgIHN0eWxlOiBvcHRpb25zLnN0eWxlLFxuICAgICAgICAgICAgICAgIHN0eWxlU3BlYzogb3B0aW9ucy5zdHlsZVNwZWNcbiAgICAgICAgICAgIH0sIHZhbHVlKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNFeHByZXNzaW9uKGRlZXBVbmJ1bmRsZSh2YWx1ZVsxXSkpKSB7XG4gICAgICAgICAgICByZXR1cm4gZXJyb3JzLmNvbmNhdChbbmV3IFZhbGlkYXRpb25FcnJvcihgJHtrZXl9WzFdYCwgdmFsdWVbMV0sICdleHByZXNzaW9ucyBhcmUgbm90IGFsbG93ZWQgaW4gZnVuY3Rpb24gc3RvcHMuJyldKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlcnJvcnMuY29uY2F0KHZhbGlkYXRlKHtcbiAgICAgICAgICAgIGtleTogYCR7a2V5fVsxXWAsXG4gICAgICAgICAgICB2YWx1ZTogdmFsdWVbMV0sXG4gICAgICAgICAgICB2YWx1ZVNwZWM6IGZ1bmN0aW9uVmFsdWVTcGVjLFxuICAgICAgICAgICAgc3R5bGU6IG9wdGlvbnMuc3R5bGUsXG4gICAgICAgICAgICBzdHlsZVNwZWM6IG9wdGlvbnMuc3R5bGVTcGVjXG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB2YWxpZGF0ZVN0b3BEb21haW5WYWx1ZShvcHRpb25zLCBzdG9wKSB7XG4gICAgICAgIGNvbnN0IHR5cGUgPSBnZXRUeXBlKG9wdGlvbnMudmFsdWUpO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHVuYnVuZGxlKG9wdGlvbnMudmFsdWUpO1xuXG4gICAgICAgIGNvbnN0IHJlcG9ydFZhbHVlID0gb3B0aW9ucy52YWx1ZSAhPT0gbnVsbCA/IG9wdGlvbnMudmFsdWUgOiBzdG9wO1xuXG4gICAgICAgIGlmICghc3RvcEtleVR5cGUpIHtcbiAgICAgICAgICAgIHN0b3BLZXlUeXBlID0gdHlwZTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlICE9PSBzdG9wS2V5VHlwZSkge1xuICAgICAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKG9wdGlvbnMua2V5LCByZXBvcnRWYWx1ZSwgYCR7dHlwZX0gc3RvcCBkb21haW4gdHlwZSBtdXN0IG1hdGNoIHByZXZpb3VzIHN0b3AgZG9tYWluIHR5cGUgJHtzdG9wS2V5VHlwZX1gKV07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZSAhPT0gJ251bWJlcicgJiYgdHlwZSAhPT0gJ3N0cmluZycgJiYgdHlwZSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICByZXR1cm4gW25ldyBWYWxpZGF0aW9uRXJyb3Iob3B0aW9ucy5rZXksIHJlcG9ydFZhbHVlLCAnc3RvcCBkb21haW4gdmFsdWUgbXVzdCBiZSBhIG51bWJlciwgc3RyaW5nLCBvciBib29sZWFuJyldO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGUgIT09ICdudW1iZXInICYmIGZ1bmN0aW9uVHlwZSAhPT0gJ2NhdGVnb3JpY2FsJykge1xuICAgICAgICAgICAgbGV0IG1lc3NhZ2UgPSBgbnVtYmVyIGV4cGVjdGVkLCAke3R5cGV9IGZvdW5kYDtcbiAgICAgICAgICAgIGlmIChzdXBwb3J0c1Byb3BlcnR5RXhwcmVzc2lvbihmdW5jdGlvblZhbHVlU3BlYykgJiYgZnVuY3Rpb25UeXBlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlICs9ICdcXG5JZiB5b3UgaW50ZW5kZWQgdG8gdXNlIGEgY2F0ZWdvcmljYWwgZnVuY3Rpb24sIHNwZWNpZnkgYFwidHlwZVwiOiBcImNhdGVnb3JpY2FsXCJgLic7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gW25ldyBWYWxpZGF0aW9uRXJyb3Iob3B0aW9ucy5rZXksIHJlcG9ydFZhbHVlLCBtZXNzYWdlKV07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZnVuY3Rpb25UeXBlID09PSAnY2F0ZWdvcmljYWwnICYmIHR5cGUgPT09ICdudW1iZXInICYmICghaXNGaW5pdGUodmFsdWUpIHx8IE1hdGguZmxvb3IodmFsdWUpICE9PSB2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihvcHRpb25zLmtleSwgcmVwb3J0VmFsdWUsIGBpbnRlZ2VyIGV4cGVjdGVkLCBmb3VuZCAke3ZhbHVlfWApXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmdW5jdGlvblR5cGUgIT09ICdjYXRlZ29yaWNhbCcgJiYgdHlwZSA9PT0gJ251bWJlcicgJiYgcHJldmlvdXNTdG9wRG9tYWluVmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSA8IHByZXZpb3VzU3RvcERvbWFpblZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gW25ldyBWYWxpZGF0aW9uRXJyb3Iob3B0aW9ucy5rZXksIHJlcG9ydFZhbHVlLCAnc3RvcCBkb21haW4gdmFsdWVzIG11c3QgYXBwZWFyIGluIGFzY2VuZGluZyBvcmRlcicpXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHByZXZpb3VzU3RvcERvbWFpblZhbHVlID0gdmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZnVuY3Rpb25UeXBlID09PSAnY2F0ZWdvcmljYWwnICYmIHZhbHVlIGluIHN0b3BEb21haW5WYWx1ZXMpIHtcbiAgICAgICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihvcHRpb25zLmtleSwgcmVwb3J0VmFsdWUsICdzdG9wIGRvbWFpbiB2YWx1ZXMgbXVzdCBiZSB1bmlxdWUnKV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdG9wRG9tYWluVmFsdWVzW3ZhbHVlXSA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdmFsaWRhdGVGdW5jdGlvbkRlZmF1bHQob3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdmFsaWRhdGUoe1xuICAgICAgICAgICAga2V5OiBvcHRpb25zLmtleSxcbiAgICAgICAgICAgIHZhbHVlOiBvcHRpb25zLnZhbHVlLFxuICAgICAgICAgICAgdmFsdWVTcGVjOiBmdW5jdGlvblZhbHVlU3BlYyxcbiAgICAgICAgICAgIHN0eWxlOiBvcHRpb25zLnN0eWxlLFxuICAgICAgICAgICAgc3R5bGVTcGVjOiBvcHRpb25zLnN0eWxlU3BlY1xuICAgICAgICB9KTtcbiAgICB9XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgVmFsaWRhdGlvbkVycm9yIGZyb20gJy4uL2Vycm9yL3ZhbGlkYXRpb25fZXJyb3InO1xuXG5pbXBvcnQgeyBjcmVhdGVFeHByZXNzaW9uLCBjcmVhdGVQcm9wZXJ0eUV4cHJlc3Npb24gfSBmcm9tICcuLi9leHByZXNzaW9uJztcbmltcG9ydCB7IGRlZXBVbmJ1bmRsZSB9IGZyb20gJy4uL3V0aWwvdW5idW5kbGVfanNvbmxpbnQnO1xuaW1wb3J0IHsgaXNTdGF0ZUNvbnN0YW50LCBpc0dsb2JhbFByb3BlcnR5Q29uc3RhbnQsIGlzRmVhdHVyZUNvbnN0YW50IH0gZnJvbSAnLi4vZXhwcmVzc2lvbi9pc19jb25zdGFudCc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHZhbGlkYXRlRXhwcmVzc2lvbihvcHRpb25zOiBhbnkpOiBBcnJheTxWYWxpZGF0aW9uRXJyb3I+IHtcbiAgICBjb25zdCBleHByZXNzaW9uID0gKG9wdGlvbnMuZXhwcmVzc2lvbkNvbnRleHQgPT09ICdwcm9wZXJ0eScgPyBjcmVhdGVQcm9wZXJ0eUV4cHJlc3Npb24gOiBjcmVhdGVFeHByZXNzaW9uKShkZWVwVW5idW5kbGUob3B0aW9ucy52YWx1ZSksIG9wdGlvbnMudmFsdWVTcGVjKTtcbiAgICBpZiAoZXhwcmVzc2lvbi5yZXN1bHQgPT09ICdlcnJvcicpIHtcbiAgICAgICAgcmV0dXJuIGV4cHJlc3Npb24udmFsdWUubWFwKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBWYWxpZGF0aW9uRXJyb3IoYCR7b3B0aW9ucy5rZXl9JHtlcnJvci5rZXl9YCwgb3B0aW9ucy52YWx1ZSwgZXJyb3IubWVzc2FnZSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IGV4cHJlc3Npb25PYmogPSAoZXhwcmVzc2lvbi52YWx1ZTogYW55KS5leHByZXNzaW9uIHx8IChleHByZXNzaW9uLnZhbHVlOiBhbnkpLl9zdHlsZUV4cHJlc3Npb24uZXhwcmVzc2lvbjtcblxuICAgIGlmIChvcHRpb25zLmV4cHJlc3Npb25Db250ZXh0ID09PSAncHJvcGVydHknICYmIChvcHRpb25zLnByb3BlcnR5S2V5ID09PSAndGV4dC1mb250JykgJiZcbiAgICAgICAgZXhwcmVzc2lvbk9iai5wb3NzaWJsZU91dHB1dHMoKS5pbmRleE9mKHVuZGVmaW5lZCkgIT09IC0xKSB7XG4gICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihvcHRpb25zLmtleSwgb3B0aW9ucy52YWx1ZSwgYEludmFsaWQgZGF0YSBleHByZXNzaW9uIGZvciBcIiR7b3B0aW9ucy5wcm9wZXJ0eUtleX1cIi4gT3V0cHV0IHZhbHVlcyBtdXN0IGJlIGNvbnRhaW5lZCBhcyBsaXRlcmFscyB3aXRoaW4gdGhlIGV4cHJlc3Npb24uYCldO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmV4cHJlc3Npb25Db250ZXh0ID09PSAncHJvcGVydHknICYmIG9wdGlvbnMucHJvcGVydHlUeXBlID09PSAnbGF5b3V0JyAmJlxuICAgICAgICAoIWlzU3RhdGVDb25zdGFudChleHByZXNzaW9uT2JqKSkpIHtcbiAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKG9wdGlvbnMua2V5LCBvcHRpb25zLnZhbHVlLCAnXCJmZWF0dXJlLXN0YXRlXCIgZGF0YSBleHByZXNzaW9ucyBhcmUgbm90IHN1cHBvcnRlZCB3aXRoIGxheW91dCBwcm9wZXJ0aWVzLicpXTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5leHByZXNzaW9uQ29udGV4dCA9PT0gJ2ZpbHRlcicgJiYgIWlzU3RhdGVDb25zdGFudChleHByZXNzaW9uT2JqKSkge1xuICAgICAgICByZXR1cm4gW25ldyBWYWxpZGF0aW9uRXJyb3Iob3B0aW9ucy5rZXksIG9wdGlvbnMudmFsdWUsICdcImZlYXR1cmUtc3RhdGVcIiBkYXRhIGV4cHJlc3Npb25zIGFyZSBub3Qgc3VwcG9ydGVkIHdpdGggZmlsdGVycy4nKV07XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuZXhwcmVzc2lvbkNvbnRleHQgJiYgb3B0aW9ucy5leHByZXNzaW9uQ29udGV4dC5pbmRleE9mKCdjbHVzdGVyJykgPT09IDApIHtcbiAgICAgICAgaWYgKCFpc0dsb2JhbFByb3BlcnR5Q29uc3RhbnQoZXhwcmVzc2lvbk9iaiwgWyd6b29tJywgJ2ZlYXR1cmUtc3RhdGUnXSkpIHtcbiAgICAgICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihvcHRpb25zLmtleSwgb3B0aW9ucy52YWx1ZSwgJ1wiem9vbVwiIGFuZCBcImZlYXR1cmUtc3RhdGVcIiBleHByZXNzaW9ucyBhcmUgbm90IHN1cHBvcnRlZCB3aXRoIGNsdXN0ZXIgcHJvcGVydGllcy4nKV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMuZXhwcmVzc2lvbkNvbnRleHQgPT09ICdjbHVzdGVyLWluaXRpYWwnICYmICFpc0ZlYXR1cmVDb25zdGFudChleHByZXNzaW9uT2JqKSkge1xuICAgICAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKG9wdGlvbnMua2V5LCBvcHRpb25zLnZhbHVlLCAnRmVhdHVyZSBkYXRhIGV4cHJlc3Npb25zIGFyZSBub3Qgc3VwcG9ydGVkIHdpdGggaW5pdGlhbCBleHByZXNzaW9uIHBhcnQgb2YgY2x1c3RlciBwcm9wZXJ0aWVzLicpXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBbXTtcbn1cbiIsIlxuaW1wb3J0IGdldFR5cGUgZnJvbSAnLi4vdXRpbC9nZXRfdHlwZSc7XG5pbXBvcnQgVmFsaWRhdGlvbkVycm9yIGZyb20gJy4uL2Vycm9yL3ZhbGlkYXRpb25fZXJyb3InO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB2YWxpZGF0ZUJvb2xlYW4ob3B0aW9ucykge1xuICAgIGNvbnN0IHZhbHVlID0gb3B0aW9ucy52YWx1ZTtcbiAgICBjb25zdCBrZXkgPSBvcHRpb25zLmtleTtcbiAgICBjb25zdCB0eXBlID0gZ2V0VHlwZSh2YWx1ZSk7XG5cbiAgICBpZiAodHlwZSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihrZXksIHZhbHVlLCBgYm9vbGVhbiBleHBlY3RlZCwgJHt0eXBlfSBmb3VuZGApXTtcbiAgICB9XG5cbiAgICByZXR1cm4gW107XG59XG4iLCJcbmltcG9ydCBWYWxpZGF0aW9uRXJyb3IgZnJvbSAnLi4vZXJyb3IvdmFsaWRhdGlvbl9lcnJvcic7XG5pbXBvcnQgZ2V0VHlwZSBmcm9tICcuLi91dGlsL2dldF90eXBlJztcbmltcG9ydCB7IHBhcnNlQ1NTQ29sb3IgfSBmcm9tICdjc3Njb2xvcnBhcnNlcic7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHZhbGlkYXRlQ29sb3Iob3B0aW9ucykge1xuICAgIGNvbnN0IGtleSA9IG9wdGlvbnMua2V5O1xuICAgIGNvbnN0IHZhbHVlID0gb3B0aW9ucy52YWx1ZTtcbiAgICBjb25zdCB0eXBlID0gZ2V0VHlwZSh2YWx1ZSk7XG5cbiAgICBpZiAodHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsIGBjb2xvciBleHBlY3RlZCwgJHt0eXBlfSBmb3VuZGApXTtcbiAgICB9XG5cbiAgICBpZiAocGFyc2VDU1NDb2xvcih2YWx1ZSkgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsIGBjb2xvciBleHBlY3RlZCwgXCIke3ZhbHVlfVwiIGZvdW5kYCldO1xuICAgIH1cblxuICAgIHJldHVybiBbXTtcbn1cbiIsIlxuaW1wb3J0IFZhbGlkYXRpb25FcnJvciBmcm9tICcuLi9lcnJvci92YWxpZGF0aW9uX2Vycm9yJztcbmltcG9ydCB7IHVuYnVuZGxlIH0gZnJvbSAnLi4vdXRpbC91bmJ1bmRsZV9qc29ubGludCc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHZhbGlkYXRlRW51bShvcHRpb25zKSB7XG4gICAgY29uc3Qga2V5ID0gb3B0aW9ucy5rZXk7XG4gICAgY29uc3QgdmFsdWUgPSBvcHRpb25zLnZhbHVlO1xuICAgIGNvbnN0IHZhbHVlU3BlYyA9IG9wdGlvbnMudmFsdWVTcGVjO1xuICAgIGNvbnN0IGVycm9ycyA9IFtdO1xuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWVTcGVjLnZhbHVlcykpIHsgLy8gPD12N1xuICAgICAgICBpZiAodmFsdWVTcGVjLnZhbHVlcy5pbmRleE9mKHVuYnVuZGxlKHZhbHVlKSkgPT09IC0xKSB7XG4gICAgICAgICAgICBlcnJvcnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsIGBleHBlY3RlZCBvbmUgb2YgWyR7dmFsdWVTcGVjLnZhbHVlcy5qb2luKCcsICcpfV0sICR7SlNPTi5zdHJpbmdpZnkodmFsdWUpfSBmb3VuZGApKTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7IC8vID49djhcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHZhbHVlU3BlYy52YWx1ZXMpLmluZGV4T2YodW5idW5kbGUodmFsdWUpKSA9PT0gLTEpIHtcbiAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCB2YWx1ZSwgYGV4cGVjdGVkIG9uZSBvZiBbJHtPYmplY3Qua2V5cyh2YWx1ZVNwZWMudmFsdWVzKS5qb2luKCcsICcpfV0sICR7SlNPTi5zdHJpbmdpZnkodmFsdWUpfSBmb3VuZGApKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZXJyb3JzO1xufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHsgY3JlYXRlRXhwcmVzc2lvbiB9IGZyb20gJy4uL2V4cHJlc3Npb24nO1xuXG5pbXBvcnQgdHlwZSB7R2xvYmFsUHJvcGVydGllc30gZnJvbSAnLi4vZXhwcmVzc2lvbic7XG5leHBvcnQgdHlwZSBGZWF0dXJlRmlsdGVyID0gKGdsb2JhbFByb3BlcnRpZXM6IEdsb2JhbFByb3BlcnRpZXMsIGZlYXR1cmU6IFZlY3RvclRpbGVGZWF0dXJlKSA9PiBib29sZWFuO1xuXG5leHBvcnQgZGVmYXVsdCBjcmVhdGVGaWx0ZXI7XG5leHBvcnQgeyBpc0V4cHJlc3Npb25GaWx0ZXIgfTtcblxuZnVuY3Rpb24gaXNFeHByZXNzaW9uRmlsdGVyKGZpbHRlcjogYW55KSB7XG4gICAgaWYgKGZpbHRlciA9PT0gdHJ1ZSB8fCBmaWx0ZXIgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmICghQXJyYXkuaXNBcnJheShmaWx0ZXIpIHx8IGZpbHRlci5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBzd2l0Y2ggKGZpbHRlclswXSkge1xuICAgIGNhc2UgJ2hhcyc6XG4gICAgICAgIHJldHVybiBmaWx0ZXIubGVuZ3RoID49IDIgJiYgZmlsdGVyWzFdICE9PSAnJGlkJyAmJiBmaWx0ZXJbMV0gIT09ICckdHlwZSc7XG5cbiAgICBjYXNlICdpbic6XG4gICAgY2FzZSAnIWluJzpcbiAgICBjYXNlICchaGFzJzpcbiAgICBjYXNlICdub25lJzpcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgY2FzZSAnPT0nOlxuICAgIGNhc2UgJyE9JzpcbiAgICBjYXNlICc+JzpcbiAgICBjYXNlICc+PSc6XG4gICAgY2FzZSAnPCc6XG4gICAgY2FzZSAnPD0nOlxuICAgICAgICByZXR1cm4gZmlsdGVyLmxlbmd0aCAhPT0gMyB8fCAoQXJyYXkuaXNBcnJheShmaWx0ZXJbMV0pIHx8IEFycmF5LmlzQXJyYXkoZmlsdGVyWzJdKSk7XG5cbiAgICBjYXNlICdhbnknOlxuICAgIGNhc2UgJ2FsbCc6XG4gICAgICAgIGZvciAoY29uc3QgZiBvZiBmaWx0ZXIuc2xpY2UoMSkpIHtcbiAgICAgICAgICAgIGlmICghaXNFeHByZXNzaW9uRmlsdGVyKGYpICYmIHR5cGVvZiBmICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG59XG5cbmNvbnN0IGZpbHRlclNwZWMgPSB7XG4gICAgJ3R5cGUnOiAnYm9vbGVhbicsXG4gICAgJ2RlZmF1bHQnOiBmYWxzZSxcbiAgICAndHJhbnNpdGlvbic6IGZhbHNlLFxuICAgICdwcm9wZXJ0eS10eXBlJzogJ2RhdGEtZHJpdmVuJyxcbiAgICAnZXhwcmVzc2lvbic6IHtcbiAgICAgICAgJ2ludGVycG9sYXRlZCc6IGZhbHNlLFxuICAgICAgICAncGFyYW1ldGVycyc6IFsnem9vbScsICdmZWF0dXJlJ11cbiAgICB9XG59O1xuXG4vKipcbiAqIEdpdmVuIGEgZmlsdGVyIGV4cHJlc3NlZCBhcyBuZXN0ZWQgYXJyYXlzLCByZXR1cm4gYSBuZXcgZnVuY3Rpb25cbiAqIHRoYXQgZXZhbHVhdGVzIHdoZXRoZXIgYSBnaXZlbiBmZWF0dXJlICh3aXRoIGEgLnByb3BlcnRpZXMgb3IgLnRhZ3MgcHJvcGVydHkpXG4gKiBwYXNzZXMgaXRzIHRlc3QuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGZpbHRlciBtYXBib3ggZ2wgZmlsdGVyXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IGZpbHRlci1ldmFsdWF0aW5nIGZ1bmN0aW9uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUZpbHRlcihmaWx0ZXI6IGFueSk6IEZlYXR1cmVGaWx0ZXIge1xuICAgIGlmIChmaWx0ZXIgPT09IG51bGwgfHwgZmlsdGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuICgpID0+IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKCFpc0V4cHJlc3Npb25GaWx0ZXIoZmlsdGVyKSkge1xuICAgICAgICBmaWx0ZXIgPSBjb252ZXJ0RmlsdGVyKGZpbHRlcik7XG4gICAgfVxuXG4gICAgY29uc3QgY29tcGlsZWQgPSBjcmVhdGVFeHByZXNzaW9uKGZpbHRlciwgZmlsdGVyU3BlYyk7XG4gICAgaWYgKGNvbXBpbGVkLnJlc3VsdCA9PT0gJ2Vycm9yJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoY29tcGlsZWQudmFsdWUubWFwKGVyciA9PiBgJHtlcnIua2V5fTogJHtlcnIubWVzc2FnZX1gKS5qb2luKCcsICcpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gKGdsb2JhbFByb3BlcnRpZXM6IEdsb2JhbFByb3BlcnRpZXMsIGZlYXR1cmU6IFZlY3RvclRpbGVGZWF0dXJlKSA9PiBjb21waWxlZC52YWx1ZS5ldmFsdWF0ZShnbG9iYWxQcm9wZXJ0aWVzLCBmZWF0dXJlKTtcbiAgICB9XG59XG5cbi8vIENvbXBhcmlzb24gZnVuY3Rpb24gdG8gc29ydCBudW1iZXJzIGFuZCBzdHJpbmdzXG5mdW5jdGlvbiBjb21wYXJlKGEsIGIpIHtcbiAgICByZXR1cm4gYSA8IGIgPyAtMSA6IGEgPiBiID8gMSA6IDA7XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRGaWx0ZXIoZmlsdGVyOiA/QXJyYXk8YW55Pik6IG1peGVkIHtcbiAgICBpZiAoIWZpbHRlcikgcmV0dXJuIHRydWU7XG4gICAgY29uc3Qgb3AgPSBmaWx0ZXJbMF07XG4gICAgaWYgKGZpbHRlci5sZW5ndGggPD0gMSkgcmV0dXJuIChvcCAhPT0gJ2FueScpO1xuICAgIGNvbnN0IGNvbnZlcnRlZCA9XG4gICAgICAgIG9wID09PSAnPT0nID8gY29udmVydENvbXBhcmlzb25PcChmaWx0ZXJbMV0sIGZpbHRlclsyXSwgJz09JykgOlxuICAgICAgICBvcCA9PT0gJyE9JyA/IGNvbnZlcnROZWdhdGlvbihjb252ZXJ0Q29tcGFyaXNvbk9wKGZpbHRlclsxXSwgZmlsdGVyWzJdLCAnPT0nKSkgOlxuICAgICAgICBvcCA9PT0gJzwnIHx8XG4gICAgICAgIG9wID09PSAnPicgfHxcbiAgICAgICAgb3AgPT09ICc8PScgfHxcbiAgICAgICAgb3AgPT09ICc+PScgPyBjb252ZXJ0Q29tcGFyaXNvbk9wKGZpbHRlclsxXSwgZmlsdGVyWzJdLCBvcCkgOlxuICAgICAgICBvcCA9PT0gJ2FueScgPyBjb252ZXJ0RGlzanVuY3Rpb25PcChmaWx0ZXIuc2xpY2UoMSkpIDpcbiAgICAgICAgb3AgPT09ICdhbGwnID8gWydhbGwnXS5jb25jYXQoZmlsdGVyLnNsaWNlKDEpLm1hcChjb252ZXJ0RmlsdGVyKSkgOlxuICAgICAgICBvcCA9PT0gJ25vbmUnID8gWydhbGwnXS5jb25jYXQoZmlsdGVyLnNsaWNlKDEpLm1hcChjb252ZXJ0RmlsdGVyKS5tYXAoY29udmVydE5lZ2F0aW9uKSkgOlxuICAgICAgICBvcCA9PT0gJ2luJyA/IGNvbnZlcnRJbk9wKGZpbHRlclsxXSwgZmlsdGVyLnNsaWNlKDIpKSA6XG4gICAgICAgIG9wID09PSAnIWluJyA/IGNvbnZlcnROZWdhdGlvbihjb252ZXJ0SW5PcChmaWx0ZXJbMV0sIGZpbHRlci5zbGljZSgyKSkpIDpcbiAgICAgICAgb3AgPT09ICdoYXMnID8gY29udmVydEhhc09wKGZpbHRlclsxXSkgOlxuICAgICAgICBvcCA9PT0gJyFoYXMnID8gY29udmVydE5lZ2F0aW9uKGNvbnZlcnRIYXNPcChmaWx0ZXJbMV0pKSA6XG4gICAgICAgIHRydWU7XG4gICAgcmV0dXJuIGNvbnZlcnRlZDtcbn1cblxuZnVuY3Rpb24gY29udmVydENvbXBhcmlzb25PcChwcm9wZXJ0eTogc3RyaW5nLCB2YWx1ZTogYW55LCBvcDogc3RyaW5nKSB7XG4gICAgc3dpdGNoIChwcm9wZXJ0eSkge1xuICAgIGNhc2UgJyR0eXBlJzpcbiAgICAgICAgcmV0dXJuIFtgZmlsdGVyLXR5cGUtJHtvcH1gLCB2YWx1ZV07XG4gICAgY2FzZSAnJGlkJzpcbiAgICAgICAgcmV0dXJuIFtgZmlsdGVyLWlkLSR7b3B9YCwgdmFsdWVdO1xuICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBbYGZpbHRlci0ke29wfWAsIHByb3BlcnR5LCB2YWx1ZV07XG4gICAgfVxufVxuXG5mdW5jdGlvbiBjb252ZXJ0RGlzanVuY3Rpb25PcChmaWx0ZXJzOiBBcnJheTxBcnJheTxhbnk+Pikge1xuICAgIHJldHVybiBbJ2FueSddLmNvbmNhdChmaWx0ZXJzLm1hcChjb252ZXJ0RmlsdGVyKSk7XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRJbk9wKHByb3BlcnR5OiBzdHJpbmcsIHZhbHVlczogQXJyYXk8YW55Pikge1xuICAgIGlmICh2YWx1ZXMubGVuZ3RoID09PSAwKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIHN3aXRjaCAocHJvcGVydHkpIHtcbiAgICBjYXNlICckdHlwZSc6XG4gICAgICAgIHJldHVybiBbYGZpbHRlci10eXBlLWluYCwgWydsaXRlcmFsJywgdmFsdWVzXV07XG4gICAgY2FzZSAnJGlkJzpcbiAgICAgICAgcmV0dXJuIFtgZmlsdGVyLWlkLWluYCwgWydsaXRlcmFsJywgdmFsdWVzXV07XG4gICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKHZhbHVlcy5sZW5ndGggPiAyMDAgJiYgIXZhbHVlcy5zb21lKHYgPT4gdHlwZW9mIHYgIT09IHR5cGVvZiB2YWx1ZXNbMF0pKSB7XG4gICAgICAgICAgICByZXR1cm4gWydmaWx0ZXItaW4tbGFyZ2UnLCBwcm9wZXJ0eSwgWydsaXRlcmFsJywgdmFsdWVzLnNvcnQoY29tcGFyZSldXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBbJ2ZpbHRlci1pbi1zbWFsbCcsIHByb3BlcnR5LCBbJ2xpdGVyYWwnLCB2YWx1ZXNdXTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gY29udmVydEhhc09wKHByb3BlcnR5OiBzdHJpbmcpIHtcbiAgICBzd2l0Y2ggKHByb3BlcnR5KSB7XG4gICAgY2FzZSAnJHR5cGUnOlxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICBjYXNlICckaWQnOlxuICAgICAgICByZXR1cm4gW2BmaWx0ZXItaGFzLWlkYF07XG4gICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIFtgZmlsdGVyLWhhc2AsIHByb3BlcnR5XTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnROZWdhdGlvbihmaWx0ZXI6IG1peGVkKSB7XG4gICAgcmV0dXJuIFsnIScsIGZpbHRlcl07XG59XG4iLCJcbmltcG9ydCBWYWxpZGF0aW9uRXJyb3IgZnJvbSAnLi4vZXJyb3IvdmFsaWRhdGlvbl9lcnJvcic7XG5pbXBvcnQgdmFsaWRhdGVFeHByZXNzaW9uIGZyb20gJy4vdmFsaWRhdGVfZXhwcmVzc2lvbic7XG5pbXBvcnQgdmFsaWRhdGVFbnVtIGZyb20gJy4vdmFsaWRhdGVfZW51bSc7XG5pbXBvcnQgZ2V0VHlwZSBmcm9tICcuLi91dGlsL2dldF90eXBlJztcbmltcG9ydCB7IHVuYnVuZGxlLCBkZWVwVW5idW5kbGUgfSBmcm9tICcuLi91dGlsL3VuYnVuZGxlX2pzb25saW50JztcbmltcG9ydCBleHRlbmQgZnJvbSAnLi4vdXRpbC9leHRlbmQnO1xuaW1wb3J0IHsgaXNFeHByZXNzaW9uRmlsdGVyIH0gZnJvbSAnLi4vZmVhdHVyZV9maWx0ZXInO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB2YWxpZGF0ZUZpbHRlcihvcHRpb25zKSB7XG4gICAgaWYgKGlzRXhwcmVzc2lvbkZpbHRlcihkZWVwVW5idW5kbGUob3B0aW9ucy52YWx1ZSkpKSB7XG4gICAgICAgIHJldHVybiB2YWxpZGF0ZUV4cHJlc3Npb24oZXh0ZW5kKHt9LCBvcHRpb25zLCB7XG4gICAgICAgICAgICBleHByZXNzaW9uQ29udGV4dDogJ2ZpbHRlcicsXG4gICAgICAgICAgICB2YWx1ZVNwZWM6IHsgdmFsdWU6ICdib29sZWFuJyB9XG4gICAgICAgIH0pKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdmFsaWRhdGVOb25FeHByZXNzaW9uRmlsdGVyKG9wdGlvbnMpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVOb25FeHByZXNzaW9uRmlsdGVyKG9wdGlvbnMpIHtcbiAgICBjb25zdCB2YWx1ZSA9IG9wdGlvbnMudmFsdWU7XG4gICAgY29uc3Qga2V5ID0gb3B0aW9ucy5rZXk7XG5cbiAgICBpZiAoZ2V0VHlwZSh2YWx1ZSkgIT09ICdhcnJheScpIHtcbiAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsIGBhcnJheSBleHBlY3RlZCwgJHtnZXRUeXBlKHZhbHVlKX0gZm91bmRgKV07XG4gICAgfVxuXG4gICAgY29uc3Qgc3R5bGVTcGVjID0gb3B0aW9ucy5zdHlsZVNwZWM7XG4gICAgbGV0IHR5cGU7XG5cbiAgICBsZXQgZXJyb3JzID0gW107XG5cbiAgICBpZiAodmFsdWUubGVuZ3RoIDwgMSkge1xuICAgICAgICByZXR1cm4gW25ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCB2YWx1ZSwgJ2ZpbHRlciBhcnJheSBtdXN0IGhhdmUgYXQgbGVhc3QgMSBlbGVtZW50JyldO1xuICAgIH1cblxuICAgIGVycm9ycyA9IGVycm9ycy5jb25jYXQodmFsaWRhdGVFbnVtKHtcbiAgICAgICAga2V5OiBgJHtrZXl9WzBdYCxcbiAgICAgICAgdmFsdWU6IHZhbHVlWzBdLFxuICAgICAgICB2YWx1ZVNwZWM6IHN0eWxlU3BlYy5maWx0ZXJfb3BlcmF0b3IsXG4gICAgICAgIHN0eWxlOiBvcHRpb25zLnN0eWxlLFxuICAgICAgICBzdHlsZVNwZWM6IG9wdGlvbnMuc3R5bGVTcGVjXG4gICAgfSkpO1xuXG4gICAgc3dpdGNoICh1bmJ1bmRsZSh2YWx1ZVswXSkpIHtcbiAgICBjYXNlICc8JzpcbiAgICBjYXNlICc8PSc6XG4gICAgY2FzZSAnPic6XG4gICAgY2FzZSAnPj0nOlxuICAgICAgICBpZiAodmFsdWUubGVuZ3RoID49IDIgJiYgdW5idW5kbGUodmFsdWVbMV0pID09PSAnJHR5cGUnKSB7XG4gICAgICAgICAgICBlcnJvcnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsIGBcIiR0eXBlXCIgY2Fubm90IGJlIHVzZSB3aXRoIG9wZXJhdG9yIFwiJHt2YWx1ZVswXX1cImApKTtcbiAgICAgICAgfVxuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgY2FzZSAnPT0nOlxuICAgIGNhc2UgJyE9JzpcbiAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCAhPT0gMykge1xuICAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihrZXksIHZhbHVlLCBgZmlsdGVyIGFycmF5IGZvciBvcGVyYXRvciBcIiR7dmFsdWVbMF19XCIgbXVzdCBoYXZlIDMgZWxlbWVudHNgKSk7XG4gICAgICAgIH1cbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgJ2luJzpcbiAgICBjYXNlICchaW4nOlxuICAgICAgICBpZiAodmFsdWUubGVuZ3RoID49IDIpIHtcbiAgICAgICAgICAgIHR5cGUgPSBnZXRUeXBlKHZhbHVlWzFdKTtcbiAgICAgICAgICAgIGlmICh0eXBlICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3IoYCR7a2V5fVsxXWAsIHZhbHVlWzFdLCBgc3RyaW5nIGV4cGVjdGVkLCAke3R5cGV9IGZvdW5kYCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAyOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHR5cGUgPSBnZXRUeXBlKHZhbHVlW2ldKTtcbiAgICAgICAgICAgIGlmICh1bmJ1bmRsZSh2YWx1ZVsxXSkgPT09ICckdHlwZScpIHtcbiAgICAgICAgICAgICAgICBlcnJvcnMgPSBlcnJvcnMuY29uY2F0KHZhbGlkYXRlRW51bSh7XG4gICAgICAgICAgICAgICAgICAgIGtleTogYCR7a2V5fVske2l9XWAsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZVtpXSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVTcGVjOiBzdHlsZVNwZWMuZ2VvbWV0cnlfdHlwZSxcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU6IG9wdGlvbnMuc3R5bGUsXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlU3BlYzogb3B0aW9ucy5zdHlsZVNwZWNcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgIT09ICdzdHJpbmcnICYmIHR5cGUgIT09ICdudW1iZXInICYmIHR5cGUgIT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3IoYCR7a2V5fVske2l9XWAsIHZhbHVlW2ldLCBgc3RyaW5nLCBudW1iZXIsIG9yIGJvb2xlYW4gZXhwZWN0ZWQsICR7dHlwZX0gZm91bmRgKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdhbnknOlxuICAgIGNhc2UgJ2FsbCc6XG4gICAgY2FzZSAnbm9uZSc6XG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGVycm9ycyA9IGVycm9ycy5jb25jYXQodmFsaWRhdGVOb25FeHByZXNzaW9uRmlsdGVyKHtcbiAgICAgICAgICAgICAgICBrZXk6IGAke2tleX1bJHtpfV1gLFxuICAgICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZVtpXSxcbiAgICAgICAgICAgICAgICBzdHlsZTogb3B0aW9ucy5zdHlsZSxcbiAgICAgICAgICAgICAgICBzdHlsZVNwZWM6IG9wdGlvbnMuc3R5bGVTcGVjXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdoYXMnOlxuICAgIGNhc2UgJyFoYXMnOlxuICAgICAgICB0eXBlID0gZ2V0VHlwZSh2YWx1ZVsxXSk7XG4gICAgICAgIGlmICh2YWx1ZS5sZW5ndGggIT09IDIpIHtcbiAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCB2YWx1ZSwgYGZpbHRlciBhcnJheSBmb3IgXCIke3ZhbHVlWzBdfVwiIG9wZXJhdG9yIG11c3QgaGF2ZSAyIGVsZW1lbnRzYCkpO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBlcnJvcnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKGAke2tleX1bMV1gLCB2YWx1ZVsxXSwgYHN0cmluZyBleHBlY3RlZCwgJHt0eXBlfSBmb3VuZGApKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgIH1cblxuICAgIHJldHVybiBlcnJvcnM7XG59XG4iLCJcbmltcG9ydCB2YWxpZGF0ZSBmcm9tICcuL3ZhbGlkYXRlJztcbmltcG9ydCBWYWxpZGF0aW9uRXJyb3IgZnJvbSAnLi4vZXJyb3IvdmFsaWRhdGlvbl9lcnJvcic7XG5pbXBvcnQgZ2V0VHlwZSBmcm9tICcuLi91dGlsL2dldF90eXBlJztcbmltcG9ydCB7IGlzRnVuY3Rpb24gfSBmcm9tICcuLi9mdW5jdGlvbic7XG5pbXBvcnQgeyB1bmJ1bmRsZSwgZGVlcFVuYnVuZGxlIH0gZnJvbSAnLi4vdXRpbC91bmJ1bmRsZV9qc29ubGludCc7XG5pbXBvcnQgeyBzdXBwb3J0c1Byb3BlcnR5RXhwcmVzc2lvbiB9IGZyb20gJy4uL3V0aWwvcHJvcGVydGllcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHZhbGlkYXRlUHJvcGVydHkob3B0aW9ucywgcHJvcGVydHlUeXBlKSB7XG4gICAgY29uc3Qga2V5ID0gb3B0aW9ucy5rZXk7XG4gICAgY29uc3Qgc3R5bGUgPSBvcHRpb25zLnN0eWxlO1xuICAgIGNvbnN0IHN0eWxlU3BlYyA9IG9wdGlvbnMuc3R5bGVTcGVjO1xuICAgIGNvbnN0IHZhbHVlID0gb3B0aW9ucy52YWx1ZTtcbiAgICBjb25zdCBwcm9wZXJ0eUtleSA9IG9wdGlvbnMub2JqZWN0S2V5O1xuICAgIGNvbnN0IGxheWVyU3BlYyA9IHN0eWxlU3BlY1tgJHtwcm9wZXJ0eVR5cGV9XyR7b3B0aW9ucy5sYXllclR5cGV9YF07XG5cbiAgICBpZiAoIWxheWVyU3BlYykgcmV0dXJuIFtdO1xuXG4gICAgY29uc3QgdHJhbnNpdGlvbk1hdGNoID0gcHJvcGVydHlLZXkubWF0Y2goL14oLiopLXRyYW5zaXRpb24kLyk7XG4gICAgaWYgKHByb3BlcnR5VHlwZSA9PT0gJ3BhaW50JyAmJiB0cmFuc2l0aW9uTWF0Y2ggJiYgbGF5ZXJTcGVjW3RyYW5zaXRpb25NYXRjaFsxXV0gJiYgbGF5ZXJTcGVjW3RyYW5zaXRpb25NYXRjaFsxXV0udHJhbnNpdGlvbikge1xuICAgICAgICByZXR1cm4gdmFsaWRhdGUoe1xuICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICB2YWx1ZVNwZWM6IHN0eWxlU3BlYy50cmFuc2l0aW9uLFxuICAgICAgICAgICAgc3R5bGUsXG4gICAgICAgICAgICBzdHlsZVNwZWNcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWVTcGVjID0gb3B0aW9ucy52YWx1ZVNwZWMgfHwgbGF5ZXJTcGVjW3Byb3BlcnR5S2V5XTtcbiAgICBpZiAoIXZhbHVlU3BlYykge1xuICAgICAgICByZXR1cm4gW25ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCB2YWx1ZSwgYHVua25vd24gcHJvcGVydHkgXCIke3Byb3BlcnR5S2V5fVwiYCldO1xuICAgIH1cblxuICAgIGxldCB0b2tlbk1hdGNoO1xuICAgIGlmIChnZXRUeXBlKHZhbHVlKSA9PT0gJ3N0cmluZycgJiYgc3VwcG9ydHNQcm9wZXJ0eUV4cHJlc3Npb24odmFsdWVTcGVjKSAmJiAhdmFsdWVTcGVjLnRva2VucyAmJiAodG9rZW5NYXRjaCA9IC9eeyhbXn1dKyl9JC8uZXhlYyh2YWx1ZSkpKSB7XG4gICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICAgIGtleSwgdmFsdWUsXG4gICAgICAgICAgICBgXCIke3Byb3BlcnR5S2V5fVwiIGRvZXMgbm90IHN1cHBvcnQgaW50ZXJwb2xhdGlvbiBzeW50YXhcXG5gICtcbiAgICAgICAgICAgICAgICBgVXNlIGFuIGlkZW50aXR5IHByb3BlcnR5IGZ1bmN0aW9uIGluc3RlYWQ6IFxcYHsgXCJ0eXBlXCI6IFwiaWRlbnRpdHlcIiwgXCJwcm9wZXJ0eVwiOiAke0pTT04uc3RyaW5naWZ5KHRva2VuTWF0Y2hbMV0pfSB9XFxgLmApXTtcbiAgICB9XG5cbiAgICBjb25zdCBlcnJvcnMgPSBbXTtcblxuICAgIGlmIChvcHRpb25zLmxheWVyVHlwZSA9PT0gJ3N5bWJvbCcpIHtcbiAgICAgICAgaWYgKHByb3BlcnR5S2V5ID09PSAndGV4dC1maWVsZCcgJiYgc3R5bGUgJiYgIXN0eWxlLmdseXBocykge1xuICAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihrZXksIHZhbHVlLCAndXNlIG9mIFwidGV4dC1maWVsZFwiIHJlcXVpcmVzIGEgc3R5bGUgXCJnbHlwaHNcIiBwcm9wZXJ0eScpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvcGVydHlLZXkgPT09ICd0ZXh0LWZvbnQnICYmIGlzRnVuY3Rpb24oZGVlcFVuYnVuZGxlKHZhbHVlKSkgJiYgdW5idW5kbGUodmFsdWUudHlwZSkgPT09ICdpZGVudGl0eScpIHtcbiAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCB2YWx1ZSwgJ1widGV4dC1mb250XCIgZG9lcyBub3Qgc3VwcG9ydCBpZGVudGl0eSBmdW5jdGlvbnMnKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZXJyb3JzLmNvbmNhdCh2YWxpZGF0ZSh7XG4gICAgICAgIGtleTogb3B0aW9ucy5rZXksXG4gICAgICAgIHZhbHVlLFxuICAgICAgICB2YWx1ZVNwZWMsXG4gICAgICAgIHN0eWxlLFxuICAgICAgICBzdHlsZVNwZWMsXG4gICAgICAgIGV4cHJlc3Npb25Db250ZXh0OiAncHJvcGVydHknLFxuICAgICAgICBwcm9wZXJ0eVR5cGUsXG4gICAgICAgIHByb3BlcnR5S2V5XG4gICAgfSkpO1xufVxuIiwiXG5pbXBvcnQgdmFsaWRhdGVQcm9wZXJ0eSBmcm9tICcuL3ZhbGlkYXRlX3Byb3BlcnR5JztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdmFsaWRhdGVQYWludFByb3BlcnR5KG9wdGlvbnMpIHtcbiAgICByZXR1cm4gdmFsaWRhdGVQcm9wZXJ0eShvcHRpb25zLCAncGFpbnQnKTtcbn1cbiIsIlxuaW1wb3J0IHZhbGlkYXRlUHJvcGVydHkgZnJvbSAnLi92YWxpZGF0ZV9wcm9wZXJ0eSc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHZhbGlkYXRlTGF5b3V0UHJvcGVydHkob3B0aW9ucykge1xuICAgIHJldHVybiB2YWxpZGF0ZVByb3BlcnR5KG9wdGlvbnMsICdsYXlvdXQnKTtcbn1cbiIsIlxuaW1wb3J0IFZhbGlkYXRpb25FcnJvciBmcm9tICcuLi9lcnJvci92YWxpZGF0aW9uX2Vycm9yJztcbmltcG9ydCB7IHVuYnVuZGxlIH0gZnJvbSAnLi4vdXRpbC91bmJ1bmRsZV9qc29ubGludCc7XG5pbXBvcnQgdmFsaWRhdGVPYmplY3QgZnJvbSAnLi92YWxpZGF0ZV9vYmplY3QnO1xuaW1wb3J0IHZhbGlkYXRlRmlsdGVyIGZyb20gJy4vdmFsaWRhdGVfZmlsdGVyJztcbmltcG9ydCB2YWxpZGF0ZVBhaW50UHJvcGVydHkgZnJvbSAnLi92YWxpZGF0ZV9wYWludF9wcm9wZXJ0eSc7XG5pbXBvcnQgdmFsaWRhdGVMYXlvdXRQcm9wZXJ0eSBmcm9tICcuL3ZhbGlkYXRlX2xheW91dF9wcm9wZXJ0eSc7XG5pbXBvcnQgdmFsaWRhdGVTcGVjIGZyb20gJy4vdmFsaWRhdGUnO1xuaW1wb3J0IGV4dGVuZCBmcm9tICcuLi91dGlsL2V4dGVuZCc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHZhbGlkYXRlTGF5ZXIob3B0aW9ucykge1xuICAgIGxldCBlcnJvcnMgPSBbXTtcblxuICAgIGNvbnN0IGxheWVyID0gb3B0aW9ucy52YWx1ZTtcbiAgICBjb25zdCBrZXkgPSBvcHRpb25zLmtleTtcbiAgICBjb25zdCBzdHlsZSA9IG9wdGlvbnMuc3R5bGU7XG4gICAgY29uc3Qgc3R5bGVTcGVjID0gb3B0aW9ucy5zdHlsZVNwZWM7XG5cbiAgICBpZiAoIWxheWVyLnR5cGUgJiYgIWxheWVyLnJlZikge1xuICAgICAgICBlcnJvcnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgbGF5ZXIsICdlaXRoZXIgXCJ0eXBlXCIgb3IgXCJyZWZcIiBpcyByZXF1aXJlZCcpKTtcbiAgICB9XG4gICAgbGV0IHR5cGUgPSB1bmJ1bmRsZShsYXllci50eXBlKTtcbiAgICBjb25zdCByZWYgPSB1bmJ1bmRsZShsYXllci5yZWYpO1xuXG4gICAgaWYgKGxheWVyLmlkKSB7XG4gICAgICAgIGNvbnN0IGxheWVySWQgPSB1bmJ1bmRsZShsYXllci5pZCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3B0aW9ucy5hcnJheUluZGV4OyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IG90aGVyTGF5ZXIgPSBzdHlsZS5sYXllcnNbaV07XG4gICAgICAgICAgICBpZiAodW5idW5kbGUob3RoZXJMYXllci5pZCkgPT09IGxheWVySWQpIHtcbiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgbGF5ZXIuaWQsIGBkdXBsaWNhdGUgbGF5ZXIgaWQgXCIke2xheWVyLmlkfVwiLCBwcmV2aW91c2x5IHVzZWQgYXQgbGluZSAke290aGVyTGF5ZXIuaWQuX19saW5lX199YCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCdyZWYnIGluIGxheWVyKSB7XG4gICAgICAgIFsndHlwZScsICdzb3VyY2UnLCAnc291cmNlLWxheWVyJywgJ2ZpbHRlcicsICdsYXlvdXQnXS5mb3JFYWNoKChwKSA9PiB7XG4gICAgICAgICAgICBpZiAocCBpbiBsYXllcikge1xuICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCBsYXllcltwXSwgYFwiJHtwfVwiIGlzIHByb2hpYml0ZWQgZm9yIHJlZiBsYXllcnNgKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGxldCBwYXJlbnQ7XG5cbiAgICAgICAgc3R5bGUubGF5ZXJzLmZvckVhY2goKGxheWVyKSA9PiB7XG4gICAgICAgICAgICBpZiAodW5idW5kbGUobGF5ZXIuaWQpID09PSByZWYpIHBhcmVudCA9IGxheWVyO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoIXBhcmVudCkge1xuICAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihrZXksIGxheWVyLnJlZiwgYHJlZiBsYXllciBcIiR7cmVmfVwiIG5vdCBmb3VuZGApKTtcbiAgICAgICAgfSBlbHNlIGlmIChwYXJlbnQucmVmKSB7XG4gICAgICAgICAgICBlcnJvcnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgbGF5ZXIucmVmLCAncmVmIGNhbm5vdCByZWZlcmVuY2UgYW5vdGhlciByZWYgbGF5ZXInKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0eXBlID0gdW5idW5kbGUocGFyZW50LnR5cGUpO1xuICAgICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlICE9PSAnYmFja2dyb3VuZCcpIHtcbiAgICAgICAgaWYgKCFsYXllci5zb3VyY2UpIHtcbiAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCBsYXllciwgJ21pc3NpbmcgcmVxdWlyZWQgcHJvcGVydHkgXCJzb3VyY2VcIicpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZSA9IHN0eWxlLnNvdXJjZXMgJiYgc3R5bGUuc291cmNlc1tsYXllci5zb3VyY2VdO1xuICAgICAgICAgICAgY29uc3Qgc291cmNlVHlwZSA9IHNvdXJjZSAmJiB1bmJ1bmRsZShzb3VyY2UudHlwZSk7XG4gICAgICAgICAgICBpZiAoIXNvdXJjZSkge1xuICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCBsYXllci5zb3VyY2UsIGBzb3VyY2UgXCIke2xheWVyLnNvdXJjZX1cIiBub3QgZm91bmRgKSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHNvdXJjZVR5cGUgPT09ICd2ZWN0b3InICYmIHR5cGUgPT09ICdyYXN0ZXInKSB7XG4gICAgICAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihrZXksIGxheWVyLnNvdXJjZSwgYGxheWVyIFwiJHtsYXllci5pZH1cIiByZXF1aXJlcyBhIHJhc3RlciBzb3VyY2VgKSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHNvdXJjZVR5cGUgPT09ICdyYXN0ZXInICYmIHR5cGUgIT09ICdyYXN0ZXInKSB7XG4gICAgICAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihrZXksIGxheWVyLnNvdXJjZSwgYGxheWVyIFwiJHtsYXllci5pZH1cIiByZXF1aXJlcyBhIHZlY3RvciBzb3VyY2VgKSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHNvdXJjZVR5cGUgPT09ICd2ZWN0b3InICYmICFsYXllclsnc291cmNlLWxheWVyJ10pIHtcbiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgbGF5ZXIsIGBsYXllciBcIiR7bGF5ZXIuaWR9XCIgbXVzdCBzcGVjaWZ5IGEgXCJzb3VyY2UtbGF5ZXJcImApKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc291cmNlVHlwZSA9PT0gJ3Jhc3Rlci1kZW0nICYmIHR5cGUgIT09ICdoaWxsc2hhZGUnKSB7XG4gICAgICAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihrZXksIGxheWVyLnNvdXJjZSwgJ3Jhc3Rlci1kZW0gc291cmNlIGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBsYXllciB0eXBlIFxcJ2hpbGxzaGFkZVxcJy4nKSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdsaW5lJyAmJiBsYXllci5wYWludCAmJiBsYXllci5wYWludFsnbGluZS1ncmFkaWVudCddICYmXG4gICAgICAgICAgICAgICAgICAgICAgIChzb3VyY2VUeXBlICE9PSAnZ2VvanNvbicgfHwgIXNvdXJjZS5saW5lTWV0cmljcykpIHtcbiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgbGF5ZXIsIGBsYXllciBcIiR7bGF5ZXIuaWR9XCIgc3BlY2lmaWVzIGEgbGluZS1ncmFkaWVudCwgd2hpY2ggcmVxdWlyZXMgYSBHZW9KU09OIHNvdXJjZSB3aXRoIFxcYGxpbmVNZXRyaWNzXFxgIGVuYWJsZWQuYCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZXJyb3JzID0gZXJyb3JzLmNvbmNhdCh2YWxpZGF0ZU9iamVjdCh7XG4gICAgICAgIGtleSxcbiAgICAgICAgdmFsdWU6IGxheWVyLFxuICAgICAgICB2YWx1ZVNwZWM6IHN0eWxlU3BlYy5sYXllcixcbiAgICAgICAgc3R5bGU6IG9wdGlvbnMuc3R5bGUsXG4gICAgICAgIHN0eWxlU3BlYzogb3B0aW9ucy5zdHlsZVNwZWMsXG4gICAgICAgIG9iamVjdEVsZW1lbnRWYWxpZGF0b3JzOiB7XG4gICAgICAgICAgICAnKicoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC8vIFdlIGRvbid0IHdhbnQgdG8gZW5mb3JjZSB0aGUgc3BlYydzIGBcInJlcXVpcmVzXCI6IHRydWVgIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggcmVmcztcbiAgICAgICAgICAgIC8vIHRoZSBhY3R1YWwgcmVxdWlyZW1lbnQgaXMgdmFsaWRhdGVkIGFib3ZlLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL21hcGJveC9tYXBib3gtZ2wtanMvaXNzdWVzLzU3NzIuXG4gICAgICAgICAgICB0eXBlKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWxpZGF0ZVNwZWMoe1xuICAgICAgICAgICAgICAgICAgICBrZXk6IGAke2tleX0udHlwZWAsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBsYXllci50eXBlLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZVNwZWM6IHN0eWxlU3BlYy5sYXllci50eXBlLFxuICAgICAgICAgICAgICAgICAgICBzdHlsZTogb3B0aW9ucy5zdHlsZSxcbiAgICAgICAgICAgICAgICAgICAgc3R5bGVTcGVjOiBvcHRpb25zLnN0eWxlU3BlYyxcbiAgICAgICAgICAgICAgICAgICAgb2JqZWN0OiBsYXllcixcbiAgICAgICAgICAgICAgICAgICAgb2JqZWN0S2V5OiAndHlwZSdcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBmaWx0ZXI6IHZhbGlkYXRlRmlsdGVyLFxuICAgICAgICAgICAgbGF5b3V0KG9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsaWRhdGVPYmplY3Qoe1xuICAgICAgICAgICAgICAgICAgICBsYXllcixcbiAgICAgICAgICAgICAgICAgICAga2V5OiBvcHRpb25zLmtleSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG9wdGlvbnMudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlOiBvcHRpb25zLnN0eWxlLFxuICAgICAgICAgICAgICAgICAgICBzdHlsZVNwZWM6IG9wdGlvbnMuc3R5bGVTcGVjLFxuICAgICAgICAgICAgICAgICAgICBvYmplY3RFbGVtZW50VmFsaWRhdG9yczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgJyonKG9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsaWRhdGVMYXlvdXRQcm9wZXJ0eShleHRlbmQoe2xheWVyVHlwZTogdHlwZX0sIG9wdGlvbnMpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHBhaW50KG9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsaWRhdGVPYmplY3Qoe1xuICAgICAgICAgICAgICAgICAgICBsYXllcixcbiAgICAgICAgICAgICAgICAgICAga2V5OiBvcHRpb25zLmtleSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG9wdGlvbnMudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlOiBvcHRpb25zLnN0eWxlLFxuICAgICAgICAgICAgICAgICAgICBzdHlsZVNwZWM6IG9wdGlvbnMuc3R5bGVTcGVjLFxuICAgICAgICAgICAgICAgICAgICBvYmplY3RFbGVtZW50VmFsaWRhdG9yczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgJyonKG9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsaWRhdGVQYWludFByb3BlcnR5KGV4dGVuZCh7bGF5ZXJUeXBlOiB0eXBlfSwgb3B0aW9ucykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KSk7XG5cbiAgICByZXR1cm4gZXJyb3JzO1xufVxuIiwiXG5pbXBvcnQgVmFsaWRhdGlvbkVycm9yIGZyb20gJy4uL2Vycm9yL3ZhbGlkYXRpb25fZXJyb3InO1xuaW1wb3J0IHsgdW5idW5kbGUgfSBmcm9tICcuLi91dGlsL3VuYnVuZGxlX2pzb25saW50JztcbmltcG9ydCB2YWxpZGF0ZU9iamVjdCBmcm9tICcuL3ZhbGlkYXRlX29iamVjdCc7XG5pbXBvcnQgdmFsaWRhdGVFbnVtIGZyb20gJy4vdmFsaWRhdGVfZW51bSc7XG5pbXBvcnQgdmFsaWRhdGVFeHByZXNzaW9uIGZyb20gJy4vdmFsaWRhdGVfZXhwcmVzc2lvbic7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHZhbGlkYXRlU291cmNlKG9wdGlvbnMpIHtcbiAgICBjb25zdCB2YWx1ZSA9IG9wdGlvbnMudmFsdWU7XG4gICAgY29uc3Qga2V5ID0gb3B0aW9ucy5rZXk7XG4gICAgY29uc3Qgc3R5bGVTcGVjID0gb3B0aW9ucy5zdHlsZVNwZWM7XG4gICAgY29uc3Qgc3R5bGUgPSBvcHRpb25zLnN0eWxlO1xuXG4gICAgaWYgKCF2YWx1ZS50eXBlKSB7XG4gICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihrZXksIHZhbHVlLCAnXCJ0eXBlXCIgaXMgcmVxdWlyZWQnKV07XG4gICAgfVxuXG4gICAgY29uc3QgdHlwZSA9IHVuYnVuZGxlKHZhbHVlLnR5cGUpO1xuICAgIGxldCBlcnJvcnM7XG5cbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlICd2ZWN0b3InOlxuICAgIGNhc2UgJ3Jhc3Rlcic6XG4gICAgY2FzZSAncmFzdGVyLWRlbSc6XG4gICAgICAgIGVycm9ycyA9IHZhbGlkYXRlT2JqZWN0KHtcbiAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgdmFsdWVTcGVjOiBzdHlsZVNwZWNbYHNvdXJjZV8ke3R5cGUucmVwbGFjZSgnLScsICdfJyl9YF0sXG4gICAgICAgICAgICBzdHlsZTogb3B0aW9ucy5zdHlsZSxcbiAgICAgICAgICAgIHN0eWxlU3BlY1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCd1cmwnIGluIHZhbHVlKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHByb3AgaW4gdmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoWyd0eXBlJywgJ3VybCcsICd0aWxlU2l6ZSddLmluZGV4T2YocHJvcCkgPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3IoYCR7a2V5fS4ke3Byb3B9YCwgdmFsdWVbcHJvcF0sIGBhIHNvdXJjZSB3aXRoIGEgXCJ1cmxcIiBwcm9wZXJ0eSBtYXkgbm90IGluY2x1ZGUgYSBcIiR7cHJvcH1cIiBwcm9wZXJ0eWApKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVycm9ycztcblxuICAgIGNhc2UgJ2dlb2pzb24nOlxuICAgICAgICBlcnJvcnMgPSB2YWxpZGF0ZU9iamVjdCh7XG4gICAgICAgICAgICBrZXksXG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIHZhbHVlU3BlYzogc3R5bGVTcGVjLnNvdXJjZV9nZW9qc29uLFxuICAgICAgICAgICAgc3R5bGUsXG4gICAgICAgICAgICBzdHlsZVNwZWNcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICh2YWx1ZS5jbHVzdGVyKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHByb3AgaW4gdmFsdWUuY2x1c3RlclByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBbb3BlcmF0b3IsIG1hcEV4cHJdID0gdmFsdWUuY2x1c3RlclByb3BlcnRpZXNbcHJvcF07XG4gICAgICAgICAgICAgICAgY29uc3QgcmVkdWNlRXhwciA9IHR5cGVvZiBvcGVyYXRvciA9PT0gJ3N0cmluZycgPyBbb3BlcmF0b3IsIFsnYWNjdW11bGF0ZWQnXSwgWydnZXQnLCBwcm9wXV0gOiBvcGVyYXRvcjtcblxuICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKC4uLnZhbGlkYXRlRXhwcmVzc2lvbih7XG4gICAgICAgICAgICAgICAgICAgIGtleTogYCR7a2V5fS4ke3Byb3B9Lm1hcGAsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBtYXBFeHByLFxuICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uQ29udGV4dDogJ2NsdXN0ZXItbWFwJ1xuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaCguLi52YWxpZGF0ZUV4cHJlc3Npb24oe1xuICAgICAgICAgICAgICAgICAgICBrZXk6IGAke2tleX0uJHtwcm9wfS5yZWR1Y2VgLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogcmVkdWNlRXhwcixcbiAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbkNvbnRleHQ6ICdjbHVzdGVyLXJlZHVjZSdcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVycm9ycztcblxuICAgIGNhc2UgJ3ZpZGVvJzpcbiAgICAgICAgcmV0dXJuIHZhbGlkYXRlT2JqZWN0KHtcbiAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgdmFsdWVTcGVjOiBzdHlsZVNwZWMuc291cmNlX3ZpZGVvLFxuICAgICAgICAgICAgc3R5bGUsXG4gICAgICAgICAgICBzdHlsZVNwZWNcbiAgICAgICAgfSk7XG5cbiAgICBjYXNlICdpbWFnZSc6XG4gICAgICAgIHJldHVybiB2YWxpZGF0ZU9iamVjdCh7XG4gICAgICAgICAgICBrZXksXG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIHZhbHVlU3BlYzogc3R5bGVTcGVjLnNvdXJjZV9pbWFnZSxcbiAgICAgICAgICAgIHN0eWxlLFxuICAgICAgICAgICAgc3R5bGVTcGVjXG4gICAgICAgIH0pO1xuXG4gICAgY2FzZSAnY2FudmFzJzpcbiAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgbnVsbCwgYFBsZWFzZSB1c2UgcnVudGltZSBBUElzIHRvIGFkZCBjYW52YXMgc291cmNlcywgcmF0aGVyIHRoYW4gaW5jbHVkaW5nIHRoZW0gaW4gc3R5bGVzaGVldHMuYCwgJ3NvdXJjZS5jYW52YXMnKV07XG5cbiAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdmFsaWRhdGVFbnVtKHtcbiAgICAgICAgICAgIGtleTogYCR7a2V5fS50eXBlYCxcbiAgICAgICAgICAgIHZhbHVlOiB2YWx1ZS50eXBlLFxuICAgICAgICAgICAgdmFsdWVTcGVjOiB7dmFsdWVzOiBbJ3ZlY3RvcicsICdyYXN0ZXInLCAncmFzdGVyLWRlbScsICdnZW9qc29uJywgJ3ZpZGVvJywgJ2ltYWdlJ119LFxuICAgICAgICAgICAgc3R5bGUsXG4gICAgICAgICAgICBzdHlsZVNwZWNcbiAgICAgICAgfSk7XG4gICAgfVxufVxuIiwiXG5pbXBvcnQgVmFsaWRhdGlvbkVycm9yIGZyb20gJy4uL2Vycm9yL3ZhbGlkYXRpb25fZXJyb3InO1xuaW1wb3J0IGdldFR5cGUgZnJvbSAnLi4vdXRpbC9nZXRfdHlwZSc7XG5pbXBvcnQgdmFsaWRhdGUgZnJvbSAnLi92YWxpZGF0ZSc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHZhbGlkYXRlTGlnaHQob3B0aW9ucykge1xuICAgIGNvbnN0IGxpZ2h0ID0gb3B0aW9ucy52YWx1ZTtcbiAgICBjb25zdCBzdHlsZVNwZWMgPSBvcHRpb25zLnN0eWxlU3BlYztcbiAgICBjb25zdCBsaWdodFNwZWMgPSBzdHlsZVNwZWMubGlnaHQ7XG4gICAgY29uc3Qgc3R5bGUgPSBvcHRpb25zLnN0eWxlO1xuXG4gICAgbGV0IGVycm9ycyA9IFtdO1xuXG4gICAgY29uc3Qgcm9vdFR5cGUgPSBnZXRUeXBlKGxpZ2h0KTtcbiAgICBpZiAobGlnaHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gZXJyb3JzO1xuICAgIH0gZWxzZSBpZiAocm9vdFR5cGUgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIGVycm9ycyA9IGVycm9ycy5jb25jYXQoW25ldyBWYWxpZGF0aW9uRXJyb3IoJ2xpZ2h0JywgbGlnaHQsIGBvYmplY3QgZXhwZWN0ZWQsICR7cm9vdFR5cGV9IGZvdW5kYCldKTtcbiAgICAgICAgcmV0dXJuIGVycm9ycztcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBsaWdodCkge1xuICAgICAgICBjb25zdCB0cmFuc2l0aW9uTWF0Y2ggPSBrZXkubWF0Y2goL14oLiopLXRyYW5zaXRpb24kLyk7XG5cbiAgICAgICAgaWYgKHRyYW5zaXRpb25NYXRjaCAmJiBsaWdodFNwZWNbdHJhbnNpdGlvbk1hdGNoWzFdXSAmJiBsaWdodFNwZWNbdHJhbnNpdGlvbk1hdGNoWzFdXS50cmFuc2l0aW9uKSB7XG4gICAgICAgICAgICBlcnJvcnMgPSBlcnJvcnMuY29uY2F0KHZhbGlkYXRlKHtcbiAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgdmFsdWU6IGxpZ2h0W2tleV0sXG4gICAgICAgICAgICAgICAgdmFsdWVTcGVjOiBzdHlsZVNwZWMudHJhbnNpdGlvbixcbiAgICAgICAgICAgICAgICBzdHlsZSxcbiAgICAgICAgICAgICAgICBzdHlsZVNwZWNcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChsaWdodFNwZWNba2V5XSkge1xuICAgICAgICAgICAgZXJyb3JzID0gZXJyb3JzLmNvbmNhdCh2YWxpZGF0ZSh7XG4gICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgIHZhbHVlOiBsaWdodFtrZXldLFxuICAgICAgICAgICAgICAgIHZhbHVlU3BlYzogbGlnaHRTcGVjW2tleV0sXG4gICAgICAgICAgICAgICAgc3R5bGUsXG4gICAgICAgICAgICAgICAgc3R5bGVTcGVjXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlcnJvcnMgPSBlcnJvcnMuY29uY2F0KFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgbGlnaHRba2V5XSwgYHVua25vd24gcHJvcGVydHkgXCIke2tleX1cImApXSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZXJyb3JzO1xufVxuIiwiXG5pbXBvcnQgZ2V0VHlwZSBmcm9tICcuLi91dGlsL2dldF90eXBlJztcbmltcG9ydCBWYWxpZGF0aW9uRXJyb3IgZnJvbSAnLi4vZXJyb3IvdmFsaWRhdGlvbl9lcnJvcic7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHZhbGlkYXRlU3RyaW5nKG9wdGlvbnMpIHtcbiAgICBjb25zdCB2YWx1ZSA9IG9wdGlvbnMudmFsdWU7XG4gICAgY29uc3Qga2V5ID0gb3B0aW9ucy5rZXk7XG4gICAgY29uc3QgdHlwZSA9IGdldFR5cGUodmFsdWUpO1xuXG4gICAgaWYgKHR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihrZXksIHZhbHVlLCBgc3RyaW5nIGV4cGVjdGVkLCAke3R5cGV9IGZvdW5kYCldO1xuICAgIH1cblxuICAgIHJldHVybiBbXTtcbn1cbiIsIi8vIEBmbG93XG5pbXBvcnQgdmFsaWRhdGVFeHByZXNzaW9uIGZyb20gJy4vdmFsaWRhdGVfZXhwcmVzc2lvbic7XG5pbXBvcnQgdmFsaWRhdGVTdHJpbmcgZnJvbSAnLi92YWxpZGF0ZV9zdHJpbmcnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB2YWxpZGF0ZUZvcm1hdHRlZChvcHRpb25zOiBhbnkpIHtcbiAgICBpZiAodmFsaWRhdGVTdHJpbmcob3B0aW9ucykubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsaWRhdGVFeHByZXNzaW9uKG9wdGlvbnMpO1xufVxuIiwiXG5pbXBvcnQgZXh0ZW5kIGZyb20gJy4uL3V0aWwvZXh0ZW5kJztcbmltcG9ydCB7IHVuYnVuZGxlLCBkZWVwVW5idW5kbGUgfSBmcm9tICcuLi91dGlsL3VuYnVuZGxlX2pzb25saW50JztcbmltcG9ydCB7IGlzRXhwcmVzc2lvbiB9IGZyb20gJy4uL2V4cHJlc3Npb24nO1xuaW1wb3J0IHsgaXNGdW5jdGlvbiB9IGZyb20gJy4uL2Z1bmN0aW9uJztcblxuaW1wb3J0IHZhbGlkYXRlRnVuY3Rpb24gZnJvbSAnLi92YWxpZGF0ZV9mdW5jdGlvbic7XG5pbXBvcnQgdmFsaWRhdGVFeHByZXNzaW9uIGZyb20gJy4vdmFsaWRhdGVfZXhwcmVzc2lvbic7XG5pbXBvcnQgdmFsaWRhdGVPYmplY3QgZnJvbSAnLi92YWxpZGF0ZV9vYmplY3QnO1xuaW1wb3J0IHZhbGlkYXRlQXJyYXkgZnJvbSAnLi92YWxpZGF0ZV9hcnJheSc7XG5pbXBvcnQgdmFsaWRhdGVCb29sZWFuIGZyb20gJy4vdmFsaWRhdGVfYm9vbGVhbic7XG5pbXBvcnQgdmFsaWRhdGVOdW1iZXIgZnJvbSAnLi92YWxpZGF0ZV9udW1iZXInO1xuaW1wb3J0IHZhbGlkYXRlQ29sb3IgZnJvbSAnLi92YWxpZGF0ZV9jb2xvcic7XG5pbXBvcnQgdmFsaWRhdGVDb25zdGFudHMgZnJvbSAnLi92YWxpZGF0ZV9jb25zdGFudHMnO1xuaW1wb3J0IHZhbGlkYXRlRW51bSBmcm9tICcuL3ZhbGlkYXRlX2VudW0nO1xuaW1wb3J0IHZhbGlkYXRlRmlsdGVyIGZyb20gJy4vdmFsaWRhdGVfZmlsdGVyJztcbmltcG9ydCB2YWxpZGF0ZUxheWVyIGZyb20gJy4vdmFsaWRhdGVfbGF5ZXInO1xuaW1wb3J0IHZhbGlkYXRlU291cmNlIGZyb20gJy4vdmFsaWRhdGVfc291cmNlJztcbmltcG9ydCB2YWxpZGF0ZUxpZ2h0IGZyb20gJy4vdmFsaWRhdGVfbGlnaHQnO1xuaW1wb3J0IHZhbGlkYXRlU3RyaW5nIGZyb20gJy4vdmFsaWRhdGVfc3RyaW5nJztcbmltcG9ydCB2YWxpZGF0ZUZvcm1hdHRlZCBmcm9tICcuL3ZhbGlkYXRlX2Zvcm1hdHRlZCc7XG5cbmNvbnN0IFZBTElEQVRPUlMgPSB7XG4gICAgJyonKCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfSxcbiAgICAnYXJyYXknOiB2YWxpZGF0ZUFycmF5LFxuICAgICdib29sZWFuJzogdmFsaWRhdGVCb29sZWFuLFxuICAgICdudW1iZXInOiB2YWxpZGF0ZU51bWJlcixcbiAgICAnY29sb3InOiB2YWxpZGF0ZUNvbG9yLFxuICAgICdjb25zdGFudHMnOiB2YWxpZGF0ZUNvbnN0YW50cyxcbiAgICAnZW51bSc6IHZhbGlkYXRlRW51bSxcbiAgICAnZmlsdGVyJzogdmFsaWRhdGVGaWx0ZXIsXG4gICAgJ2Z1bmN0aW9uJzogdmFsaWRhdGVGdW5jdGlvbixcbiAgICAnbGF5ZXInOiB2YWxpZGF0ZUxheWVyLFxuICAgICdvYmplY3QnOiB2YWxpZGF0ZU9iamVjdCxcbiAgICAnc291cmNlJzogdmFsaWRhdGVTb3VyY2UsXG4gICAgJ2xpZ2h0JzogdmFsaWRhdGVMaWdodCxcbiAgICAnc3RyaW5nJzogdmFsaWRhdGVTdHJpbmcsXG4gICAgJ2Zvcm1hdHRlZCc6IHZhbGlkYXRlRm9ybWF0dGVkXG59O1xuXG5cbi8vIE1haW4gcmVjdXJzaXZlIHZhbGlkYXRpb24gZnVuY3Rpb24uIFRyYWNrczpcbi8vXG4vLyAtIGtleTogc3RyaW5nIHJlcHJlc2VudGluZyBsb2NhdGlvbiBvZiB2YWxpZGF0aW9uIGluIHN0eWxlIHRyZWUuIFVzZWQgb25seVxuLy8gICBmb3IgbW9yZSBpbmZvcm1hdGl2ZSBlcnJvciByZXBvcnRpbmcuXG4vLyAtIHZhbHVlOiBjdXJyZW50IHZhbHVlIGZyb20gc3R5bGUgYmVpbmcgZXZhbHVhdGVkLiBNYXkgYmUgYW55dGhpbmcgZnJvbSBhXG4vLyAgIGhpZ2ggbGV2ZWwgb2JqZWN0IHRoYXQgbmVlZHMgdG8gYmUgZGVzY2VuZGVkIGludG8gZGVlcGVyIG9yIGEgc2ltcGxlXG4vLyAgIHNjYWxhciB2YWx1ZS5cbi8vIC0gdmFsdWVTcGVjOiBjdXJyZW50IHNwZWMgYmVpbmcgZXZhbHVhdGVkLiBUcmFja3MgdmFsdWUuXG4vLyAtIHN0eWxlU3BlYzogY3VycmVudCBmdWxsIHNwZWMgYmVpbmcgZXZhbHVhdGVkLlxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB2YWxpZGF0ZShvcHRpb25zKSB7XG4gICAgY29uc3QgdmFsdWUgPSBvcHRpb25zLnZhbHVlO1xuICAgIGNvbnN0IHZhbHVlU3BlYyA9IG9wdGlvbnMudmFsdWVTcGVjO1xuICAgIGNvbnN0IHN0eWxlU3BlYyA9IG9wdGlvbnMuc3R5bGVTcGVjO1xuXG4gICAgaWYgKHZhbHVlU3BlYy5leHByZXNzaW9uICYmIGlzRnVuY3Rpb24odW5idW5kbGUodmFsdWUpKSkge1xuICAgICAgICByZXR1cm4gdmFsaWRhdGVGdW5jdGlvbihvcHRpb25zKTtcblxuICAgIH0gZWxzZSBpZiAodmFsdWVTcGVjLmV4cHJlc3Npb24gJiYgaXNFeHByZXNzaW9uKGRlZXBVbmJ1bmRsZSh2YWx1ZSkpKSB7XG4gICAgICAgIHJldHVybiB2YWxpZGF0ZUV4cHJlc3Npb24ob3B0aW9ucyk7XG5cbiAgICB9IGVsc2UgaWYgKHZhbHVlU3BlYy50eXBlICYmIFZBTElEQVRPUlNbdmFsdWVTcGVjLnR5cGVdKSB7XG4gICAgICAgIHJldHVybiBWQUxJREFUT1JTW3ZhbHVlU3BlYy50eXBlXShvcHRpb25zKTtcblxuICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHZhbGlkID0gdmFsaWRhdGVPYmplY3QoZXh0ZW5kKHt9LCBvcHRpb25zLCB7XG4gICAgICAgICAgICB2YWx1ZVNwZWM6IHZhbHVlU3BlYy50eXBlID8gc3R5bGVTcGVjW3ZhbHVlU3BlYy50eXBlXSA6IHZhbHVlU3BlY1xuICAgICAgICB9KSk7XG4gICAgICAgIHJldHVybiB2YWxpZDtcbiAgICB9XG59XG4iLCJcbmltcG9ydCBWYWxpZGF0aW9uRXJyb3IgZnJvbSAnLi4vZXJyb3IvdmFsaWRhdGlvbl9lcnJvcic7XG5pbXBvcnQgdmFsaWRhdGVTdHJpbmcgZnJvbSAnLi92YWxpZGF0ZV9zdHJpbmcnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgY29uc3QgdmFsdWUgPSBvcHRpb25zLnZhbHVlO1xuICAgIGNvbnN0IGtleSA9IG9wdGlvbnMua2V5O1xuXG4gICAgY29uc3QgZXJyb3JzID0gdmFsaWRhdGVTdHJpbmcob3B0aW9ucyk7XG4gICAgaWYgKGVycm9ycy5sZW5ndGgpIHJldHVybiBlcnJvcnM7XG5cbiAgICBpZiAodmFsdWUuaW5kZXhPZigne2ZvbnRzdGFja30nKSA9PT0gLTEpIHtcbiAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihrZXksIHZhbHVlLCAnXCJnbHlwaHNcIiB1cmwgbXVzdCBpbmNsdWRlIGEgXCJ7Zm9udHN0YWNrfVwiIHRva2VuJykpO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZS5pbmRleE9mKCd7cmFuZ2V9JykgPT09IC0xKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCB2YWx1ZSwgJ1wiZ2x5cGhzXCIgdXJsIG11c3QgaW5jbHVkZSBhIFwie3JhbmdlfVwiIHRva2VuJykpO1xuICAgIH1cblxuICAgIHJldHVybiBlcnJvcnM7XG59XG4iLCJcbmltcG9ydCB2YWxpZGF0ZUNvbnN0YW50cyBmcm9tICcuL3ZhbGlkYXRlL3ZhbGlkYXRlX2NvbnN0YW50cyc7XG5pbXBvcnQgdmFsaWRhdGUgZnJvbSAnLi92YWxpZGF0ZS92YWxpZGF0ZSc7XG5pbXBvcnQgbGF0ZXN0U3R5bGVTcGVjIGZyb20gJy4vcmVmZXJlbmNlL2xhdGVzdCc7XG5pbXBvcnQgdmFsaWRhdGVHbHlwaHNVUkwgZnJvbSAnLi92YWxpZGF0ZS92YWxpZGF0ZV9nbHlwaHNfdXJsJztcblxuaW1wb3J0IHZhbGlkYXRlU291cmNlIGZyb20gJy4vdmFsaWRhdGUvdmFsaWRhdGVfc291cmNlJztcbmltcG9ydCB2YWxpZGF0ZUxpZ2h0IGZyb20gJy4vdmFsaWRhdGUvdmFsaWRhdGVfbGlnaHQnO1xuaW1wb3J0IHZhbGlkYXRlTGF5ZXIgZnJvbSAnLi92YWxpZGF0ZS92YWxpZGF0ZV9sYXllcic7XG5pbXBvcnQgdmFsaWRhdGVGaWx0ZXIgZnJvbSAnLi92YWxpZGF0ZS92YWxpZGF0ZV9maWx0ZXInO1xuaW1wb3J0IHZhbGlkYXRlUGFpbnRQcm9wZXJ0eSBmcm9tICcuL3ZhbGlkYXRlL3ZhbGlkYXRlX3BhaW50X3Byb3BlcnR5JztcbmltcG9ydCB2YWxpZGF0ZUxheW91dFByb3BlcnR5IGZyb20gJy4vdmFsaWRhdGUvdmFsaWRhdGVfbGF5b3V0X3Byb3BlcnR5JztcblxuLyoqXG4gKiBWYWxpZGF0ZSBhIE1hcGJveCBHTCBzdHlsZSBhZ2FpbnN0IHRoZSBzdHlsZSBzcGVjaWZpY2F0aW9uLiBUaGlzIGVudHJ5cG9pbnQsXG4gKiBgbWFwYm94LWdsLXN0eWxlLXNwZWMvbGliL3ZhbGlkYXRlX3N0eWxlLm1pbmAsIGlzIGRlc2lnbmVkIHRvIHByb2R1Y2UgYXNcbiAqIHNtYWxsIGEgYnJvd3NlcmlmeSBidW5kbGUgYXMgcG9zc2libGUgYnkgb21pdHRpbmcgdW5uZWNlc3NhcnkgZnVuY3Rpb25hbGl0eVxuICogYW5kIGxlZ2FjeSBzdHlsZSBzcGVjaWZpY2F0aW9ucy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IHN0eWxlIFRoZSBzdHlsZSB0byBiZSB2YWxpZGF0ZWQuXG4gKiBAcGFyYW0ge09iamVjdH0gW3N0eWxlU3BlY10gVGhlIHN0eWxlIHNwZWNpZmljYXRpb24gdG8gdmFsaWRhdGUgYWdhaW5zdC5cbiAqICAgICBJZiBvbWl0dGVkLCB0aGUgbGF0ZXN0IHN0eWxlIHNwZWMgaXMgdXNlZC5cbiAqIEByZXR1cm5zIHtBcnJheTxWYWxpZGF0aW9uRXJyb3I+fVxuICogQGV4YW1wbGVcbiAqICAgdmFyIHZhbGlkYXRlID0gcmVxdWlyZSgnbWFwYm94LWdsLXN0eWxlLXNwZWMvbGliL3ZhbGlkYXRlX3N0eWxlLm1pbicpO1xuICogICB2YXIgZXJyb3JzID0gdmFsaWRhdGUoc3R5bGUpO1xuICovXG5mdW5jdGlvbiB2YWxpZGF0ZVN0eWxlTWluKHN0eWxlLCBzdHlsZVNwZWMpIHtcbiAgICBzdHlsZVNwZWMgPSBzdHlsZVNwZWMgfHwgbGF0ZXN0U3R5bGVTcGVjO1xuXG4gICAgbGV0IGVycm9ycyA9IFtdO1xuXG4gICAgZXJyb3JzID0gZXJyb3JzLmNvbmNhdCh2YWxpZGF0ZSh7XG4gICAgICAgIGtleTogJycsXG4gICAgICAgIHZhbHVlOiBzdHlsZSxcbiAgICAgICAgdmFsdWVTcGVjOiBzdHlsZVNwZWMuJHJvb3QsXG4gICAgICAgIHN0eWxlU3BlYyxcbiAgICAgICAgc3R5bGUsXG4gICAgICAgIG9iamVjdEVsZW1lbnRWYWxpZGF0b3JzOiB7XG4gICAgICAgICAgICBnbHlwaHM6IHZhbGlkYXRlR2x5cGhzVVJMLFxuICAgICAgICAgICAgJyonKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pKTtcblxuICAgIGlmIChzdHlsZS5jb25zdGFudHMpIHtcbiAgICAgICAgZXJyb3JzID0gZXJyb3JzLmNvbmNhdCh2YWxpZGF0ZUNvbnN0YW50cyh7XG4gICAgICAgICAgICBrZXk6ICdjb25zdGFudHMnLFxuICAgICAgICAgICAgdmFsdWU6IHN0eWxlLmNvbnN0YW50cyxcbiAgICAgICAgICAgIHN0eWxlLFxuICAgICAgICAgICAgc3R5bGVTcGVjXG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc29ydEVycm9ycyhlcnJvcnMpO1xufVxuXG52YWxpZGF0ZVN0eWxlTWluLnNvdXJjZSA9IHdyYXBDbGVhbkVycm9ycyh2YWxpZGF0ZVNvdXJjZSk7XG52YWxpZGF0ZVN0eWxlTWluLmxpZ2h0ID0gd3JhcENsZWFuRXJyb3JzKHZhbGlkYXRlTGlnaHQpO1xudmFsaWRhdGVTdHlsZU1pbi5sYXllciA9IHdyYXBDbGVhbkVycm9ycyh2YWxpZGF0ZUxheWVyKTtcbnZhbGlkYXRlU3R5bGVNaW4uZmlsdGVyID0gd3JhcENsZWFuRXJyb3JzKHZhbGlkYXRlRmlsdGVyKTtcbnZhbGlkYXRlU3R5bGVNaW4ucGFpbnRQcm9wZXJ0eSA9IHdyYXBDbGVhbkVycm9ycyh2YWxpZGF0ZVBhaW50UHJvcGVydHkpO1xudmFsaWRhdGVTdHlsZU1pbi5sYXlvdXRQcm9wZXJ0eSA9IHdyYXBDbGVhbkVycm9ycyh2YWxpZGF0ZUxheW91dFByb3BlcnR5KTtcblxuZnVuY3Rpb24gc29ydEVycm9ycyhlcnJvcnMpIHtcbiAgICByZXR1cm4gW10uY29uY2F0KGVycm9ycykuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICByZXR1cm4gYS5saW5lIC0gYi5saW5lO1xuICAgIH0pO1xufVxuXG5mdW5jdGlvbiB3cmFwQ2xlYW5FcnJvcnMoaW5uZXIpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oLi4uYXJncykge1xuICAgICAgICByZXR1cm4gc29ydEVycm9ycyhpbm5lci5hcHBseSh0aGlzLCBhcmdzKSk7XG4gICAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgdmFsaWRhdGVTdHlsZU1pbjtcbiIsIi8vIEBmbG93XG5pbXBvcnQgdmFsaWRhdGVTdHlsZU1pbiBmcm9tICcuLi9zdHlsZS1zcGVjL3ZhbGlkYXRlX3N0eWxlLm1pbic7XG5pbXBvcnQgeyBFcnJvckV2ZW50IH0gZnJvbSAnLi4vdXRpbC9ldmVudGVkJztcblxuaW1wb3J0IHR5cGUge0V2ZW50ZWR9IGZyb20gJy4uL3V0aWwvZXZlbnRlZCc7XG5cbnR5cGUgVmFsaWRhdGlvbkVycm9yID0ge1xuICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICBsaW5lOiBudW1iZXIsXG4gICAgaWRlbnRpZmllcj86IHN0cmluZ1xufTtcblxudHlwZSBWYWxpZGF0b3IgPSAoT2JqZWN0KSA9PiAkUmVhZE9ubHlBcnJheTxWYWxpZGF0aW9uRXJyb3I+O1xuXG5leHBvcnQgY29uc3QgdmFsaWRhdGVTdHlsZSA9ICh2YWxpZGF0ZVN0eWxlTWluOiAoT2JqZWN0LCA/T2JqZWN0KSA9PiAkUmVhZE9ubHlBcnJheTxWYWxpZGF0aW9uRXJyb3I+KTtcblxuZXhwb3J0IGNvbnN0IHZhbGlkYXRlU291cmNlID0gKHZhbGlkYXRlU3R5bGVNaW4uc291cmNlOiBWYWxpZGF0b3IpO1xuZXhwb3J0IGNvbnN0IHZhbGlkYXRlTGlnaHQgPSAodmFsaWRhdGVTdHlsZU1pbi5saWdodDogVmFsaWRhdG9yKTtcbmV4cG9ydCBjb25zdCB2YWxpZGF0ZUZpbHRlciA9ICh2YWxpZGF0ZVN0eWxlTWluLmZpbHRlcjogVmFsaWRhdG9yKTtcbmV4cG9ydCBjb25zdCB2YWxpZGF0ZVBhaW50UHJvcGVydHkgPSAodmFsaWRhdGVTdHlsZU1pbi5wYWludFByb3BlcnR5OiBWYWxpZGF0b3IpO1xuZXhwb3J0IGNvbnN0IHZhbGlkYXRlTGF5b3V0UHJvcGVydHkgPSAodmFsaWRhdGVTdHlsZU1pbi5sYXlvdXRQcm9wZXJ0eTogVmFsaWRhdG9yKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGVtaXRWYWxpZGF0aW9uRXJyb3JzKGVtaXR0ZXI6IEV2ZW50ZWQsIGVycm9yczogPyRSZWFkT25seUFycmF5PHttZXNzYWdlOiBzdHJpbmcsIGlkZW50aWZpZXI/OiBzdHJpbmd9Pik6IGJvb2xlYW4ge1xuICAgIGxldCBoYXNFcnJvcnMgPSBmYWxzZTtcbiAgICBpZiAoZXJyb3JzICYmIGVycm9ycy5sZW5ndGgpIHtcbiAgICAgICAgZm9yIChjb25zdCBlcnJvciBvZiBlcnJvcnMpIHtcbiAgICAgICAgICAgIGVtaXR0ZXIuZmlyZShuZXcgRXJyb3JFdmVudChuZXcgRXJyb3IoZXJyb3IubWVzc2FnZSkpKTtcbiAgICAgICAgICAgIGhhc0Vycm9ycyA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGhhc0Vycm9ycztcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBHcmlkSW5kZXg7XG5cbnZhciBOVU1fUEFSQU1TID0gMztcblxuZnVuY3Rpb24gR3JpZEluZGV4KGV4dGVudCwgbiwgcGFkZGluZykge1xuICAgIHZhciBjZWxscyA9IHRoaXMuY2VsbHMgPSBbXTtcblxuICAgIGlmIChleHRlbnQgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgICAgICB0aGlzLmFycmF5QnVmZmVyID0gZXh0ZW50O1xuICAgICAgICB2YXIgYXJyYXkgPSBuZXcgSW50MzJBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICAgICAgZXh0ZW50ID0gYXJyYXlbMF07XG4gICAgICAgIG4gPSBhcnJheVsxXTtcbiAgICAgICAgcGFkZGluZyA9IGFycmF5WzJdO1xuXG4gICAgICAgIHRoaXMuZCA9IG4gKyAyICogcGFkZGluZztcbiAgICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCB0aGlzLmQgKiB0aGlzLmQ7IGsrKykge1xuICAgICAgICAgICAgdmFyIHN0YXJ0ID0gYXJyYXlbTlVNX1BBUkFNUyArIGtdO1xuICAgICAgICAgICAgdmFyIGVuZCA9IGFycmF5W05VTV9QQVJBTVMgKyBrICsgMV07XG4gICAgICAgICAgICBjZWxscy5wdXNoKHN0YXJ0ID09PSBlbmQgP1xuICAgICAgICAgICAgICAgICAgICBudWxsIDpcbiAgICAgICAgICAgICAgICAgICAgYXJyYXkuc3ViYXJyYXkoc3RhcnQsIGVuZCkpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBrZXlzT2Zmc2V0ID0gYXJyYXlbTlVNX1BBUkFNUyArIGNlbGxzLmxlbmd0aF07XG4gICAgICAgIHZhciBiYm94ZXNPZmZzZXQgPSBhcnJheVtOVU1fUEFSQU1TICsgY2VsbHMubGVuZ3RoICsgMV07XG4gICAgICAgIHRoaXMua2V5cyA9IGFycmF5LnN1YmFycmF5KGtleXNPZmZzZXQsIGJib3hlc09mZnNldCk7XG4gICAgICAgIHRoaXMuYmJveGVzID0gYXJyYXkuc3ViYXJyYXkoYmJveGVzT2Zmc2V0KTtcblxuICAgICAgICB0aGlzLmluc2VydCA9IHRoaXMuX2luc2VydFJlYWRvbmx5O1xuXG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5kID0gbiArIDIgKiBwYWRkaW5nO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZCAqIHRoaXMuZDsgaSsrKSB7XG4gICAgICAgICAgICBjZWxscy5wdXNoKFtdKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmtleXMgPSBbXTtcbiAgICAgICAgdGhpcy5iYm94ZXMgPSBbXTtcbiAgICB9XG5cbiAgICB0aGlzLm4gPSBuO1xuICAgIHRoaXMuZXh0ZW50ID0gZXh0ZW50O1xuICAgIHRoaXMucGFkZGluZyA9IHBhZGRpbmc7XG4gICAgdGhpcy5zY2FsZSA9IG4gLyBleHRlbnQ7XG4gICAgdGhpcy51aWQgPSAwO1xuXG4gICAgdmFyIHAgPSAocGFkZGluZyAvIG4pICogZXh0ZW50O1xuICAgIHRoaXMubWluID0gLXA7XG4gICAgdGhpcy5tYXggPSBleHRlbnQgKyBwO1xufVxuXG5cbkdyaWRJbmRleC5wcm90b3R5cGUuaW5zZXJ0ID0gZnVuY3Rpb24oa2V5LCB4MSwgeTEsIHgyLCB5Mikge1xuICAgIHRoaXMuX2ZvckVhY2hDZWxsKHgxLCB5MSwgeDIsIHkyLCB0aGlzLl9pbnNlcnRDZWxsLCB0aGlzLnVpZCsrKTtcbiAgICB0aGlzLmtleXMucHVzaChrZXkpO1xuICAgIHRoaXMuYmJveGVzLnB1c2goeDEpO1xuICAgIHRoaXMuYmJveGVzLnB1c2goeTEpO1xuICAgIHRoaXMuYmJveGVzLnB1c2goeDIpO1xuICAgIHRoaXMuYmJveGVzLnB1c2goeTIpO1xufTtcblxuR3JpZEluZGV4LnByb3RvdHlwZS5faW5zZXJ0UmVhZG9ubHkgPSBmdW5jdGlvbigpIHtcbiAgICB0aHJvdyAnQ2Fubm90IGluc2VydCBpbnRvIGEgR3JpZEluZGV4IGNyZWF0ZWQgZnJvbSBhbiBBcnJheUJ1ZmZlci4nO1xufTtcblxuR3JpZEluZGV4LnByb3RvdHlwZS5faW5zZXJ0Q2VsbCA9IGZ1bmN0aW9uKHgxLCB5MSwgeDIsIHkyLCBjZWxsSW5kZXgsIHVpZCkge1xuICAgIHRoaXMuY2VsbHNbY2VsbEluZGV4XS5wdXNoKHVpZCk7XG59O1xuXG5HcmlkSW5kZXgucHJvdG90eXBlLnF1ZXJ5ID0gZnVuY3Rpb24oeDEsIHkxLCB4MiwgeTIsIGludGVyc2VjdGlvblRlc3QpIHtcbiAgICB2YXIgbWluID0gdGhpcy5taW47XG4gICAgdmFyIG1heCA9IHRoaXMubWF4O1xuICAgIGlmICh4MSA8PSBtaW4gJiYgeTEgPD0gbWluICYmIG1heCA8PSB4MiAmJiBtYXggPD0geTIgJiYgIWludGVyc2VjdGlvblRlc3QpIHtcbiAgICAgICAgLy8gV2UgdXNlIGBBcnJheSNzbGljZWAgYmVjYXVzZSBgdGhpcy5rZXlzYCBtYXkgYmUgYSBgSW50MzJBcnJheWAgYW5kXG4gICAgICAgIC8vIHNvbWUgYnJvd3NlcnMgKFNhZmFyaSBhbmQgSUUpIGRvIG5vdCBzdXBwb3J0IGBUeXBlZEFycmF5I3NsaWNlYFxuICAgICAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9UeXBlZEFycmF5L3NsaWNlI0Jyb3dzZXJfY29tcGF0aWJpbGl0eVxuICAgICAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5rZXlzKTtcblxuICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICAgICAgdmFyIHNlZW5VaWRzID0ge307XG4gICAgICAgIHRoaXMuX2ZvckVhY2hDZWxsKHgxLCB5MSwgeDIsIHkyLCB0aGlzLl9xdWVyeUNlbGwsIHJlc3VsdCwgc2VlblVpZHMsIGludGVyc2VjdGlvblRlc3QpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbn07XG5cbkdyaWRJbmRleC5wcm90b3R5cGUuX3F1ZXJ5Q2VsbCA9IGZ1bmN0aW9uKHgxLCB5MSwgeDIsIHkyLCBjZWxsSW5kZXgsIHJlc3VsdCwgc2VlblVpZHMsIGludGVyc2VjdGlvblRlc3QpIHtcbiAgICB2YXIgY2VsbCA9IHRoaXMuY2VsbHNbY2VsbEluZGV4XTtcbiAgICBpZiAoY2VsbCAhPT0gbnVsbCkge1xuICAgICAgICB2YXIga2V5cyA9IHRoaXMua2V5cztcbiAgICAgICAgdmFyIGJib3hlcyA9IHRoaXMuYmJveGVzO1xuICAgICAgICBmb3IgKHZhciB1ID0gMDsgdSA8IGNlbGwubGVuZ3RoOyB1KyspIHtcbiAgICAgICAgICAgIHZhciB1aWQgPSBjZWxsW3VdO1xuICAgICAgICAgICAgaWYgKHNlZW5VaWRzW3VpZF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHZhciBvZmZzZXQgPSB1aWQgKiA0O1xuICAgICAgICAgICAgICAgIGlmIChpbnRlcnNlY3Rpb25UZXN0ID9cbiAgICAgICAgICAgICAgICAgICAgaW50ZXJzZWN0aW9uVGVzdChiYm94ZXNbb2Zmc2V0ICsgMF0sIGJib3hlc1tvZmZzZXQgKyAxXSwgYmJveGVzW29mZnNldCArIDJdLCBiYm94ZXNbb2Zmc2V0ICsgM10pIDpcbiAgICAgICAgICAgICAgICAgICAgKCh4MSA8PSBiYm94ZXNbb2Zmc2V0ICsgMl0pICYmXG4gICAgICAgICAgICAgICAgICAgICh5MSA8PSBiYm94ZXNbb2Zmc2V0ICsgM10pICYmXG4gICAgICAgICAgICAgICAgICAgICh4MiA+PSBiYm94ZXNbb2Zmc2V0ICsgMF0pICYmXG4gICAgICAgICAgICAgICAgICAgICh5MiA+PSBiYm94ZXNbb2Zmc2V0ICsgMV0pKSkge1xuICAgICAgICAgICAgICAgICAgICBzZWVuVWlkc1t1aWRdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goa2V5c1t1aWRdKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzZWVuVWlkc1t1aWRdID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcblxuR3JpZEluZGV4LnByb3RvdHlwZS5fZm9yRWFjaENlbGwgPSBmdW5jdGlvbih4MSwgeTEsIHgyLCB5MiwgZm4sIGFyZzEsIGFyZzIsIGludGVyc2VjdGlvblRlc3QpIHtcbiAgICB2YXIgY3gxID0gdGhpcy5fY29udmVydFRvQ2VsbENvb3JkKHgxKTtcbiAgICB2YXIgY3kxID0gdGhpcy5fY29udmVydFRvQ2VsbENvb3JkKHkxKTtcbiAgICB2YXIgY3gyID0gdGhpcy5fY29udmVydFRvQ2VsbENvb3JkKHgyKTtcbiAgICB2YXIgY3kyID0gdGhpcy5fY29udmVydFRvQ2VsbENvb3JkKHkyKTtcbiAgICBmb3IgKHZhciB4ID0gY3gxOyB4IDw9IGN4MjsgeCsrKSB7XG4gICAgICAgIGZvciAodmFyIHkgPSBjeTE7IHkgPD0gY3kyOyB5KyspIHtcbiAgICAgICAgICAgIHZhciBjZWxsSW5kZXggPSB0aGlzLmQgKiB5ICsgeDtcbiAgICAgICAgICAgIGlmIChpbnRlcnNlY3Rpb25UZXN0ICYmICFpbnRlcnNlY3Rpb25UZXN0KFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY29udmVydEZyb21DZWxsQ29vcmQoeCksXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jb252ZXJ0RnJvbUNlbGxDb29yZCh5KSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NvbnZlcnRGcm9tQ2VsbENvb3JkKHggKyAxKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NvbnZlcnRGcm9tQ2VsbENvb3JkKHkgKyAxKSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKGZuLmNhbGwodGhpcywgeDEsIHkxLCB4MiwgeTIsIGNlbGxJbmRleCwgYXJnMSwgYXJnMiwgaW50ZXJzZWN0aW9uVGVzdCkpIHJldHVybjtcbiAgICAgICAgfVxuICAgIH1cbn07XG5cbkdyaWRJbmRleC5wcm90b3R5cGUuX2NvbnZlcnRGcm9tQ2VsbENvb3JkID0gZnVuY3Rpb24oeCkge1xuICAgIHJldHVybiAoeCAtIHRoaXMucGFkZGluZykgLyB0aGlzLnNjYWxlO1xufTtcblxuR3JpZEluZGV4LnByb3RvdHlwZS5fY29udmVydFRvQ2VsbENvb3JkID0gZnVuY3Rpb24oeCkge1xuICAgIHJldHVybiBNYXRoLm1heCgwLCBNYXRoLm1pbih0aGlzLmQgLSAxLCBNYXRoLmZsb29yKHggKiB0aGlzLnNjYWxlKSArIHRoaXMucGFkZGluZykpO1xufTtcblxuR3JpZEluZGV4LnByb3RvdHlwZS50b0FycmF5QnVmZmVyID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuYXJyYXlCdWZmZXIpIHJldHVybiB0aGlzLmFycmF5QnVmZmVyO1xuXG4gICAgdmFyIGNlbGxzID0gdGhpcy5jZWxscztcblxuICAgIHZhciBtZXRhZGF0YUxlbmd0aCA9IE5VTV9QQVJBTVMgKyB0aGlzLmNlbGxzLmxlbmd0aCArIDEgKyAxO1xuICAgIHZhciB0b3RhbENlbGxMZW5ndGggPSAwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jZWxscy5sZW5ndGg7IGkrKykge1xuICAgICAgICB0b3RhbENlbGxMZW5ndGggKz0gdGhpcy5jZWxsc1tpXS5sZW5ndGg7XG4gICAgfVxuXG4gICAgdmFyIGFycmF5ID0gbmV3IEludDMyQXJyYXkobWV0YWRhdGFMZW5ndGggKyB0b3RhbENlbGxMZW5ndGggKyB0aGlzLmtleXMubGVuZ3RoICsgdGhpcy5iYm94ZXMubGVuZ3RoKTtcbiAgICBhcnJheVswXSA9IHRoaXMuZXh0ZW50O1xuICAgIGFycmF5WzFdID0gdGhpcy5uO1xuICAgIGFycmF5WzJdID0gdGhpcy5wYWRkaW5nO1xuXG4gICAgdmFyIG9mZnNldCA9IG1ldGFkYXRhTGVuZ3RoO1xuICAgIGZvciAodmFyIGsgPSAwOyBrIDwgY2VsbHMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgdmFyIGNlbGwgPSBjZWxsc1trXTtcbiAgICAgICAgYXJyYXlbTlVNX1BBUkFNUyArIGtdID0gb2Zmc2V0O1xuICAgICAgICBhcnJheS5zZXQoY2VsbCwgb2Zmc2V0KTtcbiAgICAgICAgb2Zmc2V0ICs9IGNlbGwubGVuZ3RoO1xuICAgIH1cblxuICAgIGFycmF5W05VTV9QQVJBTVMgKyBjZWxscy5sZW5ndGhdID0gb2Zmc2V0O1xuICAgIGFycmF5LnNldCh0aGlzLmtleXMsIG9mZnNldCk7XG4gICAgb2Zmc2V0ICs9IHRoaXMua2V5cy5sZW5ndGg7XG5cbiAgICBhcnJheVtOVU1fUEFSQU1TICsgY2VsbHMubGVuZ3RoICsgMV0gPSBvZmZzZXQ7XG4gICAgYXJyYXkuc2V0KHRoaXMuYmJveGVzLCBvZmZzZXQpO1xuICAgIG9mZnNldCArPSB0aGlzLmJib3hlcy5sZW5ndGg7XG5cbiAgICByZXR1cm4gYXJyYXkuYnVmZmVyO1xufTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcblxuaW1wb3J0IEdyaWQgZnJvbSAnZ3JpZC1pbmRleCc7XG5pbXBvcnQgQ29sb3IgZnJvbSAnLi4vc3R5bGUtc3BlYy91dGlsL2NvbG9yJztcbmltcG9ydCB7IFN0eWxlUHJvcGVydHlGdW5jdGlvbiwgU3R5bGVFeHByZXNzaW9uLCBab29tRGVwZW5kZW50RXhwcmVzc2lvbiwgWm9vbUNvbnN0YW50RXhwcmVzc2lvbiB9IGZyb20gJy4uL3N0eWxlLXNwZWMvZXhwcmVzc2lvbic7XG5pbXBvcnQgQ29tcG91bmRFeHByZXNzaW9uIGZyb20gJy4uL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9jb21wb3VuZF9leHByZXNzaW9uJztcbmltcG9ydCBleHByZXNzaW9ucyBmcm9tICcuLi9zdHlsZS1zcGVjL2V4cHJlc3Npb24vZGVmaW5pdGlvbnMnO1xuaW1wb3J0IHdpbmRvdyBmcm9tICcuL3dpbmRvdyc7XG5jb25zdCB7IEltYWdlRGF0YSB9ID0gd2luZG93O1xuXG5pbXBvcnQgdHlwZSB7VHJhbnNmZXJhYmxlfSBmcm9tICcuLi90eXBlcy90cmFuc2ZlcmFibGUnO1xuXG50eXBlIFNlcmlhbGl6ZWRPYmplY3QgPSB7IFtzdHJpbmddOiBTZXJpYWxpemVkIH07IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbmV4cG9ydCB0eXBlIFNlcmlhbGl6ZWQgPVxuICAgIHwgbnVsbFxuICAgIHwgdm9pZFxuICAgIHwgYm9vbGVhblxuICAgIHwgbnVtYmVyXG4gICAgfCBzdHJpbmdcbiAgICB8IEJvb2xlYW5cbiAgICB8IE51bWJlclxuICAgIHwgU3RyaW5nXG4gICAgfCBEYXRlXG4gICAgfCBSZWdFeHBcbiAgICB8IEFycmF5QnVmZmVyXG4gICAgfCAkQXJyYXlCdWZmZXJWaWV3XG4gICAgfCBJbWFnZURhdGFcbiAgICB8IEFycmF5PFNlcmlhbGl6ZWQ+XG4gICAgfCBTZXJpYWxpemVkT2JqZWN0O1xuXG50eXBlIFJlZ2lzdHJ5ID0ge1xuICAgIFtzdHJpbmddOiB7XG4gICAgICAgIGtsYXNzOiBDbGFzczxhbnk+LFxuICAgICAgICBvbWl0OiAkUmVhZE9ubHlBcnJheTxzdHJpbmc+LFxuICAgICAgICBzaGFsbG93OiAkUmVhZE9ubHlBcnJheTxzdHJpbmc+XG4gICAgfVxufTtcblxudHlwZSBSZWdpc3Rlck9wdGlvbnM8VD4gPSB7XG4gICAgb21pdD86ICRSZWFkT25seUFycmF5PCRLZXlzPFQ+PixcbiAgICBzaGFsbG93PzogJFJlYWRPbmx5QXJyYXk8JEtleXM8VD4+XG59XG5cbmNvbnN0IHJlZ2lzdHJ5OiBSZWdpc3RyeSA9IHt9O1xuXG4vKipcbiAqIFJlZ2lzdGVyIHRoZSBnaXZlbiBjbGFzcyBhcyBzZXJpYWxpemFibGUuXG4gKlxuICogQHBhcmFtIG9wdGlvbnNcbiAqIEBwYXJhbSBvcHRpb25zLm9taXQgTGlzdCBvZiBwcm9wZXJ0aWVzIHRvIG9taXQgZnJvbSBzZXJpYWxpemF0aW9uIChlLmcuLCBjYWNoZWQvY29tcHV0ZWQgcHJvcGVydGllcylcbiAqIEBwYXJhbSBvcHRpb25zLnNoYWxsb3cgTGlzdCBvZiBwcm9wZXJ0aWVzIHRoYXQgc2hvdWxkIGJlIHNlcmlhbGl6ZWQgYnkgYSBzaW1wbGUgc2hhbGxvdyBjb3B5LCByYXRoZXIgdGhhbiBieSBhIHJlY3Vyc2l2ZSBjYWxsIHRvIHNlcmlhbGl6ZSgpLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlcjxUOiBhbnk+KG5hbWU6IHN0cmluZywga2xhc3M6IENsYXNzPFQ+LCBvcHRpb25zOiBSZWdpc3Rlck9wdGlvbnM8VD4gPSB7fSkge1xuICAgIGFzc2VydCghcmVnaXN0cnlbbmFtZV0sIGAke25hbWV9IGlzIGFscmVhZHkgcmVnaXN0ZXJlZC5gKTtcbiAgICAoT2JqZWN0LmRlZmluZVByb3BlcnR5OiBhbnkpKGtsYXNzLCAnX2NsYXNzUmVnaXN0cnlLZXknLCB7XG4gICAgICAgIHZhbHVlOiBuYW1lLFxuICAgICAgICB3cml0ZWFibGU6IGZhbHNlXG4gICAgfSk7XG4gICAgcmVnaXN0cnlbbmFtZV0gPSB7XG4gICAgICAgIGtsYXNzLFxuICAgICAgICBvbWl0OiBvcHRpb25zLm9taXQgfHwgW10sXG4gICAgICAgIHNoYWxsb3c6IG9wdGlvbnMuc2hhbGxvdyB8fCBbXVxuICAgIH07XG59XG5cbnJlZ2lzdGVyKCdPYmplY3QnLCBPYmplY3QpO1xuXG50eXBlIFNlcmlhbGl6ZWRHcmlkID0geyBidWZmZXI6IEFycmF5QnVmZmVyIH07XG5cbkdyaWQuc2VyaWFsaXplID0gZnVuY3Rpb24gc2VyaWFsaXplKGdyaWQ6IEdyaWQsIHRyYW5zZmVyYWJsZXM/OiBBcnJheTxUcmFuc2ZlcmFibGU+KTogU2VyaWFsaXplZEdyaWQge1xuICAgIGNvbnN0IGJ1ZmZlciA9IGdyaWQudG9BcnJheUJ1ZmZlcigpO1xuICAgIGlmICh0cmFuc2ZlcmFibGVzKSB7XG4gICAgICAgIHRyYW5zZmVyYWJsZXMucHVzaChidWZmZXIpO1xuICAgIH1cbiAgICByZXR1cm4ge2J1ZmZlcn07XG59O1xuXG5HcmlkLmRlc2VyaWFsaXplID0gZnVuY3Rpb24gZGVzZXJpYWxpemUoc2VyaWFsaXplZDogU2VyaWFsaXplZEdyaWQpOiBHcmlkIHtcbiAgICByZXR1cm4gbmV3IEdyaWQoc2VyaWFsaXplZC5idWZmZXIpO1xufTtcbnJlZ2lzdGVyKCdHcmlkJywgR3JpZCk7XG5cbnJlZ2lzdGVyKCdDb2xvcicsIENvbG9yKTtcbnJlZ2lzdGVyKCdFcnJvcicsIEVycm9yKTtcblxucmVnaXN0ZXIoJ1N0eWxlUHJvcGVydHlGdW5jdGlvbicsIFN0eWxlUHJvcGVydHlGdW5jdGlvbik7XG5yZWdpc3RlcignU3R5bGVFeHByZXNzaW9uJywgU3R5bGVFeHByZXNzaW9uLCB7b21pdDogWydfZXZhbHVhdG9yJ119KTtcblxucmVnaXN0ZXIoJ1pvb21EZXBlbmRlbnRFeHByZXNzaW9uJywgWm9vbURlcGVuZGVudEV4cHJlc3Npb24pO1xucmVnaXN0ZXIoJ1pvb21Db25zdGFudEV4cHJlc3Npb24nLCBab29tQ29uc3RhbnRFeHByZXNzaW9uKTtcbnJlZ2lzdGVyKCdDb21wb3VuZEV4cHJlc3Npb24nLCBDb21wb3VuZEV4cHJlc3Npb24sIHtvbWl0OiBbJ19ldmFsdWF0ZSddfSk7XG5mb3IgKGNvbnN0IG5hbWUgaW4gZXhwcmVzc2lvbnMpIHtcbiAgICBpZiAoKGV4cHJlc3Npb25zW25hbWVdOiBhbnkpLl9jbGFzc1JlZ2lzdHJ5S2V5KSBjb250aW51ZTtcbiAgICByZWdpc3RlcihgRXhwcmVzc2lvbl8ke25hbWV9YCwgZXhwcmVzc2lvbnNbbmFtZV0pO1xufVxuXG4vKipcbiAqIFNlcmlhbGl6ZSB0aGUgZ2l2ZW4gb2JqZWN0IGZvciB0cmFuc2ZlciB0byBvciBmcm9tIGEgd2ViIHdvcmtlci5cbiAqXG4gKiBGb3Igbm9uLWJ1aWx0aW4gdHlwZXMsIHJlY3Vyc2l2ZWx5IHNlcmlhbGl6ZSBlYWNoIHByb3BlcnR5IChwb3NzaWJseVxuICogb21pdHRpbmcgY2VydGFpbiBwcm9wZXJ0aWVzIC0gc2VlIHJlZ2lzdGVyKCkpLCBhbmQgcGFja2FnZSB0aGUgcmVzdWx0IGFsb25nXG4gKiB3aXRoIHRoZSBjb25zdHJ1Y3RvcidzIGBuYW1lYCBzbyB0aGF0IHRoZSBhcHByb3ByaWF0ZSBjb25zdHJ1Y3RvciBjYW4gYmVcbiAqIGxvb2tlZCB1cCBpbiBgZGVzZXJpYWxpemUoKWAuXG4gKlxuICogSWYgYSBgdHJhbnNmZXJhYmxlc2AgYXJyYXkgaXMgcHJvdmlkZWQsIGFkZCBhbnkgdHJhbnNmZXJhYmxlIG9iamVjdHMgKGkuZS4sXG4gKiBhbnkgQXJyYXlCdWZmZXJzIG9yIEFycmF5QnVmZmVyIHZpZXdzKSB0byB0aGUgbGlzdC4gKElmIGEgY29weSBpcyBuZWVkZWQsXG4gKiB0aGlzIHNob3VsZCBoYXBwZW4gaW4gdGhlIGNsaWVudCBjb2RlLCBiZWZvcmUgdXNpbmcgc2VyaWFsaXplKCkuKVxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemUoaW5wdXQ6IG1peGVkLCB0cmFuc2ZlcmFibGVzPzogQXJyYXk8VHJhbnNmZXJhYmxlPik6IFNlcmlhbGl6ZWQge1xuICAgIGlmIChpbnB1dCA9PT0gbnVsbCB8fFxuICAgICAgICBpbnB1dCA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgIHR5cGVvZiBpbnB1dCA9PT0gJ2Jvb2xlYW4nIHx8XG4gICAgICAgIHR5cGVvZiBpbnB1dCA9PT0gJ251bWJlcicgfHxcbiAgICAgICAgdHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJyB8fFxuICAgICAgICBpbnB1dCBpbnN0YW5jZW9mIEJvb2xlYW4gfHxcbiAgICAgICAgaW5wdXQgaW5zdGFuY2VvZiBOdW1iZXIgfHxcbiAgICAgICAgaW5wdXQgaW5zdGFuY2VvZiBTdHJpbmcgfHxcbiAgICAgICAgaW5wdXQgaW5zdGFuY2VvZiBEYXRlIHx8XG4gICAgICAgIGlucHV0IGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICAgIHJldHVybiBpbnB1dDtcbiAgICB9XG5cbiAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgICAgICBpZiAodHJhbnNmZXJhYmxlcykge1xuICAgICAgICAgICAgdHJhbnNmZXJhYmxlcy5wdXNoKGlucHV0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaW5wdXQ7XG4gICAgfVxuXG4gICAgaWYgKEFycmF5QnVmZmVyLmlzVmlldyhpbnB1dCkpIHtcbiAgICAgICAgY29uc3QgdmlldzogJEFycmF5QnVmZmVyVmlldyA9IChpbnB1dDogYW55KTtcbiAgICAgICAgaWYgKHRyYW5zZmVyYWJsZXMpIHtcbiAgICAgICAgICAgIHRyYW5zZmVyYWJsZXMucHVzaCh2aWV3LmJ1ZmZlcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZpZXc7XG4gICAgfVxuXG4gICAgaWYgKGlucHV0IGluc3RhbmNlb2YgSW1hZ2VEYXRhKSB7XG4gICAgICAgIGlmICh0cmFuc2ZlcmFibGVzKSB7XG4gICAgICAgICAgICB0cmFuc2ZlcmFibGVzLnB1c2goaW5wdXQuZGF0YS5idWZmZXIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpbnB1dDtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShpbnB1dCkpIHtcbiAgICAgICAgY29uc3Qgc2VyaWFsaXplZDogQXJyYXk8U2VyaWFsaXplZD4gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGlucHV0KSB7XG4gICAgICAgICAgICBzZXJpYWxpemVkLnB1c2goc2VyaWFsaXplKGl0ZW0sIHRyYW5zZmVyYWJsZXMpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2VyaWFsaXplZDtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGlucHV0ID09PSAnb2JqZWN0Jykge1xuICAgICAgICBjb25zdCBrbGFzcyA9IChpbnB1dC5jb25zdHJ1Y3RvcjogYW55KTtcbiAgICAgICAgY29uc3QgbmFtZSA9IGtsYXNzLl9jbGFzc1JlZ2lzdHJ5S2V5O1xuICAgICAgICBpZiAoIW5hbWUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgY2FuJ3Qgc2VyaWFsaXplIG9iamVjdCBvZiB1bnJlZ2lzdGVyZWQgY2xhc3NgKTtcbiAgICAgICAgfVxuICAgICAgICBhc3NlcnQocmVnaXN0cnlbbmFtZV0pO1xuXG4gICAgICAgIGNvbnN0IHByb3BlcnRpZXM6IFNlcmlhbGl6ZWRPYmplY3QgPSBrbGFzcy5zZXJpYWxpemUgP1xuICAgICAgICAgICAgLy8gKFRlbXBvcmFyeSB3b3JrYXJvdW5kKSBhbGxvdyBhIGNsYXNzIHRvIHByb3ZpZGUgc3RhdGljXG4gICAgICAgICAgICAvLyBgc2VyaWFsaXplKClgIGFuZCBgZGVzZXJpYWxpemUoKWAgbWV0aG9kcyB0byBieXBhc3MgdGhlIGdlbmVyaWNcbiAgICAgICAgICAgIC8vIGFwcHJvYWNoLlxuICAgICAgICAgICAgLy8gVGhpcyB0ZW1wb3Jhcnkgd29ya2Fyb3VuZCBsZXRzIHVzIHVzZSB0aGUgZ2VuZXJpYyBzZXJpYWxpemF0aW9uXG4gICAgICAgICAgICAvLyBhcHByb2FjaCBmb3Igb2JqZWN0cyB3aG9zZSBtZW1iZXJzIGluY2x1ZGUgaW5zdGFuY2VzIG9mIGR5bmFtaWNcbiAgICAgICAgICAgIC8vIFN0cnVjdEFycmF5IHR5cGVzLiBPbmNlIHdlIHJlZmFjdG9yIFN0cnVjdEFycmF5IHRvIGJlIHN0YXRpYyxcbiAgICAgICAgICAgIC8vIHdlIGNhbiByZW1vdmUgdGhpcyBjb21wbGV4aXR5LlxuICAgICAgICAgICAgKGtsYXNzLnNlcmlhbGl6ZShpbnB1dCwgdHJhbnNmZXJhYmxlcyk6IFNlcmlhbGl6ZWRPYmplY3QpIDoge307XG5cbiAgICAgICAgaWYgKCFrbGFzcy5zZXJpYWxpemUpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIGlucHV0KSB7XG4gICAgICAgICAgICAgICAgLy8gYW55IGNhc3QgZHVlIHRvIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9mbG93L2lzc3Vlcy81MzkzXG4gICAgICAgICAgICAgICAgaWYgKCEoaW5wdXQ6IGFueSkuaGFzT3duUHJvcGVydHkoa2V5KSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgaWYgKHJlZ2lzdHJ5W25hbWVdLm9taXQuaW5kZXhPZihrZXkpID49IDApIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNvbnN0IHByb3BlcnR5ID0gKGlucHV0OiBhbnkpW2tleV07XG4gICAgICAgICAgICAgICAgcHJvcGVydGllc1trZXldID0gcmVnaXN0cnlbbmFtZV0uc2hhbGxvdy5pbmRleE9mKGtleSkgPj0gMCA/XG4gICAgICAgICAgICAgICAgICAgIHByb3BlcnR5IDpcbiAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplKHByb3BlcnR5LCB0cmFuc2ZlcmFibGVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgICAgcHJvcGVydGllcy5tZXNzYWdlID0gaW5wdXQubWVzc2FnZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSBzdGF0aWNhbGx5IHNlcmlhbGl6ZWQgb2JqZWN0IHN1cnZpdmVzIHRyYW5zZmVyIG9mICRuYW1lIHByb3BlcnR5XG4gICAgICAgICAgICBhc3NlcnQoIXRyYW5zZmVyYWJsZXMgfHwgcHJvcGVydGllcyAhPT0gdHJhbnNmZXJhYmxlc1t0cmFuc2ZlcmFibGVzLmxlbmd0aCAtIDFdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcm9wZXJ0aWVzLiRuYW1lKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJyRuYW1lIHByb3BlcnR5IGlzIHJlc2VydmVkIGZvciB3b3JrZXIgc2VyaWFsaXphdGlvbiBsb2dpYy4nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobmFtZSAhPT0gJ09iamVjdCcpIHtcbiAgICAgICAgICAgIHByb3BlcnRpZXMuJG5hbWUgPSBuYW1lO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHByb3BlcnRpZXM7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBjYW4ndCBzZXJpYWxpemUgb2JqZWN0IG9mIHR5cGUgJHt0eXBlb2YgaW5wdXR9YCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZXNlcmlhbGl6ZShpbnB1dDogU2VyaWFsaXplZCk6IG1peGVkIHtcbiAgICBpZiAoaW5wdXQgPT09IG51bGwgfHxcbiAgICAgICAgaW5wdXQgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICB0eXBlb2YgaW5wdXQgPT09ICdib29sZWFuJyB8fFxuICAgICAgICB0eXBlb2YgaW5wdXQgPT09ICdudW1iZXInIHx8XG4gICAgICAgIHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgaW5wdXQgaW5zdGFuY2VvZiBCb29sZWFuIHx8XG4gICAgICAgIGlucHV0IGluc3RhbmNlb2YgTnVtYmVyIHx8XG4gICAgICAgIGlucHV0IGluc3RhbmNlb2YgU3RyaW5nIHx8XG4gICAgICAgIGlucHV0IGluc3RhbmNlb2YgRGF0ZSB8fFxuICAgICAgICBpbnB1dCBpbnN0YW5jZW9mIFJlZ0V4cCB8fFxuICAgICAgICBpbnB1dCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyIHx8XG4gICAgICAgIEFycmF5QnVmZmVyLmlzVmlldyhpbnB1dCkgfHxcbiAgICAgICAgaW5wdXQgaW5zdGFuY2VvZiBJbWFnZURhdGEpIHtcbiAgICAgICAgcmV0dXJuIGlucHV0O1xuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KGlucHV0KSkge1xuICAgICAgICByZXR1cm4gaW5wdXQubWFwKGRlc2VyaWFsaXplKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGlucHV0ID09PSAnb2JqZWN0Jykge1xuICAgICAgICBjb25zdCBuYW1lID0gKGlucHV0OiBhbnkpLiRuYW1lIHx8ICdPYmplY3QnO1xuXG4gICAgICAgIGNvbnN0IHtrbGFzc30gPSByZWdpc3RyeVtuYW1lXTtcbiAgICAgICAgaWYgKCFrbGFzcykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBjYW4ndCBkZXNlcmlhbGl6ZSB1bnJlZ2lzdGVyZWQgY2xhc3MgJHtuYW1lfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGtsYXNzLmRlc2VyaWFsaXplKSB7XG4gICAgICAgICAgICByZXR1cm4gKGtsYXNzLmRlc2VyaWFsaXplOiB0eXBlb2YgZGVzZXJpYWxpemUpKGlucHV0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IE9iamVjdC5jcmVhdGUoa2xhc3MucHJvdG90eXBlKTtcblxuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhpbnB1dCkpIHtcbiAgICAgICAgICAgIGlmIChrZXkgPT09ICckbmFtZScpIGNvbnRpbnVlO1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSAoaW5wdXQ6IFNlcmlhbGl6ZWRPYmplY3QpW2tleV07XG4gICAgICAgICAgICByZXN1bHRba2V5XSA9IHJlZ2lzdHJ5W25hbWVdLnNoYWxsb3cuaW5kZXhPZihrZXkpID49IDAgPyB2YWx1ZSA6IGRlc2VyaWFsaXplKHZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBjYW4ndCBkZXNlcmlhbGl6ZSBvYmplY3Qgb2YgdHlwZSAke3R5cGVvZiBpbnB1dH1gKTtcbn1cbiIsIi8vIEBmbG93XG5cbmNsYXNzIFpvb21IaXN0b3J5IHtcbiAgICBsYXN0Wm9vbTogbnVtYmVyO1xuICAgIGxhc3RGbG9vclpvb206IG51bWJlcjtcbiAgICBsYXN0SW50ZWdlclpvb206IG51bWJlcjtcbiAgICBsYXN0SW50ZWdlclpvb21UaW1lOiBudW1iZXI7XG4gICAgZmlyc3Q6IGJvb2xlYW47XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5maXJzdCA9IHRydWU7XG4gICAgfVxuXG4gICAgdXBkYXRlKHo6IG51bWJlciwgbm93OiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgZmxvb3JaID0gTWF0aC5mbG9vcih6KTtcblxuICAgICAgICBpZiAodGhpcy5maXJzdCkge1xuICAgICAgICAgICAgdGhpcy5maXJzdCA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5sYXN0SW50ZWdlclpvb20gPSBmbG9vclo7XG4gICAgICAgICAgICB0aGlzLmxhc3RJbnRlZ2VyWm9vbVRpbWUgPSAwO1xuICAgICAgICAgICAgdGhpcy5sYXN0Wm9vbSA9IHo7XG4gICAgICAgICAgICB0aGlzLmxhc3RGbG9vclpvb20gPSBmbG9vclo7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmxhc3RGbG9vclpvb20gPiBmbG9vclopIHtcbiAgICAgICAgICAgIHRoaXMubGFzdEludGVnZXJab29tID0gZmxvb3JaICsgMTtcbiAgICAgICAgICAgIHRoaXMubGFzdEludGVnZXJab29tVGltZSA9IG5vdztcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmxhc3RGbG9vclpvb20gPCBmbG9vclopIHtcbiAgICAgICAgICAgIHRoaXMubGFzdEludGVnZXJab29tID0gZmxvb3JaO1xuICAgICAgICAgICAgdGhpcy5sYXN0SW50ZWdlclpvb21UaW1lID0gbm93O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHogIT09IHRoaXMubGFzdFpvb20pIHtcbiAgICAgICAgICAgIHRoaXMubGFzdFpvb20gPSB6O1xuICAgICAgICAgICAgdGhpcy5sYXN0Rmxvb3Jab29tID0gZmxvb3JaO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBab29tSGlzdG9yeTtcbiIsIi8vIEBmbG93XG5cbi8vIFRoZSBmb2xsb3dpbmcgdGFibGUgY29tZXMgZnJvbSA8aHR0cDovL3d3dy51bmljb2RlLm9yZy9QdWJsaWMvMTEuMC4wL3VjZC9CbG9ja3MudHh0Pi5cbi8vIEtlZXAgaXQgc3luY2hyb25pemVkIHdpdGggPGh0dHA6Ly93d3cudW5pY29kZS5vcmcvUHVibGljL1VDRC9sYXRlc3QvdWNkL0Jsb2Nrcy50eHQ+LlxuXG50eXBlIFVuaWNvZGVCbG9ja0xvb2t1cCA9IHtba2V5OiBzdHJpbmddOiAoY2hhcjogbnVtYmVyKSA9PiBib29sZWFufTtcblxuY29uc3QgdW5pY29kZUJsb2NrTG9va3VwOiBVbmljb2RlQmxvY2tMb29rdXAgPSB7XG4gICAgLy8gJ0Jhc2ljIExhdGluJzogKGNoYXIpID0+IGNoYXIgPj0gMHgwMDAwICYmIGNoYXIgPD0gMHgwMDdGLFxuICAgICdMYXRpbi0xIFN1cHBsZW1lbnQnOiAoY2hhcikgPT4gY2hhciA+PSAweDAwODAgJiYgY2hhciA8PSAweDAwRkYsXG4gICAgLy8gJ0xhdGluIEV4dGVuZGVkLUEnOiAoY2hhcikgPT4gY2hhciA+PSAweDAxMDAgJiYgY2hhciA8PSAweDAxN0YsXG4gICAgLy8gJ0xhdGluIEV4dGVuZGVkLUInOiAoY2hhcikgPT4gY2hhciA+PSAweDAxODAgJiYgY2hhciA8PSAweDAyNEYsXG4gICAgLy8gJ0lQQSBFeHRlbnNpb25zJzogKGNoYXIpID0+IGNoYXIgPj0gMHgwMjUwICYmIGNoYXIgPD0gMHgwMkFGLFxuICAgIC8vICdTcGFjaW5nIE1vZGlmaWVyIExldHRlcnMnOiAoY2hhcikgPT4gY2hhciA+PSAweDAyQjAgJiYgY2hhciA8PSAweDAyRkYsXG4gICAgLy8gJ0NvbWJpbmluZyBEaWFjcml0aWNhbCBNYXJrcyc6IChjaGFyKSA9PiBjaGFyID49IDB4MDMwMCAmJiBjaGFyIDw9IDB4MDM2RixcbiAgICAvLyAnR3JlZWsgYW5kIENvcHRpYyc6IChjaGFyKSA9PiBjaGFyID49IDB4MDM3MCAmJiBjaGFyIDw9IDB4MDNGRixcbiAgICAvLyAnQ3lyaWxsaWMnOiAoY2hhcikgPT4gY2hhciA+PSAweDA0MDAgJiYgY2hhciA8PSAweDA0RkYsXG4gICAgLy8gJ0N5cmlsbGljIFN1cHBsZW1lbnQnOiAoY2hhcikgPT4gY2hhciA+PSAweDA1MDAgJiYgY2hhciA8PSAweDA1MkYsXG4gICAgLy8gJ0FybWVuaWFuJzogKGNoYXIpID0+IGNoYXIgPj0gMHgwNTMwICYmIGNoYXIgPD0gMHgwNThGLFxuICAgIC8vJ0hlYnJldyc6IChjaGFyKSA9PiBjaGFyID49IDB4MDU5MCAmJiBjaGFyIDw9IDB4MDVGRixcbiAgICAnQXJhYmljJzogKGNoYXIpID0+IGNoYXIgPj0gMHgwNjAwICYmIGNoYXIgPD0gMHgwNkZGLFxuICAgIC8vJ1N5cmlhYyc6IChjaGFyKSA9PiBjaGFyID49IDB4MDcwMCAmJiBjaGFyIDw9IDB4MDc0RixcbiAgICAnQXJhYmljIFN1cHBsZW1lbnQnOiAoY2hhcikgPT4gY2hhciA+PSAweDA3NTAgJiYgY2hhciA8PSAweDA3N0YsXG4gICAgLy8gJ1RoYWFuYSc6IChjaGFyKSA9PiBjaGFyID49IDB4MDc4MCAmJiBjaGFyIDw9IDB4MDdCRixcbiAgICAvLyAnTktvJzogKGNoYXIpID0+IGNoYXIgPj0gMHgwN0MwICYmIGNoYXIgPD0gMHgwN0ZGLFxuICAgIC8vICdTYW1hcml0YW4nOiAoY2hhcikgPT4gY2hhciA+PSAweDA4MDAgJiYgY2hhciA8PSAweDA4M0YsXG4gICAgLy8gJ01hbmRhaWMnOiAoY2hhcikgPT4gY2hhciA+PSAweDA4NDAgJiYgY2hhciA8PSAweDA4NUYsXG4gICAgLy8gJ1N5cmlhYyBTdXBwbGVtZW50JzogKGNoYXIpID0+IGNoYXIgPj0gMHgwODYwICYmIGNoYXIgPD0gMHgwODZGLFxuICAgICdBcmFiaWMgRXh0ZW5kZWQtQSc6IChjaGFyKSA9PiBjaGFyID49IDB4MDhBMCAmJiBjaGFyIDw9IDB4MDhGRixcbiAgICAvLyAnRGV2YW5hZ2FyaSc6IChjaGFyKSA9PiBjaGFyID49IDB4MDkwMCAmJiBjaGFyIDw9IDB4MDk3RixcbiAgICAvLyAnQmVuZ2FsaSc6IChjaGFyKSA9PiBjaGFyID49IDB4MDk4MCAmJiBjaGFyIDw9IDB4MDlGRixcbiAgICAvLyAnR3VybXVraGknOiAoY2hhcikgPT4gY2hhciA+PSAweDBBMDAgJiYgY2hhciA8PSAweDBBN0YsXG4gICAgLy8gJ0d1amFyYXRpJzogKGNoYXIpID0+IGNoYXIgPj0gMHgwQTgwICYmIGNoYXIgPD0gMHgwQUZGLFxuICAgIC8vICdPcml5YSc6IChjaGFyKSA9PiBjaGFyID49IDB4MEIwMCAmJiBjaGFyIDw9IDB4MEI3RixcbiAgICAvLyAnVGFtaWwnOiAoY2hhcikgPT4gY2hhciA+PSAweDBCODAgJiYgY2hhciA8PSAweDBCRkYsXG4gICAgLy8gJ1RlbHVndSc6IChjaGFyKSA9PiBjaGFyID49IDB4MEMwMCAmJiBjaGFyIDw9IDB4MEM3RixcbiAgICAvLyAnS2FubmFkYSc6IChjaGFyKSA9PiBjaGFyID49IDB4MEM4MCAmJiBjaGFyIDw9IDB4MENGRixcbiAgICAvLyAnTWFsYXlhbGFtJzogKGNoYXIpID0+IGNoYXIgPj0gMHgwRDAwICYmIGNoYXIgPD0gMHgwRDdGLFxuICAgIC8vICdTaW5oYWxhJzogKGNoYXIpID0+IGNoYXIgPj0gMHgwRDgwICYmIGNoYXIgPD0gMHgwREZGLFxuICAgIC8vICdUaGFpJzogKGNoYXIpID0+IGNoYXIgPj0gMHgwRTAwICYmIGNoYXIgPD0gMHgwRTdGLFxuICAgIC8vICdMYW8nOiAoY2hhcikgPT4gY2hhciA+PSAweDBFODAgJiYgY2hhciA8PSAweDBFRkYsXG4gICAgLy8gJ1RpYmV0YW4nOiAoY2hhcikgPT4gY2hhciA+PSAweDBGMDAgJiYgY2hhciA8PSAweDBGRkYsXG4gICAgLy8gJ015YW5tYXInOiAoY2hhcikgPT4gY2hhciA+PSAweDEwMDAgJiYgY2hhciA8PSAweDEwOUYsXG4gICAgLy8gJ0dlb3JnaWFuJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMEEwICYmIGNoYXIgPD0gMHgxMEZGLFxuICAgICdIYW5ndWwgSmFtbyc6IChjaGFyKSA9PiBjaGFyID49IDB4MTEwMCAmJiBjaGFyIDw9IDB4MTFGRixcbiAgICAvLyAnRXRoaW9waWMnOiAoY2hhcikgPT4gY2hhciA+PSAweDEyMDAgJiYgY2hhciA8PSAweDEzN0YsXG4gICAgLy8gJ0V0aGlvcGljIFN1cHBsZW1lbnQnOiAoY2hhcikgPT4gY2hhciA+PSAweDEzODAgJiYgY2hhciA8PSAweDEzOUYsXG4gICAgLy8gJ0NoZXJva2VlJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxM0EwICYmIGNoYXIgPD0gMHgxM0ZGLFxuICAgICdVbmlmaWVkIENhbmFkaWFuIEFib3JpZ2luYWwgU3lsbGFiaWNzJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxNDAwICYmIGNoYXIgPD0gMHgxNjdGLFxuICAgIC8vICdPZ2hhbSc6IChjaGFyKSA9PiBjaGFyID49IDB4MTY4MCAmJiBjaGFyIDw9IDB4MTY5RixcbiAgICAvLyAnUnVuaWMnOiAoY2hhcikgPT4gY2hhciA+PSAweDE2QTAgJiYgY2hhciA8PSAweDE2RkYsXG4gICAgLy8gJ1RhZ2Fsb2cnOiAoY2hhcikgPT4gY2hhciA+PSAweDE3MDAgJiYgY2hhciA8PSAweDE3MUYsXG4gICAgLy8gJ0hhbnVub28nOiAoY2hhcikgPT4gY2hhciA+PSAweDE3MjAgJiYgY2hhciA8PSAweDE3M0YsXG4gICAgLy8gJ0J1aGlkJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxNzQwICYmIGNoYXIgPD0gMHgxNzVGLFxuICAgIC8vICdUYWdiYW53YSc6IChjaGFyKSA9PiBjaGFyID49IDB4MTc2MCAmJiBjaGFyIDw9IDB4MTc3RixcbiAgICAnS2htZXInOiAoY2hhcikgPT4gY2hhciA+PSAweDE3ODAgJiYgY2hhciA8PSAweDE3RkYsXG4gICAgLy8gJ01vbmdvbGlhbic6IChjaGFyKSA9PiBjaGFyID49IDB4MTgwMCAmJiBjaGFyIDw9IDB4MThBRixcbiAgICAnVW5pZmllZCBDYW5hZGlhbiBBYm9yaWdpbmFsIFN5bGxhYmljcyBFeHRlbmRlZCc6IChjaGFyKSA9PiBjaGFyID49IDB4MThCMCAmJiBjaGFyIDw9IDB4MThGRixcbiAgICAvLyAnTGltYnUnOiAoY2hhcikgPT4gY2hhciA+PSAweDE5MDAgJiYgY2hhciA8PSAweDE5NEYsXG4gICAgLy8gJ1RhaSBMZSc6IChjaGFyKSA9PiBjaGFyID49IDB4MTk1MCAmJiBjaGFyIDw9IDB4MTk3RixcbiAgICAvLyAnTmV3IFRhaSBMdWUnOiAoY2hhcikgPT4gY2hhciA+PSAweDE5ODAgJiYgY2hhciA8PSAweDE5REYsXG4gICAgLy8gJ0tobWVyIFN5bWJvbHMnOiAoY2hhcikgPT4gY2hhciA+PSAweDE5RTAgJiYgY2hhciA8PSAweDE5RkYsXG4gICAgLy8gJ0J1Z2luZXNlJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxQTAwICYmIGNoYXIgPD0gMHgxQTFGLFxuICAgIC8vICdUYWkgVGhhbSc6IChjaGFyKSA9PiBjaGFyID49IDB4MUEyMCAmJiBjaGFyIDw9IDB4MUFBRixcbiAgICAvLyAnQ29tYmluaW5nIERpYWNyaXRpY2FsIE1hcmtzIEV4dGVuZGVkJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxQUIwICYmIGNoYXIgPD0gMHgxQUZGLFxuICAgIC8vICdCYWxpbmVzZSc6IChjaGFyKSA9PiBjaGFyID49IDB4MUIwMCAmJiBjaGFyIDw9IDB4MUI3RixcbiAgICAvLyAnU3VuZGFuZXNlJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxQjgwICYmIGNoYXIgPD0gMHgxQkJGLFxuICAgIC8vICdCYXRhayc6IChjaGFyKSA9PiBjaGFyID49IDB4MUJDMCAmJiBjaGFyIDw9IDB4MUJGRixcbiAgICAvLyAnTGVwY2hhJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxQzAwICYmIGNoYXIgPD0gMHgxQzRGLFxuICAgIC8vICdPbCBDaGlraSc6IChjaGFyKSA9PiBjaGFyID49IDB4MUM1MCAmJiBjaGFyIDw9IDB4MUM3RixcbiAgICAvLyAnQ3lyaWxsaWMgRXh0ZW5kZWQtQyc6IChjaGFyKSA9PiBjaGFyID49IDB4MUM4MCAmJiBjaGFyIDw9IDB4MUM4RixcbiAgICAvLyAnR2VvcmdpYW4gRXh0ZW5kZWQnOiAoY2hhcikgPT4gY2hhciA+PSAweDFDOTAgJiYgY2hhciA8PSAweDFDQkYsXG4gICAgLy8gJ1N1bmRhbmVzZSBTdXBwbGVtZW50JzogKGNoYXIpID0+IGNoYXIgPj0gMHgxQ0MwICYmIGNoYXIgPD0gMHgxQ0NGLFxuICAgIC8vICdWZWRpYyBFeHRlbnNpb25zJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxQ0QwICYmIGNoYXIgPD0gMHgxQ0ZGLFxuICAgIC8vICdQaG9uZXRpYyBFeHRlbnNpb25zJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxRDAwICYmIGNoYXIgPD0gMHgxRDdGLFxuICAgIC8vICdQaG9uZXRpYyBFeHRlbnNpb25zIFN1cHBsZW1lbnQnOiAoY2hhcikgPT4gY2hhciA+PSAweDFEODAgJiYgY2hhciA8PSAweDFEQkYsXG4gICAgLy8gJ0NvbWJpbmluZyBEaWFjcml0aWNhbCBNYXJrcyBTdXBwbGVtZW50JzogKGNoYXIpID0+IGNoYXIgPj0gMHgxREMwICYmIGNoYXIgPD0gMHgxREZGLFxuICAgIC8vICdMYXRpbiBFeHRlbmRlZCBBZGRpdGlvbmFsJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxRTAwICYmIGNoYXIgPD0gMHgxRUZGLFxuICAgIC8vICdHcmVlayBFeHRlbmRlZCc6IChjaGFyKSA9PiBjaGFyID49IDB4MUYwMCAmJiBjaGFyIDw9IDB4MUZGRixcbiAgICAnR2VuZXJhbCBQdW5jdHVhdGlvbic6IChjaGFyKSA9PiBjaGFyID49IDB4MjAwMCAmJiBjaGFyIDw9IDB4MjA2RixcbiAgICAvLyAnU3VwZXJzY3JpcHRzIGFuZCBTdWJzY3JpcHRzJzogKGNoYXIpID0+IGNoYXIgPj0gMHgyMDcwICYmIGNoYXIgPD0gMHgyMDlGLFxuICAgIC8vICdDdXJyZW5jeSBTeW1ib2xzJzogKGNoYXIpID0+IGNoYXIgPj0gMHgyMEEwICYmIGNoYXIgPD0gMHgyMENGLFxuICAgIC8vICdDb21iaW5pbmcgRGlhY3JpdGljYWwgTWFya3MgZm9yIFN5bWJvbHMnOiAoY2hhcikgPT4gY2hhciA+PSAweDIwRDAgJiYgY2hhciA8PSAweDIwRkYsXG4gICAgJ0xldHRlcmxpa2UgU3ltYm9scyc6IChjaGFyKSA9PiBjaGFyID49IDB4MjEwMCAmJiBjaGFyIDw9IDB4MjE0RixcbiAgICAnTnVtYmVyIEZvcm1zJzogKGNoYXIpID0+IGNoYXIgPj0gMHgyMTUwICYmIGNoYXIgPD0gMHgyMThGLFxuICAgIC8vICdBcnJvd3MnOiAoY2hhcikgPT4gY2hhciA+PSAweDIxOTAgJiYgY2hhciA8PSAweDIxRkYsXG4gICAgLy8gJ01hdGhlbWF0aWNhbCBPcGVyYXRvcnMnOiAoY2hhcikgPT4gY2hhciA+PSAweDIyMDAgJiYgY2hhciA8PSAweDIyRkYsXG4gICAgJ01pc2NlbGxhbmVvdXMgVGVjaG5pY2FsJzogKGNoYXIpID0+IGNoYXIgPj0gMHgyMzAwICYmIGNoYXIgPD0gMHgyM0ZGLFxuICAgICdDb250cm9sIFBpY3R1cmVzJzogKGNoYXIpID0+IGNoYXIgPj0gMHgyNDAwICYmIGNoYXIgPD0gMHgyNDNGLFxuICAgICdPcHRpY2FsIENoYXJhY3RlciBSZWNvZ25pdGlvbic6IChjaGFyKSA9PiBjaGFyID49IDB4MjQ0MCAmJiBjaGFyIDw9IDB4MjQ1RixcbiAgICAnRW5jbG9zZWQgQWxwaGFudW1lcmljcyc6IChjaGFyKSA9PiBjaGFyID49IDB4MjQ2MCAmJiBjaGFyIDw9IDB4MjRGRixcbiAgICAvLyAnQm94IERyYXdpbmcnOiAoY2hhcikgPT4gY2hhciA+PSAweDI1MDAgJiYgY2hhciA8PSAweDI1N0YsXG4gICAgLy8gJ0Jsb2NrIEVsZW1lbnRzJzogKGNoYXIpID0+IGNoYXIgPj0gMHgyNTgwICYmIGNoYXIgPD0gMHgyNTlGLFxuICAgICdHZW9tZXRyaWMgU2hhcGVzJzogKGNoYXIpID0+IGNoYXIgPj0gMHgyNUEwICYmIGNoYXIgPD0gMHgyNUZGLFxuICAgICdNaXNjZWxsYW5lb3VzIFN5bWJvbHMnOiAoY2hhcikgPT4gY2hhciA+PSAweDI2MDAgJiYgY2hhciA8PSAweDI2RkYsXG4gICAgLy8gJ0RpbmdiYXRzJzogKGNoYXIpID0+IGNoYXIgPj0gMHgyNzAwICYmIGNoYXIgPD0gMHgyN0JGLFxuICAgIC8vICdNaXNjZWxsYW5lb3VzIE1hdGhlbWF0aWNhbCBTeW1ib2xzLUEnOiAoY2hhcikgPT4gY2hhciA+PSAweDI3QzAgJiYgY2hhciA8PSAweDI3RUYsXG4gICAgLy8gJ1N1cHBsZW1lbnRhbCBBcnJvd3MtQSc6IChjaGFyKSA9PiBjaGFyID49IDB4MjdGMCAmJiBjaGFyIDw9IDB4MjdGRixcbiAgICAvLyAnQnJhaWxsZSBQYXR0ZXJucyc6IChjaGFyKSA9PiBjaGFyID49IDB4MjgwMCAmJiBjaGFyIDw9IDB4MjhGRixcbiAgICAvLyAnU3VwcGxlbWVudGFsIEFycm93cy1CJzogKGNoYXIpID0+IGNoYXIgPj0gMHgyOTAwICYmIGNoYXIgPD0gMHgyOTdGLFxuICAgIC8vICdNaXNjZWxsYW5lb3VzIE1hdGhlbWF0aWNhbCBTeW1ib2xzLUInOiAoY2hhcikgPT4gY2hhciA+PSAweDI5ODAgJiYgY2hhciA8PSAweDI5RkYsXG4gICAgLy8gJ1N1cHBsZW1lbnRhbCBNYXRoZW1hdGljYWwgT3BlcmF0b3JzJzogKGNoYXIpID0+IGNoYXIgPj0gMHgyQTAwICYmIGNoYXIgPD0gMHgyQUZGLFxuICAgICdNaXNjZWxsYW5lb3VzIFN5bWJvbHMgYW5kIEFycm93cyc6IChjaGFyKSA9PiBjaGFyID49IDB4MkIwMCAmJiBjaGFyIDw9IDB4MkJGRixcbiAgICAvLyAnR2xhZ29saXRpYyc6IChjaGFyKSA9PiBjaGFyID49IDB4MkMwMCAmJiBjaGFyIDw9IDB4MkM1RixcbiAgICAvLyAnTGF0aW4gRXh0ZW5kZWQtQyc6IChjaGFyKSA9PiBjaGFyID49IDB4MkM2MCAmJiBjaGFyIDw9IDB4MkM3RixcbiAgICAvLyAnQ29wdGljJzogKGNoYXIpID0+IGNoYXIgPj0gMHgyQzgwICYmIGNoYXIgPD0gMHgyQ0ZGLFxuICAgIC8vICdHZW9yZ2lhbiBTdXBwbGVtZW50JzogKGNoYXIpID0+IGNoYXIgPj0gMHgyRDAwICYmIGNoYXIgPD0gMHgyRDJGLFxuICAgIC8vICdUaWZpbmFnaCc6IChjaGFyKSA9PiBjaGFyID49IDB4MkQzMCAmJiBjaGFyIDw9IDB4MkQ3RixcbiAgICAvLyAnRXRoaW9waWMgRXh0ZW5kZWQnOiAoY2hhcikgPT4gY2hhciA+PSAweDJEODAgJiYgY2hhciA8PSAweDJEREYsXG4gICAgLy8gJ0N5cmlsbGljIEV4dGVuZGVkLUEnOiAoY2hhcikgPT4gY2hhciA+PSAweDJERTAgJiYgY2hhciA8PSAweDJERkYsXG4gICAgLy8gJ1N1cHBsZW1lbnRhbCBQdW5jdHVhdGlvbic6IChjaGFyKSA9PiBjaGFyID49IDB4MkUwMCAmJiBjaGFyIDw9IDB4MkU3RixcbiAgICAnQ0pLIFJhZGljYWxzIFN1cHBsZW1lbnQnOiAoY2hhcikgPT4gY2hhciA+PSAweDJFODAgJiYgY2hhciA8PSAweDJFRkYsXG4gICAgJ0thbmd4aSBSYWRpY2Fscyc6IChjaGFyKSA9PiBjaGFyID49IDB4MkYwMCAmJiBjaGFyIDw9IDB4MkZERixcbiAgICAnSWRlb2dyYXBoaWMgRGVzY3JpcHRpb24gQ2hhcmFjdGVycyc6IChjaGFyKSA9PiBjaGFyID49IDB4MkZGMCAmJiBjaGFyIDw9IDB4MkZGRixcbiAgICAnQ0pLIFN5bWJvbHMgYW5kIFB1bmN0dWF0aW9uJzogKGNoYXIpID0+IGNoYXIgPj0gMHgzMDAwICYmIGNoYXIgPD0gMHgzMDNGLFxuICAgICdIaXJhZ2FuYSc6IChjaGFyKSA9PiBjaGFyID49IDB4MzA0MCAmJiBjaGFyIDw9IDB4MzA5RixcbiAgICAnS2F0YWthbmEnOiAoY2hhcikgPT4gY2hhciA+PSAweDMwQTAgJiYgY2hhciA8PSAweDMwRkYsXG4gICAgJ0JvcG9tb2ZvJzogKGNoYXIpID0+IGNoYXIgPj0gMHgzMTAwICYmIGNoYXIgPD0gMHgzMTJGLFxuICAgICdIYW5ndWwgQ29tcGF0aWJpbGl0eSBKYW1vJzogKGNoYXIpID0+IGNoYXIgPj0gMHgzMTMwICYmIGNoYXIgPD0gMHgzMThGLFxuICAgICdLYW5idW4nOiAoY2hhcikgPT4gY2hhciA+PSAweDMxOTAgJiYgY2hhciA8PSAweDMxOUYsXG4gICAgJ0JvcG9tb2ZvIEV4dGVuZGVkJzogKGNoYXIpID0+IGNoYXIgPj0gMHgzMUEwICYmIGNoYXIgPD0gMHgzMUJGLFxuICAgICdDSksgU3Ryb2tlcyc6IChjaGFyKSA9PiBjaGFyID49IDB4MzFDMCAmJiBjaGFyIDw9IDB4MzFFRixcbiAgICAnS2F0YWthbmEgUGhvbmV0aWMgRXh0ZW5zaW9ucyc6IChjaGFyKSA9PiBjaGFyID49IDB4MzFGMCAmJiBjaGFyIDw9IDB4MzFGRixcbiAgICAnRW5jbG9zZWQgQ0pLIExldHRlcnMgYW5kIE1vbnRocyc6IChjaGFyKSA9PiBjaGFyID49IDB4MzIwMCAmJiBjaGFyIDw9IDB4MzJGRixcbiAgICAnQ0pLIENvbXBhdGliaWxpdHknOiAoY2hhcikgPT4gY2hhciA+PSAweDMzMDAgJiYgY2hhciA8PSAweDMzRkYsXG4gICAgJ0NKSyBVbmlmaWVkIElkZW9ncmFwaHMgRXh0ZW5zaW9uIEEnOiAoY2hhcikgPT4gY2hhciA+PSAweDM0MDAgJiYgY2hhciA8PSAweDREQkYsXG4gICAgJ1lpamluZyBIZXhhZ3JhbSBTeW1ib2xzJzogKGNoYXIpID0+IGNoYXIgPj0gMHg0REMwICYmIGNoYXIgPD0gMHg0REZGLFxuICAgICdDSksgVW5pZmllZCBJZGVvZ3JhcGhzJzogKGNoYXIpID0+IGNoYXIgPj0gMHg0RTAwICYmIGNoYXIgPD0gMHg5RkZGLFxuICAgICdZaSBTeWxsYWJsZXMnOiAoY2hhcikgPT4gY2hhciA+PSAweEEwMDAgJiYgY2hhciA8PSAweEE0OEYsXG4gICAgJ1lpIFJhZGljYWxzJzogKGNoYXIpID0+IGNoYXIgPj0gMHhBNDkwICYmIGNoYXIgPD0gMHhBNENGLFxuICAgIC8vICdMaXN1JzogKGNoYXIpID0+IGNoYXIgPj0gMHhBNEQwICYmIGNoYXIgPD0gMHhBNEZGLFxuICAgIC8vICdWYWknOiAoY2hhcikgPT4gY2hhciA+PSAweEE1MDAgJiYgY2hhciA8PSAweEE2M0YsXG4gICAgLy8gJ0N5cmlsbGljIEV4dGVuZGVkLUInOiAoY2hhcikgPT4gY2hhciA+PSAweEE2NDAgJiYgY2hhciA8PSAweEE2OUYsXG4gICAgLy8gJ0JhbXVtJzogKGNoYXIpID0+IGNoYXIgPj0gMHhBNkEwICYmIGNoYXIgPD0gMHhBNkZGLFxuICAgIC8vICdNb2RpZmllciBUb25lIExldHRlcnMnOiAoY2hhcikgPT4gY2hhciA+PSAweEE3MDAgJiYgY2hhciA8PSAweEE3MUYsXG4gICAgLy8gJ0xhdGluIEV4dGVuZGVkLUQnOiAoY2hhcikgPT4gY2hhciA+PSAweEE3MjAgJiYgY2hhciA8PSAweEE3RkYsXG4gICAgLy8gJ1N5bG90aSBOYWdyaSc6IChjaGFyKSA9PiBjaGFyID49IDB4QTgwMCAmJiBjaGFyIDw9IDB4QTgyRixcbiAgICAvLyAnQ29tbW9uIEluZGljIE51bWJlciBGb3Jtcyc6IChjaGFyKSA9PiBjaGFyID49IDB4QTgzMCAmJiBjaGFyIDw9IDB4QTgzRixcbiAgICAvLyAnUGhhZ3MtcGEnOiAoY2hhcikgPT4gY2hhciA+PSAweEE4NDAgJiYgY2hhciA8PSAweEE4N0YsXG4gICAgLy8gJ1NhdXJhc2h0cmEnOiAoY2hhcikgPT4gY2hhciA+PSAweEE4ODAgJiYgY2hhciA8PSAweEE4REYsXG4gICAgLy8gJ0RldmFuYWdhcmkgRXh0ZW5kZWQnOiAoY2hhcikgPT4gY2hhciA+PSAweEE4RTAgJiYgY2hhciA8PSAweEE4RkYsXG4gICAgLy8gJ0theWFoIExpJzogKGNoYXIpID0+IGNoYXIgPj0gMHhBOTAwICYmIGNoYXIgPD0gMHhBOTJGLFxuICAgIC8vICdSZWphbmcnOiAoY2hhcikgPT4gY2hhciA+PSAweEE5MzAgJiYgY2hhciA8PSAweEE5NUYsXG4gICAgJ0hhbmd1bCBKYW1vIEV4dGVuZGVkLUEnOiAoY2hhcikgPT4gY2hhciA+PSAweEE5NjAgJiYgY2hhciA8PSAweEE5N0YsXG4gICAgLy8gJ0phdmFuZXNlJzogKGNoYXIpID0+IGNoYXIgPj0gMHhBOTgwICYmIGNoYXIgPD0gMHhBOURGLFxuICAgIC8vICdNeWFubWFyIEV4dGVuZGVkLUInOiAoY2hhcikgPT4gY2hhciA+PSAweEE5RTAgJiYgY2hhciA8PSAweEE5RkYsXG4gICAgLy8gJ0NoYW0nOiAoY2hhcikgPT4gY2hhciA+PSAweEFBMDAgJiYgY2hhciA8PSAweEFBNUYsXG4gICAgLy8gJ015YW5tYXIgRXh0ZW5kZWQtQSc6IChjaGFyKSA9PiBjaGFyID49IDB4QUE2MCAmJiBjaGFyIDw9IDB4QUE3RixcbiAgICAvLyAnVGFpIFZpZXQnOiAoY2hhcikgPT4gY2hhciA+PSAweEFBODAgJiYgY2hhciA8PSAweEFBREYsXG4gICAgLy8gJ01lZXRlaSBNYXllayBFeHRlbnNpb25zJzogKGNoYXIpID0+IGNoYXIgPj0gMHhBQUUwICYmIGNoYXIgPD0gMHhBQUZGLFxuICAgIC8vICdFdGhpb3BpYyBFeHRlbmRlZC1BJzogKGNoYXIpID0+IGNoYXIgPj0gMHhBQjAwICYmIGNoYXIgPD0gMHhBQjJGLFxuICAgIC8vICdMYXRpbiBFeHRlbmRlZC1FJzogKGNoYXIpID0+IGNoYXIgPj0gMHhBQjMwICYmIGNoYXIgPD0gMHhBQjZGLFxuICAgIC8vICdDaGVyb2tlZSBTdXBwbGVtZW50JzogKGNoYXIpID0+IGNoYXIgPj0gMHhBQjcwICYmIGNoYXIgPD0gMHhBQkJGLFxuICAgIC8vICdNZWV0ZWkgTWF5ZWsnOiAoY2hhcikgPT4gY2hhciA+PSAweEFCQzAgJiYgY2hhciA8PSAweEFCRkYsXG4gICAgJ0hhbmd1bCBTeWxsYWJsZXMnOiAoY2hhcikgPT4gY2hhciA+PSAweEFDMDAgJiYgY2hhciA8PSAweEQ3QUYsXG4gICAgJ0hhbmd1bCBKYW1vIEV4dGVuZGVkLUInOiAoY2hhcikgPT4gY2hhciA+PSAweEQ3QjAgJiYgY2hhciA8PSAweEQ3RkYsXG4gICAgLy8gJ0hpZ2ggU3Vycm9nYXRlcyc6IChjaGFyKSA9PiBjaGFyID49IDB4RDgwMCAmJiBjaGFyIDw9IDB4REI3RixcbiAgICAvLyAnSGlnaCBQcml2YXRlIFVzZSBTdXJyb2dhdGVzJzogKGNoYXIpID0+IGNoYXIgPj0gMHhEQjgwICYmIGNoYXIgPD0gMHhEQkZGLFxuICAgIC8vICdMb3cgU3Vycm9nYXRlcyc6IChjaGFyKSA9PiBjaGFyID49IDB4REMwMCAmJiBjaGFyIDw9IDB4REZGRixcbiAgICAnUHJpdmF0ZSBVc2UgQXJlYSc6IChjaGFyKSA9PiBjaGFyID49IDB4RTAwMCAmJiBjaGFyIDw9IDB4RjhGRixcbiAgICAnQ0pLIENvbXBhdGliaWxpdHkgSWRlb2dyYXBocyc6IChjaGFyKSA9PiBjaGFyID49IDB4RjkwMCAmJiBjaGFyIDw9IDB4RkFGRixcbiAgICAvLyAnQWxwaGFiZXRpYyBQcmVzZW50YXRpb24gRm9ybXMnOiAoY2hhcikgPT4gY2hhciA+PSAweEZCMDAgJiYgY2hhciA8PSAweEZCNEYsXG4gICAgJ0FyYWJpYyBQcmVzZW50YXRpb24gRm9ybXMtQSc6IChjaGFyKSA9PiBjaGFyID49IDB4RkI1MCAmJiBjaGFyIDw9IDB4RkRGRixcbiAgICAvLyAnVmFyaWF0aW9uIFNlbGVjdG9ycyc6IChjaGFyKSA9PiBjaGFyID49IDB4RkUwMCAmJiBjaGFyIDw9IDB4RkUwRixcbiAgICAnVmVydGljYWwgRm9ybXMnOiAoY2hhcikgPT4gY2hhciA+PSAweEZFMTAgJiYgY2hhciA8PSAweEZFMUYsXG4gICAgLy8gJ0NvbWJpbmluZyBIYWxmIE1hcmtzJzogKGNoYXIpID0+IGNoYXIgPj0gMHhGRTIwICYmIGNoYXIgPD0gMHhGRTJGLFxuICAgICdDSksgQ29tcGF0aWJpbGl0eSBGb3Jtcyc6IChjaGFyKSA9PiBjaGFyID49IDB4RkUzMCAmJiBjaGFyIDw9IDB4RkU0RixcbiAgICAnU21hbGwgRm9ybSBWYXJpYW50cyc6IChjaGFyKSA9PiBjaGFyID49IDB4RkU1MCAmJiBjaGFyIDw9IDB4RkU2RixcbiAgICAnQXJhYmljIFByZXNlbnRhdGlvbiBGb3Jtcy1CJzogKGNoYXIpID0+IGNoYXIgPj0gMHhGRTcwICYmIGNoYXIgPD0gMHhGRUZGLFxuICAgICdIYWxmd2lkdGggYW5kIEZ1bGx3aWR0aCBGb3Jtcyc6IChjaGFyKSA9PiBjaGFyID49IDB4RkYwMCAmJiBjaGFyIDw9IDB4RkZFRlxuICAgIC8vICdTcGVjaWFscyc6IChjaGFyKSA9PiBjaGFyID49IDB4RkZGMCAmJiBjaGFyIDw9IDB4RkZGRixcbiAgICAvLyAnTGluZWFyIEIgU3lsbGFiYXJ5JzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMDAwMCAmJiBjaGFyIDw9IDB4MTAwN0YsXG4gICAgLy8gJ0xpbmVhciBCIElkZW9ncmFtcyc6IChjaGFyKSA9PiBjaGFyID49IDB4MTAwODAgJiYgY2hhciA8PSAweDEwMEZGLFxuICAgIC8vICdBZWdlYW4gTnVtYmVycyc6IChjaGFyKSA9PiBjaGFyID49IDB4MTAxMDAgJiYgY2hhciA8PSAweDEwMTNGLFxuICAgIC8vICdBbmNpZW50IEdyZWVrIE51bWJlcnMnOiAoY2hhcikgPT4gY2hhciA+PSAweDEwMTQwICYmIGNoYXIgPD0gMHgxMDE4RixcbiAgICAvLyAnQW5jaWVudCBTeW1ib2xzJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMDE5MCAmJiBjaGFyIDw9IDB4MTAxQ0YsXG4gICAgLy8gJ1BoYWlzdG9zIERpc2MnOiAoY2hhcikgPT4gY2hhciA+PSAweDEwMUQwICYmIGNoYXIgPD0gMHgxMDFGRixcbiAgICAvLyAnTHljaWFuJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMDI4MCAmJiBjaGFyIDw9IDB4MTAyOUYsXG4gICAgLy8gJ0Nhcmlhbic6IChjaGFyKSA9PiBjaGFyID49IDB4MTAyQTAgJiYgY2hhciA8PSAweDEwMkRGLFxuICAgIC8vICdDb3B0aWMgRXBhY3QgTnVtYmVycyc6IChjaGFyKSA9PiBjaGFyID49IDB4MTAyRTAgJiYgY2hhciA8PSAweDEwMkZGLFxuICAgIC8vICdPbGQgSXRhbGljJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMDMwMCAmJiBjaGFyIDw9IDB4MTAzMkYsXG4gICAgLy8gJ0dvdGhpYyc6IChjaGFyKSA9PiBjaGFyID49IDB4MTAzMzAgJiYgY2hhciA8PSAweDEwMzRGLFxuICAgIC8vICdPbGQgUGVybWljJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMDM1MCAmJiBjaGFyIDw9IDB4MTAzN0YsXG4gICAgLy8gJ1VnYXJpdGljJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMDM4MCAmJiBjaGFyIDw9IDB4MTAzOUYsXG4gICAgLy8gJ09sZCBQZXJzaWFuJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMDNBMCAmJiBjaGFyIDw9IDB4MTAzREYsXG4gICAgLy8gJ0Rlc2VyZXQnOiAoY2hhcikgPT4gY2hhciA+PSAweDEwNDAwICYmIGNoYXIgPD0gMHgxMDQ0RixcbiAgICAvLyAnU2hhdmlhbic6IChjaGFyKSA9PiBjaGFyID49IDB4MTA0NTAgJiYgY2hhciA8PSAweDEwNDdGLFxuICAgIC8vICdPc21hbnlhJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMDQ4MCAmJiBjaGFyIDw9IDB4MTA0QUYsXG4gICAgLy8gJ09zYWdlJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMDRCMCAmJiBjaGFyIDw9IDB4MTA0RkYsXG4gICAgLy8gJ0VsYmFzYW4nOiAoY2hhcikgPT4gY2hhciA+PSAweDEwNTAwICYmIGNoYXIgPD0gMHgxMDUyRixcbiAgICAvLyAnQ2F1Y2FzaWFuIEFsYmFuaWFuJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMDUzMCAmJiBjaGFyIDw9IDB4MTA1NkYsXG4gICAgLy8gJ0xpbmVhciBBJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMDYwMCAmJiBjaGFyIDw9IDB4MTA3N0YsXG4gICAgLy8gJ0N5cHJpb3QgU3lsbGFiYXJ5JzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMDgwMCAmJiBjaGFyIDw9IDB4MTA4M0YsXG4gICAgLy8gJ0ltcGVyaWFsIEFyYW1haWMnOiAoY2hhcikgPT4gY2hhciA+PSAweDEwODQwICYmIGNoYXIgPD0gMHgxMDg1RixcbiAgICAvLyAnUGFsbXlyZW5lJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMDg2MCAmJiBjaGFyIDw9IDB4MTA4N0YsXG4gICAgLy8gJ05hYmF0YWVhbic6IChjaGFyKSA9PiBjaGFyID49IDB4MTA4ODAgJiYgY2hhciA8PSAweDEwOEFGLFxuICAgIC8vICdIYXRyYW4nOiAoY2hhcikgPT4gY2hhciA+PSAweDEwOEUwICYmIGNoYXIgPD0gMHgxMDhGRixcbiAgICAvLyAnUGhvZW5pY2lhbic6IChjaGFyKSA9PiBjaGFyID49IDB4MTA5MDAgJiYgY2hhciA8PSAweDEwOTFGLFxuICAgIC8vICdMeWRpYW4nOiAoY2hhcikgPT4gY2hhciA+PSAweDEwOTIwICYmIGNoYXIgPD0gMHgxMDkzRixcbiAgICAvLyAnTWVyb2l0aWMgSGllcm9nbHlwaHMnOiAoY2hhcikgPT4gY2hhciA+PSAweDEwOTgwICYmIGNoYXIgPD0gMHgxMDk5RixcbiAgICAvLyAnTWVyb2l0aWMgQ3Vyc2l2ZSc6IChjaGFyKSA9PiBjaGFyID49IDB4MTA5QTAgJiYgY2hhciA8PSAweDEwOUZGLFxuICAgIC8vICdLaGFyb3NodGhpJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMEEwMCAmJiBjaGFyIDw9IDB4MTBBNUYsXG4gICAgLy8gJ09sZCBTb3V0aCBBcmFiaWFuJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMEE2MCAmJiBjaGFyIDw9IDB4MTBBN0YsXG4gICAgLy8gJ09sZCBOb3J0aCBBcmFiaWFuJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMEE4MCAmJiBjaGFyIDw9IDB4MTBBOUYsXG4gICAgLy8gJ01hbmljaGFlYW4nOiAoY2hhcikgPT4gY2hhciA+PSAweDEwQUMwICYmIGNoYXIgPD0gMHgxMEFGRixcbiAgICAvLyAnQXZlc3Rhbic6IChjaGFyKSA9PiBjaGFyID49IDB4MTBCMDAgJiYgY2hhciA8PSAweDEwQjNGLFxuICAgIC8vICdJbnNjcmlwdGlvbmFsIFBhcnRoaWFuJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMEI0MCAmJiBjaGFyIDw9IDB4MTBCNUYsXG4gICAgLy8gJ0luc2NyaXB0aW9uYWwgUGFobGF2aSc6IChjaGFyKSA9PiBjaGFyID49IDB4MTBCNjAgJiYgY2hhciA8PSAweDEwQjdGLFxuICAgIC8vICdQc2FsdGVyIFBhaGxhdmknOiAoY2hhcikgPT4gY2hhciA+PSAweDEwQjgwICYmIGNoYXIgPD0gMHgxMEJBRixcbiAgICAvLyAnT2xkIFR1cmtpYyc6IChjaGFyKSA9PiBjaGFyID49IDB4MTBDMDAgJiYgY2hhciA8PSAweDEwQzRGLFxuICAgIC8vICdPbGQgSHVuZ2FyaWFuJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMEM4MCAmJiBjaGFyIDw9IDB4MTBDRkYsXG4gICAgLy8gJ0hhbmlmaSBSb2hpbmd5YSc6IChjaGFyKSA9PiBjaGFyID49IDB4MTBEMDAgJiYgY2hhciA8PSAweDEwRDNGLFxuICAgIC8vICdSdW1pIE51bWVyYWwgU3ltYm9scyc6IChjaGFyKSA9PiBjaGFyID49IDB4MTBFNjAgJiYgY2hhciA8PSAweDEwRTdGLFxuICAgIC8vICdPbGQgU29nZGlhbic6IChjaGFyKSA9PiBjaGFyID49IDB4MTBGMDAgJiYgY2hhciA8PSAweDEwRjJGLFxuICAgIC8vICdTb2dkaWFuJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMEYzMCAmJiBjaGFyIDw9IDB4MTBGNkYsXG4gICAgLy8gJ0JyYWhtaSc6IChjaGFyKSA9PiBjaGFyID49IDB4MTEwMDAgJiYgY2hhciA8PSAweDExMDdGLFxuICAgIC8vICdLYWl0aGknOiAoY2hhcikgPT4gY2hhciA+PSAweDExMDgwICYmIGNoYXIgPD0gMHgxMTBDRixcbiAgICAvLyAnU29yYSBTb21wZW5nJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMTBEMCAmJiBjaGFyIDw9IDB4MTEwRkYsXG4gICAgLy8gJ0NoYWttYSc6IChjaGFyKSA9PiBjaGFyID49IDB4MTExMDAgJiYgY2hhciA8PSAweDExMTRGLFxuICAgIC8vICdNYWhhamFuaSc6IChjaGFyKSA9PiBjaGFyID49IDB4MTExNTAgJiYgY2hhciA8PSAweDExMTdGLFxuICAgIC8vICdTaGFyYWRhJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMTE4MCAmJiBjaGFyIDw9IDB4MTExREYsXG4gICAgLy8gJ1NpbmhhbGEgQXJjaGFpYyBOdW1iZXJzJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMTFFMCAmJiBjaGFyIDw9IDB4MTExRkYsXG4gICAgLy8gJ0tob2praSc6IChjaGFyKSA9PiBjaGFyID49IDB4MTEyMDAgJiYgY2hhciA8PSAweDExMjRGLFxuICAgIC8vICdNdWx0YW5pJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMTI4MCAmJiBjaGFyIDw9IDB4MTEyQUYsXG4gICAgLy8gJ0todWRhd2FkaSc6IChjaGFyKSA9PiBjaGFyID49IDB4MTEyQjAgJiYgY2hhciA8PSAweDExMkZGLFxuICAgIC8vICdHcmFudGhhJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMTMwMCAmJiBjaGFyIDw9IDB4MTEzN0YsXG4gICAgLy8gJ05ld2EnOiAoY2hhcikgPT4gY2hhciA+PSAweDExNDAwICYmIGNoYXIgPD0gMHgxMTQ3RixcbiAgICAvLyAnVGlyaHV0YSc6IChjaGFyKSA9PiBjaGFyID49IDB4MTE0ODAgJiYgY2hhciA8PSAweDExNERGLFxuICAgIC8vICdTaWRkaGFtJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMTU4MCAmJiBjaGFyIDw9IDB4MTE1RkYsXG4gICAgLy8gJ01vZGknOiAoY2hhcikgPT4gY2hhciA+PSAweDExNjAwICYmIGNoYXIgPD0gMHgxMTY1RixcbiAgICAvLyAnTW9uZ29saWFuIFN1cHBsZW1lbnQnOiAoY2hhcikgPT4gY2hhciA+PSAweDExNjYwICYmIGNoYXIgPD0gMHgxMTY3RixcbiAgICAvLyAnVGFrcmknOiAoY2hhcikgPT4gY2hhciA+PSAweDExNjgwICYmIGNoYXIgPD0gMHgxMTZDRixcbiAgICAvLyAnQWhvbSc6IChjaGFyKSA9PiBjaGFyID49IDB4MTE3MDAgJiYgY2hhciA8PSAweDExNzNGLFxuICAgIC8vICdEb2dyYSc6IChjaGFyKSA9PiBjaGFyID49IDB4MTE4MDAgJiYgY2hhciA8PSAweDExODRGLFxuICAgIC8vICdXYXJhbmcgQ2l0aSc6IChjaGFyKSA9PiBjaGFyID49IDB4MTE4QTAgJiYgY2hhciA8PSAweDExOEZGLFxuICAgIC8vICdaYW5hYmF6YXIgU3F1YXJlJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMUEwMCAmJiBjaGFyIDw9IDB4MTFBNEYsXG4gICAgLy8gJ1NveW9tYm8nOiAoY2hhcikgPT4gY2hhciA+PSAweDExQTUwICYmIGNoYXIgPD0gMHgxMUFBRixcbiAgICAvLyAnUGF1IENpbiBIYXUnOiAoY2hhcikgPT4gY2hhciA+PSAweDExQUMwICYmIGNoYXIgPD0gMHgxMUFGRixcbiAgICAvLyAnQmhhaWtzdWtpJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMUMwMCAmJiBjaGFyIDw9IDB4MTFDNkYsXG4gICAgLy8gJ01hcmNoZW4nOiAoY2hhcikgPT4gY2hhciA+PSAweDExQzcwICYmIGNoYXIgPD0gMHgxMUNCRixcbiAgICAvLyAnTWFzYXJhbSBHb25kaSc6IChjaGFyKSA9PiBjaGFyID49IDB4MTFEMDAgJiYgY2hhciA8PSAweDExRDVGLFxuICAgIC8vICdHdW5qYWxhIEdvbmRpJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMUQ2MCAmJiBjaGFyIDw9IDB4MTFEQUYsXG4gICAgLy8gJ01ha2FzYXInOiAoY2hhcikgPT4gY2hhciA+PSAweDExRUUwICYmIGNoYXIgPD0gMHgxMUVGRixcbiAgICAvLyAnQ3VuZWlmb3JtJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMjAwMCAmJiBjaGFyIDw9IDB4MTIzRkYsXG4gICAgLy8gJ0N1bmVpZm9ybSBOdW1iZXJzIGFuZCBQdW5jdHVhdGlvbic6IChjaGFyKSA9PiBjaGFyID49IDB4MTI0MDAgJiYgY2hhciA8PSAweDEyNDdGLFxuICAgIC8vICdFYXJseSBEeW5hc3RpYyBDdW5laWZvcm0nOiAoY2hhcikgPT4gY2hhciA+PSAweDEyNDgwICYmIGNoYXIgPD0gMHgxMjU0RixcbiAgICAvLyAnRWd5cHRpYW4gSGllcm9nbHlwaHMnOiAoY2hhcikgPT4gY2hhciA+PSAweDEzMDAwICYmIGNoYXIgPD0gMHgxMzQyRixcbiAgICAvLyAnQW5hdG9saWFuIEhpZXJvZ2x5cGhzJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxNDQwMCAmJiBjaGFyIDw9IDB4MTQ2N0YsXG4gICAgLy8gJ0JhbXVtIFN1cHBsZW1lbnQnOiAoY2hhcikgPT4gY2hhciA+PSAweDE2ODAwICYmIGNoYXIgPD0gMHgxNkEzRixcbiAgICAvLyAnTXJvJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxNkE0MCAmJiBjaGFyIDw9IDB4MTZBNkYsXG4gICAgLy8gJ0Jhc3NhIFZhaCc6IChjaGFyKSA9PiBjaGFyID49IDB4MTZBRDAgJiYgY2hhciA8PSAweDE2QUZGLFxuICAgIC8vICdQYWhhd2ggSG1vbmcnOiAoY2hhcikgPT4gY2hhciA+PSAweDE2QjAwICYmIGNoYXIgPD0gMHgxNkI4RixcbiAgICAvLyAnTWVkZWZhaWRyaW4nOiAoY2hhcikgPT4gY2hhciA+PSAweDE2RTQwICYmIGNoYXIgPD0gMHgxNkU5RixcbiAgICAvLyAnTWlhbyc6IChjaGFyKSA9PiBjaGFyID49IDB4MTZGMDAgJiYgY2hhciA8PSAweDE2RjlGLFxuICAgIC8vICdJZGVvZ3JhcGhpYyBTeW1ib2xzIGFuZCBQdW5jdHVhdGlvbic6IChjaGFyKSA9PiBjaGFyID49IDB4MTZGRTAgJiYgY2hhciA8PSAweDE2RkZGLFxuICAgIC8vICdUYW5ndXQnOiAoY2hhcikgPT4gY2hhciA+PSAweDE3MDAwICYmIGNoYXIgPD0gMHgxODdGRixcbiAgICAvLyAnVGFuZ3V0IENvbXBvbmVudHMnOiAoY2hhcikgPT4gY2hhciA+PSAweDE4ODAwICYmIGNoYXIgPD0gMHgxOEFGRixcbiAgICAvLyAnS2FuYSBTdXBwbGVtZW50JzogKGNoYXIpID0+IGNoYXIgPj0gMHgxQjAwMCAmJiBjaGFyIDw9IDB4MUIwRkYsXG4gICAgLy8gJ0thbmEgRXh0ZW5kZWQtQSc6IChjaGFyKSA9PiBjaGFyID49IDB4MUIxMDAgJiYgY2hhciA8PSAweDFCMTJGLFxuICAgIC8vICdOdXNodSc6IChjaGFyKSA9PiBjaGFyID49IDB4MUIxNzAgJiYgY2hhciA8PSAweDFCMkZGLFxuICAgIC8vICdEdXBsb3lhbic6IChjaGFyKSA9PiBjaGFyID49IDB4MUJDMDAgJiYgY2hhciA8PSAweDFCQzlGLFxuICAgIC8vICdTaG9ydGhhbmQgRm9ybWF0IENvbnRyb2xzJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxQkNBMCAmJiBjaGFyIDw9IDB4MUJDQUYsXG4gICAgLy8gJ0J5emFudGluZSBNdXNpY2FsIFN5bWJvbHMnOiAoY2hhcikgPT4gY2hhciA+PSAweDFEMDAwICYmIGNoYXIgPD0gMHgxRDBGRixcbiAgICAvLyAnTXVzaWNhbCBTeW1ib2xzJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxRDEwMCAmJiBjaGFyIDw9IDB4MUQxRkYsXG4gICAgLy8gJ0FuY2llbnQgR3JlZWsgTXVzaWNhbCBOb3RhdGlvbic6IChjaGFyKSA9PiBjaGFyID49IDB4MUQyMDAgJiYgY2hhciA8PSAweDFEMjRGLFxuICAgIC8vICdNYXlhbiBOdW1lcmFscyc6IChjaGFyKSA9PiBjaGFyID49IDB4MUQyRTAgJiYgY2hhciA8PSAweDFEMkZGLFxuICAgIC8vICdUYWkgWHVhbiBKaW5nIFN5bWJvbHMnOiAoY2hhcikgPT4gY2hhciA+PSAweDFEMzAwICYmIGNoYXIgPD0gMHgxRDM1RixcbiAgICAvLyAnQ291bnRpbmcgUm9kIE51bWVyYWxzJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxRDM2MCAmJiBjaGFyIDw9IDB4MUQzN0YsXG4gICAgLy8gJ01hdGhlbWF0aWNhbCBBbHBoYW51bWVyaWMgU3ltYm9scyc6IChjaGFyKSA9PiBjaGFyID49IDB4MUQ0MDAgJiYgY2hhciA8PSAweDFEN0ZGLFxuICAgIC8vICdTdXR0b24gU2lnbldyaXRpbmcnOiAoY2hhcikgPT4gY2hhciA+PSAweDFEODAwICYmIGNoYXIgPD0gMHgxREFBRixcbiAgICAvLyAnR2xhZ29saXRpYyBTdXBwbGVtZW50JzogKGNoYXIpID0+IGNoYXIgPj0gMHgxRTAwMCAmJiBjaGFyIDw9IDB4MUUwMkYsXG4gICAgLy8gJ01lbmRlIEtpa2FrdWknOiAoY2hhcikgPT4gY2hhciA+PSAweDFFODAwICYmIGNoYXIgPD0gMHgxRThERixcbiAgICAvLyAnQWRsYW0nOiAoY2hhcikgPT4gY2hhciA+PSAweDFFOTAwICYmIGNoYXIgPD0gMHgxRTk1RixcbiAgICAvLyAnSW5kaWMgU2l5YXEgTnVtYmVycyc6IChjaGFyKSA9PiBjaGFyID49IDB4MUVDNzAgJiYgY2hhciA8PSAweDFFQ0JGLFxuICAgIC8vICdBcmFiaWMgTWF0aGVtYXRpY2FsIEFscGhhYmV0aWMgU3ltYm9scyc6IChjaGFyKSA9PiBjaGFyID49IDB4MUVFMDAgJiYgY2hhciA8PSAweDFFRUZGLFxuICAgIC8vICdNYWhqb25nIFRpbGVzJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxRjAwMCAmJiBjaGFyIDw9IDB4MUYwMkYsXG4gICAgLy8gJ0RvbWlubyBUaWxlcyc6IChjaGFyKSA9PiBjaGFyID49IDB4MUYwMzAgJiYgY2hhciA8PSAweDFGMDlGLFxuICAgIC8vICdQbGF5aW5nIENhcmRzJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxRjBBMCAmJiBjaGFyIDw9IDB4MUYwRkYsXG4gICAgLy8gJ0VuY2xvc2VkIEFscGhhbnVtZXJpYyBTdXBwbGVtZW50JzogKGNoYXIpID0+IGNoYXIgPj0gMHgxRjEwMCAmJiBjaGFyIDw9IDB4MUYxRkYsXG4gICAgLy8gJ0VuY2xvc2VkIElkZW9ncmFwaGljIFN1cHBsZW1lbnQnOiAoY2hhcikgPT4gY2hhciA+PSAweDFGMjAwICYmIGNoYXIgPD0gMHgxRjJGRixcbiAgICAvLyAnTWlzY2VsbGFuZW91cyBTeW1ib2xzIGFuZCBQaWN0b2dyYXBocyc6IChjaGFyKSA9PiBjaGFyID49IDB4MUYzMDAgJiYgY2hhciA8PSAweDFGNUZGLFxuICAgIC8vICdFbW90aWNvbnMnOiAoY2hhcikgPT4gY2hhciA+PSAweDFGNjAwICYmIGNoYXIgPD0gMHgxRjY0RixcbiAgICAvLyAnT3JuYW1lbnRhbCBEaW5nYmF0cyc6IChjaGFyKSA9PiBjaGFyID49IDB4MUY2NTAgJiYgY2hhciA8PSAweDFGNjdGLFxuICAgIC8vICdUcmFuc3BvcnQgYW5kIE1hcCBTeW1ib2xzJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxRjY4MCAmJiBjaGFyIDw9IDB4MUY2RkYsXG4gICAgLy8gJ0FsY2hlbWljYWwgU3ltYm9scyc6IChjaGFyKSA9PiBjaGFyID49IDB4MUY3MDAgJiYgY2hhciA8PSAweDFGNzdGLFxuICAgIC8vICdHZW9tZXRyaWMgU2hhcGVzIEV4dGVuZGVkJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxRjc4MCAmJiBjaGFyIDw9IDB4MUY3RkYsXG4gICAgLy8gJ1N1cHBsZW1lbnRhbCBBcnJvd3MtQyc6IChjaGFyKSA9PiBjaGFyID49IDB4MUY4MDAgJiYgY2hhciA8PSAweDFGOEZGLFxuICAgIC8vICdTdXBwbGVtZW50YWwgU3ltYm9scyBhbmQgUGljdG9ncmFwaHMnOiAoY2hhcikgPT4gY2hhciA+PSAweDFGOTAwICYmIGNoYXIgPD0gMHgxRjlGRixcbiAgICAvLyAnQ2hlc3MgU3ltYm9scyc6IChjaGFyKSA9PiBjaGFyID49IDB4MUZBMDAgJiYgY2hhciA8PSAweDFGQTZGLFxuICAgIC8vICdDSksgVW5pZmllZCBJZGVvZ3JhcGhzIEV4dGVuc2lvbiBCJzogKGNoYXIpID0+IGNoYXIgPj0gMHgyMDAwMCAmJiBjaGFyIDw9IDB4MkE2REYsXG4gICAgLy8gJ0NKSyBVbmlmaWVkIElkZW9ncmFwaHMgRXh0ZW5zaW9uIEMnOiAoY2hhcikgPT4gY2hhciA+PSAweDJBNzAwICYmIGNoYXIgPD0gMHgyQjczRixcbiAgICAvLyAnQ0pLIFVuaWZpZWQgSWRlb2dyYXBocyBFeHRlbnNpb24gRCc6IChjaGFyKSA9PiBjaGFyID49IDB4MkI3NDAgJiYgY2hhciA8PSAweDJCODFGLFxuICAgIC8vICdDSksgVW5pZmllZCBJZGVvZ3JhcGhzIEV4dGVuc2lvbiBFJzogKGNoYXIpID0+IGNoYXIgPj0gMHgyQjgyMCAmJiBjaGFyIDw9IDB4MkNFQUYsXG4gICAgLy8gJ0NKSyBVbmlmaWVkIElkZW9ncmFwaHMgRXh0ZW5zaW9uIEYnOiAoY2hhcikgPT4gY2hhciA+PSAweDJDRUIwICYmIGNoYXIgPD0gMHgyRUJFRixcbiAgICAvLyAnQ0pLIENvbXBhdGliaWxpdHkgSWRlb2dyYXBocyBTdXBwbGVtZW50JzogKGNoYXIpID0+IGNoYXIgPj0gMHgyRjgwMCAmJiBjaGFyIDw9IDB4MkZBMUYsXG4gICAgLy8gJ1RhZ3MnOiAoY2hhcikgPT4gY2hhciA+PSAweEUwMDAwICYmIGNoYXIgPD0gMHhFMDA3RixcbiAgICAvLyAnVmFyaWF0aW9uIFNlbGVjdG9ycyBTdXBwbGVtZW50JzogKGNoYXIpID0+IGNoYXIgPj0gMHhFMDEwMCAmJiBjaGFyIDw9IDB4RTAxRUYsXG4gICAgLy8gJ1N1cHBsZW1lbnRhcnkgUHJpdmF0ZSBVc2UgQXJlYS1BJzogKGNoYXIpID0+IGNoYXIgPj0gMHhGMDAwMCAmJiBjaGFyIDw9IDB4RkZGRkYsXG4gICAgLy8gJ1N1cHBsZW1lbnRhcnkgUHJpdmF0ZSBVc2UgQXJlYS1CJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMDAwMDAgJiYgY2hhciA8PSAweDEwRkZGRixcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHVuaWNvZGVCbG9ja0xvb2t1cDtcbiIsIi8vIEBmbG93XG5cbi8qIGVzbGludC1kaXNhYmxlIG5ldy1jYXAgKi9cblxuaW1wb3J0IGlzQ2hhciBmcm9tICcuL2lzX2NoYXJfaW5fdW5pY29kZV9ibG9jayc7XG5cbmV4cG9ydCBmdW5jdGlvbiBhbGxvd3NJZGVvZ3JhcGhpY0JyZWFraW5nKGNoYXJzOiBzdHJpbmcpIHtcbiAgICBmb3IgKGNvbnN0IGNoYXIgb2YgY2hhcnMpIHtcbiAgICAgICAgaWYgKCFjaGFyQWxsb3dzSWRlb2dyYXBoaWNCcmVha2luZyhjaGFyLmNoYXJDb2RlQXQoMCkpKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYWxsb3dzVmVydGljYWxXcml0aW5nTW9kZShjaGFyczogc3RyaW5nKSB7XG4gICAgZm9yIChjb25zdCBjaGFyIG9mIGNoYXJzKSB7XG4gICAgICAgIGlmIChjaGFySGFzVXByaWdodFZlcnRpY2FsT3JpZW50YXRpb24oY2hhci5jaGFyQ29kZUF0KDApKSkgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFsbG93c0xldHRlclNwYWNpbmcoY2hhcnM6IHN0cmluZykge1xuICAgIGZvciAoY29uc3QgY2hhciBvZiBjaGFycykge1xuICAgICAgICBpZiAoIWNoYXJBbGxvd3NMZXR0ZXJTcGFjaW5nKGNoYXIuY2hhckNvZGVBdCgwKSkpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGFyQWxsb3dzTGV0dGVyU3BhY2luZyhjaGFyOiBudW1iZXIpIHtcbiAgICBpZiAoaXNDaGFyWydBcmFiaWMnXShjaGFyKSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChpc0NoYXJbJ0FyYWJpYyBTdXBwbGVtZW50J10oY2hhcikpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoaXNDaGFyWydBcmFiaWMgRXh0ZW5kZWQtQSddKGNoYXIpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGlzQ2hhclsnQXJhYmljIFByZXNlbnRhdGlvbiBGb3Jtcy1BJ10oY2hhcikpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoaXNDaGFyWydBcmFiaWMgUHJlc2VudGF0aW9uIEZvcm1zLUInXShjaGFyKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGFyQWxsb3dzSWRlb2dyYXBoaWNCcmVha2luZyhjaGFyOiBudW1iZXIpIHtcbiAgICAvLyBSZXR1cm4gZWFybHkgZm9yIGNoYXJhY3RlcnMgb3V0c2lkZSBhbGwgaWRlb2dyYXBoaWMgcmFuZ2VzLlxuICAgIGlmIChjaGFyIDwgMHgyRTgwKSByZXR1cm4gZmFsc2U7XG5cbiAgICBpZiAoaXNDaGFyWydCb3BvbW9mbyBFeHRlbmRlZCddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydCb3BvbW9mbyddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydDSksgQ29tcGF0aWJpbGl0eSBGb3JtcyddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydDSksgQ29tcGF0aWJpbGl0eSBJZGVvZ3JhcGhzJ10oY2hhcikpIHJldHVybiB0cnVlO1xuICAgIGlmIChpc0NoYXJbJ0NKSyBDb21wYXRpYmlsaXR5J10oY2hhcikpIHJldHVybiB0cnVlO1xuICAgIGlmIChpc0NoYXJbJ0NKSyBSYWRpY2FscyBTdXBwbGVtZW50J10oY2hhcikpIHJldHVybiB0cnVlO1xuICAgIGlmIChpc0NoYXJbJ0NKSyBTdHJva2VzJ10oY2hhcikpIHJldHVybiB0cnVlO1xuICAgIGlmIChpc0NoYXJbJ0NKSyBTeW1ib2xzIGFuZCBQdW5jdHVhdGlvbiddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydDSksgVW5pZmllZCBJZGVvZ3JhcGhzIEV4dGVuc2lvbiBBJ10oY2hhcikpIHJldHVybiB0cnVlO1xuICAgIGlmIChpc0NoYXJbJ0NKSyBVbmlmaWVkIElkZW9ncmFwaHMnXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnRW5jbG9zZWQgQ0pLIExldHRlcnMgYW5kIE1vbnRocyddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydIYWxmd2lkdGggYW5kIEZ1bGx3aWR0aCBGb3JtcyddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydIaXJhZ2FuYSddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydJZGVvZ3JhcGhpYyBEZXNjcmlwdGlvbiBDaGFyYWN0ZXJzJ10oY2hhcikpIHJldHVybiB0cnVlO1xuICAgIGlmIChpc0NoYXJbJ0thbmd4aSBSYWRpY2FscyddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydLYXRha2FuYSBQaG9uZXRpYyBFeHRlbnNpb25zJ10oY2hhcikpIHJldHVybiB0cnVlO1xuICAgIGlmIChpc0NoYXJbJ0thdGFrYW5hJ10oY2hhcikpIHJldHVybiB0cnVlO1xuICAgIGlmIChpc0NoYXJbJ1ZlcnRpY2FsIEZvcm1zJ10oY2hhcikpIHJldHVybiB0cnVlO1xuICAgIGlmIChpc0NoYXJbJ1lpIFJhZGljYWxzJ10oY2hhcikpIHJldHVybiB0cnVlO1xuICAgIGlmIChpc0NoYXJbJ1lpIFN5bGxhYmxlcyddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcblxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuLy8gVGhlIGZvbGxvd2luZyBsb2dpYyBjb21lcyBmcm9tXG4vLyA8aHR0cDovL3d3dy51bmljb2RlLm9yZy9QdWJsaWMvdmVydGljYWwvcmV2aXNpb24tMTcvVmVydGljYWxPcmllbnRhdGlvbi0xNy50eHQ+LlxuLy8gVGhlIGRhdGEgZmlsZSBkZW5vdGVzIHdpdGggw6LCgMKcVcOiwoDCnSBvciDDosKAwpxUdcOiwoDCnSBhbnkgY29kZXBvaW50IHRoYXQgbWF5IGJlIGRyYXduXG4vLyB1cHJpZ2h0IGluIHZlcnRpY2FsIHRleHQgYnV0IGRvZXMgbm90IGRpc3Rpbmd1aXNoIGJldHdlZW4gdXByaWdodCBhbmRcbi8vIMOiwoDCnG5ldXRyYWzDosKAwp0gY2hhcmFjdGVycy5cblxuLy8gQmxvY2tzIGluIHRoZSBVbmljb2RlIHN1cHBsZW1lbnRhcnkgcGxhbmVzIGFyZSBleGNsdWRlZCBmcm9tIHRoaXMgbW9kdWxlIGR1ZVxuLy8gdG8gPGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvbWFwYm94LWdsL2lzc3Vlcy8yOT4uXG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBVbmljb2RlIGNvZGVwb2ludCBpZGVudGlmaWVzIGEgY2hhcmFjdGVyIHdpdGhcbiAqIHVwcmlnaHQgb3JpZW50YXRpb24uXG4gKlxuICogQSBjaGFyYWN0ZXIgaGFzIHVwcmlnaHQgb3JpZW50YXRpb24gaWYgaXQgaXMgZHJhd24gdXByaWdodCAodW5yb3RhdGVkKVxuICogd2hldGhlciB0aGUgbGluZSBpcyBvcmllbnRlZCBob3Jpem9udGFsbHkgb3IgdmVydGljYWxseSwgZXZlbiBpZiBib3RoXG4gKiBhZGphY2VudCBjaGFyYWN0ZXJzIGNhbiBiZSByb3RhdGVkLiBGb3IgZXhhbXBsZSwgYSBDaGluZXNlIGNoYXJhY3RlciBpc1xuICogYWx3YXlzIGRyYXduIHVwcmlnaHQuIEFuIHVwcmlnaHRseSBvcmllbnRlZCBjaGFyYWN0ZXIgY2F1c2VzIGFuIGFkamFjZW50XG4gKiDDosKAwpxuZXV0cmFsw6LCgMKdIGNoYXJhY3RlciB0byBiZSBkcmF3biB1cHJpZ2h0IGFzIHdlbGwuXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gY2hhckhhc1VwcmlnaHRWZXJ0aWNhbE9yaWVudGF0aW9uKGNoYXI6IG51bWJlcikge1xuICAgIGlmIChjaGFyID09PSAweDAyRUEgLyogbW9kaWZpZXIgbGV0dGVyIHlpbiBkZXBhcnRpbmcgdG9uZSBtYXJrICovIHx8XG4gICAgICAgIGNoYXIgPT09IDB4MDJFQiAvKiBtb2RpZmllciBsZXR0ZXIgeWFuZyBkZXBhcnRpbmcgdG9uZSBtYXJrICovKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIFJldHVybiBlYXJseSBmb3IgY2hhcmFjdGVycyBvdXRzaWRlIGFsbCByYW5nZXMgd2hvc2UgY2hhcmFjdGVycyByZW1haW5cbiAgICAvLyB1cHJpZ2h0IGluIHZlcnRpY2FsIHdyaXRpbmcgbW9kZS5cbiAgICBpZiAoY2hhciA8IDB4MTEwMCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgaWYgKGlzQ2hhclsnQm9wb21vZm8gRXh0ZW5kZWQnXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnQm9wb21vZm8nXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnQ0pLIENvbXBhdGliaWxpdHkgRm9ybXMnXShjaGFyKSkge1xuICAgICAgICBpZiAoISgoY2hhciA+PSAweEZFNDkgLyogZGFzaGVkIG92ZXJsaW5lICovICYmIGNoYXIgPD0gMHhGRTRGKSAvKiB3YXZ5IGxvdyBsaW5lICovKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzQ2hhclsnQ0pLIENvbXBhdGliaWxpdHkgSWRlb2dyYXBocyddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydDSksgQ29tcGF0aWJpbGl0eSddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydDSksgUmFkaWNhbHMgU3VwcGxlbWVudCddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydDSksgU3Ryb2tlcyddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydDSksgU3ltYm9scyBhbmQgUHVuY3R1YXRpb24nXShjaGFyKSkge1xuICAgICAgICBpZiAoISgoY2hhciA+PSAweDMwMDggLyogbGVmdCBhbmdsZSBicmFja2V0ICovICYmIGNoYXIgPD0gMHgzMDExKSAvKiByaWdodCBibGFjayBsZW50aWN1bGFyIGJyYWNrZXQgKi8pICYmXG4gICAgICAgICAgICAhKChjaGFyID49IDB4MzAxNCAvKiBsZWZ0IHRvcnRvaXNlIHNoZWxsIGJyYWNrZXQgKi8gJiYgY2hhciA8PSAweDMwMUYpIC8qIGxvdyBkb3VibGUgcHJpbWUgcXVvdGF0aW9uIG1hcmsgKi8pICYmXG4gICAgICAgICAgICBjaGFyICE9PSAweDMwMzAgLyogd2F2eSBkYXNoICovKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXNDaGFyWydDSksgVW5pZmllZCBJZGVvZ3JhcGhzIEV4dGVuc2lvbiBBJ10oY2hhcikpIHJldHVybiB0cnVlO1xuICAgIGlmIChpc0NoYXJbJ0NKSyBVbmlmaWVkIElkZW9ncmFwaHMnXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnRW5jbG9zZWQgQ0pLIExldHRlcnMgYW5kIE1vbnRocyddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydIYW5ndWwgQ29tcGF0aWJpbGl0eSBKYW1vJ10oY2hhcikpIHJldHVybiB0cnVlO1xuICAgIGlmIChpc0NoYXJbJ0hhbmd1bCBKYW1vIEV4dGVuZGVkLUEnXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnSGFuZ3VsIEphbW8gRXh0ZW5kZWQtQiddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydIYW5ndWwgSmFtbyddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydIYW5ndWwgU3lsbGFibGVzJ10oY2hhcikpIHJldHVybiB0cnVlO1xuICAgIGlmIChpc0NoYXJbJ0hpcmFnYW5hJ10oY2hhcikpIHJldHVybiB0cnVlO1xuICAgIGlmIChpc0NoYXJbJ0lkZW9ncmFwaGljIERlc2NyaXB0aW9uIENoYXJhY3RlcnMnXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnS2FuYnVuJ10oY2hhcikpIHJldHVybiB0cnVlO1xuICAgIGlmIChpc0NoYXJbJ0thbmd4aSBSYWRpY2FscyddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydLYXRha2FuYSBQaG9uZXRpYyBFeHRlbnNpb25zJ10oY2hhcikpIHJldHVybiB0cnVlO1xuICAgIGlmIChpc0NoYXJbJ0thdGFrYW5hJ10oY2hhcikpIHtcbiAgICAgICAgaWYgKGNoYXIgIT09IDB4MzBGQyAvKiBrYXRha2FuYS1oaXJhZ2FuYSBwcm9sb25nZWQgc291bmQgbWFyayAqLykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzQ2hhclsnSGFsZndpZHRoIGFuZCBGdWxsd2lkdGggRm9ybXMnXShjaGFyKSkge1xuICAgICAgICBpZiAoY2hhciAhPT0gMHhGRjA4IC8qIGZ1bGx3aWR0aCBsZWZ0IHBhcmVudGhlc2lzICovICYmXG4gICAgICAgICAgICBjaGFyICE9PSAweEZGMDkgLyogZnVsbHdpZHRoIHJpZ2h0IHBhcmVudGhlc2lzICovICYmXG4gICAgICAgICAgICBjaGFyICE9PSAweEZGMEQgLyogZnVsbHdpZHRoIGh5cGhlbi1taW51cyAqLyAmJlxuICAgICAgICAgICAgISgoY2hhciA+PSAweEZGMUEgLyogZnVsbHdpZHRoIGNvbG9uICovICYmIGNoYXIgPD0gMHhGRjFFKSAvKiBmdWxsd2lkdGggZ3JlYXRlci10aGFuIHNpZ24gKi8pICYmXG4gICAgICAgICAgICBjaGFyICE9PSAweEZGM0IgLyogZnVsbHdpZHRoIGxlZnQgc3F1YXJlIGJyYWNrZXQgKi8gJiZcbiAgICAgICAgICAgIGNoYXIgIT09IDB4RkYzRCAvKiBmdWxsd2lkdGggcmlnaHQgc3F1YXJlIGJyYWNrZXQgKi8gJiZcbiAgICAgICAgICAgIGNoYXIgIT09IDB4RkYzRiAvKiBmdWxsd2lkdGggbG93IGxpbmUgKi8gJiZcbiAgICAgICAgICAgICEoY2hhciA+PSAweEZGNUIgLyogZnVsbHdpZHRoIGxlZnQgY3VybHkgYnJhY2tldCAqLyAmJiBjaGFyIDw9IDB4RkZERikgJiZcbiAgICAgICAgICAgIGNoYXIgIT09IDB4RkZFMyAvKiBmdWxsd2lkdGggbWFjcm9uICovICYmXG4gICAgICAgICAgICAhKGNoYXIgPj0gMHhGRkU4IC8qIGhhbGZ3aWR0aCBmb3JtcyBsaWdodCB2ZXJ0aWNhbCAqLyAmJiBjaGFyIDw9IDB4RkZFRikpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChpc0NoYXJbJ1NtYWxsIEZvcm0gVmFyaWFudHMnXShjaGFyKSkge1xuICAgICAgICBpZiAoISgoY2hhciA+PSAweEZFNTggLyogc21hbGwgZW0gZGFzaCAqLyAmJiBjaGFyIDw9IDB4RkU1RSkgLyogc21hbGwgcmlnaHQgdG9ydG9pc2Ugc2hlbGwgYnJhY2tldCAqLykgJiZcbiAgICAgICAgICAgICEoKGNoYXIgPj0gMHhGRTYzIC8qIHNtYWxsIGh5cGhlbi1taW51cyAqLyAmJiBjaGFyIDw9IDB4RkU2NikgLyogc21hbGwgZXF1YWxzIHNpZ24gKi8pKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXNDaGFyWydVbmlmaWVkIENhbmFkaWFuIEFib3JpZ2luYWwgU3lsbGFiaWNzJ10oY2hhcikpIHJldHVybiB0cnVlO1xuICAgIGlmIChpc0NoYXJbJ1VuaWZpZWQgQ2FuYWRpYW4gQWJvcmlnaW5hbCBTeWxsYWJpY3MgRXh0ZW5kZWQnXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnVmVydGljYWwgRm9ybXMnXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnWWlqaW5nIEhleGFncmFtIFN5bWJvbHMnXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnWWkgU3lsbGFibGVzJ10oY2hhcikpIHJldHVybiB0cnVlO1xuICAgIGlmIChpc0NoYXJbJ1lpIFJhZGljYWxzJ10oY2hhcikpIHJldHVybiB0cnVlO1xuXG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gVW5pY29kZSBjb2RlcG9pbnQgaWRlbnRpZmllcyBhIGNoYXJhY3RlciB3aXRoXG4gKiBuZXV0cmFsIG9yaWVudGF0aW9uLlxuICpcbiAqIEEgY2hhcmFjdGVyIGhhcyBuZXV0cmFsIG9yaWVudGF0aW9uIGlmIGl0IG1heSBiZSBkcmF3biByb3RhdGVkIG9yIHVucm90YXRlZFxuICogd2hlbiB0aGUgbGluZSBpcyBvcmllbnRlZCB2ZXJ0aWNhbGx5LCBkZXBlbmRpbmcgb24gdGhlIG9yaWVudGF0aW9uIG9mIHRoZVxuICogYWRqYWNlbnQgY2hhcmFjdGVycy4gRm9yIGV4YW1wbGUsIGFsb25nIGEgdmVydGljbGx5IG9yaWVudGVkIGxpbmUsIHRoZSB2dWxnYXJcbiAqIGZyYWN0aW9uIMOCwr0gaXMgZHJhd24gdXByaWdodCBhbW9uZyBDaGluZXNlIGNoYXJhY3RlcnMgYnV0IHJvdGF0ZWQgYW1vbmcgTGF0aW5cbiAqIGxldHRlcnMuIEEgbmV1dHJhbGx5IG9yaWVudGVkIGNoYXJhY3RlciBkb2VzIG5vdCBpbmZsdWVuY2Ugd2hldGhlciBhblxuICogYWRqYWNlbnQgY2hhcmFjdGVyIGlzIGRyYXduIHVwcmlnaHQgb3Igcm90YXRlZC5cbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjaGFySGFzTmV1dHJhbFZlcnRpY2FsT3JpZW50YXRpb24oY2hhcjogbnVtYmVyKSB7XG4gICAgaWYgKGlzQ2hhclsnTGF0aW4tMSBTdXBwbGVtZW50J10oY2hhcikpIHtcbiAgICAgICAgaWYgKGNoYXIgPT09IDB4MDBBNyAvKiBzZWN0aW9uIHNpZ24gKi8gfHxcbiAgICAgICAgICAgIGNoYXIgPT09IDB4MDBBOSAvKiBjb3B5cmlnaHQgc2lnbiAqLyB8fFxuICAgICAgICAgICAgY2hhciA9PT0gMHgwMEFFIC8qIHJlZ2lzdGVyZWQgc2lnbiAqLyB8fFxuICAgICAgICAgICAgY2hhciA9PT0gMHgwMEIxIC8qIHBsdXMtbWludXMgc2lnbiAqLyB8fFxuICAgICAgICAgICAgY2hhciA9PT0gMHgwMEJDIC8qIHZ1bGdhciBmcmFjdGlvbiBvbmUgcXVhcnRlciAqLyB8fFxuICAgICAgICAgICAgY2hhciA9PT0gMHgwMEJEIC8qIHZ1bGdhciBmcmFjdGlvbiBvbmUgaGFsZiAqLyB8fFxuICAgICAgICAgICAgY2hhciA9PT0gMHgwMEJFIC8qIHZ1bGdhciBmcmFjdGlvbiB0aHJlZSBxdWFydGVycyAqLyB8fFxuICAgICAgICAgICAgY2hhciA9PT0gMHgwMEQ3IC8qIG11bHRpcGxpY2F0aW9uIHNpZ24gKi8gfHxcbiAgICAgICAgICAgIGNoYXIgPT09IDB4MDBGNyAvKiBkaXZpc2lvbiBzaWduICovKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXNDaGFyWydHZW5lcmFsIFB1bmN0dWF0aW9uJ10oY2hhcikpIHtcbiAgICAgICAgaWYgKGNoYXIgPT09IDB4MjAxNiAvKiBkb3VibGUgdmVydGljYWwgbGluZSAqLyB8fFxuICAgICAgICAgICAgY2hhciA9PT0gMHgyMDIwIC8qIGRhZ2dlciAqLyB8fFxuICAgICAgICAgICAgY2hhciA9PT0gMHgyMDIxIC8qIGRvdWJsZSBkYWdnZXIgKi8gfHxcbiAgICAgICAgICAgIGNoYXIgPT09IDB4MjAzMCAvKiBwZXIgbWlsbGUgc2lnbiAqLyB8fFxuICAgICAgICAgICAgY2hhciA9PT0gMHgyMDMxIC8qIHBlciB0ZW4gdGhvdXNhbmQgc2lnbiAqLyB8fFxuICAgICAgICAgICAgY2hhciA9PT0gMHgyMDNCIC8qIHJlZmVyZW5jZSBtYXJrICovIHx8XG4gICAgICAgICAgICBjaGFyID09PSAweDIwM0MgLyogZG91YmxlIGV4Y2xhbWF0aW9uIG1hcmsgKi8gfHxcbiAgICAgICAgICAgIGNoYXIgPT09IDB4MjA0MiAvKiBhc3RlcmlzbSAqLyB8fFxuICAgICAgICAgICAgY2hhciA9PT0gMHgyMDQ3IC8qIGRvdWJsZSBxdWVzdGlvbiBtYXJrICovIHx8XG4gICAgICAgICAgICBjaGFyID09PSAweDIwNDggLyogcXVlc3Rpb24gZXhjbGFtYXRpb24gbWFyayAqLyB8fFxuICAgICAgICAgICAgY2hhciA9PT0gMHgyMDQ5IC8qIGV4Y2xhbWF0aW9uIHF1ZXN0aW9uIG1hcmsgKi8gfHxcbiAgICAgICAgICAgIGNoYXIgPT09IDB4MjA1MSAvKiB0d28gYXN0ZXJpc2tzIGFsaWduZWQgdmVydGljYWxseSAqLykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzQ2hhclsnTGV0dGVybGlrZSBTeW1ib2xzJ10oY2hhcikpIHJldHVybiB0cnVlO1xuICAgIGlmIChpc0NoYXJbJ051bWJlciBGb3JtcyddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydNaXNjZWxsYW5lb3VzIFRlY2huaWNhbCddKGNoYXIpKSB7XG4gICAgICAgIGlmICgoY2hhciA+PSAweDIzMDAgLyogZGlhbWV0ZXIgc2lnbiAqLyAmJiBjaGFyIDw9IDB4MjMwNyAvKiB3YXZ5IGxpbmUgKi8pIHx8XG4gICAgICAgICAgICAoY2hhciA+PSAweDIzMEMgLyogYm90dG9tIHJpZ2h0IGNyb3AgKi8gJiYgY2hhciA8PSAweDIzMUYgLyogYm90dG9tIHJpZ2h0IGNvcm5lciAqLykgfHxcbiAgICAgICAgICAgIChjaGFyID49IDB4MjMyNCAvKiB1cCBhcnJvd2hlYWQgYmV0d2VlbiB0d28gaG9yaXpvbnRhbCBiYXJzICovICYmIGNoYXIgPD0gMHgyMzI4IC8qIGtleWJvYXJkICovKSB8fFxuICAgICAgICAgICAgY2hhciA9PT0gMHgyMzJCIC8qIGVyYXNlIHRvIHRoZSBsZWZ0ICovIHx8XG4gICAgICAgICAgICAoY2hhciA+PSAweDIzN0QgLyogc2hvdWxkZXJlZCBvcGVuIGJveCAqLyAmJiBjaGFyIDw9IDB4MjM5QSAvKiBjbGVhciBzY3JlZW4gc3ltYm9sICovKSB8fFxuICAgICAgICAgICAgKGNoYXIgPj0gMHgyM0JFIC8qIGRlbnRpc3RyeSBzeW1ib2wgbGlnaHQgdmVydGljYWwgYW5kIHRvcCByaWdodCAqLyAmJiBjaGFyIDw9IDB4MjNDRCAvKiBzcXVhcmUgZm9vdCAqLykgfHxcbiAgICAgICAgICAgIGNoYXIgPT09IDB4MjNDRiAvKiBlamVjdCBzeW1ib2wgKi8gfHxcbiAgICAgICAgICAgIChjaGFyID49IDB4MjNEMSAvKiBtZXRyaWNhbCBicmV2ZSAqLyAmJiBjaGFyIDw9IDB4MjNEQiAvKiBmdXNlICovKSB8fFxuICAgICAgICAgICAgKGNoYXIgPj0gMHgyM0UyIC8qIHdoaXRlIHRyYXBleml1bSAqLyAmJiBjaGFyIDw9IDB4MjNGRikpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChpc0NoYXJbJ0NvbnRyb2wgUGljdHVyZXMnXShjaGFyKSAmJiBjaGFyICE9PSAweDI0MjMgLyogb3BlbiBib3ggKi8pIHJldHVybiB0cnVlO1xuICAgIGlmIChpc0NoYXJbJ09wdGljYWwgQ2hhcmFjdGVyIFJlY29nbml0aW9uJ10oY2hhcikpIHJldHVybiB0cnVlO1xuICAgIGlmIChpc0NoYXJbJ0VuY2xvc2VkIEFscGhhbnVtZXJpY3MnXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnR2VvbWV0cmljIFNoYXBlcyddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydNaXNjZWxsYW5lb3VzIFN5bWJvbHMnXShjaGFyKSkge1xuICAgICAgICBpZiAoISgoY2hhciA+PSAweDI2MUEgLyogYmxhY2sgbGVmdCBwb2ludGluZyBpbmRleCAqLyAmJiBjaGFyIDw9IDB4MjYxRikgLyogd2hpdGUgZG93biBwb2ludGluZyBpbmRleCAqLykpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChpc0NoYXJbJ01pc2NlbGxhbmVvdXMgU3ltYm9scyBhbmQgQXJyb3dzJ10oY2hhcikpIHtcbiAgICAgICAgaWYgKChjaGFyID49IDB4MkIxMiAvKiBzcXVhcmUgd2l0aCB0b3AgaGFsZiBibGFjayAqLyAmJiBjaGFyIDw9IDB4MkIyRiAvKiB3aGl0ZSB2ZXJ0aWNhbCBlbGxpcHNlICovKSB8fFxuICAgICAgICAgICAgKGNoYXIgPj0gMHgyQjUwIC8qIHdoaXRlIG1lZGl1bSBzdGFyICovICYmIGNoYXIgPD0gMHgyQjU5IC8qIGhlYXZ5IGNpcmNsZWQgc2FsdGlyZSAqLykgfHxcbiAgICAgICAgICAgIChjaGFyID49IDB4MkJCOCAvKiB1cHdhcmRzIHdoaXRlIGFycm93IGZyb20gYmFyIHdpdGggaG9yaXpvbnRhbCBiYXIgKi8gJiYgY2hhciA8PSAweDJCRUIpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXNDaGFyWydDSksgU3ltYm9scyBhbmQgUHVuY3R1YXRpb24nXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnS2F0YWthbmEnXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnUHJpdmF0ZSBVc2UgQXJlYSddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydDSksgQ29tcGF0aWJpbGl0eSBGb3JtcyddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydTbWFsbCBGb3JtIFZhcmlhbnRzJ10oY2hhcikpIHJldHVybiB0cnVlO1xuICAgIGlmIChpc0NoYXJbJ0hhbGZ3aWR0aCBhbmQgRnVsbHdpZHRoIEZvcm1zJ10oY2hhcikpIHJldHVybiB0cnVlO1xuXG4gICAgaWYgKGNoYXIgPT09IDB4MjIxRSAvKiBpbmZpbml0eSAqLyB8fFxuICAgICAgICBjaGFyID09PSAweDIyMzQgLyogdGhlcmVmb3JlICovIHx8XG4gICAgICAgIGNoYXIgPT09IDB4MjIzNSAvKiBiZWNhdXNlICovIHx8XG4gICAgICAgIChjaGFyID49IDB4MjcwMCAvKiBibGFjayBzYWZldHkgc2Npc3NvcnMgKi8gJiYgY2hhciA8PSAweDI3NjcgLyogcm90YXRlZCBmbG9yYWwgaGVhcnQgYnVsbGV0ICovKSB8fFxuICAgICAgICAoY2hhciA+PSAweDI3NzYgLyogZGluZ2JhdCBuZWdhdGl2ZSBjaXJjbGVkIGRpZ2l0IG9uZSAqLyAmJiBjaGFyIDw9IDB4Mjc5MyAvKiBkaW5nYmF0IG5lZ2F0aXZlIGNpcmNsZWQgc2Fucy1zZXJpZiBudW1iZXIgdGVuICovKSB8fFxuICAgICAgICBjaGFyID09PSAweEZGRkMgLyogb2JqZWN0IHJlcGxhY2VtZW50IGNoYXJhY3RlciAqLyB8fFxuICAgICAgICBjaGFyID09PSAweEZGRkQgLyogcmVwbGFjZW1lbnQgY2hhcmFjdGVyICovKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIFVuaWNvZGUgY29kZXBvaW50IGlkZW50aWZpZXMgYSBjaGFyYWN0ZXIgd2l0aFxuICogcm90YXRlZCBvcmllbnRhdGlvbi5cbiAqXG4gKiBBIGNoYXJhY3RlciBoYXMgcm90YXRlZCBvcmllbnRhdGlvbiBpZiBpdCBpcyBkcmF3biByb3RhdGVkIHdoZW4gdGhlIGxpbmUgaXNcbiAqIG9yaWVudGVkIHZlcnRpY2FsbHksIGV2ZW4gaWYgYm90aCBhZGphY2VudCBjaGFyYWN0ZXJzIGFyZSB1cHJpZ2h0LiBGb3JcbiAqIGV4YW1wbGUsIGEgTGF0aW4gbGV0dGVyIGlzIGRyYXduIHJvdGF0ZWQgYWxvbmcgYSB2ZXJ0aWNhbCBsaW5lLiBBIHJvdGF0ZWRcbiAqIGNoYXJhY3RlciBjYXVzZXMgYW4gYWRqYWNlbnQgw6LCgMKcbmV1dHJhbMOiwoDCnSBjaGFyYWN0ZXIgdG8gYmUgZHJhd24gcm90YXRlZCBhcyB3ZWxsLlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoYXJIYXNSb3RhdGVkVmVydGljYWxPcmllbnRhdGlvbihjaGFyOiBudW1iZXIpIHtcbiAgICByZXR1cm4gIShjaGFySGFzVXByaWdodFZlcnRpY2FsT3JpZW50YXRpb24oY2hhcikgfHxcbiAgICAgICAgICAgICBjaGFySGFzTmV1dHJhbFZlcnRpY2FsT3JpZW50YXRpb24oY2hhcikpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2hhckluU3VwcG9ydGVkU2NyaXB0KGNoYXI6IG51bWJlciwgY2FuUmVuZGVyUlRMOiBib29sZWFuKSB7XG4gICAgLy8gVGhpcyBpcyBhIHJvdWdoIGhldXJpc3RpYzogd2hldGhlciB3ZSBcImNhbiByZW5kZXJcIiBhIHNjcmlwdFxuICAgIC8vIGFjdHVhbGx5IGRlcGVuZHMgb24gdGhlIHByb3BlcnRpZXMgb2YgdGhlIGZvbnQgYmVpbmcgdXNlZFxuICAgIC8vIGFuZCB3aGV0aGVyIGRpZmZlcmVuY2VzIGZyb20gdGhlIGlkZWFsIHJlbmRlcmluZyBhcmUgY29uc2lkZXJlZFxuICAgIC8vIHNlbWFudGljYWxseSBzaWduaWZpY2FudC5cblxuICAgIC8vIEV2ZW4gaW4gTGF0aW4gc2NyaXB0LCB3ZSBcImNhbid0IHJlbmRlclwiIGNvbWJpbmF0aW9ucyBzdWNoIGFzIHRoZSBmaVxuICAgIC8vIGxpZ2F0dXJlLCBidXQgd2UgZG9uJ3QgY29uc2lkZXIgdGhhdCBzZW1hbnRpY2FsbHkgc2lnbmlmaWNhbnQuXG4gICAgaWYgKCFjYW5SZW5kZXJSVEwgJiZcbiAgICAgICAgKChjaGFyID49IDB4MDU5MCAmJiBjaGFyIDw9IDB4MDhGRikgfHxcbiAgICAgICAgIGlzQ2hhclsnQXJhYmljIFByZXNlbnRhdGlvbiBGb3Jtcy1BJ10oY2hhcikgfHxcbiAgICAgICAgIGlzQ2hhclsnQXJhYmljIFByZXNlbnRhdGlvbiBGb3Jtcy1CJ10oY2hhcikpKSB7XG4gICAgICAgIC8vIE1haW4gYmxvY2tzIGZvciBIZWJyZXcsIEFyYWJpYywgVGhhYW5hIGFuZCBvdGhlciBSVEwgc2NyaXB0c1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICgoY2hhciA+PSAweDA5MDAgJiYgY2hhciA8PSAweDBERkYpIHx8XG4gICAgICAgIC8vIE1haW4gYmxvY2tzIGZvciBJbmRpYyBzY3JpcHRzIGFuZCBTaW5oYWxhXG4gICAgICAgIChjaGFyID49IDB4MEYwMCAmJiBjaGFyIDw9IDB4MTA5RikgfHxcbiAgICAgICAgLy8gTWFpbiBibG9ja3MgZm9yIFRpYmV0YW4gYW5kIE15YW5tYXJcbiAgICAgICAgaXNDaGFyWydLaG1lciddKGNoYXIpKSB7XG4gICAgICAgIC8vIFRoZXNlIGJsb2NrcyBjb3ZlciBjb21tb24gc2NyaXB0cyB0aGF0IHJlcXVpcmVcbiAgICAgICAgLy8gY29tcGxleCB0ZXh0IHNoYXBpbmcsIGJhc2VkIG9uIHVuaWNvZGUgc2NyaXB0IG1ldGFkYXRhOlxuICAgICAgICAvLyBodHRwOi8vd3d3LnVuaWNvZGUub3JnL3JlcG9zL2NsZHIvdHJ1bmsvY29tbW9uL3Byb3BlcnRpZXMvc2NyaXB0TWV0YWRhdGEudHh0XG4gICAgICAgIC8vIHdoZXJlIFwiV2ViIFJhbmsgPD0gMzJcIiBcIlNoYXBpbmcgUmVxdWlyZWQgPSBZRVNcIlxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNTdHJpbmdJblN1cHBvcnRlZFNjcmlwdChjaGFyczogc3RyaW5nLCBjYW5SZW5kZXJSVEw6IGJvb2xlYW4pIHtcbiAgICBmb3IgKGNvbnN0IGNoYXIgb2YgY2hhcnMpIHtcbiAgICAgICAgaWYgKCFjaGFySW5TdXBwb3J0ZWRTY3JpcHQoY2hhci5jaGFyQ29kZUF0KDApLCBjYW5SZW5kZXJSVEwpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgeyBFdmVudCwgRXZlbnRlZCB9IGZyb20gJy4uL3V0aWwvZXZlbnRlZCc7XG5pbXBvcnQgYnJvd3NlciBmcm9tICcuLi91dGlsL2Jyb3dzZXInO1xuXG5sZXQgcGx1Z2luUmVxdWVzdGVkID0gZmFsc2U7XG5sZXQgcGx1Z2luVVJMID0gbnVsbDtcbmxldCBmb3JlZ3JvdW5kTG9hZENvbXBsZXRlID0gZmFsc2U7XG5cbmV4cG9ydCBjb25zdCBldmVudGVkID0gbmV3IEV2ZW50ZWQoKTtcblxudHlwZSBDb21wbGV0aW9uQ2FsbGJhY2sgPSAoZXJyb3I/OiBFcnJvcikgPT4gdm9pZDtcbnR5cGUgRXJyb3JDYWxsYmFjayA9IChlcnJvcjogRXJyb3IpID0+IHZvaWQ7XG5cbmxldCBfY29tcGxldGlvbkNhbGxiYWNrO1xuXG5leHBvcnQgY29uc3QgcmVnaXN0ZXJGb3JQbHVnaW5BdmFpbGFiaWxpdHkgPSBmdW5jdGlvbihcbiAgICBjYWxsYmFjazogKGFyZ3M6IHtwbHVnaW5VUkw6IHN0cmluZywgY29tcGxldGlvbkNhbGxiYWNrOiBDb21wbGV0aW9uQ2FsbGJhY2t9KSA9PiB2b2lkXG4pIHtcbiAgICBpZiAocGx1Z2luVVJMKSB7XG4gICAgICAgIGNhbGxiYWNrKHsgcGx1Z2luVVJMLCBjb21wbGV0aW9uQ2FsbGJhY2s6IF9jb21wbGV0aW9uQ2FsbGJhY2t9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBldmVudGVkLm9uY2UoJ3BsdWdpbkF2YWlsYWJsZScsIGNhbGxiYWNrKTtcbiAgICB9XG4gICAgcmV0dXJuIGNhbGxiYWNrO1xufTtcblxuZXhwb3J0IGNvbnN0IGNsZWFyUlRMVGV4dFBsdWdpbiA9IGZ1bmN0aW9uKCkge1xuICAgIHBsdWdpblJlcXVlc3RlZCA9IGZhbHNlO1xuICAgIHBsdWdpblVSTCA9IG51bGw7XG59O1xuXG5leHBvcnQgY29uc3Qgc2V0UlRMVGV4dFBsdWdpbiA9IGZ1bmN0aW9uKHVybDogc3RyaW5nLCBjYWxsYmFjazogRXJyb3JDYWxsYmFjaykge1xuICAgIGlmIChwbHVnaW5SZXF1ZXN0ZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzZXRSVExUZXh0UGx1Z2luIGNhbm5vdCBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMuJyk7XG4gICAgfVxuICAgIHBsdWdpblJlcXVlc3RlZCA9IHRydWU7XG4gICAgcGx1Z2luVVJMID0gYnJvd3Nlci5yZXNvbHZlVVJMKHVybCk7XG4gICAgX2NvbXBsZXRpb25DYWxsYmFjayA9IChlcnJvcj86IEVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgLy8gQ2xlYXIgbG9hZGVkIHN0YXRlIHRvIGFsbG93IHJldHJpZXNcbiAgICAgICAgICAgIGNsZWFyUlRMVGV4dFBsdWdpbigpO1xuICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gQ2FsbGVkIG9uY2UgZm9yIGVhY2ggd29ya2VyXG4gICAgICAgICAgICBmb3JlZ3JvdW5kTG9hZENvbXBsZXRlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgZXZlbnRlZC5maXJlKG5ldyBFdmVudCgncGx1Z2luQXZhaWxhYmxlJywgeyBwbHVnaW5VUkwsIGNvbXBsZXRpb25DYWxsYmFjazogX2NvbXBsZXRpb25DYWxsYmFjayB9KSk7XG59O1xuXG5leHBvcnQgY29uc3QgcGx1Z2luOiB7XG4gICAgYXBwbHlBcmFiaWNTaGFwaW5nOiA/RnVuY3Rpb24sXG4gICAgcHJvY2Vzc0JpZGlyZWN0aW9uYWxUZXh0OiA/KHN0cmluZywgQXJyYXk8bnVtYmVyPikgPT4gQXJyYXk8c3RyaW5nPixcbiAgICBwcm9jZXNzU3R5bGVkQmlkaXJlY3Rpb25hbFRleHQ6ID8oc3RyaW5nLCBBcnJheTxudW1iZXI+LCBBcnJheTxudW1iZXI+KSA9PiBBcnJheTxbc3RyaW5nLCBBcnJheTxudW1iZXI+XT4sXG4gICAgaXNMb2FkZWQ6ICgpID0+IGJvb2xlYW5cbn0gPSB7XG4gICAgYXBwbHlBcmFiaWNTaGFwaW5nOiBudWxsLFxuICAgIHByb2Nlc3NCaWRpcmVjdGlvbmFsVGV4dDogbnVsbCxcbiAgICBwcm9jZXNzU3R5bGVkQmlkaXJlY3Rpb25hbFRleHQ6IG51bGwsXG4gICAgaXNMb2FkZWQoKSB7XG4gICAgICAgIHJldHVybiBmb3JlZ3JvdW5kTG9hZENvbXBsZXRlIHx8ICAgICAgIC8vIEZvcmVncm91bmQ6IGxvYWRlZCBpZiB0aGUgY29tcGxldGlvbiBjYWxsYmFjayByZXR1cm5lZCBzdWNjZXNzZnVsbHlcbiAgICAgICAgICAgIHBsdWdpbi5hcHBseUFyYWJpY1NoYXBpbmcgIT0gbnVsbDsgLy8gQmFja2dyb3VuZDogbG9hZGVkIGlmIHRoZSBwbHVnaW4gZnVuY3Rpb25zIGhhdmUgYmVlbiBjb21waWxlZFxuICAgIH1cbn07XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgWm9vbUhpc3RvcnkgZnJvbSAnLi96b29tX2hpc3RvcnknO1xuaW1wb3J0IHtpc1N0cmluZ0luU3VwcG9ydGVkU2NyaXB0fSBmcm9tICcuLi91dGlsL3NjcmlwdF9kZXRlY3Rpb24nO1xuaW1wb3J0IHtwbHVnaW4gYXMgcnRsVGV4dFBsdWdpbn0gZnJvbSAnLi4vc291cmNlL3J0bF90ZXh0X3BsdWdpbic7XG5cbmltcG9ydCB0eXBlIHtUcmFuc2l0aW9uU3BlY2lmaWNhdGlvbn0gZnJvbSAnLi4vc3R5bGUtc3BlYy90eXBlcyc7XG5cbmV4cG9ydCB0eXBlIENyb3NzZmFkZVBhcmFtZXRlcnMgPSB7XG4gICAgZnJvbVNjYWxlOiBudW1iZXIsXG4gICAgdG9TY2FsZTogbnVtYmVyLFxuICAgIHQ6IG51bWJlclxufTtcblxuY2xhc3MgRXZhbHVhdGlvblBhcmFtZXRlcnMge1xuICAgIHpvb206IG51bWJlcjtcbiAgICBub3c6IG51bWJlcjtcbiAgICBmYWRlRHVyYXRpb246IG51bWJlcjtcbiAgICB6b29tSGlzdG9yeTogWm9vbUhpc3Rvcnk7XG4gICAgdHJhbnNpdGlvbjogVHJhbnNpdGlvblNwZWNpZmljYXRpb247XG5cbiAgICAvLyBcIm9wdGlvbnNcIiBtYXkgYWxzbyBiZSBhbm90aGVyIEV2YWx1YXRpb25QYXJhbWV0ZXJzIHRvIGNvcHksIHNlZSBDcm9zc0ZhZGVkUHJvcGVydHkucG9zc2libHlFdmFsdWF0ZVxuICAgIGNvbnN0cnVjdG9yKHpvb206IG51bWJlciwgb3B0aW9ucz86ICopIHtcbiAgICAgICAgdGhpcy56b29tID0gem9vbTtcblxuICAgICAgICBpZiAob3B0aW9ucykge1xuICAgICAgICAgICAgdGhpcy5ub3cgPSBvcHRpb25zLm5vdztcbiAgICAgICAgICAgIHRoaXMuZmFkZUR1cmF0aW9uID0gb3B0aW9ucy5mYWRlRHVyYXRpb247XG4gICAgICAgICAgICB0aGlzLnpvb21IaXN0b3J5ID0gb3B0aW9ucy56b29tSGlzdG9yeTtcbiAgICAgICAgICAgIHRoaXMudHJhbnNpdGlvbiA9IG9wdGlvbnMudHJhbnNpdGlvbjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubm93ID0gMDtcbiAgICAgICAgICAgIHRoaXMuZmFkZUR1cmF0aW9uID0gMDtcbiAgICAgICAgICAgIHRoaXMuem9vbUhpc3RvcnkgPSBuZXcgWm9vbUhpc3RvcnkoKTtcbiAgICAgICAgICAgIHRoaXMudHJhbnNpdGlvbiA9IHt9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaXNTdXBwb3J0ZWRTY3JpcHQoc3RyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGlzU3RyaW5nSW5TdXBwb3J0ZWRTY3JpcHQoc3RyLCBydGxUZXh0UGx1Z2luLmlzTG9hZGVkKCkpO1xuICAgIH1cblxuICAgIGNyb3NzRmFkaW5nRmFjdG9yKCkge1xuICAgICAgICBpZiAodGhpcy5mYWRlRHVyYXRpb24gPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIE1hdGgubWluKCh0aGlzLm5vdyAtIHRoaXMuem9vbUhpc3RvcnkubGFzdEludGVnZXJab29tVGltZSkgLyB0aGlzLmZhZGVEdXJhdGlvbiwgMSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRDcm9zc2ZhZGVQYXJhbWV0ZXJzKCk6IENyb3NzZmFkZVBhcmFtZXRlcnMge1xuICAgICAgICBjb25zdCB6ID0gdGhpcy56b29tO1xuICAgICAgICBjb25zdCBmcmFjdGlvbiA9IHogLSBNYXRoLmZsb29yKHopO1xuICAgICAgICBjb25zdCB0ID0gdGhpcy5jcm9zc0ZhZGluZ0ZhY3RvcigpO1xuXG4gICAgICAgIHJldHVybiB6ID4gdGhpcy56b29tSGlzdG9yeS5sYXN0SW50ZWdlclpvb20gP1xuICAgICAgICAgICAgeyBmcm9tU2NhbGU6IDIsIHRvU2NhbGU6IDEsIHQ6IGZyYWN0aW9uICsgKDEgLSBmcmFjdGlvbikgKiB0IH0gOlxuICAgICAgICAgICAgeyBmcm9tU2NhbGU6IDAuNSwgdG9TY2FsZTogMSwgdDogMSAtICgxIC0gdCkgKiBmcmFjdGlvbiB9O1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgRXZhbHVhdGlvblBhcmFtZXRlcnM7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5cbmltcG9ydCB7IGNsb25lLCBleHRlbmQsIGVhc2VDdWJpY0luT3V0IH0gZnJvbSAnLi4vdXRpbC91dGlsJztcbmltcG9ydCAqIGFzIGludGVycG9sYXRlIGZyb20gJy4uL3N0eWxlLXNwZWMvdXRpbC9pbnRlcnBvbGF0ZSc7XG5pbXBvcnQgeyBub3JtYWxpemVQcm9wZXJ0eUV4cHJlc3Npb24gfSBmcm9tICcuLi9zdHlsZS1zcGVjL2V4cHJlc3Npb24nO1xuaW1wb3J0IENvbG9yIGZyb20gJy4uL3N0eWxlLXNwZWMvdXRpbC9jb2xvcic7XG5pbXBvcnQgeyByZWdpc3RlciB9IGZyb20gJy4uL3V0aWwvd2ViX3dvcmtlcl90cmFuc2Zlcic7XG5pbXBvcnQgRXZhbHVhdGlvblBhcmFtZXRlcnMgZnJvbSAnLi9ldmFsdWF0aW9uX3BhcmFtZXRlcnMnO1xuXG5pbXBvcnQgdHlwZSB7U3R5bGVQcm9wZXJ0eVNwZWNpZmljYXRpb259IGZyb20gJy4uL3N0eWxlLXNwZWMvc3R5bGUtc3BlYyc7XG5pbXBvcnQgdHlwZSB7XG4gICAgVHJhbnNpdGlvblNwZWNpZmljYXRpb24sXG4gICAgUHJvcGVydHlWYWx1ZVNwZWNpZmljYXRpb25cbn0gZnJvbSAnLi4vc3R5bGUtc3BlYy90eXBlcyc7XG5cbmltcG9ydCB0eXBlIHtcbiAgICBGZWF0dXJlLFxuICAgIEZlYXR1cmVTdGF0ZSxcbiAgICBTdHlsZVByb3BlcnR5RXhwcmVzc2lvbixcbiAgICBTb3VyY2VFeHByZXNzaW9uLFxuICAgIENvbXBvc2l0ZUV4cHJlc3Npb25cbn0gZnJvbSAnLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uJztcblxudHlwZSBUaW1lUG9pbnQgPSBudW1iZXI7XG5cbmV4cG9ydCB0eXBlIENyb3NzRmFkZWQ8VD4gPSB7XG4gICAgdG86IFQsXG4gICAgZnJvbTogVFxufTtcblxuLyoqXG4gKiBJbXBsZW1lbnRzIGEgbnVtYmVyIG9mIGNsYXNzZXMgdGhhdCBkZWZpbmUgc3RhdGUgYW5kIGJlaGF2aW9yIGZvciBwYWludCBhbmQgbGF5b3V0IHByb3BlcnRpZXMsIG1vc3RcbiAqIGltcG9ydGFudGx5IHRoZWlyIHJlc3BlY3RpdmUgZXZhbHVhdGlvbiBjaGFpbnM6XG4gKlxuICogICAgICAgVHJhbnNpdGlvbmFibGUgcGFpbnQgcHJvcGVydHkgdmFsdWVcbiAqICAgICDDosKGwpIgVHJhbnNpdGlvbmluZyBwYWludCBwcm9wZXJ0eSB2YWx1ZVxuICogICAgIMOiwobCkiBQb3NzaWJseSBldmFsdWF0ZWQgcGFpbnQgcHJvcGVydHkgdmFsdWVcbiAqICAgICDDosKGwpIgRnVsbHkgZXZhbHVhdGVkIHBhaW50IHByb3BlcnR5IHZhbHVlXG4gKlxuICogICAgICAgTGF5b3V0IHByb3BlcnR5IHZhbHVlXG4gKiAgICAgw6LChsKSIFBvc3NpYmx5IGV2YWx1YXRlZCBsYXlvdXQgcHJvcGVydHkgdmFsdWVcbiAqICAgICDDosKGwpIgRnVsbHkgZXZhbHVhdGVkIGxheW91dCBwcm9wZXJ0eSB2YWx1ZVxuICpcbiAqIEBtb2R1bGVcbiAqIEBwcml2YXRlXG4gKi9cblxuLyoqXG4gKiAgSW1wbGVtZW50YXRpb25zIG9mIHRoZSBgUHJvcGVydHlgIGludGVyZmFjZTpcbiAqXG4gKiAgKiBIb2xkIG1ldGFkYXRhIGFib3V0IGEgcHJvcGVydHkgdGhhdCdzIGluZGVwZW5kZW50IG9mIGFueSBzcGVjaWZpYyB2YWx1ZTogc3R1ZmYgbGlrZSB0aGUgdHlwZSBvZiB0aGUgdmFsdWUsXG4gKiAgICB0aGUgZGVmYXVsdCB2YWx1ZSwgZXRjLiBUaGlzIGNvbWVzIGZyb20gdGhlIHN0eWxlIHNwZWNpZmljYXRpb24gSlNPTi5cbiAqICAqIERlZmluZSBiZWhhdmlvciB0aGF0IG5lZWRzIHRvIGJlIHBvbHltb3JwaGljIGFjcm9zcyBkaWZmZXJlbnQgcHJvcGVydGllczogXCJwb3NzaWJseSBldmFsdWF0aW5nXCJcbiAqICAgIGFuIGlucHV0IHZhbHVlIChzZWUgYmVsb3cpLCBhbmQgaW50ZXJwb2xhdGluZyBiZXR3ZWVuIHR3byBwb3NzaWJseS1ldmFsdXRlZCB2YWx1ZXMuXG4gKlxuICogIFRoZSB0eXBlIGBUYCBpcyB0aGUgZnVsbHktZXZhbHVhdGVkIHZhbHVlIHR5cGUgKGUuZy4gYG51bWJlcmAsIGBzdHJpbmdgLCBgQ29sb3JgKS5cbiAqICBUaGUgdHlwZSBgUmAgaXMgdGhlIGludGVybWVkaWF0ZSBcInBvc3NpYmx5IGV2YWx1YXRlZFwiIHZhbHVlIHR5cGUuIFNlZSBiZWxvdy5cbiAqXG4gKiAgVGhlcmUgYXJlIHR3byBtYWluIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgaW50ZXJmYWNlIC0tIG9uZSBmb3IgcHJvcGVydGllcyB0aGF0IGFsbG93IGRhdGEtZHJpdmVuIHZhbHVlcyxcbiAqICBhbmQgb25lIGZvciBwcm9wZXJ0aWVzIHRoYXQgZG9uJ3QuIFRoZXJlIGFyZSBhIGZldyBcInNwZWNpYWwgY2FzZVwiIGltcGxlbWVudGF0aW9ucyBhcyB3ZWxsOiBvbmUgZm9yIHByb3BlcnRpZXNcbiAqICB3aGljaCBjcm9zcy1mYWRlIGJldHdlZW4gdHdvIHZhbHVlcyByYXRoZXIgdGhhbiBpbnRlcnBvbGF0aW5nLCBvbmUgZm9yIGBoZWF0bWFwLWNvbG9yYCBhbmQgYGxpbmUtZ3JhZGllbnRgLFxuICogIGFuZCBvbmUgZm9yIGBsaWdodC1wb3NpdGlvbmAuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9wZXJ0eTxULCBSPiB7XG4gICAgc3BlY2lmaWNhdGlvbjogU3R5bGVQcm9wZXJ0eVNwZWNpZmljYXRpb247XG4gICAgcG9zc2libHlFdmFsdWF0ZSh2YWx1ZTogUHJvcGVydHlWYWx1ZTxULCBSPiwgcGFyYW1ldGVyczogRXZhbHVhdGlvblBhcmFtZXRlcnMpOiBSO1xuICAgIGludGVycG9sYXRlKGE6IFIsIGI6IFIsIHQ6IG51bWJlcik6IFI7XG59XG5cbi8qKlxuICogIGBQcm9wZXJ0eVZhbHVlYCByZXByZXNlbnRzIHRoZSB2YWx1ZSBwYXJ0IG9mIGEgcHJvcGVydHkga2V5LXZhbHVlIHVuaXQuIEl0J3MgdXNlZCB0byByZXByZXNlbnQgYm90aFxuICogIHBhaW50IGFuZCBsYXlvdXQgcHJvcGVydHkgdmFsdWVzLCBhbmQgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIG9yIG5vdCB0aGVpciBwcm9wZXJ0eSBzdXBwb3J0cyBkYXRhLWRyaXZlblxuICogIGV4cHJlc3Npb25zLlxuICpcbiAqICBgUHJvcGVydHlWYWx1ZWAgc3RvcmVzIHRoZSByYXcgaW5wdXQgdmFsdWUgYXMgc2VlbiBpbiBhIHN0eWxlIG9yIGEgcnVudGltZSBzdHlsaW5nIEFQSSBjYWxsLCBpLmUuIG9uZSBvZiB0aGVcbiAqICBmb2xsb3dpbmc6XG4gKlxuICogICAgKiBBIGNvbnN0YW50IHZhbHVlIG9mIHRoZSB0eXBlIGFwcHJvcHJpYXRlIGZvciB0aGUgcHJvcGVydHlcbiAqICAgICogQSBmdW5jdGlvbiB3aGljaCBwcm9kdWNlcyBhIHZhbHVlIG9mIHRoYXQgdHlwZSAoYnV0IGZ1bmN0aW9ucyBhcmUgcXVhc2ktZGVwcmVjYXRlZCBpbiBmYXZvciBvZiBleHByZXNzaW9ucylcbiAqICAgICogQW4gZXhwcmVzc2lvbiB3aGljaCBwcm9kdWNlcyBhIHZhbHVlIG9mIHRoYXQgdHlwZVxuICogICAgKiBcInVuZGVmaW5lZFwiL1wibm90IHByZXNlbnRcIiwgaW4gd2hpY2ggY2FzZSB0aGUgcHJvcGVydHkgaXMgYXNzdW1lZCB0byB0YWtlIG9uIGl0cyBkZWZhdWx0IHZhbHVlLlxuICpcbiAqICBJbiBhZGRpdGlvbiB0byBzdG9yaW5nIHRoZSBvcmlnaW5hbCBpbnB1dCB2YWx1ZSwgYFByb3BlcnR5VmFsdWVgIGFsc28gc3RvcmVzIGEgbm9ybWFsaXplZCByZXByZXNlbnRhdGlvbixcbiAqICBlZmZlY3RpdmVseSB0cmVhdGluZyBmdW5jdGlvbnMgYXMgaWYgdGhleSBhcmUgZXhwcmVzc2lvbnMsIGFuZCBjb25zdGFudCBvciBkZWZhdWx0IHZhbHVlcyBhcyBpZiB0aGV5IGFyZVxuICogIChjb25zdGFudCkgZXhwcmVzc2lvbnMuXG4gKlxuICogIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBjbGFzcyBQcm9wZXJ0eVZhbHVlPFQsIFI+IHtcbiAgICBwcm9wZXJ0eTogUHJvcGVydHk8VCwgUj47XG4gICAgdmFsdWU6IFByb3BlcnR5VmFsdWVTcGVjaWZpY2F0aW9uPFQ+IHwgdm9pZDtcbiAgICBleHByZXNzaW9uOiBTdHlsZVByb3BlcnR5RXhwcmVzc2lvbjtcblxuICAgIGNvbnN0cnVjdG9yKHByb3BlcnR5OiBQcm9wZXJ0eTxULCBSPiwgdmFsdWU6IFByb3BlcnR5VmFsdWVTcGVjaWZpY2F0aW9uPFQ+IHwgdm9pZCkge1xuICAgICAgICB0aGlzLnByb3BlcnR5ID0gcHJvcGVydHk7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5leHByZXNzaW9uID0gbm9ybWFsaXplUHJvcGVydHlFeHByZXNzaW9uKHZhbHVlID09PSB1bmRlZmluZWQgPyBwcm9wZXJ0eS5zcGVjaWZpY2F0aW9uLmRlZmF1bHQgOiB2YWx1ZSwgcHJvcGVydHkuc3BlY2lmaWNhdGlvbik7XG4gICAgfVxuXG4gICAgaXNEYXRhRHJpdmVuKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5leHByZXNzaW9uLmtpbmQgPT09ICdzb3VyY2UnIHx8IHRoaXMuZXhwcmVzc2lvbi5raW5kID09PSAnY29tcG9zaXRlJztcbiAgICB9XG5cbiAgICBwb3NzaWJseUV2YWx1YXRlKHBhcmFtZXRlcnM6IEV2YWx1YXRpb25QYXJhbWV0ZXJzKTogUiB7XG4gICAgICAgIHJldHVybiB0aGlzLnByb3BlcnR5LnBvc3NpYmx5RXZhbHVhdGUodGhpcywgcGFyYW1ldGVycyk7XG4gICAgfVxufVxuXG4vLyAtLS0tLS0tIFRyYW5zaXRpb25hYmxlIC0tLS0tLS1cblxuZXhwb3J0IHR5cGUgVHJhbnNpdGlvblBhcmFtZXRlcnMgPSB7XG4gICAgbm93OiBUaW1lUG9pbnQsXG4gICAgdHJhbnNpdGlvbjogVHJhbnNpdGlvblNwZWNpZmljYXRpb25cbn07XG5cbi8qKlxuICogUGFpbnQgcHJvcGVydGllcyBhcmUgX3RyYW5zaXRpb25hYmxlXzogdGhleSBjYW4gY2hhbmdlIGluIGEgZmx1aWQgbWFubmVyLCBpbnRlcnBvbGF0aW5nIG9yIGNyb3NzLWZhZGluZyBiZXR3ZWVuXG4gKiBvbGQgYW5kIG5ldyB2YWx1ZS4gVGhlIGR1cmF0aW9uIG9mIHRoZSB0cmFuc2l0aW9uLCBhbmQgdGhlIGRlbGF5IGJlZm9yZSBpdCBiZWdpbnMsIGlzIGNvbmZpZ3VyYWJsZS5cbiAqXG4gKiBgVHJhbnNpdGlvbmFibGVQcm9wZXJ0eVZhbHVlYCBpcyBhIGNvbXBvc2l0aW9uYWwgY2xhc3MgdGhhdCBzdG9yZXMgYm90aCB0aGUgcHJvcGVydHkgdmFsdWUgYW5kIHRoYXQgdHJhbnNpdGlvblxuICogY29uZmlndXJhdGlvbi5cbiAqXG4gKiBBIGBUcmFuc2l0aW9uYWJsZVByb3BlcnR5VmFsdWVgIGNhbiBjYWxjdWxhdGUgdGhlIG5leHQgc3RlcCBpbiB0aGUgZXZhbHVhdGlvbiBjaGFpbiBmb3IgcGFpbnQgcHJvcGVydHkgdmFsdWVzOlxuICogYFRyYW5zaXRpb25pbmdQcm9wZXJ0eVZhbHVlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBUcmFuc2l0aW9uYWJsZVByb3BlcnR5VmFsdWU8VCwgUj4ge1xuICAgIHByb3BlcnR5OiBQcm9wZXJ0eTxULCBSPjtcbiAgICB2YWx1ZTogUHJvcGVydHlWYWx1ZTxULCBSPjtcbiAgICB0cmFuc2l0aW9uOiBUcmFuc2l0aW9uU3BlY2lmaWNhdGlvbiB8IHZvaWQ7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm9wZXJ0eTogUHJvcGVydHk8VCwgUj4pIHtcbiAgICAgICAgdGhpcy5wcm9wZXJ0eSA9IHByb3BlcnR5O1xuICAgICAgICB0aGlzLnZhbHVlID0gbmV3IFByb3BlcnR5VmFsdWUocHJvcGVydHksIHVuZGVmaW5lZCk7XG4gICAgfVxuXG4gICAgdHJhbnNpdGlvbmVkKHBhcmFtZXRlcnM6IFRyYW5zaXRpb25QYXJhbWV0ZXJzLFxuICAgICAgICAgICAgICAgICBwcmlvcjogVHJhbnNpdGlvbmluZ1Byb3BlcnR5VmFsdWU8VCwgUj4pOiBUcmFuc2l0aW9uaW5nUHJvcGVydHlWYWx1ZTxULCBSPiB7XG4gICAgICAgIHJldHVybiBuZXcgVHJhbnNpdGlvbmluZ1Byb3BlcnR5VmFsdWUodGhpcy5wcm9wZXJ0eSwgdGhpcy52YWx1ZSwgcHJpb3IsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmVcbiAgICAgICAgICAgIGV4dGVuZCh7fSwgcGFyYW1ldGVycy50cmFuc2l0aW9uLCB0aGlzLnRyYW5zaXRpb24pLCBwYXJhbWV0ZXJzLm5vdyk7XG4gICAgfVxuXG4gICAgdW50cmFuc2l0aW9uZWQoKTogVHJhbnNpdGlvbmluZ1Byb3BlcnR5VmFsdWU8VCwgUj4ge1xuICAgICAgICByZXR1cm4gbmV3IFRyYW5zaXRpb25pbmdQcm9wZXJ0eVZhbHVlKHRoaXMucHJvcGVydHksIHRoaXMudmFsdWUsIG51bGwsIHt9LCAwKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZVxuICAgIH1cbn1cblxuLyoqXG4gKiBBIGhlbHBlciB0eXBlOiBnaXZlbiBhbiBvYmplY3QgdHlwZSBgUHJvcGVydGllc2Agd2hvc2UgdmFsdWVzIGFyZSBlYWNoIG9mIHR5cGUgYFByb3BlcnR5PFQsIFI+YCwgaXQgY2FsY3VsYXRlc1xuICogYW4gb2JqZWN0IHR5cGUgd2l0aCB0aGUgc2FtZSBrZXlzIGFuZCB2YWx1ZXMgb2YgdHlwZSBgVHJhbnNpdGlvbmFibGVQcm9wZXJ0eVZhbHVlPFQsIFI+YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG50eXBlIFRyYW5zaXRpb25hYmxlUHJvcGVydHlWYWx1ZXM8UHJvcHM6IE9iamVjdD5cbiAgICA9ICRFeGFjdDwkT2JqTWFwPFByb3BzLCA8VCwgUj4ocDogUHJvcGVydHk8VCwgUj4pID0+IFRyYW5zaXRpb25hYmxlUHJvcGVydHlWYWx1ZTxULCBSPj4+XG5cbi8qKlxuICogYFRyYW5zaXRpb25hYmxlYCBzdG9yZXMgYSBtYXAgb2YgYWxsIChwcm9wZXJ0eSBuYW1lLCBgVHJhbnNpdGlvbmFibGVQcm9wZXJ0eVZhbHVlYCkgcGFpcnMgZm9yIHBhaW50IHByb3BlcnRpZXMgb2YgYVxuICogZ2l2ZW4gbGF5ZXIgdHlwZS4gSXQgY2FuIGNhbGN1bGF0ZSB0aGUgYFRyYW5zaXRpb25pbmdQcm9wZXJ0eVZhbHVlYHMgZm9yIGFsbCBvZiB0aGVtIGF0IG9uY2UsIHByb2R1Y2luZyBhXG4gKiBgVHJhbnNpdGlvbmluZ2AgaW5zdGFuY2UgZm9yIHRoZSBzYW1lIHNldCBvZiBwcm9wZXJ0aWVzLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBjbGFzcyBUcmFuc2l0aW9uYWJsZTxQcm9wczogT2JqZWN0PiB7XG4gICAgX3Byb3BlcnRpZXM6IFByb3BlcnRpZXM8UHJvcHM+O1xuICAgIF92YWx1ZXM6IFRyYW5zaXRpb25hYmxlUHJvcGVydHlWYWx1ZXM8UHJvcHM+O1xuXG4gICAgY29uc3RydWN0b3IocHJvcGVydGllczogUHJvcGVydGllczxQcm9wcz4pIHtcbiAgICAgICAgdGhpcy5fcHJvcGVydGllcyA9IHByb3BlcnRpZXM7XG4gICAgICAgIHRoaXMuX3ZhbHVlcyA9IChPYmplY3QuY3JlYXRlKHByb3BlcnRpZXMuZGVmYXVsdFRyYW5zaXRpb25hYmxlUHJvcGVydHlWYWx1ZXMpOiBhbnkpO1xuICAgIH1cblxuICAgIGdldFZhbHVlPFM6IHN0cmluZywgVD4obmFtZTogUyk6IFByb3BlcnR5VmFsdWVTcGVjaWZpY2F0aW9uPFQ+IHwgdm9pZCB7XG4gICAgICAgIHJldHVybiBjbG9uZSh0aGlzLl92YWx1ZXNbbmFtZV0udmFsdWUudmFsdWUpO1xuICAgIH1cblxuICAgIHNldFZhbHVlPFM6IHN0cmluZywgVD4obmFtZTogUywgdmFsdWU6IFByb3BlcnR5VmFsdWVTcGVjaWZpY2F0aW9uPFQ+IHwgdm9pZCkge1xuICAgICAgICBpZiAoIXRoaXMuX3ZhbHVlcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuICAgICAgICAgICAgdGhpcy5fdmFsdWVzW25hbWVdID0gbmV3IFRyYW5zaXRpb25hYmxlUHJvcGVydHlWYWx1ZSh0aGlzLl92YWx1ZXNbbmFtZV0ucHJvcGVydHkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIE5vdGUgdGhhdCB3ZSBkbyBub3QgX3JlbW92ZV8gYW4gb3duIHByb3BlcnR5IGluIHRoZSBjYXNlIHdoZXJlIGEgdmFsdWUgaXMgYmVpbmcgcmVzZXRcbiAgICAgICAgLy8gdG8gdGhlIGRlZmF1bHQ6IHRoZSB0cmFuc2l0aW9uIG1pZ2h0IHN0aWxsIGJlIG5vbi1kZWZhdWx0LlxuICAgICAgICB0aGlzLl92YWx1ZXNbbmFtZV0udmFsdWUgPSBuZXcgUHJvcGVydHlWYWx1ZSh0aGlzLl92YWx1ZXNbbmFtZV0ucHJvcGVydHksIHZhbHVlID09PSBudWxsID8gdW5kZWZpbmVkIDogY2xvbmUodmFsdWUpKTtcbiAgICB9XG5cbiAgICBnZXRUcmFuc2l0aW9uPFM6IHN0cmluZz4obmFtZTogUyk6IFRyYW5zaXRpb25TcGVjaWZpY2F0aW9uIHwgdm9pZCB7XG4gICAgICAgIHJldHVybiBjbG9uZSh0aGlzLl92YWx1ZXNbbmFtZV0udHJhbnNpdGlvbik7XG4gICAgfVxuXG4gICAgc2V0VHJhbnNpdGlvbjxTOiBzdHJpbmc+KG5hbWU6IFMsIHZhbHVlOiBUcmFuc2l0aW9uU3BlY2lmaWNhdGlvbiB8IHZvaWQpIHtcbiAgICAgICAgaWYgKCF0aGlzLl92YWx1ZXMuaGFzT3duUHJvcGVydHkobmFtZSkpIHtcbiAgICAgICAgICAgIHRoaXMuX3ZhbHVlc1tuYW1lXSA9IG5ldyBUcmFuc2l0aW9uYWJsZVByb3BlcnR5VmFsdWUodGhpcy5fdmFsdWVzW25hbWVdLnByb3BlcnR5KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl92YWx1ZXNbbmFtZV0udHJhbnNpdGlvbiA9IGNsb25lKHZhbHVlKSB8fCB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgc2VyaWFsaXplKCkge1xuICAgICAgICBjb25zdCByZXN1bHQ6IGFueSA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIE9iamVjdC5rZXlzKHRoaXMuX3ZhbHVlcykpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXRWYWx1ZShwcm9wZXJ0eSk7XG4gICAgICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdFtwcm9wZXJ0eV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgdHJhbnNpdGlvbiA9IHRoaXMuZ2V0VHJhbnNpdGlvbihwcm9wZXJ0eSk7XG4gICAgICAgICAgICBpZiAodHJhbnNpdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0W2Ake3Byb3BlcnR5fS10cmFuc2l0aW9uYF0gPSB0cmFuc2l0aW9uO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgdHJhbnNpdGlvbmVkKHBhcmFtZXRlcnM6IFRyYW5zaXRpb25QYXJhbWV0ZXJzLCBwcmlvcjogVHJhbnNpdGlvbmluZzxQcm9wcz4pOiBUcmFuc2l0aW9uaW5nPFByb3BzPiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBUcmFuc2l0aW9uaW5nKHRoaXMuX3Byb3BlcnRpZXMpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lXG4gICAgICAgIGZvciAoY29uc3QgcHJvcGVydHkgb2YgT2JqZWN0LmtleXModGhpcy5fdmFsdWVzKSkge1xuICAgICAgICAgICAgcmVzdWx0Ll92YWx1ZXNbcHJvcGVydHldID0gdGhpcy5fdmFsdWVzW3Byb3BlcnR5XS50cmFuc2l0aW9uZWQocGFyYW1ldGVycywgcHJpb3IuX3ZhbHVlc1twcm9wZXJ0eV0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgdW50cmFuc2l0aW9uZWQoKTogVHJhbnNpdGlvbmluZzxQcm9wcz4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgVHJhbnNpdGlvbmluZyh0aGlzLl9wcm9wZXJ0aWVzKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZVxuICAgICAgICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIE9iamVjdC5rZXlzKHRoaXMuX3ZhbHVlcykpIHtcbiAgICAgICAgICAgIHJlc3VsdC5fdmFsdWVzW3Byb3BlcnR5XSA9IHRoaXMuX3ZhbHVlc1twcm9wZXJ0eV0udW50cmFuc2l0aW9uZWQoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbn1cblxuLy8gLS0tLS0tLSBUcmFuc2l0aW9uaW5nIC0tLS0tLS1cblxuLyoqXG4gKiBgVHJhbnNpdGlvbmluZ1Byb3BlcnR5VmFsdWVgIGltcGxlbWVudHMgdGhlIGZpcnN0IG9mIHR3byBpbnRlcm1lZGlhdGUgc3RlcHMgaW4gdGhlIGV2YWx1YXRpb24gY2hhaW4gb2YgYSBwYWludFxuICogcHJvcGVydHkgdmFsdWUuIEluIHRoaXMgc3RlcCwgdHJhbnNpdGlvbnMgYmV0d2VlbiBvbGQgYW5kIG5ldyB2YWx1ZXMgYXJlIGhhbmRsZWQ6IGFzIGxvbmcgYXMgdGhlIHRyYW5zaXRpb24gaXMgaW5cbiAqIHByb2dyZXNzLCBgVHJhbnNpdGlvbmluZ1Byb3BlcnR5VmFsdWVgIG1haW50YWlucyBhIHJlZmVyZW5jZSB0byB0aGUgcHJpb3IgdmFsdWUsIGFuZCBpbnRlcnBvbGF0ZXMgYmV0d2VlbiBpdCBhbmRcbiAqIHRoZSBuZXcgdmFsdWUgYmFzZWQgb24gdGhlIGN1cnJlbnQgdGltZSBhbmQgdGhlIGNvbmZpZ3VyZWQgdHJhbnNpdGlvbiBkdXJhdGlvbiBhbmQgZGVsYXkuIFRoZSBwcm9kdWN0IGlzIHRoZSBuZXh0XG4gKiBzdGVwIGluIHRoZSBldmFsdWF0aW9uIGNoYWluOiB0aGUgXCJwb3NzaWJseSBldmFsdWF0ZWRcIiByZXN1bHQgdHlwZSBgUmAuIFNlZSBiZWxvdyBmb3IgbW9yZSBvbiB0aGlzIGNvbmNlcHQuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgVHJhbnNpdGlvbmluZ1Byb3BlcnR5VmFsdWU8VCwgUj4ge1xuICAgIHByb3BlcnR5OiBQcm9wZXJ0eTxULCBSPjtcbiAgICB2YWx1ZTogUHJvcGVydHlWYWx1ZTxULCBSPjtcbiAgICBwcmlvcjogP1RyYW5zaXRpb25pbmdQcm9wZXJ0eVZhbHVlPFQsIFI+O1xuICAgIGJlZ2luOiBUaW1lUG9pbnQ7XG4gICAgZW5kOiBUaW1lUG9pbnQ7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm9wZXJ0eTogUHJvcGVydHk8VCwgUj4sXG4gICAgICAgICAgICAgICAgdmFsdWU6IFByb3BlcnR5VmFsdWU8VCwgUj4sXG4gICAgICAgICAgICAgICAgcHJpb3I6ID9UcmFuc2l0aW9uaW5nUHJvcGVydHlWYWx1ZTxULCBSPixcbiAgICAgICAgICAgICAgICB0cmFuc2l0aW9uOiBUcmFuc2l0aW9uU3BlY2lmaWNhdGlvbixcbiAgICAgICAgICAgICAgICBub3c6IFRpbWVQb2ludCkge1xuICAgICAgICB0aGlzLnByb3BlcnR5ID0gcHJvcGVydHk7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5iZWdpbiA9IG5vdyArIHRyYW5zaXRpb24uZGVsYXkgfHwgMDtcbiAgICAgICAgdGhpcy5lbmQgPSB0aGlzLmJlZ2luICsgdHJhbnNpdGlvbi5kdXJhdGlvbiB8fCAwO1xuICAgICAgICBpZiAocHJvcGVydHkuc3BlY2lmaWNhdGlvbi50cmFuc2l0aW9uICYmICh0cmFuc2l0aW9uLmRlbGF5IHx8IHRyYW5zaXRpb24uZHVyYXRpb24pKSB7XG4gICAgICAgICAgICB0aGlzLnByaW9yID0gcHJpb3I7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwb3NzaWJseUV2YWx1YXRlKHBhcmFtZXRlcnM6IEV2YWx1YXRpb25QYXJhbWV0ZXJzKTogUiB7XG4gICAgICAgIGNvbnN0IG5vdyA9IHBhcmFtZXRlcnMubm93IHx8IDA7XG4gICAgICAgIGNvbnN0IGZpbmFsVmFsdWUgPSB0aGlzLnZhbHVlLnBvc3NpYmx5RXZhbHVhdGUocGFyYW1ldGVycyk7XG4gICAgICAgIGNvbnN0IHByaW9yID0gdGhpcy5wcmlvcjtcbiAgICAgICAgaWYgKCFwcmlvcikge1xuICAgICAgICAgICAgLy8gTm8gcHJpb3IgdmFsdWUuXG4gICAgICAgICAgICByZXR1cm4gZmluYWxWYWx1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChub3cgPiB0aGlzLmVuZCkge1xuICAgICAgICAgICAgLy8gVHJhbnNpdGlvbiBmcm9tIHByaW9yIHZhbHVlIGlzIG5vdyBjb21wbGV0ZS5cbiAgICAgICAgICAgIHRoaXMucHJpb3IgPSBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIGZpbmFsVmFsdWU7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy52YWx1ZS5pc0RhdGFEcml2ZW4oKSkge1xuICAgICAgICAgICAgLy8gVHJhbnNpdGlvbnMgdG8gZGF0YS1kcml2ZW4gcHJvcGVydGllcyBhcmUgbm90IHN1cHBvcnRlZC5cbiAgICAgICAgICAgIC8vIFdlIHNuYXAgaW1tZWRpYXRlbHkgdG8gdGhlIGRhdGEtZHJpdmVuIHZhbHVlIHNvIHRoYXQsIHdoZW4gd2UgcGVyZm9ybSBsYXlvdXQsXG4gICAgICAgICAgICAvLyB3ZSBzZWUgdGhlIGRhdGEtZHJpdmVuIGZ1bmN0aW9uIGFuZCBjYW4gdXNlIGl0IHRvIHBvcHVsYXRlIHZlcnRleCBidWZmZXJzLlxuICAgICAgICAgICAgdGhpcy5wcmlvciA9IG51bGw7XG4gICAgICAgICAgICByZXR1cm4gZmluYWxWYWx1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChub3cgPCB0aGlzLmJlZ2luKSB7XG4gICAgICAgICAgICAvLyBUcmFuc2l0aW9uIGhhc24ndCBzdGFydGVkIHlldC5cbiAgICAgICAgICAgIHJldHVybiBwcmlvci5wb3NzaWJseUV2YWx1YXRlKHBhcmFtZXRlcnMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gSW50ZXJwb2xhdGUgYmV0d2VlbiByZWN1cnNpdmVseS1jYWxjdWxhdGVkIHByaW9yIHZhbHVlIGFuZCBmaW5hbC5cbiAgICAgICAgICAgIGNvbnN0IHQgPSAobm93IC0gdGhpcy5iZWdpbikgLyAodGhpcy5lbmQgLSB0aGlzLmJlZ2luKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnByb3BlcnR5LmludGVycG9sYXRlKHByaW9yLnBvc3NpYmx5RXZhbHVhdGUocGFyYW1ldGVycyksIGZpbmFsVmFsdWUsIGVhc2VDdWJpY0luT3V0KHQpKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyoqXG4gKiBBIGhlbHBlciB0eXBlOiBnaXZlbiBhbiBvYmplY3QgdHlwZSBgUHJvcGVydGllc2Agd2hvc2UgdmFsdWVzIGFyZSBlYWNoIG9mIHR5cGUgYFByb3BlcnR5PFQsIFI+YCwgaXQgY2FsY3VsYXRlc1xuICogYW4gb2JqZWN0IHR5cGUgd2l0aCB0aGUgc2FtZSBrZXlzIGFuZCB2YWx1ZXMgb2YgdHlwZSBgVHJhbnNpdGlvbmluZ1Byb3BlcnR5VmFsdWU8VCwgUj5gLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbnR5cGUgVHJhbnNpdGlvbmluZ1Byb3BlcnR5VmFsdWVzPFByb3BzOiBPYmplY3Q+XG4gICAgPSAkRXhhY3Q8JE9iak1hcDxQcm9wcywgPFQsIFI+KHA6IFByb3BlcnR5PFQsIFI+KSA9PiBUcmFuc2l0aW9uaW5nUHJvcGVydHlWYWx1ZTxULCBSPj4+XG5cbi8qKlxuICogYFRyYW5zaXRpb25pbmdgIHN0b3JlcyBhIG1hcCBvZiBhbGwgKHByb3BlcnR5IG5hbWUsIGBUcmFuc2l0aW9uaW5nUHJvcGVydHlWYWx1ZWApIHBhaXJzIGZvciBwYWludCBwcm9wZXJ0aWVzIG9mIGFcbiAqIGdpdmVuIGxheWVyIHR5cGUuIEl0IGNhbiBjYWxjdWxhdGUgdGhlIHBvc3NpYmx5LWV2YWx1YXRlZCB2YWx1ZXMgZm9yIGFsbCBvZiB0aGVtIGF0IG9uY2UsIHByb2R1Y2luZyBhXG4gKiBgUG9zc2libHlFdmFsdWF0ZWRgIGluc3RhbmNlIGZvciB0aGUgc2FtZSBzZXQgb2YgcHJvcGVydGllcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgY2xhc3MgVHJhbnNpdGlvbmluZzxQcm9wczogT2JqZWN0PiB7XG4gICAgX3Byb3BlcnRpZXM6IFByb3BlcnRpZXM8UHJvcHM+O1xuICAgIF92YWx1ZXM6IFRyYW5zaXRpb25pbmdQcm9wZXJ0eVZhbHVlczxQcm9wcz47XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm9wZXJ0aWVzOiBQcm9wZXJ0aWVzPFByb3BzPikge1xuICAgICAgICB0aGlzLl9wcm9wZXJ0aWVzID0gcHJvcGVydGllcztcbiAgICAgICAgdGhpcy5fdmFsdWVzID0gKE9iamVjdC5jcmVhdGUocHJvcGVydGllcy5kZWZhdWx0VHJhbnNpdGlvbmluZ1Byb3BlcnR5VmFsdWVzKTogYW55KTtcbiAgICB9XG5cbiAgICBwb3NzaWJseUV2YWx1YXRlKHBhcmFtZXRlcnM6IEV2YWx1YXRpb25QYXJhbWV0ZXJzKTogUG9zc2libHlFdmFsdWF0ZWQ8UHJvcHM+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IFBvc3NpYmx5RXZhbHVhdGVkKHRoaXMuX3Byb3BlcnRpZXMpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lXG4gICAgICAgIGZvciAoY29uc3QgcHJvcGVydHkgb2YgT2JqZWN0LmtleXModGhpcy5fdmFsdWVzKSkge1xuICAgICAgICAgICAgcmVzdWx0Ll92YWx1ZXNbcHJvcGVydHldID0gdGhpcy5fdmFsdWVzW3Byb3BlcnR5XS5wb3NzaWJseUV2YWx1YXRlKHBhcmFtZXRlcnMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgaGFzVHJhbnNpdGlvbigpIHtcbiAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiBPYmplY3Qua2V5cyh0aGlzLl92YWx1ZXMpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fdmFsdWVzW3Byb3BlcnR5XS5wcmlvcikge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5cbi8vIC0tLS0tLS0gTGF5b3V0IC0tLS0tLS1cblxuLyoqXG4gKiBBIGhlbHBlciB0eXBlOiBnaXZlbiBhbiBvYmplY3QgdHlwZSBgUHJvcGVydGllc2Agd2hvc2UgdmFsdWVzIGFyZSBlYWNoIG9mIHR5cGUgYFByb3BlcnR5PFQsIFI+YCwgaXQgY2FsY3VsYXRlc1xuICogYW4gb2JqZWN0IHR5cGUgd2l0aCB0aGUgc2FtZSBrZXlzIGFuZCB2YWx1ZXMgb2YgdHlwZSBgUHJvcGVydHlWYWx1ZTxULCBSPmAuXG4gKlxuICogQHByaXZhdGVcbiAqL1xudHlwZSBQcm9wZXJ0eVZhbHVlczxQcm9wczogT2JqZWN0PlxuICAgID0gJEV4YWN0PCRPYmpNYXA8UHJvcHMsIDxULCBSPihwOiBQcm9wZXJ0eTxULCBSPikgPT4gUHJvcGVydHlWYWx1ZTxULCBSPj4+XG5cbi8qKlxuICogQmVjYXVzZSBsYXlvdXQgcHJvcGVydGllcyBhcmUgbm90IHRyYW5zaXRpb25hYmxlLCB0aGV5IGhhdmUgYSBzaW1wbGVyIHJlcHJlc2VudGF0aW9uIGFuZCBldmFsdWF0aW9uIGNoYWluIHRoYW5cbiAqIHBhaW50IHByb3BlcnRpZXM6IGBQcm9wZXJ0eVZhbHVlYHMgYXJlIHBvc3NpYmx5IGV2YWx1YXRlZCwgcHJvZHVjaW5nIHBvc3NpYmx5IGV2YWx1YXRlZCB2YWx1ZXMsIHdoaWNoIGFyZSB0aGVuXG4gKiBmdWxseSBldmFsdWF0ZWQuXG4gKlxuICogYExheW91dGAgc3RvcmVzIGEgbWFwIG9mIGFsbCAocHJvcGVydHkgbmFtZSwgYFByb3BlcnR5VmFsdWVgKSBwYWlycyBmb3IgbGF5b3V0IHByb3BlcnRpZXMgb2YgYVxuICogZ2l2ZW4gbGF5ZXIgdHlwZS4gSXQgY2FuIGNhbGN1bGF0ZSB0aGUgcG9zc2libHktZXZhbHVhdGVkIHZhbHVlcyBmb3IgYWxsIG9mIHRoZW0gYXQgb25jZSwgcHJvZHVjaW5nIGFcbiAqIGBQb3NzaWJseUV2YWx1YXRlZGAgaW5zdGFuY2UgZm9yIHRoZSBzYW1lIHNldCBvZiBwcm9wZXJ0aWVzLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBjbGFzcyBMYXlvdXQ8UHJvcHM6IE9iamVjdD4ge1xuICAgIF9wcm9wZXJ0aWVzOiBQcm9wZXJ0aWVzPFByb3BzPjtcbiAgICBfdmFsdWVzOiBQcm9wZXJ0eVZhbHVlczxQcm9wcz47XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm9wZXJ0aWVzOiBQcm9wZXJ0aWVzPFByb3BzPikge1xuICAgICAgICB0aGlzLl9wcm9wZXJ0aWVzID0gcHJvcGVydGllcztcbiAgICAgICAgdGhpcy5fdmFsdWVzID0gKE9iamVjdC5jcmVhdGUocHJvcGVydGllcy5kZWZhdWx0UHJvcGVydHlWYWx1ZXMpOiBhbnkpO1xuICAgIH1cblxuICAgIGdldFZhbHVlPFM6IHN0cmluZz4obmFtZTogUykge1xuICAgICAgICByZXR1cm4gY2xvbmUodGhpcy5fdmFsdWVzW25hbWVdLnZhbHVlKTtcbiAgICB9XG5cbiAgICBzZXRWYWx1ZTxTOiBzdHJpbmc+KG5hbWU6IFMsIHZhbHVlOiAqKSB7XG4gICAgICAgIHRoaXMuX3ZhbHVlc1tuYW1lXSA9IG5ldyBQcm9wZXJ0eVZhbHVlKHRoaXMuX3ZhbHVlc1tuYW1lXS5wcm9wZXJ0eSwgdmFsdWUgPT09IG51bGwgPyB1bmRlZmluZWQgOiBjbG9uZSh2YWx1ZSkpO1xuICAgIH1cblxuICAgIHNlcmlhbGl6ZSgpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0OiBhbnkgPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiBPYmplY3Qua2V5cyh0aGlzLl92YWx1ZXMpKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0VmFsdWUocHJvcGVydHkpO1xuICAgICAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXN1bHRbcHJvcGVydHldID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBwb3NzaWJseUV2YWx1YXRlKHBhcmFtZXRlcnM6IEV2YWx1YXRpb25QYXJhbWV0ZXJzKTogUG9zc2libHlFdmFsdWF0ZWQ8UHJvcHM+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IFBvc3NpYmx5RXZhbHVhdGVkKHRoaXMuX3Byb3BlcnRpZXMpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lXG4gICAgICAgIGZvciAoY29uc3QgcHJvcGVydHkgb2YgT2JqZWN0LmtleXModGhpcy5fdmFsdWVzKSkge1xuICAgICAgICAgICAgcmVzdWx0Ll92YWx1ZXNbcHJvcGVydHldID0gdGhpcy5fdmFsdWVzW3Byb3BlcnR5XS5wb3NzaWJseUV2YWx1YXRlKHBhcmFtZXRlcnMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuXG4vLyAtLS0tLS0tIFBvc3NpYmx5RXZhbHVhdGVkIC0tLS0tLS1cblxuLyoqXG4gKiBcIlBvc3NpYmx5IGV2YWx1YXRlZCB2YWx1ZVwiIGlzIGFuIGludGVybWVkaWF0ZSBzdGFnZSBpbiB0aGUgZXZhbHVhdGlvbiBjaGFpbiBmb3IgYm90aCBwYWludCBhbmQgbGF5b3V0IHByb3BlcnR5XG4gKiB2YWx1ZXMuIFRoZSBwdXJwb3NlIG9mIHRoaXMgc3RhZ2UgaXMgdG8gb3B0aW1pemUgYXdheSB1bm5lY2Vzc2FyeSByZWNhbGN1bGF0aW9ucyBmb3IgZGF0YS1kcml2ZW4gcHJvcGVydGllcy4gQ29kZVxuICogd2hpY2ggdXNlcyBkYXRhLWRyaXZlbiBwcm9wZXJ0eSB2YWx1ZXMgbXVzdCBhc3N1bWUgdGhhdCB0aGUgdmFsdWUgaXMgZGVwZW5kZW50IG9uIGZlYXR1cmUgZGF0YSwgYW5kIHJlcXVlc3QgdGhhdCBpdFxuICogYmUgZXZhbHVhdGVkIGZvciBlYWNoIGZlYXR1cmUuIEJ1dCB3aGVuIHRoYXQgcHJvcGVydHkgdmFsdWUgaXMgaW4gZmFjdCBhIGNvbnN0YW50IG9yIGNhbWVyYSBmdW5jdGlvbiwgdGhlIGNhbGN1bGF0aW9uXG4gKiB3aWxsIG5vdCBhY3R1YWxseSBkZXBlbmQgb24gdGhlIGZlYXR1cmUsIGFuZCB3ZSBjYW4gYmVuZWZpdCBmcm9tIHJldHVybmluZyB0aGUgcHJpb3IgcmVzdWx0IG9mIGhhdmluZyBkb25lIHRoZVxuICogZXZhbHVhdGlvbiBvbmNlLCBhaGVhZCBvZiB0aW1lLCBpbiBhbiBpbnRlcm1lZGlhdGUgc3RlcCB3aG9zZSBpbnB1dHMgYXJlIGp1c3QgdGhlIHZhbHVlIGFuZCBcImdsb2JhbFwiIHBhcmFtZXRlcnNcbiAqIHN1Y2ggYXMgY3VycmVudCB6b29tIGxldmVsLlxuICpcbiAqIGBQb3NzaWJseUV2YWx1YXRlZFZhbHVlYCByZXByZXNlbnRzIHRoZSB0aHJlZSBwb3NzaWJsZSBvdXRjb21lcyBvZiB0aGlzIHN0ZXA6IGlmIHRoZSBpbnB1dCB2YWx1ZSB3YXMgYSBjb25zdGFudCBvclxuICogY2FtZXJhIGV4cHJlc3Npb24sIHRoZW4gdGhlIFwicG9zc2libHkgZXZhbHVhdGVkXCIgcmVzdWx0IGlzIGEgY29uc3RhbnQgdmFsdWUuIE90aGVyd2lzZSwgdGhlIGlucHV0IHZhbHVlIHdhcyBlaXRoZXJcbiAqIGEgc291cmNlIG9yIGNvbXBvc2l0ZSBleHByZXNzaW9uLCBhbmQgd2UgbXVzdCBkZWZlciBmaW5hbCBldmFsdWF0aW9uIHVudGlsIHN1cHBsaWVkIGEgZmVhdHVyZS4gV2Ugc2VwYXJhdGVcbiAqIHRoZSBzb3VyY2UgYW5kIGNvbXBvc2l0ZSBjYXNlcyBiZWNhdXNlIHRoZXkgYXJlIGhhbmRsZWQgZGlmZmVyZW50bHkgd2hlbiBnZW5lcmF0aW5nIEdMIGF0dHJpYnV0ZXMsIGJ1ZmZlcnMsIGFuZFxuICogdW5pZm9ybXMuXG4gKlxuICogTm90ZSB0aGF0IGBQb3NzaWJseUV2YWx1YXRlZFZhbHVlYCAoYW5kIGBQb3NzaWJseUV2YWx1YXRlZFByb3BlcnR5VmFsdWVgLCBiZWxvdykgYXJlIF9ub3RfIHVzZWQgZm9yIHByb3BlcnRpZXMgdGhhdFxuICogZG8gbm90IGFsbG93IGRhdGEtZHJpdmVuIHZhbHVlcy4gRm9yIHN1Y2ggcHJvcGVydGllcywgd2Uga25vdyB0aGF0IHRoZSBcInBvc3NpYmx5IGV2YWx1YXRlZFwiIHJlc3VsdCBpcyBhbHdheXMgYSBjb25zdGFudFxuICogc2NhbGFyIHZhbHVlLiBTZWUgYmVsb3cuXG4gKlxuICogQHByaXZhdGVcbiAqL1xudHlwZSBQb3NzaWJseUV2YWx1YXRlZFZhbHVlPFQ+ID1cbiAgICB8IHtraW5kOiAnY29uc3RhbnQnLCB2YWx1ZTogVH1cbiAgICB8IFNvdXJjZUV4cHJlc3Npb25cbiAgICB8IENvbXBvc2l0ZUV4cHJlc3Npb247XG5cbi8qKlxuICogYFBvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZWAgaXMgdXNlZCBmb3IgZGF0YS1kcml2ZW4gcGFpbnQgYW5kIGxheW91dCBwcm9wZXJ0eSB2YWx1ZXMuIEl0IGhvbGRzIGFcbiAqIGBQb3NzaWJseUV2YWx1YXRlZFZhbHVlYCBhbmQgdGhlIGBHbG9iYWxQcm9wZXJ0aWVzYCB0aGF0IHdlcmUgdXNlZCB0byBnZW5lcmF0ZSBpdC4gWW91J3JlIG5vdCBhbGxvd2VkIHRvIHN1cHBseVxuICogYSBkaWZmZXJlbnQgc2V0IG9mIGBHbG9iYWxQcm9wZXJ0aWVzYCB3aGVuIHBlcmZvcm1pbmcgdGhlIGZpbmFsIGV2YWx1YXRpb24gYmVjYXVzZSB0aGV5IHdvdWxkIGJlIGlnbm9yZWQgaW4gdGhlXG4gKiBjYXNlIHdoZXJlIHRoZSBpbnB1dCB2YWx1ZSB3YXMgYSBjb25zdGFudCBvciBjYW1lcmEgZnVuY3Rpb24uXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGNsYXNzIFBvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZTxUPiB7XG4gICAgcHJvcGVydHk6IERhdGFEcml2ZW5Qcm9wZXJ0eTxUPjtcbiAgICB2YWx1ZTogUG9zc2libHlFdmFsdWF0ZWRWYWx1ZTxUPjtcbiAgICBwYXJhbWV0ZXJzOiBFdmFsdWF0aW9uUGFyYW1ldGVycztcblxuICAgIGNvbnN0cnVjdG9yKHByb3BlcnR5OiBEYXRhRHJpdmVuUHJvcGVydHk8VD4sIHZhbHVlOiBQb3NzaWJseUV2YWx1YXRlZFZhbHVlPFQ+LCBwYXJhbWV0ZXJzOiBFdmFsdWF0aW9uUGFyYW1ldGVycykge1xuICAgICAgICB0aGlzLnByb3BlcnR5ID0gcHJvcGVydHk7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5wYXJhbWV0ZXJzID0gcGFyYW1ldGVycztcbiAgICB9XG5cbiAgICBpc0NvbnN0YW50KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZS5raW5kID09PSAnY29uc3RhbnQnO1xuICAgIH1cblxuICAgIGNvbnN0YW50T3IodmFsdWU6IFQpOiBUIHtcbiAgICAgICAgaWYgKHRoaXMudmFsdWUua2luZCA9PT0gJ2NvbnN0YW50Jykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudmFsdWUudmFsdWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBldmFsdWF0ZShmZWF0dXJlOiBGZWF0dXJlLCBmZWF0dXJlU3RhdGU6IEZlYXR1cmVTdGF0ZSk6IFQge1xuICAgICAgICByZXR1cm4gdGhpcy5wcm9wZXJ0eS5ldmFsdWF0ZSh0aGlzLnZhbHVlLCB0aGlzLnBhcmFtZXRlcnMsIGZlYXR1cmUsIGZlYXR1cmVTdGF0ZSk7XG4gICAgfVxufVxuXG4vKipcbiAqIEEgaGVscGVyIHR5cGU6IGdpdmVuIGFuIG9iamVjdCB0eXBlIGBQcm9wZXJ0aWVzYCB3aG9zZSB2YWx1ZXMgYXJlIGVhY2ggb2YgdHlwZSBgUHJvcGVydHk8VCwgUj5gLCBpdCBjYWxjdWxhdGVzXG4gKiBhbiBvYmplY3QgdHlwZSB3aXRoIHRoZSBzYW1lIGtleXMsIGFuZCB2YWx1ZXMgb2YgdHlwZSBgUmAuXG4gKlxuICogRm9yIHByb3BlcnRpZXMgdGhhdCBkb24ndCBhbGxvdyBkYXRhLWRyaXZlbiB2YWx1ZXMsIGBSYCBpcyBhIHNjYWxhciB0eXBlIHN1Y2ggYXMgYG51bWJlcmAsIGBzdHJpbmdgLCBvciBgQ29sb3JgLlxuICogRm9yIGRhdGEtZHJpdmVuIHByb3BlcnRpZXMsIGl0IGlzIGBQb3NzaWJseUV2YWx1YXRlZFByb3BlcnR5VmFsdWVgLiBDcml0aWNhbGx5LCB0aGUgdHlwZSBkZWZpbml0aW9ucyBhcmUgc2V0IHVwXG4gKiBpbiBhIHdheSB0aGF0IGFsbG93cyBmbG93IHRvIGtub3cgd2hpY2ggb2YgdGhlc2UgdHdvIGNhc2VzIGFwcGxpZXMgZm9yIGFueSBnaXZlbiBwcm9wZXJ0eSBuYW1lLCBhbmQgaWYgeW91IGF0dGVtcHRcbiAqIHRvIHVzZSBhIGBQb3NzaWJseUV2YWx1YXRlZFByb3BlcnR5VmFsdWVgIGFzIGlmIGl0IHdhcyBhIHNjYWxhciwgb3IgdmljZSB2ZXJzYSwgeW91IHdpbGwgZ2V0IGEgdHlwZSBlcnJvci4gKEhvd2V2ZXIsXG4gKiB0aGVyZSdzIGF0IGxlYXN0IG9uZSBjYXNlIGluIHdoaWNoIGZsb3cgZmFpbHMgdG8gcHJvZHVjZSBhIHR5cGUgZXJyb3IgdGhhdCB5b3Ugc2hvdWxkIGJlIGF3YXJlIG9mOiBpbiBhIGNvbnRleHQgc3VjaFxuICogYXMgYGxheWVyLnBhaW50LmdldCgnZm9vLW9wYWNpdHknKSA9PT0gMGAsIGlmIGBmb28tb3BhY2l0eWAgaXMgZGF0YS1kcml2ZW4sIHRoYW4gdGhlIGxlZnQtaGFuZCBzaWRlIGlzIG9mIHR5cGVcbiAqIGBQb3NzaWJseUV2YWx1YXRlZFByb3BlcnR5VmFsdWU8bnVtYmVyPmAsIGJ1dCBmbG93IHdpbGwgbm90IGNvbXBsYWluIGFib3V0IGNvbXBhcmluZyB0aGlzIHRvIGEgbnVtYmVyIHVzaW5nIGA9PT1gLlxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9mbG93L2lzc3Vlcy8yMzU5LilcbiAqXG4gKiBUaGVyZSdzIGFsc28gYSB0aGlyZCwgc3BlY2lhbCBjYXNlIHBvc3NpYmxpdHkgZm9yIGBSYDogZm9yIGNyb3NzLWZhZGVkIHByb3BlcnRpZXMsIGl0J3MgYD9Dcm9zc0ZhZGVkPFQ+YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG50eXBlIFBvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZXM8UHJvcHM6IE9iamVjdD5cbiAgICA9ICRFeGFjdDwkT2JqTWFwPFByb3BzLCA8VCwgUj4ocDogUHJvcGVydHk8VCwgUj4pID0+IFI+PlxuXG4vKipcbiAqIGBQb3NzaWJseUV2YWx1YXRlZGAgc3RvcmVzIGEgbWFwIG9mIGFsbCAocHJvcGVydHkgbmFtZSwgYFJgKSBwYWlycyBmb3IgcGFpbnQgb3IgbGF5b3V0IHByb3BlcnRpZXMgb2YgYVxuICogZ2l2ZW4gbGF5ZXIgdHlwZS5cbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBjbGFzcyBQb3NzaWJseUV2YWx1YXRlZDxQcm9wczogT2JqZWN0PiB7XG4gICAgX3Byb3BlcnRpZXM6IFByb3BlcnRpZXM8UHJvcHM+O1xuICAgIF92YWx1ZXM6IFBvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZXM8UHJvcHM+O1xuXG4gICAgY29uc3RydWN0b3IocHJvcGVydGllczogUHJvcGVydGllczxQcm9wcz4pIHtcbiAgICAgICAgdGhpcy5fcHJvcGVydGllcyA9IHByb3BlcnRpZXM7XG4gICAgICAgIHRoaXMuX3ZhbHVlcyA9IChPYmplY3QuY3JlYXRlKHByb3BlcnRpZXMuZGVmYXVsdFBvc3NpYmx5RXZhbHVhdGVkVmFsdWVzKTogYW55KTtcbiAgICB9XG5cbiAgICBnZXQ8Uzogc3RyaW5nPihuYW1lOiBTKTogJEVsZW1lbnRUeXBlPFBvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZXM8UHJvcHM+LCBTPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl92YWx1ZXNbbmFtZV07XG4gICAgfVxufVxuXG4vKipcbiAqIEFuIGltcGxlbWVudGF0aW9uIG9mIGBQcm9wZXJ0eWAgZm9yIHByb3BlcnRpZXMgdGhhdCBkbyBub3QgcGVybWl0IGRhdGEtZHJpdmVuIChzb3VyY2Ugb3IgY29tcG9zaXRlKSBleHByZXNzaW9ucy5cbiAqIFRoaXMgcmVzdHJpY3Rpb24gYWxsb3dzIHVzIHRvIGRlY2xhcmUgc3RhdGljYWxseSB0aGF0IHRoZSByZXN1bHQgb2YgcG9zc2libHkgZXZhbHVhdGluZyB0aGlzIGtpbmQgb2YgcHJvcGVydHlcbiAqIGlzIGluIGZhY3QgYWx3YXlzIHRoZSBzY2FsYXIgdHlwZSBgVGAsIGFuZCBjYW4gYmUgdXNlZCB3aXRob3V0IGZ1cnRoZXIgZXZhbHVhdGluZyB0aGUgdmFsdWUgb24gYSBwZXItZmVhdHVyZSBiYXNpcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgY2xhc3MgRGF0YUNvbnN0YW50UHJvcGVydHk8VD4gaW1wbGVtZW50cyBQcm9wZXJ0eTxULCBUPiB7XG4gICAgc3BlY2lmaWNhdGlvbjogU3R5bGVQcm9wZXJ0eVNwZWNpZmljYXRpb247XG5cbiAgICBjb25zdHJ1Y3RvcihzcGVjaWZpY2F0aW9uOiBTdHlsZVByb3BlcnR5U3BlY2lmaWNhdGlvbikge1xuICAgICAgICB0aGlzLnNwZWNpZmljYXRpb24gPSBzcGVjaWZpY2F0aW9uO1xuICAgIH1cblxuICAgIHBvc3NpYmx5RXZhbHVhdGUodmFsdWU6IFByb3BlcnR5VmFsdWU8VCwgVD4sIHBhcmFtZXRlcnM6IEV2YWx1YXRpb25QYXJhbWV0ZXJzKTogVCB7XG4gICAgICAgIGFzc2VydCghdmFsdWUuaXNEYXRhRHJpdmVuKCkpO1xuICAgICAgICByZXR1cm4gdmFsdWUuZXhwcmVzc2lvbi5ldmFsdWF0ZShwYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICBpbnRlcnBvbGF0ZShhOiBULCBiOiBULCB0OiBudW1iZXIpOiBUIHtcbiAgICAgICAgY29uc3QgaW50ZXJwOiA/KGE6IFQsIGI6IFQsIHQ6IG51bWJlcikgPT4gVCA9IChpbnRlcnBvbGF0ZTogYW55KVt0aGlzLnNwZWNpZmljYXRpb24udHlwZV07XG4gICAgICAgIGlmIChpbnRlcnApIHtcbiAgICAgICAgICAgIHJldHVybiBpbnRlcnAoYSwgYiwgdCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gYTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyoqXG4gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiBgUHJvcGVydHlgIGZvciBwcm9wZXJ0aWVzIHRoYXQgcGVybWl0IGRhdGEtZHJpdmVuIChzb3VyY2Ugb3IgY29tcG9zaXRlKSBleHByZXNzaW9ucy5cbiAqIFRoZSByZXN1bHQgb2YgcG9zc2libHkgZXZhbHVhdGluZyB0aGlzIGtpbmQgb2YgcHJvcGVydHkgaXMgYFBvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZTxUPmA7IG9idGFpbmluZ1xuICogYSBzY2FsYXIgdmFsdWUgYFRgIHJlcXVpcmVzIGZ1cnRoZXIgZXZhbHVhdGlvbiBvbiBhIHBlci1mZWF0dXJlIGJhc2lzLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBjbGFzcyBEYXRhRHJpdmVuUHJvcGVydHk8VD4gaW1wbGVtZW50cyBQcm9wZXJ0eTxULCBQb3NzaWJseUV2YWx1YXRlZFByb3BlcnR5VmFsdWU8VD4+IHtcbiAgICBzcGVjaWZpY2F0aW9uOiBTdHlsZVByb3BlcnR5U3BlY2lmaWNhdGlvbjtcblxuICAgIGNvbnN0cnVjdG9yKHNwZWNpZmljYXRpb246IFN0eWxlUHJvcGVydHlTcGVjaWZpY2F0aW9uKSB7XG4gICAgICAgIHRoaXMuc3BlY2lmaWNhdGlvbiA9IHNwZWNpZmljYXRpb247XG4gICAgfVxuXG4gICAgcG9zc2libHlFdmFsdWF0ZSh2YWx1ZTogUHJvcGVydHlWYWx1ZTxULCBQb3NzaWJseUV2YWx1YXRlZFByb3BlcnR5VmFsdWU8VD4+LCBwYXJhbWV0ZXJzOiBFdmFsdWF0aW9uUGFyYW1ldGVycyk6IFBvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZTxUPiB7XG4gICAgICAgIGlmICh2YWx1ZS5leHByZXNzaW9uLmtpbmQgPT09ICdjb25zdGFudCcgfHwgdmFsdWUuZXhwcmVzc2lvbi5raW5kID09PSAnY2FtZXJhJykge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQb3NzaWJseUV2YWx1YXRlZFByb3BlcnR5VmFsdWUodGhpcywge2tpbmQ6ICdjb25zdGFudCcsIHZhbHVlOiB2YWx1ZS5leHByZXNzaW9uLmV2YWx1YXRlKHBhcmFtZXRlcnMpfSwgcGFyYW1ldGVycyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFBvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZSh0aGlzLCB2YWx1ZS5leHByZXNzaW9uLCBwYXJhbWV0ZXJzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGludGVycG9sYXRlKGE6IFBvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZTxUPixcbiAgICAgICAgICAgICAgICBiOiBQb3NzaWJseUV2YWx1YXRlZFByb3BlcnR5VmFsdWU8VD4sXG4gICAgICAgICAgICAgICAgdDogbnVtYmVyKTogUG9zc2libHlFdmFsdWF0ZWRQcm9wZXJ0eVZhbHVlPFQ+IHtcbiAgICAgICAgLy8gSWYgZWl0aGVyIHBvc3NpYmx5LWV2YWx1YXRlZCB2YWx1ZSBpcyBub24tY29uc3RhbnQsIGdpdmUgdXA6IHdlIGFyZW4ndCBhYmxlIHRvIGludGVycG9sYXRlIGRhdGEtZHJpdmVuIHZhbHVlcy5cbiAgICAgICAgaWYgKGEudmFsdWUua2luZCAhPT0gJ2NvbnN0YW50JyB8fCBiLnZhbHVlLmtpbmQgIT09ICdjb25zdGFudCcpIHtcbiAgICAgICAgICAgIHJldHVybiBhO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU3BlY2lhbCBjYXNlIGhhY2sgc29sZWx5IGZvciBmaWxsLW91dGxpbmUtY29sb3IuIFRoZSB1bmRlZmluZWQgdmFsdWUgaXMgc3Vic2VxdWVudGx5IGhhbmRsZWQgaW5cbiAgICAgICAgLy8gRmlsbFN0eWxlTGF5ZXIjcmVjYWxjdWxhdGUsIHdoaWNoIHNldHMgZmlsbC1vdXRsaW5lLWNvbG9yIHRvIHRoZSBmaWxsLWNvbG9yIHZhbHVlIGlmIHRoZSBmb3JtZXJcbiAgICAgICAgLy8gaXMgYSBQb3NzaWJseUV2YWx1YXRlZFByb3BlcnR5VmFsdWUgY29udGFpbmluZyBhIGNvbnN0YW50IHVuZGVmaW5lZCB2YWx1ZS4gSW4gYWRkaXRpb24gdG8gdGhlXG4gICAgICAgIC8vIHJldHVybiB2YWx1ZSBoZXJlLCB0aGUgb3RoZXIgc291cmNlIG9mIGEgUG9zc2libHlFdmFsdWF0ZWRQcm9wZXJ0eVZhbHVlIGNvbnRhaW5pbmcgYSBjb25zdGFudFxuICAgICAgICAvLyB1bmRlZmluZWQgdmFsdWUgaXMgdGhlIFwiZGVmYXVsdCB2YWx1ZVwiIGZvciBmaWxsLW91dGxpbmUtY29sb3IgaGVsZCBpblxuICAgICAgICAvLyBgUHJvcGVydGllcyNkZWZhdWx0UG9zc2libHlFdmFsdWF0ZWRWYWx1ZXNgLCB3aGljaCBzZXJ2ZXMgYXMgdGhlIHByb3RvdHlwZSBvZlxuICAgICAgICAvLyBgUG9zc2libHlFdmFsdWF0ZWQjX3ZhbHVlc2AuXG4gICAgICAgIGlmIChhLnZhbHVlLnZhbHVlID09PSB1bmRlZmluZWQgfHwgYi52YWx1ZS52YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFBvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZSh0aGlzLCB7a2luZDogJ2NvbnN0YW50JywgdmFsdWU6ICh1bmRlZmluZWQ6IGFueSl9LCBhLnBhcmFtZXRlcnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaW50ZXJwOiA/KGE6IFQsIGI6IFQsIHQ6IG51bWJlcikgPT4gVCA9IChpbnRlcnBvbGF0ZTogYW55KVt0aGlzLnNwZWNpZmljYXRpb24udHlwZV07XG4gICAgICAgIGlmIChpbnRlcnApIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUG9zc2libHlFdmFsdWF0ZWRQcm9wZXJ0eVZhbHVlKHRoaXMsIHtraW5kOiAnY29uc3RhbnQnLCB2YWx1ZTogaW50ZXJwKGEudmFsdWUudmFsdWUsIGIudmFsdWUudmFsdWUsIHQpfSwgYS5wYXJhbWV0ZXJzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBhO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZXZhbHVhdGUodmFsdWU6IFBvc3NpYmx5RXZhbHVhdGVkVmFsdWU8VD4sIHBhcmFtZXRlcnM6IEV2YWx1YXRpb25QYXJhbWV0ZXJzLCBmZWF0dXJlOiBGZWF0dXJlLCBmZWF0dXJlU3RhdGU6IEZlYXR1cmVTdGF0ZSk6IFQge1xuICAgICAgICBpZiAodmFsdWUua2luZCA9PT0gJ2NvbnN0YW50Jykge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnZhbHVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlLmV2YWx1YXRlKHBhcmFtZXRlcnMsIGZlYXR1cmUsIGZlYXR1cmVTdGF0ZSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qKlxuICogQW4gaW1wbGVtZW50YXRpb24gb2YgYFByb3BlcnR5YCBmb3IgIGRhdGEgZHJpdmVuIGBsaW5lLXBhdHRlcm5gIHdoaWNoIGFyZSB0cmFuc2l0aW9uZWQgYnkgY3Jvc3MtZmFkaW5nXG4gKiByYXRoZXIgdGhhbiBpbnRlcnBvbGF0aW9uLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cblxuZXhwb3J0IGNsYXNzIENyb3NzRmFkZWREYXRhRHJpdmVuUHJvcGVydHk8VD4gZXh0ZW5kcyBEYXRhRHJpdmVuUHJvcGVydHk8P0Nyb3NzRmFkZWQ8VD4+IHtcblxuICAgIHBvc3NpYmx5RXZhbHVhdGUodmFsdWU6IFByb3BlcnR5VmFsdWU8P0Nyb3NzRmFkZWQ8VD4sIFBvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZTw/Q3Jvc3NGYWRlZDxUPj4+LCBwYXJhbWV0ZXJzOiBFdmFsdWF0aW9uUGFyYW1ldGVycyk6IFBvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZTw/Q3Jvc3NGYWRlZDxUPj4ge1xuICAgICAgICBpZiAodmFsdWUudmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQb3NzaWJseUV2YWx1YXRlZFByb3BlcnR5VmFsdWUodGhpcywge2tpbmQ6ICdjb25zdGFudCcsIHZhbHVlOiB1bmRlZmluZWR9LCBwYXJhbWV0ZXJzKTtcbiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5leHByZXNzaW9uLmtpbmQgPT09ICdjb25zdGFudCcpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnN0YW50VmFsdWUgPSB2YWx1ZS5leHByZXNzaW9uLmV2YWx1YXRlKHBhcmFtZXRlcnMpO1xuICAgICAgICAgICAgY29uc3QgY29uc3RhbnQgPSB0aGlzLl9jYWxjdWxhdGUoY29uc3RhbnRWYWx1ZSwgY29uc3RhbnRWYWx1ZSwgY29uc3RhbnRWYWx1ZSwgcGFyYW1ldGVycyk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFBvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZSh0aGlzLCB7a2luZDogJ2NvbnN0YW50JywgdmFsdWU6IGNvbnN0YW50fSwgcGFyYW1ldGVycyk7XG4gICAgICAgIH0gZWxzZSBpZiAodmFsdWUuZXhwcmVzc2lvbi5raW5kID09PSAnY2FtZXJhJykge1xuICAgICAgICAgICAgY29uc3QgY2FtZXJhVmFsID0gdGhpcy5fY2FsY3VsYXRlKFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZS5leHByZXNzaW9uLmV2YWx1YXRlKHt6b29tOiBwYXJhbWV0ZXJzLnpvb20gLSAxLjB9KSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUuZXhwcmVzc2lvbi5ldmFsdWF0ZSh7em9vbTogcGFyYW1ldGVycy56b29tfSksXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlLmV4cHJlc3Npb24uZXZhbHVhdGUoe3pvb206IHBhcmFtZXRlcnMuem9vbSArIDEuMH0pLFxuICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUG9zc2libHlFdmFsdWF0ZWRQcm9wZXJ0eVZhbHVlKHRoaXMsIHtraW5kOiAnY29uc3RhbnQnLCB2YWx1ZTogY2FtZXJhVmFsfSwgcGFyYW1ldGVycyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBzb3VyY2Ugb3IgY29tcG9zaXRlIGV4cHJlc3Npb25cbiAgICAgICAgICAgIHJldHVybiBuZXcgUG9zc2libHlFdmFsdWF0ZWRQcm9wZXJ0eVZhbHVlKHRoaXMsIHZhbHVlLmV4cHJlc3Npb24sIHBhcmFtZXRlcnMpO1xuICAgICAgICB9XG4gICAgfVxuXG5cbiAgICBldmFsdWF0ZSh2YWx1ZTogUG9zc2libHlFdmFsdWF0ZWRWYWx1ZTw/Q3Jvc3NGYWRlZDxUPj4sIGdsb2JhbHM6IEV2YWx1YXRpb25QYXJhbWV0ZXJzLCBmZWF0dXJlOiBGZWF0dXJlLCBmZWF0dXJlU3RhdGU6IEZlYXR1cmVTdGF0ZSk6ID9Dcm9zc0ZhZGVkPFQ+IHtcbiAgICAgICAgaWYgKHZhbHVlLmtpbmQgPT09ICdzb3VyY2UnKSB7XG4gICAgICAgICAgICBjb25zdCBjb25zdGFudCA9IHZhbHVlLmV2YWx1YXRlKGdsb2JhbHMsIGZlYXR1cmUsIGZlYXR1cmVTdGF0ZSk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fY2FsY3VsYXRlKGNvbnN0YW50LCBjb25zdGFudCwgY29uc3RhbnQsIGdsb2JhbHMpO1xuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmtpbmQgPT09ICdjb21wb3NpdGUnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fY2FsY3VsYXRlKFxuICAgICAgICAgICAgICAgIHZhbHVlLmV2YWx1YXRlKHt6b29tOiBNYXRoLmZsb29yKGdsb2JhbHMuem9vbSkgLSAxLjB9LCBmZWF0dXJlLCBmZWF0dXJlU3RhdGUpLFxuICAgICAgICAgICAgICAgIHZhbHVlLmV2YWx1YXRlKHt6b29tOiBNYXRoLmZsb29yKGdsb2JhbHMuem9vbSl9LCBmZWF0dXJlLCBmZWF0dXJlU3RhdGUpLFxuICAgICAgICAgICAgICAgIHZhbHVlLmV2YWx1YXRlKHt6b29tOiBNYXRoLmZsb29yKGdsb2JhbHMuem9vbSkgKyAxLjB9LCBmZWF0dXJlLCBmZWF0dXJlU3RhdGUpLFxuICAgICAgICAgICAgICAgIGdsb2JhbHMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnZhbHVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX2NhbGN1bGF0ZShtaW46IFQsIG1pZDogVCwgbWF4OiBULCBwYXJhbWV0ZXJzOiBFdmFsdWF0aW9uUGFyYW1ldGVycyk6IENyb3NzRmFkZWQ8VD4ge1xuICAgICAgICBjb25zdCB6ID0gcGFyYW1ldGVycy56b29tO1xuICAgICAgICByZXR1cm4geiA+IHBhcmFtZXRlcnMuem9vbUhpc3RvcnkubGFzdEludGVnZXJab29tID8geyBmcm9tOiBtaW4sIHRvOiBtaWQgfSA6IHsgZnJvbTogbWF4LCB0bzogbWlkIH07XG4gICAgfVxuXG4gICAgaW50ZXJwb2xhdGUoYTogUG9zc2libHlFdmFsdWF0ZWRQcm9wZXJ0eVZhbHVlPD9Dcm9zc0ZhZGVkPFQ+Pik6IFBvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZTw/Q3Jvc3NGYWRlZDxUPj4ge1xuICAgICAgICByZXR1cm4gYTtcbiAgICB9XG59XG4vKipcbiAqIEFuIGltcGxlbWVudGF0aW9uIG9mIGBQcm9wZXJ0eWAgZm9yIGAqLXBhdHRlcm5gIGFuZCBgbGluZS1kYXNoYXJyYXlgLCB3aGljaCBhcmUgdHJhbnNpdGlvbmVkIGJ5IGNyb3NzLWZhZGluZ1xuICogcmF0aGVyIHRoYW4gaW50ZXJwb2xhdGlvbi5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgY2xhc3MgQ3Jvc3NGYWRlZFByb3BlcnR5PFQ+IGltcGxlbWVudHMgUHJvcGVydHk8VCwgP0Nyb3NzRmFkZWQ8VD4+IHtcbiAgICBzcGVjaWZpY2F0aW9uOiBTdHlsZVByb3BlcnR5U3BlY2lmaWNhdGlvbjtcblxuICAgIGNvbnN0cnVjdG9yKHNwZWNpZmljYXRpb246IFN0eWxlUHJvcGVydHlTcGVjaWZpY2F0aW9uKSB7XG4gICAgICAgIHRoaXMuc3BlY2lmaWNhdGlvbiA9IHNwZWNpZmljYXRpb247XG4gICAgfVxuXG4gICAgcG9zc2libHlFdmFsdWF0ZSh2YWx1ZTogUHJvcGVydHlWYWx1ZTxULCA/Q3Jvc3NGYWRlZDxUPj4sIHBhcmFtZXRlcnM6IEV2YWx1YXRpb25QYXJhbWV0ZXJzKTogP0Nyb3NzRmFkZWQ8VD4ge1xuICAgICAgICBpZiAodmFsdWUudmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5leHByZXNzaW9uLmtpbmQgPT09ICdjb25zdGFudCcpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnN0YW50ID0gdmFsdWUuZXhwcmVzc2lvbi5ldmFsdWF0ZShwYXJhbWV0ZXJzKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jYWxjdWxhdGUoY29uc3RhbnQsIGNvbnN0YW50LCBjb25zdGFudCwgcGFyYW1ldGVycyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhc3NlcnQoIXZhbHVlLmlzRGF0YURyaXZlbigpKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jYWxjdWxhdGUoXG4gICAgICAgICAgICAgICAgdmFsdWUuZXhwcmVzc2lvbi5ldmFsdWF0ZShuZXcgRXZhbHVhdGlvblBhcmFtZXRlcnMoTWF0aC5mbG9vcihwYXJhbWV0ZXJzLnpvb20gLSAxLjApLCBwYXJhbWV0ZXJzKSksXG4gICAgICAgICAgICAgICAgdmFsdWUuZXhwcmVzc2lvbi5ldmFsdWF0ZShuZXcgRXZhbHVhdGlvblBhcmFtZXRlcnMoTWF0aC5mbG9vcihwYXJhbWV0ZXJzLnpvb20pLCBwYXJhbWV0ZXJzKSksXG4gICAgICAgICAgICAgICAgdmFsdWUuZXhwcmVzc2lvbi5ldmFsdWF0ZShuZXcgRXZhbHVhdGlvblBhcmFtZXRlcnMoTWF0aC5mbG9vcihwYXJhbWV0ZXJzLnpvb20gKyAxLjApLCBwYXJhbWV0ZXJzKSksXG4gICAgICAgICAgICAgICAgcGFyYW1ldGVycyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfY2FsY3VsYXRlKG1pbjogVCwgbWlkOiBULCBtYXg6IFQsIHBhcmFtZXRlcnM6IEV2YWx1YXRpb25QYXJhbWV0ZXJzKTogP0Nyb3NzRmFkZWQ8VD4ge1xuICAgICAgICBjb25zdCB6ID0gcGFyYW1ldGVycy56b29tO1xuICAgICAgICByZXR1cm4geiA+IHBhcmFtZXRlcnMuem9vbUhpc3RvcnkubGFzdEludGVnZXJab29tID8geyBmcm9tOiBtaW4sIHRvOiBtaWQgfSA6IHsgZnJvbTogbWF4LCB0bzogbWlkIH07XG4gICAgfVxuXG4gICAgaW50ZXJwb2xhdGUoYTogP0Nyb3NzRmFkZWQ8VD4pOiA/Q3Jvc3NGYWRlZDxUPiB7XG4gICAgICAgIHJldHVybiBhO1xuICAgIH1cbn1cblxuLyoqXG4gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiBgUHJvcGVydHlgIGZvciBgaGVhdG1hcC1jb2xvcmAgYW5kIGBsaW5lLWdyYWRpZW50YC4gSW50ZXJwb2xhdGlvbiBpcyBhIG5vLW9wLCBhbmRcbiAqIGV2YWx1YXRpb24gcmV0dXJucyBhIGJvb2xlYW4gdmFsdWUgaW4gb3JkZXIgdG8gaW5kaWNhdGUgaXRzIHByZXNlbmNlLCBidXQgdGhlIHJlYWxcbiAqIGV2YWx1YXRpb24gaGFwcGVucyBpbiBTdHlsZUxheWVyIGNsYXNzZXMuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuXG5leHBvcnQgY2xhc3MgQ29sb3JSYW1wUHJvcGVydHkgaW1wbGVtZW50cyBQcm9wZXJ0eTxDb2xvciwgYm9vbGVhbj4ge1xuICAgIHNwZWNpZmljYXRpb246IFN0eWxlUHJvcGVydHlTcGVjaWZpY2F0aW9uO1xuXG4gICAgY29uc3RydWN0b3Ioc3BlY2lmaWNhdGlvbjogU3R5bGVQcm9wZXJ0eVNwZWNpZmljYXRpb24pIHtcbiAgICAgICAgdGhpcy5zcGVjaWZpY2F0aW9uID0gc3BlY2lmaWNhdGlvbjtcbiAgICB9XG5cbiAgICBwb3NzaWJseUV2YWx1YXRlKHZhbHVlOiBQcm9wZXJ0eVZhbHVlPENvbG9yLCBib29sZWFuPiwgcGFyYW1ldGVyczogRXZhbHVhdGlvblBhcmFtZXRlcnMpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICEhdmFsdWUuZXhwcmVzc2lvbi5ldmFsdWF0ZShwYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICBpbnRlcnBvbGF0ZSgpOiBib29sZWFuIHsgcmV0dXJuIGZhbHNlOyB9XG59XG5cbi8qKlxuICogYFByb3BlcnRpZXNgIGhvbGRzIG9iamVjdHMgY29udGFpbmluZyBkZWZhdWx0IHZhbHVlcyBmb3IgdGhlIGxheW91dCBvciBwYWludCBwcm9wZXJ0eSBzZXQgb2YgYSBnaXZlblxuICogbGF5ZXIgdHlwZS4gVGhlc2Ugb2JqZWN0cyBhcmUgaW1tdXRhYmxlLCBhbmQgdGhleSBhcmUgdXNlZCBhcyB0aGUgcHJvdG90eXBlcyBmb3IgdGhlIGBfdmFsdWVzYCBtZW1iZXJzIG9mXG4gKiBgVHJhbnNpdGlvbmFibGVgLCBgVHJhbnNpdGlvbmluZ2AsIGBMYXlvdXRgLCBhbmQgYFBvc3NpYmx5RXZhbHVhdGVkYC4gVGhpcyBhbGxvd3MgdGhlc2UgY2xhc3NlcyB0byBhdm9pZFxuICogZG9pbmcgd29yayBpbiB0aGUgY29tbW9uIGNhc2Ugd2hlcmUgYSBwcm9wZXJ0eSBoYXMgbm8gZXhwbGljaXQgdmFsdWUgc2V0IGFuZCBzaG91bGQgYmUgY29uc2lkZXJlZCB0byB0YWtlXG4gKiBvbiB0aGUgZGVmYXVsdCB2YWx1ZTogdXNpbmcgYGZvciAoY29uc3QgcHJvcGVydHkgb2YgT2JqZWN0LmtleXModGhpcy5fdmFsdWVzKSlgLCB0aGV5IGNhbiBpdGVyYXRlIG92ZXJcbiAqIG9ubHkgdGhlIF9vd25fIHByb3BlcnRpZXMgb2YgYF92YWx1ZXNgLCBza2lwcGluZyByZXBlYXRlZCBjYWxjdWxhdGlvbiBvZiB0cmFuc2l0aW9ucyBhbmQgcG9zc2libGUvZmluYWxcbiAqIGV2YWx1YXRpb25zIGZvciBkZWZhdWx0cywgdGhlIHJlc3VsdCBvZiB3aGljaCB3aWxsIGFsd2F5cyBiZSB0aGUgc2FtZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgY2xhc3MgUHJvcGVydGllczxQcm9wczogT2JqZWN0PiB7XG4gICAgcHJvcGVydGllczogUHJvcHM7XG4gICAgZGVmYXVsdFByb3BlcnR5VmFsdWVzOiBQcm9wZXJ0eVZhbHVlczxQcm9wcz47XG4gICAgZGVmYXVsdFRyYW5zaXRpb25hYmxlUHJvcGVydHlWYWx1ZXM6IFRyYW5zaXRpb25hYmxlUHJvcGVydHlWYWx1ZXM8UHJvcHM+O1xuICAgIGRlZmF1bHRUcmFuc2l0aW9uaW5nUHJvcGVydHlWYWx1ZXM6IFRyYW5zaXRpb25pbmdQcm9wZXJ0eVZhbHVlczxQcm9wcz47XG4gICAgZGVmYXVsdFBvc3NpYmx5RXZhbHVhdGVkVmFsdWVzOiBQb3NzaWJseUV2YWx1YXRlZFByb3BlcnR5VmFsdWVzPFByb3BzPjtcblxuICAgIGNvbnN0cnVjdG9yKHByb3BlcnRpZXM6IFByb3BzKSB7XG4gICAgICAgIHRoaXMucHJvcGVydGllcyA9IHByb3BlcnRpZXM7XG4gICAgICAgIHRoaXMuZGVmYXVsdFByb3BlcnR5VmFsdWVzID0gKHt9OiBhbnkpO1xuICAgICAgICB0aGlzLmRlZmF1bHRUcmFuc2l0aW9uYWJsZVByb3BlcnR5VmFsdWVzID0gKHt9OiBhbnkpO1xuICAgICAgICB0aGlzLmRlZmF1bHRUcmFuc2l0aW9uaW5nUHJvcGVydHlWYWx1ZXMgPSAoe306IGFueSk7XG4gICAgICAgIHRoaXMuZGVmYXVsdFBvc3NpYmx5RXZhbHVhdGVkVmFsdWVzID0gKHt9OiBhbnkpO1xuXG4gICAgICAgIGZvciAoY29uc3QgcHJvcGVydHkgaW4gcHJvcGVydGllcykge1xuICAgICAgICAgICAgY29uc3QgcHJvcCA9IHByb3BlcnRpZXNbcHJvcGVydHldO1xuICAgICAgICAgICAgY29uc3QgZGVmYXVsdFByb3BlcnR5VmFsdWUgPSB0aGlzLmRlZmF1bHRQcm9wZXJ0eVZhbHVlc1twcm9wZXJ0eV0gPVxuICAgICAgICAgICAgICAgIG5ldyBQcm9wZXJ0eVZhbHVlKHByb3AsIHVuZGVmaW5lZCk7XG4gICAgICAgICAgICBjb25zdCBkZWZhdWx0VHJhbnNpdGlvbmFibGVQcm9wZXJ0eVZhbHVlID0gdGhpcy5kZWZhdWx0VHJhbnNpdGlvbmFibGVQcm9wZXJ0eVZhbHVlc1twcm9wZXJ0eV0gPVxuICAgICAgICAgICAgICAgIG5ldyBUcmFuc2l0aW9uYWJsZVByb3BlcnR5VmFsdWUocHJvcCk7XG4gICAgICAgICAgICB0aGlzLmRlZmF1bHRUcmFuc2l0aW9uaW5nUHJvcGVydHlWYWx1ZXNbcHJvcGVydHldID1cbiAgICAgICAgICAgICAgICBkZWZhdWx0VHJhbnNpdGlvbmFibGVQcm9wZXJ0eVZhbHVlLnVudHJhbnNpdGlvbmVkKCk7XG4gICAgICAgICAgICB0aGlzLmRlZmF1bHRQb3NzaWJseUV2YWx1YXRlZFZhbHVlc1twcm9wZXJ0eV0gPVxuICAgICAgICAgICAgICAgIGRlZmF1bHRQcm9wZXJ0eVZhbHVlLnBvc3NpYmx5RXZhbHVhdGUoKHt9OiBhbnkpKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxucmVnaXN0ZXIoJ0RhdGFEcml2ZW5Qcm9wZXJ0eScsIERhdGFEcml2ZW5Qcm9wZXJ0eSk7XG5yZWdpc3RlcignRGF0YUNvbnN0YW50UHJvcGVydHknLCBEYXRhQ29uc3RhbnRQcm9wZXJ0eSk7XG5yZWdpc3RlcignQ3Jvc3NGYWRlZERhdGFEcml2ZW5Qcm9wZXJ0eScsIENyb3NzRmFkZWREYXRhRHJpdmVuUHJvcGVydHkpO1xucmVnaXN0ZXIoJ0Nyb3NzRmFkZWRQcm9wZXJ0eScsIENyb3NzRmFkZWRQcm9wZXJ0eSk7XG5yZWdpc3RlcignQ29sb3JSYW1wUHJvcGVydHknLCBDb2xvclJhbXBQcm9wZXJ0eSk7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgeyBlbmRzV2l0aCwgZmlsdGVyT2JqZWN0IH0gZnJvbSAnLi4vdXRpbC91dGlsJztcblxuaW1wb3J0IHN0eWxlU3BlYyBmcm9tICcuLi9zdHlsZS1zcGVjL3JlZmVyZW5jZS9sYXRlc3QnO1xuaW1wb3J0IHtcbiAgICB2YWxpZGF0ZVN0eWxlLFxuICAgIHZhbGlkYXRlTGF5b3V0UHJvcGVydHksXG4gICAgdmFsaWRhdGVQYWludFByb3BlcnR5LFxuICAgIGVtaXRWYWxpZGF0aW9uRXJyb3JzXG59IGZyb20gJy4vdmFsaWRhdGVfc3R5bGUnO1xuaW1wb3J0IHsgRXZlbnRlZCB9IGZyb20gJy4uL3V0aWwvZXZlbnRlZCc7XG5pbXBvcnQgeyBMYXlvdXQsIFRyYW5zaXRpb25hYmxlLCBUcmFuc2l0aW9uaW5nLCBQcm9wZXJ0aWVzLCBQb3NzaWJseUV2YWx1YXRlZFByb3BlcnR5VmFsdWUgfSBmcm9tICcuL3Byb3BlcnRpZXMnO1xuaW1wb3J0IHsgc3VwcG9ydHNQcm9wZXJ0eUV4cHJlc3Npb24gfSBmcm9tICcuLi9zdHlsZS1zcGVjL3V0aWwvcHJvcGVydGllcyc7XG5cbmltcG9ydCB0eXBlIHsgRmVhdHVyZVN0YXRlIH0gZnJvbSAnLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uJztcbmltcG9ydCB0eXBlIHtCdWNrZXR9IGZyb20gJy4uL2RhdGEvYnVja2V0JztcbmltcG9ydCB0eXBlIFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuaW1wb3J0IHR5cGUge0ZlYXR1cmVGaWx0ZXJ9IGZyb20gJy4uL3N0eWxlLXNwZWMvZmVhdHVyZV9maWx0ZXInO1xuaW1wb3J0IHR5cGUge1RyYW5zaXRpb25QYXJhbWV0ZXJzfSBmcm9tICcuL3Byb3BlcnRpZXMnO1xuaW1wb3J0IHR5cGUgRXZhbHVhdGlvblBhcmFtZXRlcnMsIHtDcm9zc2ZhZGVQYXJhbWV0ZXJzfSBmcm9tICcuL2V2YWx1YXRpb25fcGFyYW1ldGVycyc7XG5pbXBvcnQgdHlwZSBUcmFuc2Zvcm0gZnJvbSAnLi4vZ2VvL3RyYW5zZm9ybSc7XG5pbXBvcnQgdHlwZSB7XG4gICAgTGF5ZXJTcGVjaWZpY2F0aW9uLFxuICAgIEZpbHRlclNwZWNpZmljYXRpb25cbn0gZnJvbSAnLi4vc3R5bGUtc3BlYy90eXBlcyc7XG5pbXBvcnQgdHlwZSB7Q3VzdG9tTGF5ZXJJbnRlcmZhY2V9IGZyb20gJy4vc3R5bGVfbGF5ZXIvY3VzdG9tX3N0eWxlX2xheWVyJztcbmltcG9ydCB0eXBlIE1hcCBmcm9tICcuLi91aS9tYXAnO1xuaW1wb3J0IHR5cGUge1N0eWxlU2V0dGVyT3B0aW9uc30gZnJvbSAnLi9zdHlsZSc7XG5cbmNvbnN0IFRSQU5TSVRJT05fU1VGRklYID0gJy10cmFuc2l0aW9uJztcblxuY2xhc3MgU3R5bGVMYXllciBleHRlbmRzIEV2ZW50ZWQge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgbWV0YWRhdGE6IG1peGVkO1xuICAgIHR5cGU6IHN0cmluZztcbiAgICBzb3VyY2U6IHN0cmluZztcbiAgICBzb3VyY2VMYXllcjogP3N0cmluZztcbiAgICBtaW56b29tOiA/bnVtYmVyO1xuICAgIG1heHpvb206ID9udW1iZXI7XG4gICAgZmlsdGVyOiBGaWx0ZXJTcGVjaWZpY2F0aW9uIHwgdm9pZDtcbiAgICB2aXNpYmlsaXR5OiAndmlzaWJsZScgfCAnbm9uZScgfCB2b2lkO1xuICAgIF9jcm9zc2ZhZGVQYXJhbWV0ZXJzOiBDcm9zc2ZhZGVQYXJhbWV0ZXJzO1xuXG4gICAgX3VuZXZhbHVhdGVkTGF5b3V0OiBMYXlvdXQ8YW55PjtcbiAgICArbGF5b3V0OiBtaXhlZDtcblxuICAgIF90cmFuc2l0aW9uYWJsZVBhaW50OiBUcmFuc2l0aW9uYWJsZTxhbnk+O1xuICAgIF90cmFuc2l0aW9uaW5nUGFpbnQ6IFRyYW5zaXRpb25pbmc8YW55PjtcbiAgICArcGFpbnQ6IG1peGVkO1xuXG4gICAgX2ZlYXR1cmVGaWx0ZXI6IEZlYXR1cmVGaWx0ZXI7XG5cbiAgICArcXVlcnlSYWRpdXM6IChidWNrZXQ6IEJ1Y2tldCkgPT4gbnVtYmVyO1xuICAgICtxdWVyeUludGVyc2VjdHNGZWF0dXJlOiAocXVlcnlHZW9tZXRyeTogQXJyYXk8UG9pbnQ+LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZTogVmVjdG9yVGlsZUZlYXR1cmUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlU3RhdGU6IEZlYXR1cmVTdGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlb21ldHJ5OiBBcnJheTxBcnJheTxQb2ludD4+LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgem9vbTogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtOiBUcmFuc2Zvcm0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbHNUb1RpbGVVbml0czogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxQb3NNYXRyaXg6IEZsb2F0MzJBcnJheSkgPT4gYm9vbGVhbiB8IG51bWJlcjtcblxuICAgICtvbkFkZDogPyhtYXA6IE1hcCkgPT4gdm9pZDtcbiAgICArb25SZW1vdmU6ID8obWFwOiBNYXApID0+IHZvaWQ7XG5cbiAgICBjb25zdHJ1Y3RvcihsYXllcjogTGF5ZXJTcGVjaWZpY2F0aW9uIHwgQ3VzdG9tTGF5ZXJJbnRlcmZhY2UsIHByb3BlcnRpZXM6ICRSZWFkT25seTx7bGF5b3V0PzogUHJvcGVydGllczwqPiwgcGFpbnQ/OiBQcm9wZXJ0aWVzPCo+fT4pIHtcbiAgICAgICAgc3VwZXIoKTtcblxuICAgICAgICB0aGlzLmlkID0gbGF5ZXIuaWQ7XG4gICAgICAgIHRoaXMudHlwZSA9IGxheWVyLnR5cGU7XG4gICAgICAgIHRoaXMuX2ZlYXR1cmVGaWx0ZXIgPSAoKSA9PiB0cnVlO1xuXG4gICAgICAgIGlmIChsYXllci50eXBlID09PSAnY3VzdG9tJykgcmV0dXJuO1xuXG4gICAgICAgIGxheWVyID0gKChsYXllcjogYW55KTogTGF5ZXJTcGVjaWZpY2F0aW9uKTtcblxuICAgICAgICB0aGlzLm1ldGFkYXRhID0gbGF5ZXIubWV0YWRhdGE7XG4gICAgICAgIHRoaXMubWluem9vbSA9IGxheWVyLm1pbnpvb207XG4gICAgICAgIHRoaXMubWF4em9vbSA9IGxheWVyLm1heHpvb207XG5cbiAgICAgICAgaWYgKGxheWVyLnR5cGUgIT09ICdiYWNrZ3JvdW5kJykge1xuICAgICAgICAgICAgdGhpcy5zb3VyY2UgPSBsYXllci5zb3VyY2U7XG4gICAgICAgICAgICB0aGlzLnNvdXJjZUxheWVyID0gbGF5ZXJbJ3NvdXJjZS1sYXllciddO1xuICAgICAgICAgICAgdGhpcy5maWx0ZXIgPSBsYXllci5maWx0ZXI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJvcGVydGllcy5sYXlvdXQpIHtcbiAgICAgICAgICAgIHRoaXMuX3VuZXZhbHVhdGVkTGF5b3V0ID0gbmV3IExheW91dChwcm9wZXJ0aWVzLmxheW91dCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJvcGVydGllcy5wYWludCkge1xuICAgICAgICAgICAgdGhpcy5fdHJhbnNpdGlvbmFibGVQYWludCA9IG5ldyBUcmFuc2l0aW9uYWJsZShwcm9wZXJ0aWVzLnBhaW50KTtcblxuICAgICAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiBsYXllci5wYWludCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0UGFpbnRQcm9wZXJ0eShwcm9wZXJ0eSwgbGF5ZXIucGFpbnRbcHJvcGVydHldLCB7dmFsaWRhdGU6IGZhbHNlfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHByb3BlcnR5IGluIGxheWVyLmxheW91dCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0TGF5b3V0UHJvcGVydHkocHJvcGVydHksIGxheWVyLmxheW91dFtwcm9wZXJ0eV0sIHt2YWxpZGF0ZTogZmFsc2V9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5fdHJhbnNpdGlvbmluZ1BhaW50ID0gdGhpcy5fdHJhbnNpdGlvbmFibGVQYWludC51bnRyYW5zaXRpb25lZCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0Q3Jvc3NmYWRlUGFyYW1ldGVycygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Nyb3NzZmFkZVBhcmFtZXRlcnM7XG4gICAgfVxuXG4gICAgZ2V0TGF5b3V0UHJvcGVydHkobmFtZTogc3RyaW5nKSB7XG4gICAgICAgIGlmIChuYW1lID09PSAndmlzaWJpbGl0eScpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnZpc2liaWxpdHk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5fdW5ldmFsdWF0ZWRMYXlvdXQuZ2V0VmFsdWUobmFtZSk7XG4gICAgfVxuXG4gICAgc2V0TGF5b3V0UHJvcGVydHkobmFtZTogc3RyaW5nLCB2YWx1ZTogYW55LCBvcHRpb25zOiBTdHlsZVNldHRlck9wdGlvbnMgPSB7fSkge1xuICAgICAgICBpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3Qga2V5ID0gYGxheWVycy4ke3RoaXMuaWR9LmxheW91dC4ke25hbWV9YDtcbiAgICAgICAgICAgIGlmICh0aGlzLl92YWxpZGF0ZSh2YWxpZGF0ZUxheW91dFByb3BlcnR5LCBrZXksIG5hbWUsIHZhbHVlLCBvcHRpb25zKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChuYW1lID09PSAndmlzaWJpbGl0eScpIHtcbiAgICAgICAgICAgIHRoaXMudmlzaWJpbGl0eSA9IHZhbHVlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fdW5ldmFsdWF0ZWRMYXlvdXQuc2V0VmFsdWUobmFtZSwgdmFsdWUpO1xuICAgIH1cblxuICAgIGdldFBhaW50UHJvcGVydHkobmFtZTogc3RyaW5nKSB7XG4gICAgICAgIGlmIChlbmRzV2l0aChuYW1lLCBUUkFOU0lUSU9OX1NVRkZJWCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl90cmFuc2l0aW9uYWJsZVBhaW50LmdldFRyYW5zaXRpb24obmFtZS5zbGljZSgwLCAtVFJBTlNJVElPTl9TVUZGSVgubGVuZ3RoKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fdHJhbnNpdGlvbmFibGVQYWludC5nZXRWYWx1ZShuYW1lKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNldFBhaW50UHJvcGVydHkobmFtZTogc3RyaW5nLCB2YWx1ZTogbWl4ZWQsIG9wdGlvbnM6IFN0eWxlU2V0dGVyT3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb25zdCBrZXkgPSBgbGF5ZXJzLiR7dGhpcy5pZH0ucGFpbnQuJHtuYW1lfWA7XG4gICAgICAgICAgICBpZiAodGhpcy5fdmFsaWRhdGUodmFsaWRhdGVQYWludFByb3BlcnR5LCBrZXksIG5hbWUsIHZhbHVlLCBvcHRpb25zKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlbmRzV2l0aChuYW1lLCBUUkFOU0lUSU9OX1NVRkZJWCkpIHtcbiAgICAgICAgICAgIHRoaXMuX3RyYW5zaXRpb25hYmxlUGFpbnQuc2V0VHJhbnNpdGlvbihuYW1lLnNsaWNlKDAsIC1UUkFOU0lUSU9OX1NVRkZJWC5sZW5ndGgpLCAodmFsdWU6IGFueSkgfHwgdW5kZWZpbmVkKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGlmIGEgY3Jvc3MtZmFkZWQgdmFsdWUgaXMgY2hhbmdlZCwgd2UgbmVlZCB0byBtYWtlIHN1cmUgdGhlIG5ldyBpY29ucyBnZXQgYWRkZWQgdG8gZWFjaCB0aWxlJ3MgaWNvbkF0bGFzXG4gICAgICAgICAgICAvLyBzbyBhIGNhbGwgdG8gX3VwZGF0ZUxheWVyIGlzIG5lY2Vzc2FyeSwgYW5kIHdlIHJldHVybiB0cnVlIGZyb20gdGhpcyBmdW5jdGlvbiBzbyBpdCBnZXRzIGNhbGxlZCBpblxuICAgICAgICAgICAgLy8gU3R5bGUjc2V0UGFpbnRQcm9wZXJ0eVxuICAgICAgICAgICAgY29uc3QgcHJvcCA9IHRoaXMuX3RyYW5zaXRpb25hYmxlUGFpbnQuX3ZhbHVlc1tuYW1lXTtcbiAgICAgICAgICAgIGNvbnN0IG5ld0Nyb3NzRmFkZWRWYWx1ZSA9IHByb3AucHJvcGVydHkuc3BlY2lmaWNhdGlvbltcInByb3BlcnR5LXR5cGVcIl0gPT09ICdjcm9zcy1mYWRlZC1kYXRhLWRyaXZlbicgJiYgIXByb3AudmFsdWUudmFsdWUgJiYgdmFsdWU7XG5cbiAgICAgICAgICAgIGNvbnN0IHdhc0RhdGFEcml2ZW4gPSB0aGlzLl90cmFuc2l0aW9uYWJsZVBhaW50Ll92YWx1ZXNbbmFtZV0udmFsdWUuaXNEYXRhRHJpdmVuKCk7XG4gICAgICAgICAgICB0aGlzLl90cmFuc2l0aW9uYWJsZVBhaW50LnNldFZhbHVlKG5hbWUsIHZhbHVlKTtcbiAgICAgICAgICAgIGNvbnN0IGlzRGF0YURyaXZlbiA9IHRoaXMuX3RyYW5zaXRpb25hYmxlUGFpbnQuX3ZhbHVlc1tuYW1lXS52YWx1ZS5pc0RhdGFEcml2ZW4oKTtcbiAgICAgICAgICAgIHRoaXMuX2hhbmRsZVNwZWNpYWxQYWludFByb3BlcnR5VXBkYXRlKG5hbWUpO1xuICAgICAgICAgICAgcmV0dXJuIGlzRGF0YURyaXZlbiB8fCB3YXNEYXRhRHJpdmVuIHx8IG5ld0Nyb3NzRmFkZWRWYWx1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9oYW5kbGVTcGVjaWFsUGFpbnRQcm9wZXJ0eVVwZGF0ZShfOiBzdHJpbmcpIHtcbiAgICAgICAgLy8gTm8tb3A7IGNhbiBiZSBvdmVycmlkZGVuIGJ5IGRlcml2ZWQgY2xhc3Nlcy5cbiAgICB9XG5cbiAgICBpc0hpZGRlbih6b29tOiBudW1iZXIpIHtcbiAgICAgICAgaWYgKHRoaXMubWluem9vbSAmJiB6b29tIDwgdGhpcy5taW56b29tKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKHRoaXMubWF4em9vbSAmJiB6b29tID49IHRoaXMubWF4em9vbSkgcmV0dXJuIHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzLnZpc2liaWxpdHkgPT09ICdub25lJztcbiAgICB9XG5cbiAgICB1cGRhdGVUcmFuc2l0aW9ucyhwYXJhbWV0ZXJzOiBUcmFuc2l0aW9uUGFyYW1ldGVycykge1xuICAgICAgICB0aGlzLl90cmFuc2l0aW9uaW5nUGFpbnQgPSB0aGlzLl90cmFuc2l0aW9uYWJsZVBhaW50LnRyYW5zaXRpb25lZChwYXJhbWV0ZXJzLCB0aGlzLl90cmFuc2l0aW9uaW5nUGFpbnQpO1xuICAgIH1cblxuICAgIGhhc1RyYW5zaXRpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90cmFuc2l0aW9uaW5nUGFpbnQuaGFzVHJhbnNpdGlvbigpO1xuICAgIH1cblxuICAgIHJlY2FsY3VsYXRlKHBhcmFtZXRlcnM6IEV2YWx1YXRpb25QYXJhbWV0ZXJzKSB7XG4gICAgICAgIGlmIChwYXJhbWV0ZXJzLmdldENyb3NzZmFkZVBhcmFtZXRlcnMpIHtcbiAgICAgICAgICAgIHRoaXMuX2Nyb3NzZmFkZVBhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzLmdldENyb3NzZmFkZVBhcmFtZXRlcnMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl91bmV2YWx1YXRlZExheW91dCkge1xuICAgICAgICAgICAgKHRoaXM6IGFueSkubGF5b3V0ID0gdGhpcy5fdW5ldmFsdWF0ZWRMYXlvdXQucG9zc2libHlFdmFsdWF0ZShwYXJhbWV0ZXJzKTtcbiAgICAgICAgfVxuXG4gICAgICAgICh0aGlzOiBhbnkpLnBhaW50ID0gdGhpcy5fdHJhbnNpdGlvbmluZ1BhaW50LnBvc3NpYmx5RXZhbHVhdGUocGFyYW1ldGVycyk7XG4gICAgfVxuXG4gICAgc2VyaWFsaXplKCkge1xuICAgICAgICBjb25zdCBvdXRwdXQ6IGFueSA9IHtcbiAgICAgICAgICAgICdpZCc6IHRoaXMuaWQsXG4gICAgICAgICAgICAndHlwZSc6IHRoaXMudHlwZSxcbiAgICAgICAgICAgICdzb3VyY2UnOiB0aGlzLnNvdXJjZSxcbiAgICAgICAgICAgICdzb3VyY2UtbGF5ZXInOiB0aGlzLnNvdXJjZUxheWVyLFxuICAgICAgICAgICAgJ21ldGFkYXRhJzogdGhpcy5tZXRhZGF0YSxcbiAgICAgICAgICAgICdtaW56b29tJzogdGhpcy5taW56b29tLFxuICAgICAgICAgICAgJ21heHpvb20nOiB0aGlzLm1heHpvb20sXG4gICAgICAgICAgICAnZmlsdGVyJzogdGhpcy5maWx0ZXIsXG4gICAgICAgICAgICAnbGF5b3V0JzogdGhpcy5fdW5ldmFsdWF0ZWRMYXlvdXQgJiYgdGhpcy5fdW5ldmFsdWF0ZWRMYXlvdXQuc2VyaWFsaXplKCksXG4gICAgICAgICAgICAncGFpbnQnOiB0aGlzLl90cmFuc2l0aW9uYWJsZVBhaW50ICYmIHRoaXMuX3RyYW5zaXRpb25hYmxlUGFpbnQuc2VyaWFsaXplKClcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAodGhpcy52aXNpYmlsaXR5KSB7XG4gICAgICAgICAgICBvdXRwdXQubGF5b3V0ID0gb3V0cHV0LmxheW91dCB8fCB7fTtcbiAgICAgICAgICAgIG91dHB1dC5sYXlvdXQudmlzaWJpbGl0eSA9IHRoaXMudmlzaWJpbGl0eTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmaWx0ZXJPYmplY3Qob3V0cHV0LCAodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICAhKGtleSA9PT0gJ2xheW91dCcgJiYgIU9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGgpICYmXG4gICAgICAgICAgICAgICAgIShrZXkgPT09ICdwYWludCcgJiYgIU9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBfdmFsaWRhdGUodmFsaWRhdGU6IEZ1bmN0aW9uLCBrZXk6IHN0cmluZywgbmFtZTogc3RyaW5nLCB2YWx1ZTogbWl4ZWQsIG9wdGlvbnM6IFN0eWxlU2V0dGVyT3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMudmFsaWRhdGUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVtaXRWYWxpZGF0aW9uRXJyb3JzKHRoaXMsIHZhbGlkYXRlLmNhbGwodmFsaWRhdGVTdHlsZSwge1xuICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgbGF5ZXJUeXBlOiB0aGlzLnR5cGUsXG4gICAgICAgICAgICBvYmplY3RLZXk6IG5hbWUsXG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIHN0eWxlU3BlYyxcbiAgICAgICAgICAgIC8vIFdvcmthcm91bmQgZm9yIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvbWFwYm94LWdsLWpzL2lzc3Vlcy8yNDA3XG4gICAgICAgICAgICBzdHlsZToge2dseXBoczogdHJ1ZSwgc3ByaXRlOiB0cnVlfVxuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgaXMzRCgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlzVGlsZUNsaXBwZWQoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBoYXNPZmZzY3JlZW5QYXNzKCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmVzaXplKCkge1xuICAgICAgICAvLyBub29wXG4gICAgfVxuXG4gICAgaXNTdGF0ZURlcGVuZGVudCgpIHtcbiAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiAodGhpczogYW55KS5wYWludC5fdmFsdWVzKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9ICh0aGlzOiBhbnkpLnBhaW50LmdldChwcm9wZXJ0eSk7XG4gICAgICAgICAgICBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIFBvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZSkgfHwgIXN1cHBvcnRzUHJvcGVydHlFeHByZXNzaW9uKHZhbHVlLnByb3BlcnR5LnNwZWNpZmljYXRpb24pKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICgodmFsdWUudmFsdWUua2luZCA9PT0gJ3NvdXJjZScgfHwgdmFsdWUudmFsdWUua2luZCA9PT0gJ2NvbXBvc2l0ZScpICYmXG4gICAgICAgICAgICAgICAgdmFsdWUudmFsdWUuaXNTdGF0ZURlcGVuZGVudCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFN0eWxlTGF5ZXI7XG4iLCIvLyBAZmxvd1xuXG4vLyBOb3RlOiBhbGwgXCJzaXplc1wiIGFyZSBtZWFzdXJlZCBpbiBieXRlc1xuXG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5cbmltcG9ydCB0eXBlIHtUcmFuc2ZlcmFibGV9IGZyb20gJy4uL3R5cGVzL3RyYW5zZmVyYWJsZSc7XG5cbmNvbnN0IHZpZXdUeXBlcyA9IHtcbiAgICAnSW50OCc6IEludDhBcnJheSxcbiAgICAnVWludDgnOiBVaW50OEFycmF5LFxuICAgICdJbnQxNic6IEludDE2QXJyYXksXG4gICAgJ1VpbnQxNic6IFVpbnQxNkFycmF5LFxuICAgICdJbnQzMic6IEludDMyQXJyYXksXG4gICAgJ1VpbnQzMic6IFVpbnQzMkFycmF5LFxuICAgICdGbG9hdDMyJzogRmxvYXQzMkFycmF5XG59O1xuXG5leHBvcnQgdHlwZSBWaWV3VHlwZSA9ICRLZXlzPHR5cGVvZiB2aWV3VHlwZXM+O1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIFN0cnVjdCB7XG4gICAgX3BvczE6IG51bWJlcjtcbiAgICBfcG9zMjogbnVtYmVyO1xuICAgIF9wb3M0OiBudW1iZXI7XG4gICAgX3Bvczg6IG51bWJlcjtcbiAgICArX3N0cnVjdEFycmF5OiBTdHJ1Y3RBcnJheTtcblxuICAgIC8vIFRoZSBmb2xsb3dpbmcgcHJvcGVydGllcyBhcmUgZGVmaW5lZCBvbiB0aGUgcHJvdG90eXBlIG9mIHN1YiBjbGFzc2VzLlxuICAgIHNpemU6IG51bWJlcjtcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RydWN0QXJyYXl9IHN0cnVjdEFycmF5IFRoZSBTdHJ1Y3RBcnJheSB0aGUgc3RydWN0IGlzIHN0b3JlZCBpblxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIHN0cnVjdCBpbiB0aGUgU3RydWN0QXJyYXkuXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihzdHJ1Y3RBcnJheTogU3RydWN0QXJyYXksIGluZGV4OiBudW1iZXIpIHtcbiAgICAgICAgKHRoaXM6IGFueSkuX3N0cnVjdEFycmF5ID0gc3RydWN0QXJyYXk7XG4gICAgICAgIHRoaXMuX3BvczEgPSBpbmRleCAqIHRoaXMuc2l6ZTtcbiAgICAgICAgdGhpcy5fcG9zMiA9IHRoaXMuX3BvczEgLyAyO1xuICAgICAgICB0aGlzLl9wb3M0ID0gdGhpcy5fcG9zMSAvIDQ7XG4gICAgICAgIHRoaXMuX3BvczggPSB0aGlzLl9wb3MxIC8gODtcbiAgICB9XG59XG5cbmNvbnN0IERFRkFVTFRfQ0FQQUNJVFkgPSAxMjg7XG5jb25zdCBSRVNJWkVfTVVMVElQTElFUiA9IDU7XG5cbmV4cG9ydCB0eXBlIFN0cnVjdEFycmF5TWVtYmVyID0ge1xuICAgIG5hbWU6IHN0cmluZyxcbiAgICB0eXBlOiBWaWV3VHlwZSxcbiAgICBjb21wb25lbnRzOiBudW1iZXIsXG4gICAgb2Zmc2V0OiBudW1iZXJcbn07XG5cbmV4cG9ydCB0eXBlIFN0cnVjdEFycmF5TGF5b3V0ID0ge1xuICAgIG1lbWJlcnM6IEFycmF5PFN0cnVjdEFycmF5TWVtYmVyPixcbiAgICBzaXplOiBudW1iZXIsXG4gICAgYWxpZ25tZW50OiA/bnVtYmVyXG59XG5cbmV4cG9ydCB0eXBlIFNlcmlhbGl6ZWRTdHJ1Y3RBcnJheSA9IHtcbiAgICBsZW5ndGg6IG51bWJlcixcbiAgICBhcnJheUJ1ZmZlcjogQXJyYXlCdWZmZXJcbn07XG5cbi8qKlxuICogYFN0cnVjdEFycmF5YCBwcm92aWRlcyBhbiBhYnN0cmFjdGlvbiBvdmVyIGBBcnJheUJ1ZmZlcmAgYW5kIGBUeXBlZEFycmF5YFxuICogbWFraW5nIGl0IGJlaGF2ZSBsaWtlIGFuIGFycmF5IG9mIHR5cGVkIHN0cnVjdHMuXG4gKlxuICogQ29uY2VwdHVhbGx5LCBhIFN0cnVjdEFycmF5IGlzIGNvbXByaXNlZCBvZiBlbGVtZW50cywgaS5lLiwgaW5zdGFuY2VzIG9mIGl0c1xuICogYXNzb2NpYXRlZCBzdHJ1Y3QgdHlwZS4gRWFjaCBwYXJ0aWN1bGFyIHN0cnVjdCB0eXBlLCB0b2dldGhlciB3aXRoIGFuXG4gKiBhbGlnbm1lbnQgc2l6ZSwgZGV0ZXJtaW5lcyB0aGUgbWVtb3J5IGxheW91dCBvZiBhIFN0cnVjdEFycmF5IHdob3NlIGVsZW1lbnRzXG4gKiBhcmUgb2YgdGhhdCB0eXBlLiAgVGh1cywgZm9yIGVhY2ggc3VjaCBsYXlvdXQgdGhhdCB3ZSBuZWVkLCB3ZSBoYXZlXG4gKiBhIGNvcnJzZXBvbmRpbmcgU3RydWN0QXJyYXlMYXlvdXQgY2xhc3MsIGluaGVyaXRpbmcgZnJvbSBTdHJ1Y3RBcnJheSBhbmRcbiAqIGltcGxlbWVudGluZyBgZW1wbGFjZUJhY2soKWAgYW5kIGBfcmVmcmVzaFZpZXdzKClgLlxuICpcbiAqIEluIHNvbWUgY2FzZXMsIHdoZXJlIHdlIG5lZWQgdG8gYWNjZXNzIHBhcnRpY3VsYXIgZWxlbWVudHMgb2YgYSBTdHJ1Y3RBcnJheSxcbiAqIHdlIGltcGxlbWVudCBhIG1vcmUgc3BlY2lmaWMgc3ViY2xhc3MgdGhhdCBpbmhlcml0cyBmcm9tIG9uZSBvZiB0aGVcbiAqIFN0cnVjdEFycmF5TGF5b3V0cyBhbmQgYWRkcyBhIGBnZXQoaSk6IFRgIGFjY2Vzc29yIHRoYXQgcmV0dXJucyBhIHN0cnVjdHVyZWRcbiAqIG9iamVjdCB3aG9zZSBwcm9wZXJ0aWVzIGFyZSBwcm94aWVzIGludG8gdGhlIHVuZGVybHlpbmcgbWVtb3J5IHNwYWNlIGZvciB0aGVcbiAqIGktdGggZWxlbWVudC4gIFRoaXMgYWZmb3JkcyB0aGUgY29udmllbmNlIG9mIHdvcmtpbmcgd2l0aCAoc2VlbWluZ2x5KSBwbGFpblxuICogSmF2YXNjcmlwdCBvYmplY3RzIHdpdGhvdXQgdGhlIG92ZXJoZWFkIG9mIHNlcmlhbGl6aW5nL2Rlc2VyaWFsaXppbmcgdGhlbVxuICogaW50byBBcnJheUJ1ZmZlcnMgZm9yIGVmZmljaWVudCB3ZWIgd29ya2VyIHRyYW5zZmVyLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIFN0cnVjdEFycmF5IHtcbiAgICBjYXBhY2l0eTogbnVtYmVyO1xuICAgIGxlbmd0aDogbnVtYmVyO1xuICAgIGlzVHJhbnNmZXJyZWQ6IGJvb2xlYW47XG4gICAgYXJyYXlCdWZmZXI6IEFycmF5QnVmZmVyO1xuICAgIHVpbnQ4OiBVaW50OEFycmF5O1xuXG4gICAgLy8gVGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzIGFyZSBkZWZpbmVkIG9uIHRoZSBwcm90b3R5cGUuXG4gICAgbWVtYmVyczogQXJyYXk8U3RydWN0QXJyYXlNZW1iZXI+O1xuICAgIGJ5dGVzUGVyRWxlbWVudDogbnVtYmVyO1xuICAgICtlbXBsYWNlQmFjazogRnVuY3Rpb247XG4gICAgK2VtcGxhY2U6IEZ1bmN0aW9uO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuaXNUcmFuc2ZlcnJlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNhcGFjaXR5ID0gLTE7XG4gICAgICAgIHRoaXMucmVzaXplKDApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlcmlhbGl6ZSBhIFN0cnVjdEFycmF5IGluc3RhbmNlLiAgU2VyaWFsaXplcyBib3RoIHRoZSByYXcgZGF0YSBhbmQgdGhlXG4gICAgICogbWV0YWRhdGEgbmVlZGVkIHRvIHJlY29uc3RydWN0IHRoZSBTdHJ1Y3RBcnJheSBiYXNlIGNsYXNzIGR1cmluZ1xuICAgICAqIGRlc2VyaWFsaXphdGlvbi5cbiAgICAgKi9cbiAgICBzdGF0aWMgc2VyaWFsaXplKGFycmF5OiBTdHJ1Y3RBcnJheSwgdHJhbnNmZXJhYmxlcz86IEFycmF5PFRyYW5zZmVyYWJsZT4pOiBTZXJpYWxpemVkU3RydWN0QXJyYXkge1xuICAgICAgICBhc3NlcnQoIWFycmF5LmlzVHJhbnNmZXJyZWQpO1xuXG4gICAgICAgIGFycmF5Ll90cmltKCk7XG5cbiAgICAgICAgaWYgKHRyYW5zZmVyYWJsZXMpIHtcbiAgICAgICAgICAgIGFycmF5LmlzVHJhbnNmZXJyZWQgPSB0cnVlO1xuICAgICAgICAgICAgdHJhbnNmZXJhYmxlcy5wdXNoKGFycmF5LmFycmF5QnVmZmVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBsZW5ndGg6IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgICAgIGFycmF5QnVmZmVyOiBhcnJheS5hcnJheUJ1ZmZlcixcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZGVzZXJpYWxpemUoaW5wdXQ6IFNlcmlhbGl6ZWRTdHJ1Y3RBcnJheSkge1xuICAgICAgICBjb25zdCBzdHJ1Y3RBcnJheSA9IE9iamVjdC5jcmVhdGUodGhpcy5wcm90b3R5cGUpO1xuICAgICAgICBzdHJ1Y3RBcnJheS5hcnJheUJ1ZmZlciA9IGlucHV0LmFycmF5QnVmZmVyO1xuICAgICAgICBzdHJ1Y3RBcnJheS5sZW5ndGggPSBpbnB1dC5sZW5ndGg7XG4gICAgICAgIHN0cnVjdEFycmF5LmNhcGFjaXR5ID0gaW5wdXQuYXJyYXlCdWZmZXIuYnl0ZUxlbmd0aCAvIHN0cnVjdEFycmF5LmJ5dGVzUGVyRWxlbWVudDtcbiAgICAgICAgc3RydWN0QXJyYXkuX3JlZnJlc2hWaWV3cygpO1xuICAgICAgICByZXR1cm4gc3RydWN0QXJyYXk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzaXplIHRoZSBhcnJheSB0byBkaXNjYXJkIHVudXNlZCBjYXBhY2l0eS5cbiAgICAgKi9cbiAgICBfdHJpbSgpIHtcbiAgICAgICAgaWYgKHRoaXMubGVuZ3RoICE9PSB0aGlzLmNhcGFjaXR5KSB7XG4gICAgICAgICAgICB0aGlzLmNhcGFjaXR5ID0gdGhpcy5sZW5ndGg7XG4gICAgICAgICAgICB0aGlzLmFycmF5QnVmZmVyID0gdGhpcy5hcnJheUJ1ZmZlci5zbGljZSgwLCB0aGlzLmxlbmd0aCAqIHRoaXMuYnl0ZXNQZXJFbGVtZW50KTtcbiAgICAgICAgICAgIHRoaXMuX3JlZnJlc2hWaWV3cygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzZXRzIHRoZSB0aGUgbGVuZ3RoIG9mIHRoZSBhcnJheSB0byAwIHdpdGhvdXQgZGUtYWxsb2NhdGluZyBjYXBjYWNpdHkuXG4gICAgICovXG4gICAgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMubGVuZ3RoID0gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNpemUgdGhlIGFycmF5LlxuICAgICAqIElmIGBuYCBpcyBncmVhdGVyIHRoYW4gdGhlIGN1cnJlbnQgbGVuZ3RoIHRoZW4gYWRkaXRpb25hbCBlbGVtZW50cyB3aXRoIHVuZGVmaW5lZCB2YWx1ZXMgYXJlIGFkZGVkLlxuICAgICAqIElmIGBuYCBpcyBsZXNzIHRoYW4gdGhlIGN1cnJlbnQgbGVuZ3RoIHRoZW4gdGhlIGFycmF5IHdpbGwgYmUgcmVkdWNlZCB0byB0aGUgZmlyc3QgYG5gIGVsZW1lbnRzLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBuIFRoZSBuZXcgc2l6ZSBvZiB0aGUgYXJyYXkuXG4gICAgICovXG4gICAgcmVzaXplKG46IG51bWJlcikge1xuICAgICAgICBhc3NlcnQoIXRoaXMuaXNUcmFuc2ZlcnJlZCk7XG4gICAgICAgIHRoaXMucmVzZXJ2ZShuKTtcbiAgICAgICAgdGhpcy5sZW5ndGggPSBuO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluZGljYXRlIGEgcGxhbm5lZCBpbmNyZWFzZSBpbiBzaXplLCBzbyB0aGF0IGFueSBuZWNlc3NhcnkgYWxsb2NhdGlvbiBtYXlcbiAgICAgKiBiZSBkb25lIG9uY2UsIGFoZWFkIG9mIHRpbWUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG4gVGhlIGV4cGVjdGVkIHNpemUgb2YgdGhlIGFycmF5LlxuICAgICAqL1xuICAgIHJlc2VydmUobjogbnVtYmVyKSB7XG4gICAgICAgIGlmIChuID4gdGhpcy5jYXBhY2l0eSkge1xuICAgICAgICAgICAgdGhpcy5jYXBhY2l0eSA9IE1hdGgubWF4KG4sIE1hdGguZmxvb3IodGhpcy5jYXBhY2l0eSAqIFJFU0laRV9NVUxUSVBMSUVSKSwgREVGQVVMVF9DQVBBQ0lUWSk7XG4gICAgICAgICAgICB0aGlzLmFycmF5QnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKHRoaXMuY2FwYWNpdHkgKiB0aGlzLmJ5dGVzUGVyRWxlbWVudCk7XG5cbiAgICAgICAgICAgIGNvbnN0IG9sZFVpbnQ4QXJyYXkgPSB0aGlzLnVpbnQ4O1xuICAgICAgICAgICAgdGhpcy5fcmVmcmVzaFZpZXdzKCk7XG4gICAgICAgICAgICBpZiAob2xkVWludDhBcnJheSkgdGhpcy51aW50OC5zZXQob2xkVWludDhBcnJheSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgVHlwZWRBcnJheSB2aWV3cyBmb3IgdGhlIGN1cnJlbnQgQXJyYXlCdWZmZXIuXG4gICAgICovXG4gICAgX3JlZnJlc2hWaWV3cygpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdfcmVmcmVzaFZpZXdzKCkgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBlYWNoIGNvbmNyZXRlIFN0cnVjdEFycmF5IGxheW91dCcpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBHaXZlbiBhIGxpc3Qgb2YgbWVtYmVyIGZpZWxkcywgY3JlYXRlIGEgZnVsbCBTdHJ1Y3RBcnJheUxheW91dCwgaW5cbiAqIHBhcnRpY3VsYXIgY2FsY3VsYXRpbmcgdGhlIGNvcnJlY3QgYnl0ZSBvZmZzZXQgZm9yIGVhY2ggZmllbGQuICBUaGlzIGRhdGFcbiAqIGlzIHVzZWQgYXQgYnVpbGQgdGltZSB0byBnZW5lcmF0ZSBTdHJ1Y3RBcnJheUxheW91dF8qI2VtcGxhY2VCYWNrKCkgYW5kXG4gKiBvdGhlciBhY2Nlc3NvcnMsIGFuZCBhdCBydW50aW1lIGZvciBiaW5kaW5nIHZlcnRleCBidWZmZXIgYXR0cmlidXRlcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBjcmVhdGVMYXlvdXQoXG4gICAgbWVtYmVyczogQXJyYXk8eyBuYW1lOiBzdHJpbmcsIHR5cGU6IFZpZXdUeXBlLCArY29tcG9uZW50cz86IG51bWJlciwgfT4sXG4gICAgYWxpZ25tZW50OiBudW1iZXIgPSAxXG4pOiBTdHJ1Y3RBcnJheUxheW91dCB7XG5cbiAgICBsZXQgb2Zmc2V0ID0gMDtcbiAgICBsZXQgbWF4U2l6ZSA9IDA7XG4gICAgY29uc3QgbGF5b3V0TWVtYmVycyA9IG1lbWJlcnMubWFwKChtZW1iZXIpID0+IHtcbiAgICAgICAgYXNzZXJ0KG1lbWJlci5uYW1lLmxlbmd0aCk7XG4gICAgICAgIGNvbnN0IHR5cGVTaXplID0gc2l6ZU9mKG1lbWJlci50eXBlKTtcbiAgICAgICAgY29uc3QgbWVtYmVyT2Zmc2V0ID0gb2Zmc2V0ID0gYWxpZ24ob2Zmc2V0LCBNYXRoLm1heChhbGlnbm1lbnQsIHR5cGVTaXplKSk7XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudHMgPSBtZW1iZXIuY29tcG9uZW50cyB8fCAxO1xuXG4gICAgICAgIG1heFNpemUgPSBNYXRoLm1heChtYXhTaXplLCB0eXBlU2l6ZSk7XG4gICAgICAgIG9mZnNldCArPSB0eXBlU2l6ZSAqIGNvbXBvbmVudHM7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6IG1lbWJlci5uYW1lLFxuICAgICAgICAgICAgdHlwZTogbWVtYmVyLnR5cGUsXG4gICAgICAgICAgICBjb21wb25lbnRzLFxuICAgICAgICAgICAgb2Zmc2V0OiBtZW1iZXJPZmZzZXQsXG4gICAgICAgIH07XG4gICAgfSk7XG5cbiAgICBjb25zdCBzaXplID0gYWxpZ24ob2Zmc2V0LCBNYXRoLm1heChtYXhTaXplLCBhbGlnbm1lbnQpKTtcblxuICAgIHJldHVybiB7XG4gICAgICAgIG1lbWJlcnM6IGxheW91dE1lbWJlcnMsXG4gICAgICAgIHNpemUsXG4gICAgICAgIGFsaWdubWVudFxuICAgIH07XG59XG5cbmZ1bmN0aW9uIHNpemVPZih0eXBlOiBWaWV3VHlwZSk6IG51bWJlciB7XG4gICAgcmV0dXJuIHZpZXdUeXBlc1t0eXBlXS5CWVRFU19QRVJfRUxFTUVOVDtcbn1cblxuZnVuY3Rpb24gYWxpZ24ob2Zmc2V0OiBudW1iZXIsIHNpemU6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIE1hdGguY2VpbChvZmZzZXQgLyBzaXplKSAqIHNpemU7XG59XG5cbmV4cG9ydCB7IFN0cnVjdEFycmF5LCBTdHJ1Y3QsIHZpZXdUeXBlcywgY3JlYXRlTGF5b3V0IH07XG4iLCIvLyBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkLiBFZGl0IGJ1aWxkL2dlbmVyYXRlLXN0cnVjdC1hcnJheXMuanMsIHRoZW4gcnVuIGB5YXJuIHJ1biBjb2RlZ2VuYC5cbi8vIEBmbG93XG5cbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7U3RydWN0LCBTdHJ1Y3RBcnJheX0gZnJvbSAnLi4vdXRpbC9zdHJ1Y3RfYXJyYXknO1xuaW1wb3J0IHtyZWdpc3Rlcn0gZnJvbSAnLi4vdXRpbC93ZWJfd29ya2VyX3RyYW5zZmVyJztcbmltcG9ydCBQb2ludCBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcblxuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBTdHJ1Y3RBcnJheSBsYXlvdXQ6XG4gKiBbMF06IEludDE2WzJdXG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgU3RydWN0QXJyYXlMYXlvdXQyaTQgZXh0ZW5kcyBTdHJ1Y3RBcnJheSB7XG4gICAgdWludDg6IFVpbnQ4QXJyYXk7XG4gICAgaW50MTY6IEludDE2QXJyYXk7XG5cbiAgICBfcmVmcmVzaFZpZXdzKCkge1xuICAgICAgICB0aGlzLnVpbnQ4ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgICAgIHRoaXMuaW50MTYgPSBuZXcgSW50MTZBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICB9XG5cbiAgICBlbXBsYWNlQmFjayh2MDogbnVtYmVyLCB2MTogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IGkgPSB0aGlzLmxlbmd0aDtcbiAgICAgICAgdGhpcy5yZXNpemUoaSArIDEpO1xuICAgICAgICByZXR1cm4gdGhpcy5lbXBsYWNlKGksIHYwLCB2MSk7XG4gICAgfVxuXG4gICAgZW1wbGFjZShpOiBudW1iZXIsIHYwOiBudW1iZXIsIHYxOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgbzIgPSBpICogMjtcbiAgICAgICAgdGhpcy5pbnQxNltvMiArIDBdID0gdjA7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyAxXSA9IHYxO1xuICAgICAgICByZXR1cm4gaTtcbiAgICB9XG59XG5cblN0cnVjdEFycmF5TGF5b3V0Mmk0LnByb3RvdHlwZS5ieXRlc1BlckVsZW1lbnQgPSA0O1xucmVnaXN0ZXIoJ1N0cnVjdEFycmF5TGF5b3V0Mmk0JywgU3RydWN0QXJyYXlMYXlvdXQyaTQpO1xuXG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIFN0cnVjdEFycmF5IGxheW91dDpcbiAqIFswXTogSW50MTZbNF1cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBTdHJ1Y3RBcnJheUxheW91dDRpOCBleHRlbmRzIFN0cnVjdEFycmF5IHtcbiAgICB1aW50ODogVWludDhBcnJheTtcbiAgICBpbnQxNjogSW50MTZBcnJheTtcblxuICAgIF9yZWZyZXNoVmlld3MoKSB7XG4gICAgICAgIHRoaXMudWludDggPSBuZXcgVWludDhBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICAgICAgdGhpcy5pbnQxNiA9IG5ldyBJbnQxNkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgIH1cblxuICAgIGVtcGxhY2VCYWNrKHYwOiBudW1iZXIsIHYxOiBudW1iZXIsIHYyOiBudW1iZXIsIHYzOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgaSA9IHRoaXMubGVuZ3RoO1xuICAgICAgICB0aGlzLnJlc2l6ZShpICsgMSk7XG4gICAgICAgIHJldHVybiB0aGlzLmVtcGxhY2UoaSwgdjAsIHYxLCB2MiwgdjMpO1xuICAgIH1cblxuICAgIGVtcGxhY2UoaTogbnVtYmVyLCB2MDogbnVtYmVyLCB2MTogbnVtYmVyLCB2MjogbnVtYmVyLCB2MzogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IG8yID0gaSAqIDQ7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyAwXSA9IHYwO1xuICAgICAgICB0aGlzLmludDE2W28yICsgMV0gPSB2MTtcbiAgICAgICAgdGhpcy5pbnQxNltvMiArIDJdID0gdjI7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyAzXSA9IHYzO1xuICAgICAgICByZXR1cm4gaTtcbiAgICB9XG59XG5cblN0cnVjdEFycmF5TGF5b3V0NGk4LnByb3RvdHlwZS5ieXRlc1BlckVsZW1lbnQgPSA4O1xucmVnaXN0ZXIoJ1N0cnVjdEFycmF5TGF5b3V0NGk4JywgU3RydWN0QXJyYXlMYXlvdXQ0aTgpO1xuXG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIFN0cnVjdEFycmF5IGxheW91dDpcbiAqIFswXTogSW50MTZbMl1cbiAqIFs0XTogSW50MTZbNF1cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBTdHJ1Y3RBcnJheUxheW91dDJpNGkxMiBleHRlbmRzIFN0cnVjdEFycmF5IHtcbiAgICB1aW50ODogVWludDhBcnJheTtcbiAgICBpbnQxNjogSW50MTZBcnJheTtcblxuICAgIF9yZWZyZXNoVmlld3MoKSB7XG4gICAgICAgIHRoaXMudWludDggPSBuZXcgVWludDhBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICAgICAgdGhpcy5pbnQxNiA9IG5ldyBJbnQxNkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgIH1cblxuICAgIGVtcGxhY2VCYWNrKHYwOiBudW1iZXIsIHYxOiBudW1iZXIsIHYyOiBudW1iZXIsIHYzOiBudW1iZXIsIHY0OiBudW1iZXIsIHY1OiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgaSA9IHRoaXMubGVuZ3RoO1xuICAgICAgICB0aGlzLnJlc2l6ZShpICsgMSk7XG4gICAgICAgIHJldHVybiB0aGlzLmVtcGxhY2UoaSwgdjAsIHYxLCB2MiwgdjMsIHY0LCB2NSk7XG4gICAgfVxuXG4gICAgZW1wbGFjZShpOiBudW1iZXIsIHYwOiBudW1iZXIsIHYxOiBudW1iZXIsIHYyOiBudW1iZXIsIHYzOiBudW1iZXIsIHY0OiBudW1iZXIsIHY1OiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgbzIgPSBpICogNjtcbiAgICAgICAgdGhpcy5pbnQxNltvMiArIDBdID0gdjA7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyAxXSA9IHYxO1xuICAgICAgICB0aGlzLmludDE2W28yICsgMl0gPSB2MjtcbiAgICAgICAgdGhpcy5pbnQxNltvMiArIDNdID0gdjM7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyA0XSA9IHY0O1xuICAgICAgICB0aGlzLmludDE2W28yICsgNV0gPSB2NTtcbiAgICAgICAgcmV0dXJuIGk7XG4gICAgfVxufVxuXG5TdHJ1Y3RBcnJheUxheW91dDJpNGkxMi5wcm90b3R5cGUuYnl0ZXNQZXJFbGVtZW50ID0gMTI7XG5yZWdpc3RlcignU3RydWN0QXJyYXlMYXlvdXQyaTRpMTInLCBTdHJ1Y3RBcnJheUxheW91dDJpNGkxMik7XG5cblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgU3RydWN0QXJyYXkgbGF5b3V0OlxuICogWzBdOiBJbnQxNls0XVxuICogWzhdOiBVaW50OFs0XVxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIFN0cnVjdEFycmF5TGF5b3V0NGk0dWIxMiBleHRlbmRzIFN0cnVjdEFycmF5IHtcbiAgICB1aW50ODogVWludDhBcnJheTtcbiAgICBpbnQxNjogSW50MTZBcnJheTtcblxuICAgIF9yZWZyZXNoVmlld3MoKSB7XG4gICAgICAgIHRoaXMudWludDggPSBuZXcgVWludDhBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICAgICAgdGhpcy5pbnQxNiA9IG5ldyBJbnQxNkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgIH1cblxuICAgIGVtcGxhY2VCYWNrKHYwOiBudW1iZXIsIHYxOiBudW1iZXIsIHYyOiBudW1iZXIsIHYzOiBudW1iZXIsIHY0OiBudW1iZXIsIHY1OiBudW1iZXIsIHY2OiBudW1iZXIsIHY3OiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgaSA9IHRoaXMubGVuZ3RoO1xuICAgICAgICB0aGlzLnJlc2l6ZShpICsgMSk7XG4gICAgICAgIHJldHVybiB0aGlzLmVtcGxhY2UoaSwgdjAsIHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3KTtcbiAgICB9XG5cbiAgICBlbXBsYWNlKGk6IG51bWJlciwgdjA6IG51bWJlciwgdjE6IG51bWJlciwgdjI6IG51bWJlciwgdjM6IG51bWJlciwgdjQ6IG51bWJlciwgdjU6IG51bWJlciwgdjY6IG51bWJlciwgdjc6IG51bWJlcikge1xuICAgICAgICBjb25zdCBvMiA9IGkgKiA2O1xuICAgICAgICBjb25zdCBvMSA9IGkgKiAxMjtcbiAgICAgICAgdGhpcy5pbnQxNltvMiArIDBdID0gdjA7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyAxXSA9IHYxO1xuICAgICAgICB0aGlzLmludDE2W28yICsgMl0gPSB2MjtcbiAgICAgICAgdGhpcy5pbnQxNltvMiArIDNdID0gdjM7XG4gICAgICAgIHRoaXMudWludDhbbzEgKyA4XSA9IHY0O1xuICAgICAgICB0aGlzLnVpbnQ4W28xICsgOV0gPSB2NTtcbiAgICAgICAgdGhpcy51aW50OFtvMSArIDEwXSA9IHY2O1xuICAgICAgICB0aGlzLnVpbnQ4W28xICsgMTFdID0gdjc7XG4gICAgICAgIHJldHVybiBpO1xuICAgIH1cbn1cblxuU3RydWN0QXJyYXlMYXlvdXQ0aTR1YjEyLnByb3RvdHlwZS5ieXRlc1BlckVsZW1lbnQgPSAxMjtcbnJlZ2lzdGVyKCdTdHJ1Y3RBcnJheUxheW91dDRpNHViMTInLCBTdHJ1Y3RBcnJheUxheW91dDRpNHViMTIpO1xuXG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIFN0cnVjdEFycmF5IGxheW91dDpcbiAqIFswXTogVWludDE2WzhdXG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgU3RydWN0QXJyYXlMYXlvdXQ4dWkxNiBleHRlbmRzIFN0cnVjdEFycmF5IHtcbiAgICB1aW50ODogVWludDhBcnJheTtcbiAgICB1aW50MTY6IFVpbnQxNkFycmF5O1xuXG4gICAgX3JlZnJlc2hWaWV3cygpIHtcbiAgICAgICAgdGhpcy51aW50OCA9IG5ldyBVaW50OEFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgICAgICB0aGlzLnVpbnQxNiA9IG5ldyBVaW50MTZBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICB9XG5cbiAgICBlbXBsYWNlQmFjayh2MDogbnVtYmVyLCB2MTogbnVtYmVyLCB2MjogbnVtYmVyLCB2MzogbnVtYmVyLCB2NDogbnVtYmVyLCB2NTogbnVtYmVyLCB2NjogbnVtYmVyLCB2NzogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IGkgPSB0aGlzLmxlbmd0aDtcbiAgICAgICAgdGhpcy5yZXNpemUoaSArIDEpO1xuICAgICAgICByZXR1cm4gdGhpcy5lbXBsYWNlKGksIHYwLCB2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2Nyk7XG4gICAgfVxuXG4gICAgZW1wbGFjZShpOiBudW1iZXIsIHYwOiBudW1iZXIsIHYxOiBudW1iZXIsIHYyOiBudW1iZXIsIHYzOiBudW1iZXIsIHY0OiBudW1iZXIsIHY1OiBudW1iZXIsIHY2OiBudW1iZXIsIHY3OiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgbzIgPSBpICogODtcbiAgICAgICAgdGhpcy51aW50MTZbbzIgKyAwXSA9IHYwO1xuICAgICAgICB0aGlzLnVpbnQxNltvMiArIDFdID0gdjE7XG4gICAgICAgIHRoaXMudWludDE2W28yICsgMl0gPSB2MjtcbiAgICAgICAgdGhpcy51aW50MTZbbzIgKyAzXSA9IHYzO1xuICAgICAgICB0aGlzLnVpbnQxNltvMiArIDRdID0gdjQ7XG4gICAgICAgIHRoaXMudWludDE2W28yICsgNV0gPSB2NTtcbiAgICAgICAgdGhpcy51aW50MTZbbzIgKyA2XSA9IHY2O1xuICAgICAgICB0aGlzLnVpbnQxNltvMiArIDddID0gdjc7XG4gICAgICAgIHJldHVybiBpO1xuICAgIH1cbn1cblxuU3RydWN0QXJyYXlMYXlvdXQ4dWkxNi5wcm90b3R5cGUuYnl0ZXNQZXJFbGVtZW50ID0gMTY7XG5yZWdpc3RlcignU3RydWN0QXJyYXlMYXlvdXQ4dWkxNicsIFN0cnVjdEFycmF5TGF5b3V0OHVpMTYpO1xuXG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIFN0cnVjdEFycmF5IGxheW91dDpcbiAqIFswXTogSW50MTZbNF1cbiAqIFs4XTogVWludDE2WzRdXG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgU3RydWN0QXJyYXlMYXlvdXQ0aTR1aTE2IGV4dGVuZHMgU3RydWN0QXJyYXkge1xuICAgIHVpbnQ4OiBVaW50OEFycmF5O1xuICAgIGludDE2OiBJbnQxNkFycmF5O1xuICAgIHVpbnQxNjogVWludDE2QXJyYXk7XG5cbiAgICBfcmVmcmVzaFZpZXdzKCkge1xuICAgICAgICB0aGlzLnVpbnQ4ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgICAgIHRoaXMuaW50MTYgPSBuZXcgSW50MTZBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICAgICAgdGhpcy51aW50MTYgPSBuZXcgVWludDE2QXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgfVxuXG4gICAgZW1wbGFjZUJhY2sodjA6IG51bWJlciwgdjE6IG51bWJlciwgdjI6IG51bWJlciwgdjM6IG51bWJlciwgdjQ6IG51bWJlciwgdjU6IG51bWJlciwgdjY6IG51bWJlciwgdjc6IG51bWJlcikge1xuICAgICAgICBjb25zdCBpID0gdGhpcy5sZW5ndGg7XG4gICAgICAgIHRoaXMucmVzaXplKGkgKyAxKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW1wbGFjZShpLCB2MCwgdjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcpO1xuICAgIH1cblxuICAgIGVtcGxhY2UoaTogbnVtYmVyLCB2MDogbnVtYmVyLCB2MTogbnVtYmVyLCB2MjogbnVtYmVyLCB2MzogbnVtYmVyLCB2NDogbnVtYmVyLCB2NTogbnVtYmVyLCB2NjogbnVtYmVyLCB2NzogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IG8yID0gaSAqIDg7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyAwXSA9IHYwO1xuICAgICAgICB0aGlzLmludDE2W28yICsgMV0gPSB2MTtcbiAgICAgICAgdGhpcy5pbnQxNltvMiArIDJdID0gdjI7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyAzXSA9IHYzO1xuICAgICAgICB0aGlzLnVpbnQxNltvMiArIDRdID0gdjQ7XG4gICAgICAgIHRoaXMudWludDE2W28yICsgNV0gPSB2NTtcbiAgICAgICAgdGhpcy51aW50MTZbbzIgKyA2XSA9IHY2O1xuICAgICAgICB0aGlzLnVpbnQxNltvMiArIDddID0gdjc7XG4gICAgICAgIHJldHVybiBpO1xuICAgIH1cbn1cblxuU3RydWN0QXJyYXlMYXlvdXQ0aTR1aTE2LnByb3RvdHlwZS5ieXRlc1BlckVsZW1lbnQgPSAxNjtcbnJlZ2lzdGVyKCdTdHJ1Y3RBcnJheUxheW91dDRpNHVpMTYnLCBTdHJ1Y3RBcnJheUxheW91dDRpNHVpMTYpO1xuXG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIFN0cnVjdEFycmF5IGxheW91dDpcbiAqIFswXTogRmxvYXQzMlszXVxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIFN0cnVjdEFycmF5TGF5b3V0M2YxMiBleHRlbmRzIFN0cnVjdEFycmF5IHtcbiAgICB1aW50ODogVWludDhBcnJheTtcbiAgICBmbG9hdDMyOiBGbG9hdDMyQXJyYXk7XG5cbiAgICBfcmVmcmVzaFZpZXdzKCkge1xuICAgICAgICB0aGlzLnVpbnQ4ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgICAgIHRoaXMuZmxvYXQzMiA9IG5ldyBGbG9hdDMyQXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgfVxuXG4gICAgZW1wbGFjZUJhY2sodjA6IG51bWJlciwgdjE6IG51bWJlciwgdjI6IG51bWJlcikge1xuICAgICAgICBjb25zdCBpID0gdGhpcy5sZW5ndGg7XG4gICAgICAgIHRoaXMucmVzaXplKGkgKyAxKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW1wbGFjZShpLCB2MCwgdjEsIHYyKTtcbiAgICB9XG5cbiAgICBlbXBsYWNlKGk6IG51bWJlciwgdjA6IG51bWJlciwgdjE6IG51bWJlciwgdjI6IG51bWJlcikge1xuICAgICAgICBjb25zdCBvNCA9IGkgKiAzO1xuICAgICAgICB0aGlzLmZsb2F0MzJbbzQgKyAwXSA9IHYwO1xuICAgICAgICB0aGlzLmZsb2F0MzJbbzQgKyAxXSA9IHYxO1xuICAgICAgICB0aGlzLmZsb2F0MzJbbzQgKyAyXSA9IHYyO1xuICAgICAgICByZXR1cm4gaTtcbiAgICB9XG59XG5cblN0cnVjdEFycmF5TGF5b3V0M2YxMi5wcm90b3R5cGUuYnl0ZXNQZXJFbGVtZW50ID0gMTI7XG5yZWdpc3RlcignU3RydWN0QXJyYXlMYXlvdXQzZjEyJywgU3RydWN0QXJyYXlMYXlvdXQzZjEyKTtcblxuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBTdHJ1Y3RBcnJheSBsYXlvdXQ6XG4gKiBbMF06IFVpbnQzMlsxXVxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIFN0cnVjdEFycmF5TGF5b3V0MXVsNCBleHRlbmRzIFN0cnVjdEFycmF5IHtcbiAgICB1aW50ODogVWludDhBcnJheTtcbiAgICB1aW50MzI6IFVpbnQzMkFycmF5O1xuXG4gICAgX3JlZnJlc2hWaWV3cygpIHtcbiAgICAgICAgdGhpcy51aW50OCA9IG5ldyBVaW50OEFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgICAgICB0aGlzLnVpbnQzMiA9IG5ldyBVaW50MzJBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICB9XG5cbiAgICBlbXBsYWNlQmFjayh2MDogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IGkgPSB0aGlzLmxlbmd0aDtcbiAgICAgICAgdGhpcy5yZXNpemUoaSArIDEpO1xuICAgICAgICByZXR1cm4gdGhpcy5lbXBsYWNlKGksIHYwKTtcbiAgICB9XG5cbiAgICBlbXBsYWNlKGk6IG51bWJlciwgdjA6IG51bWJlcikge1xuICAgICAgICBjb25zdCBvNCA9IGkgKiAxO1xuICAgICAgICB0aGlzLnVpbnQzMltvNCArIDBdID0gdjA7XG4gICAgICAgIHJldHVybiBpO1xuICAgIH1cbn1cblxuU3RydWN0QXJyYXlMYXlvdXQxdWw0LnByb3RvdHlwZS5ieXRlc1BlckVsZW1lbnQgPSA0O1xucmVnaXN0ZXIoJ1N0cnVjdEFycmF5TGF5b3V0MXVsNCcsIFN0cnVjdEFycmF5TGF5b3V0MXVsNCk7XG5cblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgU3RydWN0QXJyYXkgbGF5b3V0OlxuICogWzBdOiBJbnQxNls2XVxuICogWzEyXTogVWludDMyWzFdXG4gKiBbMTZdOiBVaW50MTZbMl1cbiAqIFsyMF06IEludDE2WzJdXG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgU3RydWN0QXJyYXlMYXlvdXQ2aTF1bDJ1aTJpMjQgZXh0ZW5kcyBTdHJ1Y3RBcnJheSB7XG4gICAgdWludDg6IFVpbnQ4QXJyYXk7XG4gICAgaW50MTY6IEludDE2QXJyYXk7XG4gICAgdWludDMyOiBVaW50MzJBcnJheTtcbiAgICB1aW50MTY6IFVpbnQxNkFycmF5O1xuXG4gICAgX3JlZnJlc2hWaWV3cygpIHtcbiAgICAgICAgdGhpcy51aW50OCA9IG5ldyBVaW50OEFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgICAgICB0aGlzLmludDE2ID0gbmV3IEludDE2QXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgICAgIHRoaXMudWludDMyID0gbmV3IFVpbnQzMkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgICAgICB0aGlzLnVpbnQxNiA9IG5ldyBVaW50MTZBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICB9XG5cbiAgICBlbXBsYWNlQmFjayh2MDogbnVtYmVyLCB2MTogbnVtYmVyLCB2MjogbnVtYmVyLCB2MzogbnVtYmVyLCB2NDogbnVtYmVyLCB2NTogbnVtYmVyLCB2NjogbnVtYmVyLCB2NzogbnVtYmVyLCB2ODogbnVtYmVyLCB2OTogbnVtYmVyLCB2MTA6IG51bWJlcikge1xuICAgICAgICBjb25zdCBpID0gdGhpcy5sZW5ndGg7XG4gICAgICAgIHRoaXMucmVzaXplKGkgKyAxKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW1wbGFjZShpLCB2MCwgdjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwKTtcbiAgICB9XG5cbiAgICBlbXBsYWNlKGk6IG51bWJlciwgdjA6IG51bWJlciwgdjE6IG51bWJlciwgdjI6IG51bWJlciwgdjM6IG51bWJlciwgdjQ6IG51bWJlciwgdjU6IG51bWJlciwgdjY6IG51bWJlciwgdjc6IG51bWJlciwgdjg6IG51bWJlciwgdjk6IG51bWJlciwgdjEwOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgbzIgPSBpICogMTI7XG4gICAgICAgIGNvbnN0IG80ID0gaSAqIDY7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyAwXSA9IHYwO1xuICAgICAgICB0aGlzLmludDE2W28yICsgMV0gPSB2MTtcbiAgICAgICAgdGhpcy5pbnQxNltvMiArIDJdID0gdjI7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyAzXSA9IHYzO1xuICAgICAgICB0aGlzLmludDE2W28yICsgNF0gPSB2NDtcbiAgICAgICAgdGhpcy5pbnQxNltvMiArIDVdID0gdjU7XG4gICAgICAgIHRoaXMudWludDMyW280ICsgM10gPSB2NjtcbiAgICAgICAgdGhpcy51aW50MTZbbzIgKyA4XSA9IHY3O1xuICAgICAgICB0aGlzLnVpbnQxNltvMiArIDldID0gdjg7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyAxMF0gPSB2OTtcbiAgICAgICAgdGhpcy5pbnQxNltvMiArIDExXSA9IHYxMDtcbiAgICAgICAgcmV0dXJuIGk7XG4gICAgfVxufVxuXG5TdHJ1Y3RBcnJheUxheW91dDZpMXVsMnVpMmkyNC5wcm90b3R5cGUuYnl0ZXNQZXJFbGVtZW50ID0gMjQ7XG5yZWdpc3RlcignU3RydWN0QXJyYXlMYXlvdXQ2aTF1bDJ1aTJpMjQnLCBTdHJ1Y3RBcnJheUxheW91dDZpMXVsMnVpMmkyNCk7XG5cblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgU3RydWN0QXJyYXkgbGF5b3V0OlxuICogWzBdOiBJbnQxNlsyXVxuICogWzRdOiBJbnQxNlsyXVxuICogWzhdOiBJbnQxNlsyXVxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIFN0cnVjdEFycmF5TGF5b3V0MmkyaTJpMTIgZXh0ZW5kcyBTdHJ1Y3RBcnJheSB7XG4gICAgdWludDg6IFVpbnQ4QXJyYXk7XG4gICAgaW50MTY6IEludDE2QXJyYXk7XG5cbiAgICBfcmVmcmVzaFZpZXdzKCkge1xuICAgICAgICB0aGlzLnVpbnQ4ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgICAgIHRoaXMuaW50MTYgPSBuZXcgSW50MTZBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICB9XG5cbiAgICBlbXBsYWNlQmFjayh2MDogbnVtYmVyLCB2MTogbnVtYmVyLCB2MjogbnVtYmVyLCB2MzogbnVtYmVyLCB2NDogbnVtYmVyLCB2NTogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IGkgPSB0aGlzLmxlbmd0aDtcbiAgICAgICAgdGhpcy5yZXNpemUoaSArIDEpO1xuICAgICAgICByZXR1cm4gdGhpcy5lbXBsYWNlKGksIHYwLCB2MSwgdjIsIHYzLCB2NCwgdjUpO1xuICAgIH1cblxuICAgIGVtcGxhY2UoaTogbnVtYmVyLCB2MDogbnVtYmVyLCB2MTogbnVtYmVyLCB2MjogbnVtYmVyLCB2MzogbnVtYmVyLCB2NDogbnVtYmVyLCB2NTogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IG8yID0gaSAqIDY7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyAwXSA9IHYwO1xuICAgICAgICB0aGlzLmludDE2W28yICsgMV0gPSB2MTtcbiAgICAgICAgdGhpcy5pbnQxNltvMiArIDJdID0gdjI7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyAzXSA9IHYzO1xuICAgICAgICB0aGlzLmludDE2W28yICsgNF0gPSB2NDtcbiAgICAgICAgdGhpcy5pbnQxNltvMiArIDVdID0gdjU7XG4gICAgICAgIHJldHVybiBpO1xuICAgIH1cbn1cblxuU3RydWN0QXJyYXlMYXlvdXQyaTJpMmkxMi5wcm90b3R5cGUuYnl0ZXNQZXJFbGVtZW50ID0gMTI7XG5yZWdpc3RlcignU3RydWN0QXJyYXlMYXlvdXQyaTJpMmkxMicsIFN0cnVjdEFycmF5TGF5b3V0MmkyaTJpMTIpO1xuXG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIFN0cnVjdEFycmF5IGxheW91dDpcbiAqIFswXTogVWludDhbMl1cbiAqIFs0XTogRmxvYXQzMlsyXVxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIFN0cnVjdEFycmF5TGF5b3V0MnViMmYxMiBleHRlbmRzIFN0cnVjdEFycmF5IHtcbiAgICB1aW50ODogVWludDhBcnJheTtcbiAgICBmbG9hdDMyOiBGbG9hdDMyQXJyYXk7XG5cbiAgICBfcmVmcmVzaFZpZXdzKCkge1xuICAgICAgICB0aGlzLnVpbnQ4ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgICAgIHRoaXMuZmxvYXQzMiA9IG5ldyBGbG9hdDMyQXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgfVxuXG4gICAgZW1wbGFjZUJhY2sodjA6IG51bWJlciwgdjE6IG51bWJlciwgdjI6IG51bWJlciwgdjM6IG51bWJlcikge1xuICAgICAgICBjb25zdCBpID0gdGhpcy5sZW5ndGg7XG4gICAgICAgIHRoaXMucmVzaXplKGkgKyAxKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW1wbGFjZShpLCB2MCwgdjEsIHYyLCB2Myk7XG4gICAgfVxuXG4gICAgZW1wbGFjZShpOiBudW1iZXIsIHYwOiBudW1iZXIsIHYxOiBudW1iZXIsIHYyOiBudW1iZXIsIHYzOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgbzEgPSBpICogMTI7XG4gICAgICAgIGNvbnN0IG80ID0gaSAqIDM7XG4gICAgICAgIHRoaXMudWludDhbbzEgKyAwXSA9IHYwO1xuICAgICAgICB0aGlzLnVpbnQ4W28xICsgMV0gPSB2MTtcbiAgICAgICAgdGhpcy5mbG9hdDMyW280ICsgMV0gPSB2MjtcbiAgICAgICAgdGhpcy5mbG9hdDMyW280ICsgMl0gPSB2MztcbiAgICAgICAgcmV0dXJuIGk7XG4gICAgfVxufVxuXG5TdHJ1Y3RBcnJheUxheW91dDJ1YjJmMTIucHJvdG90eXBlLmJ5dGVzUGVyRWxlbWVudCA9IDEyO1xucmVnaXN0ZXIoJ1N0cnVjdEFycmF5TGF5b3V0MnViMmYxMicsIFN0cnVjdEFycmF5TGF5b3V0MnViMmYxMik7XG5cblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgU3RydWN0QXJyYXkgbGF5b3V0OlxuICogWzBdOiBJbnQxNlsyXVxuICogWzRdOiBVaW50MTZbMl1cbiAqIFs4XTogVWludDMyWzNdXG4gKiBbMjBdOiBVaW50MTZbM11cbiAqIFsyOF06IEZsb2F0MzJbMl1cbiAqIFszNl06IFVpbnQ4WzJdXG4gKiBbNDBdOiBVaW50MzJbMV1cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBTdHJ1Y3RBcnJheUxheW91dDJpMnVpM3VsM3VpMmYydWIxdWw0NCBleHRlbmRzIFN0cnVjdEFycmF5IHtcbiAgICB1aW50ODogVWludDhBcnJheTtcbiAgICBpbnQxNjogSW50MTZBcnJheTtcbiAgICB1aW50MTY6IFVpbnQxNkFycmF5O1xuICAgIHVpbnQzMjogVWludDMyQXJyYXk7XG4gICAgZmxvYXQzMjogRmxvYXQzMkFycmF5O1xuXG4gICAgX3JlZnJlc2hWaWV3cygpIHtcbiAgICAgICAgdGhpcy51aW50OCA9IG5ldyBVaW50OEFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgICAgICB0aGlzLmludDE2ID0gbmV3IEludDE2QXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgICAgIHRoaXMudWludDE2ID0gbmV3IFVpbnQxNkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgICAgICB0aGlzLnVpbnQzMiA9IG5ldyBVaW50MzJBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICAgICAgdGhpcy5mbG9hdDMyID0gbmV3IEZsb2F0MzJBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICB9XG5cbiAgICBlbXBsYWNlQmFjayh2MDogbnVtYmVyLCB2MTogbnVtYmVyLCB2MjogbnVtYmVyLCB2MzogbnVtYmVyLCB2NDogbnVtYmVyLCB2NTogbnVtYmVyLCB2NjogbnVtYmVyLCB2NzogbnVtYmVyLCB2ODogbnVtYmVyLCB2OTogbnVtYmVyLCB2MTA6IG51bWJlciwgdjExOiBudW1iZXIsIHYxMjogbnVtYmVyLCB2MTM6IG51bWJlciwgdjE0OiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgaSA9IHRoaXMubGVuZ3RoO1xuICAgICAgICB0aGlzLnJlc2l6ZShpICsgMSk7XG4gICAgICAgIHJldHVybiB0aGlzLmVtcGxhY2UoaSwgdjAsIHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0KTtcbiAgICB9XG5cbiAgICBlbXBsYWNlKGk6IG51bWJlciwgdjA6IG51bWJlciwgdjE6IG51bWJlciwgdjI6IG51bWJlciwgdjM6IG51bWJlciwgdjQ6IG51bWJlciwgdjU6IG51bWJlciwgdjY6IG51bWJlciwgdjc6IG51bWJlciwgdjg6IG51bWJlciwgdjk6IG51bWJlciwgdjEwOiBudW1iZXIsIHYxMTogbnVtYmVyLCB2MTI6IG51bWJlciwgdjEzOiBudW1iZXIsIHYxNDogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IG8yID0gaSAqIDIyO1xuICAgICAgICBjb25zdCBvNCA9IGkgKiAxMTtcbiAgICAgICAgY29uc3QgbzEgPSBpICogNDQ7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyAwXSA9IHYwO1xuICAgICAgICB0aGlzLmludDE2W28yICsgMV0gPSB2MTtcbiAgICAgICAgdGhpcy51aW50MTZbbzIgKyAyXSA9IHYyO1xuICAgICAgICB0aGlzLnVpbnQxNltvMiArIDNdID0gdjM7XG4gICAgICAgIHRoaXMudWludDMyW280ICsgMl0gPSB2NDtcbiAgICAgICAgdGhpcy51aW50MzJbbzQgKyAzXSA9IHY1O1xuICAgICAgICB0aGlzLnVpbnQzMltvNCArIDRdID0gdjY7XG4gICAgICAgIHRoaXMudWludDE2W28yICsgMTBdID0gdjc7XG4gICAgICAgIHRoaXMudWludDE2W28yICsgMTFdID0gdjg7XG4gICAgICAgIHRoaXMudWludDE2W28yICsgMTJdID0gdjk7XG4gICAgICAgIHRoaXMuZmxvYXQzMltvNCArIDddID0gdjEwO1xuICAgICAgICB0aGlzLmZsb2F0MzJbbzQgKyA4XSA9IHYxMTtcbiAgICAgICAgdGhpcy51aW50OFtvMSArIDM2XSA9IHYxMjtcbiAgICAgICAgdGhpcy51aW50OFtvMSArIDM3XSA9IHYxMztcbiAgICAgICAgdGhpcy51aW50MzJbbzQgKyAxMF0gPSB2MTQ7XG4gICAgICAgIHJldHVybiBpO1xuICAgIH1cbn1cblxuU3RydWN0QXJyYXlMYXlvdXQyaTJ1aTN1bDN1aTJmMnViMXVsNDQucHJvdG90eXBlLmJ5dGVzUGVyRWxlbWVudCA9IDQ0O1xucmVnaXN0ZXIoJ1N0cnVjdEFycmF5TGF5b3V0MmkydWkzdWwzdWkyZjJ1YjF1bDQ0JywgU3RydWN0QXJyYXlMYXlvdXQyaTJ1aTN1bDN1aTJmMnViMXVsNDQpO1xuXG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIFN0cnVjdEFycmF5IGxheW91dDpcbiAqIFswXTogSW50MTZbNl1cbiAqIFsxMl06IFVpbnQxNls5XVxuICogWzMyXTogVWludDMyWzFdXG4gKiBbMzZdOiBGbG9hdDMyWzJdXG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgU3RydWN0QXJyYXlMYXlvdXQ2aTl1aTF1bDJmNDQgZXh0ZW5kcyBTdHJ1Y3RBcnJheSB7XG4gICAgdWludDg6IFVpbnQ4QXJyYXk7XG4gICAgaW50MTY6IEludDE2QXJyYXk7XG4gICAgdWludDE2OiBVaW50MTZBcnJheTtcbiAgICB1aW50MzI6IFVpbnQzMkFycmF5O1xuICAgIGZsb2F0MzI6IEZsb2F0MzJBcnJheTtcblxuICAgIF9yZWZyZXNoVmlld3MoKSB7XG4gICAgICAgIHRoaXMudWludDggPSBuZXcgVWludDhBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICAgICAgdGhpcy5pbnQxNiA9IG5ldyBJbnQxNkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgICAgICB0aGlzLnVpbnQxNiA9IG5ldyBVaW50MTZBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICAgICAgdGhpcy51aW50MzIgPSBuZXcgVWludDMyQXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgICAgIHRoaXMuZmxvYXQzMiA9IG5ldyBGbG9hdDMyQXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgfVxuXG4gICAgZW1wbGFjZUJhY2sodjA6IG51bWJlciwgdjE6IG51bWJlciwgdjI6IG51bWJlciwgdjM6IG51bWJlciwgdjQ6IG51bWJlciwgdjU6IG51bWJlciwgdjY6IG51bWJlciwgdjc6IG51bWJlciwgdjg6IG51bWJlciwgdjk6IG51bWJlciwgdjEwOiBudW1iZXIsIHYxMTogbnVtYmVyLCB2MTI6IG51bWJlciwgdjEzOiBudW1iZXIsIHYxNDogbnVtYmVyLCB2MTU6IG51bWJlciwgdjE2OiBudW1iZXIsIHYxNzogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IGkgPSB0aGlzLmxlbmd0aDtcbiAgICAgICAgdGhpcy5yZXNpemUoaSArIDEpO1xuICAgICAgICByZXR1cm4gdGhpcy5lbXBsYWNlKGksIHYwLCB2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsIHYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTYsIHYxNyk7XG4gICAgfVxuXG4gICAgZW1wbGFjZShpOiBudW1iZXIsIHYwOiBudW1iZXIsIHYxOiBudW1iZXIsIHYyOiBudW1iZXIsIHYzOiBudW1iZXIsIHY0OiBudW1iZXIsIHY1OiBudW1iZXIsIHY2OiBudW1iZXIsIHY3OiBudW1iZXIsIHY4OiBudW1iZXIsIHY5OiBudW1iZXIsIHYxMDogbnVtYmVyLCB2MTE6IG51bWJlciwgdjEyOiBudW1iZXIsIHYxMzogbnVtYmVyLCB2MTQ6IG51bWJlciwgdjE1OiBudW1iZXIsIHYxNjogbnVtYmVyLCB2MTc6IG51bWJlcikge1xuICAgICAgICBjb25zdCBvMiA9IGkgKiAyMjtcbiAgICAgICAgY29uc3QgbzQgPSBpICogMTE7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyAwXSA9IHYwO1xuICAgICAgICB0aGlzLmludDE2W28yICsgMV0gPSB2MTtcbiAgICAgICAgdGhpcy5pbnQxNltvMiArIDJdID0gdjI7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyAzXSA9IHYzO1xuICAgICAgICB0aGlzLmludDE2W28yICsgNF0gPSB2NDtcbiAgICAgICAgdGhpcy5pbnQxNltvMiArIDVdID0gdjU7XG4gICAgICAgIHRoaXMudWludDE2W28yICsgNl0gPSB2NjtcbiAgICAgICAgdGhpcy51aW50MTZbbzIgKyA3XSA9IHY3O1xuICAgICAgICB0aGlzLnVpbnQxNltvMiArIDhdID0gdjg7XG4gICAgICAgIHRoaXMudWludDE2W28yICsgOV0gPSB2OTtcbiAgICAgICAgdGhpcy51aW50MTZbbzIgKyAxMF0gPSB2MTA7XG4gICAgICAgIHRoaXMudWludDE2W28yICsgMTFdID0gdjExO1xuICAgICAgICB0aGlzLnVpbnQxNltvMiArIDEyXSA9IHYxMjtcbiAgICAgICAgdGhpcy51aW50MTZbbzIgKyAxM10gPSB2MTM7XG4gICAgICAgIHRoaXMudWludDE2W28yICsgMTRdID0gdjE0O1xuICAgICAgICB0aGlzLnVpbnQzMltvNCArIDhdID0gdjE1O1xuICAgICAgICB0aGlzLmZsb2F0MzJbbzQgKyA5XSA9IHYxNjtcbiAgICAgICAgdGhpcy5mbG9hdDMyW280ICsgMTBdID0gdjE3O1xuICAgICAgICByZXR1cm4gaTtcbiAgICB9XG59XG5cblN0cnVjdEFycmF5TGF5b3V0Nmk5dWkxdWwyZjQ0LnByb3RvdHlwZS5ieXRlc1BlckVsZW1lbnQgPSA0NDtcbnJlZ2lzdGVyKCdTdHJ1Y3RBcnJheUxheW91dDZpOXVpMXVsMmY0NCcsIFN0cnVjdEFycmF5TGF5b3V0Nmk5dWkxdWwyZjQ0KTtcblxuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBTdHJ1Y3RBcnJheSBsYXlvdXQ6XG4gKiBbMF06IEZsb2F0MzJbMV1cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBTdHJ1Y3RBcnJheUxheW91dDFmNCBleHRlbmRzIFN0cnVjdEFycmF5IHtcbiAgICB1aW50ODogVWludDhBcnJheTtcbiAgICBmbG9hdDMyOiBGbG9hdDMyQXJyYXk7XG5cbiAgICBfcmVmcmVzaFZpZXdzKCkge1xuICAgICAgICB0aGlzLnVpbnQ4ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgICAgIHRoaXMuZmxvYXQzMiA9IG5ldyBGbG9hdDMyQXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgfVxuXG4gICAgZW1wbGFjZUJhY2sodjA6IG51bWJlcikge1xuICAgICAgICBjb25zdCBpID0gdGhpcy5sZW5ndGg7XG4gICAgICAgIHRoaXMucmVzaXplKGkgKyAxKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW1wbGFjZShpLCB2MCk7XG4gICAgfVxuXG4gICAgZW1wbGFjZShpOiBudW1iZXIsIHYwOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgbzQgPSBpICogMTtcbiAgICAgICAgdGhpcy5mbG9hdDMyW280ICsgMF0gPSB2MDtcbiAgICAgICAgcmV0dXJuIGk7XG4gICAgfVxufVxuXG5TdHJ1Y3RBcnJheUxheW91dDFmNC5wcm90b3R5cGUuYnl0ZXNQZXJFbGVtZW50ID0gNDtcbnJlZ2lzdGVyKCdTdHJ1Y3RBcnJheUxheW91dDFmNCcsIFN0cnVjdEFycmF5TGF5b3V0MWY0KTtcblxuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBTdHJ1Y3RBcnJheSBsYXlvdXQ6XG4gKiBbMF06IEludDE2WzNdXG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgU3RydWN0QXJyYXlMYXlvdXQzaTYgZXh0ZW5kcyBTdHJ1Y3RBcnJheSB7XG4gICAgdWludDg6IFVpbnQ4QXJyYXk7XG4gICAgaW50MTY6IEludDE2QXJyYXk7XG5cbiAgICBfcmVmcmVzaFZpZXdzKCkge1xuICAgICAgICB0aGlzLnVpbnQ4ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgICAgIHRoaXMuaW50MTYgPSBuZXcgSW50MTZBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICB9XG5cbiAgICBlbXBsYWNlQmFjayh2MDogbnVtYmVyLCB2MTogbnVtYmVyLCB2MjogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IGkgPSB0aGlzLmxlbmd0aDtcbiAgICAgICAgdGhpcy5yZXNpemUoaSArIDEpO1xuICAgICAgICByZXR1cm4gdGhpcy5lbXBsYWNlKGksIHYwLCB2MSwgdjIpO1xuICAgIH1cblxuICAgIGVtcGxhY2UoaTogbnVtYmVyLCB2MDogbnVtYmVyLCB2MTogbnVtYmVyLCB2MjogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IG8yID0gaSAqIDM7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyAwXSA9IHYwO1xuICAgICAgICB0aGlzLmludDE2W28yICsgMV0gPSB2MTtcbiAgICAgICAgdGhpcy5pbnQxNltvMiArIDJdID0gdjI7XG4gICAgICAgIHJldHVybiBpO1xuICAgIH1cbn1cblxuU3RydWN0QXJyYXlMYXlvdXQzaTYucHJvdG90eXBlLmJ5dGVzUGVyRWxlbWVudCA9IDY7XG5yZWdpc3RlcignU3RydWN0QXJyYXlMYXlvdXQzaTYnLCBTdHJ1Y3RBcnJheUxheW91dDNpNik7XG5cblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgU3RydWN0QXJyYXkgbGF5b3V0OlxuICogWzBdOiBVaW50MzJbMV1cbiAqIFs0XTogVWludDE2WzJdXG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgU3RydWN0QXJyYXlMYXlvdXQxdWwydWk4IGV4dGVuZHMgU3RydWN0QXJyYXkge1xuICAgIHVpbnQ4OiBVaW50OEFycmF5O1xuICAgIHVpbnQzMjogVWludDMyQXJyYXk7XG4gICAgdWludDE2OiBVaW50MTZBcnJheTtcblxuICAgIF9yZWZyZXNoVmlld3MoKSB7XG4gICAgICAgIHRoaXMudWludDggPSBuZXcgVWludDhBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICAgICAgdGhpcy51aW50MzIgPSBuZXcgVWludDMyQXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgICAgIHRoaXMudWludDE2ID0gbmV3IFVpbnQxNkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgIH1cblxuICAgIGVtcGxhY2VCYWNrKHYwOiBudW1iZXIsIHYxOiBudW1iZXIsIHYyOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgaSA9IHRoaXMubGVuZ3RoO1xuICAgICAgICB0aGlzLnJlc2l6ZShpICsgMSk7XG4gICAgICAgIHJldHVybiB0aGlzLmVtcGxhY2UoaSwgdjAsIHYxLCB2Mik7XG4gICAgfVxuXG4gICAgZW1wbGFjZShpOiBudW1iZXIsIHYwOiBudW1iZXIsIHYxOiBudW1iZXIsIHYyOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgbzQgPSBpICogMjtcbiAgICAgICAgY29uc3QgbzIgPSBpICogNDtcbiAgICAgICAgdGhpcy51aW50MzJbbzQgKyAwXSA9IHYwO1xuICAgICAgICB0aGlzLnVpbnQxNltvMiArIDJdID0gdjE7XG4gICAgICAgIHRoaXMudWludDE2W28yICsgM10gPSB2MjtcbiAgICAgICAgcmV0dXJuIGk7XG4gICAgfVxufVxuXG5TdHJ1Y3RBcnJheUxheW91dDF1bDJ1aTgucHJvdG90eXBlLmJ5dGVzUGVyRWxlbWVudCA9IDg7XG5yZWdpc3RlcignU3RydWN0QXJyYXlMYXlvdXQxdWwydWk4JywgU3RydWN0QXJyYXlMYXlvdXQxdWwydWk4KTtcblxuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBTdHJ1Y3RBcnJheSBsYXlvdXQ6XG4gKiBbMF06IFVpbnQxNlszXVxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIFN0cnVjdEFycmF5TGF5b3V0M3VpNiBleHRlbmRzIFN0cnVjdEFycmF5IHtcbiAgICB1aW50ODogVWludDhBcnJheTtcbiAgICB1aW50MTY6IFVpbnQxNkFycmF5O1xuXG4gICAgX3JlZnJlc2hWaWV3cygpIHtcbiAgICAgICAgdGhpcy51aW50OCA9IG5ldyBVaW50OEFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgICAgICB0aGlzLnVpbnQxNiA9IG5ldyBVaW50MTZBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICB9XG5cbiAgICBlbXBsYWNlQmFjayh2MDogbnVtYmVyLCB2MTogbnVtYmVyLCB2MjogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IGkgPSB0aGlzLmxlbmd0aDtcbiAgICAgICAgdGhpcy5yZXNpemUoaSArIDEpO1xuICAgICAgICByZXR1cm4gdGhpcy5lbXBsYWNlKGksIHYwLCB2MSwgdjIpO1xuICAgIH1cblxuICAgIGVtcGxhY2UoaTogbnVtYmVyLCB2MDogbnVtYmVyLCB2MTogbnVtYmVyLCB2MjogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IG8yID0gaSAqIDM7XG4gICAgICAgIHRoaXMudWludDE2W28yICsgMF0gPSB2MDtcbiAgICAgICAgdGhpcy51aW50MTZbbzIgKyAxXSA9IHYxO1xuICAgICAgICB0aGlzLnVpbnQxNltvMiArIDJdID0gdjI7XG4gICAgICAgIHJldHVybiBpO1xuICAgIH1cbn1cblxuU3RydWN0QXJyYXlMYXlvdXQzdWk2LnByb3RvdHlwZS5ieXRlc1BlckVsZW1lbnQgPSA2O1xucmVnaXN0ZXIoJ1N0cnVjdEFycmF5TGF5b3V0M3VpNicsIFN0cnVjdEFycmF5TGF5b3V0M3VpNik7XG5cblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgU3RydWN0QXJyYXkgbGF5b3V0OlxuICogWzBdOiBVaW50MTZbMl1cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBTdHJ1Y3RBcnJheUxheW91dDJ1aTQgZXh0ZW5kcyBTdHJ1Y3RBcnJheSB7XG4gICAgdWludDg6IFVpbnQ4QXJyYXk7XG4gICAgdWludDE2OiBVaW50MTZBcnJheTtcblxuICAgIF9yZWZyZXNoVmlld3MoKSB7XG4gICAgICAgIHRoaXMudWludDggPSBuZXcgVWludDhBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICAgICAgdGhpcy51aW50MTYgPSBuZXcgVWludDE2QXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgfVxuXG4gICAgZW1wbGFjZUJhY2sodjA6IG51bWJlciwgdjE6IG51bWJlcikge1xuICAgICAgICBjb25zdCBpID0gdGhpcy5sZW5ndGg7XG4gICAgICAgIHRoaXMucmVzaXplKGkgKyAxKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW1wbGFjZShpLCB2MCwgdjEpO1xuICAgIH1cblxuICAgIGVtcGxhY2UoaTogbnVtYmVyLCB2MDogbnVtYmVyLCB2MTogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IG8yID0gaSAqIDI7XG4gICAgICAgIHRoaXMudWludDE2W28yICsgMF0gPSB2MDtcbiAgICAgICAgdGhpcy51aW50MTZbbzIgKyAxXSA9IHYxO1xuICAgICAgICByZXR1cm4gaTtcbiAgICB9XG59XG5cblN0cnVjdEFycmF5TGF5b3V0MnVpNC5wcm90b3R5cGUuYnl0ZXNQZXJFbGVtZW50ID0gNDtcbnJlZ2lzdGVyKCdTdHJ1Y3RBcnJheUxheW91dDJ1aTQnLCBTdHJ1Y3RBcnJheUxheW91dDJ1aTQpO1xuXG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIFN0cnVjdEFycmF5IGxheW91dDpcbiAqIFswXTogVWludDE2WzFdXG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgU3RydWN0QXJyYXlMYXlvdXQxdWkyIGV4dGVuZHMgU3RydWN0QXJyYXkge1xuICAgIHVpbnQ4OiBVaW50OEFycmF5O1xuICAgIHVpbnQxNjogVWludDE2QXJyYXk7XG5cbiAgICBfcmVmcmVzaFZpZXdzKCkge1xuICAgICAgICB0aGlzLnVpbnQ4ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgICAgIHRoaXMudWludDE2ID0gbmV3IFVpbnQxNkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgIH1cblxuICAgIGVtcGxhY2VCYWNrKHYwOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgaSA9IHRoaXMubGVuZ3RoO1xuICAgICAgICB0aGlzLnJlc2l6ZShpICsgMSk7XG4gICAgICAgIHJldHVybiB0aGlzLmVtcGxhY2UoaSwgdjApO1xuICAgIH1cblxuICAgIGVtcGxhY2UoaTogbnVtYmVyLCB2MDogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IG8yID0gaSAqIDE7XG4gICAgICAgIHRoaXMudWludDE2W28yICsgMF0gPSB2MDtcbiAgICAgICAgcmV0dXJuIGk7XG4gICAgfVxufVxuXG5TdHJ1Y3RBcnJheUxheW91dDF1aTIucHJvdG90eXBlLmJ5dGVzUGVyRWxlbWVudCA9IDI7XG5yZWdpc3RlcignU3RydWN0QXJyYXlMYXlvdXQxdWkyJywgU3RydWN0QXJyYXlMYXlvdXQxdWkyKTtcblxuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBTdHJ1Y3RBcnJheSBsYXlvdXQ6XG4gKiBbMF06IEZsb2F0MzJbMl1cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBTdHJ1Y3RBcnJheUxheW91dDJmOCBleHRlbmRzIFN0cnVjdEFycmF5IHtcbiAgICB1aW50ODogVWludDhBcnJheTtcbiAgICBmbG9hdDMyOiBGbG9hdDMyQXJyYXk7XG5cbiAgICBfcmVmcmVzaFZpZXdzKCkge1xuICAgICAgICB0aGlzLnVpbnQ4ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgICAgIHRoaXMuZmxvYXQzMiA9IG5ldyBGbG9hdDMyQXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgfVxuXG4gICAgZW1wbGFjZUJhY2sodjA6IG51bWJlciwgdjE6IG51bWJlcikge1xuICAgICAgICBjb25zdCBpID0gdGhpcy5sZW5ndGg7XG4gICAgICAgIHRoaXMucmVzaXplKGkgKyAxKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW1wbGFjZShpLCB2MCwgdjEpO1xuICAgIH1cblxuICAgIGVtcGxhY2UoaTogbnVtYmVyLCB2MDogbnVtYmVyLCB2MTogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IG80ID0gaSAqIDI7XG4gICAgICAgIHRoaXMuZmxvYXQzMltvNCArIDBdID0gdjA7XG4gICAgICAgIHRoaXMuZmxvYXQzMltvNCArIDFdID0gdjE7XG4gICAgICAgIHJldHVybiBpO1xuICAgIH1cbn1cblxuU3RydWN0QXJyYXlMYXlvdXQyZjgucHJvdG90eXBlLmJ5dGVzUGVyRWxlbWVudCA9IDg7XG5yZWdpc3RlcignU3RydWN0QXJyYXlMYXlvdXQyZjgnLCBTdHJ1Y3RBcnJheUxheW91dDJmOCk7XG5cblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgU3RydWN0QXJyYXkgbGF5b3V0OlxuICogWzBdOiBGbG9hdDMyWzRdXG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgU3RydWN0QXJyYXlMYXlvdXQ0ZjE2IGV4dGVuZHMgU3RydWN0QXJyYXkge1xuICAgIHVpbnQ4OiBVaW50OEFycmF5O1xuICAgIGZsb2F0MzI6IEZsb2F0MzJBcnJheTtcblxuICAgIF9yZWZyZXNoVmlld3MoKSB7XG4gICAgICAgIHRoaXMudWludDggPSBuZXcgVWludDhBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICAgICAgdGhpcy5mbG9hdDMyID0gbmV3IEZsb2F0MzJBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICB9XG5cbiAgICBlbXBsYWNlQmFjayh2MDogbnVtYmVyLCB2MTogbnVtYmVyLCB2MjogbnVtYmVyLCB2MzogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IGkgPSB0aGlzLmxlbmd0aDtcbiAgICAgICAgdGhpcy5yZXNpemUoaSArIDEpO1xuICAgICAgICByZXR1cm4gdGhpcy5lbXBsYWNlKGksIHYwLCB2MSwgdjIsIHYzKTtcbiAgICB9XG5cbiAgICBlbXBsYWNlKGk6IG51bWJlciwgdjA6IG51bWJlciwgdjE6IG51bWJlciwgdjI6IG51bWJlciwgdjM6IG51bWJlcikge1xuICAgICAgICBjb25zdCBvNCA9IGkgKiA0O1xuICAgICAgICB0aGlzLmZsb2F0MzJbbzQgKyAwXSA9IHYwO1xuICAgICAgICB0aGlzLmZsb2F0MzJbbzQgKyAxXSA9IHYxO1xuICAgICAgICB0aGlzLmZsb2F0MzJbbzQgKyAyXSA9IHYyO1xuICAgICAgICB0aGlzLmZsb2F0MzJbbzQgKyAzXSA9IHYzO1xuICAgICAgICByZXR1cm4gaTtcbiAgICB9XG59XG5cblN0cnVjdEFycmF5TGF5b3V0NGYxNi5wcm90b3R5cGUuYnl0ZXNQZXJFbGVtZW50ID0gMTY7XG5yZWdpc3RlcignU3RydWN0QXJyYXlMYXlvdXQ0ZjE2JywgU3RydWN0QXJyYXlMYXlvdXQ0ZjE2KTtcblxuXG5jbGFzcyBDb2xsaXNpb25Cb3hTdHJ1Y3QgZXh0ZW5kcyBTdHJ1Y3Qge1xuICAgIF9zdHJ1Y3RBcnJheTogQ29sbGlzaW9uQm94QXJyYXk7XG4gICAgYW5jaG9yUG9pbnRYOiBudW1iZXI7XG4gICAgYW5jaG9yUG9pbnRZOiBudW1iZXI7XG4gICAgeDE6IG51bWJlcjtcbiAgICB5MTogbnVtYmVyO1xuICAgIHgyOiBudW1iZXI7XG4gICAgeTI6IG51bWJlcjtcbiAgICBmZWF0dXJlSW5kZXg6IG51bWJlcjtcbiAgICBzb3VyY2VMYXllckluZGV4OiBudW1iZXI7XG4gICAgYnVja2V0SW5kZXg6IG51bWJlcjtcbiAgICByYWRpdXM6IG51bWJlcjtcbiAgICBzaWduZWREaXN0YW5jZUZyb21BbmNob3I6IG51bWJlcjtcbiAgICBhbmNob3JQb2ludDogUG9pbnQ7XG4gICAgZ2V0IGFuY2hvclBvaW50WCgpIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmludDE2W3RoaXMuX3BvczIgKyAwXTsgfVxuICAgIHNldCBhbmNob3JQb2ludFgoeCkgeyB0aGlzLl9zdHJ1Y3RBcnJheS5pbnQxNlt0aGlzLl9wb3MyICsgMF0gPSB4OyB9XG4gICAgZ2V0IGFuY2hvclBvaW50WSgpIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmludDE2W3RoaXMuX3BvczIgKyAxXTsgfVxuICAgIHNldCBhbmNob3JQb2ludFkoeCkgeyB0aGlzLl9zdHJ1Y3RBcnJheS5pbnQxNlt0aGlzLl9wb3MyICsgMV0gPSB4OyB9XG4gICAgZ2V0IHgxKCkgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkuaW50MTZbdGhpcy5fcG9zMiArIDJdOyB9XG4gICAgc2V0IHgxKHgpIHsgdGhpcy5fc3RydWN0QXJyYXkuaW50MTZbdGhpcy5fcG9zMiArIDJdID0geDsgfVxuICAgIGdldCB5MSgpIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmludDE2W3RoaXMuX3BvczIgKyAzXTsgfVxuICAgIHNldCB5MSh4KSB7IHRoaXMuX3N0cnVjdEFycmF5LmludDE2W3RoaXMuX3BvczIgKyAzXSA9IHg7IH1cbiAgICBnZXQgeDIoKSB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS5pbnQxNlt0aGlzLl9wb3MyICsgNF07IH1cbiAgICBzZXQgeDIoeCkgeyB0aGlzLl9zdHJ1Y3RBcnJheS5pbnQxNlt0aGlzLl9wb3MyICsgNF0gPSB4OyB9XG4gICAgZ2V0IHkyKCkgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkuaW50MTZbdGhpcy5fcG9zMiArIDVdOyB9XG4gICAgc2V0IHkyKHgpIHsgdGhpcy5fc3RydWN0QXJyYXkuaW50MTZbdGhpcy5fcG9zMiArIDVdID0geDsgfVxuICAgIGdldCBmZWF0dXJlSW5kZXgoKSB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MzJbdGhpcy5fcG9zNCArIDNdOyB9XG4gICAgc2V0IGZlYXR1cmVJbmRleCh4KSB7IHRoaXMuX3N0cnVjdEFycmF5LnVpbnQzMlt0aGlzLl9wb3M0ICsgM10gPSB4OyB9XG4gICAgZ2V0IHNvdXJjZUxheWVySW5kZXgoKSB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MTZbdGhpcy5fcG9zMiArIDhdOyB9XG4gICAgc2V0IHNvdXJjZUxheWVySW5kZXgoeCkgeyB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MTZbdGhpcy5fcG9zMiArIDhdID0geDsgfVxuICAgIGdldCBidWNrZXRJbmRleCgpIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQxNlt0aGlzLl9wb3MyICsgOV07IH1cbiAgICBzZXQgYnVja2V0SW5kZXgoeCkgeyB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MTZbdGhpcy5fcG9zMiArIDldID0geDsgfVxuICAgIGdldCByYWRpdXMoKSB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS5pbnQxNlt0aGlzLl9wb3MyICsgMTBdOyB9XG4gICAgc2V0IHJhZGl1cyh4KSB7IHRoaXMuX3N0cnVjdEFycmF5LmludDE2W3RoaXMuX3BvczIgKyAxMF0gPSB4OyB9XG4gICAgZ2V0IHNpZ25lZERpc3RhbmNlRnJvbUFuY2hvcigpIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmludDE2W3RoaXMuX3BvczIgKyAxMV07IH1cbiAgICBzZXQgc2lnbmVkRGlzdGFuY2VGcm9tQW5jaG9yKHgpIHsgdGhpcy5fc3RydWN0QXJyYXkuaW50MTZbdGhpcy5fcG9zMiArIDExXSA9IHg7IH1cbiAgICBnZXQgYW5jaG9yUG9pbnQoKSB7IHJldHVybiBuZXcgUG9pbnQodGhpcy5hbmNob3JQb2ludFgsIHRoaXMuYW5jaG9yUG9pbnRZKTsgfVxufVxuXG5Db2xsaXNpb25Cb3hTdHJ1Y3QucHJvdG90eXBlLnNpemUgPSAyNDtcblxuZXhwb3J0IHR5cGUgQ29sbGlzaW9uQm94ID0gQ29sbGlzaW9uQm94U3RydWN0O1xuXG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGNsYXNzIENvbGxpc2lvbkJveEFycmF5IGV4dGVuZHMgU3RydWN0QXJyYXlMYXlvdXQ2aTF1bDJ1aTJpMjQge1xuICAgIC8qKlxuICAgICAqIFJldHVybiB0aGUgQ29sbGlzaW9uQm94U3RydWN0IGF0IHRoZSBnaXZlbiBsb2NhdGlvbiBpbiB0aGUgYXJyYXkuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IFRoZSBpbmRleCBvZiB0aGUgZWxlbWVudC5cbiAgICAgKi9cbiAgICBnZXQoaW5kZXg6IG51bWJlcik6IENvbGxpc2lvbkJveFN0cnVjdCB7XG4gICAgICAgIGFzc2VydCghdGhpcy5pc1RyYW5zZmVycmVkKTtcbiAgICAgICAgcmV0dXJuIG5ldyBDb2xsaXNpb25Cb3hTdHJ1Y3QodGhpcywgaW5kZXgpO1xuICAgIH1cbn1cblxucmVnaXN0ZXIoJ0NvbGxpc2lvbkJveEFycmF5JywgQ29sbGlzaW9uQm94QXJyYXkpO1xuXG5jbGFzcyBQbGFjZWRTeW1ib2xTdHJ1Y3QgZXh0ZW5kcyBTdHJ1Y3Qge1xuICAgIF9zdHJ1Y3RBcnJheTogUGxhY2VkU3ltYm9sQXJyYXk7XG4gICAgYW5jaG9yWDogbnVtYmVyO1xuICAgIGFuY2hvclk6IG51bWJlcjtcbiAgICBnbHlwaFN0YXJ0SW5kZXg6IG51bWJlcjtcbiAgICBudW1HbHlwaHM6IG51bWJlcjtcbiAgICB2ZXJ0ZXhTdGFydEluZGV4OiBudW1iZXI7XG4gICAgbGluZVN0YXJ0SW5kZXg6IG51bWJlcjtcbiAgICBsaW5lTGVuZ3RoOiBudW1iZXI7XG4gICAgc2VnbWVudDogbnVtYmVyO1xuICAgIGxvd2VyU2l6ZTogbnVtYmVyO1xuICAgIHVwcGVyU2l6ZTogbnVtYmVyO1xuICAgIGxpbmVPZmZzZXRYOiBudW1iZXI7XG4gICAgbGluZU9mZnNldFk6IG51bWJlcjtcbiAgICB3cml0aW5nTW9kZTogbnVtYmVyO1xuICAgIGhpZGRlbjogbnVtYmVyO1xuICAgIGNyb3NzVGlsZUlEOiBudW1iZXI7XG4gICAgZ2V0IGFuY2hvclgoKSB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS5pbnQxNlt0aGlzLl9wb3MyICsgMF07IH1cbiAgICBzZXQgYW5jaG9yWCh4KSB7IHRoaXMuX3N0cnVjdEFycmF5LmludDE2W3RoaXMuX3BvczIgKyAwXSA9IHg7IH1cbiAgICBnZXQgYW5jaG9yWSgpIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmludDE2W3RoaXMuX3BvczIgKyAxXTsgfVxuICAgIHNldCBhbmNob3JZKHgpIHsgdGhpcy5fc3RydWN0QXJyYXkuaW50MTZbdGhpcy5fcG9zMiArIDFdID0geDsgfVxuICAgIGdldCBnbHlwaFN0YXJ0SW5kZXgoKSB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MTZbdGhpcy5fcG9zMiArIDJdOyB9XG4gICAgc2V0IGdseXBoU3RhcnRJbmRleCh4KSB7IHRoaXMuX3N0cnVjdEFycmF5LnVpbnQxNlt0aGlzLl9wb3MyICsgMl0gPSB4OyB9XG4gICAgZ2V0IG51bUdseXBocygpIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQxNlt0aGlzLl9wb3MyICsgM107IH1cbiAgICBzZXQgbnVtR2x5cGhzKHgpIHsgdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIgKyAzXSA9IHg7IH1cbiAgICBnZXQgdmVydGV4U3RhcnRJbmRleCgpIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQzMlt0aGlzLl9wb3M0ICsgMl07IH1cbiAgICBzZXQgdmVydGV4U3RhcnRJbmRleCh4KSB7IHRoaXMuX3N0cnVjdEFycmF5LnVpbnQzMlt0aGlzLl9wb3M0ICsgMl0gPSB4OyB9XG4gICAgZ2V0IGxpbmVTdGFydEluZGV4KCkgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDMyW3RoaXMuX3BvczQgKyAzXTsgfVxuICAgIHNldCBsaW5lU3RhcnRJbmRleCh4KSB7IHRoaXMuX3N0cnVjdEFycmF5LnVpbnQzMlt0aGlzLl9wb3M0ICsgM10gPSB4OyB9XG4gICAgZ2V0IGxpbmVMZW5ndGgoKSB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MzJbdGhpcy5fcG9zNCArIDRdOyB9XG4gICAgc2V0IGxpbmVMZW5ndGgoeCkgeyB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MzJbdGhpcy5fcG9zNCArIDRdID0geDsgfVxuICAgIGdldCBzZWdtZW50KCkgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIgKyAxMF07IH1cbiAgICBzZXQgc2VnbWVudCh4KSB7IHRoaXMuX3N0cnVjdEFycmF5LnVpbnQxNlt0aGlzLl9wb3MyICsgMTBdID0geDsgfVxuICAgIGdldCBsb3dlclNpemUoKSB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MTZbdGhpcy5fcG9zMiArIDExXTsgfVxuICAgIHNldCBsb3dlclNpemUoeCkgeyB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MTZbdGhpcy5fcG9zMiArIDExXSA9IHg7IH1cbiAgICBnZXQgdXBwZXJTaXplKCkgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIgKyAxMl07IH1cbiAgICBzZXQgdXBwZXJTaXplKHgpIHsgdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIgKyAxMl0gPSB4OyB9XG4gICAgZ2V0IGxpbmVPZmZzZXRYKCkgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkuZmxvYXQzMlt0aGlzLl9wb3M0ICsgN107IH1cbiAgICBzZXQgbGluZU9mZnNldFgoeCkgeyB0aGlzLl9zdHJ1Y3RBcnJheS5mbG9hdDMyW3RoaXMuX3BvczQgKyA3XSA9IHg7IH1cbiAgICBnZXQgbGluZU9mZnNldFkoKSB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS5mbG9hdDMyW3RoaXMuX3BvczQgKyA4XTsgfVxuICAgIHNldCBsaW5lT2Zmc2V0WSh4KSB7IHRoaXMuX3N0cnVjdEFycmF5LmZsb2F0MzJbdGhpcy5fcG9zNCArIDhdID0geDsgfVxuICAgIGdldCB3cml0aW5nTW9kZSgpIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQ4W3RoaXMuX3BvczEgKyAzNl07IH1cbiAgICBzZXQgd3JpdGluZ01vZGUoeCkgeyB0aGlzLl9zdHJ1Y3RBcnJheS51aW50OFt0aGlzLl9wb3MxICsgMzZdID0geDsgfVxuICAgIGdldCBoaWRkZW4oKSB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50OFt0aGlzLl9wb3MxICsgMzddOyB9XG4gICAgc2V0IGhpZGRlbih4KSB7IHRoaXMuX3N0cnVjdEFycmF5LnVpbnQ4W3RoaXMuX3BvczEgKyAzN10gPSB4OyB9XG4gICAgZ2V0IGNyb3NzVGlsZUlEKCkgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDMyW3RoaXMuX3BvczQgKyAxMF07IH1cbiAgICBzZXQgY3Jvc3NUaWxlSUQoeCkgeyB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MzJbdGhpcy5fcG9zNCArIDEwXSA9IHg7IH1cbn1cblxuUGxhY2VkU3ltYm9sU3RydWN0LnByb3RvdHlwZS5zaXplID0gNDQ7XG5cbmV4cG9ydCB0eXBlIFBsYWNlZFN5bWJvbCA9IFBsYWNlZFN5bWJvbFN0cnVjdDtcblxuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBjbGFzcyBQbGFjZWRTeW1ib2xBcnJheSBleHRlbmRzIFN0cnVjdEFycmF5TGF5b3V0MmkydWkzdWwzdWkyZjJ1YjF1bDQ0IHtcbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdGhlIFBsYWNlZFN5bWJvbFN0cnVjdCBhdCB0aGUgZ2l2ZW4gbG9jYXRpb24gaW4gdGhlIGFycmF5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIGVsZW1lbnQuXG4gICAgICovXG4gICAgZ2V0KGluZGV4OiBudW1iZXIpOiBQbGFjZWRTeW1ib2xTdHJ1Y3Qge1xuICAgICAgICBhc3NlcnQoIXRoaXMuaXNUcmFuc2ZlcnJlZCk7XG4gICAgICAgIHJldHVybiBuZXcgUGxhY2VkU3ltYm9sU3RydWN0KHRoaXMsIGluZGV4KTtcbiAgICB9XG59XG5cbnJlZ2lzdGVyKCdQbGFjZWRTeW1ib2xBcnJheScsIFBsYWNlZFN5bWJvbEFycmF5KTtcblxuY2xhc3MgU3ltYm9sSW5zdGFuY2VTdHJ1Y3QgZXh0ZW5kcyBTdHJ1Y3Qge1xuICAgIF9zdHJ1Y3RBcnJheTogU3ltYm9sSW5zdGFuY2VBcnJheTtcbiAgICBhbmNob3JYOiBudW1iZXI7XG4gICAgYW5jaG9yWTogbnVtYmVyO1xuICAgIHJpZ2h0SnVzdGlmaWVkVGV4dFN5bWJvbEluZGV4OiBudW1iZXI7XG4gICAgY2VudGVySnVzdGlmaWVkVGV4dFN5bWJvbEluZGV4OiBudW1iZXI7XG4gICAgbGVmdEp1c3RpZmllZFRleHRTeW1ib2xJbmRleDogbnVtYmVyO1xuICAgIHZlcnRpY2FsUGxhY2VkVGV4dFN5bWJvbEluZGV4OiBudW1iZXI7XG4gICAga2V5OiBudW1iZXI7XG4gICAgdGV4dEJveFN0YXJ0SW5kZXg6IG51bWJlcjtcbiAgICB0ZXh0Qm94RW5kSW5kZXg6IG51bWJlcjtcbiAgICBpY29uQm94U3RhcnRJbmRleDogbnVtYmVyO1xuICAgIGljb25Cb3hFbmRJbmRleDogbnVtYmVyO1xuICAgIGZlYXR1cmVJbmRleDogbnVtYmVyO1xuICAgIG51bUhvcml6b250YWxHbHlwaFZlcnRpY2VzOiBudW1iZXI7XG4gICAgbnVtVmVydGljYWxHbHlwaFZlcnRpY2VzOiBudW1iZXI7XG4gICAgbnVtSWNvblZlcnRpY2VzOiBudW1iZXI7XG4gICAgY3Jvc3NUaWxlSUQ6IG51bWJlcjtcbiAgICB0ZXh0Qm94U2NhbGU6IG51bWJlcjtcbiAgICByYWRpYWxUZXh0T2Zmc2V0OiBudW1iZXI7XG4gICAgZ2V0IGFuY2hvclgoKSB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS5pbnQxNlt0aGlzLl9wb3MyICsgMF07IH1cbiAgICBzZXQgYW5jaG9yWCh4KSB7IHRoaXMuX3N0cnVjdEFycmF5LmludDE2W3RoaXMuX3BvczIgKyAwXSA9IHg7IH1cbiAgICBnZXQgYW5jaG9yWSgpIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmludDE2W3RoaXMuX3BvczIgKyAxXTsgfVxuICAgIHNldCBhbmNob3JZKHgpIHsgdGhpcy5fc3RydWN0QXJyYXkuaW50MTZbdGhpcy5fcG9zMiArIDFdID0geDsgfVxuICAgIGdldCByaWdodEp1c3RpZmllZFRleHRTeW1ib2xJbmRleCgpIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmludDE2W3RoaXMuX3BvczIgKyAyXTsgfVxuICAgIHNldCByaWdodEp1c3RpZmllZFRleHRTeW1ib2xJbmRleCh4KSB7IHRoaXMuX3N0cnVjdEFycmF5LmludDE2W3RoaXMuX3BvczIgKyAyXSA9IHg7IH1cbiAgICBnZXQgY2VudGVySnVzdGlmaWVkVGV4dFN5bWJvbEluZGV4KCkgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkuaW50MTZbdGhpcy5fcG9zMiArIDNdOyB9XG4gICAgc2V0IGNlbnRlckp1c3RpZmllZFRleHRTeW1ib2xJbmRleCh4KSB7IHRoaXMuX3N0cnVjdEFycmF5LmludDE2W3RoaXMuX3BvczIgKyAzXSA9IHg7IH1cbiAgICBnZXQgbGVmdEp1c3RpZmllZFRleHRTeW1ib2xJbmRleCgpIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmludDE2W3RoaXMuX3BvczIgKyA0XTsgfVxuICAgIHNldCBsZWZ0SnVzdGlmaWVkVGV4dFN5bWJvbEluZGV4KHgpIHsgdGhpcy5fc3RydWN0QXJyYXkuaW50MTZbdGhpcy5fcG9zMiArIDRdID0geDsgfVxuICAgIGdldCB2ZXJ0aWNhbFBsYWNlZFRleHRTeW1ib2xJbmRleCgpIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmludDE2W3RoaXMuX3BvczIgKyA1XTsgfVxuICAgIHNldCB2ZXJ0aWNhbFBsYWNlZFRleHRTeW1ib2xJbmRleCh4KSB7IHRoaXMuX3N0cnVjdEFycmF5LmludDE2W3RoaXMuX3BvczIgKyA1XSA9IHg7IH1cbiAgICBnZXQga2V5KCkgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIgKyA2XTsgfVxuICAgIHNldCBrZXkoeCkgeyB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MTZbdGhpcy5fcG9zMiArIDZdID0geDsgfVxuICAgIGdldCB0ZXh0Qm94U3RhcnRJbmRleCgpIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQxNlt0aGlzLl9wb3MyICsgN107IH1cbiAgICBzZXQgdGV4dEJveFN0YXJ0SW5kZXgoeCkgeyB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MTZbdGhpcy5fcG9zMiArIDddID0geDsgfVxuICAgIGdldCB0ZXh0Qm94RW5kSW5kZXgoKSB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MTZbdGhpcy5fcG9zMiArIDhdOyB9XG4gICAgc2V0IHRleHRCb3hFbmRJbmRleCh4KSB7IHRoaXMuX3N0cnVjdEFycmF5LnVpbnQxNlt0aGlzLl9wb3MyICsgOF0gPSB4OyB9XG4gICAgZ2V0IGljb25Cb3hTdGFydEluZGV4KCkgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIgKyA5XTsgfVxuICAgIHNldCBpY29uQm94U3RhcnRJbmRleCh4KSB7IHRoaXMuX3N0cnVjdEFycmF5LnVpbnQxNlt0aGlzLl9wb3MyICsgOV0gPSB4OyB9XG4gICAgZ2V0IGljb25Cb3hFbmRJbmRleCgpIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQxNlt0aGlzLl9wb3MyICsgMTBdOyB9XG4gICAgc2V0IGljb25Cb3hFbmRJbmRleCh4KSB7IHRoaXMuX3N0cnVjdEFycmF5LnVpbnQxNlt0aGlzLl9wb3MyICsgMTBdID0geDsgfVxuICAgIGdldCBmZWF0dXJlSW5kZXgoKSB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MTZbdGhpcy5fcG9zMiArIDExXTsgfVxuICAgIHNldCBmZWF0dXJlSW5kZXgoeCkgeyB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MTZbdGhpcy5fcG9zMiArIDExXSA9IHg7IH1cbiAgICBnZXQgbnVtSG9yaXpvbnRhbEdseXBoVmVydGljZXMoKSB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MTZbdGhpcy5fcG9zMiArIDEyXTsgfVxuICAgIHNldCBudW1Ib3Jpem9udGFsR2x5cGhWZXJ0aWNlcyh4KSB7IHRoaXMuX3N0cnVjdEFycmF5LnVpbnQxNlt0aGlzLl9wb3MyICsgMTJdID0geDsgfVxuICAgIGdldCBudW1WZXJ0aWNhbEdseXBoVmVydGljZXMoKSB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MTZbdGhpcy5fcG9zMiArIDEzXTsgfVxuICAgIHNldCBudW1WZXJ0aWNhbEdseXBoVmVydGljZXMoeCkgeyB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MTZbdGhpcy5fcG9zMiArIDEzXSA9IHg7IH1cbiAgICBnZXQgbnVtSWNvblZlcnRpY2VzKCkgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIgKyAxNF07IH1cbiAgICBzZXQgbnVtSWNvblZlcnRpY2VzKHgpIHsgdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIgKyAxNF0gPSB4OyB9XG4gICAgZ2V0IGNyb3NzVGlsZUlEKCkgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDMyW3RoaXMuX3BvczQgKyA4XTsgfVxuICAgIHNldCBjcm9zc1RpbGVJRCh4KSB7IHRoaXMuX3N0cnVjdEFycmF5LnVpbnQzMlt0aGlzLl9wb3M0ICsgOF0gPSB4OyB9XG4gICAgZ2V0IHRleHRCb3hTY2FsZSgpIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmZsb2F0MzJbdGhpcy5fcG9zNCArIDldOyB9XG4gICAgc2V0IHRleHRCb3hTY2FsZSh4KSB7IHRoaXMuX3N0cnVjdEFycmF5LmZsb2F0MzJbdGhpcy5fcG9zNCArIDldID0geDsgfVxuICAgIGdldCByYWRpYWxUZXh0T2Zmc2V0KCkgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkuZmxvYXQzMlt0aGlzLl9wb3M0ICsgMTBdOyB9XG4gICAgc2V0IHJhZGlhbFRleHRPZmZzZXQoeCkgeyB0aGlzLl9zdHJ1Y3RBcnJheS5mbG9hdDMyW3RoaXMuX3BvczQgKyAxMF0gPSB4OyB9XG59XG5cblN5bWJvbEluc3RhbmNlU3RydWN0LnByb3RvdHlwZS5zaXplID0gNDQ7XG5cbmV4cG9ydCB0eXBlIFN5bWJvbEluc3RhbmNlID0gU3ltYm9sSW5zdGFuY2VTdHJ1Y3Q7XG5cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgY2xhc3MgU3ltYm9sSW5zdGFuY2VBcnJheSBleHRlbmRzIFN0cnVjdEFycmF5TGF5b3V0Nmk5dWkxdWwyZjQ0IHtcbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdGhlIFN5bWJvbEluc3RhbmNlU3RydWN0IGF0IHRoZSBnaXZlbiBsb2NhdGlvbiBpbiB0aGUgYXJyYXkuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IFRoZSBpbmRleCBvZiB0aGUgZWxlbWVudC5cbiAgICAgKi9cbiAgICBnZXQoaW5kZXg6IG51bWJlcik6IFN5bWJvbEluc3RhbmNlU3RydWN0IHtcbiAgICAgICAgYXNzZXJ0KCF0aGlzLmlzVHJhbnNmZXJyZWQpO1xuICAgICAgICByZXR1cm4gbmV3IFN5bWJvbEluc3RhbmNlU3RydWN0KHRoaXMsIGluZGV4KTtcbiAgICB9XG59XG5cbnJlZ2lzdGVyKCdTeW1ib2xJbnN0YW5jZUFycmF5JywgU3ltYm9sSW5zdGFuY2VBcnJheSk7XG5cbmNsYXNzIEdseXBoT2Zmc2V0U3RydWN0IGV4dGVuZHMgU3RydWN0IHtcbiAgICBfc3RydWN0QXJyYXk6IEdseXBoT2Zmc2V0QXJyYXk7XG4gICAgb2Zmc2V0WDogbnVtYmVyO1xuICAgIGdldCBvZmZzZXRYKCkgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkuZmxvYXQzMlt0aGlzLl9wb3M0ICsgMF07IH1cbiAgICBzZXQgb2Zmc2V0WCh4KSB7IHRoaXMuX3N0cnVjdEFycmF5LmZsb2F0MzJbdGhpcy5fcG9zNCArIDBdID0geDsgfVxufVxuXG5HbHlwaE9mZnNldFN0cnVjdC5wcm90b3R5cGUuc2l6ZSA9IDQ7XG5cbmV4cG9ydCB0eXBlIEdseXBoT2Zmc2V0ID0gR2x5cGhPZmZzZXRTdHJ1Y3Q7XG5cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgY2xhc3MgR2x5cGhPZmZzZXRBcnJheSBleHRlbmRzIFN0cnVjdEFycmF5TGF5b3V0MWY0IHtcbiAgICBnZXRvZmZzZXRYKGluZGV4OiBudW1iZXIpIHsgcmV0dXJuIHRoaXMuZmxvYXQzMltpbmRleCAqIDEgKyAwXTsgfVxuICAgIC8qKlxuICAgICAqIFJldHVybiB0aGUgR2x5cGhPZmZzZXRTdHJ1Y3QgYXQgdGhlIGdpdmVuIGxvY2F0aW9uIGluIHRoZSBhcnJheS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggVGhlIGluZGV4IG9mIHRoZSBlbGVtZW50LlxuICAgICAqL1xuICAgIGdldChpbmRleDogbnVtYmVyKTogR2x5cGhPZmZzZXRTdHJ1Y3Qge1xuICAgICAgICBhc3NlcnQoIXRoaXMuaXNUcmFuc2ZlcnJlZCk7XG4gICAgICAgIHJldHVybiBuZXcgR2x5cGhPZmZzZXRTdHJ1Y3QodGhpcywgaW5kZXgpO1xuICAgIH1cbn1cblxucmVnaXN0ZXIoJ0dseXBoT2Zmc2V0QXJyYXknLCBHbHlwaE9mZnNldEFycmF5KTtcblxuY2xhc3MgU3ltYm9sTGluZVZlcnRleFN0cnVjdCBleHRlbmRzIFN0cnVjdCB7XG4gICAgX3N0cnVjdEFycmF5OiBTeW1ib2xMaW5lVmVydGV4QXJyYXk7XG4gICAgeDogbnVtYmVyO1xuICAgIHk6IG51bWJlcjtcbiAgICB0aWxlVW5pdERpc3RhbmNlRnJvbUFuY2hvcjogbnVtYmVyO1xuICAgIGdldCB4KCkgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkuaW50MTZbdGhpcy5fcG9zMiArIDBdOyB9XG4gICAgc2V0IHgoeCkgeyB0aGlzLl9zdHJ1Y3RBcnJheS5pbnQxNlt0aGlzLl9wb3MyICsgMF0gPSB4OyB9XG4gICAgZ2V0IHkoKSB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS5pbnQxNlt0aGlzLl9wb3MyICsgMV07IH1cbiAgICBzZXQgeSh4KSB7IHRoaXMuX3N0cnVjdEFycmF5LmludDE2W3RoaXMuX3BvczIgKyAxXSA9IHg7IH1cbiAgICBnZXQgdGlsZVVuaXREaXN0YW5jZUZyb21BbmNob3IoKSB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS5pbnQxNlt0aGlzLl9wb3MyICsgMl07IH1cbiAgICBzZXQgdGlsZVVuaXREaXN0YW5jZUZyb21BbmNob3IoeCkgeyB0aGlzLl9zdHJ1Y3RBcnJheS5pbnQxNlt0aGlzLl9wb3MyICsgMl0gPSB4OyB9XG59XG5cblN5bWJvbExpbmVWZXJ0ZXhTdHJ1Y3QucHJvdG90eXBlLnNpemUgPSA2O1xuXG5leHBvcnQgdHlwZSBTeW1ib2xMaW5lVmVydGV4ID0gU3ltYm9sTGluZVZlcnRleFN0cnVjdDtcblxuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBjbGFzcyBTeW1ib2xMaW5lVmVydGV4QXJyYXkgZXh0ZW5kcyBTdHJ1Y3RBcnJheUxheW91dDNpNiB7XG4gICAgZ2V0eChpbmRleDogbnVtYmVyKSB7IHJldHVybiB0aGlzLmludDE2W2luZGV4ICogMyArIDBdOyB9XG4gICAgZ2V0eShpbmRleDogbnVtYmVyKSB7IHJldHVybiB0aGlzLmludDE2W2luZGV4ICogMyArIDFdOyB9XG4gICAgZ2V0dGlsZVVuaXREaXN0YW5jZUZyb21BbmNob3IoaW5kZXg6IG51bWJlcikgeyByZXR1cm4gdGhpcy5pbnQxNltpbmRleCAqIDMgKyAyXTsgfVxuICAgIC8qKlxuICAgICAqIFJldHVybiB0aGUgU3ltYm9sTGluZVZlcnRleFN0cnVjdCBhdCB0aGUgZ2l2ZW4gbG9jYXRpb24gaW4gdGhlIGFycmF5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIGVsZW1lbnQuXG4gICAgICovXG4gICAgZ2V0KGluZGV4OiBudW1iZXIpOiBTeW1ib2xMaW5lVmVydGV4U3RydWN0IHtcbiAgICAgICAgYXNzZXJ0KCF0aGlzLmlzVHJhbnNmZXJyZWQpO1xuICAgICAgICByZXR1cm4gbmV3IFN5bWJvbExpbmVWZXJ0ZXhTdHJ1Y3QodGhpcywgaW5kZXgpO1xuICAgIH1cbn1cblxucmVnaXN0ZXIoJ1N5bWJvbExpbmVWZXJ0ZXhBcnJheScsIFN5bWJvbExpbmVWZXJ0ZXhBcnJheSk7XG5cbmNsYXNzIEZlYXR1cmVJbmRleFN0cnVjdCBleHRlbmRzIFN0cnVjdCB7XG4gICAgX3N0cnVjdEFycmF5OiBGZWF0dXJlSW5kZXhBcnJheTtcbiAgICBmZWF0dXJlSW5kZXg6IG51bWJlcjtcbiAgICBzb3VyY2VMYXllckluZGV4OiBudW1iZXI7XG4gICAgYnVja2V0SW5kZXg6IG51bWJlcjtcbiAgICBnZXQgZmVhdHVyZUluZGV4KCkgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDMyW3RoaXMuX3BvczQgKyAwXTsgfVxuICAgIHNldCBmZWF0dXJlSW5kZXgoeCkgeyB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MzJbdGhpcy5fcG9zNCArIDBdID0geDsgfVxuICAgIGdldCBzb3VyY2VMYXllckluZGV4KCkgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIgKyAyXTsgfVxuICAgIHNldCBzb3VyY2VMYXllckluZGV4KHgpIHsgdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIgKyAyXSA9IHg7IH1cbiAgICBnZXQgYnVja2V0SW5kZXgoKSB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MTZbdGhpcy5fcG9zMiArIDNdOyB9XG4gICAgc2V0IGJ1Y2tldEluZGV4KHgpIHsgdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIgKyAzXSA9IHg7IH1cbn1cblxuRmVhdHVyZUluZGV4U3RydWN0LnByb3RvdHlwZS5zaXplID0gODtcblxuZXhwb3J0IHR5cGUgRmVhdHVyZUluZGV4ID0gRmVhdHVyZUluZGV4U3RydWN0O1xuXG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGNsYXNzIEZlYXR1cmVJbmRleEFycmF5IGV4dGVuZHMgU3RydWN0QXJyYXlMYXlvdXQxdWwydWk4IHtcbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdGhlIEZlYXR1cmVJbmRleFN0cnVjdCBhdCB0aGUgZ2l2ZW4gbG9jYXRpb24gaW4gdGhlIGFycmF5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIGVsZW1lbnQuXG4gICAgICovXG4gICAgZ2V0KGluZGV4OiBudW1iZXIpOiBGZWF0dXJlSW5kZXhTdHJ1Y3Qge1xuICAgICAgICBhc3NlcnQoIXRoaXMuaXNUcmFuc2ZlcnJlZCk7XG4gICAgICAgIHJldHVybiBuZXcgRmVhdHVyZUluZGV4U3RydWN0KHRoaXMsIGluZGV4KTtcbiAgICB9XG59XG5cbnJlZ2lzdGVyKCdGZWF0dXJlSW5kZXhBcnJheScsIEZlYXR1cmVJbmRleEFycmF5KTtcblxuXG5leHBvcnQge1xuICAgIFN0cnVjdEFycmF5TGF5b3V0Mmk0LFxuICAgIFN0cnVjdEFycmF5TGF5b3V0NGk4LFxuICAgIFN0cnVjdEFycmF5TGF5b3V0Mmk0aTEyLFxuICAgIFN0cnVjdEFycmF5TGF5b3V0NGk0dWIxMixcbiAgICBTdHJ1Y3RBcnJheUxheW91dDh1aTE2LFxuICAgIFN0cnVjdEFycmF5TGF5b3V0NGk0dWkxNixcbiAgICBTdHJ1Y3RBcnJheUxheW91dDNmMTIsXG4gICAgU3RydWN0QXJyYXlMYXlvdXQxdWw0LFxuICAgIFN0cnVjdEFycmF5TGF5b3V0NmkxdWwydWkyaTI0LFxuICAgIFN0cnVjdEFycmF5TGF5b3V0MmkyaTJpMTIsXG4gICAgU3RydWN0QXJyYXlMYXlvdXQydWIyZjEyLFxuICAgIFN0cnVjdEFycmF5TGF5b3V0MmkydWkzdWwzdWkyZjJ1YjF1bDQ0LFxuICAgIFN0cnVjdEFycmF5TGF5b3V0Nmk5dWkxdWwyZjQ0LFxuICAgIFN0cnVjdEFycmF5TGF5b3V0MWY0LFxuICAgIFN0cnVjdEFycmF5TGF5b3V0M2k2LFxuICAgIFN0cnVjdEFycmF5TGF5b3V0MXVsMnVpOCxcbiAgICBTdHJ1Y3RBcnJheUxheW91dDN1aTYsXG4gICAgU3RydWN0QXJyYXlMYXlvdXQydWk0LFxuICAgIFN0cnVjdEFycmF5TGF5b3V0MXVpMixcbiAgICBTdHJ1Y3RBcnJheUxheW91dDJmOCxcbiAgICBTdHJ1Y3RBcnJheUxheW91dDRmMTYsXG4gICAgU3RydWN0QXJyYXlMYXlvdXQyaTQgYXMgUG9zQXJyYXksXG4gICAgU3RydWN0QXJyYXlMYXlvdXQ0aTggYXMgUmFzdGVyQm91bmRzQXJyYXksXG4gICAgU3RydWN0QXJyYXlMYXlvdXQyaTQgYXMgQ2lyY2xlTGF5b3V0QXJyYXksXG4gICAgU3RydWN0QXJyYXlMYXlvdXQyaTQgYXMgRmlsbExheW91dEFycmF5LFxuICAgIFN0cnVjdEFycmF5TGF5b3V0Mmk0aTEyIGFzIEZpbGxFeHRydXNpb25MYXlvdXRBcnJheSxcbiAgICBTdHJ1Y3RBcnJheUxheW91dDJpNCBhcyBIZWF0bWFwTGF5b3V0QXJyYXksXG4gICAgU3RydWN0QXJyYXlMYXlvdXQ0aTR1YjEyIGFzIExpbmVMYXlvdXRBcnJheSxcbiAgICBTdHJ1Y3RBcnJheUxheW91dDh1aTE2IGFzIFBhdHRlcm5MYXlvdXRBcnJheSxcbiAgICBTdHJ1Y3RBcnJheUxheW91dDRpNHVpMTYgYXMgU3ltYm9sTGF5b3V0QXJyYXksXG4gICAgU3RydWN0QXJyYXlMYXlvdXQzZjEyIGFzIFN5bWJvbER5bmFtaWNMYXlvdXRBcnJheSxcbiAgICBTdHJ1Y3RBcnJheUxheW91dDF1bDQgYXMgU3ltYm9sT3BhY2l0eUFycmF5LFxuICAgIFN0cnVjdEFycmF5TGF5b3V0MmkyaTJpMTIgYXMgQ29sbGlzaW9uQm94TGF5b3V0QXJyYXksXG4gICAgU3RydWN0QXJyYXlMYXlvdXQyaTJpMmkxMiBhcyBDb2xsaXNpb25DaXJjbGVMYXlvdXRBcnJheSxcbiAgICBTdHJ1Y3RBcnJheUxheW91dDJ1YjJmMTIgYXMgQ29sbGlzaW9uVmVydGV4QXJyYXksXG4gICAgU3RydWN0QXJyYXlMYXlvdXQzdWk2IGFzIFRyaWFuZ2xlSW5kZXhBcnJheSxcbiAgICBTdHJ1Y3RBcnJheUxheW91dDJ1aTQgYXMgTGluZUluZGV4QXJyYXksXG4gICAgU3RydWN0QXJyYXlMYXlvdXQxdWkyIGFzIExpbmVTdHJpcEluZGV4QXJyYXlcbn07XG4iLCIvLyBAZmxvd1xuaW1wb3J0IHsgY3JlYXRlTGF5b3V0IH0gZnJvbSAnLi4vLi4vdXRpbC9zdHJ1Y3RfYXJyYXknO1xuXG5jb25zdCBsYXlvdXQgPSBjcmVhdGVMYXlvdXQoW1xuICAgIHtuYW1lOiAnYV9wb3MnLCBjb21wb25lbnRzOiAyLCB0eXBlOiAnSW50MTYnfVxuXSwgNCk7XG5cbmV4cG9ydCBkZWZhdWx0IGxheW91dDtcbmV4cG9ydCBjb25zdCB7bWVtYmVycywgc2l6ZSwgYWxpZ25tZW50fSA9IGxheW91dDtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7IHdhcm5PbmNlIH0gZnJvbSAnLi4vdXRpbC91dGlsJztcblxuaW1wb3J0IHsgcmVnaXN0ZXIgfSBmcm9tICcuLi91dGlsL3dlYl93b3JrZXJfdHJhbnNmZXInO1xuXG5pbXBvcnQgdHlwZSBWZXJ0ZXhBcnJheU9iamVjdCBmcm9tICcuLi9yZW5kZXIvdmVydGV4X2FycmF5X29iamVjdCc7XG5pbXBvcnQgdHlwZSB7U3RydWN0QXJyYXl9IGZyb20gJy4uL3V0aWwvc3RydWN0X2FycmF5JztcblxuZXhwb3J0IHR5cGUgU2VnbWVudCA9IHtcbiAgICBzb3J0S2V5OiBudW1iZXIgfCB2b2lkLFxuICAgIHZlcnRleE9mZnNldDogbnVtYmVyLFxuICAgIHByaW1pdGl2ZU9mZnNldDogbnVtYmVyLFxuICAgIHZlcnRleExlbmd0aDogbnVtYmVyLFxuICAgIHByaW1pdGl2ZUxlbmd0aDogbnVtYmVyLFxuICAgIHZhb3M6IHtbc3RyaW5nXTogVmVydGV4QXJyYXlPYmplY3R9XG59XG5cbmNsYXNzIFNlZ21lbnRWZWN0b3Ige1xuICAgIHN0YXRpYyBNQVhfVkVSVEVYX0FSUkFZX0xFTkdUSDogbnVtYmVyO1xuICAgIHNlZ21lbnRzOiBBcnJheTxTZWdtZW50PjtcblxuICAgIGNvbnN0cnVjdG9yKHNlZ21lbnRzPzogQXJyYXk8U2VnbWVudD4gPSBbXSkge1xuICAgICAgICB0aGlzLnNlZ21lbnRzID0gc2VnbWVudHM7XG4gICAgfVxuXG4gICAgcHJlcGFyZVNlZ21lbnQobnVtVmVydGljZXM6IG51bWJlciwgbGF5b3V0VmVydGV4QXJyYXk6IFN0cnVjdEFycmF5LCBpbmRleEFycmF5OiBTdHJ1Y3RBcnJheSwgc29ydEtleT86IG51bWJlcik6IFNlZ21lbnQge1xuICAgICAgICBsZXQgc2VnbWVudDogU2VnbWVudCA9IHRoaXMuc2VnbWVudHNbdGhpcy5zZWdtZW50cy5sZW5ndGggLSAxXTtcbiAgICAgICAgaWYgKG51bVZlcnRpY2VzID4gU2VnbWVudFZlY3Rvci5NQVhfVkVSVEVYX0FSUkFZX0xFTkdUSCkgd2Fybk9uY2UoYE1heCB2ZXJ0aWNlcyBwZXIgc2VnbWVudCBpcyAke1NlZ21lbnRWZWN0b3IuTUFYX1ZFUlRFWF9BUlJBWV9MRU5HVEh9OiBidWNrZXQgcmVxdWVzdGVkICR7bnVtVmVydGljZXN9YCk7XG4gICAgICAgIGlmICghc2VnbWVudCB8fCBzZWdtZW50LnZlcnRleExlbmd0aCArIG51bVZlcnRpY2VzID4gU2VnbWVudFZlY3Rvci5NQVhfVkVSVEVYX0FSUkFZX0xFTkdUSCB8fCBzZWdtZW50LnNvcnRLZXkgIT09IHNvcnRLZXkpIHtcbiAgICAgICAgICAgIHNlZ21lbnQgPSAoe1xuICAgICAgICAgICAgICAgIHZlcnRleE9mZnNldDogbGF5b3V0VmVydGV4QXJyYXkubGVuZ3RoLFxuICAgICAgICAgICAgICAgIHByaW1pdGl2ZU9mZnNldDogaW5kZXhBcnJheS5sZW5ndGgsXG4gICAgICAgICAgICAgICAgdmVydGV4TGVuZ3RoOiAwLFxuICAgICAgICAgICAgICAgIHByaW1pdGl2ZUxlbmd0aDogMFxuICAgICAgICAgICAgfTogYW55KTtcbiAgICAgICAgICAgIGlmIChzb3J0S2V5ICE9PSB1bmRlZmluZWQpIHNlZ21lbnQuc29ydEtleSA9IHNvcnRLZXk7XG4gICAgICAgICAgICB0aGlzLnNlZ21lbnRzLnB1c2goc2VnbWVudCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNlZ21lbnQ7XG4gICAgfVxuXG4gICAgZ2V0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZWdtZW50cztcbiAgICB9XG5cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBmb3IgKGNvbnN0IHNlZ21lbnQgb2YgdGhpcy5zZWdtZW50cykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBrIGluIHNlZ21lbnQudmFvcykge1xuICAgICAgICAgICAgICAgIHNlZ21lbnQudmFvc1trXS5kZXN0cm95KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgc2ltcGxlU2VnbWVudCh2ZXJ0ZXhPZmZzZXQ6IG51bWJlciwgcHJpbWl0aXZlT2Zmc2V0OiBudW1iZXIsIHZlcnRleExlbmd0aDogbnVtYmVyLCBwcmltaXRpdmVMZW5ndGg6IG51bWJlcik6IFNlZ21lbnRWZWN0b3Ige1xuICAgICAgICByZXR1cm4gbmV3IFNlZ21lbnRWZWN0b3IoW3tcbiAgICAgICAgICAgIHZlcnRleE9mZnNldCxcbiAgICAgICAgICAgIHByaW1pdGl2ZU9mZnNldCxcbiAgICAgICAgICAgIHZlcnRleExlbmd0aCxcbiAgICAgICAgICAgIHByaW1pdGl2ZUxlbmd0aCxcbiAgICAgICAgICAgIHZhb3M6IHt9LFxuICAgICAgICAgICAgc29ydEtleTogMFxuICAgICAgICB9XSk7XG4gICAgfVxufVxuXG4vKlxuICogVGhlIG1heGltdW0gc2l6ZSBvZiBhIHZlcnRleCBhcnJheS4gVGhpcyBsaW1pdCBpcyBpbXBvc2VkIGJ5IFdlYkdMJ3MgMTYgYml0XG4gKiBhZGRyZXNzaW5nIG9mIHZlcnRleCBidWZmZXJzLlxuICogQHByaXZhdGVcbiAqIEByZWFkb25seVxuICovXG5TZWdtZW50VmVjdG9yLk1BWF9WRVJURVhfQVJSQVlfTEVOR1RIID0gTWF0aC5wb3coMiwgMTYpIC0gMTtcblxucmVnaXN0ZXIoJ1NlZ21lbnRWZWN0b3InLCBTZWdtZW50VmVjdG9yKTtcbmV4cG9ydCBkZWZhdWx0IFNlZ21lbnRWZWN0b3I7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgeyBjbGFtcCB9IGZyb20gJy4uL3V0aWwvdXRpbCc7XG5cbi8qKlxuICogUGFja3MgdHdvIG51bWJlcnMsIGludGVycHJldGVkIGFzIDgtYml0IHVuc2lnbmVkIGludGVnZXJzLCBpbnRvIGEgc2luZ2xlXG4gKiBmbG9hdC4gIFVucGFjayB0aGVtIGluIHRoZSBzaGFkZXIgdXNpbmcgdGhlIGB1bnBhY2tfZmxvYXQoKWAgZnVuY3Rpb24sXG4gKiBkZWZpbmVkIGluIF9wcmVsdWRlLnZlcnRleC5nbHNsXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhY2tVaW50OFRvRmxvYXQoYTogbnVtYmVyLCBiOiBudW1iZXIpIHtcbiAgICAvLyBjb2VyY2UgYSBhbmQgYiB0byA4LWJpdCBpbnRzXG4gICAgYSA9IGNsYW1wKE1hdGguZmxvb3IoYSksIDAsIDI1NSk7XG4gICAgYiA9IGNsYW1wKE1hdGguZmxvb3IoYiksIDAsIDI1NSk7XG4gICAgcmV0dXJuIDI1NiAqIGEgKyBiO1xufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHsgcmVnaXN0ZXIgfSBmcm9tICcuLi91dGlsL3dlYl93b3JrZXJfdHJhbnNmZXInO1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG50eXBlIFNlcmlhbGl6ZWRGZWF0dXJlUG9zaXRpb25NYXAgPSB7XG4gICAgaWRzOiBGbG9hdDY0QXJyYXk7XG4gICAgcG9zaXRpb25zOiBVaW50MzJBcnJheTtcbn07XG5cbnR5cGUgRmVhdHVyZVBvc2l0aW9uID0ge1xuICAgIGluZGV4OiBudW1iZXI7XG4gICAgc3RhcnQ6IG51bWJlcjtcbiAgICBlbmQ6IG51bWJlcjtcbn07XG5cbi8vIEEgdHJhbnNmZXJhYmxlIGRhdGEgc3RydWN0dXJlIHRoYXQgbWFwcyBmZWF0dXJlIGlkcyB0byB0aGVpciBpbmRpY2VzIGFuZCBidWZmZXIgb2Zmc2V0c1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRmVhdHVyZVBvc2l0aW9uTWFwIHtcbiAgICBpZHM6IEFycmF5PG51bWJlcj47XG4gICAgcG9zaXRpb25zOiBBcnJheTxudW1iZXI+O1xuICAgIGluZGV4ZWQ6IGJvb2xlYW47XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5pZHMgPSBbXTtcbiAgICAgICAgdGhpcy5wb3NpdGlvbnMgPSBbXTtcbiAgICAgICAgdGhpcy5pbmRleGVkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgYWRkKGlkOiBudW1iZXIsIGluZGV4OiBudW1iZXIsIHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuaWRzLnB1c2goaWQpO1xuICAgICAgICB0aGlzLnBvc2l0aW9ucy5wdXNoKGluZGV4LCBzdGFydCwgZW5kKTtcbiAgICB9XG5cbiAgICBnZXRQb3NpdGlvbnMoaWQ6IG51bWJlcik6IEFycmF5PEZlYXR1cmVQb3NpdGlvbj4ge1xuICAgICAgICBhc3NlcnQodGhpcy5pbmRleGVkKTtcblxuICAgICAgICAvLyBiaW5hcnkgc2VhcmNoIGZvciB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBpZCBpbiB0aGlzLmlkcztcbiAgICAgICAgLy8gcmVsaWVzIG9uIGlkcy9wb3NpdGlvbnMgYmVpbmcgc29ydGVkIGJ5IGlkLCB3aGljaCBoYXBwZW5zIGluIHNlcmlhbGl6YXRpb25cbiAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICBsZXQgaiA9IHRoaXMuaWRzLmxlbmd0aCAtIDE7XG4gICAgICAgIHdoaWxlIChpIDwgaikge1xuICAgICAgICAgICAgY29uc3QgbSA9IChpICsgaikgPj4gMTtcbiAgICAgICAgICAgIGlmICh0aGlzLmlkc1ttXSA+PSBpZCkge1xuICAgICAgICAgICAgICAgIGogPSBtO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpID0gbSArIDE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcG9zaXRpb25zID0gW107XG4gICAgICAgIHdoaWxlICh0aGlzLmlkc1tpXSA9PT0gaWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5wb3NpdGlvbnNbMyAqIGldO1xuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSB0aGlzLnBvc2l0aW9uc1szICogaSArIDFdO1xuICAgICAgICAgICAgY29uc3QgZW5kID0gdGhpcy5wb3NpdGlvbnNbMyAqIGkgKyAyXTtcbiAgICAgICAgICAgIHBvc2l0aW9ucy5wdXNoKHtpbmRleCwgc3RhcnQsIGVuZH0pO1xuICAgICAgICAgICAgaSsrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwb3NpdGlvbnM7XG4gICAgfVxuXG4gICAgc3RhdGljIHNlcmlhbGl6ZShtYXA6IEZlYXR1cmVQb3NpdGlvbk1hcCwgdHJhbnNmZXJhYmxlczogQXJyYXk8QXJyYXlCdWZmZXI+KTogU2VyaWFsaXplZEZlYXR1cmVQb3NpdGlvbk1hcCB7XG4gICAgICAgIGNvbnN0IGlkcyA9IG5ldyBGbG9hdDY0QXJyYXkobWFwLmlkcyk7XG4gICAgICAgIGNvbnN0IHBvc2l0aW9ucyA9IG5ldyBVaW50MzJBcnJheShtYXAucG9zaXRpb25zKTtcblxuICAgICAgICBzb3J0KGlkcywgcG9zaXRpb25zLCAwLCBpZHMubGVuZ3RoIC0gMSk7XG5cbiAgICAgICAgdHJhbnNmZXJhYmxlcy5wdXNoKGlkcy5idWZmZXIsIHBvc2l0aW9ucy5idWZmZXIpO1xuXG4gICAgICAgIHJldHVybiB7aWRzLCBwb3NpdGlvbnN9O1xuICAgIH1cblxuICAgIHN0YXRpYyBkZXNlcmlhbGl6ZShvYmo6IFNlcmlhbGl6ZWRGZWF0dXJlUG9zaXRpb25NYXApOiBGZWF0dXJlUG9zaXRpb25NYXAge1xuICAgICAgICBjb25zdCBtYXAgPSBuZXcgRmVhdHVyZVBvc2l0aW9uTWFwKCk7XG4gICAgICAgIC8vIGFmdGVyIHRyYW5zZmVycmluZywgd2Ugb25seSB1c2UgdGhlc2UgYXJyYXlzIHN0YXRpY2FsbHkgKG5vIHB1c2hlcyksXG4gICAgICAgIC8vIHNvIFR5cGVkQXJyYXkgdnMgQXJyYXkgZGlzdGluY3Rpb24gdGhhdCBmbG93IHBvaW50cyBvdXQgZG9lc24ndCBtYXR0ZXJcbiAgICAgICAgbWFwLmlkcyA9IChvYmouaWRzOiBhbnkpO1xuICAgICAgICBtYXAucG9zaXRpb25zID0gKG9iai5wb3NpdGlvbnM6IGFueSk7XG4gICAgICAgIG1hcC5pbmRleGVkID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIG1hcDtcbiAgICB9XG59XG5cbi8vIGN1c3RvbSBxdWlja3NvcnQgdGhhdCBzb3J0cyBpZHMsIGluZGljZXMgYW5kIG9mZnNldHMgdG9nZXRoZXIgKGJ5IGlkcylcbmZ1bmN0aW9uIHNvcnQoaWRzLCBwb3NpdGlvbnMsIGxlZnQsIHJpZ2h0KSB7XG4gICAgaWYgKGxlZnQgPj0gcmlnaHQpIHJldHVybjtcblxuICAgIGNvbnN0IHBpdm90ID0gaWRzWyhsZWZ0ICsgcmlnaHQpID4+IDFdO1xuICAgIGxldCBpID0gbGVmdCAtIDE7XG4gICAgbGV0IGogPSByaWdodCArIDE7XG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICBkbyBpKys7IHdoaWxlIChpZHNbaV0gPCBwaXZvdCk7XG4gICAgICAgIGRvIGotLTsgd2hpbGUgKGlkc1tqXSA+IHBpdm90KTtcbiAgICAgICAgaWYgKGkgPj0gaikgYnJlYWs7XG4gICAgICAgIHN3YXAoaWRzLCBpLCBqKTtcbiAgICAgICAgc3dhcChwb3NpdGlvbnMsIDMgKiBpLCAzICogaik7XG4gICAgICAgIHN3YXAocG9zaXRpb25zLCAzICogaSArIDEsIDMgKiBqICsgMSk7XG4gICAgICAgIHN3YXAocG9zaXRpb25zLCAzICogaSArIDIsIDMgKiBqICsgMik7XG4gICAgfVxuXG4gICAgc29ydChpZHMsIHBvc2l0aW9ucywgbGVmdCwgaik7XG4gICAgc29ydChpZHMsIHBvc2l0aW9ucywgaiArIDEsIHJpZ2h0KTtcbn1cblxuZnVuY3Rpb24gc3dhcChhcnIsIGksIGopIHtcbiAgICBjb25zdCB0bXAgPSBhcnJbaV07XG4gICAgYXJyW2ldID0gYXJyW2pdO1xuICAgIGFycltqXSA9IHRtcDtcbn1cblxucmVnaXN0ZXIoJ0ZlYXR1cmVQb3NpdGlvbk1hcCcsIEZlYXR1cmVQb3NpdGlvbk1hcCk7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgQ29sb3IgZnJvbSAnLi4vc3R5bGUtc3BlYy91dGlsL2NvbG9yJztcblxuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tICcuLi9nbC9jb250ZXh0JztcblxuZXhwb3J0IHR5cGUgVW5pZm9ybVZhbHVlczxVczogT2JqZWN0PlxuICAgID0gJEV4YWN0PCRPYmpNYXA8VXMsIDxWPih1OiBVbmlmb3JtPFY+KSA9PiBWPj47XG5leHBvcnQgdHlwZSBVbmlmb3JtTG9jYXRpb25zID0ge1tzdHJpbmddOiBXZWJHTFVuaWZvcm1Mb2NhdGlvbn07XG5cbmNsYXNzIFVuaWZvcm08VD4ge1xuICAgIGdsOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQ7XG4gICAgbG9jYXRpb246ID9XZWJHTFVuaWZvcm1Mb2NhdGlvbjtcbiAgICBjdXJyZW50OiBUO1xuXG4gICAgY29uc3RydWN0b3IoY29udGV4dDogQ29udGV4dCwgbG9jYXRpb246IFdlYkdMVW5pZm9ybUxvY2F0aW9uKSB7XG4gICAgICAgIHRoaXMuZ2wgPSBjb250ZXh0LmdsO1xuICAgICAgICB0aGlzLmxvY2F0aW9uID0gbG9jYXRpb247XG4gICAgfVxuXG4gICAgK3NldDogKHY6IFQpID0+IHZvaWQ7XG59XG5cbmNsYXNzIFVuaWZvcm0xaSBleHRlbmRzIFVuaWZvcm08bnVtYmVyPiB7XG4gICAgY29uc3RydWN0b3IoY29udGV4dDogQ29udGV4dCwgbG9jYXRpb246IFdlYkdMVW5pZm9ybUxvY2F0aW9uKSB7XG4gICAgICAgIHN1cGVyKGNvbnRleHQsIGxvY2F0aW9uKTtcbiAgICAgICAgdGhpcy5jdXJyZW50ID0gMDtcbiAgICB9XG5cbiAgICBzZXQodjogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnQgIT09IHYpIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudCA9IHY7XG4gICAgICAgICAgICB0aGlzLmdsLnVuaWZvcm0xaSh0aGlzLmxvY2F0aW9uLCB2KTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuY2xhc3MgVW5pZm9ybTFmIGV4dGVuZHMgVW5pZm9ybTxudW1iZXI+IHtcbiAgICBjb25zdHJ1Y3Rvcihjb250ZXh0OiBDb250ZXh0LCBsb2NhdGlvbjogV2ViR0xVbmlmb3JtTG9jYXRpb24pIHtcbiAgICAgICAgc3VwZXIoY29udGV4dCwgbG9jYXRpb24pO1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSAwO1xuICAgIH1cblxuICAgIHNldCh2OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudCAhPT0gdikge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50ID0gdjtcbiAgICAgICAgICAgIHRoaXMuZ2wudW5pZm9ybTFmKHRoaXMubG9jYXRpb24sIHYpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5jbGFzcyBVbmlmb3JtMmYgZXh0ZW5kcyBVbmlmb3JtPFtudW1iZXIsIG51bWJlcl0+IHtcbiAgICBjb25zdHJ1Y3Rvcihjb250ZXh0OiBDb250ZXh0LCBsb2NhdGlvbjogV2ViR0xVbmlmb3JtTG9jYXRpb24pIHtcbiAgICAgICAgc3VwZXIoY29udGV4dCwgbG9jYXRpb24pO1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSBbMCwgMF07XG4gICAgfVxuXG4gICAgc2V0KHY6IFtudW1iZXIsIG51bWJlcl0pOiB2b2lkIHtcbiAgICAgICAgaWYgKHZbMF0gIT09IHRoaXMuY3VycmVudFswXSB8fCB2WzFdICE9PSB0aGlzLmN1cnJlbnRbMV0pIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudCA9IHY7XG4gICAgICAgICAgICB0aGlzLmdsLnVuaWZvcm0yZih0aGlzLmxvY2F0aW9uLCB2WzBdLCB2WzFdKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuY2xhc3MgVW5pZm9ybTNmIGV4dGVuZHMgVW5pZm9ybTxbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0+IHtcbiAgICBjb25zdHJ1Y3Rvcihjb250ZXh0OiBDb250ZXh0LCBsb2NhdGlvbjogV2ViR0xVbmlmb3JtTG9jYXRpb24pIHtcbiAgICAgICAgc3VwZXIoY29udGV4dCwgbG9jYXRpb24pO1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSBbMCwgMCwgMF07XG4gICAgfVxuXG4gICAgc2V0KHY6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSk6IHZvaWQge1xuICAgICAgICBpZiAodlswXSAhPT0gdGhpcy5jdXJyZW50WzBdIHx8IHZbMV0gIT09IHRoaXMuY3VycmVudFsxXSB8fCB2WzJdICE9PSB0aGlzLmN1cnJlbnRbMl0pIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudCA9IHY7XG4gICAgICAgICAgICB0aGlzLmdsLnVuaWZvcm0zZih0aGlzLmxvY2F0aW9uLCB2WzBdLCB2WzFdLCB2WzJdKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuY2xhc3MgVW5pZm9ybTRmIGV4dGVuZHMgVW5pZm9ybTxbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXT4ge1xuICAgIGNvbnN0cnVjdG9yKGNvbnRleHQ6IENvbnRleHQsIGxvY2F0aW9uOiBXZWJHTFVuaWZvcm1Mb2NhdGlvbikge1xuICAgICAgICBzdXBlcihjb250ZXh0LCBsb2NhdGlvbik7XG4gICAgICAgIHRoaXMuY3VycmVudCA9IFswLCAwLCAwLCAwXTtcbiAgICB9XG5cbiAgICBzZXQodjogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0pOiB2b2lkIHtcbiAgICAgICAgaWYgKHZbMF0gIT09IHRoaXMuY3VycmVudFswXSB8fCB2WzFdICE9PSB0aGlzLmN1cnJlbnRbMV0gfHxcbiAgICAgICAgICAgIHZbMl0gIT09IHRoaXMuY3VycmVudFsyXSB8fCB2WzNdICE9PSB0aGlzLmN1cnJlbnRbM10pIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudCA9IHY7XG4gICAgICAgICAgICB0aGlzLmdsLnVuaWZvcm00Zih0aGlzLmxvY2F0aW9uLCB2WzBdLCB2WzFdLCB2WzJdLCB2WzNdKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuY2xhc3MgVW5pZm9ybUNvbG9yIGV4dGVuZHMgVW5pZm9ybTxDb2xvcj4ge1xuICAgIGNvbnN0cnVjdG9yKGNvbnRleHQ6IENvbnRleHQsIGxvY2F0aW9uOiBXZWJHTFVuaWZvcm1Mb2NhdGlvbikge1xuICAgICAgICBzdXBlcihjb250ZXh0LCBsb2NhdGlvbik7XG4gICAgICAgIHRoaXMuY3VycmVudCA9IENvbG9yLnRyYW5zcGFyZW50O1xuICAgIH1cblxuICAgIHNldCh2OiBDb2xvcik6IHZvaWQge1xuICAgICAgICBpZiAodi5yICE9PSB0aGlzLmN1cnJlbnQuciB8fCB2LmcgIT09IHRoaXMuY3VycmVudC5nIHx8XG4gICAgICAgICAgICB2LmIgIT09IHRoaXMuY3VycmVudC5iIHx8IHYuYSAhPT0gdGhpcy5jdXJyZW50LmEpIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudCA9IHY7XG4gICAgICAgICAgICB0aGlzLmdsLnVuaWZvcm00Zih0aGlzLmxvY2F0aW9uLCB2LnIsIHYuZywgdi5iLCB2LmEpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5jb25zdCBlbXB0eU1hdDQgPSBuZXcgRmxvYXQzMkFycmF5KDE2KTtcbmNsYXNzIFVuaWZvcm1NYXRyaXg0ZiBleHRlbmRzIFVuaWZvcm08RmxvYXQzMkFycmF5PiB7XG4gICAgY29uc3RydWN0b3IoY29udGV4dDogQ29udGV4dCwgbG9jYXRpb246IFdlYkdMVW5pZm9ybUxvY2F0aW9uKSB7XG4gICAgICAgIHN1cGVyKGNvbnRleHQsIGxvY2F0aW9uKTtcbiAgICAgICAgdGhpcy5jdXJyZW50ID0gZW1wdHlNYXQ0O1xuICAgIH1cblxuICAgIHNldCh2OiBGbG9hdDMyQXJyYXkpOiB2b2lkIHtcbiAgICAgICAgLy8gVGhlIHZhc3QgbWFqb3JpdHkgb2YgbWF0cml4IGNvbXBhcmlzb25zIHRoYXQgd2lsbCB0cmlwIHRoaXMgc2V0XG4gICAgICAgIC8vIGhhcHBlbiBhdCBpPTEyIG9yIGk9MCwgc28gd2UgY2hlY2sgdGhvc2UgZmlyc3QgdG8gYXZvaWQgbG90cyBvZlxuICAgICAgICAvLyB1bm5lY2Vzc2FyeSBpdGVyYXRpb246XG4gICAgICAgIGlmICh2WzEyXSAhPT0gdGhpcy5jdXJyZW50WzEyXSB8fCB2WzBdICE9PSB0aGlzLmN1cnJlbnRbMF0pIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudCA9IHY7XG4gICAgICAgICAgICB0aGlzLmdsLnVuaWZvcm1NYXRyaXg0ZnYodGhpcy5sb2NhdGlvbiwgZmFsc2UsIHYpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgMTY7IGkrKykge1xuICAgICAgICAgICAgaWYgKHZbaV0gIT09IHRoaXMuY3VycmVudFtpXSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudCA9IHY7XG4gICAgICAgICAgICAgICAgdGhpcy5nbC51bmlmb3JtTWF0cml4NGZ2KHRoaXMubG9jYXRpb24sIGZhbHNlLCB2KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IHtcbiAgICBVbmlmb3JtLFxuICAgIFVuaWZvcm0xaSxcbiAgICBVbmlmb3JtMWYsXG4gICAgVW5pZm9ybTJmLFxuICAgIFVuaWZvcm0zZixcbiAgICBVbmlmb3JtNGYsXG4gICAgVW5pZm9ybUNvbG9yLFxuICAgIFVuaWZvcm1NYXRyaXg0ZlxufTtcblxuZXhwb3J0IHR5cGUgVW5pZm9ybUJpbmRpbmdzID0ge1tzdHJpbmddOiBVbmlmb3JtPGFueT59O1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHsgcGFja1VpbnQ4VG9GbG9hdCB9IGZyb20gJy4uL3NoYWRlcnMvZW5jb2RlX2F0dHJpYnV0ZSc7XG5pbXBvcnQgQ29sb3IgZnJvbSAnLi4vc3R5bGUtc3BlYy91dGlsL2NvbG9yJztcbmltcG9ydCB7IHN1cHBvcnRzUHJvcGVydHlFeHByZXNzaW9uIH0gZnJvbSAnLi4vc3R5bGUtc3BlYy91dGlsL3Byb3BlcnRpZXMnO1xuaW1wb3J0IHsgcmVnaXN0ZXIsIHNlcmlhbGl6ZSwgZGVzZXJpYWxpemUgfSBmcm9tICcuLi91dGlsL3dlYl93b3JrZXJfdHJhbnNmZXInO1xuaW1wb3J0IHsgUG9zc2libHlFdmFsdWF0ZWRQcm9wZXJ0eVZhbHVlIH0gZnJvbSAnLi4vc3R5bGUvcHJvcGVydGllcyc7XG5pbXBvcnQgeyBTdHJ1Y3RBcnJheUxheW91dDFmNCwgU3RydWN0QXJyYXlMYXlvdXQyZjgsIFN0cnVjdEFycmF5TGF5b3V0NGYxNiwgUGF0dGVybkxheW91dEFycmF5IH0gZnJvbSAnLi9hcnJheV90eXBlcyc7XG5cbmltcG9ydCBFdmFsdWF0aW9uUGFyYW1ldGVycyBmcm9tICcuLi9zdHlsZS9ldmFsdWF0aW9uX3BhcmFtZXRlcnMnO1xuaW1wb3J0IEZlYXR1cmVQb3NpdGlvbk1hcCBmcm9tICcuL2ZlYXR1cmVfcG9zaXRpb25fbWFwJztcbmltcG9ydCB7XG4gICAgVW5pZm9ybSxcbiAgICBVbmlmb3JtMWYsXG4gICAgVW5pZm9ybUNvbG9yLFxuICAgIFVuaWZvcm00ZixcbiAgICB0eXBlIFVuaWZvcm1Mb2NhdGlvbnNcbn0gZnJvbSAnLi4vcmVuZGVyL3VuaWZvcm1fYmluZGluZyc7XG5cbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSAnLi4vZ2wvY29udGV4dCc7XG5pbXBvcnQgdHlwZSB7VHlwZWRTdHlsZUxheWVyfSBmcm9tICcuLi9zdHlsZS9zdHlsZV9sYXllci90eXBlZF9zdHlsZV9sYXllcic7XG5pbXBvcnQgdHlwZSB7Q3Jvc3NmYWRlUGFyYW1ldGVyc30gZnJvbSAnLi4vc3R5bGUvZXZhbHVhdGlvbl9wYXJhbWV0ZXJzJztcbmltcG9ydCB0eXBlIHtTdHJ1Y3RBcnJheSwgU3RydWN0QXJyYXlNZW1iZXJ9IGZyb20gJy4uL3V0aWwvc3RydWN0X2FycmF5JztcbmltcG9ydCB0eXBlIFZlcnRleEJ1ZmZlciBmcm9tICcuLi9nbC92ZXJ0ZXhfYnVmZmVyJztcbmltcG9ydCB0eXBlIHtJbWFnZVBvc2l0aW9ufSBmcm9tICcuLi9yZW5kZXIvaW1hZ2VfYXRsYXMnO1xuaW1wb3J0IHR5cGUge1xuICAgIEZlYXR1cmUsXG4gICAgRmVhdHVyZVN0YXRlLFxuICAgIEdsb2JhbFByb3BlcnRpZXMsXG4gICAgU291cmNlRXhwcmVzc2lvbixcbiAgICBDb21wb3NpdGVFeHByZXNzaW9uXG59IGZyb20gJy4uL3N0eWxlLXNwZWMvZXhwcmVzc2lvbic7XG5pbXBvcnQgdHlwZSB7UG9zc2libHlFdmFsdWF0ZWR9IGZyb20gJy4uL3N0eWxlL3Byb3BlcnRpZXMnO1xuaW1wb3J0IHR5cGUge0ZlYXR1cmVTdGF0ZXN9IGZyb20gJy4uL3NvdXJjZS9zb3VyY2Vfc3RhdGUnO1xuXG5leHBvcnQgdHlwZSBCaW5kZXJVbmlmb3JtID0ge1xuICAgIG5hbWU6IHN0cmluZyxcbiAgICBwcm9wZXJ0eTogc3RyaW5nLFxuICAgIGJpbmRpbmc6IFVuaWZvcm08YW55PlxufTtcblxuZnVuY3Rpb24gcGFja0NvbG9yKGNvbG9yOiBDb2xvcik6IFtudW1iZXIsIG51bWJlcl0ge1xuICAgIHJldHVybiBbXG4gICAgICAgIHBhY2tVaW50OFRvRmxvYXQoMjU1ICogY29sb3IuciwgMjU1ICogY29sb3IuZyksXG4gICAgICAgIHBhY2tVaW50OFRvRmxvYXQoMjU1ICogY29sb3IuYiwgMjU1ICogY29sb3IuYSlcbiAgICBdO1xufVxuXG4vKipcbiAqICBgQmluZGVyYCBpcyB0aGUgaW50ZXJmYWNlIGRlZmluaXRpb24gZm9yIHRoZSBzdHJhdGVnaWVzIGZvciBjb25zdHJ1Y3RpbmcsXG4gKiAgdXBsb2FkaW5nLCBhbmQgYmluZGluZyBwYWludCBwcm9wZXJ0eSBkYXRhIGFzIEdMU0wgYXR0cmlidXRlcy4gTW9zdCBzdHlsZS1cbiAqICBzcGVjIHByb3BlcnRpZXMgaGF2ZSBhIDE6MSByZWxhdGlvbnNoaXAgdG8gc2hhZGVyIGF0dHJpYnV0ZS91bmlmb3JtcywgYnV0XG4gKiAgc29tZSByZXF1aXJlIG11bHRsaXBsZSB2YWx1ZXMgcGVyIGZlYXR1cmUgdG8gYmUgcGFzc2VkIHRvIHRoZSBHUFUsIGFuZCBpblxuICogIHRob3NlIGNhc2VzIHdlIGJpbmQgbXVsdGlwbGUgYXR0cmlidXRlcy91bmlmb3Jtcy5cbiAqXG4gKiAgSXQgaGFzIHRocmVlIGltcGxlbWVudGF0aW9ucywgb25lIGZvciBlYWNoIG9mIHRoZSB0aHJlZSBzdHJhdGVnaWVzIHdlIHVzZTpcbiAqXG4gKiAgKiBGb3IgX2NvbnN0YW50XyBwcm9wZXJ0aWVzIC0tIHRob3NlIHdob3NlIHZhbHVlIGlzIGEgY29uc3RhbnQsIG9yIHRoZSBjb25zdGFudFxuICogICAgcmVzdWx0IG9mIGV2YWx1YXRpbmcgYSBjYW1lcmEgZXhwcmVzc2lvbiBhdCBhIHBhcnRpY3VsYXIgY2FtZXJhIHBvc2l0aW9uIC0tIHdlXG4gKiAgICBkb24ndCBuZWVkIGEgdmVydGV4IGF0dHJpYnV0ZSBidWZmZXIsIGFuZCBpbnN0ZWFkIHVzZSBhIHVuaWZvcm0uXG4gKiAgKiBGb3IgZGF0YSBleHByZXNzaW9ucywgd2UgdXNlIGEgdmVydGV4IGJ1ZmZlciB3aXRoIGEgc2luZ2xlIGF0dHJpYnV0ZSB2YWx1ZSxcbiAqICAgIHRoZSBldmFsdWF0ZWQgcmVzdWx0IG9mIHRoZSBzb3VyY2UgZnVuY3Rpb24gZm9yIHRoZSBnaXZlbiBmZWF0dXJlLlxuICogICogRm9yIGNvbXBvc2l0ZSBleHByZXNzaW9ucywgd2UgdXNlIGEgdmVydGV4IGJ1ZmZlciB3aXRoIHR3byBhdHRyaWJ1dGVzOiBtaW4gYW5kXG4gKiAgICBtYXggdmFsdWVzIGNvdmVyaW5nIHRoZSByYW5nZSBvZiB6b29tcyBhdCB3aGljaCB3ZSBleHBlY3QgdGhlIHRpbGUgdG8gYmVcbiAqICAgIGRpc3BsYXllZC4gVGhlc2UgdmFsdWVzIGFyZSBjYWxjdWxhdGVkIGJ5IGV2YWx1YXRpbmcgdGhlIGNvbXBvc2l0ZSBleHByZXNzaW9uIGZvclxuICogICAgdGhlIGdpdmVuIGZlYXR1cmUgYXQgc3RyYXRlZ2ljYWxseSBjaG9zZW4gem9vbSBsZXZlbHMuIEluIGFkZGl0aW9uIHRvIHRoaXNcbiAqICAgIGF0dHJpYnV0ZSBkYXRhLCB3ZSBhbHNvIHVzZSBhIHVuaWZvcm0gdmFsdWUgd2hpY2ggdGhlIHNoYWRlciB1c2VzIHRvIGludGVycG9sYXRlXG4gKiAgICBiZXR3ZWVuIHRoZSBtaW4gYW5kIG1heCB2YWx1ZSBhdCB0aGUgZmluYWwgZGlzcGxheWVkIHpvb20gbGV2ZWwuIFRoZSB1c2Ugb2YgYVxuICogICAgdW5pZm9ybSBhbGxvd3MgdXMgdG8gY2hlYXBseSB1cGRhdGUgdGhlIHZhbHVlIG9uIGV2ZXJ5IGZyYW1lLlxuICpcbiAqICBOb3RlIHRoYXQgdGhlIHNoYWRlciBzb3VyY2UgdmFyaWVzIGRlcGVuZGluZyBvbiB3aGV0aGVyIHdlJ3JlIHVzaW5nIGEgdW5pZm9ybSBvclxuICogIGF0dHJpYnV0ZS4gV2UgZHluYW1pY2FsbHkgY29tcGlsZSBzaGFkZXJzIGF0IHJ1bnRpbWUgdG8gYWNjb21vZGF0ZSB0aGlzLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cblxuaW50ZXJmYWNlIEJpbmRlcjxUPiB7XG4gICAgbWF4VmFsdWU6IG51bWJlcjtcbiAgICB1bmlmb3JtTmFtZXM6IEFycmF5PHN0cmluZz47XG5cbiAgICBwb3B1bGF0ZVBhaW50QXJyYXkobGVuZ3RoOiBudW1iZXIsIGZlYXR1cmU6IEZlYXR1cmUsIGltYWdlUG9zaXRpb25zOiB7W3N0cmluZ106IEltYWdlUG9zaXRpb259KTogdm9pZDtcbiAgICB1cGRhdGVQYWludEFycmF5KHN0YXJ0OiBudW1iZXIsIGxlbmd0aDogbnVtYmVyLCBmZWF0dXJlOiBGZWF0dXJlLCBmZWF0dXJlU3RhdGU6IEZlYXR1cmVTdGF0ZSwgaW1hZ2VQb3NpdGlvbnM6IHtbc3RyaW5nXTogSW1hZ2VQb3NpdGlvbn0pOiB2b2lkO1xuICAgIHVwbG9hZChDb250ZXh0KTogdm9pZDtcbiAgICBkZXN0cm95KCk6IHZvaWQ7XG5cbiAgICBkZWZpbmVzKCk6IEFycmF5PHN0cmluZz47XG4gICAgc2V0Q29uc3RhbnRQYXR0ZXJuUG9zaXRpb25zKHBvc1RvOiBJbWFnZVBvc2l0aW9uLCBwb3NGcm9tOiBJbWFnZVBvc2l0aW9uKTogdm9pZDtcblxuICAgIHNldFVuaWZvcm1zKGNvbnRleHQ6IENvbnRleHQsIHVuaWZvcm06IFVuaWZvcm08Kj4sIGdsb2JhbHM6IEdsb2JhbFByb3BlcnRpZXMsXG4gICAgICAgIGN1cnJlbnRWYWx1ZTogUG9zc2libHlFdmFsdWF0ZWRQcm9wZXJ0eVZhbHVlPFQ+LCB1bmlmb3JtTmFtZTogc3RyaW5nKTogdm9pZDtcblxuICAgIGdldEJpbmRpbmcoY29udGV4dDogQ29udGV4dCwgbG9jYXRpb246IFdlYkdMVW5pZm9ybUxvY2F0aW9uKTogJFN1YnR5cGU8VW5pZm9ybTwqPj47XG59XG5cbmNsYXNzIENvbnN0YW50QmluZGVyPFQ+IGltcGxlbWVudHMgQmluZGVyPFQ+IHtcbiAgICB2YWx1ZTogVDtcbiAgICBuYW1lczogQXJyYXk8c3RyaW5nPjtcbiAgICBtYXhWYWx1ZTogbnVtYmVyO1xuICAgIHR5cGU6IHN0cmluZztcbiAgICB1bmlmb3JtTmFtZXM6IEFycmF5PHN0cmluZz47XG5cbiAgICBjb25zdHJ1Y3Rvcih2YWx1ZTogVCwgbmFtZXM6IEFycmF5PHN0cmluZz4sIHR5cGU6IHN0cmluZykge1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIHRoaXMubmFtZXMgPSBuYW1lcztcbiAgICAgICAgdGhpcy51bmlmb3JtTmFtZXMgPSB0aGlzLm5hbWVzLm1hcChuYW1lID0+IGB1XyR7bmFtZX1gKTtcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICAgICAgdGhpcy5tYXhWYWx1ZSA9IC1JbmZpbml0eTtcbiAgICB9XG5cbiAgICBkZWZpbmVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uYW1lcy5tYXAobmFtZSA9PiBgI2RlZmluZSBIQVNfVU5JRk9STV91XyR7bmFtZX1gKTtcbiAgICB9XG4gICAgc2V0Q29uc3RhbnRQYXR0ZXJuUG9zaXRpb25zKCkge31cbiAgICBwb3B1bGF0ZVBhaW50QXJyYXkoKSB7fVxuICAgIHVwZGF0ZVBhaW50QXJyYXkoKSB7fVxuICAgIHVwbG9hZCgpIHt9XG4gICAgZGVzdHJveSgpIHt9XG5cbiAgICBzZXRVbmlmb3Jtcyhjb250ZXh0OiBDb250ZXh0LCB1bmlmb3JtOiBVbmlmb3JtPCo+LCBnbG9iYWxzOiBHbG9iYWxQcm9wZXJ0aWVzLFxuICAgICAgICAgICAgICAgIGN1cnJlbnRWYWx1ZTogUG9zc2libHlFdmFsdWF0ZWRQcm9wZXJ0eVZhbHVlPFQ+KTogdm9pZCB7XG4gICAgICAgIHVuaWZvcm0uc2V0KGN1cnJlbnRWYWx1ZS5jb25zdGFudE9yKHRoaXMudmFsdWUpKTtcbiAgICB9XG5cbiAgICBnZXRCaW5kaW5nKGNvbnRleHQ6IENvbnRleHQsIGxvY2F0aW9uOiBXZWJHTFVuaWZvcm1Mb2NhdGlvbik6ICRTdWJ0eXBlPFVuaWZvcm08YW55Pj4ge1xuICAgICAgICByZXR1cm4gKHRoaXMudHlwZSA9PT0gJ2NvbG9yJykgP1xuICAgICAgICAgICAgbmV3IFVuaWZvcm1Db2xvcihjb250ZXh0LCBsb2NhdGlvbikgOlxuICAgICAgICAgICAgbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbik7XG4gICAgfVxuXG4gICAgc3RhdGljIHNlcmlhbGl6ZShiaW5kZXI6IENvbnN0YW50QmluZGVyPFQ+KSB7XG4gICAgICAgIGNvbnN0IHt2YWx1ZSwgbmFtZXMsIHR5cGV9ID0gYmluZGVyO1xuICAgICAgICByZXR1cm4ge3ZhbHVlOiBzZXJpYWxpemUodmFsdWUpLCBuYW1lcywgdHlwZX07XG4gICAgfVxuXG4gICAgc3RhdGljIGRlc2VyaWFsaXplKHNlcmlhbGl6ZWQ6IHt2YWx1ZTogVCwgbmFtZXM6IEFycmF5PHN0cmluZz4sIHR5cGU6IHN0cmluZ30pIHtcbiAgICAgICAgY29uc3Qge3ZhbHVlLCBuYW1lcywgdHlwZX0gPSBzZXJpYWxpemVkO1xuICAgICAgICByZXR1cm4gbmV3IENvbnN0YW50QmluZGVyKGRlc2VyaWFsaXplKHZhbHVlKSwgbmFtZXMsIHR5cGUpO1xuICAgIH1cbn1cblxuY2xhc3MgQ3Jvc3NGYWRlZENvbnN0YW50QmluZGVyPFQ+IGltcGxlbWVudHMgQmluZGVyPFQ+IHtcbiAgICB2YWx1ZTogVDtcbiAgICBuYW1lczogQXJyYXk8c3RyaW5nPjtcbiAgICB1bmlmb3JtTmFtZXM6IEFycmF5PHN0cmluZz47XG4gICAgcGF0dGVyblBvc2l0aW9uczoge1tzdHJpbmddOiA/QXJyYXk8bnVtYmVyPn07XG4gICAgdHlwZTogc3RyaW5nO1xuICAgIG1heFZhbHVlOiBudW1iZXI7XG5cbiAgICBjb25zdHJ1Y3Rvcih2YWx1ZTogVCwgbmFtZXM6IEFycmF5PHN0cmluZz4sIHR5cGU6IHN0cmluZykge1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIHRoaXMubmFtZXMgPSBuYW1lcztcbiAgICAgICAgdGhpcy51bmlmb3JtTmFtZXMgPSB0aGlzLm5hbWVzLm1hcChuYW1lID0+IGB1XyR7bmFtZX1gKTtcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICAgICAgdGhpcy5tYXhWYWx1ZSA9IC1JbmZpbml0eTtcbiAgICAgICAgdGhpcy5wYXR0ZXJuUG9zaXRpb25zID0ge3BhdHRlcm5UbzogbnVsbCwgcGF0dGVybkZyb206IG51bGx9O1xuICAgIH1cblxuICAgIGRlZmluZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hbWVzLm1hcChuYW1lID0+IGAjZGVmaW5lIEhBU19VTklGT1JNX3VfJHtuYW1lfWApO1xuICAgIH1cblxuICAgIHBvcHVsYXRlUGFpbnRBcnJheSgpIHt9XG4gICAgdXBkYXRlUGFpbnRBcnJheSgpIHt9XG4gICAgdXBsb2FkKCkge31cbiAgICBkZXN0cm95KCkge31cblxuICAgIHNldENvbnN0YW50UGF0dGVyblBvc2l0aW9ucyhwb3NUbzogSW1hZ2VQb3NpdGlvbiwgcG9zRnJvbTogSW1hZ2VQb3NpdGlvbikge1xuICAgICAgICB0aGlzLnBhdHRlcm5Qb3NpdGlvbnMucGF0dGVyblRvID0gcG9zVG8udGxicjtcbiAgICAgICAgdGhpcy5wYXR0ZXJuUG9zaXRpb25zLnBhdHRlcm5Gcm9tID0gcG9zRnJvbS50bGJyO1xuICAgIH1cblxuICAgIHNldFVuaWZvcm1zKGNvbnRleHQ6IENvbnRleHQsIHVuaWZvcm06IFVuaWZvcm08Kj4sIGdsb2JhbHM6IEdsb2JhbFByb3BlcnRpZXMsXG4gICAgICAgICAgICAgICAgY3VycmVudFZhbHVlOiBQb3NzaWJseUV2YWx1YXRlZFByb3BlcnR5VmFsdWU8VD4sIHVuaWZvcm1OYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgcG9zID0gdGhpcy5wYXR0ZXJuUG9zaXRpb25zO1xuICAgICAgICBpZiAodW5pZm9ybU5hbWUgPT09IFwidV9wYXR0ZXJuX3RvXCIgJiYgcG9zLnBhdHRlcm5UbykgdW5pZm9ybS5zZXQocG9zLnBhdHRlcm5Ubyk7XG4gICAgICAgIGlmICh1bmlmb3JtTmFtZSA9PT0gXCJ1X3BhdHRlcm5fZnJvbVwiICYmIHBvcy5wYXR0ZXJuRnJvbSkgdW5pZm9ybS5zZXQocG9zLnBhdHRlcm5Gcm9tKTtcbiAgICB9XG5cbiAgICBnZXRCaW5kaW5nKGNvbnRleHQ6IENvbnRleHQsIGxvY2F0aW9uOiBXZWJHTFVuaWZvcm1Mb2NhdGlvbik6ICRTdWJ0eXBlPFVuaWZvcm08YW55Pj4ge1xuICAgICAgICByZXR1cm4gbmV3IFVuaWZvcm00Zihjb250ZXh0LCBsb2NhdGlvbik7XG4gICAgfVxufVxuXG5jbGFzcyBTb3VyY2VFeHByZXNzaW9uQmluZGVyPFQ+IGltcGxlbWVudHMgQmluZGVyPFQ+IHtcbiAgICBleHByZXNzaW9uOiBTb3VyY2VFeHByZXNzaW9uO1xuICAgIG5hbWVzOiBBcnJheTxzdHJpbmc+O1xuICAgIHVuaWZvcm1OYW1lczogQXJyYXk8c3RyaW5nPjtcbiAgICB0eXBlOiBzdHJpbmc7XG4gICAgbWF4VmFsdWU6IG51bWJlcjtcblxuICAgIHBhaW50VmVydGV4QXJyYXk6IFN0cnVjdEFycmF5O1xuICAgIHBhaW50VmVydGV4QXR0cmlidXRlczogQXJyYXk8U3RydWN0QXJyYXlNZW1iZXI+O1xuICAgIHBhaW50VmVydGV4QnVmZmVyOiA/VmVydGV4QnVmZmVyO1xuXG4gICAgY29uc3RydWN0b3IoZXhwcmVzc2lvbjogU291cmNlRXhwcmVzc2lvbiwgbmFtZXM6IEFycmF5PHN0cmluZz4sIHR5cGU6IHN0cmluZywgUGFpbnRWZXJ0ZXhBcnJheTogQ2xhc3M8U3RydWN0QXJyYXk+KSB7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbiA9IGV4cHJlc3Npb247XG4gICAgICAgIHRoaXMubmFtZXMgPSBuYW1lcztcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICAgICAgdGhpcy51bmlmb3JtTmFtZXMgPSB0aGlzLm5hbWVzLm1hcChuYW1lID0+IGBhXyR7bmFtZX1gKTtcbiAgICAgICAgdGhpcy5tYXhWYWx1ZSA9IC1JbmZpbml0eTtcbiAgICAgICAgdGhpcy5wYWludFZlcnRleEF0dHJpYnV0ZXMgPSBuYW1lcy5tYXAoKG5hbWUpID0+XG4gICAgICAgICAgICAoe1xuICAgICAgICAgICAgICAgIG5hbWU6IGBhXyR7bmFtZX1gLFxuICAgICAgICAgICAgICAgIHR5cGU6ICdGbG9hdDMyJyxcbiAgICAgICAgICAgICAgICBjb21wb25lbnRzOiB0eXBlID09PSAnY29sb3InID8gMiA6IDEsXG4gICAgICAgICAgICAgICAgb2Zmc2V0OiAwXG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgICB0aGlzLnBhaW50VmVydGV4QXJyYXkgPSBuZXcgUGFpbnRWZXJ0ZXhBcnJheSgpO1xuICAgIH1cblxuICAgIGRlZmluZXMoKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBzZXRDb25zdGFudFBhdHRlcm5Qb3NpdGlvbnMoKSB7fVxuXG4gICAgcG9wdWxhdGVQYWludEFycmF5KG5ld0xlbmd0aDogbnVtYmVyLCBmZWF0dXJlOiBGZWF0dXJlKSB7XG4gICAgICAgIGNvbnN0IHBhaW50QXJyYXkgPSB0aGlzLnBhaW50VmVydGV4QXJyYXk7XG5cbiAgICAgICAgY29uc3Qgc3RhcnQgPSBwYWludEFycmF5Lmxlbmd0aDtcbiAgICAgICAgcGFpbnRBcnJheS5yZXNlcnZlKG5ld0xlbmd0aCk7XG5cbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmV4cHJlc3Npb24uZXZhbHVhdGUobmV3IEV2YWx1YXRpb25QYXJhbWV0ZXJzKDApLCBmZWF0dXJlLCB7fSk7XG5cbiAgICAgICAgaWYgKHRoaXMudHlwZSA9PT0gJ2NvbG9yJykge1xuICAgICAgICAgICAgY29uc3QgY29sb3IgPSBwYWNrQ29sb3IodmFsdWUpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgbmV3TGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBwYWludEFycmF5LmVtcGxhY2VCYWNrKGNvbG9yWzBdLCBjb2xvclsxXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBuZXdMZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHBhaW50QXJyYXkuZW1wbGFjZUJhY2sodmFsdWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLm1heFZhbHVlID0gTWF0aC5tYXgodGhpcy5tYXhWYWx1ZSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdXBkYXRlUGFpbnRBcnJheShzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlciwgZmVhdHVyZTogRmVhdHVyZSwgZmVhdHVyZVN0YXRlOiBGZWF0dXJlU3RhdGUpIHtcbiAgICAgICAgY29uc3QgcGFpbnRBcnJheSA9IHRoaXMucGFpbnRWZXJ0ZXhBcnJheTtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmV4cHJlc3Npb24uZXZhbHVhdGUoe3pvb206IDB9LCBmZWF0dXJlLCBmZWF0dXJlU3RhdGUpO1xuXG4gICAgICAgIGlmICh0aGlzLnR5cGUgPT09ICdjb2xvcicpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbG9yID0gcGFja0NvbG9yKHZhbHVlKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgcGFpbnRBcnJheS5lbXBsYWNlKGksIGNvbG9yWzBdLCBjb2xvclsxXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykge1xuICAgICAgICAgICAgICAgIHBhaW50QXJyYXkuZW1wbGFjZShpLCB2YWx1ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMubWF4VmFsdWUgPSBNYXRoLm1heCh0aGlzLm1heFZhbHVlLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1cGxvYWQoY29udGV4dDogQ29udGV4dCkge1xuICAgICAgICBpZiAodGhpcy5wYWludFZlcnRleEFycmF5ICYmIHRoaXMucGFpbnRWZXJ0ZXhBcnJheS5hcnJheUJ1ZmZlcikge1xuICAgICAgICAgICAgaWYgKHRoaXMucGFpbnRWZXJ0ZXhCdWZmZXIgJiYgdGhpcy5wYWludFZlcnRleEJ1ZmZlci5idWZmZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBhaW50VmVydGV4QnVmZmVyLnVwZGF0ZURhdGEodGhpcy5wYWludFZlcnRleEFycmF5KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wYWludFZlcnRleEJ1ZmZlciA9IGNvbnRleHQuY3JlYXRlVmVydGV4QnVmZmVyKHRoaXMucGFpbnRWZXJ0ZXhBcnJheSwgdGhpcy5wYWludFZlcnRleEF0dHJpYnV0ZXMsIHRoaXMuZXhwcmVzc2lvbi5pc1N0YXRlRGVwZW5kZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGlmICh0aGlzLnBhaW50VmVydGV4QnVmZmVyKSB7XG4gICAgICAgICAgICB0aGlzLnBhaW50VmVydGV4QnVmZmVyLmRlc3Ryb3koKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNldFVuaWZvcm1zKGNvbnRleHQ6IENvbnRleHQsIHVuaWZvcm06IFVuaWZvcm08Kj4pOiB2b2lkIHtcbiAgICAgICAgdW5pZm9ybS5zZXQoMCk7XG4gICAgfVxuXG4gICAgZ2V0QmluZGluZyhjb250ZXh0OiBDb250ZXh0LCBsb2NhdGlvbjogV2ViR0xVbmlmb3JtTG9jYXRpb24pOiBVbmlmb3JtMWYge1xuICAgICAgICByZXR1cm4gbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbik7XG4gICAgfVxufVxuXG5jbGFzcyBDb21wb3NpdGVFeHByZXNzaW9uQmluZGVyPFQ+IGltcGxlbWVudHMgQmluZGVyPFQ+IHtcbiAgICBleHByZXNzaW9uOiBDb21wb3NpdGVFeHByZXNzaW9uO1xuICAgIG5hbWVzOiBBcnJheTxzdHJpbmc+O1xuICAgIHVuaWZvcm1OYW1lczogQXJyYXk8c3RyaW5nPjtcbiAgICB0eXBlOiBzdHJpbmc7XG4gICAgdXNlSW50ZWdlclpvb206IGJvb2xlYW47XG4gICAgem9vbTogbnVtYmVyO1xuICAgIG1heFZhbHVlOiBudW1iZXI7XG5cbiAgICBwYWludFZlcnRleEFycmF5OiBTdHJ1Y3RBcnJheTtcbiAgICBwYWludFZlcnRleEF0dHJpYnV0ZXM6IEFycmF5PFN0cnVjdEFycmF5TWVtYmVyPjtcbiAgICBwYWludFZlcnRleEJ1ZmZlcjogP1ZlcnRleEJ1ZmZlcjtcblxuICAgIGNvbnN0cnVjdG9yKGV4cHJlc3Npb246IENvbXBvc2l0ZUV4cHJlc3Npb24sIG5hbWVzOiBBcnJheTxzdHJpbmc+LCB0eXBlOiBzdHJpbmcsIHVzZUludGVnZXJab29tOiBib29sZWFuLCB6b29tOiBudW1iZXIsIGxheW91dDogQ2xhc3M8U3RydWN0QXJyYXk+KSB7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbiA9IGV4cHJlc3Npb247XG4gICAgICAgIHRoaXMubmFtZXMgPSBuYW1lcztcbiAgICAgICAgdGhpcy51bmlmb3JtTmFtZXMgPSB0aGlzLm5hbWVzLm1hcChuYW1lID0+IGBhXyR7bmFtZX1fdGApO1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLnVzZUludGVnZXJab29tID0gdXNlSW50ZWdlclpvb207XG4gICAgICAgIHRoaXMuem9vbSA9IHpvb207XG4gICAgICAgIHRoaXMubWF4VmFsdWUgPSAtSW5maW5pdHk7XG4gICAgICAgIGNvbnN0IFBhaW50VmVydGV4QXJyYXkgPSBsYXlvdXQ7XG4gICAgICAgIHRoaXMucGFpbnRWZXJ0ZXhBdHRyaWJ1dGVzID0gbmFtZXMubWFwKChuYW1lKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIG5hbWU6IGBhXyR7bmFtZX1gLFxuICAgICAgICAgICAgICAgIHR5cGU6ICdGbG9hdDMyJyxcbiAgICAgICAgICAgICAgICBjb21wb25lbnRzOiB0eXBlID09PSAnY29sb3InID8gNCA6IDIsXG4gICAgICAgICAgICAgICAgb2Zmc2V0OiAwXG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5wYWludFZlcnRleEFycmF5ID0gbmV3IFBhaW50VmVydGV4QXJyYXkoKTtcbiAgICB9XG5cbiAgICBkZWZpbmVzKCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgc2V0Q29uc3RhbnRQYXR0ZXJuUG9zaXRpb25zKCkge31cblxuICAgIHBvcHVsYXRlUGFpbnRBcnJheShuZXdMZW5ndGg6IG51bWJlciwgZmVhdHVyZTogRmVhdHVyZSkge1xuICAgICAgICBjb25zdCBwYWludEFycmF5ID0gdGhpcy5wYWludFZlcnRleEFycmF5O1xuXG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gcGFpbnRBcnJheS5sZW5ndGg7XG4gICAgICAgIHBhaW50QXJyYXkucmVzZXJ2ZShuZXdMZW5ndGgpO1xuXG4gICAgICAgIGNvbnN0IG1pbiA9IHRoaXMuZXhwcmVzc2lvbi5ldmFsdWF0ZShuZXcgRXZhbHVhdGlvblBhcmFtZXRlcnModGhpcy56b29tKSwgZmVhdHVyZSwge30pO1xuICAgICAgICBjb25zdCBtYXggPSB0aGlzLmV4cHJlc3Npb24uZXZhbHVhdGUobmV3IEV2YWx1YXRpb25QYXJhbWV0ZXJzKHRoaXMuem9vbSArIDEpLCBmZWF0dXJlLCB7fSk7XG5cbiAgICAgICAgaWYgKHRoaXMudHlwZSA9PT0gJ2NvbG9yJykge1xuICAgICAgICAgICAgY29uc3QgbWluQ29sb3IgPSBwYWNrQ29sb3IobWluKTtcbiAgICAgICAgICAgIGNvbnN0IG1heENvbG9yID0gcGFja0NvbG9yKG1heCk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBuZXdMZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHBhaW50QXJyYXkuZW1wbGFjZUJhY2sobWluQ29sb3JbMF0sIG1pbkNvbG9yWzFdLCBtYXhDb2xvclswXSwgbWF4Q29sb3JbMV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgbmV3TGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBwYWludEFycmF5LmVtcGxhY2VCYWNrKG1pbiwgbWF4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubWF4VmFsdWUgPSBNYXRoLm1heCh0aGlzLm1heFZhbHVlLCBtaW4sIG1heCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1cGRhdGVQYWludEFycmF5KHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyLCBmZWF0dXJlOiBGZWF0dXJlLCBmZWF0dXJlU3RhdGU6IEZlYXR1cmVTdGF0ZSkge1xuICAgICAgICBjb25zdCBwYWludEFycmF5ID0gdGhpcy5wYWludFZlcnRleEFycmF5O1xuXG4gICAgICAgIGNvbnN0IG1pbiA9IHRoaXMuZXhwcmVzc2lvbi5ldmFsdWF0ZSh7em9vbTogdGhpcy56b29tICAgIH0sIGZlYXR1cmUsIGZlYXR1cmVTdGF0ZSk7XG4gICAgICAgIGNvbnN0IG1heCA9IHRoaXMuZXhwcmVzc2lvbi5ldmFsdWF0ZSh7em9vbTogdGhpcy56b29tICsgMX0sIGZlYXR1cmUsIGZlYXR1cmVTdGF0ZSk7XG5cbiAgICAgICAgaWYgKHRoaXMudHlwZSA9PT0gJ2NvbG9yJykge1xuICAgICAgICAgICAgY29uc3QgbWluQ29sb3IgPSBwYWNrQ29sb3IobWluKTtcbiAgICAgICAgICAgIGNvbnN0IG1heENvbG9yID0gcGFja0NvbG9yKG1heCk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykge1xuICAgICAgICAgICAgICAgIHBhaW50QXJyYXkuZW1wbGFjZShpLCBtaW5Db2xvclswXSwgbWluQ29sb3JbMV0sIG1heENvbG9yWzBdLCBtYXhDb2xvclsxXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykge1xuICAgICAgICAgICAgICAgIHBhaW50QXJyYXkuZW1wbGFjZShpLCBtaW4sIG1heCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm1heFZhbHVlID0gTWF0aC5tYXgodGhpcy5tYXhWYWx1ZSwgbWluLCBtYXgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdXBsb2FkKGNvbnRleHQ6IENvbnRleHQpIHtcbiAgICAgICAgaWYgKHRoaXMucGFpbnRWZXJ0ZXhBcnJheSAmJiB0aGlzLnBhaW50VmVydGV4QXJyYXkuYXJyYXlCdWZmZXIpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnBhaW50VmVydGV4QnVmZmVyICYmIHRoaXMucGFpbnRWZXJ0ZXhCdWZmZXIuYnVmZmVyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wYWludFZlcnRleEJ1ZmZlci51cGRhdGVEYXRhKHRoaXMucGFpbnRWZXJ0ZXhBcnJheSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMucGFpbnRWZXJ0ZXhCdWZmZXIgPSBjb250ZXh0LmNyZWF0ZVZlcnRleEJ1ZmZlcih0aGlzLnBhaW50VmVydGV4QXJyYXksIHRoaXMucGFpbnRWZXJ0ZXhBdHRyaWJ1dGVzLCB0aGlzLmV4cHJlc3Npb24uaXNTdGF0ZURlcGVuZGVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBpZiAodGhpcy5wYWludFZlcnRleEJ1ZmZlcikge1xuICAgICAgICAgICAgdGhpcy5wYWludFZlcnRleEJ1ZmZlci5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpbnRlcnBvbGF0aW9uRmFjdG9yKGN1cnJlbnRab29tOiBudW1iZXIpIHtcbiAgICAgICAgaWYgKHRoaXMudXNlSW50ZWdlclpvb20pIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmV4cHJlc3Npb24uaW50ZXJwb2xhdGlvbkZhY3RvcihNYXRoLmZsb29yKGN1cnJlbnRab29tKSwgdGhpcy56b29tLCB0aGlzLnpvb20gKyAxKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmV4cHJlc3Npb24uaW50ZXJwb2xhdGlvbkZhY3RvcihjdXJyZW50Wm9vbSwgdGhpcy56b29tLCB0aGlzLnpvb20gKyAxKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNldFVuaWZvcm1zKGNvbnRleHQ6IENvbnRleHQsIHVuaWZvcm06IFVuaWZvcm08Kj4sXG4gICAgICAgICAgICAgICAgZ2xvYmFsczogR2xvYmFsUHJvcGVydGllcyk6IHZvaWQge1xuICAgICAgICB1bmlmb3JtLnNldCh0aGlzLmludGVycG9sYXRpb25GYWN0b3IoZ2xvYmFscy56b29tKSk7XG4gICAgfVxuXG4gICAgZ2V0QmluZGluZyhjb250ZXh0OiBDb250ZXh0LCBsb2NhdGlvbjogV2ViR0xVbmlmb3JtTG9jYXRpb24pOiBVbmlmb3JtMWYge1xuICAgICAgICByZXR1cm4gbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbik7XG4gICAgfVxufVxuXG5jbGFzcyBDcm9zc0ZhZGVkQ29tcG9zaXRlQmluZGVyPFQ+IGltcGxlbWVudHMgQmluZGVyPFQ+IHtcbiAgICBleHByZXNzaW9uOiBDb21wb3NpdGVFeHByZXNzaW9uO1xuICAgIG5hbWVzOiBBcnJheTxzdHJpbmc+O1xuICAgIHVuaWZvcm1OYW1lczogQXJyYXk8c3RyaW5nPjtcbiAgICB0eXBlOiBzdHJpbmc7XG4gICAgdXNlSW50ZWdlclpvb206IGJvb2xlYW47XG4gICAgem9vbTogbnVtYmVyO1xuICAgIG1heFZhbHVlOiBudW1iZXI7XG4gICAgbGF5ZXJJZDogc3RyaW5nO1xuXG4gICAgem9vbUluUGFpbnRWZXJ0ZXhBcnJheTogU3RydWN0QXJyYXk7XG4gICAgem9vbU91dFBhaW50VmVydGV4QXJyYXk6IFN0cnVjdEFycmF5O1xuICAgIHpvb21JblBhaW50VmVydGV4QnVmZmVyOiA/VmVydGV4QnVmZmVyO1xuICAgIHpvb21PdXRQYWludFZlcnRleEJ1ZmZlcjogP1ZlcnRleEJ1ZmZlcjtcbiAgICBwYWludFZlcnRleEF0dHJpYnV0ZXM6IEFycmF5PFN0cnVjdEFycmF5TWVtYmVyPjtcblxuICAgIGNvbnN0cnVjdG9yKGV4cHJlc3Npb246IENvbXBvc2l0ZUV4cHJlc3Npb24sIG5hbWVzOiBBcnJheTxzdHJpbmc+LCB0eXBlOiBzdHJpbmcsIHVzZUludGVnZXJab29tOiBib29sZWFuLCB6b29tOiBudW1iZXIsIFBhaW50VmVydGV4QXJyYXk6IENsYXNzPFN0cnVjdEFycmF5PiwgbGF5ZXJJZDogc3RyaW5nKSB7XG5cbiAgICAgICAgdGhpcy5leHByZXNzaW9uID0gZXhwcmVzc2lvbjtcbiAgICAgICAgdGhpcy5uYW1lcyA9IG5hbWVzO1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLnVuaWZvcm1OYW1lcyA9IHRoaXMubmFtZXMubWFwKG5hbWUgPT4gYGFfJHtuYW1lfV90YCk7XG4gICAgICAgIHRoaXMudXNlSW50ZWdlclpvb20gPSB1c2VJbnRlZ2VyWm9vbTtcbiAgICAgICAgdGhpcy56b29tID0gem9vbTtcbiAgICAgICAgdGhpcy5tYXhWYWx1ZSA9IC1JbmZpbml0eTtcbiAgICAgICAgdGhpcy5sYXllcklkID0gbGF5ZXJJZDtcblxuICAgICAgICB0aGlzLnBhaW50VmVydGV4QXR0cmlidXRlcyA9IG5hbWVzLm1hcCgobmFtZSkgPT5cbiAgICAgICAgICAgICh7XG4gICAgICAgICAgICAgICAgbmFtZTogYGFfJHtuYW1lfWAsXG4gICAgICAgICAgICAgICAgdHlwZTogJ1VpbnQxNicsXG4gICAgICAgICAgICAgICAgY29tcG9uZW50czogNCxcbiAgICAgICAgICAgICAgICBvZmZzZXQ6IDBcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy56b29tSW5QYWludFZlcnRleEFycmF5ID0gbmV3IFBhaW50VmVydGV4QXJyYXkoKTtcbiAgICAgICAgdGhpcy56b29tT3V0UGFpbnRWZXJ0ZXhBcnJheSA9IG5ldyBQYWludFZlcnRleEFycmF5KCk7XG4gICAgfVxuXG4gICAgZGVmaW5lcygpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIHNldENvbnN0YW50UGF0dGVyblBvc2l0aW9ucygpIHt9XG5cbiAgICBwb3B1bGF0ZVBhaW50QXJyYXkobGVuZ3RoOiBudW1iZXIsIGZlYXR1cmU6IEZlYXR1cmUsIGltYWdlUG9zaXRpb25zOiB7W3N0cmluZ106IEltYWdlUG9zaXRpb259KSB7XG4gICAgICAgIC8vIFdlIHBvcHVsYXRlIHR3byBwYWludCBhcnJheXMgYmVjYXVzZSwgZm9yIGNyb3NzLWZhZGVkIHByb3BlcnRpZXMsIHdlIGRvbid0IGtub3cgd2hpY2ggZGlyZWN0aW9uXG4gICAgICAgIC8vIHdlJ3JlIGNyb3NzLWZhZGluZyB0byBhdCBsYXlvdXQgdGltZS4gSW4gb3JkZXIgdG8ga2VlcCB2ZXJ0ZXggYXR0cmlidXRlcyB0byBhIG1pbmltdW0gYW5kIG5vdCBwYXNzXG4gICAgICAgIC8vIHVubmVjZXNzYXJ5IHZlcnRleCBkYXRhIHRvIHRoZSBzaGFkZXJzLCB3ZSBkZXRlcm1pbmUgd2hpY2ggdG8gdXBsb2FkIGF0IGRyYXcgdGltZS5cblxuICAgICAgICBjb25zdCB6b29tSW5BcnJheSA9IHRoaXMuem9vbUluUGFpbnRWZXJ0ZXhBcnJheTtcbiAgICAgICAgY29uc3Qgem9vbU91dEFycmF5ID0gdGhpcy56b29tT3V0UGFpbnRWZXJ0ZXhBcnJheTtcbiAgICAgICAgY29uc3QgeyBsYXllcklkIH0gPSB0aGlzO1xuICAgICAgICBjb25zdCBzdGFydCA9IHpvb21JbkFycmF5Lmxlbmd0aDtcblxuICAgICAgICB6b29tSW5BcnJheS5yZXNlcnZlKGxlbmd0aCk7XG4gICAgICAgIHpvb21PdXRBcnJheS5yZXNlcnZlKGxlbmd0aCk7XG5cbiAgICAgICAgaWYgKGltYWdlUG9zaXRpb25zICYmIGZlYXR1cmUucGF0dGVybnMgJiYgZmVhdHVyZS5wYXR0ZXJuc1tsYXllcklkXSkge1xuICAgICAgICAgICAgY29uc3QgeyBtaW4sIG1pZCwgbWF4IH0gPSBmZWF0dXJlLnBhdHRlcm5zW2xheWVySWRdO1xuXG4gICAgICAgICAgICBjb25zdCBpbWFnZU1pbiA9IGltYWdlUG9zaXRpb25zW21pbl07XG4gICAgICAgICAgICBjb25zdCBpbWFnZU1pZCA9IGltYWdlUG9zaXRpb25zW21pZF07XG4gICAgICAgICAgICBjb25zdCBpbWFnZU1heCA9IGltYWdlUG9zaXRpb25zW21heF07XG5cbiAgICAgICAgICAgIGlmICghaW1hZ2VNaW4gfHwgIWltYWdlTWlkIHx8ICFpbWFnZU1heCkgcmV0dXJuO1xuXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHpvb21JbkFycmF5LmVtcGxhY2VCYWNrKFxuICAgICAgICAgICAgICAgICAgICBpbWFnZU1pZC50bFswXSwgaW1hZ2VNaWQudGxbMV0sIGltYWdlTWlkLmJyWzBdLCBpbWFnZU1pZC5iclsxXSxcbiAgICAgICAgICAgICAgICAgICAgaW1hZ2VNaW4udGxbMF0sIGltYWdlTWluLnRsWzFdLCBpbWFnZU1pbi5iclswXSwgaW1hZ2VNaW4uYnJbMV1cbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgem9vbU91dEFycmF5LmVtcGxhY2VCYWNrKFxuICAgICAgICAgICAgICAgICAgICBpbWFnZU1pZC50bFswXSwgaW1hZ2VNaWQudGxbMV0sIGltYWdlTWlkLmJyWzBdLCBpbWFnZU1pZC5iclsxXSxcbiAgICAgICAgICAgICAgICAgICAgaW1hZ2VNYXgudGxbMF0sIGltYWdlTWF4LnRsWzFdLCBpbWFnZU1heC5iclswXSwgaW1hZ2VNYXguYnJbMV1cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgdXBkYXRlUGFpbnRBcnJheShzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlciwgZmVhdHVyZTogRmVhdHVyZSwgZmVhdHVyZVN0YXRlOiBGZWF0dXJlU3RhdGUsIGltYWdlUG9zaXRpb25zOiB7W3N0cmluZ106IEltYWdlUG9zaXRpb259KSB7XG4gICAgICAgIC8vIFdlIHBvcHVsYXRlIHR3byBwYWludCBhcnJheXMgYmVjYXVzZSwgZm9yIGNyb3NzLWZhZGVkIHByb3BlcnRpZXMsIHdlIGRvbid0IGtub3cgd2hpY2ggZGlyZWN0aW9uXG4gICAgICAgIC8vIHdlJ3JlIGNyb3NzLWZhZGluZyB0byBhdCBsYXlvdXQgdGltZS4gSW4gb3JkZXIgdG8ga2VlcCB2ZXJ0ZXggYXR0cmlidXRlcyB0byBhIG1pbmltdW0gYW5kIG5vdCBwYXNzXG4gICAgICAgIC8vIHVubmVjZXNzYXJ5IHZlcnRleCBkYXRhIHRvIHRoZSBzaGFkZXJzLCB3ZSBkZXRlcm1pbmUgd2hpY2ggdG8gdXBsb2FkIGF0IGRyYXcgdGltZS5cblxuICAgICAgICBjb25zdCB6b29tSW5BcnJheSA9IHRoaXMuem9vbUluUGFpbnRWZXJ0ZXhBcnJheTtcbiAgICAgICAgY29uc3Qgem9vbU91dEFycmF5ID0gdGhpcy56b29tT3V0UGFpbnRWZXJ0ZXhBcnJheTtcbiAgICAgICAgY29uc3QgeyBsYXllcklkIH0gPSB0aGlzO1xuXG4gICAgICAgIGlmIChpbWFnZVBvc2l0aW9ucyAmJiBmZWF0dXJlLnBhdHRlcm5zICYmIGZlYXR1cmUucGF0dGVybnNbbGF5ZXJJZF0pIHtcbiAgICAgICAgICAgIGNvbnN0IHttaW4sIG1pZCwgbWF4fSA9IGZlYXR1cmUucGF0dGVybnNbbGF5ZXJJZF07XG4gICAgICAgICAgICBjb25zdCBpbWFnZU1pbiA9IGltYWdlUG9zaXRpb25zW21pbl07XG4gICAgICAgICAgICBjb25zdCBpbWFnZU1pZCA9IGltYWdlUG9zaXRpb25zW21pZF07XG4gICAgICAgICAgICBjb25zdCBpbWFnZU1heCA9IGltYWdlUG9zaXRpb25zW21heF07XG5cbiAgICAgICAgICAgIGlmICghaW1hZ2VNaW4gfHwgIWltYWdlTWlkIHx8ICFpbWFnZU1heCkgcmV0dXJuO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHtcbiAgICAgICAgICAgICAgICB6b29tSW5BcnJheS5lbXBsYWNlKGksXG4gICAgICAgICAgICAgICAgICAgIGltYWdlTWlkLnRsWzBdLCBpbWFnZU1pZC50bFsxXSwgaW1hZ2VNaWQuYnJbMF0sIGltYWdlTWlkLmJyWzFdLFxuICAgICAgICAgICAgICAgICAgICBpbWFnZU1pbi50bFswXSwgaW1hZ2VNaW4udGxbMV0sIGltYWdlTWluLmJyWzBdLCBpbWFnZU1pbi5iclsxXVxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICB6b29tT3V0QXJyYXkuZW1wbGFjZShpLFxuICAgICAgICAgICAgICAgICAgICBpbWFnZU1pZC50bFswXSwgaW1hZ2VNaWQudGxbMV0sIGltYWdlTWlkLmJyWzBdLCBpbWFnZU1pZC5iclsxXSxcbiAgICAgICAgICAgICAgICAgICAgaW1hZ2VNYXgudGxbMF0sIGltYWdlTWF4LnRsWzFdLCBpbWFnZU1heC5iclswXSwgaW1hZ2VNYXguYnJbMV1cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgdXBsb2FkKGNvbnRleHQ6IENvbnRleHQpIHtcbiAgICAgICAgaWYgKHRoaXMuem9vbUluUGFpbnRWZXJ0ZXhBcnJheSAmJiB0aGlzLnpvb21JblBhaW50VmVydGV4QXJyYXkuYXJyYXlCdWZmZXIgJiYgdGhpcy56b29tT3V0UGFpbnRWZXJ0ZXhBcnJheSAmJiB0aGlzLnpvb21PdXRQYWludFZlcnRleEFycmF5LmFycmF5QnVmZmVyKSB7XG4gICAgICAgICAgICB0aGlzLnpvb21JblBhaW50VmVydGV4QnVmZmVyID0gY29udGV4dC5jcmVhdGVWZXJ0ZXhCdWZmZXIodGhpcy56b29tSW5QYWludFZlcnRleEFycmF5LCB0aGlzLnBhaW50VmVydGV4QXR0cmlidXRlcywgdGhpcy5leHByZXNzaW9uLmlzU3RhdGVEZXBlbmRlbnQpO1xuICAgICAgICAgICAgdGhpcy56b29tT3V0UGFpbnRWZXJ0ZXhCdWZmZXIgPSBjb250ZXh0LmNyZWF0ZVZlcnRleEJ1ZmZlcih0aGlzLnpvb21PdXRQYWludFZlcnRleEFycmF5LCB0aGlzLnBhaW50VmVydGV4QXR0cmlidXRlcywgdGhpcy5leHByZXNzaW9uLmlzU3RhdGVEZXBlbmRlbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMuem9vbU91dFBhaW50VmVydGV4QnVmZmVyKSB0aGlzLnpvb21PdXRQYWludFZlcnRleEJ1ZmZlci5kZXN0cm95KCk7XG4gICAgICAgIGlmICh0aGlzLnpvb21JblBhaW50VmVydGV4QnVmZmVyKSB0aGlzLnpvb21JblBhaW50VmVydGV4QnVmZmVyLmRlc3Ryb3koKTtcblxuICAgIH1cblxuICAgIHNldFVuaWZvcm1zKGNvbnRleHQ6IENvbnRleHQsIHVuaWZvcm06IFVuaWZvcm08Kj4pOiB2b2lkIHtcbiAgICAgICAgdW5pZm9ybS5zZXQoMCk7XG4gICAgfVxuXG4gICAgZ2V0QmluZGluZyhjb250ZXh0OiBDb250ZXh0LCBsb2NhdGlvbjogV2ViR0xVbmlmb3JtTG9jYXRpb24pOiAkU3VidHlwZTxVbmlmb3JtPGFueT4+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb24pO1xuICAgIH1cbn1cblxuLyoqXG4gKiBQcm9ncmFtQ29uZmlndXJhdGlvbiBjb250YWlucyB0aGUgbG9naWMgZm9yIGJpbmRpbmcgc3R5bGUgbGF5ZXIgcHJvcGVydGllcyBhbmQgdGlsZVxuICogbGF5ZXIgZmVhdHVyZSBkYXRhIGludG8gR0wgcHJvZ3JhbSB1bmlmb3JtcyBhbmQgdmVydGV4IGF0dHJpYnV0ZXMuXG4gKlxuICogTm9uLWRhdGEtZHJpdmVuIHByb3BlcnR5IHZhbHVlcyBhcmUgYm91bmQgdG8gc2hhZGVyIHVuaWZvcm1zLiBEYXRhLWRyaXZlbiBwcm9wZXJ0eVxuICogdmFsdWVzIGFyZSBib3VuZCB0byB2ZXJ0ZXggYXR0cmlidXRlcy4gSW4gb3JkZXIgdG8gc3VwcG9ydCBhIHVuaWZvcm0gR0xTTCBzeW50YXggb3ZlclxuICogYm90aCwgW01hcGJveCBHTCBTaGFkZXJzXShodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L21hcGJveC1nbC1zaGFkZXJzKSBkZWZpbmVzIGEgYCNwcmFnbWFgXG4gKiBhYnN0cmFjdGlvbiwgd2hpY2ggUHJvZ3JhbUNvbmZpZ3VyYXRpb24gaXMgcmVzcG9uc2libGUgZm9yIGltcGxlbWVudGluZy4gQXQgcnVudGltZSxcbiAqIGl0IGV4YW1pbmVzIHRoZSBhdHRyaWJ1dGVzIG9mIGEgcGFydGljdWxhciBsYXllciwgY29tYmluZXMgdGhpcyB3aXRoIGZpeGVkIGtub3dsZWRnZVxuICogYWJvdXQgaG93IGxheWVycyBvZiB0aGUgcGFydGljdWxhciB0eXBlIGFyZSBpbXBsZW1lbnRlZCwgYW5kIGRldGVybWluZXMgd2hpY2ggdW5pZm9ybXNcbiAqIGFuZCB2ZXJ0ZXggYXR0cmlidXRlcyB3aWxsIGJlIHJlcXVpcmVkLiBJdCBjYW4gdGhlbiBzdWJzdGl0dXRlIHRoZSBhcHByb3ByaWF0ZSB0ZXh0XG4gKiBpbnRvIHRoZSBzaGFkZXIgc291cmNlIGNvZGUsIGNyZWF0ZSBhbmQgbGluayBhIHByb2dyYW0sIGFuZCBiaW5kIHRoZSB1bmlmb3JtcyBhbmRcbiAqIHZlcnRleCBhdHRyaWJ1dGVzIGluIHByZXBhcmF0aW9uIGZvciBkcmF3aW5nLlxuICpcbiAqIFdoZW4gYSB2ZWN0b3IgdGlsZSBpcyBwYXJzZWQsIHRoaXMgc2FtZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGlzIHVzZWQgdG9cbiAqIHBvcHVsYXRlIHRoZSBhdHRyaWJ1dGUgYnVmZmVycyBuZWVkZWQgZm9yIGRhdGEtZHJpdmVuIHN0eWxpbmcgdXNpbmcgdGhlIHpvb21cbiAqIGxldmVsIGFuZCBmZWF0dXJlIHByb3BlcnR5IGRhdGEuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUHJvZ3JhbUNvbmZpZ3VyYXRpb24ge1xuICAgIGJpbmRlcnM6IHsgW3N0cmluZ106IEJpbmRlcjxhbnk+IH07XG4gICAgY2FjaGVLZXk6IHN0cmluZztcbiAgICBsYXlvdXRBdHRyaWJ1dGVzOiBBcnJheTxTdHJ1Y3RBcnJheU1lbWJlcj47XG5cbiAgICBfYnVmZmVyczogQXJyYXk8VmVydGV4QnVmZmVyPjtcbiAgICBfZmVhdHVyZU1hcDogRmVhdHVyZVBvc2l0aW9uTWFwO1xuICAgIF9idWZmZXJPZmZzZXQ6IG51bWJlcjtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmJpbmRlcnMgPSB7fTtcbiAgICAgICAgdGhpcy5jYWNoZUtleSA9ICcnO1xuICAgICAgICB0aGlzLl9idWZmZXJzID0gW107XG4gICAgICAgIHRoaXMuX2ZlYXR1cmVNYXAgPSBuZXcgRmVhdHVyZVBvc2l0aW9uTWFwKCk7XG4gICAgICAgIHRoaXMuX2J1ZmZlck9mZnNldCA9IDA7XG4gICAgfVxuXG4gICAgc3RhdGljIGNyZWF0ZUR5bmFtaWM8TGF5ZXI6IFR5cGVkU3R5bGVMYXllcj4obGF5ZXI6IExheWVyLCB6b29tOiBudW1iZXIsIGZpbHRlclByb3BlcnRpZXM6IChzdHJpbmcpID0+IGJvb2xlYW4pIHtcbiAgICAgICAgY29uc3Qgc2VsZiA9IG5ldyBQcm9ncmFtQ29uZmlndXJhdGlvbigpO1xuICAgICAgICBjb25zdCBrZXlzID0gW107XG5cbiAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiBsYXllci5wYWludC5fdmFsdWVzKSB7XG4gICAgICAgICAgICBpZiAoIWZpbHRlclByb3BlcnRpZXMocHJvcGVydHkpKSBjb250aW51ZTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gbGF5ZXIucGFpbnQuZ2V0KHByb3BlcnR5KTtcbiAgICAgICAgICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgUG9zc2libHlFdmFsdWF0ZWRQcm9wZXJ0eVZhbHVlKSB8fCAhc3VwcG9ydHNQcm9wZXJ0eUV4cHJlc3Npb24odmFsdWUucHJvcGVydHkuc3BlY2lmaWNhdGlvbikpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG5hbWVzID0gcGFpbnRBdHRyaWJ1dGVOYW1lcyhwcm9wZXJ0eSwgbGF5ZXIudHlwZSk7XG4gICAgICAgICAgICBjb25zdCB0eXBlID0gdmFsdWUucHJvcGVydHkuc3BlY2lmaWNhdGlvbi50eXBlO1xuICAgICAgICAgICAgY29uc3QgdXNlSW50ZWdlclpvb20gPSB2YWx1ZS5wcm9wZXJ0eS51c2VJbnRlZ2VyWm9vbTtcbiAgICAgICAgICAgIGNvbnN0IGlzQ3Jvc3NGYWRlZCA9IHZhbHVlLnByb3BlcnR5LnNwZWNpZmljYXRpb25bJ3Byb3BlcnR5LXR5cGUnXSA9PT0gJ2Nyb3NzLWZhZGVkJyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUucHJvcGVydHkuc3BlY2lmaWNhdGlvblsncHJvcGVydHktdHlwZSddID09PSAnY3Jvc3MtZmFkZWQtZGF0YS1kcml2ZW4nO1xuXG4gICAgICAgICAgICBpZiAoaXNDcm9zc0ZhZGVkKSB7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlLnZhbHVlLmtpbmQgPT09ICdjb25zdGFudCcpIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5iaW5kZXJzW3Byb3BlcnR5XSA9IG5ldyBDcm9zc0ZhZGVkQ29uc3RhbnRCaW5kZXIodmFsdWUudmFsdWUudmFsdWUsIG5hbWVzLCB0eXBlKTtcbiAgICAgICAgICAgICAgICAgICAga2V5cy5wdXNoKGAvdV8ke3Byb3BlcnR5fWApO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cnVjdEFycmF5TGF5b3V0ID0gbGF5b3V0VHlwZShwcm9wZXJ0eSwgdHlwZSwgJ3NvdXJjZScpO1xuICAgICAgICAgICAgICAgICAgICBzZWxmLmJpbmRlcnNbcHJvcGVydHldID0gbmV3IENyb3NzRmFkZWRDb21wb3NpdGVCaW5kZXIodmFsdWUudmFsdWUsIG5hbWVzLCB0eXBlLCB1c2VJbnRlZ2VyWm9vbSwgem9vbSwgU3RydWN0QXJyYXlMYXlvdXQsIGxheWVyLmlkKTtcbiAgICAgICAgICAgICAgICAgICAga2V5cy5wdXNoKGAvYV8ke3Byb3BlcnR5fWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUudmFsdWUua2luZCA9PT0gJ2NvbnN0YW50Jykge1xuICAgICAgICAgICAgICAgIHNlbGYuYmluZGVyc1twcm9wZXJ0eV0gPSBuZXcgQ29uc3RhbnRCaW5kZXIodmFsdWUudmFsdWUudmFsdWUsIG5hbWVzLCB0eXBlKTtcbiAgICAgICAgICAgICAgICBrZXlzLnB1c2goYC91XyR7cHJvcGVydHl9YCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLnZhbHVlLmtpbmQgPT09ICdzb3VyY2UnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgU3RydWN0QXJyYXlMYXlvdXQgPSBsYXlvdXRUeXBlKHByb3BlcnR5LCB0eXBlLCAnc291cmNlJyk7XG4gICAgICAgICAgICAgICAgc2VsZi5iaW5kZXJzW3Byb3BlcnR5XSA9IG5ldyBTb3VyY2VFeHByZXNzaW9uQmluZGVyKHZhbHVlLnZhbHVlLCBuYW1lcywgdHlwZSwgU3RydWN0QXJyYXlMYXlvdXQpO1xuICAgICAgICAgICAgICAgIGtleXMucHVzaChgL2FfJHtwcm9wZXJ0eX1gKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgU3RydWN0QXJyYXlMYXlvdXQgPSBsYXlvdXRUeXBlKHByb3BlcnR5LCB0eXBlLCAnY29tcG9zaXRlJyk7XG4gICAgICAgICAgICAgICAgc2VsZi5iaW5kZXJzW3Byb3BlcnR5XSA9IG5ldyBDb21wb3NpdGVFeHByZXNzaW9uQmluZGVyKHZhbHVlLnZhbHVlLCBuYW1lcywgdHlwZSwgdXNlSW50ZWdlclpvb20sIHpvb20sIFN0cnVjdEFycmF5TGF5b3V0KTtcbiAgICAgICAgICAgICAgICBrZXlzLnB1c2goYC96XyR7cHJvcGVydHl9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBzZWxmLmNhY2hlS2V5ID0ga2V5cy5zb3J0KCkuam9pbignJyk7XG5cbiAgICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfVxuXG4gICAgcG9wdWxhdGVQYWludEFycmF5cyhuZXdMZW5ndGg6IG51bWJlciwgZmVhdHVyZTogRmVhdHVyZSwgaW5kZXg6IG51bWJlciwgaW1hZ2VQb3NpdGlvbnM6IHtbc3RyaW5nXTogSW1hZ2VQb3NpdGlvbn0pIHtcbiAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiB0aGlzLmJpbmRlcnMpIHtcbiAgICAgICAgICAgIGNvbnN0IGJpbmRlciA9IHRoaXMuYmluZGVyc1twcm9wZXJ0eV07XG4gICAgICAgICAgICBiaW5kZXIucG9wdWxhdGVQYWludEFycmF5KG5ld0xlbmd0aCwgZmVhdHVyZSwgaW1hZ2VQb3NpdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmZWF0dXJlLmlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2ZlYXR1cmVNYXAuYWRkKCtmZWF0dXJlLmlkLCBpbmRleCwgdGhpcy5fYnVmZmVyT2Zmc2V0LCBuZXdMZW5ndGgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2J1ZmZlck9mZnNldCA9IG5ld0xlbmd0aDtcbiAgICB9XG4gICAgc2V0Q29uc3RhbnRQYXR0ZXJuUG9zaXRpb25zKHBvc1RvOiBJbWFnZVBvc2l0aW9uLCBwb3NGcm9tOiBJbWFnZVBvc2l0aW9uKSB7XG4gICAgICAgIGZvciAoY29uc3QgcHJvcGVydHkgaW4gdGhpcy5iaW5kZXJzKSB7XG4gICAgICAgICAgICBjb25zdCBiaW5kZXIgPSB0aGlzLmJpbmRlcnNbcHJvcGVydHldO1xuICAgICAgICAgICAgYmluZGVyLnNldENvbnN0YW50UGF0dGVyblBvc2l0aW9ucyhwb3NUbywgcG9zRnJvbSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1cGRhdGVQYWludEFycmF5cyhmZWF0dXJlU3RhdGVzOiBGZWF0dXJlU3RhdGVzLCB2dExheWVyOiBWZWN0b3JUaWxlTGF5ZXIsIGxheWVyOiBUeXBlZFN0eWxlTGF5ZXIsIGltYWdlUG9zaXRpb25zOiB7W3N0cmluZ106IEltYWdlUG9zaXRpb259KTogYm9vbGVhbiB7XG4gICAgICAgIGxldCBkaXJ0eTogYm9vbGVhbiA9IGZhbHNlO1xuICAgICAgICBmb3IgKGNvbnN0IGlkIGluIGZlYXR1cmVTdGF0ZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHBvc2l0aW9ucyA9IHRoaXMuX2ZlYXR1cmVNYXAuZ2V0UG9zaXRpb25zKCtpZCk7XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgcG9zIG9mIHBvc2l0aW9ucykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZlYXR1cmUgPSB2dExheWVyLmZlYXR1cmUocG9zLmluZGV4KTtcblxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcHJvcGVydHkgaW4gdGhpcy5iaW5kZXJzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJpbmRlciA9IHRoaXMuYmluZGVyc1twcm9wZXJ0eV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChiaW5kZXIgaW5zdGFuY2VvZiBDb25zdGFudEJpbmRlciB8fCBiaW5kZXIgaW5zdGFuY2VvZiBDcm9zc0ZhZGVkQ29uc3RhbnRCaW5kZXIpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoKGJpbmRlcjogYW55KS5leHByZXNzaW9uLmlzU3RhdGVEZXBlbmRlbnQgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vQUhNOiBSZW1vdmUgYWZ0ZXIgaHR0cHM6Ly9naXRodWIuY29tL21hcGJveC9tYXBib3gtZ2wtanMvaXNzdWVzLzYyNTVcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gbGF5ZXIucGFpbnQuZ2V0KHByb3BlcnR5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIChiaW5kZXI6IGFueSkuZXhwcmVzc2lvbiA9IHZhbHVlLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYmluZGVyLnVwZGF0ZVBhaW50QXJyYXkocG9zLnN0YXJ0LCBwb3MuZW5kLCBmZWF0dXJlLCBmZWF0dXJlU3RhdGVzW2lkXSwgaW1hZ2VQb3NpdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGlydHkgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkaXJ0eTtcbiAgICB9XG5cbiAgICBkZWZpbmVzKCk6IEFycmF5PHN0cmluZz4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiB0aGlzLmJpbmRlcnMpIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKC4uLnRoaXMuYmluZGVyc1twcm9wZXJ0eV0uZGVmaW5lcygpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGdldFBhaW50VmVydGV4QnVmZmVycygpOiBBcnJheTxWZXJ0ZXhCdWZmZXI+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2J1ZmZlcnM7XG4gICAgfVxuXG4gICAgZ2V0VW5pZm9ybXMoY29udGV4dDogQ29udGV4dCwgbG9jYXRpb25zOiBVbmlmb3JtTG9jYXRpb25zKTogQXJyYXk8QmluZGVyVW5pZm9ybT4ge1xuICAgICAgICBjb25zdCB1bmlmb3JtcyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHByb3BlcnR5IGluIHRoaXMuYmluZGVycykge1xuICAgICAgICAgICAgY29uc3QgYmluZGVyID0gdGhpcy5iaW5kZXJzW3Byb3BlcnR5XTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgbmFtZSBvZiBiaW5kZXIudW5pZm9ybU5hbWVzKSB7XG4gICAgICAgICAgICAgICAgaWYgKGxvY2F0aW9uc1tuYW1lXSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBiaW5kaW5nID0gYmluZGVyLmdldEJpbmRpbmcoY29udGV4dCwgbG9jYXRpb25zW25hbWVdKTtcbiAgICAgICAgICAgICAgICAgICAgdW5pZm9ybXMucHVzaCh7bmFtZSwgcHJvcGVydHksIGJpbmRpbmd9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuaWZvcm1zO1xuICAgIH1cblxuICAgIHNldFVuaWZvcm1zPFByb3BlcnRpZXM6IE9iamVjdD4oY29udGV4dDogQ29udGV4dCwgYmluZGVyVW5pZm9ybXM6IEFycmF5PEJpbmRlclVuaWZvcm0+LCBwcm9wZXJ0aWVzOiBQb3NzaWJseUV2YWx1YXRlZDxQcm9wZXJ0aWVzPiwgZ2xvYmFsczogR2xvYmFsUHJvcGVydGllcykge1xuICAgICAgICAvLyBVbmlmb3JtIHN0YXRlIGJpbmRpbmdzIGFyZSBvd25lZCBieSB0aGUgUHJvZ3JhbSwgYnV0IHdlIHNldCB0aGVtXG4gICAgICAgIC8vIGZyb20gd2l0aGluIHRoZSBQcm9ncmFtQ29uZmlndXJhdG9uJ3MgYmluZGVyIG1lbWJlcnMuXG4gICAgICAgIGZvciAoY29uc3Qge25hbWUsIHByb3BlcnR5LCBiaW5kaW5nfSBvZiBiaW5kZXJVbmlmb3Jtcykge1xuICAgICAgICAgICAgdGhpcy5iaW5kZXJzW3Byb3BlcnR5XS5zZXRVbmlmb3Jtcyhjb250ZXh0LCBiaW5kaW5nLCBnbG9iYWxzLCBwcm9wZXJ0aWVzLmdldChwcm9wZXJ0eSksIG5hbWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdXBkYXRlUGF0dGVyblBhaW50QnVmZmVycyhjcm9zc2ZhZGU6IENyb3NzZmFkZVBhcmFtZXRlcnMpIHtcbiAgICAgICAgY29uc3QgYnVmZmVycyA9IFtdO1xuXG4gICAgICAgIGZvciAoY29uc3QgcHJvcGVydHkgaW4gdGhpcy5iaW5kZXJzKSB7XG4gICAgICAgICAgICBjb25zdCBiaW5kZXIgPSB0aGlzLmJpbmRlcnNbcHJvcGVydHldO1xuICAgICAgICAgICAgaWYgKGJpbmRlciBpbnN0YW5jZW9mIENyb3NzRmFkZWRDb21wb3NpdGVCaW5kZXIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXR0ZXJuVmVydGV4QnVmZmVyID0gY3Jvc3NmYWRlLmZyb21TY2FsZSA9PT0gMiA/IGJpbmRlci56b29tSW5QYWludFZlcnRleEJ1ZmZlciA6IGJpbmRlci56b29tT3V0UGFpbnRWZXJ0ZXhCdWZmZXI7XG4gICAgICAgICAgICAgICAgaWYgKHBhdHRlcm5WZXJ0ZXhCdWZmZXIpIGJ1ZmZlcnMucHVzaChwYXR0ZXJuVmVydGV4QnVmZmVyKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoKGJpbmRlciBpbnN0YW5jZW9mIFNvdXJjZUV4cHJlc3Npb25CaW5kZXIgfHxcbiAgICAgICAgICAgICAgICBiaW5kZXIgaW5zdGFuY2VvZiBDb21wb3NpdGVFeHByZXNzaW9uQmluZGVyKSAmJlxuICAgICAgICAgICAgICAgIGJpbmRlci5wYWludFZlcnRleEJ1ZmZlclxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgYnVmZmVycy5wdXNoKGJpbmRlci5wYWludFZlcnRleEJ1ZmZlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9idWZmZXJzID0gYnVmZmVycztcbiAgICB9XG5cbiAgICB1cGxvYWQoY29udGV4dDogQ29udGV4dCkge1xuICAgICAgICBmb3IgKGNvbnN0IHByb3BlcnR5IGluIHRoaXMuYmluZGVycykge1xuICAgICAgICAgICAgdGhpcy5iaW5kZXJzW3Byb3BlcnR5XS51cGxvYWQoY29udGV4dCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBidWZmZXJzID0gW107XG4gICAgICAgIGZvciAoY29uc3QgcHJvcGVydHkgaW4gdGhpcy5iaW5kZXJzKSB7XG4gICAgICAgICAgICBjb25zdCBiaW5kZXIgPSB0aGlzLmJpbmRlcnNbcHJvcGVydHldO1xuICAgICAgICAgICAgaWYgKChiaW5kZXIgaW5zdGFuY2VvZiBTb3VyY2VFeHByZXNzaW9uQmluZGVyIHx8XG4gICAgICAgICAgICAgICAgYmluZGVyIGluc3RhbmNlb2YgQ29tcG9zaXRlRXhwcmVzc2lvbkJpbmRlcikgJiZcbiAgICAgICAgICAgICAgICBiaW5kZXIucGFpbnRWZXJ0ZXhCdWZmZXJcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGJ1ZmZlcnMucHVzaChiaW5kZXIucGFpbnRWZXJ0ZXhCdWZmZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2J1ZmZlcnMgPSBidWZmZXJzO1xuICAgIH1cblxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGZvciAoY29uc3QgcHJvcGVydHkgaW4gdGhpcy5iaW5kZXJzKSB7XG4gICAgICAgICAgICB0aGlzLmJpbmRlcnNbcHJvcGVydHldLmRlc3Ryb3koKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFByb2dyYW1Db25maWd1cmF0aW9uU2V0PExheWVyOiBUeXBlZFN0eWxlTGF5ZXI+IHtcbiAgICBwcm9ncmFtQ29uZmlndXJhdGlvbnM6IHtbc3RyaW5nXTogUHJvZ3JhbUNvbmZpZ3VyYXRpb259O1xuICAgIG5lZWRzVXBsb2FkOiBib29sZWFuO1xuXG4gICAgY29uc3RydWN0b3IobGF5b3V0QXR0cmlidXRlczogQXJyYXk8U3RydWN0QXJyYXlNZW1iZXI+LCBsYXllcnM6ICRSZWFkT25seUFycmF5PExheWVyPiwgem9vbTogbnVtYmVyLCBmaWx0ZXJQcm9wZXJ0aWVzOiAoc3RyaW5nKSA9PiBib29sZWFuID0gKCkgPT4gdHJ1ZSkge1xuICAgICAgICB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucyA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IGxheWVyIG9mIGxheWVycykge1xuICAgICAgICAgICAgdGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnNbbGF5ZXIuaWRdID0gUHJvZ3JhbUNvbmZpZ3VyYXRpb24uY3JlYXRlRHluYW1pYyhsYXllciwgem9vbSwgZmlsdGVyUHJvcGVydGllcyk7XG4gICAgICAgICAgICB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9uc1tsYXllci5pZF0ubGF5b3V0QXR0cmlidXRlcyA9IGxheW91dEF0dHJpYnV0ZXM7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5uZWVkc1VwbG9hZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIHBvcHVsYXRlUGFpbnRBcnJheXMobGVuZ3RoOiBudW1iZXIsIGZlYXR1cmU6IEZlYXR1cmUsIGluZGV4OiBudW1iZXIsIGltYWdlUG9zaXRpb25zOiB7W3N0cmluZ106IEltYWdlUG9zaXRpb259KSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zKSB7XG4gICAgICAgICAgICB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9uc1trZXldLnBvcHVsYXRlUGFpbnRBcnJheXMobGVuZ3RoLCBmZWF0dXJlLCBpbmRleCwgaW1hZ2VQb3NpdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubmVlZHNVcGxvYWQgPSB0cnVlO1xuICAgIH1cblxuICAgIHVwZGF0ZVBhaW50QXJyYXlzKGZlYXR1cmVTdGF0ZXM6IEZlYXR1cmVTdGF0ZXMsIHZ0TGF5ZXI6IFZlY3RvclRpbGVMYXllciwgbGF5ZXJzOiAkUmVhZE9ubHlBcnJheTxUeXBlZFN0eWxlTGF5ZXI+LCBpbWFnZVBvc2l0aW9uczoge1tzdHJpbmddOiBJbWFnZVBvc2l0aW9ufSkge1xuICAgICAgICBmb3IgKGNvbnN0IGxheWVyIG9mIGxheWVycykge1xuICAgICAgICAgICAgdGhpcy5uZWVkc1VwbG9hZCA9IHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zW2xheWVyLmlkXS51cGRhdGVQYWludEFycmF5cyhmZWF0dXJlU3RhdGVzLCB2dExheWVyLCBsYXllciwgaW1hZ2VQb3NpdGlvbnMpIHx8IHRoaXMubmVlZHNVcGxvYWQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXQobGF5ZXJJZDogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9uc1tsYXllcklkXTtcbiAgICB9XG5cbiAgICB1cGxvYWQoY29udGV4dDogQ29udGV4dCkge1xuICAgICAgICBpZiAoIXRoaXMubmVlZHNVcGxvYWQpIHJldHVybjtcbiAgICAgICAgZm9yIChjb25zdCBsYXllcklkIGluIHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zKSB7XG4gICAgICAgICAgICB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9uc1tsYXllcklkXS51cGxvYWQoY29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5uZWVkc1VwbG9hZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGZvciAoY29uc3QgbGF5ZXJJZCBpbiB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucykge1xuICAgICAgICAgICAgdGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnNbbGF5ZXJJZF0uZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5mdW5jdGlvbiBwYWludEF0dHJpYnV0ZU5hbWVzKHByb3BlcnR5LCB0eXBlKSB7XG4gICAgY29uc3QgYXR0cmlidXRlTmFtZUV4Y2VwdGlvbnMgPSB7XG4gICAgICAgICd0ZXh0LW9wYWNpdHknOiBbJ29wYWNpdHknXSxcbiAgICAgICAgJ2ljb24tb3BhY2l0eSc6IFsnb3BhY2l0eSddLFxuICAgICAgICAndGV4dC1jb2xvcic6IFsnZmlsbF9jb2xvciddLFxuICAgICAgICAnaWNvbi1jb2xvcic6IFsnZmlsbF9jb2xvciddLFxuICAgICAgICAndGV4dC1oYWxvLWNvbG9yJzogWydoYWxvX2NvbG9yJ10sXG4gICAgICAgICdpY29uLWhhbG8tY29sb3InOiBbJ2hhbG9fY29sb3InXSxcbiAgICAgICAgJ3RleHQtaGFsby1ibHVyJzogWydoYWxvX2JsdXInXSxcbiAgICAgICAgJ2ljb24taGFsby1ibHVyJzogWydoYWxvX2JsdXInXSxcbiAgICAgICAgJ3RleHQtaGFsby13aWR0aCc6IFsnaGFsb193aWR0aCddLFxuICAgICAgICAnaWNvbi1oYWxvLXdpZHRoJzogWydoYWxvX3dpZHRoJ10sXG4gICAgICAgICdsaW5lLWdhcC13aWR0aCc6IFsnZ2Fwd2lkdGgnXSxcbiAgICAgICAgJ2xpbmUtcGF0dGVybic6IFsncGF0dGVybl90bycsICdwYXR0ZXJuX2Zyb20nXSxcbiAgICAgICAgJ2ZpbGwtcGF0dGVybic6IFsncGF0dGVybl90bycsICdwYXR0ZXJuX2Zyb20nXSxcbiAgICAgICAgJ2ZpbGwtZXh0cnVzaW9uLXBhdHRlcm4nOiBbJ3BhdHRlcm5fdG8nLCAncGF0dGVybl9mcm9tJ10sXG4gICAgfTtcblxuICAgIHJldHVybiBhdHRyaWJ1dGVOYW1lRXhjZXB0aW9uc1twcm9wZXJ0eV0gfHxcbiAgICAgICAgW3Byb3BlcnR5LnJlcGxhY2UoYCR7dHlwZX0tYCwgJycpLnJlcGxhY2UoLy0vZywgJ18nKV07XG59XG5cbmZ1bmN0aW9uIGdldExheW91dEV4Y2VwdGlvbihwcm9wZXJ0eSkge1xuICAgIGNvbnN0IHByb3BlcnR5RXhjZXB0aW9ucyA9IHtcbiAgICAgICAgJ2xpbmUtcGF0dGVybic6e1xuICAgICAgICAgICAgJ3NvdXJjZSc6IFBhdHRlcm5MYXlvdXRBcnJheSxcbiAgICAgICAgICAgICdjb21wb3NpdGUnOiBQYXR0ZXJuTGF5b3V0QXJyYXlcbiAgICAgICAgfSxcbiAgICAgICAgJ2ZpbGwtcGF0dGVybic6IHtcbiAgICAgICAgICAgICdzb3VyY2UnOiBQYXR0ZXJuTGF5b3V0QXJyYXksXG4gICAgICAgICAgICAnY29tcG9zaXRlJzogUGF0dGVybkxheW91dEFycmF5XG4gICAgICAgIH0sXG4gICAgICAgICdmaWxsLWV4dHJ1c2lvbi1wYXR0ZXJuJzp7XG4gICAgICAgICAgICAnc291cmNlJzogUGF0dGVybkxheW91dEFycmF5LFxuICAgICAgICAgICAgJ2NvbXBvc2l0ZSc6IFBhdHRlcm5MYXlvdXRBcnJheVxuICAgICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiBwcm9wZXJ0eUV4Y2VwdGlvbnNbcHJvcGVydHldO1xufVxuXG5mdW5jdGlvbiBsYXlvdXRUeXBlKHByb3BlcnR5LCB0eXBlLCBiaW5kZXJUeXBlKSB7XG4gICAgY29uc3QgZGVmYXVsdExheW91dHMgPSB7XG4gICAgICAgICdjb2xvcic6IHtcbiAgICAgICAgICAgICdzb3VyY2UnOiBTdHJ1Y3RBcnJheUxheW91dDJmOCxcbiAgICAgICAgICAgICdjb21wb3NpdGUnOiBTdHJ1Y3RBcnJheUxheW91dDRmMTZcbiAgICAgICAgfSxcbiAgICAgICAgJ251bWJlcic6IHtcbiAgICAgICAgICAgICdzb3VyY2UnOiBTdHJ1Y3RBcnJheUxheW91dDFmNCxcbiAgICAgICAgICAgICdjb21wb3NpdGUnOiBTdHJ1Y3RBcnJheUxheW91dDJmOFxuICAgICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IGxheW91dEV4Y2VwdGlvbiA9IGdldExheW91dEV4Y2VwdGlvbihwcm9wZXJ0eSk7XG4gICAgcmV0dXJuICBsYXlvdXRFeGNlcHRpb24gJiYgbGF5b3V0RXhjZXB0aW9uW2JpbmRlclR5cGVdIHx8XG4gICAgICAgIGRlZmF1bHRMYXlvdXRzW3R5cGVdW2JpbmRlclR5cGVdO1xufVxuXG5yZWdpc3RlcignQ29uc3RhbnRCaW5kZXInLCBDb25zdGFudEJpbmRlcik7XG5yZWdpc3RlcignQ3Jvc3NGYWRlZENvbnN0YW50QmluZGVyJywgQ3Jvc3NGYWRlZENvbnN0YW50QmluZGVyKTtcbnJlZ2lzdGVyKCdTb3VyY2VFeHByZXNzaW9uQmluZGVyJywgU291cmNlRXhwcmVzc2lvbkJpbmRlcik7XG5yZWdpc3RlcignQ3Jvc3NGYWRlZENvbXBvc2l0ZUJpbmRlcicsIENyb3NzRmFkZWRDb21wb3NpdGVCaW5kZXIpO1xucmVnaXN0ZXIoJ0NvbXBvc2l0ZUV4cHJlc3Npb25CaW5kZXInLCBDb21wb3NpdGVFeHByZXNzaW9uQmluZGVyKTtcbnJlZ2lzdGVyKCdQcm9ncmFtQ29uZmlndXJhdGlvbicsIFByb2dyYW1Db25maWd1cmF0aW9uLCB7b21pdDogWydfYnVmZmVycyddfSk7XG5yZWdpc3RlcignUHJvZ3JhbUNvbmZpZ3VyYXRpb25TZXQnLCBQcm9ncmFtQ29uZmlndXJhdGlvblNldCk7XG4iLCIvLyBAZmxvd1xuXG4vKipcbiAqIFRoZSBtYXhpbXVtIHZhbHVlIG9mIGEgY29vcmRpbmF0ZSBpbiB0aGUgaW50ZXJuYWwgdGlsZSBjb29yZGluYXRlIHN5c3RlbS4gQ29vcmRpbmF0ZXMgb2ZcbiAqIGFsbCBzb3VyY2UgZmVhdHVyZXMgbm9ybWFsaXplZCB0byB0aGlzIGV4dGVudCB1cG9uIGxvYWQuXG4gKlxuICogVGhlIHZhbHVlIGlzIGEgY29uc2VxdWVuY2Ugb2YgdGhlIGZvbGxvd2luZzpcbiAqXG4gKiAqIFZlcnRleCBidWZmZXIgc3RvcmUgcG9zaXRpb25zIGFzIHNpZ25lZCAxNiBiaXQgaW50ZWdlcnMuXG4gKiAqIE9uZSBiaXQgaXMgbG9zdCBmb3Igc2lnbmVkbmVzcyB0byBzdXBwb3J0IHRpbGUgYnVmZmVycy5cbiAqICogT25lIGJpdCBpcyBsb3N0IGJlY2F1c2UgdGhlIGxpbmUgdmVydGV4IGJ1ZmZlciB1c2VkIHRvIHBhY2sgMSBiaXQgb2Ygb3RoZXIgZGF0YSBpbnRvIHRoZSBpbnQuXG4gKiAgIFRoaXMgaXMgbm8gbG9uZ2VyIHRoZSBjYXNlIGJ1dCB3ZSdyZSByZXNlcnZpbmcgdGhpcyBiaXQgYW55d2F5LlxuICogKiBPbmUgYml0IGlzIGxvc3QgdG8gc3VwcG9ydCBmZWF0dXJlcyBleHRlbmRpbmcgcGFzdCB0aGUgZXh0ZW50IG9uIHRoZSByaWdodCBlZGdlIG9mIHRoZSB0aWxlLlxuICogKiBUaGlzIGxlYXZlcyB1cyB3aXRoIDJeMTMgPSA4MTkyXG4gKlxuICogQHByaXZhdGVcbiAqIEByZWFkb25seVxuICovXG5leHBvcnQgZGVmYXVsdCA4MTkyO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHsgd2Fybk9uY2UgfSBmcm9tICcuLi91dGlsL3V0aWwnO1xuXG5pbXBvcnQgRVhURU5UIGZyb20gJy4vZXh0ZW50JztcblxuaW1wb3J0IHR5cGUgUG9pbnQgZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XG5cbi8vIFRoZXNlIGJvdW5kcyBkZWZpbmUgdGhlIG1pbmltdW0gYW5kIG1heGltdW0gc3VwcG9ydGVkIGNvb3JkaW5hdGUgdmFsdWVzLlxuLy8gV2hpbGUgdmlzaWJsZSBjb29yZGluYXRlcyBhcmUgd2l0aGluIFswLCBFWFRFTlRdLCB0aWxlcyBtYXkgdGhlb3JldGljYWxseVxuLy8gY29udGFpbiBjb3JkaW5hdGVzIHdpdGhpbiBbLUluZmluaXR5LCBJbmZpbml0eV0uIE91ciByYW5nZSBpcyBsaW1pdGVkIGJ5IHRoZVxuLy8gbnVtYmVyIG9mIGJpdHMgdXNlZCB0byByZXByZXNlbnQgdGhlIGNvb3JkaW5hdGUuXG5mdW5jdGlvbiBjcmVhdGVCb3VuZHMoYml0cykge1xuICAgIHJldHVybiB7XG4gICAgICAgIG1pbjogLTEgKiBNYXRoLnBvdygyLCBiaXRzIC0gMSksXG4gICAgICAgIG1heDogTWF0aC5wb3coMiwgYml0cyAtIDEpIC0gMVxuICAgIH07XG59XG5cbmNvbnN0IGJvdW5kcyA9IGNyZWF0ZUJvdW5kcygxNik7XG5cbi8qKlxuICogTG9hZHMgYSBnZW9tZXRyeSBmcm9tIGEgVmVjdG9yVGlsZUZlYXR1cmUgYW5kIHNjYWxlcyBpdCB0byB0aGUgY29tbW9uIGV4dGVudFxuICogdXNlZCBpbnRlcm5hbGx5LlxuICogQHBhcmFtIHtWZWN0b3JUaWxlRmVhdHVyZX0gZmVhdHVyZVxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbG9hZEdlb21ldHJ5KGZlYXR1cmU6IFZlY3RvclRpbGVGZWF0dXJlKTogQXJyYXk8QXJyYXk8UG9pbnQ+PiB7XG4gICAgY29uc3Qgc2NhbGUgPSBFWFRFTlQgLyBmZWF0dXJlLmV4dGVudDtcbiAgICBjb25zdCBnZW9tZXRyeSA9IGZlYXR1cmUubG9hZEdlb21ldHJ5KCk7XG4gICAgZm9yIChsZXQgciA9IDA7IHIgPCBnZW9tZXRyeS5sZW5ndGg7IHIrKykge1xuICAgICAgICBjb25zdCByaW5nID0gZ2VvbWV0cnlbcl07XG4gICAgICAgIGZvciAobGV0IHAgPSAwOyBwIDwgcmluZy5sZW5ndGg7IHArKykge1xuICAgICAgICAgICAgY29uc3QgcG9pbnQgPSByaW5nW3BdO1xuICAgICAgICAgICAgLy8gcm91bmQgaGVyZSBiZWNhdXNlIG1hcGJveC1nbC1uYXRpdmUgdXNlcyBpbnRlZ2VycyB0byByZXByZXNlbnRcbiAgICAgICAgICAgIC8vIHBvaW50cyBhbmQgd2UgbmVlZCB0byBkbyB0aGUgc2FtZSB0byBhdm9pZCByZW5lcmluZyBkaWZmZXJlbmNlcy5cbiAgICAgICAgICAgIHBvaW50LnggPSBNYXRoLnJvdW5kKHBvaW50LnggKiBzY2FsZSk7XG4gICAgICAgICAgICBwb2ludC55ID0gTWF0aC5yb3VuZChwb2ludC55ICogc2NhbGUpO1xuXG4gICAgICAgICAgICBpZiAocG9pbnQueCA8IGJvdW5kcy5taW4gfHwgcG9pbnQueCA+IGJvdW5kcy5tYXggfHwgcG9pbnQueSA8IGJvdW5kcy5taW4gfHwgcG9pbnQueSA+IGJvdW5kcy5tYXgpIHtcbiAgICAgICAgICAgICAgICB3YXJuT25jZSgnR2VvbWV0cnkgZXhjZWVkcyBhbGxvd2VkIGV4dGVudCwgcmVkdWNlIHlvdXIgdmVjdG9yIHRpbGUgYnVmZmVyIHNpemUnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZ2VvbWV0cnk7XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgeyBDaXJjbGVMYXlvdXRBcnJheSB9IGZyb20gJy4uL2FycmF5X3R5cGVzJztcblxuaW1wb3J0IHsgbWVtYmVycyBhcyBsYXlvdXRBdHRyaWJ1dGVzIH0gZnJvbSAnLi9jaXJjbGVfYXR0cmlidXRlcyc7XG5pbXBvcnQgU2VnbWVudFZlY3RvciBmcm9tICcuLi9zZWdtZW50JztcbmltcG9ydCB7IFByb2dyYW1Db25maWd1cmF0aW9uU2V0IH0gZnJvbSAnLi4vcHJvZ3JhbV9jb25maWd1cmF0aW9uJztcbmltcG9ydCB7IFRyaWFuZ2xlSW5kZXhBcnJheSB9IGZyb20gJy4uL2luZGV4X2FycmF5X3R5cGUnO1xuaW1wb3J0IGxvYWRHZW9tZXRyeSBmcm9tICcuLi9sb2FkX2dlb21ldHJ5JztcbmltcG9ydCBFWFRFTlQgZnJvbSAnLi4vZXh0ZW50JztcbmltcG9ydCB7IHJlZ2lzdGVyIH0gZnJvbSAnLi4vLi4vdXRpbC93ZWJfd29ya2VyX3RyYW5zZmVyJztcbmltcG9ydCBFdmFsdWF0aW9uUGFyYW1ldGVycyBmcm9tICcuLi8uLi9zdHlsZS9ldmFsdWF0aW9uX3BhcmFtZXRlcnMnO1xuXG5pbXBvcnQgdHlwZSB7XG4gICAgQnVja2V0LFxuICAgIEJ1Y2tldFBhcmFtZXRlcnMsXG4gICAgSW5kZXhlZEZlYXR1cmUsXG4gICAgUG9wdWxhdGVQYXJhbWV0ZXJzXG59IGZyb20gJy4uL2J1Y2tldCc7XG5pbXBvcnQgdHlwZSBDaXJjbGVTdHlsZUxheWVyIGZyb20gJy4uLy4uL3N0eWxlL3N0eWxlX2xheWVyL2NpcmNsZV9zdHlsZV9sYXllcic7XG5pbXBvcnQgdHlwZSBIZWF0bWFwU3R5bGVMYXllciBmcm9tICcuLi8uLi9zdHlsZS9zdHlsZV9sYXllci9oZWF0bWFwX3N0eWxlX2xheWVyJztcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSAnLi4vLi4vZ2wvY29udGV4dCc7XG5pbXBvcnQgdHlwZSBJbmRleEJ1ZmZlciBmcm9tICcuLi8uLi9nbC9pbmRleF9idWZmZXInO1xuaW1wb3J0IHR5cGUgVmVydGV4QnVmZmVyIGZyb20gJy4uLy4uL2dsL3ZlcnRleF9idWZmZXInO1xuaW1wb3J0IHR5cGUgUG9pbnQgZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XG5pbXBvcnQgdHlwZSB7RmVhdHVyZVN0YXRlc30gZnJvbSAnLi4vLi4vc291cmNlL3NvdXJjZV9zdGF0ZSc7XG5pbXBvcnQgdHlwZSB7SW1hZ2VQb3NpdGlvbn0gZnJvbSAnLi4vLi4vcmVuZGVyL2ltYWdlX2F0bGFzJztcblxuXG5mdW5jdGlvbiBhZGRDaXJjbGVWZXJ0ZXgobGF5b3V0VmVydGV4QXJyYXksIHgsIHksIGV4dHJ1ZGVYLCBleHRydWRlWSkge1xuICAgIGxheW91dFZlcnRleEFycmF5LmVtcGxhY2VCYWNrKFxuICAgICAgICAoeCAqIDIpICsgKChleHRydWRlWCArIDEpIC8gMiksXG4gICAgICAgICh5ICogMikgKyAoKGV4dHJ1ZGVZICsgMSkgLyAyKSk7XG59XG5cblxuLyoqXG4gKiBDaXJjbGVzIGFyZSByZXByZXNlbnRlZCBieSB0d28gdHJpYW5nbGVzLlxuICpcbiAqIEVhY2ggY29ybmVyIGhhcyBhIHBvcyB0aGF0IGlzIHRoZSBjZW50ZXIgb2YgdGhlIGNpcmNsZSBhbmQgYW4gZXh0cnVzaW9uXG4gKiB2ZWN0b3IgdGhhdCBpcyB3aGVyZSBpdCBwb2ludHMuXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBDaXJjbGVCdWNrZXQ8TGF5ZXI6IENpcmNsZVN0eWxlTGF5ZXIgfCBIZWF0bWFwU3R5bGVMYXllcj4gaW1wbGVtZW50cyBCdWNrZXQge1xuICAgIGluZGV4OiBudW1iZXI7XG4gICAgem9vbTogbnVtYmVyO1xuICAgIG92ZXJzY2FsaW5nOiBudW1iZXI7XG4gICAgbGF5ZXJJZHM6IEFycmF5PHN0cmluZz47XG4gICAgbGF5ZXJzOiBBcnJheTxMYXllcj47XG4gICAgc3RhdGVEZXBlbmRlbnRMYXllcnM6IEFycmF5PExheWVyPjtcbiAgICBzdGF0ZURlcGVuZGVudExheWVySWRzOiBBcnJheTxzdHJpbmc+O1xuXG4gICAgbGF5b3V0VmVydGV4QXJyYXk6IENpcmNsZUxheW91dEFycmF5O1xuICAgIGxheW91dFZlcnRleEJ1ZmZlcjogVmVydGV4QnVmZmVyO1xuXG4gICAgaW5kZXhBcnJheTogVHJpYW5nbGVJbmRleEFycmF5O1xuICAgIGluZGV4QnVmZmVyOiBJbmRleEJ1ZmZlcjtcblxuICAgIGhhc1BhdHRlcm46IGJvb2xlYW47XG4gICAgcHJvZ3JhbUNvbmZpZ3VyYXRpb25zOiBQcm9ncmFtQ29uZmlndXJhdGlvblNldDxMYXllcj47XG4gICAgc2VnbWVudHM6IFNlZ21lbnRWZWN0b3I7XG4gICAgdXBsb2FkZWQ6IGJvb2xlYW47XG5cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOiBCdWNrZXRQYXJhbWV0ZXJzPExheWVyPikge1xuICAgICAgICB0aGlzLnpvb20gPSBvcHRpb25zLnpvb207XG4gICAgICAgIHRoaXMub3ZlcnNjYWxpbmcgPSBvcHRpb25zLm92ZXJzY2FsaW5nO1xuICAgICAgICB0aGlzLmxheWVycyA9IG9wdGlvbnMubGF5ZXJzO1xuICAgICAgICB0aGlzLmxheWVySWRzID0gdGhpcy5sYXllcnMubWFwKGxheWVyID0+IGxheWVyLmlkKTtcbiAgICAgICAgdGhpcy5pbmRleCA9IG9wdGlvbnMuaW5kZXg7XG4gICAgICAgIHRoaXMuaGFzUGF0dGVybiA9IGZhbHNlO1xuXG4gICAgICAgIHRoaXMubGF5b3V0VmVydGV4QXJyYXkgPSBuZXcgQ2lyY2xlTGF5b3V0QXJyYXkoKTtcbiAgICAgICAgdGhpcy5pbmRleEFycmF5ID0gbmV3IFRyaWFuZ2xlSW5kZXhBcnJheSgpO1xuICAgICAgICB0aGlzLnNlZ21lbnRzID0gbmV3IFNlZ21lbnRWZWN0b3IoKTtcbiAgICAgICAgdGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnMgPSBuZXcgUHJvZ3JhbUNvbmZpZ3VyYXRpb25TZXQobGF5b3V0QXR0cmlidXRlcywgb3B0aW9ucy5sYXllcnMsIG9wdGlvbnMuem9vbSk7XG4gICAgICAgIHRoaXMuc3RhdGVEZXBlbmRlbnRMYXllcklkcyA9IHRoaXMubGF5ZXJzLmZpbHRlcigobCkgPT4gbC5pc1N0YXRlRGVwZW5kZW50KCkpLm1hcCgobCkgPT4gbC5pZCk7XG5cbiAgICB9XG5cbiAgICBwb3B1bGF0ZShmZWF0dXJlczogQXJyYXk8SW5kZXhlZEZlYXR1cmU+LCBvcHRpb25zOiBQb3B1bGF0ZVBhcmFtZXRlcnMpIHtcbiAgICAgICAgZm9yIChjb25zdCB7ZmVhdHVyZSwgaW5kZXgsIHNvdXJjZUxheWVySW5kZXh9IG9mIGZlYXR1cmVzKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5sYXllcnNbMF0uX2ZlYXR1cmVGaWx0ZXIobmV3IEV2YWx1YXRpb25QYXJhbWV0ZXJzKHRoaXMuem9vbSksIGZlYXR1cmUpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZ2VvbWV0cnkgPSBsb2FkR2VvbWV0cnkoZmVhdHVyZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRGZWF0dXJlKGZlYXR1cmUsIGdlb21ldHJ5LCBpbmRleCk7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5mZWF0dXJlSW5kZXguaW5zZXJ0KGZlYXR1cmUsIGdlb21ldHJ5LCBpbmRleCwgc291cmNlTGF5ZXJJbmRleCwgdGhpcy5pbmRleCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1cGRhdGUoc3RhdGVzOiBGZWF0dXJlU3RhdGVzLCB2dExheWVyOiBWZWN0b3JUaWxlTGF5ZXIsIGltYWdlUG9zaXRpb25zOiB7W3N0cmluZ106IEltYWdlUG9zaXRpb259KSB7XG4gICAgICAgIGlmICghdGhpcy5zdGF0ZURlcGVuZGVudExheWVycy5sZW5ndGgpIHJldHVybjtcbiAgICAgICAgdGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnMudXBkYXRlUGFpbnRBcnJheXMoc3RhdGVzLCB2dExheWVyLCB0aGlzLnN0YXRlRGVwZW5kZW50TGF5ZXJzLCBpbWFnZVBvc2l0aW9ucyk7XG4gICAgfVxuXG4gICAgaXNFbXB0eSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGF5b3V0VmVydGV4QXJyYXkubGVuZ3RoID09PSAwO1xuICAgIH1cblxuICAgIHVwbG9hZFBlbmRpbmcoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy51cGxvYWRlZCB8fCB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucy5uZWVkc1VwbG9hZDtcbiAgICB9XG5cbiAgICB1cGxvYWQoY29udGV4dDogQ29udGV4dCkge1xuICAgICAgICBpZiAoIXRoaXMudXBsb2FkZWQpIHtcbiAgICAgICAgICAgIHRoaXMubGF5b3V0VmVydGV4QnVmZmVyID0gY29udGV4dC5jcmVhdGVWZXJ0ZXhCdWZmZXIodGhpcy5sYXlvdXRWZXJ0ZXhBcnJheSwgbGF5b3V0QXR0cmlidXRlcyk7XG4gICAgICAgICAgICB0aGlzLmluZGV4QnVmZmVyID0gY29udGV4dC5jcmVhdGVJbmRleEJ1ZmZlcih0aGlzLmluZGV4QXJyYXkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLnVwbG9hZChjb250ZXh0KTtcbiAgICAgICAgdGhpcy51cGxvYWRlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmxheW91dFZlcnRleEJ1ZmZlcikgcmV0dXJuO1xuICAgICAgICB0aGlzLmxheW91dFZlcnRleEJ1ZmZlci5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMuaW5kZXhCdWZmZXIuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucy5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMuc2VnbWVudHMuZGVzdHJveSgpO1xuICAgIH1cblxuICAgIGFkZEZlYXR1cmUoZmVhdHVyZTogVmVjdG9yVGlsZUZlYXR1cmUsIGdlb21ldHJ5OiBBcnJheTxBcnJheTxQb2ludD4+LCBpbmRleDogbnVtYmVyKSB7XG4gICAgICAgIGZvciAoY29uc3QgcmluZyBvZiBnZW9tZXRyeSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBwb2ludCBvZiByaW5nKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeCA9IHBvaW50Lng7XG4gICAgICAgICAgICAgICAgY29uc3QgeSA9IHBvaW50Lnk7XG5cbiAgICAgICAgICAgICAgICAvLyBEbyBub3QgaW5jbHVkZSBwb2ludHMgdGhhdCBhcmUgb3V0c2lkZSB0aGUgdGlsZSBib3VuZGFyaWVzLlxuICAgICAgICAgICAgICAgIGlmICh4IDwgMCB8fCB4ID49IEVYVEVOVCB8fCB5IDwgMCB8fCB5ID49IEVYVEVOVCkgY29udGludWU7XG5cbiAgICAgICAgICAgICAgICAvLyB0aGlzIGdlb21ldHJ5IHdpbGwgYmUgb2YgdGhlIFBvaW50IHR5cGUsIGFuZCB3ZSdsbCBkZXJpdmVcbiAgICAgICAgICAgICAgICAvLyB0d28gdHJpYW5nbGVzIGZyb20gaXQuXG4gICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAvLyDDosKUwozDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwpBcbiAgICAgICAgICAgICAgICAvLyDDosKUwoIgMyAgICAgMiDDosKUwoJcbiAgICAgICAgICAgICAgICAvLyDDosKUwoIgICAgICAgICDDosKUwoJcbiAgICAgICAgICAgICAgICAvLyDDosKUwoIgMCAgICAgMSDDosKUwoJcbiAgICAgICAgICAgICAgICAvLyDDosKUwpTDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwphcblxuICAgICAgICAgICAgICAgIGNvbnN0IHNlZ21lbnQgPSB0aGlzLnNlZ21lbnRzLnByZXBhcmVTZWdtZW50KDQsIHRoaXMubGF5b3V0VmVydGV4QXJyYXksIHRoaXMuaW5kZXhBcnJheSk7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBzZWdtZW50LnZlcnRleExlbmd0aDtcblxuICAgICAgICAgICAgICAgIGFkZENpcmNsZVZlcnRleCh0aGlzLmxheW91dFZlcnRleEFycmF5LCB4LCB5LCAtMSwgLTEpO1xuICAgICAgICAgICAgICAgIGFkZENpcmNsZVZlcnRleCh0aGlzLmxheW91dFZlcnRleEFycmF5LCB4LCB5LCAxLCAtMSk7XG4gICAgICAgICAgICAgICAgYWRkQ2lyY2xlVmVydGV4KHRoaXMubGF5b3V0VmVydGV4QXJyYXksIHgsIHksIDEsIDEpO1xuICAgICAgICAgICAgICAgIGFkZENpcmNsZVZlcnRleCh0aGlzLmxheW91dFZlcnRleEFycmF5LCB4LCB5LCAtMSwgMSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmluZGV4QXJyYXkuZW1wbGFjZUJhY2soaW5kZXgsIGluZGV4ICsgMSwgaW5kZXggKyAyKTtcbiAgICAgICAgICAgICAgICB0aGlzLmluZGV4QXJyYXkuZW1wbGFjZUJhY2soaW5kZXgsIGluZGV4ICsgMywgaW5kZXggKyAyKTtcblxuICAgICAgICAgICAgICAgIHNlZ21lbnQudmVydGV4TGVuZ3RoICs9IDQ7XG4gICAgICAgICAgICAgICAgc2VnbWVudC5wcmltaXRpdmVMZW5ndGggKz0gMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLnBvcHVsYXRlUGFpbnRBcnJheXModGhpcy5sYXlvdXRWZXJ0ZXhBcnJheS5sZW5ndGgsIGZlYXR1cmUsIGluZGV4LCB7fSk7XG4gICAgfVxufVxuXG5yZWdpc3RlcignQ2lyY2xlQnVja2V0JywgQ2lyY2xlQnVja2V0LCB7b21pdDogWydsYXllcnMnXX0pO1xuXG5leHBvcnQgZGVmYXVsdCBDaXJjbGVCdWNrZXQ7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgeyBpc0NvdW50ZXJDbG9ja3dpc2UgfSBmcm9tICcuL3V0aWwnO1xuXG5pbXBvcnQgUG9pbnQgZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XG5cbmV4cG9ydCB7IHBvbHlnb25JbnRlcnNlY3RzQnVmZmVyZWRQb2ludCwgcG9seWdvbkludGVyc2VjdHNNdWx0aVBvbHlnb24sIHBvbHlnb25JbnRlcnNlY3RzQnVmZmVyZWRNdWx0aUxpbmUsIHBvbHlnb25JbnRlcnNlY3RzUG9seWdvbiwgZGlzdFRvU2VnbWVudFNxdWFyZWQsIHBvbHlnb25JbnRlcnNlY3RzQm94IH07XG5cbnR5cGUgTGluZSA9IEFycmF5PFBvaW50PjtcbnR5cGUgTXVsdGlMaW5lID0gQXJyYXk8TGluZT47XG50eXBlIFJpbmcgPSBBcnJheTxQb2ludD47XG50eXBlIFBvbHlnb24gPSBBcnJheTxQb2ludD47XG50eXBlIE11bHRpUG9seWdvbiA9IEFycmF5PFBvbHlnb24+O1xuXG5mdW5jdGlvbiBwb2x5Z29uSW50ZXJzZWN0c1BvbHlnb24ocG9seWdvbkE6IFBvbHlnb24sIHBvbHlnb25COiBQb2x5Z29uKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb2x5Z29uQS5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAocG9seWdvbkNvbnRhaW5zUG9pbnQocG9seWdvbkIsIHBvbHlnb25BW2ldKSkgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb2x5Z29uQi5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAocG9seWdvbkNvbnRhaW5zUG9pbnQocG9seWdvbkEsIHBvbHlnb25CW2ldKSkgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGxpbmVJbnRlcnNlY3RzTGluZShwb2x5Z29uQSwgcG9seWdvbkIpKSByZXR1cm4gdHJ1ZTtcblxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gcG9seWdvbkludGVyc2VjdHNCdWZmZXJlZFBvaW50KHBvbHlnb246IFBvbHlnb24sIHBvaW50OiBQb2ludCwgcmFkaXVzOiBudW1iZXIpIHtcbiAgICBpZiAocG9seWdvbkNvbnRhaW5zUG9pbnQocG9seWdvbiwgcG9pbnQpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAocG9pbnRJbnRlcnNlY3RzQnVmZmVyZWRMaW5lKHBvaW50LCBwb2x5Z29uLCByYWRpdXMpKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHBvbHlnb25JbnRlcnNlY3RzTXVsdGlQb2x5Z29uKHBvbHlnb246IFBvbHlnb24sIG11bHRpUG9seWdvbjogTXVsdGlQb2x5Z29uKSB7XG5cbiAgICBpZiAocG9seWdvbi5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIG11bHRpUG9seWdvbkNvbnRhaW5zUG9pbnQobXVsdGlQb2x5Z29uLCBwb2x5Z29uWzBdKTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBtID0gMDsgbSA8IG11bHRpUG9seWdvbi5sZW5ndGg7IG0rKykge1xuICAgICAgICBjb25zdCByaW5nID0gbXVsdGlQb2x5Z29uW21dO1xuICAgICAgICBmb3IgKGxldCBuID0gMDsgbiA8IHJpbmcubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICAgIGlmIChwb2x5Z29uQ29udGFpbnNQb2ludChwb2x5Z29uLCByaW5nW25dKSkgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvbHlnb24ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKG11bHRpUG9seWdvbkNvbnRhaW5zUG9pbnQobXVsdGlQb2x5Z29uLCBwb2x5Z29uW2ldKSkgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgayA9IDA7IGsgPCBtdWx0aVBvbHlnb24ubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgaWYgKGxpbmVJbnRlcnNlY3RzTGluZShwb2x5Z29uLCBtdWx0aVBvbHlnb25ba10pKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHBvbHlnb25JbnRlcnNlY3RzQnVmZmVyZWRNdWx0aUxpbmUocG9seWdvbjogUG9seWdvbiwgbXVsdGlMaW5lOiBNdWx0aUxpbmUsIHJhZGl1czogbnVtYmVyKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtdWx0aUxpbmUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgbGluZSA9IG11bHRpTGluZVtpXTtcblxuICAgICAgICBpZiAocG9seWdvbi5sZW5ndGggPj0gMykge1xuICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBsaW5lLmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBvbHlnb25Db250YWluc1BvaW50KHBvbHlnb24sIGxpbmVba10pKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChsaW5lSW50ZXJzZWN0c0J1ZmZlcmVkTGluZShwb2x5Z29uLCBsaW5lLCByYWRpdXMpKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBsaW5lSW50ZXJzZWN0c0J1ZmZlcmVkTGluZShsaW5lQTogTGluZSwgbGluZUI6IExpbmUsIHJhZGl1czogbnVtYmVyKSB7XG5cbiAgICBpZiAobGluZUEubGVuZ3RoID4gMSkge1xuICAgICAgICBpZiAobGluZUludGVyc2VjdHNMaW5lKGxpbmVBLCBsaW5lQikpIHJldHVybiB0cnVlO1xuXG4gICAgICAgIC8vIENoZWNrIHdoZXRoZXIgYW55IHBvaW50IGluIGVpdGhlciBsaW5lIGlzIHdpdGhpbiByYWRpdXMgb2YgdGhlIG90aGVyIGxpbmVcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBsaW5lQi5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgaWYgKHBvaW50SW50ZXJzZWN0c0J1ZmZlcmVkTGluZShsaW5lQltqXSwgbGluZUEsIHJhZGl1cykpIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChsZXQgayA9IDA7IGsgPCBsaW5lQS5sZW5ndGg7IGsrKykge1xuICAgICAgICBpZiAocG9pbnRJbnRlcnNlY3RzQnVmZmVyZWRMaW5lKGxpbmVBW2tdLCBsaW5lQiwgcmFkaXVzKSkgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBsaW5lSW50ZXJzZWN0c0xpbmUobGluZUE6IExpbmUsIGxpbmVCOiBMaW5lKSB7XG4gICAgaWYgKGxpbmVBLmxlbmd0aCA9PT0gMCB8fCBsaW5lQi5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVBLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICBjb25zdCBhMCA9IGxpbmVBW2ldO1xuICAgICAgICBjb25zdCBhMSA9IGxpbmVBW2kgKyAxXTtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBsaW5lQi5sZW5ndGggLSAxOyBqKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGIwID0gbGluZUJbal07XG4gICAgICAgICAgICBjb25zdCBiMSA9IGxpbmVCW2ogKyAxXTtcbiAgICAgICAgICAgIGlmIChsaW5lU2VnbWVudEludGVyc2VjdHNMaW5lU2VnbWVudChhMCwgYTEsIGIwLCBiMSkpIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gbGluZVNlZ21lbnRJbnRlcnNlY3RzTGluZVNlZ21lbnQoYTA6IFBvaW50LCBhMTogUG9pbnQsIGIwOiBQb2ludCwgYjE6IFBvaW50KSB7XG4gICAgcmV0dXJuIGlzQ291bnRlckNsb2Nrd2lzZShhMCwgYjAsIGIxKSAhPT0gaXNDb3VudGVyQ2xvY2t3aXNlKGExLCBiMCwgYjEpICYmXG4gICAgICAgIGlzQ291bnRlckNsb2Nrd2lzZShhMCwgYTEsIGIwKSAhPT0gaXNDb3VudGVyQ2xvY2t3aXNlKGEwLCBhMSwgYjEpO1xufVxuXG5mdW5jdGlvbiBwb2ludEludGVyc2VjdHNCdWZmZXJlZExpbmUocDogUG9pbnQsIGxpbmU6IExpbmUsIHJhZGl1czogbnVtYmVyKSB7XG4gICAgY29uc3QgcmFkaXVzU3F1YXJlZCA9IHJhZGl1cyAqIHJhZGl1cztcblxuICAgIGlmIChsaW5lLmxlbmd0aCA9PT0gMSkgcmV0dXJuIHAuZGlzdFNxcihsaW5lWzBdKSA8IHJhZGl1c1NxdWFyZWQ7XG5cbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IGxpbmUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgLy8gRmluZCBsaW5lIHNlZ21lbnRzIHRoYXQgaGF2ZSBhIGRpc3RhbmNlIDw9IHJhZGl1c14yIHRvIHBcbiAgICAgICAgLy8gSW4gdGhhdCBjYXNlLCB3ZSB0cmVhdCB0aGUgbGluZSBhcyBcImNvbnRhaW5pbmcgcG9pbnQgcFwiLlxuICAgICAgICBjb25zdCB2ID0gbGluZVtpIC0gMV0sIHcgPSBsaW5lW2ldO1xuICAgICAgICBpZiAoZGlzdFRvU2VnbWVudFNxdWFyZWQocCwgdiwgdykgPCByYWRpdXNTcXVhcmVkKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG4vLyBDb2RlIGZyb20gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMTUwMTcyNS8zMzEzNzkuXG5mdW5jdGlvbiBkaXN0VG9TZWdtZW50U3F1YXJlZChwOiBQb2ludCwgdjogUG9pbnQsIHc6IFBvaW50KSB7XG4gICAgY29uc3QgbDIgPSB2LmRpc3RTcXIodyk7XG4gICAgaWYgKGwyID09PSAwKSByZXR1cm4gcC5kaXN0U3FyKHYpO1xuICAgIGNvbnN0IHQgPSAoKHAueCAtIHYueCkgKiAody54IC0gdi54KSArIChwLnkgLSB2LnkpICogKHcueSAtIHYueSkpIC8gbDI7XG4gICAgaWYgKHQgPCAwKSByZXR1cm4gcC5kaXN0U3FyKHYpO1xuICAgIGlmICh0ID4gMSkgcmV0dXJuIHAuZGlzdFNxcih3KTtcbiAgICByZXR1cm4gcC5kaXN0U3FyKHcuc3ViKHYpLl9tdWx0KHQpLl9hZGQodikpO1xufVxuXG4vLyBwb2ludCBpbiBwb2x5Z29uIHJheSBjYXN0aW5nIGFsZ29yaXRobVxuZnVuY3Rpb24gbXVsdGlQb2x5Z29uQ29udGFpbnNQb2ludChyaW5nczogQXJyYXk8UmluZz4sIHA6IFBvaW50KSB7XG4gICAgbGV0IGMgPSBmYWxzZSxcbiAgICAgICAgcmluZywgcDEsIHAyO1xuXG4gICAgZm9yIChsZXQgayA9IDA7IGsgPCByaW5ncy5sZW5ndGg7IGsrKykge1xuICAgICAgICByaW5nID0gcmluZ3Nba107XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBqID0gcmluZy5sZW5ndGggLSAxOyBpIDwgcmluZy5sZW5ndGg7IGogPSBpKyspIHtcbiAgICAgICAgICAgIHAxID0gcmluZ1tpXTtcbiAgICAgICAgICAgIHAyID0gcmluZ1tqXTtcbiAgICAgICAgICAgIGlmICgoKHAxLnkgPiBwLnkpICE9PSAocDIueSA+IHAueSkpICYmIChwLnggPCAocDIueCAtIHAxLngpICogKHAueSAtIHAxLnkpIC8gKHAyLnkgLSBwMS55KSArIHAxLngpKSB7XG4gICAgICAgICAgICAgICAgYyA9ICFjO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjO1xufVxuXG5mdW5jdGlvbiBwb2x5Z29uQ29udGFpbnNQb2ludChyaW5nOiBSaW5nLCBwOiBQb2ludCkge1xuICAgIGxldCBjID0gZmFsc2U7XG4gICAgZm9yIChsZXQgaSA9IDAsIGogPSByaW5nLmxlbmd0aCAtIDE7IGkgPCByaW5nLmxlbmd0aDsgaiA9IGkrKykge1xuICAgICAgICBjb25zdCBwMSA9IHJpbmdbaV07XG4gICAgICAgIGNvbnN0IHAyID0gcmluZ1tqXTtcbiAgICAgICAgaWYgKCgocDEueSA+IHAueSkgIT09IChwMi55ID4gcC55KSkgJiYgKHAueCA8IChwMi54IC0gcDEueCkgKiAocC55IC0gcDEueSkgLyAocDIueSAtIHAxLnkpICsgcDEueCkpIHtcbiAgICAgICAgICAgIGMgPSAhYztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYztcbn1cblxuZnVuY3Rpb24gcG9seWdvbkludGVyc2VjdHNCb3gocmluZzogUmluZywgYm94WDE6IG51bWJlciwgYm94WTE6IG51bWJlciwgYm94WDI6IG51bWJlciwgYm94WTI6IG51bWJlcikge1xuICAgIGZvciAoY29uc3QgcCBvZiByaW5nKSB7XG4gICAgICAgIGlmIChib3hYMSA8PSBwLnggJiZcbiAgICAgICAgICAgIGJveFkxIDw9IHAueSAmJlxuICAgICAgICAgICAgYm94WDIgPj0gcC54ICYmXG4gICAgICAgICAgICBib3hZMiA+PSBwLnkpIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGNvcm5lcnMgPSBbXG4gICAgICAgIG5ldyBQb2ludChib3hYMSwgYm94WTEpLFxuICAgICAgICBuZXcgUG9pbnQoYm94WDEsIGJveFkyKSxcbiAgICAgICAgbmV3IFBvaW50KGJveFgyLCBib3hZMiksXG4gICAgICAgIG5ldyBQb2ludChib3hYMiwgYm94WTEpXTtcblxuICAgIGlmIChyaW5nLmxlbmd0aCA+IDIpIHtcbiAgICAgICAgZm9yIChjb25zdCBjb3JuZXIgb2YgY29ybmVycykge1xuICAgICAgICAgICAgaWYgKHBvbHlnb25Db250YWluc1BvaW50KHJpbmcsIGNvcm5lcikpIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByaW5nLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICBjb25zdCBwMSA9IHJpbmdbaV07XG4gICAgICAgIGNvbnN0IHAyID0gcmluZ1tpICsgMV07XG4gICAgICAgIGlmIChlZGdlSW50ZXJzZWN0c0JveChwMSwgcDIsIGNvcm5lcnMpKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGVkZ2VJbnRlcnNlY3RzQm94KGUxOiBQb2ludCwgZTI6IFBvaW50LCBjb3JuZXJzOiBBcnJheTxQb2ludD4pIHtcbiAgICBjb25zdCB0bCA9IGNvcm5lcnNbMF07XG4gICAgY29uc3QgYnIgPSBjb3JuZXJzWzJdO1xuICAgIC8vIHRoZSBlZGdlIGFuZCBib3ggZG8gbm90IGludGVyc2VjdCBpbiBlaXRoZXIgdGhlIHggb3IgeSBkaW1lbnNpb25zXG4gICAgaWYgKCgoZTEueCA8IHRsLngpICYmIChlMi54IDwgdGwueCkpIHx8XG4gICAgICAgICgoZTEueCA+IGJyLngpICYmIChlMi54ID4gYnIueCkpIHx8XG4gICAgICAgICgoZTEueSA8IHRsLnkpICYmIChlMi55IDwgdGwueSkpIHx8XG4gICAgICAgICgoZTEueSA+IGJyLnkpICYmIChlMi55ID4gYnIueSkpKSByZXR1cm4gZmFsc2U7XG5cbiAgICAvLyBjaGVjayBpZiBhbGwgY29ybmVycyBvZiB0aGUgYm94IGFyZSBvbiB0aGUgc2FtZSBzaWRlIG9mIHRoZSBlZGdlXG4gICAgY29uc3QgZGlyID0gaXNDb3VudGVyQ2xvY2t3aXNlKGUxLCBlMiwgY29ybmVyc1swXSk7XG4gICAgcmV0dXJuIGRpciAhPT0gaXNDb3VudGVyQ2xvY2t3aXNlKGUxLCBlMiwgY29ybmVyc1sxXSkgfHxcbiAgICAgICAgZGlyICE9PSBpc0NvdW50ZXJDbG9ja3dpc2UoZTEsIGUyLCBjb3JuZXJzWzJdKSB8fFxuICAgICAgICBkaXIgIT09IGlzQ291bnRlckNsb2Nrd2lzZShlMSwgZTIsIGNvcm5lcnNbM10pO1xufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuXG5pbXBvcnQgdHlwZSB7UG9zc2libHlFdmFsdWF0ZWRQcm9wZXJ0eVZhbHVlfSBmcm9tIFwiLi9wcm9wZXJ0aWVzXCI7XG5pbXBvcnQgdHlwZSBTdHlsZUxheWVyIGZyb20gJy4uL3N0eWxlL3N0eWxlX2xheWVyJztcbmltcG9ydCB0eXBlIENpcmNsZUJ1Y2tldCBmcm9tICcuLi9kYXRhL2J1Y2tldC9jaXJjbGVfYnVja2V0JztcbmltcG9ydCB0eXBlIExpbmVCdWNrZXQgZnJvbSAnLi4vZGF0YS9idWNrZXQvbGluZV9idWNrZXQnO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWF4aW11bVBhaW50VmFsdWUocHJvcGVydHk6IHN0cmluZywgbGF5ZXI6IFN0eWxlTGF5ZXIsIGJ1Y2tldDogQ2lyY2xlQnVja2V0PCo+IHwgTGluZUJ1Y2tldCk6IG51bWJlciB7XG4gICAgY29uc3QgdmFsdWUgPSAoKGxheWVyLnBhaW50OiBhbnkpLmdldChwcm9wZXJ0eSk6IFBvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZTxhbnk+KS52YWx1ZTtcbiAgICBpZiAodmFsdWUua2luZCA9PT0gJ2NvbnN0YW50Jykge1xuICAgICAgICByZXR1cm4gdmFsdWUudmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgYmluZGVycyA9IGJ1Y2tldC5wcm9ncmFtQ29uZmlndXJhdGlvbnMuZ2V0KGxheWVyLmlkKS5iaW5kZXJzO1xuICAgICAgICByZXR1cm4gYmluZGVyc1twcm9wZXJ0eV0ubWF4VmFsdWU7XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNsYXRlRGlzdGFuY2UodHJhbnNsYXRlOiBbbnVtYmVyLCBudW1iZXJdKSB7XG4gICAgcmV0dXJuIE1hdGguc3FydCh0cmFuc2xhdGVbMF0gKiB0cmFuc2xhdGVbMF0gKyB0cmFuc2xhdGVbMV0gKiB0cmFuc2xhdGVbMV0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNsYXRlKHF1ZXJ5R2VvbWV0cnk6IEFycmF5PFBvaW50PixcbiAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGU6IFtudW1iZXIsIG51bWJlcl0sXG4gICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlQW5jaG9yOiAndmlld3BvcnQnIHwgJ21hcCcsXG4gICAgICAgICAgICAgICAgICAgYmVhcmluZzogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgIHBpeGVsc1RvVGlsZVVuaXRzOiBudW1iZXIpIHtcbiAgICBpZiAoIXRyYW5zbGF0ZVswXSAmJiAhdHJhbnNsYXRlWzFdKSB7XG4gICAgICAgIHJldHVybiBxdWVyeUdlb21ldHJ5O1xuICAgIH1cbiAgICBjb25zdCBwdCA9IFBvaW50LmNvbnZlcnQodHJhbnNsYXRlKS5fbXVsdChwaXhlbHNUb1RpbGVVbml0cyk7XG5cbiAgICBpZiAodHJhbnNsYXRlQW5jaG9yID09PSBcInZpZXdwb3J0XCIpIHtcbiAgICAgICAgcHQuX3JvdGF0ZSgtYmVhcmluZyk7XG4gICAgfVxuXG4gICAgY29uc3QgdHJhbnNsYXRlZCA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcXVlcnlHZW9tZXRyeS5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBwb2ludCA9IHF1ZXJ5R2VvbWV0cnlbaV07XG4gICAgICAgIHRyYW5zbGF0ZWQucHVzaChwb2ludC5zdWIocHQpKTtcbiAgICB9XG4gICAgcmV0dXJuIHRyYW5zbGF0ZWQ7XG59XG4iLCIvLyBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkLiBFZGl0IGJ1aWxkL2dlbmVyYXRlLXN0eWxlLWNvZGUuanMsIHRoZW4gcnVuIGB5YXJuIHJ1biBjb2RlZ2VuYC5cbi8vIEBmbG93XG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xuXG5pbXBvcnQgc3R5bGVTcGVjIGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvcmVmZXJlbmNlL2xhdGVzdCc7XG5cbmltcG9ydCB7XG4gICAgUHJvcGVydGllcyxcbiAgICBEYXRhQ29uc3RhbnRQcm9wZXJ0eSxcbiAgICBEYXRhRHJpdmVuUHJvcGVydHksXG4gICAgQ3Jvc3NGYWRlZERhdGFEcml2ZW5Qcm9wZXJ0eSxcbiAgICBDcm9zc0ZhZGVkUHJvcGVydHksXG4gICAgQ29sb3JSYW1wUHJvcGVydHlcbn0gZnJvbSAnLi4vcHJvcGVydGllcyc7XG5cbmltcG9ydCB0eXBlIENvbG9yIGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvdXRpbC9jb2xvcic7XG5cbmltcG9ydCB0eXBlIEZvcm1hdHRlZCBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL2V4cHJlc3Npb24vdHlwZXMvZm9ybWF0dGVkJztcblxuXG5leHBvcnQgdHlwZSBQYWludFByb3BzID0ge3xcbiAgICBcImNpcmNsZS1yYWRpdXNcIjogRGF0YURyaXZlblByb3BlcnR5PG51bWJlcj4sXG4gICAgXCJjaXJjbGUtY29sb3JcIjogRGF0YURyaXZlblByb3BlcnR5PENvbG9yPixcbiAgICBcImNpcmNsZS1ibHVyXCI6IERhdGFEcml2ZW5Qcm9wZXJ0eTxudW1iZXI+LFxuICAgIFwiY2lyY2xlLW9wYWNpdHlcIjogRGF0YURyaXZlblByb3BlcnR5PG51bWJlcj4sXG4gICAgXCJjaXJjbGUtdHJhbnNsYXRlXCI6IERhdGFDb25zdGFudFByb3BlcnR5PFtudW1iZXIsIG51bWJlcl0+LFxuICAgIFwiY2lyY2xlLXRyYW5zbGF0ZS1hbmNob3JcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8XCJtYXBcIiB8IFwidmlld3BvcnRcIj4sXG4gICAgXCJjaXJjbGUtcGl0Y2gtc2NhbGVcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8XCJtYXBcIiB8IFwidmlld3BvcnRcIj4sXG4gICAgXCJjaXJjbGUtcGl0Y2gtYWxpZ25tZW50XCI6IERhdGFDb25zdGFudFByb3BlcnR5PFwibWFwXCIgfCBcInZpZXdwb3J0XCI+LFxuICAgIFwiY2lyY2xlLXN0cm9rZS13aWR0aFwiOiBEYXRhRHJpdmVuUHJvcGVydHk8bnVtYmVyPixcbiAgICBcImNpcmNsZS1zdHJva2UtY29sb3JcIjogRGF0YURyaXZlblByb3BlcnR5PENvbG9yPixcbiAgICBcImNpcmNsZS1zdHJva2Utb3BhY2l0eVwiOiBEYXRhRHJpdmVuUHJvcGVydHk8bnVtYmVyPixcbnx9O1xuXG5jb25zdCBwYWludDogUHJvcGVydGllczxQYWludFByb3BzPiA9IG5ldyBQcm9wZXJ0aWVzKHtcbiAgICBcImNpcmNsZS1yYWRpdXNcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9jaXJjbGVcIl1bXCJjaXJjbGUtcmFkaXVzXCJdKSxcbiAgICBcImNpcmNsZS1jb2xvclwiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2NpcmNsZVwiXVtcImNpcmNsZS1jb2xvclwiXSksXG4gICAgXCJjaXJjbGUtYmx1clwiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2NpcmNsZVwiXVtcImNpcmNsZS1ibHVyXCJdKSxcbiAgICBcImNpcmNsZS1vcGFjaXR5XCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfY2lyY2xlXCJdW1wiY2lyY2xlLW9wYWNpdHlcIl0pLFxuICAgIFwiY2lyY2xlLXRyYW5zbGF0ZVwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfY2lyY2xlXCJdW1wiY2lyY2xlLXRyYW5zbGF0ZVwiXSksXG4gICAgXCJjaXJjbGUtdHJhbnNsYXRlLWFuY2hvclwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfY2lyY2xlXCJdW1wiY2lyY2xlLXRyYW5zbGF0ZS1hbmNob3JcIl0pLFxuICAgIFwiY2lyY2xlLXBpdGNoLXNjYWxlXCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9jaXJjbGVcIl1bXCJjaXJjbGUtcGl0Y2gtc2NhbGVcIl0pLFxuICAgIFwiY2lyY2xlLXBpdGNoLWFsaWdubWVudFwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfY2lyY2xlXCJdW1wiY2lyY2xlLXBpdGNoLWFsaWdubWVudFwiXSksXG4gICAgXCJjaXJjbGUtc3Ryb2tlLXdpZHRoXCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfY2lyY2xlXCJdW1wiY2lyY2xlLXN0cm9rZS13aWR0aFwiXSksXG4gICAgXCJjaXJjbGUtc3Ryb2tlLWNvbG9yXCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfY2lyY2xlXCJdW1wiY2lyY2xlLXN0cm9rZS1jb2xvclwiXSksXG4gICAgXCJjaXJjbGUtc3Ryb2tlLW9wYWNpdHlcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9jaXJjbGVcIl1bXCJjaXJjbGUtc3Ryb2tlLW9wYWNpdHlcIl0pLFxufSk7XG5cbi8vIE5vdGU6IHdpdGhvdXQgYWRkaW5nIHRoZSBleHBsaWNpdCB0eXBlIGFubm90YXRpb24sIEZsb3cgaW5mZXJzIHdlYWtlciB0eXBlc1xuLy8gZm9yIHRoZXNlIG9iamVjdHMgZnJvbSB0aGVpciB1c2UgaW4gdGhlIGNvbnN0cnVjdG9yIHRvIFN0eWxlTGF5ZXIsIGFzXG4vLyB7bGF5b3V0PzogUHJvcGVydGllczwuLi4+LCBwYWludDogUHJvcGVydGllczwuLi4+fVxuZXhwb3J0IGRlZmF1bHQgKHsgcGFpbnQgfTogJEV4YWN0PHtcbiAgcGFpbnQ6IFByb3BlcnRpZXM8UGFpbnRQcm9wcz5cbn0+KTtcbiIsIi8qKlxyXG4gKiBDb21tb24gdXRpbGl0aWVzXHJcbiAqIEBtb2R1bGUgZ2xNYXRyaXhcclxuICovXG4vLyBDb25maWd1cmF0aW9uIENvbnN0YW50c1xuZXhwb3J0IHZhciBFUFNJTE9OID0gMC4wMDAwMDE7XG5leHBvcnQgdmFyIEFSUkFZX1RZUEUgPSB0eXBlb2YgRmxvYXQzMkFycmF5ICE9PSAndW5kZWZpbmVkJyA/IEZsb2F0MzJBcnJheSA6IEFycmF5O1xuZXhwb3J0IHZhciBSQU5ET00gPSBNYXRoLnJhbmRvbTtcbi8qKlxyXG4gKiBTZXRzIHRoZSB0eXBlIG9mIGFycmF5IHVzZWQgd2hlbiBjcmVhdGluZyBuZXcgdmVjdG9ycyBhbmQgbWF0cmljZXNcclxuICpcclxuICogQHBhcmFtIHtUeXBlfSB0eXBlIEFycmF5IHR5cGUsIHN1Y2ggYXMgRmxvYXQzMkFycmF5IG9yIEFycmF5XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc2V0TWF0cml4QXJyYXlUeXBlKHR5cGUpIHtcbiAgQVJSQVlfVFlQRSA9IHR5cGU7XG59XG52YXIgZGVncmVlID0gTWF0aC5QSSAvIDE4MDtcbi8qKlxyXG4gKiBDb252ZXJ0IERlZ3JlZSBUbyBSYWRpYW5cclxuICpcclxuICogQHBhcmFtIHtOdW1iZXJ9IGEgQW5nbGUgaW4gRGVncmVlc1xyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHRvUmFkaWFuKGEpIHtcbiAgcmV0dXJuIGEgKiBkZWdyZWU7XG59XG4vKipcclxuICogVGVzdHMgd2hldGhlciBvciBub3QgdGhlIGFyZ3VtZW50cyBoYXZlIGFwcHJveGltYXRlbHkgdGhlIHNhbWUgdmFsdWUsIHdpdGhpbiBhbiBhYnNvbHV0ZVxyXG4gKiBvciByZWxhdGl2ZSB0b2xlcmFuY2Ugb2YgZ2xNYXRyaXguRVBTSUxPTiAoYW4gYWJzb2x1dGUgdG9sZXJhbmNlIGlzIHVzZWQgZm9yIHZhbHVlcyBsZXNzXHJcbiAqIHRoYW4gb3IgZXF1YWwgdG8gMS4wLCBhbmQgYSByZWxhdGl2ZSB0b2xlcmFuY2UgaXMgdXNlZCBmb3IgbGFyZ2VyIHZhbHVlcylcclxuICpcclxuICogQHBhcmFtIHtOdW1iZXJ9IGEgVGhlIGZpcnN0IG51bWJlciB0byB0ZXN0LlxyXG4gKiBAcGFyYW0ge051bWJlcn0gYiBUaGUgc2Vjb25kIG51bWJlciB0byB0ZXN0LlxyXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgbnVtYmVycyBhcmUgYXBwcm94aW1hdGVseSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGVxdWFscyhhLCBiKSB7XG4gIHJldHVybiBNYXRoLmFicyhhIC0gYikgPD0gRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYSksIE1hdGguYWJzKGIpKTtcbn0iLCJpbXBvcnQgKiBhcyBnbE1hdHJpeCBmcm9tIFwiLi9jb21tb24uanNcIjtcbi8qKlxyXG4gKiAyeDIgTWF0cml4XHJcbiAqIEBtb2R1bGUgbWF0MlxyXG4gKi9cblxuLyoqXHJcbiAqIENyZWF0ZXMgYSBuZXcgaWRlbnRpdHkgbWF0MlxyXG4gKlxyXG4gKiBAcmV0dXJucyB7bWF0Mn0gYSBuZXcgMngyIG1hdHJpeFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZSgpIHtcbiAgdmFyIG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDQpO1xuXG4gIGlmIChnbE1hdHJpeC5BUlJBWV9UWVBFICE9IEZsb2F0MzJBcnJheSkge1xuICAgIG91dFsxXSA9IDA7XG4gICAgb3V0WzJdID0gMDtcbiAgfVxuXG4gIG91dFswXSA9IDE7XG4gIG91dFszXSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ3JlYXRlcyBhIG5ldyBtYXQyIGluaXRpYWxpemVkIHdpdGggdmFsdWVzIGZyb20gYW4gZXhpc3RpbmcgbWF0cml4XHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0Mn0gYSBtYXRyaXggdG8gY2xvbmVcclxuICogQHJldHVybnMge21hdDJ9IGEgbmV3IDJ4MiBtYXRyaXhcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjbG9uZShhKSB7XG4gIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSg0KTtcbiAgb3V0WzBdID0gYVswXTtcbiAgb3V0WzFdID0gYVsxXTtcbiAgb3V0WzJdID0gYVsyXTtcbiAgb3V0WzNdID0gYVszXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDb3B5IHRoZSB2YWx1ZXMgZnJvbSBvbmUgbWF0MiB0byBhbm90aGVyXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XHJcbiAqIEBwYXJhbSB7bWF0Mn0gYSB0aGUgc291cmNlIG1hdHJpeFxyXG4gKiBAcmV0dXJucyB7bWF0Mn0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY29weShvdXQsIGEpIHtcbiAgb3V0WzBdID0gYVswXTtcbiAgb3V0WzFdID0gYVsxXTtcbiAgb3V0WzJdID0gYVsyXTtcbiAgb3V0WzNdID0gYVszXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBTZXQgYSBtYXQyIHRvIHRoZSBpZGVudGl0eSBtYXRyaXhcclxuICpcclxuICogQHBhcmFtIHttYXQyfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcclxuICogQHJldHVybnMge21hdDJ9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGlkZW50aXR5KG91dCkge1xuICBvdXRbMF0gPSAxO1xuICBvdXRbMV0gPSAwO1xuICBvdXRbMl0gPSAwO1xuICBvdXRbM10gPSAxO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENyZWF0ZSBhIG5ldyBtYXQyIHdpdGggdGhlIGdpdmVuIHZhbHVlc1xyXG4gKlxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTAwIENvbXBvbmVudCBpbiBjb2x1bW4gMCwgcm93IDAgcG9zaXRpb24gKGluZGV4IDApXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMDEgQ29tcG9uZW50IGluIGNvbHVtbiAwLCByb3cgMSBwb3NpdGlvbiAoaW5kZXggMSlcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0xMCBDb21wb25lbnQgaW4gY29sdW1uIDEsIHJvdyAwIHBvc2l0aW9uIChpbmRleCAyKVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTExIENvbXBvbmVudCBpbiBjb2x1bW4gMSwgcm93IDEgcG9zaXRpb24gKGluZGV4IDMpXHJcbiAqIEByZXR1cm5zIHttYXQyfSBvdXQgQSBuZXcgMngyIG1hdHJpeFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21WYWx1ZXMobTAwLCBtMDEsIG0xMCwgbTExKSB7XG4gIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSg0KTtcbiAgb3V0WzBdID0gbTAwO1xuICBvdXRbMV0gPSBtMDE7XG4gIG91dFsyXSA9IG0xMDtcbiAgb3V0WzNdID0gbTExO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFNldCB0aGUgY29tcG9uZW50cyBvZiBhIG1hdDIgdG8gdGhlIGdpdmVuIHZhbHVlc1xyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDJ9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTAwIENvbXBvbmVudCBpbiBjb2x1bW4gMCwgcm93IDAgcG9zaXRpb24gKGluZGV4IDApXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMDEgQ29tcG9uZW50IGluIGNvbHVtbiAwLCByb3cgMSBwb3NpdGlvbiAoaW5kZXggMSlcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0xMCBDb21wb25lbnQgaW4gY29sdW1uIDEsIHJvdyAwIHBvc2l0aW9uIChpbmRleCAyKVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTExIENvbXBvbmVudCBpbiBjb2x1bW4gMSwgcm93IDEgcG9zaXRpb24gKGluZGV4IDMpXHJcbiAqIEByZXR1cm5zIHttYXQyfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzZXQob3V0LCBtMDAsIG0wMSwgbTEwLCBtMTEpIHtcbiAgb3V0WzBdID0gbTAwO1xuICBvdXRbMV0gPSBtMDE7XG4gIG91dFsyXSA9IG0xMDtcbiAgb3V0WzNdID0gbTExO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFRyYW5zcG9zZSB0aGUgdmFsdWVzIG9mIGEgbWF0MlxyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDJ9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxyXG4gKiBAcGFyYW0ge21hdDJ9IGEgdGhlIHNvdXJjZSBtYXRyaXhcclxuICogQHJldHVybnMge21hdDJ9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zcG9zZShvdXQsIGEpIHtcbiAgLy8gSWYgd2UgYXJlIHRyYW5zcG9zaW5nIG91cnNlbHZlcyB3ZSBjYW4gc2tpcCBhIGZldyBzdGVwcyBidXQgaGF2ZSB0byBjYWNoZVxuICAvLyBzb21lIHZhbHVlc1xuICBpZiAob3V0ID09PSBhKSB7XG4gICAgdmFyIGExID0gYVsxXTtcbiAgICBvdXRbMV0gPSBhWzJdO1xuICAgIG91dFsyXSA9IGExO1xuICB9IGVsc2Uge1xuICAgIG91dFswXSA9IGFbMF07XG4gICAgb3V0WzFdID0gYVsyXTtcbiAgICBvdXRbMl0gPSBhWzFdO1xuICAgIG91dFszXSA9IGFbM107XG4gIH1cblxuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIEludmVydHMgYSBtYXQyXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XHJcbiAqIEBwYXJhbSB7bWF0Mn0gYSB0aGUgc291cmNlIG1hdHJpeFxyXG4gKiBAcmV0dXJucyB7bWF0Mn0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gaW52ZXJ0KG91dCwgYSkge1xuICB2YXIgYTAgPSBhWzBdLFxuICAgICAgYTEgPSBhWzFdLFxuICAgICAgYTIgPSBhWzJdLFxuICAgICAgYTMgPSBhWzNdOyAvLyBDYWxjdWxhdGUgdGhlIGRldGVybWluYW50XG5cbiAgdmFyIGRldCA9IGEwICogYTMgLSBhMiAqIGExO1xuXG4gIGlmICghZGV0KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBkZXQgPSAxLjAgLyBkZXQ7XG4gIG91dFswXSA9IGEzICogZGV0O1xuICBvdXRbMV0gPSAtYTEgKiBkZXQ7XG4gIG91dFsyXSA9IC1hMiAqIGRldDtcbiAgb3V0WzNdID0gYTAgKiBkZXQ7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ2FsY3VsYXRlcyB0aGUgYWRqdWdhdGUgb2YgYSBtYXQyXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XHJcbiAqIEBwYXJhbSB7bWF0Mn0gYSB0aGUgc291cmNlIG1hdHJpeFxyXG4gKiBAcmV0dXJucyB7bWF0Mn0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gYWRqb2ludChvdXQsIGEpIHtcbiAgLy8gQ2FjaGluZyB0aGlzIHZhbHVlIGlzIG5lc3NlY2FyeSBpZiBvdXQgPT0gYVxuICB2YXIgYTAgPSBhWzBdO1xuICBvdXRbMF0gPSBhWzNdO1xuICBvdXRbMV0gPSAtYVsxXTtcbiAgb3V0WzJdID0gLWFbMl07XG4gIG91dFszXSA9IGEwO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENhbGN1bGF0ZXMgdGhlIGRldGVybWluYW50IG9mIGEgbWF0MlxyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDJ9IGEgdGhlIHNvdXJjZSBtYXRyaXhcclxuICogQHJldHVybnMge051bWJlcn0gZGV0ZXJtaW5hbnQgb2YgYVxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGRldGVybWluYW50KGEpIHtcbiAgcmV0dXJuIGFbMF0gKiBhWzNdIC0gYVsyXSAqIGFbMV07XG59XG4vKipcclxuICogTXVsdGlwbGllcyB0d28gbWF0MidzXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XHJcbiAqIEBwYXJhbSB7bWF0Mn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge21hdDJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHttYXQyfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBtdWx0aXBseShvdXQsIGEsIGIpIHtcbiAgdmFyIGEwID0gYVswXSxcbiAgICAgIGExID0gYVsxXSxcbiAgICAgIGEyID0gYVsyXSxcbiAgICAgIGEzID0gYVszXTtcbiAgdmFyIGIwID0gYlswXSxcbiAgICAgIGIxID0gYlsxXSxcbiAgICAgIGIyID0gYlsyXSxcbiAgICAgIGIzID0gYlszXTtcbiAgb3V0WzBdID0gYTAgKiBiMCArIGEyICogYjE7XG4gIG91dFsxXSA9IGExICogYjAgKyBhMyAqIGIxO1xuICBvdXRbMl0gPSBhMCAqIGIyICsgYTIgKiBiMztcbiAgb3V0WzNdID0gYTEgKiBiMiArIGEzICogYjM7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogUm90YXRlcyBhIG1hdDIgYnkgdGhlIGdpdmVuIGFuZ2xlXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XHJcbiAqIEBwYXJhbSB7bWF0Mn0gYSB0aGUgbWF0cml4IHRvIHJvdGF0ZVxyXG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIHRoZSBhbmdsZSB0byByb3RhdGUgdGhlIG1hdHJpeCBieVxyXG4gKiBAcmV0dXJucyB7bWF0Mn0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcm90YXRlKG91dCwgYSwgcmFkKSB7XG4gIHZhciBhMCA9IGFbMF0sXG4gICAgICBhMSA9IGFbMV0sXG4gICAgICBhMiA9IGFbMl0sXG4gICAgICBhMyA9IGFbM107XG4gIHZhciBzID0gTWF0aC5zaW4ocmFkKTtcbiAgdmFyIGMgPSBNYXRoLmNvcyhyYWQpO1xuICBvdXRbMF0gPSBhMCAqIGMgKyBhMiAqIHM7XG4gIG91dFsxXSA9IGExICogYyArIGEzICogcztcbiAgb3V0WzJdID0gYTAgKiAtcyArIGEyICogYztcbiAgb3V0WzNdID0gYTEgKiAtcyArIGEzICogYztcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBTY2FsZXMgdGhlIG1hdDIgYnkgdGhlIGRpbWVuc2lvbnMgaW4gdGhlIGdpdmVuIHZlYzJcclxuICpcclxuICogQHBhcmFtIHttYXQyfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcclxuICogQHBhcmFtIHttYXQyfSBhIHRoZSBtYXRyaXggdG8gcm90YXRlXHJcbiAqIEBwYXJhbSB7dmVjMn0gdiB0aGUgdmVjMiB0byBzY2FsZSB0aGUgbWF0cml4IGJ5XHJcbiAqIEByZXR1cm5zIHttYXQyfSBvdXRcclxuICoqL1xuXG5leHBvcnQgZnVuY3Rpb24gc2NhbGUob3V0LCBhLCB2KSB7XG4gIHZhciBhMCA9IGFbMF0sXG4gICAgICBhMSA9IGFbMV0sXG4gICAgICBhMiA9IGFbMl0sXG4gICAgICBhMyA9IGFbM107XG4gIHZhciB2MCA9IHZbMF0sXG4gICAgICB2MSA9IHZbMV07XG4gIG91dFswXSA9IGEwICogdjA7XG4gIG91dFsxXSA9IGExICogdjA7XG4gIG91dFsyXSA9IGEyICogdjE7XG4gIG91dFszXSA9IGEzICogdjE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ3JlYXRlcyBhIG1hdHJpeCBmcm9tIGEgZ2l2ZW4gYW5nbGVcclxuICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIChidXQgbXVjaCBmYXN0ZXIgdGhhbik6XHJcbiAqXHJcbiAqICAgICBtYXQyLmlkZW50aXR5KGRlc3QpO1xyXG4gKiAgICAgbWF0Mi5yb3RhdGUoZGVzdCwgZGVzdCwgcmFkKTtcclxuICpcclxuICogQHBhcmFtIHttYXQyfSBvdXQgbWF0MiByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxyXG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIHRoZSBhbmdsZSB0byByb3RhdGUgdGhlIG1hdHJpeCBieVxyXG4gKiBAcmV0dXJucyB7bWF0Mn0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVJvdGF0aW9uKG91dCwgcmFkKSB7XG4gIHZhciBzID0gTWF0aC5zaW4ocmFkKTtcbiAgdmFyIGMgPSBNYXRoLmNvcyhyYWQpO1xuICBvdXRbMF0gPSBjO1xuICBvdXRbMV0gPSBzO1xuICBvdXRbMl0gPSAtcztcbiAgb3V0WzNdID0gYztcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDcmVhdGVzIGEgbWF0cml4IGZyb20gYSB2ZWN0b3Igc2NhbGluZ1xyXG4gKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gKGJ1dCBtdWNoIGZhc3RlciB0aGFuKTpcclxuICpcclxuICogICAgIG1hdDIuaWRlbnRpdHkoZGVzdCk7XHJcbiAqICAgICBtYXQyLnNjYWxlKGRlc3QsIGRlc3QsIHZlYyk7XHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0Mn0gb3V0IG1hdDIgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcclxuICogQHBhcmFtIHt2ZWMyfSB2IFNjYWxpbmcgdmVjdG9yXHJcbiAqIEByZXR1cm5zIHttYXQyfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tU2NhbGluZyhvdXQsIHYpIHtcbiAgb3V0WzBdID0gdlswXTtcbiAgb3V0WzFdID0gMDtcbiAgb3V0WzJdID0gMDtcbiAgb3V0WzNdID0gdlsxXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgbWF0MlxyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDJ9IGEgbWF0cml4IHRvIHJlcHJlc2VudCBhcyBhIHN0cmluZ1xyXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1hdHJpeFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHN0cihhKSB7XG4gIHJldHVybiAnbWF0MignICsgYVswXSArICcsICcgKyBhWzFdICsgJywgJyArIGFbMl0gKyAnLCAnICsgYVszXSArICcpJztcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIEZyb2Jlbml1cyBub3JtIG9mIGEgbWF0MlxyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDJ9IGEgdGhlIG1hdHJpeCB0byBjYWxjdWxhdGUgRnJvYmVuaXVzIG5vcm0gb2ZcclxuICogQHJldHVybnMge051bWJlcn0gRnJvYmVuaXVzIG5vcm1cclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9iKGEpIHtcbiAgcmV0dXJuIE1hdGguc3FydChNYXRoLnBvdyhhWzBdLCAyKSArIE1hdGgucG93KGFbMV0sIDIpICsgTWF0aC5wb3coYVsyXSwgMikgKyBNYXRoLnBvdyhhWzNdLCAyKSk7XG59XG4vKipcclxuICogUmV0dXJucyBMLCBEIGFuZCBVIG1hdHJpY2VzIChMb3dlciB0cmlhbmd1bGFyLCBEaWFnb25hbCBhbmQgVXBwZXIgdHJpYW5ndWxhcikgYnkgZmFjdG9yaXppbmcgdGhlIGlucHV0IG1hdHJpeFxyXG4gKiBAcGFyYW0ge21hdDJ9IEwgdGhlIGxvd2VyIHRyaWFuZ3VsYXIgbWF0cml4XHJcbiAqIEBwYXJhbSB7bWF0Mn0gRCB0aGUgZGlhZ29uYWwgbWF0cml4XHJcbiAqIEBwYXJhbSB7bWF0Mn0gVSB0aGUgdXBwZXIgdHJpYW5ndWxhciBtYXRyaXhcclxuICogQHBhcmFtIHttYXQyfSBhIHRoZSBpbnB1dCBtYXRyaXggdG8gZmFjdG9yaXplXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gTERVKEwsIEQsIFUsIGEpIHtcbiAgTFsyXSA9IGFbMl0gLyBhWzBdO1xuICBVWzBdID0gYVswXTtcbiAgVVsxXSA9IGFbMV07XG4gIFVbM10gPSBhWzNdIC0gTFsyXSAqIFVbMV07XG4gIHJldHVybiBbTCwgRCwgVV07XG59XG4vKipcclxuICogQWRkcyB0d28gbWF0MidzXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XHJcbiAqIEBwYXJhbSB7bWF0Mn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge21hdDJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHttYXQyfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBhZGQob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gKyBiWzBdO1xuICBvdXRbMV0gPSBhWzFdICsgYlsxXTtcbiAgb3V0WzJdID0gYVsyXSArIGJbMl07XG4gIG91dFszXSA9IGFbM10gKyBiWzNdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFN1YnRyYWN0cyBtYXRyaXggYiBmcm9tIG1hdHJpeCBhXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XHJcbiAqIEBwYXJhbSB7bWF0Mn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge21hdDJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHttYXQyfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzdWJ0cmFjdChvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSAtIGJbMF07XG4gIG91dFsxXSA9IGFbMV0gLSBiWzFdO1xuICBvdXRbMl0gPSBhWzJdIC0gYlsyXTtcbiAgb3V0WzNdID0gYVszXSAtIGJbM107XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgbWF0cmljZXMgaGF2ZSBleGFjdGx5IHRoZSBzYW1lIGVsZW1lbnRzIGluIHRoZSBzYW1lIHBvc2l0aW9uICh3aGVuIGNvbXBhcmVkIHdpdGggPT09KVxyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDJ9IGEgVGhlIGZpcnN0IG1hdHJpeC5cclxuICogQHBhcmFtIHttYXQyfSBiIFRoZSBzZWNvbmQgbWF0cml4LlxyXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgbWF0cmljZXMgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZXhhY3RFcXVhbHMoYSwgYikge1xuICByZXR1cm4gYVswXSA9PT0gYlswXSAmJiBhWzFdID09PSBiWzFdICYmIGFbMl0gPT09IGJbMl0gJiYgYVszXSA9PT0gYlszXTtcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBtYXRyaWNlcyBoYXZlIGFwcHJveGltYXRlbHkgdGhlIHNhbWUgZWxlbWVudHMgaW4gdGhlIHNhbWUgcG9zaXRpb24uXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0Mn0gYSBUaGUgZmlyc3QgbWF0cml4LlxyXG4gKiBAcGFyYW0ge21hdDJ9IGIgVGhlIHNlY29uZCBtYXRyaXguXHJcbiAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSBtYXRyaWNlcyBhcmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS5cclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBlcXVhbHMoYSwgYikge1xuICB2YXIgYTAgPSBhWzBdLFxuICAgICAgYTEgPSBhWzFdLFxuICAgICAgYTIgPSBhWzJdLFxuICAgICAgYTMgPSBhWzNdO1xuICB2YXIgYjAgPSBiWzBdLFxuICAgICAgYjEgPSBiWzFdLFxuICAgICAgYjIgPSBiWzJdLFxuICAgICAgYjMgPSBiWzNdO1xuICByZXR1cm4gTWF0aC5hYnMoYTAgLSBiMCkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTApLCBNYXRoLmFicyhiMCkpICYmIE1hdGguYWJzKGExIC0gYjEpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGExKSwgTWF0aC5hYnMoYjEpKSAmJiBNYXRoLmFicyhhMiAtIGIyKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMiksIE1hdGguYWJzKGIyKSkgJiYgTWF0aC5hYnMoYTMgLSBiMykgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTMpLCBNYXRoLmFicyhiMykpO1xufVxuLyoqXHJcbiAqIE11bHRpcGx5IGVhY2ggZWxlbWVudCBvZiB0aGUgbWF0cml4IGJ5IGEgc2NhbGFyLlxyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDJ9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxyXG4gKiBAcGFyYW0ge21hdDJ9IGEgdGhlIG1hdHJpeCB0byBzY2FsZVxyXG4gKiBAcGFyYW0ge051bWJlcn0gYiBhbW91bnQgdG8gc2NhbGUgdGhlIG1hdHJpeCdzIGVsZW1lbnRzIGJ5XHJcbiAqIEByZXR1cm5zIHttYXQyfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBtdWx0aXBseVNjYWxhcihvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSAqIGI7XG4gIG91dFsxXSA9IGFbMV0gKiBiO1xuICBvdXRbMl0gPSBhWzJdICogYjtcbiAgb3V0WzNdID0gYVszXSAqIGI7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQWRkcyB0d28gbWF0MidzIGFmdGVyIG11bHRpcGx5aW5nIGVhY2ggZWxlbWVudCBvZiB0aGUgc2Vjb25kIG9wZXJhbmQgYnkgYSBzY2FsYXIgdmFsdWUuXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7bWF0Mn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge21hdDJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBzY2FsZSB0aGUgYW1vdW50IHRvIHNjYWxlIGIncyBlbGVtZW50cyBieSBiZWZvcmUgYWRkaW5nXHJcbiAqIEByZXR1cm5zIHttYXQyfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBtdWx0aXBseVNjYWxhckFuZEFkZChvdXQsIGEsIGIsIHNjYWxlKSB7XG4gIG91dFswXSA9IGFbMF0gKyBiWzBdICogc2NhbGU7XG4gIG91dFsxXSA9IGFbMV0gKyBiWzFdICogc2NhbGU7XG4gIG91dFsyXSA9IGFbMl0gKyBiWzJdICogc2NhbGU7XG4gIG91dFszXSA9IGFbM10gKyBiWzNdICogc2NhbGU7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQWxpYXMgZm9yIHtAbGluayBtYXQyLm11bHRpcGx5fVxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCB2YXIgbXVsID0gbXVsdGlwbHk7XG4vKipcclxuICogQWxpYXMgZm9yIHtAbGluayBtYXQyLnN1YnRyYWN0fVxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCB2YXIgc3ViID0gc3VidHJhY3Q7IiwiaW1wb3J0ICogYXMgZ2xNYXRyaXggZnJvbSBcIi4vY29tbW9uLmpzXCI7XG4vKipcclxuICogMngzIE1hdHJpeFxyXG4gKiBAbW9kdWxlIG1hdDJkXHJcbiAqXHJcbiAqIEBkZXNjcmlwdGlvblxyXG4gKiBBIG1hdDJkIGNvbnRhaW5zIHNpeCBlbGVtZW50cyBkZWZpbmVkIGFzOlxyXG4gKiA8cHJlPlxyXG4gKiBbYSwgYywgdHgsXHJcbiAqICBiLCBkLCB0eV1cclxuICogPC9wcmU+XHJcbiAqIFRoaXMgaXMgYSBzaG9ydCBmb3JtIGZvciB0aGUgM3gzIG1hdHJpeDpcclxuICogPHByZT5cclxuICogW2EsIGMsIHR4LFxyXG4gKiAgYiwgZCwgdHksXHJcbiAqICAwLCAwLCAxXVxyXG4gKiA8L3ByZT5cclxuICogVGhlIGxhc3Qgcm93IGlzIGlnbm9yZWQgc28gdGhlIGFycmF5IGlzIHNob3J0ZXIgYW5kIG9wZXJhdGlvbnMgYXJlIGZhc3Rlci5cclxuICovXG5cbi8qKlxyXG4gKiBDcmVhdGVzIGEgbmV3IGlkZW50aXR5IG1hdDJkXHJcbiAqXHJcbiAqIEByZXR1cm5zIHttYXQyZH0gYSBuZXcgMngzIG1hdHJpeFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZSgpIHtcbiAgdmFyIG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDYpO1xuXG4gIGlmIChnbE1hdHJpeC5BUlJBWV9UWVBFICE9IEZsb2F0MzJBcnJheSkge1xuICAgIG91dFsxXSA9IDA7XG4gICAgb3V0WzJdID0gMDtcbiAgICBvdXRbNF0gPSAwO1xuICAgIG91dFs1XSA9IDA7XG4gIH1cblxuICBvdXRbMF0gPSAxO1xuICBvdXRbM10gPSAxO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENyZWF0ZXMgYSBuZXcgbWF0MmQgaW5pdGlhbGl6ZWQgd2l0aCB2YWx1ZXMgZnJvbSBhbiBleGlzdGluZyBtYXRyaXhcclxuICpcclxuICogQHBhcmFtIHttYXQyZH0gYSBtYXRyaXggdG8gY2xvbmVcclxuICogQHJldHVybnMge21hdDJkfSBhIG5ldyAyeDMgbWF0cml4XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY2xvbmUoYSkge1xuICB2YXIgb3V0ID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoNik7XG4gIG91dFswXSA9IGFbMF07XG4gIG91dFsxXSA9IGFbMV07XG4gIG91dFsyXSA9IGFbMl07XG4gIG91dFszXSA9IGFbM107XG4gIG91dFs0XSA9IGFbNF07XG4gIG91dFs1XSA9IGFbNV07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ29weSB0aGUgdmFsdWVzIGZyb20gb25lIG1hdDJkIHRvIGFub3RoZXJcclxuICpcclxuICogQHBhcmFtIHttYXQyZH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XHJcbiAqIEBwYXJhbSB7bWF0MmR9IGEgdGhlIHNvdXJjZSBtYXRyaXhcclxuICogQHJldHVybnMge21hdDJkfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjb3B5KG91dCwgYSkge1xuICBvdXRbMF0gPSBhWzBdO1xuICBvdXRbMV0gPSBhWzFdO1xuICBvdXRbMl0gPSBhWzJdO1xuICBvdXRbM10gPSBhWzNdO1xuICBvdXRbNF0gPSBhWzRdO1xuICBvdXRbNV0gPSBhWzVdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFNldCBhIG1hdDJkIHRvIHRoZSBpZGVudGl0eSBtYXRyaXhcclxuICpcclxuICogQHBhcmFtIHttYXQyZH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XHJcbiAqIEByZXR1cm5zIHttYXQyZH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gaWRlbnRpdHkob3V0KSB7XG4gIG91dFswXSA9IDE7XG4gIG91dFsxXSA9IDA7XG4gIG91dFsyXSA9IDA7XG4gIG91dFszXSA9IDE7XG4gIG91dFs0XSA9IDA7XG4gIG91dFs1XSA9IDA7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ3JlYXRlIGEgbmV3IG1hdDJkIHdpdGggdGhlIGdpdmVuIHZhbHVlc1xyXG4gKlxyXG4gKiBAcGFyYW0ge051bWJlcn0gYSBDb21wb25lbnQgQSAoaW5kZXggMClcclxuICogQHBhcmFtIHtOdW1iZXJ9IGIgQ29tcG9uZW50IEIgKGluZGV4IDEpXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBjIENvbXBvbmVudCBDIChpbmRleCAyKVxyXG4gKiBAcGFyYW0ge051bWJlcn0gZCBDb21wb25lbnQgRCAoaW5kZXggMylcclxuICogQHBhcmFtIHtOdW1iZXJ9IHR4IENvbXBvbmVudCBUWCAoaW5kZXggNClcclxuICogQHBhcmFtIHtOdW1iZXJ9IHR5IENvbXBvbmVudCBUWSAoaW5kZXggNSlcclxuICogQHJldHVybnMge21hdDJkfSBBIG5ldyBtYXQyZFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21WYWx1ZXMoYSwgYiwgYywgZCwgdHgsIHR5KSB7XG4gIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSg2KTtcbiAgb3V0WzBdID0gYTtcbiAgb3V0WzFdID0gYjtcbiAgb3V0WzJdID0gYztcbiAgb3V0WzNdID0gZDtcbiAgb3V0WzRdID0gdHg7XG4gIG91dFs1XSA9IHR5O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFNldCB0aGUgY29tcG9uZW50cyBvZiBhIG1hdDJkIHRvIHRoZSBnaXZlbiB2YWx1ZXNcclxuICpcclxuICogQHBhcmFtIHttYXQyZH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBhIENvbXBvbmVudCBBIChpbmRleCAwKVxyXG4gKiBAcGFyYW0ge051bWJlcn0gYiBDb21wb25lbnQgQiAoaW5kZXggMSlcclxuICogQHBhcmFtIHtOdW1iZXJ9IGMgQ29tcG9uZW50IEMgKGluZGV4IDIpXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBkIENvbXBvbmVudCBEIChpbmRleCAzKVxyXG4gKiBAcGFyYW0ge051bWJlcn0gdHggQ29tcG9uZW50IFRYIChpbmRleCA0KVxyXG4gKiBAcGFyYW0ge051bWJlcn0gdHkgQ29tcG9uZW50IFRZIChpbmRleCA1KVxyXG4gKiBAcmV0dXJucyB7bWF0MmR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHNldChvdXQsIGEsIGIsIGMsIGQsIHR4LCB0eSkge1xuICBvdXRbMF0gPSBhO1xuICBvdXRbMV0gPSBiO1xuICBvdXRbMl0gPSBjO1xuICBvdXRbM10gPSBkO1xuICBvdXRbNF0gPSB0eDtcbiAgb3V0WzVdID0gdHk7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogSW52ZXJ0cyBhIG1hdDJkXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0MmR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxyXG4gKiBAcGFyYW0ge21hdDJkfSBhIHRoZSBzb3VyY2UgbWF0cml4XHJcbiAqIEByZXR1cm5zIHttYXQyZH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gaW52ZXJ0KG91dCwgYSkge1xuICB2YXIgYWEgPSBhWzBdLFxuICAgICAgYWIgPSBhWzFdLFxuICAgICAgYWMgPSBhWzJdLFxuICAgICAgYWQgPSBhWzNdO1xuICB2YXIgYXR4ID0gYVs0XSxcbiAgICAgIGF0eSA9IGFbNV07XG4gIHZhciBkZXQgPSBhYSAqIGFkIC0gYWIgKiBhYztcblxuICBpZiAoIWRldCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZGV0ID0gMS4wIC8gZGV0O1xuICBvdXRbMF0gPSBhZCAqIGRldDtcbiAgb3V0WzFdID0gLWFiICogZGV0O1xuICBvdXRbMl0gPSAtYWMgKiBkZXQ7XG4gIG91dFszXSA9IGFhICogZGV0O1xuICBvdXRbNF0gPSAoYWMgKiBhdHkgLSBhZCAqIGF0eCkgKiBkZXQ7XG4gIG91dFs1XSA9IChhYiAqIGF0eCAtIGFhICogYXR5KSAqIGRldDtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDYWxjdWxhdGVzIHRoZSBkZXRlcm1pbmFudCBvZiBhIG1hdDJkXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0MmR9IGEgdGhlIHNvdXJjZSBtYXRyaXhcclxuICogQHJldHVybnMge051bWJlcn0gZGV0ZXJtaW5hbnQgb2YgYVxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGRldGVybWluYW50KGEpIHtcbiAgcmV0dXJuIGFbMF0gKiBhWzNdIC0gYVsxXSAqIGFbMl07XG59XG4vKipcclxuICogTXVsdGlwbGllcyB0d28gbWF0MmQnc1xyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDJkfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcclxuICogQHBhcmFtIHttYXQyZH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge21hdDJkfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcmV0dXJucyB7bWF0MmR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG11bHRpcGx5KG91dCwgYSwgYikge1xuICB2YXIgYTAgPSBhWzBdLFxuICAgICAgYTEgPSBhWzFdLFxuICAgICAgYTIgPSBhWzJdLFxuICAgICAgYTMgPSBhWzNdLFxuICAgICAgYTQgPSBhWzRdLFxuICAgICAgYTUgPSBhWzVdO1xuICB2YXIgYjAgPSBiWzBdLFxuICAgICAgYjEgPSBiWzFdLFxuICAgICAgYjIgPSBiWzJdLFxuICAgICAgYjMgPSBiWzNdLFxuICAgICAgYjQgPSBiWzRdLFxuICAgICAgYjUgPSBiWzVdO1xuICBvdXRbMF0gPSBhMCAqIGIwICsgYTIgKiBiMTtcbiAgb3V0WzFdID0gYTEgKiBiMCArIGEzICogYjE7XG4gIG91dFsyXSA9IGEwICogYjIgKyBhMiAqIGIzO1xuICBvdXRbM10gPSBhMSAqIGIyICsgYTMgKiBiMztcbiAgb3V0WzRdID0gYTAgKiBiNCArIGEyICogYjUgKyBhNDtcbiAgb3V0WzVdID0gYTEgKiBiNCArIGEzICogYjUgKyBhNTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBSb3RhdGVzIGEgbWF0MmQgYnkgdGhlIGdpdmVuIGFuZ2xlXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0MmR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxyXG4gKiBAcGFyYW0ge21hdDJkfSBhIHRoZSBtYXRyaXggdG8gcm90YXRlXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgdGhlIGFuZ2xlIHRvIHJvdGF0ZSB0aGUgbWF0cml4IGJ5XHJcbiAqIEByZXR1cm5zIHttYXQyZH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcm90YXRlKG91dCwgYSwgcmFkKSB7XG4gIHZhciBhMCA9IGFbMF0sXG4gICAgICBhMSA9IGFbMV0sXG4gICAgICBhMiA9IGFbMl0sXG4gICAgICBhMyA9IGFbM10sXG4gICAgICBhNCA9IGFbNF0sXG4gICAgICBhNSA9IGFbNV07XG4gIHZhciBzID0gTWF0aC5zaW4ocmFkKTtcbiAgdmFyIGMgPSBNYXRoLmNvcyhyYWQpO1xuICBvdXRbMF0gPSBhMCAqIGMgKyBhMiAqIHM7XG4gIG91dFsxXSA9IGExICogYyArIGEzICogcztcbiAgb3V0WzJdID0gYTAgKiAtcyArIGEyICogYztcbiAgb3V0WzNdID0gYTEgKiAtcyArIGEzICogYztcbiAgb3V0WzRdID0gYTQ7XG4gIG91dFs1XSA9IGE1O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFNjYWxlcyB0aGUgbWF0MmQgYnkgdGhlIGRpbWVuc2lvbnMgaW4gdGhlIGdpdmVuIHZlYzJcclxuICpcclxuICogQHBhcmFtIHttYXQyZH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XHJcbiAqIEBwYXJhbSB7bWF0MmR9IGEgdGhlIG1hdHJpeCB0byB0cmFuc2xhdGVcclxuICogQHBhcmFtIHt2ZWMyfSB2IHRoZSB2ZWMyIHRvIHNjYWxlIHRoZSBtYXRyaXggYnlcclxuICogQHJldHVybnMge21hdDJkfSBvdXRcclxuICoqL1xuXG5leHBvcnQgZnVuY3Rpb24gc2NhbGUob3V0LCBhLCB2KSB7XG4gIHZhciBhMCA9IGFbMF0sXG4gICAgICBhMSA9IGFbMV0sXG4gICAgICBhMiA9IGFbMl0sXG4gICAgICBhMyA9IGFbM10sXG4gICAgICBhNCA9IGFbNF0sXG4gICAgICBhNSA9IGFbNV07XG4gIHZhciB2MCA9IHZbMF0sXG4gICAgICB2MSA9IHZbMV07XG4gIG91dFswXSA9IGEwICogdjA7XG4gIG91dFsxXSA9IGExICogdjA7XG4gIG91dFsyXSA9IGEyICogdjE7XG4gIG91dFszXSA9IGEzICogdjE7XG4gIG91dFs0XSA9IGE0O1xuICBvdXRbNV0gPSBhNTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBUcmFuc2xhdGVzIHRoZSBtYXQyZCBieSB0aGUgZGltZW5zaW9ucyBpbiB0aGUgZ2l2ZW4gdmVjMlxyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDJkfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcclxuICogQHBhcmFtIHttYXQyZH0gYSB0aGUgbWF0cml4IHRvIHRyYW5zbGF0ZVxyXG4gKiBAcGFyYW0ge3ZlYzJ9IHYgdGhlIHZlYzIgdG8gdHJhbnNsYXRlIHRoZSBtYXRyaXggYnlcclxuICogQHJldHVybnMge21hdDJkfSBvdXRcclxuICoqL1xuXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNsYXRlKG91dCwgYSwgdikge1xuICB2YXIgYTAgPSBhWzBdLFxuICAgICAgYTEgPSBhWzFdLFxuICAgICAgYTIgPSBhWzJdLFxuICAgICAgYTMgPSBhWzNdLFxuICAgICAgYTQgPSBhWzRdLFxuICAgICAgYTUgPSBhWzVdO1xuICB2YXIgdjAgPSB2WzBdLFxuICAgICAgdjEgPSB2WzFdO1xuICBvdXRbMF0gPSBhMDtcbiAgb3V0WzFdID0gYTE7XG4gIG91dFsyXSA9IGEyO1xuICBvdXRbM10gPSBhMztcbiAgb3V0WzRdID0gYTAgKiB2MCArIGEyICogdjEgKyBhNDtcbiAgb3V0WzVdID0gYTEgKiB2MCArIGEzICogdjEgKyBhNTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDcmVhdGVzIGEgbWF0cml4IGZyb20gYSBnaXZlbiBhbmdsZVxyXG4gKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gKGJ1dCBtdWNoIGZhc3RlciB0aGFuKTpcclxuICpcclxuICogICAgIG1hdDJkLmlkZW50aXR5KGRlc3QpO1xyXG4gKiAgICAgbWF0MmQucm90YXRlKGRlc3QsIGRlc3QsIHJhZCk7XHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0MmR9IG91dCBtYXQyZCByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxyXG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIHRoZSBhbmdsZSB0byByb3RhdGUgdGhlIG1hdHJpeCBieVxyXG4gKiBAcmV0dXJucyB7bWF0MmR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21Sb3RhdGlvbihvdXQsIHJhZCkge1xuICB2YXIgcyA9IE1hdGguc2luKHJhZCksXG4gICAgICBjID0gTWF0aC5jb3MocmFkKTtcbiAgb3V0WzBdID0gYztcbiAgb3V0WzFdID0gcztcbiAgb3V0WzJdID0gLXM7XG4gIG91dFszXSA9IGM7XG4gIG91dFs0XSA9IDA7XG4gIG91dFs1XSA9IDA7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ3JlYXRlcyBhIG1hdHJpeCBmcm9tIGEgdmVjdG9yIHNjYWxpbmdcclxuICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIChidXQgbXVjaCBmYXN0ZXIgdGhhbik6XHJcbiAqXHJcbiAqICAgICBtYXQyZC5pZGVudGl0eShkZXN0KTtcclxuICogICAgIG1hdDJkLnNjYWxlKGRlc3QsIGRlc3QsIHZlYyk7XHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0MmR9IG91dCBtYXQyZCByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxyXG4gKiBAcGFyYW0ge3ZlYzJ9IHYgU2NhbGluZyB2ZWN0b3JcclxuICogQHJldHVybnMge21hdDJkfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tU2NhbGluZyhvdXQsIHYpIHtcbiAgb3V0WzBdID0gdlswXTtcbiAgb3V0WzFdID0gMDtcbiAgb3V0WzJdID0gMDtcbiAgb3V0WzNdID0gdlsxXTtcbiAgb3V0WzRdID0gMDtcbiAgb3V0WzVdID0gMDtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDcmVhdGVzIGEgbWF0cml4IGZyb20gYSB2ZWN0b3IgdHJhbnNsYXRpb25cclxuICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIChidXQgbXVjaCBmYXN0ZXIgdGhhbik6XHJcbiAqXHJcbiAqICAgICBtYXQyZC5pZGVudGl0eShkZXN0KTtcclxuICogICAgIG1hdDJkLnRyYW5zbGF0ZShkZXN0LCBkZXN0LCB2ZWMpO1xyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDJkfSBvdXQgbWF0MmQgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcclxuICogQHBhcmFtIHt2ZWMyfSB2IFRyYW5zbGF0aW9uIHZlY3RvclxyXG4gKiBAcmV0dXJucyB7bWF0MmR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21UcmFuc2xhdGlvbihvdXQsIHYpIHtcbiAgb3V0WzBdID0gMTtcbiAgb3V0WzFdID0gMDtcbiAgb3V0WzJdID0gMDtcbiAgb3V0WzNdID0gMTtcbiAgb3V0WzRdID0gdlswXTtcbiAgb3V0WzVdID0gdlsxXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgbWF0MmRcclxuICpcclxuICogQHBhcmFtIHttYXQyZH0gYSBtYXRyaXggdG8gcmVwcmVzZW50IGFzIGEgc3RyaW5nXHJcbiAqIEByZXR1cm5zIHtTdHJpbmd9IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgbWF0cml4XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc3RyKGEpIHtcbiAgcmV0dXJuICdtYXQyZCgnICsgYVswXSArICcsICcgKyBhWzFdICsgJywgJyArIGFbMl0gKyAnLCAnICsgYVszXSArICcsICcgKyBhWzRdICsgJywgJyArIGFbNV0gKyAnKSc7XG59XG4vKipcclxuICogUmV0dXJucyBGcm9iZW5pdXMgbm9ybSBvZiBhIG1hdDJkXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0MmR9IGEgdGhlIG1hdHJpeCB0byBjYWxjdWxhdGUgRnJvYmVuaXVzIG5vcm0gb2ZcclxuICogQHJldHVybnMge051bWJlcn0gRnJvYmVuaXVzIG5vcm1cclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9iKGEpIHtcbiAgcmV0dXJuIE1hdGguc3FydChNYXRoLnBvdyhhWzBdLCAyKSArIE1hdGgucG93KGFbMV0sIDIpICsgTWF0aC5wb3coYVsyXSwgMikgKyBNYXRoLnBvdyhhWzNdLCAyKSArIE1hdGgucG93KGFbNF0sIDIpICsgTWF0aC5wb3coYVs1XSwgMikgKyAxKTtcbn1cbi8qKlxyXG4gKiBBZGRzIHR3byBtYXQyZCdzXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0MmR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxyXG4gKiBAcGFyYW0ge21hdDJkfSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7bWF0MmR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHttYXQyZH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gYWRkKG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBhWzBdICsgYlswXTtcbiAgb3V0WzFdID0gYVsxXSArIGJbMV07XG4gIG91dFsyXSA9IGFbMl0gKyBiWzJdO1xuICBvdXRbM10gPSBhWzNdICsgYlszXTtcbiAgb3V0WzRdID0gYVs0XSArIGJbNF07XG4gIG91dFs1XSA9IGFbNV0gKyBiWzVdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFN1YnRyYWN0cyBtYXRyaXggYiBmcm9tIG1hdHJpeCBhXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0MmR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxyXG4gKiBAcGFyYW0ge21hdDJkfSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7bWF0MmR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHttYXQyZH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc3VidHJhY3Qob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gLSBiWzBdO1xuICBvdXRbMV0gPSBhWzFdIC0gYlsxXTtcbiAgb3V0WzJdID0gYVsyXSAtIGJbMl07XG4gIG91dFszXSA9IGFbM10gLSBiWzNdO1xuICBvdXRbNF0gPSBhWzRdIC0gYls0XTtcbiAgb3V0WzVdID0gYVs1XSAtIGJbNV07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogTXVsdGlwbHkgZWFjaCBlbGVtZW50IG9mIHRoZSBtYXRyaXggYnkgYSBzY2FsYXIuXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0MmR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxyXG4gKiBAcGFyYW0ge21hdDJkfSBhIHRoZSBtYXRyaXggdG8gc2NhbGVcclxuICogQHBhcmFtIHtOdW1iZXJ9IGIgYW1vdW50IHRvIHNjYWxlIHRoZSBtYXRyaXgncyBlbGVtZW50cyBieVxyXG4gKiBAcmV0dXJucyB7bWF0MmR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG11bHRpcGx5U2NhbGFyKG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBhWzBdICogYjtcbiAgb3V0WzFdID0gYVsxXSAqIGI7XG4gIG91dFsyXSA9IGFbMl0gKiBiO1xuICBvdXRbM10gPSBhWzNdICogYjtcbiAgb3V0WzRdID0gYVs0XSAqIGI7XG4gIG91dFs1XSA9IGFbNV0gKiBiO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIEFkZHMgdHdvIG1hdDJkJ3MgYWZ0ZXIgbXVsdGlwbHlpbmcgZWFjaCBlbGVtZW50IG9mIHRoZSBzZWNvbmQgb3BlcmFuZCBieSBhIHNjYWxhciB2YWx1ZS5cclxuICpcclxuICogQHBhcmFtIHttYXQyZH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7bWF0MmR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHttYXQyZH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHNjYWxlIHRoZSBhbW91bnQgdG8gc2NhbGUgYidzIGVsZW1lbnRzIGJ5IGJlZm9yZSBhZGRpbmdcclxuICogQHJldHVybnMge21hdDJkfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBtdWx0aXBseVNjYWxhckFuZEFkZChvdXQsIGEsIGIsIHNjYWxlKSB7XG4gIG91dFswXSA9IGFbMF0gKyBiWzBdICogc2NhbGU7XG4gIG91dFsxXSA9IGFbMV0gKyBiWzFdICogc2NhbGU7XG4gIG91dFsyXSA9IGFbMl0gKyBiWzJdICogc2NhbGU7XG4gIG91dFszXSA9IGFbM10gKyBiWzNdICogc2NhbGU7XG4gIG91dFs0XSA9IGFbNF0gKyBiWzRdICogc2NhbGU7XG4gIG91dFs1XSA9IGFbNV0gKyBiWzVdICogc2NhbGU7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgbWF0cmljZXMgaGF2ZSBleGFjdGx5IHRoZSBzYW1lIGVsZW1lbnRzIGluIHRoZSBzYW1lIHBvc2l0aW9uICh3aGVuIGNvbXBhcmVkIHdpdGggPT09KVxyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDJkfSBhIFRoZSBmaXJzdCBtYXRyaXguXHJcbiAqIEBwYXJhbSB7bWF0MmR9IGIgVGhlIHNlY29uZCBtYXRyaXguXHJcbiAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSBtYXRyaWNlcyBhcmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS5cclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBleGFjdEVxdWFscyhhLCBiKSB7XG4gIHJldHVybiBhWzBdID09PSBiWzBdICYmIGFbMV0gPT09IGJbMV0gJiYgYVsyXSA9PT0gYlsyXSAmJiBhWzNdID09PSBiWzNdICYmIGFbNF0gPT09IGJbNF0gJiYgYVs1XSA9PT0gYls1XTtcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBtYXRyaWNlcyBoYXZlIGFwcHJveGltYXRlbHkgdGhlIHNhbWUgZWxlbWVudHMgaW4gdGhlIHNhbWUgcG9zaXRpb24uXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0MmR9IGEgVGhlIGZpcnN0IG1hdHJpeC5cclxuICogQHBhcmFtIHttYXQyZH0gYiBUaGUgc2Vjb25kIG1hdHJpeC5cclxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIG1hdHJpY2VzIGFyZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGVxdWFscyhhLCBiKSB7XG4gIHZhciBhMCA9IGFbMF0sXG4gICAgICBhMSA9IGFbMV0sXG4gICAgICBhMiA9IGFbMl0sXG4gICAgICBhMyA9IGFbM10sXG4gICAgICBhNCA9IGFbNF0sXG4gICAgICBhNSA9IGFbNV07XG4gIHZhciBiMCA9IGJbMF0sXG4gICAgICBiMSA9IGJbMV0sXG4gICAgICBiMiA9IGJbMl0sXG4gICAgICBiMyA9IGJbM10sXG4gICAgICBiNCA9IGJbNF0sXG4gICAgICBiNSA9IGJbNV07XG4gIHJldHVybiBNYXRoLmFicyhhMCAtIGIwKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMCksIE1hdGguYWJzKGIwKSkgJiYgTWF0aC5hYnMoYTEgLSBiMSkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTEpLCBNYXRoLmFicyhiMSkpICYmIE1hdGguYWJzKGEyIC0gYjIpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGEyKSwgTWF0aC5hYnMoYjIpKSAmJiBNYXRoLmFicyhhMyAtIGIzKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMyksIE1hdGguYWJzKGIzKSkgJiYgTWF0aC5hYnMoYTQgLSBiNCkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTQpLCBNYXRoLmFicyhiNCkpICYmIE1hdGguYWJzKGE1IC0gYjUpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGE1KSwgTWF0aC5hYnMoYjUpKTtcbn1cbi8qKlxyXG4gKiBBbGlhcyBmb3Ige0BsaW5rIG1hdDJkLm11bHRpcGx5fVxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCB2YXIgbXVsID0gbXVsdGlwbHk7XG4vKipcclxuICogQWxpYXMgZm9yIHtAbGluayBtYXQyZC5zdWJ0cmFjdH1cclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIHN1YiA9IHN1YnRyYWN0OyIsImltcG9ydCAqIGFzIGdsTWF0cml4IGZyb20gXCIuL2NvbW1vbi5qc1wiO1xuLyoqXHJcbiAqIDN4MyBNYXRyaXhcclxuICogQG1vZHVsZSBtYXQzXHJcbiAqL1xuXG4vKipcclxuICogQ3JlYXRlcyBhIG5ldyBpZGVudGl0eSBtYXQzXHJcbiAqXHJcbiAqIEByZXR1cm5zIHttYXQzfSBhIG5ldyAzeDMgbWF0cml4XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlKCkge1xuICB2YXIgb3V0ID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoOSk7XG5cbiAgaWYgKGdsTWF0cml4LkFSUkFZX1RZUEUgIT0gRmxvYXQzMkFycmF5KSB7XG4gICAgb3V0WzFdID0gMDtcbiAgICBvdXRbMl0gPSAwO1xuICAgIG91dFszXSA9IDA7XG4gICAgb3V0WzVdID0gMDtcbiAgICBvdXRbNl0gPSAwO1xuICAgIG91dFs3XSA9IDA7XG4gIH1cblxuICBvdXRbMF0gPSAxO1xuICBvdXRbNF0gPSAxO1xuICBvdXRbOF0gPSAxO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENvcGllcyB0aGUgdXBwZXItbGVmdCAzeDMgdmFsdWVzIGludG8gdGhlIGdpdmVuIG1hdDMuXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0M30gb3V0IHRoZSByZWNlaXZpbmcgM3gzIG1hdHJpeFxyXG4gKiBAcGFyYW0ge21hdDR9IGEgICB0aGUgc291cmNlIDR4NCBtYXRyaXhcclxuICogQHJldHVybnMge21hdDN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21NYXQ0KG91dCwgYSkge1xuICBvdXRbMF0gPSBhWzBdO1xuICBvdXRbMV0gPSBhWzFdO1xuICBvdXRbMl0gPSBhWzJdO1xuICBvdXRbM10gPSBhWzRdO1xuICBvdXRbNF0gPSBhWzVdO1xuICBvdXRbNV0gPSBhWzZdO1xuICBvdXRbNl0gPSBhWzhdO1xuICBvdXRbN10gPSBhWzldO1xuICBvdXRbOF0gPSBhWzEwXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDcmVhdGVzIGEgbmV3IG1hdDMgaW5pdGlhbGl6ZWQgd2l0aCB2YWx1ZXMgZnJvbSBhbiBleGlzdGluZyBtYXRyaXhcclxuICpcclxuICogQHBhcmFtIHttYXQzfSBhIG1hdHJpeCB0byBjbG9uZVxyXG4gKiBAcmV0dXJucyB7bWF0M30gYSBuZXcgM3gzIG1hdHJpeFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNsb25lKGEpIHtcbiAgdmFyIG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDkpO1xuICBvdXRbMF0gPSBhWzBdO1xuICBvdXRbMV0gPSBhWzFdO1xuICBvdXRbMl0gPSBhWzJdO1xuICBvdXRbM10gPSBhWzNdO1xuICBvdXRbNF0gPSBhWzRdO1xuICBvdXRbNV0gPSBhWzVdO1xuICBvdXRbNl0gPSBhWzZdO1xuICBvdXRbN10gPSBhWzddO1xuICBvdXRbOF0gPSBhWzhdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENvcHkgdGhlIHZhbHVlcyBmcm9tIG9uZSBtYXQzIHRvIGFub3RoZXJcclxuICpcclxuICogQHBhcmFtIHttYXQzfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcclxuICogQHBhcmFtIHttYXQzfSBhIHRoZSBzb3VyY2UgbWF0cml4XHJcbiAqIEByZXR1cm5zIHttYXQzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjb3B5KG91dCwgYSkge1xuICBvdXRbMF0gPSBhWzBdO1xuICBvdXRbMV0gPSBhWzFdO1xuICBvdXRbMl0gPSBhWzJdO1xuICBvdXRbM10gPSBhWzNdO1xuICBvdXRbNF0gPSBhWzRdO1xuICBvdXRbNV0gPSBhWzVdO1xuICBvdXRbNl0gPSBhWzZdO1xuICBvdXRbN10gPSBhWzddO1xuICBvdXRbOF0gPSBhWzhdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENyZWF0ZSBhIG5ldyBtYXQzIHdpdGggdGhlIGdpdmVuIHZhbHVlc1xyXG4gKlxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTAwIENvbXBvbmVudCBpbiBjb2x1bW4gMCwgcm93IDAgcG9zaXRpb24gKGluZGV4IDApXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMDEgQ29tcG9uZW50IGluIGNvbHVtbiAwLCByb3cgMSBwb3NpdGlvbiAoaW5kZXggMSlcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0wMiBDb21wb25lbnQgaW4gY29sdW1uIDAsIHJvdyAyIHBvc2l0aW9uIChpbmRleCAyKVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTEwIENvbXBvbmVudCBpbiBjb2x1bW4gMSwgcm93IDAgcG9zaXRpb24gKGluZGV4IDMpXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMTEgQ29tcG9uZW50IGluIGNvbHVtbiAxLCByb3cgMSBwb3NpdGlvbiAoaW5kZXggNClcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0xMiBDb21wb25lbnQgaW4gY29sdW1uIDEsIHJvdyAyIHBvc2l0aW9uIChpbmRleCA1KVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTIwIENvbXBvbmVudCBpbiBjb2x1bW4gMiwgcm93IDAgcG9zaXRpb24gKGluZGV4IDYpXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMjEgQ29tcG9uZW50IGluIGNvbHVtbiAyLCByb3cgMSBwb3NpdGlvbiAoaW5kZXggNylcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0yMiBDb21wb25lbnQgaW4gY29sdW1uIDIsIHJvdyAyIHBvc2l0aW9uIChpbmRleCA4KVxyXG4gKiBAcmV0dXJucyB7bWF0M30gQSBuZXcgbWF0M1xyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21WYWx1ZXMobTAwLCBtMDEsIG0wMiwgbTEwLCBtMTEsIG0xMiwgbTIwLCBtMjEsIG0yMikge1xuICB2YXIgb3V0ID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoOSk7XG4gIG91dFswXSA9IG0wMDtcbiAgb3V0WzFdID0gbTAxO1xuICBvdXRbMl0gPSBtMDI7XG4gIG91dFszXSA9IG0xMDtcbiAgb3V0WzRdID0gbTExO1xuICBvdXRbNV0gPSBtMTI7XG4gIG91dFs2XSA9IG0yMDtcbiAgb3V0WzddID0gbTIxO1xuICBvdXRbOF0gPSBtMjI7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogU2V0IHRoZSBjb21wb25lbnRzIG9mIGEgbWF0MyB0byB0aGUgZ2l2ZW4gdmFsdWVzXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0M30gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMDAgQ29tcG9uZW50IGluIGNvbHVtbiAwLCByb3cgMCBwb3NpdGlvbiAoaW5kZXggMClcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0wMSBDb21wb25lbnQgaW4gY29sdW1uIDAsIHJvdyAxIHBvc2l0aW9uIChpbmRleCAxKVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTAyIENvbXBvbmVudCBpbiBjb2x1bW4gMCwgcm93IDIgcG9zaXRpb24gKGluZGV4IDIpXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMTAgQ29tcG9uZW50IGluIGNvbHVtbiAxLCByb3cgMCBwb3NpdGlvbiAoaW5kZXggMylcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0xMSBDb21wb25lbnQgaW4gY29sdW1uIDEsIHJvdyAxIHBvc2l0aW9uIChpbmRleCA0KVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTEyIENvbXBvbmVudCBpbiBjb2x1bW4gMSwgcm93IDIgcG9zaXRpb24gKGluZGV4IDUpXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMjAgQ29tcG9uZW50IGluIGNvbHVtbiAyLCByb3cgMCBwb3NpdGlvbiAoaW5kZXggNilcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0yMSBDb21wb25lbnQgaW4gY29sdW1uIDIsIHJvdyAxIHBvc2l0aW9uIChpbmRleCA3KVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTIyIENvbXBvbmVudCBpbiBjb2x1bW4gMiwgcm93IDIgcG9zaXRpb24gKGluZGV4IDgpXHJcbiAqIEByZXR1cm5zIHttYXQzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzZXQob3V0LCBtMDAsIG0wMSwgbTAyLCBtMTAsIG0xMSwgbTEyLCBtMjAsIG0yMSwgbTIyKSB7XG4gIG91dFswXSA9IG0wMDtcbiAgb3V0WzFdID0gbTAxO1xuICBvdXRbMl0gPSBtMDI7XG4gIG91dFszXSA9IG0xMDtcbiAgb3V0WzRdID0gbTExO1xuICBvdXRbNV0gPSBtMTI7XG4gIG91dFs2XSA9IG0yMDtcbiAgb3V0WzddID0gbTIxO1xuICBvdXRbOF0gPSBtMjI7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogU2V0IGEgbWF0MyB0byB0aGUgaWRlbnRpdHkgbWF0cml4XHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0M30gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XHJcbiAqIEByZXR1cm5zIHttYXQzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBpZGVudGl0eShvdXQpIHtcbiAgb3V0WzBdID0gMTtcbiAgb3V0WzFdID0gMDtcbiAgb3V0WzJdID0gMDtcbiAgb3V0WzNdID0gMDtcbiAgb3V0WzRdID0gMTtcbiAgb3V0WzVdID0gMDtcbiAgb3V0WzZdID0gMDtcbiAgb3V0WzddID0gMDtcbiAgb3V0WzhdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBUcmFuc3Bvc2UgdGhlIHZhbHVlcyBvZiBhIG1hdDNcclxuICpcclxuICogQHBhcmFtIHttYXQzfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcclxuICogQHBhcmFtIHttYXQzfSBhIHRoZSBzb3VyY2UgbWF0cml4XHJcbiAqIEByZXR1cm5zIHttYXQzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc3Bvc2Uob3V0LCBhKSB7XG4gIC8vIElmIHdlIGFyZSB0cmFuc3Bvc2luZyBvdXJzZWx2ZXMgd2UgY2FuIHNraXAgYSBmZXcgc3RlcHMgYnV0IGhhdmUgdG8gY2FjaGUgc29tZSB2YWx1ZXNcbiAgaWYgKG91dCA9PT0gYSkge1xuICAgIHZhciBhMDEgPSBhWzFdLFxuICAgICAgICBhMDIgPSBhWzJdLFxuICAgICAgICBhMTIgPSBhWzVdO1xuICAgIG91dFsxXSA9IGFbM107XG4gICAgb3V0WzJdID0gYVs2XTtcbiAgICBvdXRbM10gPSBhMDE7XG4gICAgb3V0WzVdID0gYVs3XTtcbiAgICBvdXRbNl0gPSBhMDI7XG4gICAgb3V0WzddID0gYTEyO1xuICB9IGVsc2Uge1xuICAgIG91dFswXSA9IGFbMF07XG4gICAgb3V0WzFdID0gYVszXTtcbiAgICBvdXRbMl0gPSBhWzZdO1xuICAgIG91dFszXSA9IGFbMV07XG4gICAgb3V0WzRdID0gYVs0XTtcbiAgICBvdXRbNV0gPSBhWzddO1xuICAgIG91dFs2XSA9IGFbMl07XG4gICAgb3V0WzddID0gYVs1XTtcbiAgICBvdXRbOF0gPSBhWzhdO1xuICB9XG5cbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBJbnZlcnRzIGEgbWF0M1xyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDN9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxyXG4gKiBAcGFyYW0ge21hdDN9IGEgdGhlIHNvdXJjZSBtYXRyaXhcclxuICogQHJldHVybnMge21hdDN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGludmVydChvdXQsIGEpIHtcbiAgdmFyIGEwMCA9IGFbMF0sXG4gICAgICBhMDEgPSBhWzFdLFxuICAgICAgYTAyID0gYVsyXTtcbiAgdmFyIGExMCA9IGFbM10sXG4gICAgICBhMTEgPSBhWzRdLFxuICAgICAgYTEyID0gYVs1XTtcbiAgdmFyIGEyMCA9IGFbNl0sXG4gICAgICBhMjEgPSBhWzddLFxuICAgICAgYTIyID0gYVs4XTtcbiAgdmFyIGIwMSA9IGEyMiAqIGExMSAtIGExMiAqIGEyMTtcbiAgdmFyIGIxMSA9IC1hMjIgKiBhMTAgKyBhMTIgKiBhMjA7XG4gIHZhciBiMjEgPSBhMjEgKiBhMTAgLSBhMTEgKiBhMjA7IC8vIENhbGN1bGF0ZSB0aGUgZGV0ZXJtaW5hbnRcblxuICB2YXIgZGV0ID0gYTAwICogYjAxICsgYTAxICogYjExICsgYTAyICogYjIxO1xuXG4gIGlmICghZGV0KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBkZXQgPSAxLjAgLyBkZXQ7XG4gIG91dFswXSA9IGIwMSAqIGRldDtcbiAgb3V0WzFdID0gKC1hMjIgKiBhMDEgKyBhMDIgKiBhMjEpICogZGV0O1xuICBvdXRbMl0gPSAoYTEyICogYTAxIC0gYTAyICogYTExKSAqIGRldDtcbiAgb3V0WzNdID0gYjExICogZGV0O1xuICBvdXRbNF0gPSAoYTIyICogYTAwIC0gYTAyICogYTIwKSAqIGRldDtcbiAgb3V0WzVdID0gKC1hMTIgKiBhMDAgKyBhMDIgKiBhMTApICogZGV0O1xuICBvdXRbNl0gPSBiMjEgKiBkZXQ7XG4gIG91dFs3XSA9ICgtYTIxICogYTAwICsgYTAxICogYTIwKSAqIGRldDtcbiAgb3V0WzhdID0gKGExMSAqIGEwMCAtIGEwMSAqIGExMCkgKiBkZXQ7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ2FsY3VsYXRlcyB0aGUgYWRqdWdhdGUgb2YgYSBtYXQzXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0M30gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XHJcbiAqIEBwYXJhbSB7bWF0M30gYSB0aGUgc291cmNlIG1hdHJpeFxyXG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gYWRqb2ludChvdXQsIGEpIHtcbiAgdmFyIGEwMCA9IGFbMF0sXG4gICAgICBhMDEgPSBhWzFdLFxuICAgICAgYTAyID0gYVsyXTtcbiAgdmFyIGExMCA9IGFbM10sXG4gICAgICBhMTEgPSBhWzRdLFxuICAgICAgYTEyID0gYVs1XTtcbiAgdmFyIGEyMCA9IGFbNl0sXG4gICAgICBhMjEgPSBhWzddLFxuICAgICAgYTIyID0gYVs4XTtcbiAgb3V0WzBdID0gYTExICogYTIyIC0gYTEyICogYTIxO1xuICBvdXRbMV0gPSBhMDIgKiBhMjEgLSBhMDEgKiBhMjI7XG4gIG91dFsyXSA9IGEwMSAqIGExMiAtIGEwMiAqIGExMTtcbiAgb3V0WzNdID0gYTEyICogYTIwIC0gYTEwICogYTIyO1xuICBvdXRbNF0gPSBhMDAgKiBhMjIgLSBhMDIgKiBhMjA7XG4gIG91dFs1XSA9IGEwMiAqIGExMCAtIGEwMCAqIGExMjtcbiAgb3V0WzZdID0gYTEwICogYTIxIC0gYTExICogYTIwO1xuICBvdXRbN10gPSBhMDEgKiBhMjAgLSBhMDAgKiBhMjE7XG4gIG91dFs4XSA9IGEwMCAqIGExMSAtIGEwMSAqIGExMDtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDYWxjdWxhdGVzIHRoZSBkZXRlcm1pbmFudCBvZiBhIG1hdDNcclxuICpcclxuICogQHBhcmFtIHttYXQzfSBhIHRoZSBzb3VyY2UgbWF0cml4XHJcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IGRldGVybWluYW50IG9mIGFcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBkZXRlcm1pbmFudChhKSB7XG4gIHZhciBhMDAgPSBhWzBdLFxuICAgICAgYTAxID0gYVsxXSxcbiAgICAgIGEwMiA9IGFbMl07XG4gIHZhciBhMTAgPSBhWzNdLFxuICAgICAgYTExID0gYVs0XSxcbiAgICAgIGExMiA9IGFbNV07XG4gIHZhciBhMjAgPSBhWzZdLFxuICAgICAgYTIxID0gYVs3XSxcbiAgICAgIGEyMiA9IGFbOF07XG4gIHJldHVybiBhMDAgKiAoYTIyICogYTExIC0gYTEyICogYTIxKSArIGEwMSAqICgtYTIyICogYTEwICsgYTEyICogYTIwKSArIGEwMiAqIChhMjEgKiBhMTAgLSBhMTEgKiBhMjApO1xufVxuLyoqXHJcbiAqIE11bHRpcGxpZXMgdHdvIG1hdDMnc1xyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDN9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxyXG4gKiBAcGFyYW0ge21hdDN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHttYXQzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbXVsdGlwbHkob3V0LCBhLCBiKSB7XG4gIHZhciBhMDAgPSBhWzBdLFxuICAgICAgYTAxID0gYVsxXSxcbiAgICAgIGEwMiA9IGFbMl07XG4gIHZhciBhMTAgPSBhWzNdLFxuICAgICAgYTExID0gYVs0XSxcbiAgICAgIGExMiA9IGFbNV07XG4gIHZhciBhMjAgPSBhWzZdLFxuICAgICAgYTIxID0gYVs3XSxcbiAgICAgIGEyMiA9IGFbOF07XG4gIHZhciBiMDAgPSBiWzBdLFxuICAgICAgYjAxID0gYlsxXSxcbiAgICAgIGIwMiA9IGJbMl07XG4gIHZhciBiMTAgPSBiWzNdLFxuICAgICAgYjExID0gYls0XSxcbiAgICAgIGIxMiA9IGJbNV07XG4gIHZhciBiMjAgPSBiWzZdLFxuICAgICAgYjIxID0gYls3XSxcbiAgICAgIGIyMiA9IGJbOF07XG4gIG91dFswXSA9IGIwMCAqIGEwMCArIGIwMSAqIGExMCArIGIwMiAqIGEyMDtcbiAgb3V0WzFdID0gYjAwICogYTAxICsgYjAxICogYTExICsgYjAyICogYTIxO1xuICBvdXRbMl0gPSBiMDAgKiBhMDIgKyBiMDEgKiBhMTIgKyBiMDIgKiBhMjI7XG4gIG91dFszXSA9IGIxMCAqIGEwMCArIGIxMSAqIGExMCArIGIxMiAqIGEyMDtcbiAgb3V0WzRdID0gYjEwICogYTAxICsgYjExICogYTExICsgYjEyICogYTIxO1xuICBvdXRbNV0gPSBiMTAgKiBhMDIgKyBiMTEgKiBhMTIgKyBiMTIgKiBhMjI7XG4gIG91dFs2XSA9IGIyMCAqIGEwMCArIGIyMSAqIGExMCArIGIyMiAqIGEyMDtcbiAgb3V0WzddID0gYjIwICogYTAxICsgYjIxICogYTExICsgYjIyICogYTIxO1xuICBvdXRbOF0gPSBiMjAgKiBhMDIgKyBiMjEgKiBhMTIgKyBiMjIgKiBhMjI7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogVHJhbnNsYXRlIGEgbWF0MyBieSB0aGUgZ2l2ZW4gdmVjdG9yXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0M30gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XHJcbiAqIEBwYXJhbSB7bWF0M30gYSB0aGUgbWF0cml4IHRvIHRyYW5zbGF0ZVxyXG4gKiBAcGFyYW0ge3ZlYzJ9IHYgdmVjdG9yIHRvIHRyYW5zbGF0ZSBieVxyXG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNsYXRlKG91dCwgYSwgdikge1xuICB2YXIgYTAwID0gYVswXSxcbiAgICAgIGEwMSA9IGFbMV0sXG4gICAgICBhMDIgPSBhWzJdLFxuICAgICAgYTEwID0gYVszXSxcbiAgICAgIGExMSA9IGFbNF0sXG4gICAgICBhMTIgPSBhWzVdLFxuICAgICAgYTIwID0gYVs2XSxcbiAgICAgIGEyMSA9IGFbN10sXG4gICAgICBhMjIgPSBhWzhdLFxuICAgICAgeCA9IHZbMF0sXG4gICAgICB5ID0gdlsxXTtcbiAgb3V0WzBdID0gYTAwO1xuICBvdXRbMV0gPSBhMDE7XG4gIG91dFsyXSA9IGEwMjtcbiAgb3V0WzNdID0gYTEwO1xuICBvdXRbNF0gPSBhMTE7XG4gIG91dFs1XSA9IGExMjtcbiAgb3V0WzZdID0geCAqIGEwMCArIHkgKiBhMTAgKyBhMjA7XG4gIG91dFs3XSA9IHggKiBhMDEgKyB5ICogYTExICsgYTIxO1xuICBvdXRbOF0gPSB4ICogYTAyICsgeSAqIGExMiArIGEyMjtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBSb3RhdGVzIGEgbWF0MyBieSB0aGUgZ2l2ZW4gYW5nbGVcclxuICpcclxuICogQHBhcmFtIHttYXQzfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcclxuICogQHBhcmFtIHttYXQzfSBhIHRoZSBtYXRyaXggdG8gcm90YXRlXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgdGhlIGFuZ2xlIHRvIHJvdGF0ZSB0aGUgbWF0cml4IGJ5XHJcbiAqIEByZXR1cm5zIHttYXQzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiByb3RhdGUob3V0LCBhLCByYWQpIHtcbiAgdmFyIGEwMCA9IGFbMF0sXG4gICAgICBhMDEgPSBhWzFdLFxuICAgICAgYTAyID0gYVsyXSxcbiAgICAgIGExMCA9IGFbM10sXG4gICAgICBhMTEgPSBhWzRdLFxuICAgICAgYTEyID0gYVs1XSxcbiAgICAgIGEyMCA9IGFbNl0sXG4gICAgICBhMjEgPSBhWzddLFxuICAgICAgYTIyID0gYVs4XSxcbiAgICAgIHMgPSBNYXRoLnNpbihyYWQpLFxuICAgICAgYyA9IE1hdGguY29zKHJhZCk7XG4gIG91dFswXSA9IGMgKiBhMDAgKyBzICogYTEwO1xuICBvdXRbMV0gPSBjICogYTAxICsgcyAqIGExMTtcbiAgb3V0WzJdID0gYyAqIGEwMiArIHMgKiBhMTI7XG4gIG91dFszXSA9IGMgKiBhMTAgLSBzICogYTAwO1xuICBvdXRbNF0gPSBjICogYTExIC0gcyAqIGEwMTtcbiAgb3V0WzVdID0gYyAqIGExMiAtIHMgKiBhMDI7XG4gIG91dFs2XSA9IGEyMDtcbiAgb3V0WzddID0gYTIxO1xuICBvdXRbOF0gPSBhMjI7XG4gIHJldHVybiBvdXQ7XG59XG47XG4vKipcclxuICogU2NhbGVzIHRoZSBtYXQzIGJ5IHRoZSBkaW1lbnNpb25zIGluIHRoZSBnaXZlbiB2ZWMyXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0M30gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XHJcbiAqIEBwYXJhbSB7bWF0M30gYSB0aGUgbWF0cml4IHRvIHJvdGF0ZVxyXG4gKiBAcGFyYW0ge3ZlYzJ9IHYgdGhlIHZlYzIgdG8gc2NhbGUgdGhlIG1hdHJpeCBieVxyXG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XHJcbiAqKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHNjYWxlKG91dCwgYSwgdikge1xuICB2YXIgeCA9IHZbMF0sXG4gICAgICB5ID0gdlsxXTtcbiAgb3V0WzBdID0geCAqIGFbMF07XG4gIG91dFsxXSA9IHggKiBhWzFdO1xuICBvdXRbMl0gPSB4ICogYVsyXTtcbiAgb3V0WzNdID0geSAqIGFbM107XG4gIG91dFs0XSA9IHkgKiBhWzRdO1xuICBvdXRbNV0gPSB5ICogYVs1XTtcbiAgb3V0WzZdID0gYVs2XTtcbiAgb3V0WzddID0gYVs3XTtcbiAgb3V0WzhdID0gYVs4XTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDcmVhdGVzIGEgbWF0cml4IGZyb20gYSB2ZWN0b3IgdHJhbnNsYXRpb25cclxuICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIChidXQgbXVjaCBmYXN0ZXIgdGhhbik6XHJcbiAqXHJcbiAqICAgICBtYXQzLmlkZW50aXR5KGRlc3QpO1xyXG4gKiAgICAgbWF0My50cmFuc2xhdGUoZGVzdCwgZGVzdCwgdmVjKTtcclxuICpcclxuICogQHBhcmFtIHttYXQzfSBvdXQgbWF0MyByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxyXG4gKiBAcGFyYW0ge3ZlYzJ9IHYgVHJhbnNsYXRpb24gdmVjdG9yXHJcbiAqIEByZXR1cm5zIHttYXQzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tVHJhbnNsYXRpb24ob3V0LCB2KSB7XG4gIG91dFswXSA9IDE7XG4gIG91dFsxXSA9IDA7XG4gIG91dFsyXSA9IDA7XG4gIG91dFszXSA9IDA7XG4gIG91dFs0XSA9IDE7XG4gIG91dFs1XSA9IDA7XG4gIG91dFs2XSA9IHZbMF07XG4gIG91dFs3XSA9IHZbMV07XG4gIG91dFs4XSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ3JlYXRlcyBhIG1hdHJpeCBmcm9tIGEgZ2l2ZW4gYW5nbGVcclxuICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIChidXQgbXVjaCBmYXN0ZXIgdGhhbik6XHJcbiAqXHJcbiAqICAgICBtYXQzLmlkZW50aXR5KGRlc3QpO1xyXG4gKiAgICAgbWF0My5yb3RhdGUoZGVzdCwgZGVzdCwgcmFkKTtcclxuICpcclxuICogQHBhcmFtIHttYXQzfSBvdXQgbWF0MyByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxyXG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIHRoZSBhbmdsZSB0byByb3RhdGUgdGhlIG1hdHJpeCBieVxyXG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVJvdGF0aW9uKG91dCwgcmFkKSB7XG4gIHZhciBzID0gTWF0aC5zaW4ocmFkKSxcbiAgICAgIGMgPSBNYXRoLmNvcyhyYWQpO1xuICBvdXRbMF0gPSBjO1xuICBvdXRbMV0gPSBzO1xuICBvdXRbMl0gPSAwO1xuICBvdXRbM10gPSAtcztcbiAgb3V0WzRdID0gYztcbiAgb3V0WzVdID0gMDtcbiAgb3V0WzZdID0gMDtcbiAgb3V0WzddID0gMDtcbiAgb3V0WzhdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDcmVhdGVzIGEgbWF0cml4IGZyb20gYSB2ZWN0b3Igc2NhbGluZ1xyXG4gKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gKGJ1dCBtdWNoIGZhc3RlciB0aGFuKTpcclxuICpcclxuICogICAgIG1hdDMuaWRlbnRpdHkoZGVzdCk7XHJcbiAqICAgICBtYXQzLnNjYWxlKGRlc3QsIGRlc3QsIHZlYyk7XHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0M30gb3V0IG1hdDMgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcclxuICogQHBhcmFtIHt2ZWMyfSB2IFNjYWxpbmcgdmVjdG9yXHJcbiAqIEByZXR1cm5zIHttYXQzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tU2NhbGluZyhvdXQsIHYpIHtcbiAgb3V0WzBdID0gdlswXTtcbiAgb3V0WzFdID0gMDtcbiAgb3V0WzJdID0gMDtcbiAgb3V0WzNdID0gMDtcbiAgb3V0WzRdID0gdlsxXTtcbiAgb3V0WzVdID0gMDtcbiAgb3V0WzZdID0gMDtcbiAgb3V0WzddID0gMDtcbiAgb3V0WzhdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDb3BpZXMgdGhlIHZhbHVlcyBmcm9tIGEgbWF0MmQgaW50byBhIG1hdDNcclxuICpcclxuICogQHBhcmFtIHttYXQzfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcclxuICogQHBhcmFtIHttYXQyZH0gYSB0aGUgbWF0cml4IHRvIGNvcHlcclxuICogQHJldHVybnMge21hdDN9IG91dFxyXG4gKiovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tTWF0MmQob3V0LCBhKSB7XG4gIG91dFswXSA9IGFbMF07XG4gIG91dFsxXSA9IGFbMV07XG4gIG91dFsyXSA9IDA7XG4gIG91dFszXSA9IGFbMl07XG4gIG91dFs0XSA9IGFbM107XG4gIG91dFs1XSA9IDA7XG4gIG91dFs2XSA9IGFbNF07XG4gIG91dFs3XSA9IGFbNV07XG4gIG91dFs4XSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuKiBDYWxjdWxhdGVzIGEgM3gzIG1hdHJpeCBmcm9tIHRoZSBnaXZlbiBxdWF0ZXJuaW9uXHJcbipcclxuKiBAcGFyYW0ge21hdDN9IG91dCBtYXQzIHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XHJcbiogQHBhcmFtIHtxdWF0fSBxIFF1YXRlcm5pb24gdG8gY3JlYXRlIG1hdHJpeCBmcm9tXHJcbipcclxuKiBAcmV0dXJucyB7bWF0M30gb3V0XHJcbiovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tUXVhdChvdXQsIHEpIHtcbiAgdmFyIHggPSBxWzBdLFxuICAgICAgeSA9IHFbMV0sXG4gICAgICB6ID0gcVsyXSxcbiAgICAgIHcgPSBxWzNdO1xuICB2YXIgeDIgPSB4ICsgeDtcbiAgdmFyIHkyID0geSArIHk7XG4gIHZhciB6MiA9IHogKyB6O1xuICB2YXIgeHggPSB4ICogeDI7XG4gIHZhciB5eCA9IHkgKiB4MjtcbiAgdmFyIHl5ID0geSAqIHkyO1xuICB2YXIgenggPSB6ICogeDI7XG4gIHZhciB6eSA9IHogKiB5MjtcbiAgdmFyIHp6ID0geiAqIHoyO1xuICB2YXIgd3ggPSB3ICogeDI7XG4gIHZhciB3eSA9IHcgKiB5MjtcbiAgdmFyIHd6ID0gdyAqIHoyO1xuICBvdXRbMF0gPSAxIC0geXkgLSB6ejtcbiAgb3V0WzNdID0geXggLSB3ejtcbiAgb3V0WzZdID0genggKyB3eTtcbiAgb3V0WzFdID0geXggKyB3ejtcbiAgb3V0WzRdID0gMSAtIHh4IC0geno7XG4gIG91dFs3XSA9IHp5IC0gd3g7XG4gIG91dFsyXSA9IHp4IC0gd3k7XG4gIG91dFs1XSA9IHp5ICsgd3g7XG4gIG91dFs4XSA9IDEgLSB4eCAtIHl5O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiogQ2FsY3VsYXRlcyBhIDN4MyBub3JtYWwgbWF0cml4ICh0cmFuc3Bvc2UgaW52ZXJzZSkgZnJvbSB0aGUgNHg0IG1hdHJpeFxyXG4qXHJcbiogQHBhcmFtIHttYXQzfSBvdXQgbWF0MyByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxyXG4qIEBwYXJhbSB7bWF0NH0gYSBNYXQ0IHRvIGRlcml2ZSB0aGUgbm9ybWFsIG1hdHJpeCBmcm9tXHJcbipcclxuKiBAcmV0dXJucyB7bWF0M30gb3V0XHJcbiovXG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxGcm9tTWF0NChvdXQsIGEpIHtcbiAgdmFyIGEwMCA9IGFbMF0sXG4gICAgICBhMDEgPSBhWzFdLFxuICAgICAgYTAyID0gYVsyXSxcbiAgICAgIGEwMyA9IGFbM107XG4gIHZhciBhMTAgPSBhWzRdLFxuICAgICAgYTExID0gYVs1XSxcbiAgICAgIGExMiA9IGFbNl0sXG4gICAgICBhMTMgPSBhWzddO1xuICB2YXIgYTIwID0gYVs4XSxcbiAgICAgIGEyMSA9IGFbOV0sXG4gICAgICBhMjIgPSBhWzEwXSxcbiAgICAgIGEyMyA9IGFbMTFdO1xuICB2YXIgYTMwID0gYVsxMl0sXG4gICAgICBhMzEgPSBhWzEzXSxcbiAgICAgIGEzMiA9IGFbMTRdLFxuICAgICAgYTMzID0gYVsxNV07XG4gIHZhciBiMDAgPSBhMDAgKiBhMTEgLSBhMDEgKiBhMTA7XG4gIHZhciBiMDEgPSBhMDAgKiBhMTIgLSBhMDIgKiBhMTA7XG4gIHZhciBiMDIgPSBhMDAgKiBhMTMgLSBhMDMgKiBhMTA7XG4gIHZhciBiMDMgPSBhMDEgKiBhMTIgLSBhMDIgKiBhMTE7XG4gIHZhciBiMDQgPSBhMDEgKiBhMTMgLSBhMDMgKiBhMTE7XG4gIHZhciBiMDUgPSBhMDIgKiBhMTMgLSBhMDMgKiBhMTI7XG4gIHZhciBiMDYgPSBhMjAgKiBhMzEgLSBhMjEgKiBhMzA7XG4gIHZhciBiMDcgPSBhMjAgKiBhMzIgLSBhMjIgKiBhMzA7XG4gIHZhciBiMDggPSBhMjAgKiBhMzMgLSBhMjMgKiBhMzA7XG4gIHZhciBiMDkgPSBhMjEgKiBhMzIgLSBhMjIgKiBhMzE7XG4gIHZhciBiMTAgPSBhMjEgKiBhMzMgLSBhMjMgKiBhMzE7XG4gIHZhciBiMTEgPSBhMjIgKiBhMzMgLSBhMjMgKiBhMzI7IC8vIENhbGN1bGF0ZSB0aGUgZGV0ZXJtaW5hbnRcblxuICB2YXIgZGV0ID0gYjAwICogYjExIC0gYjAxICogYjEwICsgYjAyICogYjA5ICsgYjAzICogYjA4IC0gYjA0ICogYjA3ICsgYjA1ICogYjA2O1xuXG4gIGlmICghZGV0KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBkZXQgPSAxLjAgLyBkZXQ7XG4gIG91dFswXSA9IChhMTEgKiBiMTEgLSBhMTIgKiBiMTAgKyBhMTMgKiBiMDkpICogZGV0O1xuICBvdXRbMV0gPSAoYTEyICogYjA4IC0gYTEwICogYjExIC0gYTEzICogYjA3KSAqIGRldDtcbiAgb3V0WzJdID0gKGExMCAqIGIxMCAtIGExMSAqIGIwOCArIGExMyAqIGIwNikgKiBkZXQ7XG4gIG91dFszXSA9IChhMDIgKiBiMTAgLSBhMDEgKiBiMTEgLSBhMDMgKiBiMDkpICogZGV0O1xuICBvdXRbNF0gPSAoYTAwICogYjExIC0gYTAyICogYjA4ICsgYTAzICogYjA3KSAqIGRldDtcbiAgb3V0WzVdID0gKGEwMSAqIGIwOCAtIGEwMCAqIGIxMCAtIGEwMyAqIGIwNikgKiBkZXQ7XG4gIG91dFs2XSA9IChhMzEgKiBiMDUgLSBhMzIgKiBiMDQgKyBhMzMgKiBiMDMpICogZGV0O1xuICBvdXRbN10gPSAoYTMyICogYjAyIC0gYTMwICogYjA1IC0gYTMzICogYjAxKSAqIGRldDtcbiAgb3V0WzhdID0gKGEzMCAqIGIwNCAtIGEzMSAqIGIwMiArIGEzMyAqIGIwMCkgKiBkZXQ7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogR2VuZXJhdGVzIGEgMkQgcHJvamVjdGlvbiBtYXRyaXggd2l0aCB0aGUgZ2l2ZW4gYm91bmRzXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0M30gb3V0IG1hdDMgZnJ1c3R1bSBtYXRyaXggd2lsbCBiZSB3cml0dGVuIGludG9cclxuICogQHBhcmFtIHtudW1iZXJ9IHdpZHRoIFdpZHRoIG9mIHlvdXIgZ2wgY29udGV4dFxyXG4gKiBAcGFyYW0ge251bWJlcn0gaGVpZ2h0IEhlaWdodCBvZiBnbCBjb250ZXh0XHJcbiAqIEByZXR1cm5zIHttYXQzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBwcm9qZWN0aW9uKG91dCwgd2lkdGgsIGhlaWdodCkge1xuICBvdXRbMF0gPSAyIC8gd2lkdGg7XG4gIG91dFsxXSA9IDA7XG4gIG91dFsyXSA9IDA7XG4gIG91dFszXSA9IDA7XG4gIG91dFs0XSA9IC0yIC8gaGVpZ2h0O1xuICBvdXRbNV0gPSAwO1xuICBvdXRbNl0gPSAtMTtcbiAgb3V0WzddID0gMTtcbiAgb3V0WzhdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgbWF0M1xyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDN9IGEgbWF0cml4IHRvIHJlcHJlc2VudCBhcyBhIHN0cmluZ1xyXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1hdHJpeFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHN0cihhKSB7XG4gIHJldHVybiAnbWF0MygnICsgYVswXSArICcsICcgKyBhWzFdICsgJywgJyArIGFbMl0gKyAnLCAnICsgYVszXSArICcsICcgKyBhWzRdICsgJywgJyArIGFbNV0gKyAnLCAnICsgYVs2XSArICcsICcgKyBhWzddICsgJywgJyArIGFbOF0gKyAnKSc7XG59XG4vKipcclxuICogUmV0dXJucyBGcm9iZW5pdXMgbm9ybSBvZiBhIG1hdDNcclxuICpcclxuICogQHBhcmFtIHttYXQzfSBhIHRoZSBtYXRyaXggdG8gY2FsY3VsYXRlIEZyb2Jlbml1cyBub3JtIG9mXHJcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IEZyb2Jlbml1cyBub3JtXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvYihhKSB7XG4gIHJldHVybiBNYXRoLnNxcnQoTWF0aC5wb3coYVswXSwgMikgKyBNYXRoLnBvdyhhWzFdLCAyKSArIE1hdGgucG93KGFbMl0sIDIpICsgTWF0aC5wb3coYVszXSwgMikgKyBNYXRoLnBvdyhhWzRdLCAyKSArIE1hdGgucG93KGFbNV0sIDIpICsgTWF0aC5wb3coYVs2XSwgMikgKyBNYXRoLnBvdyhhWzddLCAyKSArIE1hdGgucG93KGFbOF0sIDIpKTtcbn1cbi8qKlxyXG4gKiBBZGRzIHR3byBtYXQzJ3NcclxuICpcclxuICogQHBhcmFtIHttYXQzfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcclxuICogQHBhcmFtIHttYXQzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7bWF0M30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge21hdDN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGFkZChvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSArIGJbMF07XG4gIG91dFsxXSA9IGFbMV0gKyBiWzFdO1xuICBvdXRbMl0gPSBhWzJdICsgYlsyXTtcbiAgb3V0WzNdID0gYVszXSArIGJbM107XG4gIG91dFs0XSA9IGFbNF0gKyBiWzRdO1xuICBvdXRbNV0gPSBhWzVdICsgYls1XTtcbiAgb3V0WzZdID0gYVs2XSArIGJbNl07XG4gIG91dFs3XSA9IGFbN10gKyBiWzddO1xuICBvdXRbOF0gPSBhWzhdICsgYls4XTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBTdWJ0cmFjdHMgbWF0cml4IGIgZnJvbSBtYXRyaXggYVxyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDN9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxyXG4gKiBAcGFyYW0ge21hdDN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHttYXQzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc3VidHJhY3Qob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gLSBiWzBdO1xuICBvdXRbMV0gPSBhWzFdIC0gYlsxXTtcbiAgb3V0WzJdID0gYVsyXSAtIGJbMl07XG4gIG91dFszXSA9IGFbM10gLSBiWzNdO1xuICBvdXRbNF0gPSBhWzRdIC0gYls0XTtcbiAgb3V0WzVdID0gYVs1XSAtIGJbNV07XG4gIG91dFs2XSA9IGFbNl0gLSBiWzZdO1xuICBvdXRbN10gPSBhWzddIC0gYls3XTtcbiAgb3V0WzhdID0gYVs4XSAtIGJbOF07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogTXVsdGlwbHkgZWFjaCBlbGVtZW50IG9mIHRoZSBtYXRyaXggYnkgYSBzY2FsYXIuXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0M30gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XHJcbiAqIEBwYXJhbSB7bWF0M30gYSB0aGUgbWF0cml4IHRvIHNjYWxlXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBiIGFtb3VudCB0byBzY2FsZSB0aGUgbWF0cml4J3MgZWxlbWVudHMgYnlcclxuICogQHJldHVybnMge21hdDN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG11bHRpcGx5U2NhbGFyKG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBhWzBdICogYjtcbiAgb3V0WzFdID0gYVsxXSAqIGI7XG4gIG91dFsyXSA9IGFbMl0gKiBiO1xuICBvdXRbM10gPSBhWzNdICogYjtcbiAgb3V0WzRdID0gYVs0XSAqIGI7XG4gIG91dFs1XSA9IGFbNV0gKiBiO1xuICBvdXRbNl0gPSBhWzZdICogYjtcbiAgb3V0WzddID0gYVs3XSAqIGI7XG4gIG91dFs4XSA9IGFbOF0gKiBiO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIEFkZHMgdHdvIG1hdDMncyBhZnRlciBtdWx0aXBseWluZyBlYWNoIGVsZW1lbnQgb2YgdGhlIHNlY29uZCBvcGVyYW5kIGJ5IGEgc2NhbGFyIHZhbHVlLlxyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge21hdDN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHttYXQzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge051bWJlcn0gc2NhbGUgdGhlIGFtb3VudCB0byBzY2FsZSBiJ3MgZWxlbWVudHMgYnkgYmVmb3JlIGFkZGluZ1xyXG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbXVsdGlwbHlTY2FsYXJBbmRBZGQob3V0LCBhLCBiLCBzY2FsZSkge1xuICBvdXRbMF0gPSBhWzBdICsgYlswXSAqIHNjYWxlO1xuICBvdXRbMV0gPSBhWzFdICsgYlsxXSAqIHNjYWxlO1xuICBvdXRbMl0gPSBhWzJdICsgYlsyXSAqIHNjYWxlO1xuICBvdXRbM10gPSBhWzNdICsgYlszXSAqIHNjYWxlO1xuICBvdXRbNF0gPSBhWzRdICsgYls0XSAqIHNjYWxlO1xuICBvdXRbNV0gPSBhWzVdICsgYls1XSAqIHNjYWxlO1xuICBvdXRbNl0gPSBhWzZdICsgYls2XSAqIHNjYWxlO1xuICBvdXRbN10gPSBhWzddICsgYls3XSAqIHNjYWxlO1xuICBvdXRbOF0gPSBhWzhdICsgYls4XSAqIHNjYWxlO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIG1hdHJpY2VzIGhhdmUgZXhhY3RseSB0aGUgc2FtZSBlbGVtZW50cyBpbiB0aGUgc2FtZSBwb3NpdGlvbiAod2hlbiBjb21wYXJlZCB3aXRoID09PSlcclxuICpcclxuICogQHBhcmFtIHttYXQzfSBhIFRoZSBmaXJzdCBtYXRyaXguXHJcbiAqIEBwYXJhbSB7bWF0M30gYiBUaGUgc2Vjb25kIG1hdHJpeC5cclxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIG1hdHJpY2VzIGFyZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGV4YWN0RXF1YWxzKGEsIGIpIHtcbiAgcmV0dXJuIGFbMF0gPT09IGJbMF0gJiYgYVsxXSA9PT0gYlsxXSAmJiBhWzJdID09PSBiWzJdICYmIGFbM10gPT09IGJbM10gJiYgYVs0XSA9PT0gYls0XSAmJiBhWzVdID09PSBiWzVdICYmIGFbNl0gPT09IGJbNl0gJiYgYVs3XSA9PT0gYls3XSAmJiBhWzhdID09PSBiWzhdO1xufVxuLyoqXHJcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIG1hdHJpY2VzIGhhdmUgYXBwcm94aW1hdGVseSB0aGUgc2FtZSBlbGVtZW50cyBpbiB0aGUgc2FtZSBwb3NpdGlvbi5cclxuICpcclxuICogQHBhcmFtIHttYXQzfSBhIFRoZSBmaXJzdCBtYXRyaXguXHJcbiAqIEBwYXJhbSB7bWF0M30gYiBUaGUgc2Vjb25kIG1hdHJpeC5cclxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIG1hdHJpY2VzIGFyZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGVxdWFscyhhLCBiKSB7XG4gIHZhciBhMCA9IGFbMF0sXG4gICAgICBhMSA9IGFbMV0sXG4gICAgICBhMiA9IGFbMl0sXG4gICAgICBhMyA9IGFbM10sXG4gICAgICBhNCA9IGFbNF0sXG4gICAgICBhNSA9IGFbNV0sXG4gICAgICBhNiA9IGFbNl0sXG4gICAgICBhNyA9IGFbN10sXG4gICAgICBhOCA9IGFbOF07XG4gIHZhciBiMCA9IGJbMF0sXG4gICAgICBiMSA9IGJbMV0sXG4gICAgICBiMiA9IGJbMl0sXG4gICAgICBiMyA9IGJbM10sXG4gICAgICBiNCA9IGJbNF0sXG4gICAgICBiNSA9IGJbNV0sXG4gICAgICBiNiA9IGJbNl0sXG4gICAgICBiNyA9IGJbN10sXG4gICAgICBiOCA9IGJbOF07XG4gIHJldHVybiBNYXRoLmFicyhhMCAtIGIwKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMCksIE1hdGguYWJzKGIwKSkgJiYgTWF0aC5hYnMoYTEgLSBiMSkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTEpLCBNYXRoLmFicyhiMSkpICYmIE1hdGguYWJzKGEyIC0gYjIpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGEyKSwgTWF0aC5hYnMoYjIpKSAmJiBNYXRoLmFicyhhMyAtIGIzKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMyksIE1hdGguYWJzKGIzKSkgJiYgTWF0aC5hYnMoYTQgLSBiNCkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTQpLCBNYXRoLmFicyhiNCkpICYmIE1hdGguYWJzKGE1IC0gYjUpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGE1KSwgTWF0aC5hYnMoYjUpKSAmJiBNYXRoLmFicyhhNiAtIGI2KSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhNiksIE1hdGguYWJzKGI2KSkgJiYgTWF0aC5hYnMoYTcgLSBiNykgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTcpLCBNYXRoLmFicyhiNykpICYmIE1hdGguYWJzKGE4IC0gYjgpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGE4KSwgTWF0aC5hYnMoYjgpKTtcbn1cbi8qKlxyXG4gKiBBbGlhcyBmb3Ige0BsaW5rIG1hdDMubXVsdGlwbHl9XHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IHZhciBtdWwgPSBtdWx0aXBseTtcbi8qKlxyXG4gKiBBbGlhcyBmb3Ige0BsaW5rIG1hdDMuc3VidHJhY3R9XHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IHZhciBzdWIgPSBzdWJ0cmFjdDsiLCJpbXBvcnQgKiBhcyBnbE1hdHJpeCBmcm9tIFwiLi9jb21tb24uanNcIjtcbi8qKlxyXG4gKiA0eDQgTWF0cml4PGJyPkZvcm1hdDogY29sdW1uLW1ham9yLCB3aGVuIHR5cGVkIG91dCBpdCBsb29rcyBsaWtlIHJvdy1tYWpvcjxicj5UaGUgbWF0cmljZXMgYXJlIGJlaW5nIHBvc3QgbXVsdGlwbGllZC5cclxuICogQG1vZHVsZSBtYXQ0XHJcbiAqL1xuXG4vKipcclxuICogQ3JlYXRlcyBhIG5ldyBpZGVudGl0eSBtYXQ0XHJcbiAqXHJcbiAqIEByZXR1cm5zIHttYXQ0fSBhIG5ldyA0eDQgbWF0cml4XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlKCkge1xuICB2YXIgb3V0ID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoMTYpO1xuXG4gIGlmIChnbE1hdHJpeC5BUlJBWV9UWVBFICE9IEZsb2F0MzJBcnJheSkge1xuICAgIG91dFsxXSA9IDA7XG4gICAgb3V0WzJdID0gMDtcbiAgICBvdXRbM10gPSAwO1xuICAgIG91dFs0XSA9IDA7XG4gICAgb3V0WzZdID0gMDtcbiAgICBvdXRbN10gPSAwO1xuICAgIG91dFs4XSA9IDA7XG4gICAgb3V0WzldID0gMDtcbiAgICBvdXRbMTFdID0gMDtcbiAgICBvdXRbMTJdID0gMDtcbiAgICBvdXRbMTNdID0gMDtcbiAgICBvdXRbMTRdID0gMDtcbiAgfVxuXG4gIG91dFswXSA9IDE7XG4gIG91dFs1XSA9IDE7XG4gIG91dFsxMF0gPSAxO1xuICBvdXRbMTVdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDcmVhdGVzIGEgbmV3IG1hdDQgaW5pdGlhbGl6ZWQgd2l0aCB2YWx1ZXMgZnJvbSBhbiBleGlzdGluZyBtYXRyaXhcclxuICpcclxuICogQHBhcmFtIHttYXQ0fSBhIG1hdHJpeCB0byBjbG9uZVxyXG4gKiBAcmV0dXJucyB7bWF0NH0gYSBuZXcgNHg0IG1hdHJpeFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNsb25lKGEpIHtcbiAgdmFyIG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDE2KTtcbiAgb3V0WzBdID0gYVswXTtcbiAgb3V0WzFdID0gYVsxXTtcbiAgb3V0WzJdID0gYVsyXTtcbiAgb3V0WzNdID0gYVszXTtcbiAgb3V0WzRdID0gYVs0XTtcbiAgb3V0WzVdID0gYVs1XTtcbiAgb3V0WzZdID0gYVs2XTtcbiAgb3V0WzddID0gYVs3XTtcbiAgb3V0WzhdID0gYVs4XTtcbiAgb3V0WzldID0gYVs5XTtcbiAgb3V0WzEwXSA9IGFbMTBdO1xuICBvdXRbMTFdID0gYVsxMV07XG4gIG91dFsxMl0gPSBhWzEyXTtcbiAgb3V0WzEzXSA9IGFbMTNdO1xuICBvdXRbMTRdID0gYVsxNF07XG4gIG91dFsxNV0gPSBhWzE1XTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDb3B5IHRoZSB2YWx1ZXMgZnJvbSBvbmUgbWF0NCB0byBhbm90aGVyXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XHJcbiAqIEBwYXJhbSB7bWF0NH0gYSB0aGUgc291cmNlIG1hdHJpeFxyXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY29weShvdXQsIGEpIHtcbiAgb3V0WzBdID0gYVswXTtcbiAgb3V0WzFdID0gYVsxXTtcbiAgb3V0WzJdID0gYVsyXTtcbiAgb3V0WzNdID0gYVszXTtcbiAgb3V0WzRdID0gYVs0XTtcbiAgb3V0WzVdID0gYVs1XTtcbiAgb3V0WzZdID0gYVs2XTtcbiAgb3V0WzddID0gYVs3XTtcbiAgb3V0WzhdID0gYVs4XTtcbiAgb3V0WzldID0gYVs5XTtcbiAgb3V0WzEwXSA9IGFbMTBdO1xuICBvdXRbMTFdID0gYVsxMV07XG4gIG91dFsxMl0gPSBhWzEyXTtcbiAgb3V0WzEzXSA9IGFbMTNdO1xuICBvdXRbMTRdID0gYVsxNF07XG4gIG91dFsxNV0gPSBhWzE1XTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDcmVhdGUgYSBuZXcgbWF0NCB3aXRoIHRoZSBnaXZlbiB2YWx1ZXNcclxuICpcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0wMCBDb21wb25lbnQgaW4gY29sdW1uIDAsIHJvdyAwIHBvc2l0aW9uIChpbmRleCAwKVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTAxIENvbXBvbmVudCBpbiBjb2x1bW4gMCwgcm93IDEgcG9zaXRpb24gKGluZGV4IDEpXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMDIgQ29tcG9uZW50IGluIGNvbHVtbiAwLCByb3cgMiBwb3NpdGlvbiAoaW5kZXggMilcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0wMyBDb21wb25lbnQgaW4gY29sdW1uIDAsIHJvdyAzIHBvc2l0aW9uIChpbmRleCAzKVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTEwIENvbXBvbmVudCBpbiBjb2x1bW4gMSwgcm93IDAgcG9zaXRpb24gKGluZGV4IDQpXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMTEgQ29tcG9uZW50IGluIGNvbHVtbiAxLCByb3cgMSBwb3NpdGlvbiAoaW5kZXggNSlcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0xMiBDb21wb25lbnQgaW4gY29sdW1uIDEsIHJvdyAyIHBvc2l0aW9uIChpbmRleCA2KVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTEzIENvbXBvbmVudCBpbiBjb2x1bW4gMSwgcm93IDMgcG9zaXRpb24gKGluZGV4IDcpXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMjAgQ29tcG9uZW50IGluIGNvbHVtbiAyLCByb3cgMCBwb3NpdGlvbiAoaW5kZXggOClcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0yMSBDb21wb25lbnQgaW4gY29sdW1uIDIsIHJvdyAxIHBvc2l0aW9uIChpbmRleCA5KVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTIyIENvbXBvbmVudCBpbiBjb2x1bW4gMiwgcm93IDIgcG9zaXRpb24gKGluZGV4IDEwKVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTIzIENvbXBvbmVudCBpbiBjb2x1bW4gMiwgcm93IDMgcG9zaXRpb24gKGluZGV4IDExKVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTMwIENvbXBvbmVudCBpbiBjb2x1bW4gMywgcm93IDAgcG9zaXRpb24gKGluZGV4IDEyKVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTMxIENvbXBvbmVudCBpbiBjb2x1bW4gMywgcm93IDEgcG9zaXRpb24gKGluZGV4IDEzKVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTMyIENvbXBvbmVudCBpbiBjb2x1bW4gMywgcm93IDIgcG9zaXRpb24gKGluZGV4IDE0KVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTMzIENvbXBvbmVudCBpbiBjb2x1bW4gMywgcm93IDMgcG9zaXRpb24gKGluZGV4IDE1KVxyXG4gKiBAcmV0dXJucyB7bWF0NH0gQSBuZXcgbWF0NFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21WYWx1ZXMobTAwLCBtMDEsIG0wMiwgbTAzLCBtMTAsIG0xMSwgbTEyLCBtMTMsIG0yMCwgbTIxLCBtMjIsIG0yMywgbTMwLCBtMzEsIG0zMiwgbTMzKSB7XG4gIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSgxNik7XG4gIG91dFswXSA9IG0wMDtcbiAgb3V0WzFdID0gbTAxO1xuICBvdXRbMl0gPSBtMDI7XG4gIG91dFszXSA9IG0wMztcbiAgb3V0WzRdID0gbTEwO1xuICBvdXRbNV0gPSBtMTE7XG4gIG91dFs2XSA9IG0xMjtcbiAgb3V0WzddID0gbTEzO1xuICBvdXRbOF0gPSBtMjA7XG4gIG91dFs5XSA9IG0yMTtcbiAgb3V0WzEwXSA9IG0yMjtcbiAgb3V0WzExXSA9IG0yMztcbiAgb3V0WzEyXSA9IG0zMDtcbiAgb3V0WzEzXSA9IG0zMTtcbiAgb3V0WzE0XSA9IG0zMjtcbiAgb3V0WzE1XSA9IG0zMztcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBTZXQgdGhlIGNvbXBvbmVudHMgb2YgYSBtYXQ0IHRvIHRoZSBnaXZlbiB2YWx1ZXNcclxuICpcclxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0wMCBDb21wb25lbnQgaW4gY29sdW1uIDAsIHJvdyAwIHBvc2l0aW9uIChpbmRleCAwKVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTAxIENvbXBvbmVudCBpbiBjb2x1bW4gMCwgcm93IDEgcG9zaXRpb24gKGluZGV4IDEpXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMDIgQ29tcG9uZW50IGluIGNvbHVtbiAwLCByb3cgMiBwb3NpdGlvbiAoaW5kZXggMilcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0wMyBDb21wb25lbnQgaW4gY29sdW1uIDAsIHJvdyAzIHBvc2l0aW9uIChpbmRleCAzKVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTEwIENvbXBvbmVudCBpbiBjb2x1bW4gMSwgcm93IDAgcG9zaXRpb24gKGluZGV4IDQpXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMTEgQ29tcG9uZW50IGluIGNvbHVtbiAxLCByb3cgMSBwb3NpdGlvbiAoaW5kZXggNSlcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0xMiBDb21wb25lbnQgaW4gY29sdW1uIDEsIHJvdyAyIHBvc2l0aW9uIChpbmRleCA2KVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTEzIENvbXBvbmVudCBpbiBjb2x1bW4gMSwgcm93IDMgcG9zaXRpb24gKGluZGV4IDcpXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMjAgQ29tcG9uZW50IGluIGNvbHVtbiAyLCByb3cgMCBwb3NpdGlvbiAoaW5kZXggOClcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0yMSBDb21wb25lbnQgaW4gY29sdW1uIDIsIHJvdyAxIHBvc2l0aW9uIChpbmRleCA5KVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTIyIENvbXBvbmVudCBpbiBjb2x1bW4gMiwgcm93IDIgcG9zaXRpb24gKGluZGV4IDEwKVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTIzIENvbXBvbmVudCBpbiBjb2x1bW4gMiwgcm93IDMgcG9zaXRpb24gKGluZGV4IDExKVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTMwIENvbXBvbmVudCBpbiBjb2x1bW4gMywgcm93IDAgcG9zaXRpb24gKGluZGV4IDEyKVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTMxIENvbXBvbmVudCBpbiBjb2x1bW4gMywgcm93IDEgcG9zaXRpb24gKGluZGV4IDEzKVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTMyIENvbXBvbmVudCBpbiBjb2x1bW4gMywgcm93IDIgcG9zaXRpb24gKGluZGV4IDE0KVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTMzIENvbXBvbmVudCBpbiBjb2x1bW4gMywgcm93IDMgcG9zaXRpb24gKGluZGV4IDE1KVxyXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc2V0KG91dCwgbTAwLCBtMDEsIG0wMiwgbTAzLCBtMTAsIG0xMSwgbTEyLCBtMTMsIG0yMCwgbTIxLCBtMjIsIG0yMywgbTMwLCBtMzEsIG0zMiwgbTMzKSB7XG4gIG91dFswXSA9IG0wMDtcbiAgb3V0WzFdID0gbTAxO1xuICBvdXRbMl0gPSBtMDI7XG4gIG91dFszXSA9IG0wMztcbiAgb3V0WzRdID0gbTEwO1xuICBvdXRbNV0gPSBtMTE7XG4gIG91dFs2XSA9IG0xMjtcbiAgb3V0WzddID0gbTEzO1xuICBvdXRbOF0gPSBtMjA7XG4gIG91dFs5XSA9IG0yMTtcbiAgb3V0WzEwXSA9IG0yMjtcbiAgb3V0WzExXSA9IG0yMztcbiAgb3V0WzEyXSA9IG0zMDtcbiAgb3V0WzEzXSA9IG0zMTtcbiAgb3V0WzE0XSA9IG0zMjtcbiAgb3V0WzE1XSA9IG0zMztcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBTZXQgYSBtYXQ0IHRvIHRoZSBpZGVudGl0eSBtYXRyaXhcclxuICpcclxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcclxuICogQHJldHVybnMge21hdDR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGlkZW50aXR5KG91dCkge1xuICBvdXRbMF0gPSAxO1xuICBvdXRbMV0gPSAwO1xuICBvdXRbMl0gPSAwO1xuICBvdXRbM10gPSAwO1xuICBvdXRbNF0gPSAwO1xuICBvdXRbNV0gPSAxO1xuICBvdXRbNl0gPSAwO1xuICBvdXRbN10gPSAwO1xuICBvdXRbOF0gPSAwO1xuICBvdXRbOV0gPSAwO1xuICBvdXRbMTBdID0gMTtcbiAgb3V0WzExXSA9IDA7XG4gIG91dFsxMl0gPSAwO1xuICBvdXRbMTNdID0gMDtcbiAgb3V0WzE0XSA9IDA7XG4gIG91dFsxNV0gPSAxO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFRyYW5zcG9zZSB0aGUgdmFsdWVzIG9mIGEgbWF0NFxyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxyXG4gKiBAcGFyYW0ge21hdDR9IGEgdGhlIHNvdXJjZSBtYXRyaXhcclxuICogQHJldHVybnMge21hdDR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zcG9zZShvdXQsIGEpIHtcbiAgLy8gSWYgd2UgYXJlIHRyYW5zcG9zaW5nIG91cnNlbHZlcyB3ZSBjYW4gc2tpcCBhIGZldyBzdGVwcyBidXQgaGF2ZSB0byBjYWNoZSBzb21lIHZhbHVlc1xuICBpZiAob3V0ID09PSBhKSB7XG4gICAgdmFyIGEwMSA9IGFbMV0sXG4gICAgICAgIGEwMiA9IGFbMl0sXG4gICAgICAgIGEwMyA9IGFbM107XG4gICAgdmFyIGExMiA9IGFbNl0sXG4gICAgICAgIGExMyA9IGFbN107XG4gICAgdmFyIGEyMyA9IGFbMTFdO1xuICAgIG91dFsxXSA9IGFbNF07XG4gICAgb3V0WzJdID0gYVs4XTtcbiAgICBvdXRbM10gPSBhWzEyXTtcbiAgICBvdXRbNF0gPSBhMDE7XG4gICAgb3V0WzZdID0gYVs5XTtcbiAgICBvdXRbN10gPSBhWzEzXTtcbiAgICBvdXRbOF0gPSBhMDI7XG4gICAgb3V0WzldID0gYTEyO1xuICAgIG91dFsxMV0gPSBhWzE0XTtcbiAgICBvdXRbMTJdID0gYTAzO1xuICAgIG91dFsxM10gPSBhMTM7XG4gICAgb3V0WzE0XSA9IGEyMztcbiAgfSBlbHNlIHtcbiAgICBvdXRbMF0gPSBhWzBdO1xuICAgIG91dFsxXSA9IGFbNF07XG4gICAgb3V0WzJdID0gYVs4XTtcbiAgICBvdXRbM10gPSBhWzEyXTtcbiAgICBvdXRbNF0gPSBhWzFdO1xuICAgIG91dFs1XSA9IGFbNV07XG4gICAgb3V0WzZdID0gYVs5XTtcbiAgICBvdXRbN10gPSBhWzEzXTtcbiAgICBvdXRbOF0gPSBhWzJdO1xuICAgIG91dFs5XSA9IGFbNl07XG4gICAgb3V0WzEwXSA9IGFbMTBdO1xuICAgIG91dFsxMV0gPSBhWzE0XTtcbiAgICBvdXRbMTJdID0gYVszXTtcbiAgICBvdXRbMTNdID0gYVs3XTtcbiAgICBvdXRbMTRdID0gYVsxMV07XG4gICAgb3V0WzE1XSA9IGFbMTVdO1xuICB9XG5cbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBJbnZlcnRzIGEgbWF0NFxyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxyXG4gKiBAcGFyYW0ge21hdDR9IGEgdGhlIHNvdXJjZSBtYXRyaXhcclxuICogQHJldHVybnMge21hdDR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGludmVydChvdXQsIGEpIHtcbiAgdmFyIGEwMCA9IGFbMF0sXG4gICAgICBhMDEgPSBhWzFdLFxuICAgICAgYTAyID0gYVsyXSxcbiAgICAgIGEwMyA9IGFbM107XG4gIHZhciBhMTAgPSBhWzRdLFxuICAgICAgYTExID0gYVs1XSxcbiAgICAgIGExMiA9IGFbNl0sXG4gICAgICBhMTMgPSBhWzddO1xuICB2YXIgYTIwID0gYVs4XSxcbiAgICAgIGEyMSA9IGFbOV0sXG4gICAgICBhMjIgPSBhWzEwXSxcbiAgICAgIGEyMyA9IGFbMTFdO1xuICB2YXIgYTMwID0gYVsxMl0sXG4gICAgICBhMzEgPSBhWzEzXSxcbiAgICAgIGEzMiA9IGFbMTRdLFxuICAgICAgYTMzID0gYVsxNV07XG4gIHZhciBiMDAgPSBhMDAgKiBhMTEgLSBhMDEgKiBhMTA7XG4gIHZhciBiMDEgPSBhMDAgKiBhMTIgLSBhMDIgKiBhMTA7XG4gIHZhciBiMDIgPSBhMDAgKiBhMTMgLSBhMDMgKiBhMTA7XG4gIHZhciBiMDMgPSBhMDEgKiBhMTIgLSBhMDIgKiBhMTE7XG4gIHZhciBiMDQgPSBhMDEgKiBhMTMgLSBhMDMgKiBhMTE7XG4gIHZhciBiMDUgPSBhMDIgKiBhMTMgLSBhMDMgKiBhMTI7XG4gIHZhciBiMDYgPSBhMjAgKiBhMzEgLSBhMjEgKiBhMzA7XG4gIHZhciBiMDcgPSBhMjAgKiBhMzIgLSBhMjIgKiBhMzA7XG4gIHZhciBiMDggPSBhMjAgKiBhMzMgLSBhMjMgKiBhMzA7XG4gIHZhciBiMDkgPSBhMjEgKiBhMzIgLSBhMjIgKiBhMzE7XG4gIHZhciBiMTAgPSBhMjEgKiBhMzMgLSBhMjMgKiBhMzE7XG4gIHZhciBiMTEgPSBhMjIgKiBhMzMgLSBhMjMgKiBhMzI7IC8vIENhbGN1bGF0ZSB0aGUgZGV0ZXJtaW5hbnRcblxuICB2YXIgZGV0ID0gYjAwICogYjExIC0gYjAxICogYjEwICsgYjAyICogYjA5ICsgYjAzICogYjA4IC0gYjA0ICogYjA3ICsgYjA1ICogYjA2O1xuXG4gIGlmICghZGV0KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBkZXQgPSAxLjAgLyBkZXQ7XG4gIG91dFswXSA9IChhMTEgKiBiMTEgLSBhMTIgKiBiMTAgKyBhMTMgKiBiMDkpICogZGV0O1xuICBvdXRbMV0gPSAoYTAyICogYjEwIC0gYTAxICogYjExIC0gYTAzICogYjA5KSAqIGRldDtcbiAgb3V0WzJdID0gKGEzMSAqIGIwNSAtIGEzMiAqIGIwNCArIGEzMyAqIGIwMykgKiBkZXQ7XG4gIG91dFszXSA9IChhMjIgKiBiMDQgLSBhMjEgKiBiMDUgLSBhMjMgKiBiMDMpICogZGV0O1xuICBvdXRbNF0gPSAoYTEyICogYjA4IC0gYTEwICogYjExIC0gYTEzICogYjA3KSAqIGRldDtcbiAgb3V0WzVdID0gKGEwMCAqIGIxMSAtIGEwMiAqIGIwOCArIGEwMyAqIGIwNykgKiBkZXQ7XG4gIG91dFs2XSA9IChhMzIgKiBiMDIgLSBhMzAgKiBiMDUgLSBhMzMgKiBiMDEpICogZGV0O1xuICBvdXRbN10gPSAoYTIwICogYjA1IC0gYTIyICogYjAyICsgYTIzICogYjAxKSAqIGRldDtcbiAgb3V0WzhdID0gKGExMCAqIGIxMCAtIGExMSAqIGIwOCArIGExMyAqIGIwNikgKiBkZXQ7XG4gIG91dFs5XSA9IChhMDEgKiBiMDggLSBhMDAgKiBiMTAgLSBhMDMgKiBiMDYpICogZGV0O1xuICBvdXRbMTBdID0gKGEzMCAqIGIwNCAtIGEzMSAqIGIwMiArIGEzMyAqIGIwMCkgKiBkZXQ7XG4gIG91dFsxMV0gPSAoYTIxICogYjAyIC0gYTIwICogYjA0IC0gYTIzICogYjAwKSAqIGRldDtcbiAgb3V0WzEyXSA9IChhMTEgKiBiMDcgLSBhMTAgKiBiMDkgLSBhMTIgKiBiMDYpICogZGV0O1xuICBvdXRbMTNdID0gKGEwMCAqIGIwOSAtIGEwMSAqIGIwNyArIGEwMiAqIGIwNikgKiBkZXQ7XG4gIG91dFsxNF0gPSAoYTMxICogYjAxIC0gYTMwICogYjAzIC0gYTMyICogYjAwKSAqIGRldDtcbiAgb3V0WzE1XSA9IChhMjAgKiBiMDMgLSBhMjEgKiBiMDEgKyBhMjIgKiBiMDApICogZGV0O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENhbGN1bGF0ZXMgdGhlIGFkanVnYXRlIG9mIGEgbWF0NFxyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxyXG4gKiBAcGFyYW0ge21hdDR9IGEgdGhlIHNvdXJjZSBtYXRyaXhcclxuICogQHJldHVybnMge21hdDR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGFkam9pbnQob3V0LCBhKSB7XG4gIHZhciBhMDAgPSBhWzBdLFxuICAgICAgYTAxID0gYVsxXSxcbiAgICAgIGEwMiA9IGFbMl0sXG4gICAgICBhMDMgPSBhWzNdO1xuICB2YXIgYTEwID0gYVs0XSxcbiAgICAgIGExMSA9IGFbNV0sXG4gICAgICBhMTIgPSBhWzZdLFxuICAgICAgYTEzID0gYVs3XTtcbiAgdmFyIGEyMCA9IGFbOF0sXG4gICAgICBhMjEgPSBhWzldLFxuICAgICAgYTIyID0gYVsxMF0sXG4gICAgICBhMjMgPSBhWzExXTtcbiAgdmFyIGEzMCA9IGFbMTJdLFxuICAgICAgYTMxID0gYVsxM10sXG4gICAgICBhMzIgPSBhWzE0XSxcbiAgICAgIGEzMyA9IGFbMTVdO1xuICBvdXRbMF0gPSBhMTEgKiAoYTIyICogYTMzIC0gYTIzICogYTMyKSAtIGEyMSAqIChhMTIgKiBhMzMgLSBhMTMgKiBhMzIpICsgYTMxICogKGExMiAqIGEyMyAtIGExMyAqIGEyMik7XG4gIG91dFsxXSA9IC0oYTAxICogKGEyMiAqIGEzMyAtIGEyMyAqIGEzMikgLSBhMjEgKiAoYTAyICogYTMzIC0gYTAzICogYTMyKSArIGEzMSAqIChhMDIgKiBhMjMgLSBhMDMgKiBhMjIpKTtcbiAgb3V0WzJdID0gYTAxICogKGExMiAqIGEzMyAtIGExMyAqIGEzMikgLSBhMTEgKiAoYTAyICogYTMzIC0gYTAzICogYTMyKSArIGEzMSAqIChhMDIgKiBhMTMgLSBhMDMgKiBhMTIpO1xuICBvdXRbM10gPSAtKGEwMSAqIChhMTIgKiBhMjMgLSBhMTMgKiBhMjIpIC0gYTExICogKGEwMiAqIGEyMyAtIGEwMyAqIGEyMikgKyBhMjEgKiAoYTAyICogYTEzIC0gYTAzICogYTEyKSk7XG4gIG91dFs0XSA9IC0oYTEwICogKGEyMiAqIGEzMyAtIGEyMyAqIGEzMikgLSBhMjAgKiAoYTEyICogYTMzIC0gYTEzICogYTMyKSArIGEzMCAqIChhMTIgKiBhMjMgLSBhMTMgKiBhMjIpKTtcbiAgb3V0WzVdID0gYTAwICogKGEyMiAqIGEzMyAtIGEyMyAqIGEzMikgLSBhMjAgKiAoYTAyICogYTMzIC0gYTAzICogYTMyKSArIGEzMCAqIChhMDIgKiBhMjMgLSBhMDMgKiBhMjIpO1xuICBvdXRbNl0gPSAtKGEwMCAqIChhMTIgKiBhMzMgLSBhMTMgKiBhMzIpIC0gYTEwICogKGEwMiAqIGEzMyAtIGEwMyAqIGEzMikgKyBhMzAgKiAoYTAyICogYTEzIC0gYTAzICogYTEyKSk7XG4gIG91dFs3XSA9IGEwMCAqIChhMTIgKiBhMjMgLSBhMTMgKiBhMjIpIC0gYTEwICogKGEwMiAqIGEyMyAtIGEwMyAqIGEyMikgKyBhMjAgKiAoYTAyICogYTEzIC0gYTAzICogYTEyKTtcbiAgb3V0WzhdID0gYTEwICogKGEyMSAqIGEzMyAtIGEyMyAqIGEzMSkgLSBhMjAgKiAoYTExICogYTMzIC0gYTEzICogYTMxKSArIGEzMCAqIChhMTEgKiBhMjMgLSBhMTMgKiBhMjEpO1xuICBvdXRbOV0gPSAtKGEwMCAqIChhMjEgKiBhMzMgLSBhMjMgKiBhMzEpIC0gYTIwICogKGEwMSAqIGEzMyAtIGEwMyAqIGEzMSkgKyBhMzAgKiAoYTAxICogYTIzIC0gYTAzICogYTIxKSk7XG4gIG91dFsxMF0gPSBhMDAgKiAoYTExICogYTMzIC0gYTEzICogYTMxKSAtIGExMCAqIChhMDEgKiBhMzMgLSBhMDMgKiBhMzEpICsgYTMwICogKGEwMSAqIGExMyAtIGEwMyAqIGExMSk7XG4gIG91dFsxMV0gPSAtKGEwMCAqIChhMTEgKiBhMjMgLSBhMTMgKiBhMjEpIC0gYTEwICogKGEwMSAqIGEyMyAtIGEwMyAqIGEyMSkgKyBhMjAgKiAoYTAxICogYTEzIC0gYTAzICogYTExKSk7XG4gIG91dFsxMl0gPSAtKGExMCAqIChhMjEgKiBhMzIgLSBhMjIgKiBhMzEpIC0gYTIwICogKGExMSAqIGEzMiAtIGExMiAqIGEzMSkgKyBhMzAgKiAoYTExICogYTIyIC0gYTEyICogYTIxKSk7XG4gIG91dFsxM10gPSBhMDAgKiAoYTIxICogYTMyIC0gYTIyICogYTMxKSAtIGEyMCAqIChhMDEgKiBhMzIgLSBhMDIgKiBhMzEpICsgYTMwICogKGEwMSAqIGEyMiAtIGEwMiAqIGEyMSk7XG4gIG91dFsxNF0gPSAtKGEwMCAqIChhMTEgKiBhMzIgLSBhMTIgKiBhMzEpIC0gYTEwICogKGEwMSAqIGEzMiAtIGEwMiAqIGEzMSkgKyBhMzAgKiAoYTAxICogYTEyIC0gYTAyICogYTExKSk7XG4gIG91dFsxNV0gPSBhMDAgKiAoYTExICogYTIyIC0gYTEyICogYTIxKSAtIGExMCAqIChhMDEgKiBhMjIgLSBhMDIgKiBhMjEpICsgYTIwICogKGEwMSAqIGExMiAtIGEwMiAqIGExMSk7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ2FsY3VsYXRlcyB0aGUgZGV0ZXJtaW5hbnQgb2YgYSBtYXQ0XHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0NH0gYSB0aGUgc291cmNlIG1hdHJpeFxyXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBkZXRlcm1pbmFudCBvZiBhXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZGV0ZXJtaW5hbnQoYSkge1xuICB2YXIgYTAwID0gYVswXSxcbiAgICAgIGEwMSA9IGFbMV0sXG4gICAgICBhMDIgPSBhWzJdLFxuICAgICAgYTAzID0gYVszXTtcbiAgdmFyIGExMCA9IGFbNF0sXG4gICAgICBhMTEgPSBhWzVdLFxuICAgICAgYTEyID0gYVs2XSxcbiAgICAgIGExMyA9IGFbN107XG4gIHZhciBhMjAgPSBhWzhdLFxuICAgICAgYTIxID0gYVs5XSxcbiAgICAgIGEyMiA9IGFbMTBdLFxuICAgICAgYTIzID0gYVsxMV07XG4gIHZhciBhMzAgPSBhWzEyXSxcbiAgICAgIGEzMSA9IGFbMTNdLFxuICAgICAgYTMyID0gYVsxNF0sXG4gICAgICBhMzMgPSBhWzE1XTtcbiAgdmFyIGIwMCA9IGEwMCAqIGExMSAtIGEwMSAqIGExMDtcbiAgdmFyIGIwMSA9IGEwMCAqIGExMiAtIGEwMiAqIGExMDtcbiAgdmFyIGIwMiA9IGEwMCAqIGExMyAtIGEwMyAqIGExMDtcbiAgdmFyIGIwMyA9IGEwMSAqIGExMiAtIGEwMiAqIGExMTtcbiAgdmFyIGIwNCA9IGEwMSAqIGExMyAtIGEwMyAqIGExMTtcbiAgdmFyIGIwNSA9IGEwMiAqIGExMyAtIGEwMyAqIGExMjtcbiAgdmFyIGIwNiA9IGEyMCAqIGEzMSAtIGEyMSAqIGEzMDtcbiAgdmFyIGIwNyA9IGEyMCAqIGEzMiAtIGEyMiAqIGEzMDtcbiAgdmFyIGIwOCA9IGEyMCAqIGEzMyAtIGEyMyAqIGEzMDtcbiAgdmFyIGIwOSA9IGEyMSAqIGEzMiAtIGEyMiAqIGEzMTtcbiAgdmFyIGIxMCA9IGEyMSAqIGEzMyAtIGEyMyAqIGEzMTtcbiAgdmFyIGIxMSA9IGEyMiAqIGEzMyAtIGEyMyAqIGEzMjsgLy8gQ2FsY3VsYXRlIHRoZSBkZXRlcm1pbmFudFxuXG4gIHJldHVybiBiMDAgKiBiMTEgLSBiMDEgKiBiMTAgKyBiMDIgKiBiMDkgKyBiMDMgKiBiMDggLSBiMDQgKiBiMDcgKyBiMDUgKiBiMDY7XG59XG4vKipcclxuICogTXVsdGlwbGllcyB0d28gbWF0NHNcclxuICpcclxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcclxuICogQHBhcmFtIHttYXQ0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7bWF0NH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge21hdDR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG11bHRpcGx5KG91dCwgYSwgYikge1xuICB2YXIgYTAwID0gYVswXSxcbiAgICAgIGEwMSA9IGFbMV0sXG4gICAgICBhMDIgPSBhWzJdLFxuICAgICAgYTAzID0gYVszXTtcbiAgdmFyIGExMCA9IGFbNF0sXG4gICAgICBhMTEgPSBhWzVdLFxuICAgICAgYTEyID0gYVs2XSxcbiAgICAgIGExMyA9IGFbN107XG4gIHZhciBhMjAgPSBhWzhdLFxuICAgICAgYTIxID0gYVs5XSxcbiAgICAgIGEyMiA9IGFbMTBdLFxuICAgICAgYTIzID0gYVsxMV07XG4gIHZhciBhMzAgPSBhWzEyXSxcbiAgICAgIGEzMSA9IGFbMTNdLFxuICAgICAgYTMyID0gYVsxNF0sXG4gICAgICBhMzMgPSBhWzE1XTsgLy8gQ2FjaGUgb25seSB0aGUgY3VycmVudCBsaW5lIG9mIHRoZSBzZWNvbmQgbWF0cml4XG5cbiAgdmFyIGIwID0gYlswXSxcbiAgICAgIGIxID0gYlsxXSxcbiAgICAgIGIyID0gYlsyXSxcbiAgICAgIGIzID0gYlszXTtcbiAgb3V0WzBdID0gYjAgKiBhMDAgKyBiMSAqIGExMCArIGIyICogYTIwICsgYjMgKiBhMzA7XG4gIG91dFsxXSA9IGIwICogYTAxICsgYjEgKiBhMTEgKyBiMiAqIGEyMSArIGIzICogYTMxO1xuICBvdXRbMl0gPSBiMCAqIGEwMiArIGIxICogYTEyICsgYjIgKiBhMjIgKyBiMyAqIGEzMjtcbiAgb3V0WzNdID0gYjAgKiBhMDMgKyBiMSAqIGExMyArIGIyICogYTIzICsgYjMgKiBhMzM7XG4gIGIwID0gYls0XTtcbiAgYjEgPSBiWzVdO1xuICBiMiA9IGJbNl07XG4gIGIzID0gYls3XTtcbiAgb3V0WzRdID0gYjAgKiBhMDAgKyBiMSAqIGExMCArIGIyICogYTIwICsgYjMgKiBhMzA7XG4gIG91dFs1XSA9IGIwICogYTAxICsgYjEgKiBhMTEgKyBiMiAqIGEyMSArIGIzICogYTMxO1xuICBvdXRbNl0gPSBiMCAqIGEwMiArIGIxICogYTEyICsgYjIgKiBhMjIgKyBiMyAqIGEzMjtcbiAgb3V0WzddID0gYjAgKiBhMDMgKyBiMSAqIGExMyArIGIyICogYTIzICsgYjMgKiBhMzM7XG4gIGIwID0gYls4XTtcbiAgYjEgPSBiWzldO1xuICBiMiA9IGJbMTBdO1xuICBiMyA9IGJbMTFdO1xuICBvdXRbOF0gPSBiMCAqIGEwMCArIGIxICogYTEwICsgYjIgKiBhMjAgKyBiMyAqIGEzMDtcbiAgb3V0WzldID0gYjAgKiBhMDEgKyBiMSAqIGExMSArIGIyICogYTIxICsgYjMgKiBhMzE7XG4gIG91dFsxMF0gPSBiMCAqIGEwMiArIGIxICogYTEyICsgYjIgKiBhMjIgKyBiMyAqIGEzMjtcbiAgb3V0WzExXSA9IGIwICogYTAzICsgYjEgKiBhMTMgKyBiMiAqIGEyMyArIGIzICogYTMzO1xuICBiMCA9IGJbMTJdO1xuICBiMSA9IGJbMTNdO1xuICBiMiA9IGJbMTRdO1xuICBiMyA9IGJbMTVdO1xuICBvdXRbMTJdID0gYjAgKiBhMDAgKyBiMSAqIGExMCArIGIyICogYTIwICsgYjMgKiBhMzA7XG4gIG91dFsxM10gPSBiMCAqIGEwMSArIGIxICogYTExICsgYjIgKiBhMjEgKyBiMyAqIGEzMTtcbiAgb3V0WzE0XSA9IGIwICogYTAyICsgYjEgKiBhMTIgKyBiMiAqIGEyMiArIGIzICogYTMyO1xuICBvdXRbMTVdID0gYjAgKiBhMDMgKyBiMSAqIGExMyArIGIyICogYTIzICsgYjMgKiBhMzM7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogVHJhbnNsYXRlIGEgbWF0NCBieSB0aGUgZ2l2ZW4gdmVjdG9yXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XHJcbiAqIEBwYXJhbSB7bWF0NH0gYSB0aGUgbWF0cml4IHRvIHRyYW5zbGF0ZVxyXG4gKiBAcGFyYW0ge3ZlYzN9IHYgdmVjdG9yIHRvIHRyYW5zbGF0ZSBieVxyXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNsYXRlKG91dCwgYSwgdikge1xuICB2YXIgeCA9IHZbMF0sXG4gICAgICB5ID0gdlsxXSxcbiAgICAgIHogPSB2WzJdO1xuICB2YXIgYTAwLCBhMDEsIGEwMiwgYTAzO1xuICB2YXIgYTEwLCBhMTEsIGExMiwgYTEzO1xuICB2YXIgYTIwLCBhMjEsIGEyMiwgYTIzO1xuXG4gIGlmIChhID09PSBvdXQpIHtcbiAgICBvdXRbMTJdID0gYVswXSAqIHggKyBhWzRdICogeSArIGFbOF0gKiB6ICsgYVsxMl07XG4gICAgb3V0WzEzXSA9IGFbMV0gKiB4ICsgYVs1XSAqIHkgKyBhWzldICogeiArIGFbMTNdO1xuICAgIG91dFsxNF0gPSBhWzJdICogeCArIGFbNl0gKiB5ICsgYVsxMF0gKiB6ICsgYVsxNF07XG4gICAgb3V0WzE1XSA9IGFbM10gKiB4ICsgYVs3XSAqIHkgKyBhWzExXSAqIHogKyBhWzE1XTtcbiAgfSBlbHNlIHtcbiAgICBhMDAgPSBhWzBdO1xuICAgIGEwMSA9IGFbMV07XG4gICAgYTAyID0gYVsyXTtcbiAgICBhMDMgPSBhWzNdO1xuICAgIGExMCA9IGFbNF07XG4gICAgYTExID0gYVs1XTtcbiAgICBhMTIgPSBhWzZdO1xuICAgIGExMyA9IGFbN107XG4gICAgYTIwID0gYVs4XTtcbiAgICBhMjEgPSBhWzldO1xuICAgIGEyMiA9IGFbMTBdO1xuICAgIGEyMyA9IGFbMTFdO1xuICAgIG91dFswXSA9IGEwMDtcbiAgICBvdXRbMV0gPSBhMDE7XG4gICAgb3V0WzJdID0gYTAyO1xuICAgIG91dFszXSA9IGEwMztcbiAgICBvdXRbNF0gPSBhMTA7XG4gICAgb3V0WzVdID0gYTExO1xuICAgIG91dFs2XSA9IGExMjtcbiAgICBvdXRbN10gPSBhMTM7XG4gICAgb3V0WzhdID0gYTIwO1xuICAgIG91dFs5XSA9IGEyMTtcbiAgICBvdXRbMTBdID0gYTIyO1xuICAgIG91dFsxMV0gPSBhMjM7XG4gICAgb3V0WzEyXSA9IGEwMCAqIHggKyBhMTAgKiB5ICsgYTIwICogeiArIGFbMTJdO1xuICAgIG91dFsxM10gPSBhMDEgKiB4ICsgYTExICogeSArIGEyMSAqIHogKyBhWzEzXTtcbiAgICBvdXRbMTRdID0gYTAyICogeCArIGExMiAqIHkgKyBhMjIgKiB6ICsgYVsxNF07XG4gICAgb3V0WzE1XSA9IGEwMyAqIHggKyBhMTMgKiB5ICsgYTIzICogeiArIGFbMTVdO1xuICB9XG5cbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBTY2FsZXMgdGhlIG1hdDQgYnkgdGhlIGRpbWVuc2lvbnMgaW4gdGhlIGdpdmVuIHZlYzMgbm90IHVzaW5nIHZlY3Rvcml6YXRpb25cclxuICpcclxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcclxuICogQHBhcmFtIHttYXQ0fSBhIHRoZSBtYXRyaXggdG8gc2NhbGVcclxuICogQHBhcmFtIHt2ZWMzfSB2IHRoZSB2ZWMzIHRvIHNjYWxlIHRoZSBtYXRyaXggYnlcclxuICogQHJldHVybnMge21hdDR9IG91dFxyXG4gKiovXG5cbmV4cG9ydCBmdW5jdGlvbiBzY2FsZShvdXQsIGEsIHYpIHtcbiAgdmFyIHggPSB2WzBdLFxuICAgICAgeSA9IHZbMV0sXG4gICAgICB6ID0gdlsyXTtcbiAgb3V0WzBdID0gYVswXSAqIHg7XG4gIG91dFsxXSA9IGFbMV0gKiB4O1xuICBvdXRbMl0gPSBhWzJdICogeDtcbiAgb3V0WzNdID0gYVszXSAqIHg7XG4gIG91dFs0XSA9IGFbNF0gKiB5O1xuICBvdXRbNV0gPSBhWzVdICogeTtcbiAgb3V0WzZdID0gYVs2XSAqIHk7XG4gIG91dFs3XSA9IGFbN10gKiB5O1xuICBvdXRbOF0gPSBhWzhdICogejtcbiAgb3V0WzldID0gYVs5XSAqIHo7XG4gIG91dFsxMF0gPSBhWzEwXSAqIHo7XG4gIG91dFsxMV0gPSBhWzExXSAqIHo7XG4gIG91dFsxMl0gPSBhWzEyXTtcbiAgb3V0WzEzXSA9IGFbMTNdO1xuICBvdXRbMTRdID0gYVsxNF07XG4gIG91dFsxNV0gPSBhWzE1XTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBSb3RhdGVzIGEgbWF0NCBieSB0aGUgZ2l2ZW4gYW5nbGUgYXJvdW5kIHRoZSBnaXZlbiBheGlzXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XHJcbiAqIEBwYXJhbSB7bWF0NH0gYSB0aGUgbWF0cml4IHRvIHJvdGF0ZVxyXG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIHRoZSBhbmdsZSB0byByb3RhdGUgdGhlIG1hdHJpeCBieVxyXG4gKiBAcGFyYW0ge3ZlYzN9IGF4aXMgdGhlIGF4aXMgdG8gcm90YXRlIGFyb3VuZFxyXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcm90YXRlKG91dCwgYSwgcmFkLCBheGlzKSB7XG4gIHZhciB4ID0gYXhpc1swXSxcbiAgICAgIHkgPSBheGlzWzFdLFxuICAgICAgeiA9IGF4aXNbMl07XG4gIHZhciBsZW4gPSBNYXRoLnNxcnQoeCAqIHggKyB5ICogeSArIHogKiB6KTtcbiAgdmFyIHMsIGMsIHQ7XG4gIHZhciBhMDAsIGEwMSwgYTAyLCBhMDM7XG4gIHZhciBhMTAsIGExMSwgYTEyLCBhMTM7XG4gIHZhciBhMjAsIGEyMSwgYTIyLCBhMjM7XG4gIHZhciBiMDAsIGIwMSwgYjAyO1xuICB2YXIgYjEwLCBiMTEsIGIxMjtcbiAgdmFyIGIyMCwgYjIxLCBiMjI7XG5cbiAgaWYgKGxlbiA8IGdsTWF0cml4LkVQU0lMT04pIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGxlbiA9IDEgLyBsZW47XG4gIHggKj0gbGVuO1xuICB5ICo9IGxlbjtcbiAgeiAqPSBsZW47XG4gIHMgPSBNYXRoLnNpbihyYWQpO1xuICBjID0gTWF0aC5jb3MocmFkKTtcbiAgdCA9IDEgLSBjO1xuICBhMDAgPSBhWzBdO1xuICBhMDEgPSBhWzFdO1xuICBhMDIgPSBhWzJdO1xuICBhMDMgPSBhWzNdO1xuICBhMTAgPSBhWzRdO1xuICBhMTEgPSBhWzVdO1xuICBhMTIgPSBhWzZdO1xuICBhMTMgPSBhWzddO1xuICBhMjAgPSBhWzhdO1xuICBhMjEgPSBhWzldO1xuICBhMjIgPSBhWzEwXTtcbiAgYTIzID0gYVsxMV07IC8vIENvbnN0cnVjdCB0aGUgZWxlbWVudHMgb2YgdGhlIHJvdGF0aW9uIG1hdHJpeFxuXG4gIGIwMCA9IHggKiB4ICogdCArIGM7XG4gIGIwMSA9IHkgKiB4ICogdCArIHogKiBzO1xuICBiMDIgPSB6ICogeCAqIHQgLSB5ICogcztcbiAgYjEwID0geCAqIHkgKiB0IC0geiAqIHM7XG4gIGIxMSA9IHkgKiB5ICogdCArIGM7XG4gIGIxMiA9IHogKiB5ICogdCArIHggKiBzO1xuICBiMjAgPSB4ICogeiAqIHQgKyB5ICogcztcbiAgYjIxID0geSAqIHogKiB0IC0geCAqIHM7XG4gIGIyMiA9IHogKiB6ICogdCArIGM7IC8vIFBlcmZvcm0gcm90YXRpb24tc3BlY2lmaWMgbWF0cml4IG11bHRpcGxpY2F0aW9uXG5cbiAgb3V0WzBdID0gYTAwICogYjAwICsgYTEwICogYjAxICsgYTIwICogYjAyO1xuICBvdXRbMV0gPSBhMDEgKiBiMDAgKyBhMTEgKiBiMDEgKyBhMjEgKiBiMDI7XG4gIG91dFsyXSA9IGEwMiAqIGIwMCArIGExMiAqIGIwMSArIGEyMiAqIGIwMjtcbiAgb3V0WzNdID0gYTAzICogYjAwICsgYTEzICogYjAxICsgYTIzICogYjAyO1xuICBvdXRbNF0gPSBhMDAgKiBiMTAgKyBhMTAgKiBiMTEgKyBhMjAgKiBiMTI7XG4gIG91dFs1XSA9IGEwMSAqIGIxMCArIGExMSAqIGIxMSArIGEyMSAqIGIxMjtcbiAgb3V0WzZdID0gYTAyICogYjEwICsgYTEyICogYjExICsgYTIyICogYjEyO1xuICBvdXRbN10gPSBhMDMgKiBiMTAgKyBhMTMgKiBiMTEgKyBhMjMgKiBiMTI7XG4gIG91dFs4XSA9IGEwMCAqIGIyMCArIGExMCAqIGIyMSArIGEyMCAqIGIyMjtcbiAgb3V0WzldID0gYTAxICogYjIwICsgYTExICogYjIxICsgYTIxICogYjIyO1xuICBvdXRbMTBdID0gYTAyICogYjIwICsgYTEyICogYjIxICsgYTIyICogYjIyO1xuICBvdXRbMTFdID0gYTAzICogYjIwICsgYTEzICogYjIxICsgYTIzICogYjIyO1xuXG4gIGlmIChhICE9PSBvdXQpIHtcbiAgICAvLyBJZiB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBkaWZmZXIsIGNvcHkgdGhlIHVuY2hhbmdlZCBsYXN0IHJvd1xuICAgIG91dFsxMl0gPSBhWzEyXTtcbiAgICBvdXRbMTNdID0gYVsxM107XG4gICAgb3V0WzE0XSA9IGFbMTRdO1xuICAgIG91dFsxNV0gPSBhWzE1XTtcbiAgfVxuXG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogUm90YXRlcyBhIG1hdHJpeCBieSB0aGUgZ2l2ZW4gYW5nbGUgYXJvdW5kIHRoZSBYIGF4aXNcclxuICpcclxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcclxuICogQHBhcmFtIHttYXQ0fSBhIHRoZSBtYXRyaXggdG8gcm90YXRlXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgdGhlIGFuZ2xlIHRvIHJvdGF0ZSB0aGUgbWF0cml4IGJ5XHJcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiByb3RhdGVYKG91dCwgYSwgcmFkKSB7XG4gIHZhciBzID0gTWF0aC5zaW4ocmFkKTtcbiAgdmFyIGMgPSBNYXRoLmNvcyhyYWQpO1xuICB2YXIgYTEwID0gYVs0XTtcbiAgdmFyIGExMSA9IGFbNV07XG4gIHZhciBhMTIgPSBhWzZdO1xuICB2YXIgYTEzID0gYVs3XTtcbiAgdmFyIGEyMCA9IGFbOF07XG4gIHZhciBhMjEgPSBhWzldO1xuICB2YXIgYTIyID0gYVsxMF07XG4gIHZhciBhMjMgPSBhWzExXTtcblxuICBpZiAoYSAhPT0gb3V0KSB7XG4gICAgLy8gSWYgdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gZGlmZmVyLCBjb3B5IHRoZSB1bmNoYW5nZWQgcm93c1xuICAgIG91dFswXSA9IGFbMF07XG4gICAgb3V0WzFdID0gYVsxXTtcbiAgICBvdXRbMl0gPSBhWzJdO1xuICAgIG91dFszXSA9IGFbM107XG4gICAgb3V0WzEyXSA9IGFbMTJdO1xuICAgIG91dFsxM10gPSBhWzEzXTtcbiAgICBvdXRbMTRdID0gYVsxNF07XG4gICAgb3V0WzE1XSA9IGFbMTVdO1xuICB9IC8vIFBlcmZvcm0gYXhpcy1zcGVjaWZpYyBtYXRyaXggbXVsdGlwbGljYXRpb25cblxuXG4gIG91dFs0XSA9IGExMCAqIGMgKyBhMjAgKiBzO1xuICBvdXRbNV0gPSBhMTEgKiBjICsgYTIxICogcztcbiAgb3V0WzZdID0gYTEyICogYyArIGEyMiAqIHM7XG4gIG91dFs3XSA9IGExMyAqIGMgKyBhMjMgKiBzO1xuICBvdXRbOF0gPSBhMjAgKiBjIC0gYTEwICogcztcbiAgb3V0WzldID0gYTIxICogYyAtIGExMSAqIHM7XG4gIG91dFsxMF0gPSBhMjIgKiBjIC0gYTEyICogcztcbiAgb3V0WzExXSA9IGEyMyAqIGMgLSBhMTMgKiBzO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFJvdGF0ZXMgYSBtYXRyaXggYnkgdGhlIGdpdmVuIGFuZ2xlIGFyb3VuZCB0aGUgWSBheGlzXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XHJcbiAqIEBwYXJhbSB7bWF0NH0gYSB0aGUgbWF0cml4IHRvIHJvdGF0ZVxyXG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIHRoZSBhbmdsZSB0byByb3RhdGUgdGhlIG1hdHJpeCBieVxyXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcm90YXRlWShvdXQsIGEsIHJhZCkge1xuICB2YXIgcyA9IE1hdGguc2luKHJhZCk7XG4gIHZhciBjID0gTWF0aC5jb3MocmFkKTtcbiAgdmFyIGEwMCA9IGFbMF07XG4gIHZhciBhMDEgPSBhWzFdO1xuICB2YXIgYTAyID0gYVsyXTtcbiAgdmFyIGEwMyA9IGFbM107XG4gIHZhciBhMjAgPSBhWzhdO1xuICB2YXIgYTIxID0gYVs5XTtcbiAgdmFyIGEyMiA9IGFbMTBdO1xuICB2YXIgYTIzID0gYVsxMV07XG5cbiAgaWYgKGEgIT09IG91dCkge1xuICAgIC8vIElmIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGRpZmZlciwgY29weSB0aGUgdW5jaGFuZ2VkIHJvd3NcbiAgICBvdXRbNF0gPSBhWzRdO1xuICAgIG91dFs1XSA9IGFbNV07XG4gICAgb3V0WzZdID0gYVs2XTtcbiAgICBvdXRbN10gPSBhWzddO1xuICAgIG91dFsxMl0gPSBhWzEyXTtcbiAgICBvdXRbMTNdID0gYVsxM107XG4gICAgb3V0WzE0XSA9IGFbMTRdO1xuICAgIG91dFsxNV0gPSBhWzE1XTtcbiAgfSAvLyBQZXJmb3JtIGF4aXMtc3BlY2lmaWMgbWF0cml4IG11bHRpcGxpY2F0aW9uXG5cblxuICBvdXRbMF0gPSBhMDAgKiBjIC0gYTIwICogcztcbiAgb3V0WzFdID0gYTAxICogYyAtIGEyMSAqIHM7XG4gIG91dFsyXSA9IGEwMiAqIGMgLSBhMjIgKiBzO1xuICBvdXRbM10gPSBhMDMgKiBjIC0gYTIzICogcztcbiAgb3V0WzhdID0gYTAwICogcyArIGEyMCAqIGM7XG4gIG91dFs5XSA9IGEwMSAqIHMgKyBhMjEgKiBjO1xuICBvdXRbMTBdID0gYTAyICogcyArIGEyMiAqIGM7XG4gIG91dFsxMV0gPSBhMDMgKiBzICsgYTIzICogYztcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBSb3RhdGVzIGEgbWF0cml4IGJ5IHRoZSBnaXZlbiBhbmdsZSBhcm91bmQgdGhlIFogYXhpc1xyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxyXG4gKiBAcGFyYW0ge21hdDR9IGEgdGhlIG1hdHJpeCB0byByb3RhdGVcclxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCB0aGUgYW5nbGUgdG8gcm90YXRlIHRoZSBtYXRyaXggYnlcclxuICogQHJldHVybnMge21hdDR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJvdGF0ZVoob3V0LCBhLCByYWQpIHtcbiAgdmFyIHMgPSBNYXRoLnNpbihyYWQpO1xuICB2YXIgYyA9IE1hdGguY29zKHJhZCk7XG4gIHZhciBhMDAgPSBhWzBdO1xuICB2YXIgYTAxID0gYVsxXTtcbiAgdmFyIGEwMiA9IGFbMl07XG4gIHZhciBhMDMgPSBhWzNdO1xuICB2YXIgYTEwID0gYVs0XTtcbiAgdmFyIGExMSA9IGFbNV07XG4gIHZhciBhMTIgPSBhWzZdO1xuICB2YXIgYTEzID0gYVs3XTtcblxuICBpZiAoYSAhPT0gb3V0KSB7XG4gICAgLy8gSWYgdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gZGlmZmVyLCBjb3B5IHRoZSB1bmNoYW5nZWQgbGFzdCByb3dcbiAgICBvdXRbOF0gPSBhWzhdO1xuICAgIG91dFs5XSA9IGFbOV07XG4gICAgb3V0WzEwXSA9IGFbMTBdO1xuICAgIG91dFsxMV0gPSBhWzExXTtcbiAgICBvdXRbMTJdID0gYVsxMl07XG4gICAgb3V0WzEzXSA9IGFbMTNdO1xuICAgIG91dFsxNF0gPSBhWzE0XTtcbiAgICBvdXRbMTVdID0gYVsxNV07XG4gIH0gLy8gUGVyZm9ybSBheGlzLXNwZWNpZmljIG1hdHJpeCBtdWx0aXBsaWNhdGlvblxuXG5cbiAgb3V0WzBdID0gYTAwICogYyArIGExMCAqIHM7XG4gIG91dFsxXSA9IGEwMSAqIGMgKyBhMTEgKiBzO1xuICBvdXRbMl0gPSBhMDIgKiBjICsgYTEyICogcztcbiAgb3V0WzNdID0gYTAzICogYyArIGExMyAqIHM7XG4gIG91dFs0XSA9IGExMCAqIGMgLSBhMDAgKiBzO1xuICBvdXRbNV0gPSBhMTEgKiBjIC0gYTAxICogcztcbiAgb3V0WzZdID0gYTEyICogYyAtIGEwMiAqIHM7XG4gIG91dFs3XSA9IGExMyAqIGMgLSBhMDMgKiBzO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENyZWF0ZXMgYSBtYXRyaXggZnJvbSBhIHZlY3RvciB0cmFuc2xhdGlvblxyXG4gKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gKGJ1dCBtdWNoIGZhc3RlciB0aGFuKTpcclxuICpcclxuICogICAgIG1hdDQuaWRlbnRpdHkoZGVzdCk7XHJcbiAqICAgICBtYXQ0LnRyYW5zbGF0ZShkZXN0LCBkZXN0LCB2ZWMpO1xyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDR9IG91dCBtYXQ0IHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XHJcbiAqIEBwYXJhbSB7dmVjM30gdiBUcmFuc2xhdGlvbiB2ZWN0b3JcclxuICogQHJldHVybnMge21hdDR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21UcmFuc2xhdGlvbihvdXQsIHYpIHtcbiAgb3V0WzBdID0gMTtcbiAgb3V0WzFdID0gMDtcbiAgb3V0WzJdID0gMDtcbiAgb3V0WzNdID0gMDtcbiAgb3V0WzRdID0gMDtcbiAgb3V0WzVdID0gMTtcbiAgb3V0WzZdID0gMDtcbiAgb3V0WzddID0gMDtcbiAgb3V0WzhdID0gMDtcbiAgb3V0WzldID0gMDtcbiAgb3V0WzEwXSA9IDE7XG4gIG91dFsxMV0gPSAwO1xuICBvdXRbMTJdID0gdlswXTtcbiAgb3V0WzEzXSA9IHZbMV07XG4gIG91dFsxNF0gPSB2WzJdO1xuICBvdXRbMTVdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDcmVhdGVzIGEgbWF0cml4IGZyb20gYSB2ZWN0b3Igc2NhbGluZ1xyXG4gKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gKGJ1dCBtdWNoIGZhc3RlciB0aGFuKTpcclxuICpcclxuICogICAgIG1hdDQuaWRlbnRpdHkoZGVzdCk7XHJcbiAqICAgICBtYXQ0LnNjYWxlKGRlc3QsIGRlc3QsIHZlYyk7XHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IG1hdDQgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcclxuICogQHBhcmFtIHt2ZWMzfSB2IFNjYWxpbmcgdmVjdG9yXHJcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tU2NhbGluZyhvdXQsIHYpIHtcbiAgb3V0WzBdID0gdlswXTtcbiAgb3V0WzFdID0gMDtcbiAgb3V0WzJdID0gMDtcbiAgb3V0WzNdID0gMDtcbiAgb3V0WzRdID0gMDtcbiAgb3V0WzVdID0gdlsxXTtcbiAgb3V0WzZdID0gMDtcbiAgb3V0WzddID0gMDtcbiAgb3V0WzhdID0gMDtcbiAgb3V0WzldID0gMDtcbiAgb3V0WzEwXSA9IHZbMl07XG4gIG91dFsxMV0gPSAwO1xuICBvdXRbMTJdID0gMDtcbiAgb3V0WzEzXSA9IDA7XG4gIG91dFsxNF0gPSAwO1xuICBvdXRbMTVdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDcmVhdGVzIGEgbWF0cml4IGZyb20gYSBnaXZlbiBhbmdsZSBhcm91bmQgYSBnaXZlbiBheGlzXHJcbiAqIFRoaXMgaXMgZXF1aXZhbGVudCB0byAoYnV0IG11Y2ggZmFzdGVyIHRoYW4pOlxyXG4gKlxyXG4gKiAgICAgbWF0NC5pZGVudGl0eShkZXN0KTtcclxuICogICAgIG1hdDQucm90YXRlKGRlc3QsIGRlc3QsIHJhZCwgYXhpcyk7XHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IG1hdDQgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCB0aGUgYW5nbGUgdG8gcm90YXRlIHRoZSBtYXRyaXggYnlcclxuICogQHBhcmFtIHt2ZWMzfSBheGlzIHRoZSBheGlzIHRvIHJvdGF0ZSBhcm91bmRcclxuICogQHJldHVybnMge21hdDR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21Sb3RhdGlvbihvdXQsIHJhZCwgYXhpcykge1xuICB2YXIgeCA9IGF4aXNbMF0sXG4gICAgICB5ID0gYXhpc1sxXSxcbiAgICAgIHogPSBheGlzWzJdO1xuICB2YXIgbGVuID0gTWF0aC5zcXJ0KHggKiB4ICsgeSAqIHkgKyB6ICogeik7XG4gIHZhciBzLCBjLCB0O1xuXG4gIGlmIChsZW4gPCBnbE1hdHJpeC5FUFNJTE9OKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBsZW4gPSAxIC8gbGVuO1xuICB4ICo9IGxlbjtcbiAgeSAqPSBsZW47XG4gIHogKj0gbGVuO1xuICBzID0gTWF0aC5zaW4ocmFkKTtcbiAgYyA9IE1hdGguY29zKHJhZCk7XG4gIHQgPSAxIC0gYzsgLy8gUGVyZm9ybSByb3RhdGlvbi1zcGVjaWZpYyBtYXRyaXggbXVsdGlwbGljYXRpb25cblxuICBvdXRbMF0gPSB4ICogeCAqIHQgKyBjO1xuICBvdXRbMV0gPSB5ICogeCAqIHQgKyB6ICogcztcbiAgb3V0WzJdID0geiAqIHggKiB0IC0geSAqIHM7XG4gIG91dFszXSA9IDA7XG4gIG91dFs0XSA9IHggKiB5ICogdCAtIHogKiBzO1xuICBvdXRbNV0gPSB5ICogeSAqIHQgKyBjO1xuICBvdXRbNl0gPSB6ICogeSAqIHQgKyB4ICogcztcbiAgb3V0WzddID0gMDtcbiAgb3V0WzhdID0geCAqIHogKiB0ICsgeSAqIHM7XG4gIG91dFs5XSA9IHkgKiB6ICogdCAtIHggKiBzO1xuICBvdXRbMTBdID0geiAqIHogKiB0ICsgYztcbiAgb3V0WzExXSA9IDA7XG4gIG91dFsxMl0gPSAwO1xuICBvdXRbMTNdID0gMDtcbiAgb3V0WzE0XSA9IDA7XG4gIG91dFsxNV0gPSAxO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENyZWF0ZXMgYSBtYXRyaXggZnJvbSB0aGUgZ2l2ZW4gYW5nbGUgYXJvdW5kIHRoZSBYIGF4aXNcclxuICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIChidXQgbXVjaCBmYXN0ZXIgdGhhbik6XHJcbiAqXHJcbiAqICAgICBtYXQ0LmlkZW50aXR5KGRlc3QpO1xyXG4gKiAgICAgbWF0NC5yb3RhdGVYKGRlc3QsIGRlc3QsIHJhZCk7XHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IG1hdDQgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCB0aGUgYW5nbGUgdG8gcm90YXRlIHRoZSBtYXRyaXggYnlcclxuICogQHJldHVybnMge21hdDR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21YUm90YXRpb24ob3V0LCByYWQpIHtcbiAgdmFyIHMgPSBNYXRoLnNpbihyYWQpO1xuICB2YXIgYyA9IE1hdGguY29zKHJhZCk7IC8vIFBlcmZvcm0gYXhpcy1zcGVjaWZpYyBtYXRyaXggbXVsdGlwbGljYXRpb25cblxuICBvdXRbMF0gPSAxO1xuICBvdXRbMV0gPSAwO1xuICBvdXRbMl0gPSAwO1xuICBvdXRbM10gPSAwO1xuICBvdXRbNF0gPSAwO1xuICBvdXRbNV0gPSBjO1xuICBvdXRbNl0gPSBzO1xuICBvdXRbN10gPSAwO1xuICBvdXRbOF0gPSAwO1xuICBvdXRbOV0gPSAtcztcbiAgb3V0WzEwXSA9IGM7XG4gIG91dFsxMV0gPSAwO1xuICBvdXRbMTJdID0gMDtcbiAgb3V0WzEzXSA9IDA7XG4gIG91dFsxNF0gPSAwO1xuICBvdXRbMTVdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDcmVhdGVzIGEgbWF0cml4IGZyb20gdGhlIGdpdmVuIGFuZ2xlIGFyb3VuZCB0aGUgWSBheGlzXHJcbiAqIFRoaXMgaXMgZXF1aXZhbGVudCB0byAoYnV0IG11Y2ggZmFzdGVyIHRoYW4pOlxyXG4gKlxyXG4gKiAgICAgbWF0NC5pZGVudGl0eShkZXN0KTtcclxuICogICAgIG1hdDQucm90YXRlWShkZXN0LCBkZXN0LCByYWQpO1xyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDR9IG91dCBtYXQ0IHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XHJcbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgdGhlIGFuZ2xlIHRvIHJvdGF0ZSB0aGUgbWF0cml4IGJ5XHJcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tWVJvdGF0aW9uKG91dCwgcmFkKSB7XG4gIHZhciBzID0gTWF0aC5zaW4ocmFkKTtcbiAgdmFyIGMgPSBNYXRoLmNvcyhyYWQpOyAvLyBQZXJmb3JtIGF4aXMtc3BlY2lmaWMgbWF0cml4IG11bHRpcGxpY2F0aW9uXG5cbiAgb3V0WzBdID0gYztcbiAgb3V0WzFdID0gMDtcbiAgb3V0WzJdID0gLXM7XG4gIG91dFszXSA9IDA7XG4gIG91dFs0XSA9IDA7XG4gIG91dFs1XSA9IDE7XG4gIG91dFs2XSA9IDA7XG4gIG91dFs3XSA9IDA7XG4gIG91dFs4XSA9IHM7XG4gIG91dFs5XSA9IDA7XG4gIG91dFsxMF0gPSBjO1xuICBvdXRbMTFdID0gMDtcbiAgb3V0WzEyXSA9IDA7XG4gIG91dFsxM10gPSAwO1xuICBvdXRbMTRdID0gMDtcbiAgb3V0WzE1XSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ3JlYXRlcyBhIG1hdHJpeCBmcm9tIHRoZSBnaXZlbiBhbmdsZSBhcm91bmQgdGhlIFogYXhpc1xyXG4gKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gKGJ1dCBtdWNoIGZhc3RlciB0aGFuKTpcclxuICpcclxuICogICAgIG1hdDQuaWRlbnRpdHkoZGVzdCk7XHJcbiAqICAgICBtYXQ0LnJvdGF0ZVooZGVzdCwgZGVzdCwgcmFkKTtcclxuICpcclxuICogQHBhcmFtIHttYXQ0fSBvdXQgbWF0NCByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxyXG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIHRoZSBhbmdsZSB0byByb3RhdGUgdGhlIG1hdHJpeCBieVxyXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVpSb3RhdGlvbihvdXQsIHJhZCkge1xuICB2YXIgcyA9IE1hdGguc2luKHJhZCk7XG4gIHZhciBjID0gTWF0aC5jb3MocmFkKTsgLy8gUGVyZm9ybSBheGlzLXNwZWNpZmljIG1hdHJpeCBtdWx0aXBsaWNhdGlvblxuXG4gIG91dFswXSA9IGM7XG4gIG91dFsxXSA9IHM7XG4gIG91dFsyXSA9IDA7XG4gIG91dFszXSA9IDA7XG4gIG91dFs0XSA9IC1zO1xuICBvdXRbNV0gPSBjO1xuICBvdXRbNl0gPSAwO1xuICBvdXRbN10gPSAwO1xuICBvdXRbOF0gPSAwO1xuICBvdXRbOV0gPSAwO1xuICBvdXRbMTBdID0gMTtcbiAgb3V0WzExXSA9IDA7XG4gIG91dFsxMl0gPSAwO1xuICBvdXRbMTNdID0gMDtcbiAgb3V0WzE0XSA9IDA7XG4gIG91dFsxNV0gPSAxO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENyZWF0ZXMgYSBtYXRyaXggZnJvbSBhIHF1YXRlcm5pb24gcm90YXRpb24gYW5kIHZlY3RvciB0cmFuc2xhdGlvblxyXG4gKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gKGJ1dCBtdWNoIGZhc3RlciB0aGFuKTpcclxuICpcclxuICogICAgIG1hdDQuaWRlbnRpdHkoZGVzdCk7XHJcbiAqICAgICBtYXQ0LnRyYW5zbGF0ZShkZXN0LCB2ZWMpO1xyXG4gKiAgICAgbGV0IHF1YXRNYXQgPSBtYXQ0LmNyZWF0ZSgpO1xyXG4gKiAgICAgcXVhdDQudG9NYXQ0KHF1YXQsIHF1YXRNYXQpO1xyXG4gKiAgICAgbWF0NC5tdWx0aXBseShkZXN0LCBxdWF0TWF0KTtcclxuICpcclxuICogQHBhcmFtIHttYXQ0fSBvdXQgbWF0NCByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxyXG4gKiBAcGFyYW0ge3F1YXQ0fSBxIFJvdGF0aW9uIHF1YXRlcm5pb25cclxuICogQHBhcmFtIHt2ZWMzfSB2IFRyYW5zbGF0aW9uIHZlY3RvclxyXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVJvdGF0aW9uVHJhbnNsYXRpb24ob3V0LCBxLCB2KSB7XG4gIC8vIFF1YXRlcm5pb24gbWF0aFxuICB2YXIgeCA9IHFbMF0sXG4gICAgICB5ID0gcVsxXSxcbiAgICAgIHogPSBxWzJdLFxuICAgICAgdyA9IHFbM107XG4gIHZhciB4MiA9IHggKyB4O1xuICB2YXIgeTIgPSB5ICsgeTtcbiAgdmFyIHoyID0geiArIHo7XG4gIHZhciB4eCA9IHggKiB4MjtcbiAgdmFyIHh5ID0geCAqIHkyO1xuICB2YXIgeHogPSB4ICogejI7XG4gIHZhciB5eSA9IHkgKiB5MjtcbiAgdmFyIHl6ID0geSAqIHoyO1xuICB2YXIgenogPSB6ICogejI7XG4gIHZhciB3eCA9IHcgKiB4MjtcbiAgdmFyIHd5ID0gdyAqIHkyO1xuICB2YXIgd3ogPSB3ICogejI7XG4gIG91dFswXSA9IDEgLSAoeXkgKyB6eik7XG4gIG91dFsxXSA9IHh5ICsgd3o7XG4gIG91dFsyXSA9IHh6IC0gd3k7XG4gIG91dFszXSA9IDA7XG4gIG91dFs0XSA9IHh5IC0gd3o7XG4gIG91dFs1XSA9IDEgLSAoeHggKyB6eik7XG4gIG91dFs2XSA9IHl6ICsgd3g7XG4gIG91dFs3XSA9IDA7XG4gIG91dFs4XSA9IHh6ICsgd3k7XG4gIG91dFs5XSA9IHl6IC0gd3g7XG4gIG91dFsxMF0gPSAxIC0gKHh4ICsgeXkpO1xuICBvdXRbMTFdID0gMDtcbiAgb3V0WzEyXSA9IHZbMF07XG4gIG91dFsxM10gPSB2WzFdO1xuICBvdXRbMTRdID0gdlsyXTtcbiAgb3V0WzE1XSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ3JlYXRlcyBhIG5ldyBtYXQ0IGZyb20gYSBkdWFsIHF1YXQuXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IE1hdHJpeFxyXG4gKiBAcGFyYW0ge3F1YXQyfSBhIER1YWwgUXVhdGVybmlvblxyXG4gKiBAcmV0dXJucyB7bWF0NH0gbWF0NCByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21RdWF0MihvdXQsIGEpIHtcbiAgdmFyIHRyYW5zbGF0aW9uID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoMyk7XG4gIHZhciBieCA9IC1hWzBdLFxuICAgICAgYnkgPSAtYVsxXSxcbiAgICAgIGJ6ID0gLWFbMl0sXG4gICAgICBidyA9IGFbM10sXG4gICAgICBheCA9IGFbNF0sXG4gICAgICBheSA9IGFbNV0sXG4gICAgICBheiA9IGFbNl0sXG4gICAgICBhdyA9IGFbN107XG4gIHZhciBtYWduaXR1ZGUgPSBieCAqIGJ4ICsgYnkgKiBieSArIGJ6ICogYnogKyBidyAqIGJ3OyAvL09ubHkgc2NhbGUgaWYgaXQgbWFrZXMgc2Vuc2VcblxuICBpZiAobWFnbml0dWRlID4gMCkge1xuICAgIHRyYW5zbGF0aW9uWzBdID0gKGF4ICogYncgKyBhdyAqIGJ4ICsgYXkgKiBieiAtIGF6ICogYnkpICogMiAvIG1hZ25pdHVkZTtcbiAgICB0cmFuc2xhdGlvblsxXSA9IChheSAqIGJ3ICsgYXcgKiBieSArIGF6ICogYnggLSBheCAqIGJ6KSAqIDIgLyBtYWduaXR1ZGU7XG4gICAgdHJhbnNsYXRpb25bMl0gPSAoYXogKiBidyArIGF3ICogYnogKyBheCAqIGJ5IC0gYXkgKiBieCkgKiAyIC8gbWFnbml0dWRlO1xuICB9IGVsc2Uge1xuICAgIHRyYW5zbGF0aW9uWzBdID0gKGF4ICogYncgKyBhdyAqIGJ4ICsgYXkgKiBieiAtIGF6ICogYnkpICogMjtcbiAgICB0cmFuc2xhdGlvblsxXSA9IChheSAqIGJ3ICsgYXcgKiBieSArIGF6ICogYnggLSBheCAqIGJ6KSAqIDI7XG4gICAgdHJhbnNsYXRpb25bMl0gPSAoYXogKiBidyArIGF3ICogYnogKyBheCAqIGJ5IC0gYXkgKiBieCkgKiAyO1xuICB9XG5cbiAgZnJvbVJvdGF0aW9uVHJhbnNsYXRpb24ob3V0LCBhLCB0cmFuc2xhdGlvbik7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogUmV0dXJucyB0aGUgdHJhbnNsYXRpb24gdmVjdG9yIGNvbXBvbmVudCBvZiBhIHRyYW5zZm9ybWF0aW9uXHJcbiAqICBtYXRyaXguIElmIGEgbWF0cml4IGlzIGJ1aWx0IHdpdGggZnJvbVJvdGF0aW9uVHJhbnNsYXRpb24sXHJcbiAqICB0aGUgcmV0dXJuZWQgdmVjdG9yIHdpbGwgYmUgdGhlIHNhbWUgYXMgdGhlIHRyYW5zbGF0aW9uIHZlY3RvclxyXG4gKiAgb3JpZ2luYWxseSBzdXBwbGllZC5cclxuICogQHBhcmFtICB7dmVjM30gb3V0IFZlY3RvciB0byByZWNlaXZlIHRyYW5zbGF0aW9uIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0gIHttYXQ0fSBtYXQgTWF0cml4IHRvIGJlIGRlY29tcG9zZWQgKGlucHV0KVxyXG4gKiBAcmV0dXJuIHt2ZWMzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUcmFuc2xhdGlvbihvdXQsIG1hdCkge1xuICBvdXRbMF0gPSBtYXRbMTJdO1xuICBvdXRbMV0gPSBtYXRbMTNdO1xuICBvdXRbMl0gPSBtYXRbMTRdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFJldHVybnMgdGhlIHNjYWxpbmcgZmFjdG9yIGNvbXBvbmVudCBvZiBhIHRyYW5zZm9ybWF0aW9uXHJcbiAqICBtYXRyaXguIElmIGEgbWF0cml4IGlzIGJ1aWx0IHdpdGggZnJvbVJvdGF0aW9uVHJhbnNsYXRpb25TY2FsZVxyXG4gKiAgd2l0aCBhIG5vcm1hbGl6ZWQgUXVhdGVybmlvbiBwYXJhbXRlciwgdGhlIHJldHVybmVkIHZlY3RvciB3aWxsIGJlXHJcbiAqICB0aGUgc2FtZSBhcyB0aGUgc2NhbGluZyB2ZWN0b3JcclxuICogIG9yaWdpbmFsbHkgc3VwcGxpZWQuXHJcbiAqIEBwYXJhbSAge3ZlYzN9IG91dCBWZWN0b3IgdG8gcmVjZWl2ZSBzY2FsaW5nIGZhY3RvciBjb21wb25lbnRcclxuICogQHBhcmFtICB7bWF0NH0gbWF0IE1hdHJpeCB0byBiZSBkZWNvbXBvc2VkIChpbnB1dClcclxuICogQHJldHVybiB7dmVjM30gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2NhbGluZyhvdXQsIG1hdCkge1xuICB2YXIgbTExID0gbWF0WzBdO1xuICB2YXIgbTEyID0gbWF0WzFdO1xuICB2YXIgbTEzID0gbWF0WzJdO1xuICB2YXIgbTIxID0gbWF0WzRdO1xuICB2YXIgbTIyID0gbWF0WzVdO1xuICB2YXIgbTIzID0gbWF0WzZdO1xuICB2YXIgbTMxID0gbWF0WzhdO1xuICB2YXIgbTMyID0gbWF0WzldO1xuICB2YXIgbTMzID0gbWF0WzEwXTtcbiAgb3V0WzBdID0gTWF0aC5zcXJ0KG0xMSAqIG0xMSArIG0xMiAqIG0xMiArIG0xMyAqIG0xMyk7XG4gIG91dFsxXSA9IE1hdGguc3FydChtMjEgKiBtMjEgKyBtMjIgKiBtMjIgKyBtMjMgKiBtMjMpO1xuICBvdXRbMl0gPSBNYXRoLnNxcnQobTMxICogbTMxICsgbTMyICogbTMyICsgbTMzICogbTMzKTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIGEgcXVhdGVybmlvbiByZXByZXNlbnRpbmcgdGhlIHJvdGF0aW9uYWwgY29tcG9uZW50XHJcbiAqICBvZiBhIHRyYW5zZm9ybWF0aW9uIG1hdHJpeC4gSWYgYSBtYXRyaXggaXMgYnVpbHQgd2l0aFxyXG4gKiAgZnJvbVJvdGF0aW9uVHJhbnNsYXRpb24sIHRoZSByZXR1cm5lZCBxdWF0ZXJuaW9uIHdpbGwgYmUgdGhlXHJcbiAqICBzYW1lIGFzIHRoZSBxdWF0ZXJuaW9uIG9yaWdpbmFsbHkgc3VwcGxpZWQuXHJcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IFF1YXRlcm5pb24gdG8gcmVjZWl2ZSB0aGUgcm90YXRpb24gY29tcG9uZW50XHJcbiAqIEBwYXJhbSB7bWF0NH0gbWF0IE1hdHJpeCB0byBiZSBkZWNvbXBvc2VkIChpbnB1dClcclxuICogQHJldHVybiB7cXVhdH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Um90YXRpb24ob3V0LCBtYXQpIHtcbiAgLy8gQWxnb3JpdGhtIHRha2VuIGZyb20gaHR0cDovL3d3dy5ldWNsaWRlYW5zcGFjZS5jb20vbWF0aHMvZ2VvbWV0cnkvcm90YXRpb25zL2NvbnZlcnNpb25zL21hdHJpeFRvUXVhdGVybmlvbi9pbmRleC5odG1cbiAgdmFyIHRyYWNlID0gbWF0WzBdICsgbWF0WzVdICsgbWF0WzEwXTtcbiAgdmFyIFMgPSAwO1xuXG4gIGlmICh0cmFjZSA+IDApIHtcbiAgICBTID0gTWF0aC5zcXJ0KHRyYWNlICsgMS4wKSAqIDI7XG4gICAgb3V0WzNdID0gMC4yNSAqIFM7XG4gICAgb3V0WzBdID0gKG1hdFs2XSAtIG1hdFs5XSkgLyBTO1xuICAgIG91dFsxXSA9IChtYXRbOF0gLSBtYXRbMl0pIC8gUztcbiAgICBvdXRbMl0gPSAobWF0WzFdIC0gbWF0WzRdKSAvIFM7XG4gIH0gZWxzZSBpZiAobWF0WzBdID4gbWF0WzVdICYmIG1hdFswXSA+IG1hdFsxMF0pIHtcbiAgICBTID0gTWF0aC5zcXJ0KDEuMCArIG1hdFswXSAtIG1hdFs1XSAtIG1hdFsxMF0pICogMjtcbiAgICBvdXRbM10gPSAobWF0WzZdIC0gbWF0WzldKSAvIFM7XG4gICAgb3V0WzBdID0gMC4yNSAqIFM7XG4gICAgb3V0WzFdID0gKG1hdFsxXSArIG1hdFs0XSkgLyBTO1xuICAgIG91dFsyXSA9IChtYXRbOF0gKyBtYXRbMl0pIC8gUztcbiAgfSBlbHNlIGlmIChtYXRbNV0gPiBtYXRbMTBdKSB7XG4gICAgUyA9IE1hdGguc3FydCgxLjAgKyBtYXRbNV0gLSBtYXRbMF0gLSBtYXRbMTBdKSAqIDI7XG4gICAgb3V0WzNdID0gKG1hdFs4XSAtIG1hdFsyXSkgLyBTO1xuICAgIG91dFswXSA9IChtYXRbMV0gKyBtYXRbNF0pIC8gUztcbiAgICBvdXRbMV0gPSAwLjI1ICogUztcbiAgICBvdXRbMl0gPSAobWF0WzZdICsgbWF0WzldKSAvIFM7XG4gIH0gZWxzZSB7XG4gICAgUyA9IE1hdGguc3FydCgxLjAgKyBtYXRbMTBdIC0gbWF0WzBdIC0gbWF0WzVdKSAqIDI7XG4gICAgb3V0WzNdID0gKG1hdFsxXSAtIG1hdFs0XSkgLyBTO1xuICAgIG91dFswXSA9IChtYXRbOF0gKyBtYXRbMl0pIC8gUztcbiAgICBvdXRbMV0gPSAobWF0WzZdICsgbWF0WzldKSAvIFM7XG4gICAgb3V0WzJdID0gMC4yNSAqIFM7XG4gIH1cblxuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENyZWF0ZXMgYSBtYXRyaXggZnJvbSBhIHF1YXRlcm5pb24gcm90YXRpb24sIHZlY3RvciB0cmFuc2xhdGlvbiBhbmQgdmVjdG9yIHNjYWxlXHJcbiAqIFRoaXMgaXMgZXF1aXZhbGVudCB0byAoYnV0IG11Y2ggZmFzdGVyIHRoYW4pOlxyXG4gKlxyXG4gKiAgICAgbWF0NC5pZGVudGl0eShkZXN0KTtcclxuICogICAgIG1hdDQudHJhbnNsYXRlKGRlc3QsIHZlYyk7XHJcbiAqICAgICBsZXQgcXVhdE1hdCA9IG1hdDQuY3JlYXRlKCk7XHJcbiAqICAgICBxdWF0NC50b01hdDQocXVhdCwgcXVhdE1hdCk7XHJcbiAqICAgICBtYXQ0Lm11bHRpcGx5KGRlc3QsIHF1YXRNYXQpO1xyXG4gKiAgICAgbWF0NC5zY2FsZShkZXN0LCBzY2FsZSlcclxuICpcclxuICogQHBhcmFtIHttYXQ0fSBvdXQgbWF0NCByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxyXG4gKiBAcGFyYW0ge3F1YXQ0fSBxIFJvdGF0aW9uIHF1YXRlcm5pb25cclxuICogQHBhcmFtIHt2ZWMzfSB2IFRyYW5zbGF0aW9uIHZlY3RvclxyXG4gKiBAcGFyYW0ge3ZlYzN9IHMgU2NhbGluZyB2ZWN0b3JcclxuICogQHJldHVybnMge21hdDR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21Sb3RhdGlvblRyYW5zbGF0aW9uU2NhbGUob3V0LCBxLCB2LCBzKSB7XG4gIC8vIFF1YXRlcm5pb24gbWF0aFxuICB2YXIgeCA9IHFbMF0sXG4gICAgICB5ID0gcVsxXSxcbiAgICAgIHogPSBxWzJdLFxuICAgICAgdyA9IHFbM107XG4gIHZhciB4MiA9IHggKyB4O1xuICB2YXIgeTIgPSB5ICsgeTtcbiAgdmFyIHoyID0geiArIHo7XG4gIHZhciB4eCA9IHggKiB4MjtcbiAgdmFyIHh5ID0geCAqIHkyO1xuICB2YXIgeHogPSB4ICogejI7XG4gIHZhciB5eSA9IHkgKiB5MjtcbiAgdmFyIHl6ID0geSAqIHoyO1xuICB2YXIgenogPSB6ICogejI7XG4gIHZhciB3eCA9IHcgKiB4MjtcbiAgdmFyIHd5ID0gdyAqIHkyO1xuICB2YXIgd3ogPSB3ICogejI7XG4gIHZhciBzeCA9IHNbMF07XG4gIHZhciBzeSA9IHNbMV07XG4gIHZhciBzeiA9IHNbMl07XG4gIG91dFswXSA9ICgxIC0gKHl5ICsgenopKSAqIHN4O1xuICBvdXRbMV0gPSAoeHkgKyB3eikgKiBzeDtcbiAgb3V0WzJdID0gKHh6IC0gd3kpICogc3g7XG4gIG91dFszXSA9IDA7XG4gIG91dFs0XSA9ICh4eSAtIHd6KSAqIHN5O1xuICBvdXRbNV0gPSAoMSAtICh4eCArIHp6KSkgKiBzeTtcbiAgb3V0WzZdID0gKHl6ICsgd3gpICogc3k7XG4gIG91dFs3XSA9IDA7XG4gIG91dFs4XSA9ICh4eiArIHd5KSAqIHN6O1xuICBvdXRbOV0gPSAoeXogLSB3eCkgKiBzejtcbiAgb3V0WzEwXSA9ICgxIC0gKHh4ICsgeXkpKSAqIHN6O1xuICBvdXRbMTFdID0gMDtcbiAgb3V0WzEyXSA9IHZbMF07XG4gIG91dFsxM10gPSB2WzFdO1xuICBvdXRbMTRdID0gdlsyXTtcbiAgb3V0WzE1XSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ3JlYXRlcyBhIG1hdHJpeCBmcm9tIGEgcXVhdGVybmlvbiByb3RhdGlvbiwgdmVjdG9yIHRyYW5zbGF0aW9uIGFuZCB2ZWN0b3Igc2NhbGUsIHJvdGF0aW5nIGFuZCBzY2FsaW5nIGFyb3VuZCB0aGUgZ2l2ZW4gb3JpZ2luXHJcbiAqIFRoaXMgaXMgZXF1aXZhbGVudCB0byAoYnV0IG11Y2ggZmFzdGVyIHRoYW4pOlxyXG4gKlxyXG4gKiAgICAgbWF0NC5pZGVudGl0eShkZXN0KTtcclxuICogICAgIG1hdDQudHJhbnNsYXRlKGRlc3QsIHZlYyk7XHJcbiAqICAgICBtYXQ0LnRyYW5zbGF0ZShkZXN0LCBvcmlnaW4pO1xyXG4gKiAgICAgbGV0IHF1YXRNYXQgPSBtYXQ0LmNyZWF0ZSgpO1xyXG4gKiAgICAgcXVhdDQudG9NYXQ0KHF1YXQsIHF1YXRNYXQpO1xyXG4gKiAgICAgbWF0NC5tdWx0aXBseShkZXN0LCBxdWF0TWF0KTtcclxuICogICAgIG1hdDQuc2NhbGUoZGVzdCwgc2NhbGUpXHJcbiAqICAgICBtYXQ0LnRyYW5zbGF0ZShkZXN0LCBuZWdhdGl2ZU9yaWdpbik7XHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IG1hdDQgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcclxuICogQHBhcmFtIHtxdWF0NH0gcSBSb3RhdGlvbiBxdWF0ZXJuaW9uXHJcbiAqIEBwYXJhbSB7dmVjM30gdiBUcmFuc2xhdGlvbiB2ZWN0b3JcclxuICogQHBhcmFtIHt2ZWMzfSBzIFNjYWxpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7dmVjM30gbyBUaGUgb3JpZ2luIHZlY3RvciBhcm91bmQgd2hpY2ggdG8gc2NhbGUgYW5kIHJvdGF0ZVxyXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVJvdGF0aW9uVHJhbnNsYXRpb25TY2FsZU9yaWdpbihvdXQsIHEsIHYsIHMsIG8pIHtcbiAgLy8gUXVhdGVybmlvbiBtYXRoXG4gIHZhciB4ID0gcVswXSxcbiAgICAgIHkgPSBxWzFdLFxuICAgICAgeiA9IHFbMl0sXG4gICAgICB3ID0gcVszXTtcbiAgdmFyIHgyID0geCArIHg7XG4gIHZhciB5MiA9IHkgKyB5O1xuICB2YXIgejIgPSB6ICsgejtcbiAgdmFyIHh4ID0geCAqIHgyO1xuICB2YXIgeHkgPSB4ICogeTI7XG4gIHZhciB4eiA9IHggKiB6MjtcbiAgdmFyIHl5ID0geSAqIHkyO1xuICB2YXIgeXogPSB5ICogejI7XG4gIHZhciB6eiA9IHogKiB6MjtcbiAgdmFyIHd4ID0gdyAqIHgyO1xuICB2YXIgd3kgPSB3ICogeTI7XG4gIHZhciB3eiA9IHcgKiB6MjtcbiAgdmFyIHN4ID0gc1swXTtcbiAgdmFyIHN5ID0gc1sxXTtcbiAgdmFyIHN6ID0gc1syXTtcbiAgdmFyIG94ID0gb1swXTtcbiAgdmFyIG95ID0gb1sxXTtcbiAgdmFyIG96ID0gb1syXTtcbiAgdmFyIG91dDAgPSAoMSAtICh5eSArIHp6KSkgKiBzeDtcbiAgdmFyIG91dDEgPSAoeHkgKyB3eikgKiBzeDtcbiAgdmFyIG91dDIgPSAoeHogLSB3eSkgKiBzeDtcbiAgdmFyIG91dDQgPSAoeHkgLSB3eikgKiBzeTtcbiAgdmFyIG91dDUgPSAoMSAtICh4eCArIHp6KSkgKiBzeTtcbiAgdmFyIG91dDYgPSAoeXogKyB3eCkgKiBzeTtcbiAgdmFyIG91dDggPSAoeHogKyB3eSkgKiBzejtcbiAgdmFyIG91dDkgPSAoeXogLSB3eCkgKiBzejtcbiAgdmFyIG91dDEwID0gKDEgLSAoeHggKyB5eSkpICogc3o7XG4gIG91dFswXSA9IG91dDA7XG4gIG91dFsxXSA9IG91dDE7XG4gIG91dFsyXSA9IG91dDI7XG4gIG91dFszXSA9IDA7XG4gIG91dFs0XSA9IG91dDQ7XG4gIG91dFs1XSA9IG91dDU7XG4gIG91dFs2XSA9IG91dDY7XG4gIG91dFs3XSA9IDA7XG4gIG91dFs4XSA9IG91dDg7XG4gIG91dFs5XSA9IG91dDk7XG4gIG91dFsxMF0gPSBvdXQxMDtcbiAgb3V0WzExXSA9IDA7XG4gIG91dFsxMl0gPSB2WzBdICsgb3ggLSAob3V0MCAqIG94ICsgb3V0NCAqIG95ICsgb3V0OCAqIG96KTtcbiAgb3V0WzEzXSA9IHZbMV0gKyBveSAtIChvdXQxICogb3ggKyBvdXQ1ICogb3kgKyBvdXQ5ICogb3opO1xuICBvdXRbMTRdID0gdlsyXSArIG96IC0gKG91dDIgKiBveCArIG91dDYgKiBveSArIG91dDEwICogb3opO1xuICBvdXRbMTVdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDYWxjdWxhdGVzIGEgNHg0IG1hdHJpeCBmcm9tIHRoZSBnaXZlbiBxdWF0ZXJuaW9uXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IG1hdDQgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcclxuICogQHBhcmFtIHtxdWF0fSBxIFF1YXRlcm5pb24gdG8gY3JlYXRlIG1hdHJpeCBmcm9tXHJcbiAqXHJcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tUXVhdChvdXQsIHEpIHtcbiAgdmFyIHggPSBxWzBdLFxuICAgICAgeSA9IHFbMV0sXG4gICAgICB6ID0gcVsyXSxcbiAgICAgIHcgPSBxWzNdO1xuICB2YXIgeDIgPSB4ICsgeDtcbiAgdmFyIHkyID0geSArIHk7XG4gIHZhciB6MiA9IHogKyB6O1xuICB2YXIgeHggPSB4ICogeDI7XG4gIHZhciB5eCA9IHkgKiB4MjtcbiAgdmFyIHl5ID0geSAqIHkyO1xuICB2YXIgenggPSB6ICogeDI7XG4gIHZhciB6eSA9IHogKiB5MjtcbiAgdmFyIHp6ID0geiAqIHoyO1xuICB2YXIgd3ggPSB3ICogeDI7XG4gIHZhciB3eSA9IHcgKiB5MjtcbiAgdmFyIHd6ID0gdyAqIHoyO1xuICBvdXRbMF0gPSAxIC0geXkgLSB6ejtcbiAgb3V0WzFdID0geXggKyB3ejtcbiAgb3V0WzJdID0genggLSB3eTtcbiAgb3V0WzNdID0gMDtcbiAgb3V0WzRdID0geXggLSB3ejtcbiAgb3V0WzVdID0gMSAtIHh4IC0geno7XG4gIG91dFs2XSA9IHp5ICsgd3g7XG4gIG91dFs3XSA9IDA7XG4gIG91dFs4XSA9IHp4ICsgd3k7XG4gIG91dFs5XSA9IHp5IC0gd3g7XG4gIG91dFsxMF0gPSAxIC0geHggLSB5eTtcbiAgb3V0WzExXSA9IDA7XG4gIG91dFsxMl0gPSAwO1xuICBvdXRbMTNdID0gMDtcbiAgb3V0WzE0XSA9IDA7XG4gIG91dFsxNV0gPSAxO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIEdlbmVyYXRlcyBhIGZydXN0dW0gbWF0cml4IHdpdGggdGhlIGdpdmVuIGJvdW5kc1xyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDR9IG91dCBtYXQ0IGZydXN0dW0gbWF0cml4IHdpbGwgYmUgd3JpdHRlbiBpbnRvXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBsZWZ0IExlZnQgYm91bmQgb2YgdGhlIGZydXN0dW1cclxuICogQHBhcmFtIHtOdW1iZXJ9IHJpZ2h0IFJpZ2h0IGJvdW5kIG9mIHRoZSBmcnVzdHVtXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBib3R0b20gQm90dG9tIGJvdW5kIG9mIHRoZSBmcnVzdHVtXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSB0b3AgVG9wIGJvdW5kIG9mIHRoZSBmcnVzdHVtXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBuZWFyIE5lYXIgYm91bmQgb2YgdGhlIGZydXN0dW1cclxuICogQHBhcmFtIHtOdW1iZXJ9IGZhciBGYXIgYm91bmQgb2YgdGhlIGZydXN0dW1cclxuICogQHJldHVybnMge21hdDR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZydXN0dW0ob3V0LCBsZWZ0LCByaWdodCwgYm90dG9tLCB0b3AsIG5lYXIsIGZhcikge1xuICB2YXIgcmwgPSAxIC8gKHJpZ2h0IC0gbGVmdCk7XG4gIHZhciB0YiA9IDEgLyAodG9wIC0gYm90dG9tKTtcbiAgdmFyIG5mID0gMSAvIChuZWFyIC0gZmFyKTtcbiAgb3V0WzBdID0gbmVhciAqIDIgKiBybDtcbiAgb3V0WzFdID0gMDtcbiAgb3V0WzJdID0gMDtcbiAgb3V0WzNdID0gMDtcbiAgb3V0WzRdID0gMDtcbiAgb3V0WzVdID0gbmVhciAqIDIgKiB0YjtcbiAgb3V0WzZdID0gMDtcbiAgb3V0WzddID0gMDtcbiAgb3V0WzhdID0gKHJpZ2h0ICsgbGVmdCkgKiBybDtcbiAgb3V0WzldID0gKHRvcCArIGJvdHRvbSkgKiB0YjtcbiAgb3V0WzEwXSA9IChmYXIgKyBuZWFyKSAqIG5mO1xuICBvdXRbMTFdID0gLTE7XG4gIG91dFsxMl0gPSAwO1xuICBvdXRbMTNdID0gMDtcbiAgb3V0WzE0XSA9IGZhciAqIG5lYXIgKiAyICogbmY7XG4gIG91dFsxNV0gPSAwO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIEdlbmVyYXRlcyBhIHBlcnNwZWN0aXZlIHByb2plY3Rpb24gbWF0cml4IHdpdGggdGhlIGdpdmVuIGJvdW5kcy5cclxuICogUGFzc2luZyBudWxsL3VuZGVmaW5lZC9ubyB2YWx1ZSBmb3IgZmFyIHdpbGwgZ2VuZXJhdGUgaW5maW5pdGUgcHJvamVjdGlvbiBtYXRyaXguXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IG1hdDQgZnJ1c3R1bSBtYXRyaXggd2lsbCBiZSB3cml0dGVuIGludG9cclxuICogQHBhcmFtIHtudW1iZXJ9IGZvdnkgVmVydGljYWwgZmllbGQgb2YgdmlldyBpbiByYWRpYW5zXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBhc3BlY3QgQXNwZWN0IHJhdGlvLiB0eXBpY2FsbHkgdmlld3BvcnQgd2lkdGgvaGVpZ2h0XHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBuZWFyIE5lYXIgYm91bmQgb2YgdGhlIGZydXN0dW1cclxuICogQHBhcmFtIHtudW1iZXJ9IGZhciBGYXIgYm91bmQgb2YgdGhlIGZydXN0dW0sIGNhbiBiZSBudWxsIG9yIEluZmluaXR5XHJcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBwZXJzcGVjdGl2ZShvdXQsIGZvdnksIGFzcGVjdCwgbmVhciwgZmFyKSB7XG4gIHZhciBmID0gMS4wIC8gTWF0aC50YW4oZm92eSAvIDIpLFxuICAgICAgbmY7XG4gIG91dFswXSA9IGYgLyBhc3BlY3Q7XG4gIG91dFsxXSA9IDA7XG4gIG91dFsyXSA9IDA7XG4gIG91dFszXSA9IDA7XG4gIG91dFs0XSA9IDA7XG4gIG91dFs1XSA9IGY7XG4gIG91dFs2XSA9IDA7XG4gIG91dFs3XSA9IDA7XG4gIG91dFs4XSA9IDA7XG4gIG91dFs5XSA9IDA7XG4gIG91dFsxMV0gPSAtMTtcbiAgb3V0WzEyXSA9IDA7XG4gIG91dFsxM10gPSAwO1xuICBvdXRbMTVdID0gMDtcblxuICBpZiAoZmFyICE9IG51bGwgJiYgZmFyICE9PSBJbmZpbml0eSkge1xuICAgIG5mID0gMSAvIChuZWFyIC0gZmFyKTtcbiAgICBvdXRbMTBdID0gKGZhciArIG5lYXIpICogbmY7XG4gICAgb3V0WzE0XSA9IDIgKiBmYXIgKiBuZWFyICogbmY7XG4gIH0gZWxzZSB7XG4gICAgb3V0WzEwXSA9IC0xO1xuICAgIG91dFsxNF0gPSAtMiAqIG5lYXI7XG4gIH1cblxuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIEdlbmVyYXRlcyBhIHBlcnNwZWN0aXZlIHByb2plY3Rpb24gbWF0cml4IHdpdGggdGhlIGdpdmVuIGZpZWxkIG9mIHZpZXcuXHJcbiAqIFRoaXMgaXMgcHJpbWFyaWx5IHVzZWZ1bCBmb3IgZ2VuZXJhdGluZyBwcm9qZWN0aW9uIG1hdHJpY2VzIHRvIGJlIHVzZWRcclxuICogd2l0aCB0aGUgc3RpbGwgZXhwZXJpZW1lbnRhbCBXZWJWUiBBUEkuXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IG1hdDQgZnJ1c3R1bSBtYXRyaXggd2lsbCBiZSB3cml0dGVuIGludG9cclxuICogQHBhcmFtIHtPYmplY3R9IGZvdiBPYmplY3QgY29udGFpbmluZyB0aGUgZm9sbG93aW5nIHZhbHVlczogdXBEZWdyZWVzLCBkb3duRGVncmVlcywgbGVmdERlZ3JlZXMsIHJpZ2h0RGVncmVlc1xyXG4gKiBAcGFyYW0ge251bWJlcn0gbmVhciBOZWFyIGJvdW5kIG9mIHRoZSBmcnVzdHVtXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBmYXIgRmFyIGJvdW5kIG9mIHRoZSBmcnVzdHVtXHJcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBwZXJzcGVjdGl2ZUZyb21GaWVsZE9mVmlldyhvdXQsIGZvdiwgbmVhciwgZmFyKSB7XG4gIHZhciB1cFRhbiA9IE1hdGgudGFuKGZvdi51cERlZ3JlZXMgKiBNYXRoLlBJIC8gMTgwLjApO1xuICB2YXIgZG93blRhbiA9IE1hdGgudGFuKGZvdi5kb3duRGVncmVlcyAqIE1hdGguUEkgLyAxODAuMCk7XG4gIHZhciBsZWZ0VGFuID0gTWF0aC50YW4oZm92LmxlZnREZWdyZWVzICogTWF0aC5QSSAvIDE4MC4wKTtcbiAgdmFyIHJpZ2h0VGFuID0gTWF0aC50YW4oZm92LnJpZ2h0RGVncmVlcyAqIE1hdGguUEkgLyAxODAuMCk7XG4gIHZhciB4U2NhbGUgPSAyLjAgLyAobGVmdFRhbiArIHJpZ2h0VGFuKTtcbiAgdmFyIHlTY2FsZSA9IDIuMCAvICh1cFRhbiArIGRvd25UYW4pO1xuICBvdXRbMF0gPSB4U2NhbGU7XG4gIG91dFsxXSA9IDAuMDtcbiAgb3V0WzJdID0gMC4wO1xuICBvdXRbM10gPSAwLjA7XG4gIG91dFs0XSA9IDAuMDtcbiAgb3V0WzVdID0geVNjYWxlO1xuICBvdXRbNl0gPSAwLjA7XG4gIG91dFs3XSA9IDAuMDtcbiAgb3V0WzhdID0gLSgobGVmdFRhbiAtIHJpZ2h0VGFuKSAqIHhTY2FsZSAqIDAuNSk7XG4gIG91dFs5XSA9ICh1cFRhbiAtIGRvd25UYW4pICogeVNjYWxlICogMC41O1xuICBvdXRbMTBdID0gZmFyIC8gKG5lYXIgLSBmYXIpO1xuICBvdXRbMTFdID0gLTEuMDtcbiAgb3V0WzEyXSA9IDAuMDtcbiAgb3V0WzEzXSA9IDAuMDtcbiAgb3V0WzE0XSA9IGZhciAqIG5lYXIgLyAobmVhciAtIGZhcik7XG4gIG91dFsxNV0gPSAwLjA7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogR2VuZXJhdGVzIGEgb3J0aG9nb25hbCBwcm9qZWN0aW9uIG1hdHJpeCB3aXRoIHRoZSBnaXZlbiBib3VuZHNcclxuICpcclxuICogQHBhcmFtIHttYXQ0fSBvdXQgbWF0NCBmcnVzdHVtIG1hdHJpeCB3aWxsIGJlIHdyaXR0ZW4gaW50b1xyXG4gKiBAcGFyYW0ge251bWJlcn0gbGVmdCBMZWZ0IGJvdW5kIG9mIHRoZSBmcnVzdHVtXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSByaWdodCBSaWdodCBib3VuZCBvZiB0aGUgZnJ1c3R1bVxyXG4gKiBAcGFyYW0ge251bWJlcn0gYm90dG9tIEJvdHRvbSBib3VuZCBvZiB0aGUgZnJ1c3R1bVxyXG4gKiBAcGFyYW0ge251bWJlcn0gdG9wIFRvcCBib3VuZCBvZiB0aGUgZnJ1c3R1bVxyXG4gKiBAcGFyYW0ge251bWJlcn0gbmVhciBOZWFyIGJvdW5kIG9mIHRoZSBmcnVzdHVtXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBmYXIgRmFyIGJvdW5kIG9mIHRoZSBmcnVzdHVtXHJcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBvcnRobyhvdXQsIGxlZnQsIHJpZ2h0LCBib3R0b20sIHRvcCwgbmVhciwgZmFyKSB7XG4gIHZhciBsciA9IDEgLyAobGVmdCAtIHJpZ2h0KTtcbiAgdmFyIGJ0ID0gMSAvIChib3R0b20gLSB0b3ApO1xuICB2YXIgbmYgPSAxIC8gKG5lYXIgLSBmYXIpO1xuICBvdXRbMF0gPSAtMiAqIGxyO1xuICBvdXRbMV0gPSAwO1xuICBvdXRbMl0gPSAwO1xuICBvdXRbM10gPSAwO1xuICBvdXRbNF0gPSAwO1xuICBvdXRbNV0gPSAtMiAqIGJ0O1xuICBvdXRbNl0gPSAwO1xuICBvdXRbN10gPSAwO1xuICBvdXRbOF0gPSAwO1xuICBvdXRbOV0gPSAwO1xuICBvdXRbMTBdID0gMiAqIG5mO1xuICBvdXRbMTFdID0gMDtcbiAgb3V0WzEyXSA9IChsZWZ0ICsgcmlnaHQpICogbHI7XG4gIG91dFsxM10gPSAodG9wICsgYm90dG9tKSAqIGJ0O1xuICBvdXRbMTRdID0gKGZhciArIG5lYXIpICogbmY7XG4gIG91dFsxNV0gPSAxO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIEdlbmVyYXRlcyBhIGxvb2stYXQgbWF0cml4IHdpdGggdGhlIGdpdmVuIGV5ZSBwb3NpdGlvbiwgZm9jYWwgcG9pbnQsIGFuZCB1cCBheGlzLlxyXG4gKiBJZiB5b3Ugd2FudCBhIG1hdHJpeCB0aGF0IGFjdHVhbGx5IG1ha2VzIGFuIG9iamVjdCBsb29rIGF0IGFub3RoZXIgb2JqZWN0LCB5b3Ugc2hvdWxkIHVzZSB0YXJnZXRUbyBpbnN0ZWFkLlxyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDR9IG91dCBtYXQ0IGZydXN0dW0gbWF0cml4IHdpbGwgYmUgd3JpdHRlbiBpbnRvXHJcbiAqIEBwYXJhbSB7dmVjM30gZXllIFBvc2l0aW9uIG9mIHRoZSB2aWV3ZXJcclxuICogQHBhcmFtIHt2ZWMzfSBjZW50ZXIgUG9pbnQgdGhlIHZpZXdlciBpcyBsb29raW5nIGF0XHJcbiAqIEBwYXJhbSB7dmVjM30gdXAgdmVjMyBwb2ludGluZyB1cFxyXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbG9va0F0KG91dCwgZXllLCBjZW50ZXIsIHVwKSB7XG4gIHZhciB4MCwgeDEsIHgyLCB5MCwgeTEsIHkyLCB6MCwgejEsIHoyLCBsZW47XG4gIHZhciBleWV4ID0gZXllWzBdO1xuICB2YXIgZXlleSA9IGV5ZVsxXTtcbiAgdmFyIGV5ZXogPSBleWVbMl07XG4gIHZhciB1cHggPSB1cFswXTtcbiAgdmFyIHVweSA9IHVwWzFdO1xuICB2YXIgdXB6ID0gdXBbMl07XG4gIHZhciBjZW50ZXJ4ID0gY2VudGVyWzBdO1xuICB2YXIgY2VudGVyeSA9IGNlbnRlclsxXTtcbiAgdmFyIGNlbnRlcnogPSBjZW50ZXJbMl07XG5cbiAgaWYgKE1hdGguYWJzKGV5ZXggLSBjZW50ZXJ4KSA8IGdsTWF0cml4LkVQU0lMT04gJiYgTWF0aC5hYnMoZXlleSAtIGNlbnRlcnkpIDwgZ2xNYXRyaXguRVBTSUxPTiAmJiBNYXRoLmFicyhleWV6IC0gY2VudGVyeikgPCBnbE1hdHJpeC5FUFNJTE9OKSB7XG4gICAgcmV0dXJuIGlkZW50aXR5KG91dCk7XG4gIH1cblxuICB6MCA9IGV5ZXggLSBjZW50ZXJ4O1xuICB6MSA9IGV5ZXkgLSBjZW50ZXJ5O1xuICB6MiA9IGV5ZXogLSBjZW50ZXJ6O1xuICBsZW4gPSAxIC8gTWF0aC5zcXJ0KHowICogejAgKyB6MSAqIHoxICsgejIgKiB6Mik7XG4gIHowICo9IGxlbjtcbiAgejEgKj0gbGVuO1xuICB6MiAqPSBsZW47XG4gIHgwID0gdXB5ICogejIgLSB1cHogKiB6MTtcbiAgeDEgPSB1cHogKiB6MCAtIHVweCAqIHoyO1xuICB4MiA9IHVweCAqIHoxIC0gdXB5ICogejA7XG4gIGxlbiA9IE1hdGguc3FydCh4MCAqIHgwICsgeDEgKiB4MSArIHgyICogeDIpO1xuXG4gIGlmICghbGVuKSB7XG4gICAgeDAgPSAwO1xuICAgIHgxID0gMDtcbiAgICB4MiA9IDA7XG4gIH0gZWxzZSB7XG4gICAgbGVuID0gMSAvIGxlbjtcbiAgICB4MCAqPSBsZW47XG4gICAgeDEgKj0gbGVuO1xuICAgIHgyICo9IGxlbjtcbiAgfVxuXG4gIHkwID0gejEgKiB4MiAtIHoyICogeDE7XG4gIHkxID0gejIgKiB4MCAtIHowICogeDI7XG4gIHkyID0gejAgKiB4MSAtIHoxICogeDA7XG4gIGxlbiA9IE1hdGguc3FydCh5MCAqIHkwICsgeTEgKiB5MSArIHkyICogeTIpO1xuXG4gIGlmICghbGVuKSB7XG4gICAgeTAgPSAwO1xuICAgIHkxID0gMDtcbiAgICB5MiA9IDA7XG4gIH0gZWxzZSB7XG4gICAgbGVuID0gMSAvIGxlbjtcbiAgICB5MCAqPSBsZW47XG4gICAgeTEgKj0gbGVuO1xuICAgIHkyICo9IGxlbjtcbiAgfVxuXG4gIG91dFswXSA9IHgwO1xuICBvdXRbMV0gPSB5MDtcbiAgb3V0WzJdID0gejA7XG4gIG91dFszXSA9IDA7XG4gIG91dFs0XSA9IHgxO1xuICBvdXRbNV0gPSB5MTtcbiAgb3V0WzZdID0gejE7XG4gIG91dFs3XSA9IDA7XG4gIG91dFs4XSA9IHgyO1xuICBvdXRbOV0gPSB5MjtcbiAgb3V0WzEwXSA9IHoyO1xuICBvdXRbMTFdID0gMDtcbiAgb3V0WzEyXSA9IC0oeDAgKiBleWV4ICsgeDEgKiBleWV5ICsgeDIgKiBleWV6KTtcbiAgb3V0WzEzXSA9IC0oeTAgKiBleWV4ICsgeTEgKiBleWV5ICsgeTIgKiBleWV6KTtcbiAgb3V0WzE0XSA9IC0oejAgKiBleWV4ICsgejEgKiBleWV5ICsgejIgKiBleWV6KTtcbiAgb3V0WzE1XSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogR2VuZXJhdGVzIGEgbWF0cml4IHRoYXQgbWFrZXMgc29tZXRoaW5nIGxvb2sgYXQgc29tZXRoaW5nIGVsc2UuXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IG1hdDQgZnJ1c3R1bSBtYXRyaXggd2lsbCBiZSB3cml0dGVuIGludG9cclxuICogQHBhcmFtIHt2ZWMzfSBleWUgUG9zaXRpb24gb2YgdGhlIHZpZXdlclxyXG4gKiBAcGFyYW0ge3ZlYzN9IGNlbnRlciBQb2ludCB0aGUgdmlld2VyIGlzIGxvb2tpbmcgYXRcclxuICogQHBhcmFtIHt2ZWMzfSB1cCB2ZWMzIHBvaW50aW5nIHVwXHJcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB0YXJnZXRUbyhvdXQsIGV5ZSwgdGFyZ2V0LCB1cCkge1xuICB2YXIgZXlleCA9IGV5ZVswXSxcbiAgICAgIGV5ZXkgPSBleWVbMV0sXG4gICAgICBleWV6ID0gZXllWzJdLFxuICAgICAgdXB4ID0gdXBbMF0sXG4gICAgICB1cHkgPSB1cFsxXSxcbiAgICAgIHVweiA9IHVwWzJdO1xuICB2YXIgejAgPSBleWV4IC0gdGFyZ2V0WzBdLFxuICAgICAgejEgPSBleWV5IC0gdGFyZ2V0WzFdLFxuICAgICAgejIgPSBleWV6IC0gdGFyZ2V0WzJdO1xuICB2YXIgbGVuID0gejAgKiB6MCArIHoxICogejEgKyB6MiAqIHoyO1xuXG4gIGlmIChsZW4gPiAwKSB7XG4gICAgbGVuID0gMSAvIE1hdGguc3FydChsZW4pO1xuICAgIHowICo9IGxlbjtcbiAgICB6MSAqPSBsZW47XG4gICAgejIgKj0gbGVuO1xuICB9XG5cbiAgdmFyIHgwID0gdXB5ICogejIgLSB1cHogKiB6MSxcbiAgICAgIHgxID0gdXB6ICogejAgLSB1cHggKiB6MixcbiAgICAgIHgyID0gdXB4ICogejEgLSB1cHkgKiB6MDtcbiAgbGVuID0geDAgKiB4MCArIHgxICogeDEgKyB4MiAqIHgyO1xuXG4gIGlmIChsZW4gPiAwKSB7XG4gICAgbGVuID0gMSAvIE1hdGguc3FydChsZW4pO1xuICAgIHgwICo9IGxlbjtcbiAgICB4MSAqPSBsZW47XG4gICAgeDIgKj0gbGVuO1xuICB9XG5cbiAgb3V0WzBdID0geDA7XG4gIG91dFsxXSA9IHgxO1xuICBvdXRbMl0gPSB4MjtcbiAgb3V0WzNdID0gMDtcbiAgb3V0WzRdID0gejEgKiB4MiAtIHoyICogeDE7XG4gIG91dFs1XSA9IHoyICogeDAgLSB6MCAqIHgyO1xuICBvdXRbNl0gPSB6MCAqIHgxIC0gejEgKiB4MDtcbiAgb3V0WzddID0gMDtcbiAgb3V0WzhdID0gejA7XG4gIG91dFs5XSA9IHoxO1xuICBvdXRbMTBdID0gejI7XG4gIG91dFsxMV0gPSAwO1xuICBvdXRbMTJdID0gZXlleDtcbiAgb3V0WzEzXSA9IGV5ZXk7XG4gIG91dFsxNF0gPSBleWV6O1xuICBvdXRbMTVdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cbjtcbi8qKlxyXG4gKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgbWF0NFxyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDR9IGEgbWF0cml4IHRvIHJlcHJlc2VudCBhcyBhIHN0cmluZ1xyXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1hdHJpeFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHN0cihhKSB7XG4gIHJldHVybiAnbWF0NCgnICsgYVswXSArICcsICcgKyBhWzFdICsgJywgJyArIGFbMl0gKyAnLCAnICsgYVszXSArICcsICcgKyBhWzRdICsgJywgJyArIGFbNV0gKyAnLCAnICsgYVs2XSArICcsICcgKyBhWzddICsgJywgJyArIGFbOF0gKyAnLCAnICsgYVs5XSArICcsICcgKyBhWzEwXSArICcsICcgKyBhWzExXSArICcsICcgKyBhWzEyXSArICcsICcgKyBhWzEzXSArICcsICcgKyBhWzE0XSArICcsICcgKyBhWzE1XSArICcpJztcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIEZyb2Jlbml1cyBub3JtIG9mIGEgbWF0NFxyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDR9IGEgdGhlIG1hdHJpeCB0byBjYWxjdWxhdGUgRnJvYmVuaXVzIG5vcm0gb2ZcclxuICogQHJldHVybnMge051bWJlcn0gRnJvYmVuaXVzIG5vcm1cclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9iKGEpIHtcbiAgcmV0dXJuIE1hdGguc3FydChNYXRoLnBvdyhhWzBdLCAyKSArIE1hdGgucG93KGFbMV0sIDIpICsgTWF0aC5wb3coYVsyXSwgMikgKyBNYXRoLnBvdyhhWzNdLCAyKSArIE1hdGgucG93KGFbNF0sIDIpICsgTWF0aC5wb3coYVs1XSwgMikgKyBNYXRoLnBvdyhhWzZdLCAyKSArIE1hdGgucG93KGFbN10sIDIpICsgTWF0aC5wb3coYVs4XSwgMikgKyBNYXRoLnBvdyhhWzldLCAyKSArIE1hdGgucG93KGFbMTBdLCAyKSArIE1hdGgucG93KGFbMTFdLCAyKSArIE1hdGgucG93KGFbMTJdLCAyKSArIE1hdGgucG93KGFbMTNdLCAyKSArIE1hdGgucG93KGFbMTRdLCAyKSArIE1hdGgucG93KGFbMTVdLCAyKSk7XG59XG4vKipcclxuICogQWRkcyB0d28gbWF0NCdzXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XHJcbiAqIEBwYXJhbSB7bWF0NH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge21hdDR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBhZGQob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gKyBiWzBdO1xuICBvdXRbMV0gPSBhWzFdICsgYlsxXTtcbiAgb3V0WzJdID0gYVsyXSArIGJbMl07XG4gIG91dFszXSA9IGFbM10gKyBiWzNdO1xuICBvdXRbNF0gPSBhWzRdICsgYls0XTtcbiAgb3V0WzVdID0gYVs1XSArIGJbNV07XG4gIG91dFs2XSA9IGFbNl0gKyBiWzZdO1xuICBvdXRbN10gPSBhWzddICsgYls3XTtcbiAgb3V0WzhdID0gYVs4XSArIGJbOF07XG4gIG91dFs5XSA9IGFbOV0gKyBiWzldO1xuICBvdXRbMTBdID0gYVsxMF0gKyBiWzEwXTtcbiAgb3V0WzExXSA9IGFbMTFdICsgYlsxMV07XG4gIG91dFsxMl0gPSBhWzEyXSArIGJbMTJdO1xuICBvdXRbMTNdID0gYVsxM10gKyBiWzEzXTtcbiAgb3V0WzE0XSA9IGFbMTRdICsgYlsxNF07XG4gIG91dFsxNV0gPSBhWzE1XSArIGJbMTVdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFN1YnRyYWN0cyBtYXRyaXggYiBmcm9tIG1hdHJpeCBhXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XHJcbiAqIEBwYXJhbSB7bWF0NH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge21hdDR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzdWJ0cmFjdChvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSAtIGJbMF07XG4gIG91dFsxXSA9IGFbMV0gLSBiWzFdO1xuICBvdXRbMl0gPSBhWzJdIC0gYlsyXTtcbiAgb3V0WzNdID0gYVszXSAtIGJbM107XG4gIG91dFs0XSA9IGFbNF0gLSBiWzRdO1xuICBvdXRbNV0gPSBhWzVdIC0gYls1XTtcbiAgb3V0WzZdID0gYVs2XSAtIGJbNl07XG4gIG91dFs3XSA9IGFbN10gLSBiWzddO1xuICBvdXRbOF0gPSBhWzhdIC0gYls4XTtcbiAgb3V0WzldID0gYVs5XSAtIGJbOV07XG4gIG91dFsxMF0gPSBhWzEwXSAtIGJbMTBdO1xuICBvdXRbMTFdID0gYVsxMV0gLSBiWzExXTtcbiAgb3V0WzEyXSA9IGFbMTJdIC0gYlsxMl07XG4gIG91dFsxM10gPSBhWzEzXSAtIGJbMTNdO1xuICBvdXRbMTRdID0gYVsxNF0gLSBiWzE0XTtcbiAgb3V0WzE1XSA9IGFbMTVdIC0gYlsxNV07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogTXVsdGlwbHkgZWFjaCBlbGVtZW50IG9mIHRoZSBtYXRyaXggYnkgYSBzY2FsYXIuXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XHJcbiAqIEBwYXJhbSB7bWF0NH0gYSB0aGUgbWF0cml4IHRvIHNjYWxlXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBiIGFtb3VudCB0byBzY2FsZSB0aGUgbWF0cml4J3MgZWxlbWVudHMgYnlcclxuICogQHJldHVybnMge21hdDR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG11bHRpcGx5U2NhbGFyKG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBhWzBdICogYjtcbiAgb3V0WzFdID0gYVsxXSAqIGI7XG4gIG91dFsyXSA9IGFbMl0gKiBiO1xuICBvdXRbM10gPSBhWzNdICogYjtcbiAgb3V0WzRdID0gYVs0XSAqIGI7XG4gIG91dFs1XSA9IGFbNV0gKiBiO1xuICBvdXRbNl0gPSBhWzZdICogYjtcbiAgb3V0WzddID0gYVs3XSAqIGI7XG4gIG91dFs4XSA9IGFbOF0gKiBiO1xuICBvdXRbOV0gPSBhWzldICogYjtcbiAgb3V0WzEwXSA9IGFbMTBdICogYjtcbiAgb3V0WzExXSA9IGFbMTFdICogYjtcbiAgb3V0WzEyXSA9IGFbMTJdICogYjtcbiAgb3V0WzEzXSA9IGFbMTNdICogYjtcbiAgb3V0WzE0XSA9IGFbMTRdICogYjtcbiAgb3V0WzE1XSA9IGFbMTVdICogYjtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBBZGRzIHR3byBtYXQ0J3MgYWZ0ZXIgbXVsdGlwbHlpbmcgZWFjaCBlbGVtZW50IG9mIHRoZSBzZWNvbmQgb3BlcmFuZCBieSBhIHNjYWxhciB2YWx1ZS5cclxuICpcclxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHttYXQ0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7bWF0NH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHNjYWxlIHRoZSBhbW91bnQgdG8gc2NhbGUgYidzIGVsZW1lbnRzIGJ5IGJlZm9yZSBhZGRpbmdcclxuICogQHJldHVybnMge21hdDR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG11bHRpcGx5U2NhbGFyQW5kQWRkKG91dCwgYSwgYiwgc2NhbGUpIHtcbiAgb3V0WzBdID0gYVswXSArIGJbMF0gKiBzY2FsZTtcbiAgb3V0WzFdID0gYVsxXSArIGJbMV0gKiBzY2FsZTtcbiAgb3V0WzJdID0gYVsyXSArIGJbMl0gKiBzY2FsZTtcbiAgb3V0WzNdID0gYVszXSArIGJbM10gKiBzY2FsZTtcbiAgb3V0WzRdID0gYVs0XSArIGJbNF0gKiBzY2FsZTtcbiAgb3V0WzVdID0gYVs1XSArIGJbNV0gKiBzY2FsZTtcbiAgb3V0WzZdID0gYVs2XSArIGJbNl0gKiBzY2FsZTtcbiAgb3V0WzddID0gYVs3XSArIGJbN10gKiBzY2FsZTtcbiAgb3V0WzhdID0gYVs4XSArIGJbOF0gKiBzY2FsZTtcbiAgb3V0WzldID0gYVs5XSArIGJbOV0gKiBzY2FsZTtcbiAgb3V0WzEwXSA9IGFbMTBdICsgYlsxMF0gKiBzY2FsZTtcbiAgb3V0WzExXSA9IGFbMTFdICsgYlsxMV0gKiBzY2FsZTtcbiAgb3V0WzEyXSA9IGFbMTJdICsgYlsxMl0gKiBzY2FsZTtcbiAgb3V0WzEzXSA9IGFbMTNdICsgYlsxM10gKiBzY2FsZTtcbiAgb3V0WzE0XSA9IGFbMTRdICsgYlsxNF0gKiBzY2FsZTtcbiAgb3V0WzE1XSA9IGFbMTVdICsgYlsxNV0gKiBzY2FsZTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBtYXRyaWNlcyBoYXZlIGV4YWN0bHkgdGhlIHNhbWUgZWxlbWVudHMgaW4gdGhlIHNhbWUgcG9zaXRpb24gKHdoZW4gY29tcGFyZWQgd2l0aCA9PT0pXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0NH0gYSBUaGUgZmlyc3QgbWF0cml4LlxyXG4gKiBAcGFyYW0ge21hdDR9IGIgVGhlIHNlY29uZCBtYXRyaXguXHJcbiAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSBtYXRyaWNlcyBhcmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS5cclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBleGFjdEVxdWFscyhhLCBiKSB7XG4gIHJldHVybiBhWzBdID09PSBiWzBdICYmIGFbMV0gPT09IGJbMV0gJiYgYVsyXSA9PT0gYlsyXSAmJiBhWzNdID09PSBiWzNdICYmIGFbNF0gPT09IGJbNF0gJiYgYVs1XSA9PT0gYls1XSAmJiBhWzZdID09PSBiWzZdICYmIGFbN10gPT09IGJbN10gJiYgYVs4XSA9PT0gYls4XSAmJiBhWzldID09PSBiWzldICYmIGFbMTBdID09PSBiWzEwXSAmJiBhWzExXSA9PT0gYlsxMV0gJiYgYVsxMl0gPT09IGJbMTJdICYmIGFbMTNdID09PSBiWzEzXSAmJiBhWzE0XSA9PT0gYlsxNF0gJiYgYVsxNV0gPT09IGJbMTVdO1xufVxuLyoqXHJcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIG1hdHJpY2VzIGhhdmUgYXBwcm94aW1hdGVseSB0aGUgc2FtZSBlbGVtZW50cyBpbiB0aGUgc2FtZSBwb3NpdGlvbi5cclxuICpcclxuICogQHBhcmFtIHttYXQ0fSBhIFRoZSBmaXJzdCBtYXRyaXguXHJcbiAqIEBwYXJhbSB7bWF0NH0gYiBUaGUgc2Vjb25kIG1hdHJpeC5cclxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIG1hdHJpY2VzIGFyZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGVxdWFscyhhLCBiKSB7XG4gIHZhciBhMCA9IGFbMF0sXG4gICAgICBhMSA9IGFbMV0sXG4gICAgICBhMiA9IGFbMl0sXG4gICAgICBhMyA9IGFbM107XG4gIHZhciBhNCA9IGFbNF0sXG4gICAgICBhNSA9IGFbNV0sXG4gICAgICBhNiA9IGFbNl0sXG4gICAgICBhNyA9IGFbN107XG4gIHZhciBhOCA9IGFbOF0sXG4gICAgICBhOSA9IGFbOV0sXG4gICAgICBhMTAgPSBhWzEwXSxcbiAgICAgIGExMSA9IGFbMTFdO1xuICB2YXIgYTEyID0gYVsxMl0sXG4gICAgICBhMTMgPSBhWzEzXSxcbiAgICAgIGExNCA9IGFbMTRdLFxuICAgICAgYTE1ID0gYVsxNV07XG4gIHZhciBiMCA9IGJbMF0sXG4gICAgICBiMSA9IGJbMV0sXG4gICAgICBiMiA9IGJbMl0sXG4gICAgICBiMyA9IGJbM107XG4gIHZhciBiNCA9IGJbNF0sXG4gICAgICBiNSA9IGJbNV0sXG4gICAgICBiNiA9IGJbNl0sXG4gICAgICBiNyA9IGJbN107XG4gIHZhciBiOCA9IGJbOF0sXG4gICAgICBiOSA9IGJbOV0sXG4gICAgICBiMTAgPSBiWzEwXSxcbiAgICAgIGIxMSA9IGJbMTFdO1xuICB2YXIgYjEyID0gYlsxMl0sXG4gICAgICBiMTMgPSBiWzEzXSxcbiAgICAgIGIxNCA9IGJbMTRdLFxuICAgICAgYjE1ID0gYlsxNV07XG4gIHJldHVybiBNYXRoLmFicyhhMCAtIGIwKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMCksIE1hdGguYWJzKGIwKSkgJiYgTWF0aC5hYnMoYTEgLSBiMSkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTEpLCBNYXRoLmFicyhiMSkpICYmIE1hdGguYWJzKGEyIC0gYjIpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGEyKSwgTWF0aC5hYnMoYjIpKSAmJiBNYXRoLmFicyhhMyAtIGIzKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMyksIE1hdGguYWJzKGIzKSkgJiYgTWF0aC5hYnMoYTQgLSBiNCkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTQpLCBNYXRoLmFicyhiNCkpICYmIE1hdGguYWJzKGE1IC0gYjUpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGE1KSwgTWF0aC5hYnMoYjUpKSAmJiBNYXRoLmFicyhhNiAtIGI2KSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhNiksIE1hdGguYWJzKGI2KSkgJiYgTWF0aC5hYnMoYTcgLSBiNykgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTcpLCBNYXRoLmFicyhiNykpICYmIE1hdGguYWJzKGE4IC0gYjgpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGE4KSwgTWF0aC5hYnMoYjgpKSAmJiBNYXRoLmFicyhhOSAtIGI5KSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhOSksIE1hdGguYWJzKGI5KSkgJiYgTWF0aC5hYnMoYTEwIC0gYjEwKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMTApLCBNYXRoLmFicyhiMTApKSAmJiBNYXRoLmFicyhhMTEgLSBiMTEpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGExMSksIE1hdGguYWJzKGIxMSkpICYmIE1hdGguYWJzKGExMiAtIGIxMikgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTEyKSwgTWF0aC5hYnMoYjEyKSkgJiYgTWF0aC5hYnMoYTEzIC0gYjEzKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMTMpLCBNYXRoLmFicyhiMTMpKSAmJiBNYXRoLmFicyhhMTQgLSBiMTQpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGExNCksIE1hdGguYWJzKGIxNCkpICYmIE1hdGguYWJzKGExNSAtIGIxNSkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTE1KSwgTWF0aC5hYnMoYjE1KSk7XG59XG4vKipcclxuICogQWxpYXMgZm9yIHtAbGluayBtYXQ0Lm11bHRpcGx5fVxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCB2YXIgbXVsID0gbXVsdGlwbHk7XG4vKipcclxuICogQWxpYXMgZm9yIHtAbGluayBtYXQ0LnN1YnRyYWN0fVxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCB2YXIgc3ViID0gc3VidHJhY3Q7IiwiaW1wb3J0ICogYXMgZ2xNYXRyaXggZnJvbSBcIi4vY29tbW9uLmpzXCI7XG4vKipcclxuICogMyBEaW1lbnNpb25hbCBWZWN0b3JcclxuICogQG1vZHVsZSB2ZWMzXHJcbiAqL1xuXG4vKipcclxuICogQ3JlYXRlcyBhIG5ldywgZW1wdHkgdmVjM1xyXG4gKlxyXG4gKiBAcmV0dXJucyB7dmVjM30gYSBuZXcgM0QgdmVjdG9yXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlKCkge1xuICB2YXIgb3V0ID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoMyk7XG5cbiAgaWYgKGdsTWF0cml4LkFSUkFZX1RZUEUgIT0gRmxvYXQzMkFycmF5KSB7XG4gICAgb3V0WzBdID0gMDtcbiAgICBvdXRbMV0gPSAwO1xuICAgIG91dFsyXSA9IDA7XG4gIH1cblxuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENyZWF0ZXMgYSBuZXcgdmVjMyBpbml0aWFsaXplZCB3aXRoIHZhbHVlcyBmcm9tIGFuIGV4aXN0aW5nIHZlY3RvclxyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzN9IGEgdmVjdG9yIHRvIGNsb25lXHJcbiAqIEByZXR1cm5zIHt2ZWMzfSBhIG5ldyAzRCB2ZWN0b3JcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjbG9uZShhKSB7XG4gIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSgzKTtcbiAgb3V0WzBdID0gYVswXTtcbiAgb3V0WzFdID0gYVsxXTtcbiAgb3V0WzJdID0gYVsyXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDYWxjdWxhdGVzIHRoZSBsZW5ndGggb2YgYSB2ZWMzXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjM30gYSB2ZWN0b3IgdG8gY2FsY3VsYXRlIGxlbmd0aCBvZlxyXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBsZW5ndGggb2YgYVxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGxlbmd0aChhKSB7XG4gIHZhciB4ID0gYVswXTtcbiAgdmFyIHkgPSBhWzFdO1xuICB2YXIgeiA9IGFbMl07XG4gIHJldHVybiBNYXRoLnNxcnQoeCAqIHggKyB5ICogeSArIHogKiB6KTtcbn1cbi8qKlxyXG4gKiBDcmVhdGVzIGEgbmV3IHZlYzMgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgZ2l2ZW4gdmFsdWVzXHJcbiAqXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSB4IFggY29tcG9uZW50XHJcbiAqIEBwYXJhbSB7TnVtYmVyfSB5IFkgY29tcG9uZW50XHJcbiAqIEBwYXJhbSB7TnVtYmVyfSB6IFogY29tcG9uZW50XHJcbiAqIEByZXR1cm5zIHt2ZWMzfSBhIG5ldyAzRCB2ZWN0b3JcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tVmFsdWVzKHgsIHksIHopIHtcbiAgdmFyIG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDMpO1xuICBvdXRbMF0gPSB4O1xuICBvdXRbMV0gPSB5O1xuICBvdXRbMl0gPSB6O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENvcHkgdGhlIHZhbHVlcyBmcm9tIG9uZSB2ZWMzIHRvIGFub3RoZXJcclxuICpcclxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHt2ZWMzfSBhIHRoZSBzb3VyY2UgdmVjdG9yXHJcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjb3B5KG91dCwgYSkge1xuICBvdXRbMF0gPSBhWzBdO1xuICBvdXRbMV0gPSBhWzFdO1xuICBvdXRbMl0gPSBhWzJdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFNldCB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzMgdG8gdGhlIGdpdmVuIHZhbHVlc1xyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge051bWJlcn0geCBYIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0ge051bWJlcn0geSBZIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0ge051bWJlcn0geiBaIGNvbXBvbmVudFxyXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc2V0KG91dCwgeCwgeSwgeikge1xuICBvdXRbMF0gPSB4O1xuICBvdXRbMV0gPSB5O1xuICBvdXRbMl0gPSB6O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIEFkZHMgdHdvIHZlYzMnc1xyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge3ZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHt2ZWMzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gYWRkKG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBhWzBdICsgYlswXTtcbiAgb3V0WzFdID0gYVsxXSArIGJbMV07XG4gIG91dFsyXSA9IGFbMl0gKyBiWzJdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFN1YnRyYWN0cyB2ZWN0b3IgYiBmcm9tIHZlY3RvciBhXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7dmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge3ZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzdWJ0cmFjdChvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSAtIGJbMF07XG4gIG91dFsxXSA9IGFbMV0gLSBiWzFdO1xuICBvdXRbMl0gPSBhWzJdIC0gYlsyXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBNdWx0aXBsaWVzIHR3byB2ZWMzJ3NcclxuICpcclxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHt2ZWMzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7dmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge3ZlYzN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG11bHRpcGx5KG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBhWzBdICogYlswXTtcbiAgb3V0WzFdID0gYVsxXSAqIGJbMV07XG4gIG91dFsyXSA9IGFbMl0gKiBiWzJdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIERpdmlkZXMgdHdvIHZlYzMnc1xyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge3ZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHt2ZWMzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZGl2aWRlKG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBhWzBdIC8gYlswXTtcbiAgb3V0WzFdID0gYVsxXSAvIGJbMV07XG4gIG91dFsyXSA9IGFbMl0gLyBiWzJdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIE1hdGguY2VpbCB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzNcclxuICpcclxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHt2ZWMzfSBhIHZlY3RvciB0byBjZWlsXHJcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjZWlsKG91dCwgYSkge1xuICBvdXRbMF0gPSBNYXRoLmNlaWwoYVswXSk7XG4gIG91dFsxXSA9IE1hdGguY2VpbChhWzFdKTtcbiAgb3V0WzJdID0gTWF0aC5jZWlsKGFbMl0pO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIE1hdGguZmxvb3IgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWMzXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7dmVjM30gYSB2ZWN0b3IgdG8gZmxvb3JcclxuICogQHJldHVybnMge3ZlYzN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZsb29yKG91dCwgYSkge1xuICBvdXRbMF0gPSBNYXRoLmZsb29yKGFbMF0pO1xuICBvdXRbMV0gPSBNYXRoLmZsb29yKGFbMV0pO1xuICBvdXRbMl0gPSBNYXRoLmZsb29yKGFbMl0pO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFJldHVybnMgdGhlIG1pbmltdW0gb2YgdHdvIHZlYzMnc1xyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge3ZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHt2ZWMzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbWluKG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBNYXRoLm1pbihhWzBdLCBiWzBdKTtcbiAgb3V0WzFdID0gTWF0aC5taW4oYVsxXSwgYlsxXSk7XG4gIG91dFsyXSA9IE1hdGgubWluKGFbMl0sIGJbMl0pO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFJldHVybnMgdGhlIG1heGltdW0gb2YgdHdvIHZlYzMnc1xyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge3ZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHt2ZWMzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbWF4KG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBNYXRoLm1heChhWzBdLCBiWzBdKTtcbiAgb3V0WzFdID0gTWF0aC5tYXgoYVsxXSwgYlsxXSk7XG4gIG91dFsyXSA9IE1hdGgubWF4KGFbMl0sIGJbMl0pO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIE1hdGgucm91bmQgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWMzXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7dmVjM30gYSB2ZWN0b3IgdG8gcm91bmRcclxuICogQHJldHVybnMge3ZlYzN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJvdW5kKG91dCwgYSkge1xuICBvdXRbMF0gPSBNYXRoLnJvdW5kKGFbMF0pO1xuICBvdXRbMV0gPSBNYXRoLnJvdW5kKGFbMV0pO1xuICBvdXRbMl0gPSBNYXRoLnJvdW5kKGFbMl0pO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFNjYWxlcyBhIHZlYzMgYnkgYSBzY2FsYXIgbnVtYmVyXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7dmVjM30gYSB0aGUgdmVjdG9yIHRvIHNjYWxlXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBiIGFtb3VudCB0byBzY2FsZSB0aGUgdmVjdG9yIGJ5XHJcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzY2FsZShvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSAqIGI7XG4gIG91dFsxXSA9IGFbMV0gKiBiO1xuICBvdXRbMl0gPSBhWzJdICogYjtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBBZGRzIHR3byB2ZWMzJ3MgYWZ0ZXIgc2NhbGluZyB0aGUgc2Vjb25kIG9wZXJhbmQgYnkgYSBzY2FsYXIgdmFsdWVcclxuICpcclxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHt2ZWMzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7dmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHNjYWxlIHRoZSBhbW91bnQgdG8gc2NhbGUgYiBieSBiZWZvcmUgYWRkaW5nXHJcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzY2FsZUFuZEFkZChvdXQsIGEsIGIsIHNjYWxlKSB7XG4gIG91dFswXSA9IGFbMF0gKyBiWzBdICogc2NhbGU7XG4gIG91dFsxXSA9IGFbMV0gKyBiWzFdICogc2NhbGU7XG4gIG91dFsyXSA9IGFbMl0gKyBiWzJdICogc2NhbGU7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ2FsY3VsYXRlcyB0aGUgZXVjbGlkaWFuIGRpc3RhbmNlIGJldHdlZW4gdHdvIHZlYzMnc1xyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHt2ZWMzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBkaXN0YW5jZSBiZXR3ZWVuIGEgYW5kIGJcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBkaXN0YW5jZShhLCBiKSB7XG4gIHZhciB4ID0gYlswXSAtIGFbMF07XG4gIHZhciB5ID0gYlsxXSAtIGFbMV07XG4gIHZhciB6ID0gYlsyXSAtIGFbMl07XG4gIHJldHVybiBNYXRoLnNxcnQoeCAqIHggKyB5ICogeSArIHogKiB6KTtcbn1cbi8qKlxyXG4gKiBDYWxjdWxhdGVzIHRoZSBzcXVhcmVkIGV1Y2xpZGlhbiBkaXN0YW5jZSBiZXR3ZWVuIHR3byB2ZWMzJ3NcclxuICpcclxuICogQHBhcmFtIHt2ZWMzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7dmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge051bWJlcn0gc3F1YXJlZCBkaXN0YW5jZSBiZXR3ZWVuIGEgYW5kIGJcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzcXVhcmVkRGlzdGFuY2UoYSwgYikge1xuICB2YXIgeCA9IGJbMF0gLSBhWzBdO1xuICB2YXIgeSA9IGJbMV0gLSBhWzFdO1xuICB2YXIgeiA9IGJbMl0gLSBhWzJdO1xuICByZXR1cm4geCAqIHggKyB5ICogeSArIHogKiB6O1xufVxuLyoqXHJcbiAqIENhbGN1bGF0ZXMgdGhlIHNxdWFyZWQgbGVuZ3RoIG9mIGEgdmVjM1xyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzN9IGEgdmVjdG9yIHRvIGNhbGN1bGF0ZSBzcXVhcmVkIGxlbmd0aCBvZlxyXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBzcXVhcmVkIGxlbmd0aCBvZiBhXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc3F1YXJlZExlbmd0aChhKSB7XG4gIHZhciB4ID0gYVswXTtcbiAgdmFyIHkgPSBhWzFdO1xuICB2YXIgeiA9IGFbMl07XG4gIHJldHVybiB4ICogeCArIHkgKiB5ICsgeiAqIHo7XG59XG4vKipcclxuICogTmVnYXRlcyB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzNcclxuICpcclxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHt2ZWMzfSBhIHZlY3RvciB0byBuZWdhdGVcclxuICogQHJldHVybnMge3ZlYzN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG5lZ2F0ZShvdXQsIGEpIHtcbiAgb3V0WzBdID0gLWFbMF07XG4gIG91dFsxXSA9IC1hWzFdO1xuICBvdXRbMl0gPSAtYVsyXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBpbnZlcnNlIG9mIHRoZSBjb21wb25lbnRzIG9mIGEgdmVjM1xyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge3ZlYzN9IGEgdmVjdG9yIHRvIGludmVydFxyXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gaW52ZXJzZShvdXQsIGEpIHtcbiAgb3V0WzBdID0gMS4wIC8gYVswXTtcbiAgb3V0WzFdID0gMS4wIC8gYVsxXTtcbiAgb3V0WzJdID0gMS4wIC8gYVsyXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBOb3JtYWxpemUgYSB2ZWMzXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7dmVjM30gYSB2ZWN0b3IgdG8gbm9ybWFsaXplXHJcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemUob3V0LCBhKSB7XG4gIHZhciB4ID0gYVswXTtcbiAgdmFyIHkgPSBhWzFdO1xuICB2YXIgeiA9IGFbMl07XG4gIHZhciBsZW4gPSB4ICogeCArIHkgKiB5ICsgeiAqIHo7XG5cbiAgaWYgKGxlbiA+IDApIHtcbiAgICAvL1RPRE86IGV2YWx1YXRlIHVzZSBvZiBnbG1faW52c3FydCBoZXJlP1xuICAgIGxlbiA9IDEgLyBNYXRoLnNxcnQobGVuKTtcbiAgfVxuXG4gIG91dFswXSA9IGFbMF0gKiBsZW47XG4gIG91dFsxXSA9IGFbMV0gKiBsZW47XG4gIG91dFsyXSA9IGFbMl0gKiBsZW47XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ2FsY3VsYXRlcyB0aGUgZG90IHByb2R1Y3Qgb2YgdHdvIHZlYzMnc1xyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHt2ZWMzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBkb3QgcHJvZHVjdCBvZiBhIGFuZCBiXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZG90KGEsIGIpIHtcbiAgcmV0dXJuIGFbMF0gKiBiWzBdICsgYVsxXSAqIGJbMV0gKyBhWzJdICogYlsyXTtcbn1cbi8qKlxyXG4gKiBDb21wdXRlcyB0aGUgY3Jvc3MgcHJvZHVjdCBvZiB0d28gdmVjMydzXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7dmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge3ZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjcm9zcyhvdXQsIGEsIGIpIHtcbiAgdmFyIGF4ID0gYVswXSxcbiAgICAgIGF5ID0gYVsxXSxcbiAgICAgIGF6ID0gYVsyXTtcbiAgdmFyIGJ4ID0gYlswXSxcbiAgICAgIGJ5ID0gYlsxXSxcbiAgICAgIGJ6ID0gYlsyXTtcbiAgb3V0WzBdID0gYXkgKiBieiAtIGF6ICogYnk7XG4gIG91dFsxXSA9IGF6ICogYnggLSBheCAqIGJ6O1xuICBvdXRbMl0gPSBheCAqIGJ5IC0gYXkgKiBieDtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBQZXJmb3JtcyBhIGxpbmVhciBpbnRlcnBvbGF0aW9uIGJldHdlZW4gdHdvIHZlYzMnc1xyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge3ZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHt2ZWMzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge051bWJlcn0gdCBpbnRlcnBvbGF0aW9uIGFtb3VudCwgaW4gdGhlIHJhbmdlIFswLTFdLCBiZXR3ZWVuIHRoZSB0d28gaW5wdXRzXHJcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBsZXJwKG91dCwgYSwgYiwgdCkge1xuICB2YXIgYXggPSBhWzBdO1xuICB2YXIgYXkgPSBhWzFdO1xuICB2YXIgYXogPSBhWzJdO1xuICBvdXRbMF0gPSBheCArIHQgKiAoYlswXSAtIGF4KTtcbiAgb3V0WzFdID0gYXkgKyB0ICogKGJbMV0gLSBheSk7XG4gIG91dFsyXSA9IGF6ICsgdCAqIChiWzJdIC0gYXopO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFBlcmZvcm1zIGEgaGVybWl0ZSBpbnRlcnBvbGF0aW9uIHdpdGggdHdvIGNvbnRyb2wgcG9pbnRzXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7dmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge3ZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7dmVjM30gYyB0aGUgdGhpcmQgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge3ZlYzN9IGQgdGhlIGZvdXJ0aCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSB0IGludGVycG9sYXRpb24gYW1vdW50LCBpbiB0aGUgcmFuZ2UgWzAtMV0sIGJldHdlZW4gdGhlIHR3byBpbnB1dHNcclxuICogQHJldHVybnMge3ZlYzN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGhlcm1pdGUob3V0LCBhLCBiLCBjLCBkLCB0KSB7XG4gIHZhciBmYWN0b3JUaW1lczIgPSB0ICogdDtcbiAgdmFyIGZhY3RvcjEgPSBmYWN0b3JUaW1lczIgKiAoMiAqIHQgLSAzKSArIDE7XG4gIHZhciBmYWN0b3IyID0gZmFjdG9yVGltZXMyICogKHQgLSAyKSArIHQ7XG4gIHZhciBmYWN0b3IzID0gZmFjdG9yVGltZXMyICogKHQgLSAxKTtcbiAgdmFyIGZhY3RvcjQgPSBmYWN0b3JUaW1lczIgKiAoMyAtIDIgKiB0KTtcbiAgb3V0WzBdID0gYVswXSAqIGZhY3RvcjEgKyBiWzBdICogZmFjdG9yMiArIGNbMF0gKiBmYWN0b3IzICsgZFswXSAqIGZhY3RvcjQ7XG4gIG91dFsxXSA9IGFbMV0gKiBmYWN0b3IxICsgYlsxXSAqIGZhY3RvcjIgKyBjWzFdICogZmFjdG9yMyArIGRbMV0gKiBmYWN0b3I0O1xuICBvdXRbMl0gPSBhWzJdICogZmFjdG9yMSArIGJbMl0gKiBmYWN0b3IyICsgY1syXSAqIGZhY3RvcjMgKyBkWzJdICogZmFjdG9yNDtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBQZXJmb3JtcyBhIGJlemllciBpbnRlcnBvbGF0aW9uIHdpdGggdHdvIGNvbnRyb2wgcG9pbnRzXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7dmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge3ZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7dmVjM30gYyB0aGUgdGhpcmQgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge3ZlYzN9IGQgdGhlIGZvdXJ0aCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSB0IGludGVycG9sYXRpb24gYW1vdW50LCBpbiB0aGUgcmFuZ2UgWzAtMV0sIGJldHdlZW4gdGhlIHR3byBpbnB1dHNcclxuICogQHJldHVybnMge3ZlYzN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGJlemllcihvdXQsIGEsIGIsIGMsIGQsIHQpIHtcbiAgdmFyIGludmVyc2VGYWN0b3IgPSAxIC0gdDtcbiAgdmFyIGludmVyc2VGYWN0b3JUaW1lc1R3byA9IGludmVyc2VGYWN0b3IgKiBpbnZlcnNlRmFjdG9yO1xuICB2YXIgZmFjdG9yVGltZXMyID0gdCAqIHQ7XG4gIHZhciBmYWN0b3IxID0gaW52ZXJzZUZhY3RvclRpbWVzVHdvICogaW52ZXJzZUZhY3RvcjtcbiAgdmFyIGZhY3RvcjIgPSAzICogdCAqIGludmVyc2VGYWN0b3JUaW1lc1R3bztcbiAgdmFyIGZhY3RvcjMgPSAzICogZmFjdG9yVGltZXMyICogaW52ZXJzZUZhY3RvcjtcbiAgdmFyIGZhY3RvcjQgPSBmYWN0b3JUaW1lczIgKiB0O1xuICBvdXRbMF0gPSBhWzBdICogZmFjdG9yMSArIGJbMF0gKiBmYWN0b3IyICsgY1swXSAqIGZhY3RvcjMgKyBkWzBdICogZmFjdG9yNDtcbiAgb3V0WzFdID0gYVsxXSAqIGZhY3RvcjEgKyBiWzFdICogZmFjdG9yMiArIGNbMV0gKiBmYWN0b3IzICsgZFsxXSAqIGZhY3RvcjQ7XG4gIG91dFsyXSA9IGFbMl0gKiBmYWN0b3IxICsgYlsyXSAqIGZhY3RvcjIgKyBjWzJdICogZmFjdG9yMyArIGRbMl0gKiBmYWN0b3I0O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIEdlbmVyYXRlcyBhIHJhbmRvbSB2ZWN0b3Igd2l0aCB0aGUgZ2l2ZW4gc2NhbGVcclxuICpcclxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtOdW1iZXJ9IFtzY2FsZV0gTGVuZ3RoIG9mIHRoZSByZXN1bHRpbmcgdmVjdG9yLiBJZiBvbW1pdHRlZCwgYSB1bml0IHZlY3RvciB3aWxsIGJlIHJldHVybmVkXHJcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiByYW5kb20ob3V0LCBzY2FsZSkge1xuICBzY2FsZSA9IHNjYWxlIHx8IDEuMDtcbiAgdmFyIHIgPSBnbE1hdHJpeC5SQU5ET00oKSAqIDIuMCAqIE1hdGguUEk7XG4gIHZhciB6ID0gZ2xNYXRyaXguUkFORE9NKCkgKiAyLjAgLSAxLjA7XG4gIHZhciB6U2NhbGUgPSBNYXRoLnNxcnQoMS4wIC0geiAqIHopICogc2NhbGU7XG4gIG91dFswXSA9IE1hdGguY29zKHIpICogelNjYWxlO1xuICBvdXRbMV0gPSBNYXRoLnNpbihyKSAqIHpTY2FsZTtcbiAgb3V0WzJdID0geiAqIHNjYWxlO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFRyYW5zZm9ybXMgdGhlIHZlYzMgd2l0aCBhIG1hdDQuXHJcbiAqIDR0aCB2ZWN0b3IgY29tcG9uZW50IGlzIGltcGxpY2l0bHkgJzEnXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7dmVjM30gYSB0aGUgdmVjdG9yIHRvIHRyYW5zZm9ybVxyXG4gKiBAcGFyYW0ge21hdDR9IG0gbWF0cml4IHRvIHRyYW5zZm9ybSB3aXRoXHJcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm1NYXQ0KG91dCwgYSwgbSkge1xuICB2YXIgeCA9IGFbMF0sXG4gICAgICB5ID0gYVsxXSxcbiAgICAgIHogPSBhWzJdO1xuICB2YXIgdyA9IG1bM10gKiB4ICsgbVs3XSAqIHkgKyBtWzExXSAqIHogKyBtWzE1XTtcbiAgdyA9IHcgfHwgMS4wO1xuICBvdXRbMF0gPSAobVswXSAqIHggKyBtWzRdICogeSArIG1bOF0gKiB6ICsgbVsxMl0pIC8gdztcbiAgb3V0WzFdID0gKG1bMV0gKiB4ICsgbVs1XSAqIHkgKyBtWzldICogeiArIG1bMTNdKSAvIHc7XG4gIG91dFsyXSA9IChtWzJdICogeCArIG1bNl0gKiB5ICsgbVsxMF0gKiB6ICsgbVsxNF0pIC8gdztcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBUcmFuc2Zvcm1zIHRoZSB2ZWMzIHdpdGggYSBtYXQzLlxyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge3ZlYzN9IGEgdGhlIHZlY3RvciB0byB0cmFuc2Zvcm1cclxuICogQHBhcmFtIHttYXQzfSBtIHRoZSAzeDMgbWF0cml4IHRvIHRyYW5zZm9ybSB3aXRoXHJcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm1NYXQzKG91dCwgYSwgbSkge1xuICB2YXIgeCA9IGFbMF0sXG4gICAgICB5ID0gYVsxXSxcbiAgICAgIHogPSBhWzJdO1xuICBvdXRbMF0gPSB4ICogbVswXSArIHkgKiBtWzNdICsgeiAqIG1bNl07XG4gIG91dFsxXSA9IHggKiBtWzFdICsgeSAqIG1bNF0gKyB6ICogbVs3XTtcbiAgb3V0WzJdID0geCAqIG1bMl0gKyB5ICogbVs1XSArIHogKiBtWzhdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFRyYW5zZm9ybXMgdGhlIHZlYzMgd2l0aCBhIHF1YXRcclxuICogQ2FuIGFsc28gYmUgdXNlZCBmb3IgZHVhbCBxdWF0ZXJuaW9ucy4gKE11bHRpcGx5IGl0IHdpdGggdGhlIHJlYWwgcGFydClcclxuICpcclxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHt2ZWMzfSBhIHRoZSB2ZWN0b3IgdG8gdHJhbnNmb3JtXHJcbiAqIEBwYXJhbSB7cXVhdH0gcSBxdWF0ZXJuaW9uIHRvIHRyYW5zZm9ybSB3aXRoXHJcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm1RdWF0KG91dCwgYSwgcSkge1xuICAvLyBiZW5jaG1hcmtzOiBodHRwczovL2pzcGVyZi5jb20vcXVhdGVybmlvbi10cmFuc2Zvcm0tdmVjMy1pbXBsZW1lbnRhdGlvbnMtZml4ZWRcbiAgdmFyIHF4ID0gcVswXSxcbiAgICAgIHF5ID0gcVsxXSxcbiAgICAgIHF6ID0gcVsyXSxcbiAgICAgIHF3ID0gcVszXTtcbiAgdmFyIHggPSBhWzBdLFxuICAgICAgeSA9IGFbMV0sXG4gICAgICB6ID0gYVsyXTsgLy8gdmFyIHF2ZWMgPSBbcXgsIHF5LCBxel07XG4gIC8vIHZhciB1diA9IHZlYzMuY3Jvc3MoW10sIHF2ZWMsIGEpO1xuXG4gIHZhciB1dnggPSBxeSAqIHogLSBxeiAqIHksXG4gICAgICB1dnkgPSBxeiAqIHggLSBxeCAqIHosXG4gICAgICB1dnogPSBxeCAqIHkgLSBxeSAqIHg7IC8vIHZhciB1dXYgPSB2ZWMzLmNyb3NzKFtdLCBxdmVjLCB1dik7XG5cbiAgdmFyIHV1dnggPSBxeSAqIHV2eiAtIHF6ICogdXZ5LFxuICAgICAgdXV2eSA9IHF6ICogdXZ4IC0gcXggKiB1dnosXG4gICAgICB1dXZ6ID0gcXggKiB1dnkgLSBxeSAqIHV2eDsgLy8gdmVjMy5zY2FsZSh1diwgdXYsIDIgKiB3KTtcblxuICB2YXIgdzIgPSBxdyAqIDI7XG4gIHV2eCAqPSB3MjtcbiAgdXZ5ICo9IHcyO1xuICB1dnogKj0gdzI7IC8vIHZlYzMuc2NhbGUodXV2LCB1dXYsIDIpO1xuXG4gIHV1dnggKj0gMjtcbiAgdXV2eSAqPSAyO1xuICB1dXZ6ICo9IDI7IC8vIHJldHVybiB2ZWMzLmFkZChvdXQsIGEsIHZlYzMuYWRkKG91dCwgdXYsIHV1dikpO1xuXG4gIG91dFswXSA9IHggKyB1dnggKyB1dXZ4O1xuICBvdXRbMV0gPSB5ICsgdXZ5ICsgdXV2eTtcbiAgb3V0WzJdID0geiArIHV2eiArIHV1dno7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogUm90YXRlIGEgM0QgdmVjdG9yIGFyb3VuZCB0aGUgeC1heGlzXHJcbiAqIEBwYXJhbSB7dmVjM30gb3V0IFRoZSByZWNlaXZpbmcgdmVjM1xyXG4gKiBAcGFyYW0ge3ZlYzN9IGEgVGhlIHZlYzMgcG9pbnQgdG8gcm90YXRlXHJcbiAqIEBwYXJhbSB7dmVjM30gYiBUaGUgb3JpZ2luIG9mIHRoZSByb3RhdGlvblxyXG4gKiBAcGFyYW0ge051bWJlcn0gYyBUaGUgYW5nbGUgb2Ygcm90YXRpb25cclxuICogQHJldHVybnMge3ZlYzN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJvdGF0ZVgob3V0LCBhLCBiLCBjKSB7XG4gIHZhciBwID0gW10sXG4gICAgICByID0gW107IC8vVHJhbnNsYXRlIHBvaW50IHRvIHRoZSBvcmlnaW5cblxuICBwWzBdID0gYVswXSAtIGJbMF07XG4gIHBbMV0gPSBhWzFdIC0gYlsxXTtcbiAgcFsyXSA9IGFbMl0gLSBiWzJdOyAvL3BlcmZvcm0gcm90YXRpb25cblxuICByWzBdID0gcFswXTtcbiAgclsxXSA9IHBbMV0gKiBNYXRoLmNvcyhjKSAtIHBbMl0gKiBNYXRoLnNpbihjKTtcbiAgclsyXSA9IHBbMV0gKiBNYXRoLnNpbihjKSArIHBbMl0gKiBNYXRoLmNvcyhjKTsgLy90cmFuc2xhdGUgdG8gY29ycmVjdCBwb3NpdGlvblxuXG4gIG91dFswXSA9IHJbMF0gKyBiWzBdO1xuICBvdXRbMV0gPSByWzFdICsgYlsxXTtcbiAgb3V0WzJdID0gclsyXSArIGJbMl07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogUm90YXRlIGEgM0QgdmVjdG9yIGFyb3VuZCB0aGUgeS1heGlzXHJcbiAqIEBwYXJhbSB7dmVjM30gb3V0IFRoZSByZWNlaXZpbmcgdmVjM1xyXG4gKiBAcGFyYW0ge3ZlYzN9IGEgVGhlIHZlYzMgcG9pbnQgdG8gcm90YXRlXHJcbiAqIEBwYXJhbSB7dmVjM30gYiBUaGUgb3JpZ2luIG9mIHRoZSByb3RhdGlvblxyXG4gKiBAcGFyYW0ge051bWJlcn0gYyBUaGUgYW5nbGUgb2Ygcm90YXRpb25cclxuICogQHJldHVybnMge3ZlYzN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJvdGF0ZVkob3V0LCBhLCBiLCBjKSB7XG4gIHZhciBwID0gW10sXG4gICAgICByID0gW107IC8vVHJhbnNsYXRlIHBvaW50IHRvIHRoZSBvcmlnaW5cblxuICBwWzBdID0gYVswXSAtIGJbMF07XG4gIHBbMV0gPSBhWzFdIC0gYlsxXTtcbiAgcFsyXSA9IGFbMl0gLSBiWzJdOyAvL3BlcmZvcm0gcm90YXRpb25cblxuICByWzBdID0gcFsyXSAqIE1hdGguc2luKGMpICsgcFswXSAqIE1hdGguY29zKGMpO1xuICByWzFdID0gcFsxXTtcbiAgclsyXSA9IHBbMl0gKiBNYXRoLmNvcyhjKSAtIHBbMF0gKiBNYXRoLnNpbihjKTsgLy90cmFuc2xhdGUgdG8gY29ycmVjdCBwb3NpdGlvblxuXG4gIG91dFswXSA9IHJbMF0gKyBiWzBdO1xuICBvdXRbMV0gPSByWzFdICsgYlsxXTtcbiAgb3V0WzJdID0gclsyXSArIGJbMl07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogUm90YXRlIGEgM0QgdmVjdG9yIGFyb3VuZCB0aGUgei1heGlzXHJcbiAqIEBwYXJhbSB7dmVjM30gb3V0IFRoZSByZWNlaXZpbmcgdmVjM1xyXG4gKiBAcGFyYW0ge3ZlYzN9IGEgVGhlIHZlYzMgcG9pbnQgdG8gcm90YXRlXHJcbiAqIEBwYXJhbSB7dmVjM30gYiBUaGUgb3JpZ2luIG9mIHRoZSByb3RhdGlvblxyXG4gKiBAcGFyYW0ge051bWJlcn0gYyBUaGUgYW5nbGUgb2Ygcm90YXRpb25cclxuICogQHJldHVybnMge3ZlYzN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJvdGF0ZVoob3V0LCBhLCBiLCBjKSB7XG4gIHZhciBwID0gW10sXG4gICAgICByID0gW107IC8vVHJhbnNsYXRlIHBvaW50IHRvIHRoZSBvcmlnaW5cblxuICBwWzBdID0gYVswXSAtIGJbMF07XG4gIHBbMV0gPSBhWzFdIC0gYlsxXTtcbiAgcFsyXSA9IGFbMl0gLSBiWzJdOyAvL3BlcmZvcm0gcm90YXRpb25cblxuICByWzBdID0gcFswXSAqIE1hdGguY29zKGMpIC0gcFsxXSAqIE1hdGguc2luKGMpO1xuICByWzFdID0gcFswXSAqIE1hdGguc2luKGMpICsgcFsxXSAqIE1hdGguY29zKGMpO1xuICByWzJdID0gcFsyXTsgLy90cmFuc2xhdGUgdG8gY29ycmVjdCBwb3NpdGlvblxuXG4gIG91dFswXSA9IHJbMF0gKyBiWzBdO1xuICBvdXRbMV0gPSByWzFdICsgYlsxXTtcbiAgb3V0WzJdID0gclsyXSArIGJbMl07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogR2V0IHRoZSBhbmdsZSBiZXR3ZWVuIHR3byAzRCB2ZWN0b3JzXHJcbiAqIEBwYXJhbSB7dmVjM30gYSBUaGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge3ZlYzN9IGIgVGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IFRoZSBhbmdsZSBpbiByYWRpYW5zXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gYW5nbGUoYSwgYikge1xuICB2YXIgdGVtcEEgPSBmcm9tVmFsdWVzKGFbMF0sIGFbMV0sIGFbMl0pO1xuICB2YXIgdGVtcEIgPSBmcm9tVmFsdWVzKGJbMF0sIGJbMV0sIGJbMl0pO1xuICBub3JtYWxpemUodGVtcEEsIHRlbXBBKTtcbiAgbm9ybWFsaXplKHRlbXBCLCB0ZW1wQik7XG4gIHZhciBjb3NpbmUgPSBkb3QodGVtcEEsIHRlbXBCKTtcblxuICBpZiAoY29zaW5lID4gMS4wKSB7XG4gICAgcmV0dXJuIDA7XG4gIH0gZWxzZSBpZiAoY29zaW5lIDwgLTEuMCkge1xuICAgIHJldHVybiBNYXRoLlBJO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBNYXRoLmFjb3MoY29zaW5lKTtcbiAgfVxufVxuLyoqXHJcbiAqIFNldCB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzMgdG8gemVyb1xyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gemVybyhvdXQpIHtcbiAgb3V0WzBdID0gMC4wO1xuICBvdXRbMV0gPSAwLjA7XG4gIG91dFsyXSA9IDAuMDtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgdmVjdG9yXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjM30gYSB2ZWN0b3IgdG8gcmVwcmVzZW50IGFzIGEgc3RyaW5nXHJcbiAqIEByZXR1cm5zIHtTdHJpbmd9IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgdmVjdG9yXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc3RyKGEpIHtcbiAgcmV0dXJuICd2ZWMzKCcgKyBhWzBdICsgJywgJyArIGFbMV0gKyAnLCAnICsgYVsyXSArICcpJztcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSB2ZWN0b3JzIGhhdmUgZXhhY3RseSB0aGUgc2FtZSBlbGVtZW50cyBpbiB0aGUgc2FtZSBwb3NpdGlvbiAod2hlbiBjb21wYXJlZCB3aXRoID09PSlcclxuICpcclxuICogQHBhcmFtIHt2ZWMzfSBhIFRoZSBmaXJzdCB2ZWN0b3IuXHJcbiAqIEBwYXJhbSB7dmVjM30gYiBUaGUgc2Vjb25kIHZlY3Rvci5cclxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZlY3RvcnMgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZXhhY3RFcXVhbHMoYSwgYikge1xuICByZXR1cm4gYVswXSA9PT0gYlswXSAmJiBhWzFdID09PSBiWzFdICYmIGFbMl0gPT09IGJbMl07XG59XG4vKipcclxuICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgdmVjdG9ycyBoYXZlIGFwcHJveGltYXRlbHkgdGhlIHNhbWUgZWxlbWVudHMgaW4gdGhlIHNhbWUgcG9zaXRpb24uXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjM30gYSBUaGUgZmlyc3QgdmVjdG9yLlxyXG4gKiBAcGFyYW0ge3ZlYzN9IGIgVGhlIHNlY29uZCB2ZWN0b3IuXHJcbiAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSB2ZWN0b3JzIGFyZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGVxdWFscyhhLCBiKSB7XG4gIHZhciBhMCA9IGFbMF0sXG4gICAgICBhMSA9IGFbMV0sXG4gICAgICBhMiA9IGFbMl07XG4gIHZhciBiMCA9IGJbMF0sXG4gICAgICBiMSA9IGJbMV0sXG4gICAgICBiMiA9IGJbMl07XG4gIHJldHVybiBNYXRoLmFicyhhMCAtIGIwKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMCksIE1hdGguYWJzKGIwKSkgJiYgTWF0aC5hYnMoYTEgLSBiMSkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTEpLCBNYXRoLmFicyhiMSkpICYmIE1hdGguYWJzKGEyIC0gYjIpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGEyKSwgTWF0aC5hYnMoYjIpKTtcbn1cbi8qKlxyXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzMuc3VidHJhY3R9XHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IHZhciBzdWIgPSBzdWJ0cmFjdDtcbi8qKlxyXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzMubXVsdGlwbHl9XHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IHZhciBtdWwgPSBtdWx0aXBseTtcbi8qKlxyXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzMuZGl2aWRlfVxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCB2YXIgZGl2ID0gZGl2aWRlO1xuLyoqXHJcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMy5kaXN0YW5jZX1cclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIGRpc3QgPSBkaXN0YW5jZTtcbi8qKlxyXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzMuc3F1YXJlZERpc3RhbmNlfVxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCB2YXIgc3FyRGlzdCA9IHNxdWFyZWREaXN0YW5jZTtcbi8qKlxyXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzMubGVuZ3RofVxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCB2YXIgbGVuID0gbGVuZ3RoO1xuLyoqXHJcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMy5zcXVhcmVkTGVuZ3RofVxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCB2YXIgc3FyTGVuID0gc3F1YXJlZExlbmd0aDtcbi8qKlxyXG4gKiBQZXJmb3JtIHNvbWUgb3BlcmF0aW9uIG92ZXIgYW4gYXJyYXkgb2YgdmVjM3MuXHJcbiAqXHJcbiAqIEBwYXJhbSB7QXJyYXl9IGEgdGhlIGFycmF5IG9mIHZlY3RvcnMgdG8gaXRlcmF0ZSBvdmVyXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBzdHJpZGUgTnVtYmVyIG9mIGVsZW1lbnRzIGJldHdlZW4gdGhlIHN0YXJ0IG9mIGVhY2ggdmVjMy4gSWYgMCBhc3N1bWVzIHRpZ2h0bHkgcGFja2VkXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBvZmZzZXQgTnVtYmVyIG9mIGVsZW1lbnRzIHRvIHNraXAgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYXJyYXlcclxuICogQHBhcmFtIHtOdW1iZXJ9IGNvdW50IE51bWJlciBvZiB2ZWMzcyB0byBpdGVyYXRlIG92ZXIuIElmIDAgaXRlcmF0ZXMgb3ZlciBlbnRpcmUgYXJyYXlcclxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gRnVuY3Rpb24gdG8gY2FsbCBmb3IgZWFjaCB2ZWN0b3IgaW4gdGhlIGFycmF5XHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBbYXJnXSBhZGRpdGlvbmFsIGFyZ3VtZW50IHRvIHBhc3MgdG8gZm5cclxuICogQHJldHVybnMge0FycmF5fSBhXHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IHZhciBmb3JFYWNoID0gZnVuY3Rpb24gKCkge1xuICB2YXIgdmVjID0gY3JlYXRlKCk7XG4gIHJldHVybiBmdW5jdGlvbiAoYSwgc3RyaWRlLCBvZmZzZXQsIGNvdW50LCBmbiwgYXJnKSB7XG4gICAgdmFyIGksIGw7XG5cbiAgICBpZiAoIXN0cmlkZSkge1xuICAgICAgc3RyaWRlID0gMztcbiAgICB9XG5cbiAgICBpZiAoIW9mZnNldCkge1xuICAgICAgb2Zmc2V0ID0gMDtcbiAgICB9XG5cbiAgICBpZiAoY291bnQpIHtcbiAgICAgIGwgPSBNYXRoLm1pbihjb3VudCAqIHN0cmlkZSArIG9mZnNldCwgYS5sZW5ndGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsID0gYS5sZW5ndGg7XG4gICAgfVxuXG4gICAgZm9yIChpID0gb2Zmc2V0OyBpIDwgbDsgaSArPSBzdHJpZGUpIHtcbiAgICAgIHZlY1swXSA9IGFbaV07XG4gICAgICB2ZWNbMV0gPSBhW2kgKyAxXTtcbiAgICAgIHZlY1syXSA9IGFbaSArIDJdO1xuICAgICAgZm4odmVjLCB2ZWMsIGFyZyk7XG4gICAgICBhW2ldID0gdmVjWzBdO1xuICAgICAgYVtpICsgMV0gPSB2ZWNbMV07XG4gICAgICBhW2kgKyAyXSA9IHZlY1syXTtcbiAgICB9XG5cbiAgICByZXR1cm4gYTtcbiAgfTtcbn0oKTsiLCJpbXBvcnQgKiBhcyBnbE1hdHJpeCBmcm9tIFwiLi9jb21tb24uanNcIjtcbi8qKlxyXG4gKiA0IERpbWVuc2lvbmFsIFZlY3RvclxyXG4gKiBAbW9kdWxlIHZlYzRcclxuICovXG5cbi8qKlxyXG4gKiBDcmVhdGVzIGEgbmV3LCBlbXB0eSB2ZWM0XHJcbiAqXHJcbiAqIEByZXR1cm5zIHt2ZWM0fSBhIG5ldyA0RCB2ZWN0b3JcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGUoKSB7XG4gIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSg0KTtcblxuICBpZiAoZ2xNYXRyaXguQVJSQVlfVFlQRSAhPSBGbG9hdDMyQXJyYXkpIHtcbiAgICBvdXRbMF0gPSAwO1xuICAgIG91dFsxXSA9IDA7XG4gICAgb3V0WzJdID0gMDtcbiAgICBvdXRbM10gPSAwO1xuICB9XG5cbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDcmVhdGVzIGEgbmV3IHZlYzQgaW5pdGlhbGl6ZWQgd2l0aCB2YWx1ZXMgZnJvbSBhbiBleGlzdGluZyB2ZWN0b3JcclxuICpcclxuICogQHBhcmFtIHt2ZWM0fSBhIHZlY3RvciB0byBjbG9uZVxyXG4gKiBAcmV0dXJucyB7dmVjNH0gYSBuZXcgNEQgdmVjdG9yXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY2xvbmUoYSkge1xuICB2YXIgb3V0ID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoNCk7XG4gIG91dFswXSA9IGFbMF07XG4gIG91dFsxXSA9IGFbMV07XG4gIG91dFsyXSA9IGFbMl07XG4gIG91dFszXSA9IGFbM107XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ3JlYXRlcyBhIG5ldyB2ZWM0IGluaXRpYWxpemVkIHdpdGggdGhlIGdpdmVuIHZhbHVlc1xyXG4gKlxyXG4gKiBAcGFyYW0ge051bWJlcn0geCBYIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0ge051bWJlcn0geSBZIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0ge051bWJlcn0geiBaIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0ge051bWJlcn0gdyBXIGNvbXBvbmVudFxyXG4gKiBAcmV0dXJucyB7dmVjNH0gYSBuZXcgNEQgdmVjdG9yXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVZhbHVlcyh4LCB5LCB6LCB3KSB7XG4gIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSg0KTtcbiAgb3V0WzBdID0geDtcbiAgb3V0WzFdID0geTtcbiAgb3V0WzJdID0gejtcbiAgb3V0WzNdID0gdztcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDb3B5IHRoZSB2YWx1ZXMgZnJvbSBvbmUgdmVjNCB0byBhbm90aGVyXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7dmVjNH0gYSB0aGUgc291cmNlIHZlY3RvclxyXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY29weShvdXQsIGEpIHtcbiAgb3V0WzBdID0gYVswXTtcbiAgb3V0WzFdID0gYVsxXTtcbiAgb3V0WzJdID0gYVsyXTtcbiAgb3V0WzNdID0gYVszXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBTZXQgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWM0IHRvIHRoZSBnaXZlbiB2YWx1ZXNcclxuICpcclxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtOdW1iZXJ9IHggWCBjb21wb25lbnRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHkgWSBjb21wb25lbnRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHogWiBjb21wb25lbnRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHcgVyBjb21wb25lbnRcclxuICogQHJldHVybnMge3ZlYzR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHNldChvdXQsIHgsIHksIHosIHcpIHtcbiAgb3V0WzBdID0geDtcbiAgb3V0WzFdID0geTtcbiAgb3V0WzJdID0gejtcbiAgb3V0WzNdID0gdztcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBBZGRzIHR3byB2ZWM0J3NcclxuICpcclxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHt2ZWM0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7dmVjNH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge3ZlYzR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGFkZChvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSArIGJbMF07XG4gIG91dFsxXSA9IGFbMV0gKyBiWzFdO1xuICBvdXRbMl0gPSBhWzJdICsgYlsyXTtcbiAgb3V0WzNdID0gYVszXSArIGJbM107XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogU3VidHJhY3RzIHZlY3RvciBiIGZyb20gdmVjdG9yIGFcclxuICpcclxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHt2ZWM0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7dmVjNH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge3ZlYzR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHN1YnRyYWN0KG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBhWzBdIC0gYlswXTtcbiAgb3V0WzFdID0gYVsxXSAtIGJbMV07XG4gIG91dFsyXSA9IGFbMl0gLSBiWzJdO1xuICBvdXRbM10gPSBhWzNdIC0gYlszXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBNdWx0aXBsaWVzIHR3byB2ZWM0J3NcclxuICpcclxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHt2ZWM0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7dmVjNH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge3ZlYzR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG11bHRpcGx5KG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBhWzBdICogYlswXTtcbiAgb3V0WzFdID0gYVsxXSAqIGJbMV07XG4gIG91dFsyXSA9IGFbMl0gKiBiWzJdO1xuICBvdXRbM10gPSBhWzNdICogYlszXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBEaXZpZGVzIHR3byB2ZWM0J3NcclxuICpcclxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHt2ZWM0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7dmVjNH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge3ZlYzR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGRpdmlkZShvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSAvIGJbMF07XG4gIG91dFsxXSA9IGFbMV0gLyBiWzFdO1xuICBvdXRbMl0gPSBhWzJdIC8gYlsyXTtcbiAgb3V0WzNdID0gYVszXSAvIGJbM107XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogTWF0aC5jZWlsIHRoZSBjb21wb25lbnRzIG9mIGEgdmVjNFxyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge3ZlYzR9IGEgdmVjdG9yIHRvIGNlaWxcclxuICogQHJldHVybnMge3ZlYzR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNlaWwob3V0LCBhKSB7XG4gIG91dFswXSA9IE1hdGguY2VpbChhWzBdKTtcbiAgb3V0WzFdID0gTWF0aC5jZWlsKGFbMV0pO1xuICBvdXRbMl0gPSBNYXRoLmNlaWwoYVsyXSk7XG4gIG91dFszXSA9IE1hdGguY2VpbChhWzNdKTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBNYXRoLmZsb29yIHRoZSBjb21wb25lbnRzIG9mIGEgdmVjNFxyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge3ZlYzR9IGEgdmVjdG9yIHRvIGZsb29yXHJcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmbG9vcihvdXQsIGEpIHtcbiAgb3V0WzBdID0gTWF0aC5mbG9vcihhWzBdKTtcbiAgb3V0WzFdID0gTWF0aC5mbG9vcihhWzFdKTtcbiAgb3V0WzJdID0gTWF0aC5mbG9vcihhWzJdKTtcbiAgb3V0WzNdID0gTWF0aC5mbG9vcihhWzNdKTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBtaW5pbXVtIG9mIHR3byB2ZWM0J3NcclxuICpcclxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHt2ZWM0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7dmVjNH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge3ZlYzR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG1pbihvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gTWF0aC5taW4oYVswXSwgYlswXSk7XG4gIG91dFsxXSA9IE1hdGgubWluKGFbMV0sIGJbMV0pO1xuICBvdXRbMl0gPSBNYXRoLm1pbihhWzJdLCBiWzJdKTtcbiAgb3V0WzNdID0gTWF0aC5taW4oYVszXSwgYlszXSk7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogUmV0dXJucyB0aGUgbWF4aW11bSBvZiB0d28gdmVjNCdzXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7dmVjNH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge3ZlYzR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBtYXgob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IE1hdGgubWF4KGFbMF0sIGJbMF0pO1xuICBvdXRbMV0gPSBNYXRoLm1heChhWzFdLCBiWzFdKTtcbiAgb3V0WzJdID0gTWF0aC5tYXgoYVsyXSwgYlsyXSk7XG4gIG91dFszXSA9IE1hdGgubWF4KGFbM10sIGJbM10pO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIE1hdGgucm91bmQgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWM0XHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7dmVjNH0gYSB2ZWN0b3IgdG8gcm91bmRcclxuICogQHJldHVybnMge3ZlYzR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJvdW5kKG91dCwgYSkge1xuICBvdXRbMF0gPSBNYXRoLnJvdW5kKGFbMF0pO1xuICBvdXRbMV0gPSBNYXRoLnJvdW5kKGFbMV0pO1xuICBvdXRbMl0gPSBNYXRoLnJvdW5kKGFbMl0pO1xuICBvdXRbM10gPSBNYXRoLnJvdW5kKGFbM10pO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFNjYWxlcyBhIHZlYzQgYnkgYSBzY2FsYXIgbnVtYmVyXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7dmVjNH0gYSB0aGUgdmVjdG9yIHRvIHNjYWxlXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBiIGFtb3VudCB0byBzY2FsZSB0aGUgdmVjdG9yIGJ5XHJcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzY2FsZShvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSAqIGI7XG4gIG91dFsxXSA9IGFbMV0gKiBiO1xuICBvdXRbMl0gPSBhWzJdICogYjtcbiAgb3V0WzNdID0gYVszXSAqIGI7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQWRkcyB0d28gdmVjNCdzIGFmdGVyIHNjYWxpbmcgdGhlIHNlY29uZCBvcGVyYW5kIGJ5IGEgc2NhbGFyIHZhbHVlXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7dmVjNH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge3ZlYzR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBzY2FsZSB0aGUgYW1vdW50IHRvIHNjYWxlIGIgYnkgYmVmb3JlIGFkZGluZ1xyXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc2NhbGVBbmRBZGQob3V0LCBhLCBiLCBzY2FsZSkge1xuICBvdXRbMF0gPSBhWzBdICsgYlswXSAqIHNjYWxlO1xuICBvdXRbMV0gPSBhWzFdICsgYlsxXSAqIHNjYWxlO1xuICBvdXRbMl0gPSBhWzJdICsgYlsyXSAqIHNjYWxlO1xuICBvdXRbM10gPSBhWzNdICsgYlszXSAqIHNjYWxlO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENhbGN1bGF0ZXMgdGhlIGV1Y2xpZGlhbiBkaXN0YW5jZSBiZXR3ZWVuIHR3byB2ZWM0J3NcclxuICpcclxuICogQHBhcmFtIHt2ZWM0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7dmVjNH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge051bWJlcn0gZGlzdGFuY2UgYmV0d2VlbiBhIGFuZCBiXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZGlzdGFuY2UoYSwgYikge1xuICB2YXIgeCA9IGJbMF0gLSBhWzBdO1xuICB2YXIgeSA9IGJbMV0gLSBhWzFdO1xuICB2YXIgeiA9IGJbMl0gLSBhWzJdO1xuICB2YXIgdyA9IGJbM10gLSBhWzNdO1xuICByZXR1cm4gTWF0aC5zcXJ0KHggKiB4ICsgeSAqIHkgKyB6ICogeiArIHcgKiB3KTtcbn1cbi8qKlxyXG4gKiBDYWxjdWxhdGVzIHRoZSBzcXVhcmVkIGV1Y2xpZGlhbiBkaXN0YW5jZSBiZXR3ZWVuIHR3byB2ZWM0J3NcclxuICpcclxuICogQHBhcmFtIHt2ZWM0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7dmVjNH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge051bWJlcn0gc3F1YXJlZCBkaXN0YW5jZSBiZXR3ZWVuIGEgYW5kIGJcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzcXVhcmVkRGlzdGFuY2UoYSwgYikge1xuICB2YXIgeCA9IGJbMF0gLSBhWzBdO1xuICB2YXIgeSA9IGJbMV0gLSBhWzFdO1xuICB2YXIgeiA9IGJbMl0gLSBhWzJdO1xuICB2YXIgdyA9IGJbM10gLSBhWzNdO1xuICByZXR1cm4geCAqIHggKyB5ICogeSArIHogKiB6ICsgdyAqIHc7XG59XG4vKipcclxuICogQ2FsY3VsYXRlcyB0aGUgbGVuZ3RoIG9mIGEgdmVjNFxyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzR9IGEgdmVjdG9yIHRvIGNhbGN1bGF0ZSBsZW5ndGggb2ZcclxuICogQHJldHVybnMge051bWJlcn0gbGVuZ3RoIG9mIGFcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBsZW5ndGgoYSkge1xuICB2YXIgeCA9IGFbMF07XG4gIHZhciB5ID0gYVsxXTtcbiAgdmFyIHogPSBhWzJdO1xuICB2YXIgdyA9IGFbM107XG4gIHJldHVybiBNYXRoLnNxcnQoeCAqIHggKyB5ICogeSArIHogKiB6ICsgdyAqIHcpO1xufVxuLyoqXHJcbiAqIENhbGN1bGF0ZXMgdGhlIHNxdWFyZWQgbGVuZ3RoIG9mIGEgdmVjNFxyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzR9IGEgdmVjdG9yIHRvIGNhbGN1bGF0ZSBzcXVhcmVkIGxlbmd0aCBvZlxyXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBzcXVhcmVkIGxlbmd0aCBvZiBhXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc3F1YXJlZExlbmd0aChhKSB7XG4gIHZhciB4ID0gYVswXTtcbiAgdmFyIHkgPSBhWzFdO1xuICB2YXIgeiA9IGFbMl07XG4gIHZhciB3ID0gYVszXTtcbiAgcmV0dXJuIHggKiB4ICsgeSAqIHkgKyB6ICogeiArIHcgKiB3O1xufVxuLyoqXHJcbiAqIE5lZ2F0ZXMgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWM0XHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7dmVjNH0gYSB2ZWN0b3IgdG8gbmVnYXRlXHJcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBuZWdhdGUob3V0LCBhKSB7XG4gIG91dFswXSA9IC1hWzBdO1xuICBvdXRbMV0gPSAtYVsxXTtcbiAgb3V0WzJdID0gLWFbMl07XG4gIG91dFszXSA9IC1hWzNdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFJldHVybnMgdGhlIGludmVyc2Ugb2YgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWM0XHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7dmVjNH0gYSB2ZWN0b3IgdG8gaW52ZXJ0XHJcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBpbnZlcnNlKG91dCwgYSkge1xuICBvdXRbMF0gPSAxLjAgLyBhWzBdO1xuICBvdXRbMV0gPSAxLjAgLyBhWzFdO1xuICBvdXRbMl0gPSAxLjAgLyBhWzJdO1xuICBvdXRbM10gPSAxLjAgLyBhWzNdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIE5vcm1hbGl6ZSBhIHZlYzRcclxuICpcclxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHt2ZWM0fSBhIHZlY3RvciB0byBub3JtYWxpemVcclxuICogQHJldHVybnMge3ZlYzR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZShvdXQsIGEpIHtcbiAgdmFyIHggPSBhWzBdO1xuICB2YXIgeSA9IGFbMV07XG4gIHZhciB6ID0gYVsyXTtcbiAgdmFyIHcgPSBhWzNdO1xuICB2YXIgbGVuID0geCAqIHggKyB5ICogeSArIHogKiB6ICsgdyAqIHc7XG5cbiAgaWYgKGxlbiA+IDApIHtcbiAgICBsZW4gPSAxIC8gTWF0aC5zcXJ0KGxlbik7XG4gIH1cblxuICBvdXRbMF0gPSB4ICogbGVuO1xuICBvdXRbMV0gPSB5ICogbGVuO1xuICBvdXRbMl0gPSB6ICogbGVuO1xuICBvdXRbM10gPSB3ICogbGVuO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENhbGN1bGF0ZXMgdGhlIGRvdCBwcm9kdWN0IG9mIHR3byB2ZWM0J3NcclxuICpcclxuICogQHBhcmFtIHt2ZWM0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7dmVjNH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge051bWJlcn0gZG90IHByb2R1Y3Qgb2YgYSBhbmQgYlxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGRvdChhLCBiKSB7XG4gIHJldHVybiBhWzBdICogYlswXSArIGFbMV0gKiBiWzFdICsgYVsyXSAqIGJbMl0gKyBhWzNdICogYlszXTtcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBjcm9zcy1wcm9kdWN0IG9mIHRocmVlIHZlY3RvcnMgaW4gYSA0LWRpbWVuc2lvbmFsIHNwYWNlXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjNH0gcmVzdWx0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7dmVjNH0gVSB0aGUgZmlyc3QgdmVjdG9yXHJcbiAqIEBwYXJhbSB7dmVjNH0gViB0aGUgc2Vjb25kIHZlY3RvclxyXG4gKiBAcGFyYW0ge3ZlYzR9IFcgdGhlIHRoaXJkIHZlY3RvclxyXG4gKiBAcmV0dXJucyB7dmVjNH0gcmVzdWx0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY3Jvc3Mob3V0LCB1LCB2LCB3KSB7XG4gIHZhciBBID0gdlswXSAqIHdbMV0gLSB2WzFdICogd1swXSxcbiAgICAgIEIgPSB2WzBdICogd1syXSAtIHZbMl0gKiB3WzBdLFxuICAgICAgQyA9IHZbMF0gKiB3WzNdIC0gdlszXSAqIHdbMF0sXG4gICAgICBEID0gdlsxXSAqIHdbMl0gLSB2WzJdICogd1sxXSxcbiAgICAgIEUgPSB2WzFdICogd1szXSAtIHZbM10gKiB3WzFdLFxuICAgICAgRiA9IHZbMl0gKiB3WzNdIC0gdlszXSAqIHdbMl07XG4gIHZhciBHID0gdVswXTtcbiAgdmFyIEggPSB1WzFdO1xuICB2YXIgSSA9IHVbMl07XG4gIHZhciBKID0gdVszXTtcbiAgb3V0WzBdID0gSCAqIEYgLSBJICogRSArIEogKiBEO1xuICBvdXRbMV0gPSAtKEcgKiBGKSArIEkgKiBDIC0gSiAqIEI7XG4gIG91dFsyXSA9IEcgKiBFIC0gSCAqIEMgKyBKICogQTtcbiAgb3V0WzNdID0gLShHICogRCkgKyBIICogQiAtIEkgKiBBO1xuICByZXR1cm4gb3V0O1xufVxuO1xuLyoqXHJcbiAqIFBlcmZvcm1zIGEgbGluZWFyIGludGVycG9sYXRpb24gYmV0d2VlbiB0d28gdmVjNCdzXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7dmVjNH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge3ZlYzR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSB0IGludGVycG9sYXRpb24gYW1vdW50LCBpbiB0aGUgcmFuZ2UgWzAtMV0sIGJldHdlZW4gdGhlIHR3byBpbnB1dHNcclxuICogQHJldHVybnMge3ZlYzR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGxlcnAob3V0LCBhLCBiLCB0KSB7XG4gIHZhciBheCA9IGFbMF07XG4gIHZhciBheSA9IGFbMV07XG4gIHZhciBheiA9IGFbMl07XG4gIHZhciBhdyA9IGFbM107XG4gIG91dFswXSA9IGF4ICsgdCAqIChiWzBdIC0gYXgpO1xuICBvdXRbMV0gPSBheSArIHQgKiAoYlsxXSAtIGF5KTtcbiAgb3V0WzJdID0gYXogKyB0ICogKGJbMl0gLSBheik7XG4gIG91dFszXSA9IGF3ICsgdCAqIChiWzNdIC0gYXcpO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIEdlbmVyYXRlcyBhIHJhbmRvbSB2ZWN0b3Igd2l0aCB0aGUgZ2l2ZW4gc2NhbGVcclxuICpcclxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtOdW1iZXJ9IFtzY2FsZV0gTGVuZ3RoIG9mIHRoZSByZXN1bHRpbmcgdmVjdG9yLiBJZiBvbW1pdHRlZCwgYSB1bml0IHZlY3RvciB3aWxsIGJlIHJldHVybmVkXHJcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiByYW5kb20ob3V0LCBzY2FsZSkge1xuICBzY2FsZSA9IHNjYWxlIHx8IDEuMDsgLy8gTWFyc2FnbGlhLCBHZW9yZ2UuIENob29zaW5nIGEgUG9pbnQgZnJvbSB0aGUgU3VyZmFjZSBvZiBhXG4gIC8vIFNwaGVyZS4gQW5uLiBNYXRoLiBTdGF0aXN0LiA0MyAoMTk3MiksIG5vLiAyLCA2NDUtLTY0Ni5cbiAgLy8gaHR0cDovL3Byb2plY3RldWNsaWQub3JnL2V1Y2xpZC5hb21zLzExNzc2OTI2NDQ7XG5cbiAgdmFyIHYxLCB2MiwgdjMsIHY0O1xuICB2YXIgczEsIHMyO1xuXG4gIGRvIHtcbiAgICB2MSA9IGdsTWF0cml4LlJBTkRPTSgpICogMiAtIDE7XG4gICAgdjIgPSBnbE1hdHJpeC5SQU5ET00oKSAqIDIgLSAxO1xuICAgIHMxID0gdjEgKiB2MSArIHYyICogdjI7XG4gIH0gd2hpbGUgKHMxID49IDEpO1xuXG4gIGRvIHtcbiAgICB2MyA9IGdsTWF0cml4LlJBTkRPTSgpICogMiAtIDE7XG4gICAgdjQgPSBnbE1hdHJpeC5SQU5ET00oKSAqIDIgLSAxO1xuICAgIHMyID0gdjMgKiB2MyArIHY0ICogdjQ7XG4gIH0gd2hpbGUgKHMyID49IDEpO1xuXG4gIHZhciBkID0gTWF0aC5zcXJ0KCgxIC0gczEpIC8gczIpO1xuICBvdXRbMF0gPSBzY2FsZSAqIHYxO1xuICBvdXRbMV0gPSBzY2FsZSAqIHYyO1xuICBvdXRbMl0gPSBzY2FsZSAqIHYzICogZDtcbiAgb3V0WzNdID0gc2NhbGUgKiB2NCAqIGQ7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogVHJhbnNmb3JtcyB0aGUgdmVjNCB3aXRoIGEgbWF0NC5cclxuICpcclxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHt2ZWM0fSBhIHRoZSB2ZWN0b3IgdG8gdHJhbnNmb3JtXHJcbiAqIEBwYXJhbSB7bWF0NH0gbSBtYXRyaXggdG8gdHJhbnNmb3JtIHdpdGhcclxuICogQHJldHVybnMge3ZlYzR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zZm9ybU1hdDQob3V0LCBhLCBtKSB7XG4gIHZhciB4ID0gYVswXSxcbiAgICAgIHkgPSBhWzFdLFxuICAgICAgeiA9IGFbMl0sXG4gICAgICB3ID0gYVszXTtcbiAgb3V0WzBdID0gbVswXSAqIHggKyBtWzRdICogeSArIG1bOF0gKiB6ICsgbVsxMl0gKiB3O1xuICBvdXRbMV0gPSBtWzFdICogeCArIG1bNV0gKiB5ICsgbVs5XSAqIHogKyBtWzEzXSAqIHc7XG4gIG91dFsyXSA9IG1bMl0gKiB4ICsgbVs2XSAqIHkgKyBtWzEwXSAqIHogKyBtWzE0XSAqIHc7XG4gIG91dFszXSA9IG1bM10gKiB4ICsgbVs3XSAqIHkgKyBtWzExXSAqIHogKyBtWzE1XSAqIHc7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogVHJhbnNmb3JtcyB0aGUgdmVjNCB3aXRoIGEgcXVhdFxyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge3ZlYzR9IGEgdGhlIHZlY3RvciB0byB0cmFuc2Zvcm1cclxuICogQHBhcmFtIHtxdWF0fSBxIHF1YXRlcm5pb24gdG8gdHJhbnNmb3JtIHdpdGhcclxuICogQHJldHVybnMge3ZlYzR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zZm9ybVF1YXQob3V0LCBhLCBxKSB7XG4gIHZhciB4ID0gYVswXSxcbiAgICAgIHkgPSBhWzFdLFxuICAgICAgeiA9IGFbMl07XG4gIHZhciBxeCA9IHFbMF0sXG4gICAgICBxeSA9IHFbMV0sXG4gICAgICBxeiA9IHFbMl0sXG4gICAgICBxdyA9IHFbM107IC8vIGNhbGN1bGF0ZSBxdWF0ICogdmVjXG5cbiAgdmFyIGl4ID0gcXcgKiB4ICsgcXkgKiB6IC0gcXogKiB5O1xuICB2YXIgaXkgPSBxdyAqIHkgKyBxeiAqIHggLSBxeCAqIHo7XG4gIHZhciBpeiA9IHF3ICogeiArIHF4ICogeSAtIHF5ICogeDtcbiAgdmFyIGl3ID0gLXF4ICogeCAtIHF5ICogeSAtIHF6ICogejsgLy8gY2FsY3VsYXRlIHJlc3VsdCAqIGludmVyc2UgcXVhdFxuXG4gIG91dFswXSA9IGl4ICogcXcgKyBpdyAqIC1xeCArIGl5ICogLXF6IC0gaXogKiAtcXk7XG4gIG91dFsxXSA9IGl5ICogcXcgKyBpdyAqIC1xeSArIGl6ICogLXF4IC0gaXggKiAtcXo7XG4gIG91dFsyXSA9IGl6ICogcXcgKyBpdyAqIC1xeiArIGl4ICogLXF5IC0gaXkgKiAtcXg7XG4gIG91dFszXSA9IGFbM107XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogU2V0IHRoZSBjb21wb25lbnRzIG9mIGEgdmVjNCB0byB6ZXJvXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB6ZXJvKG91dCkge1xuICBvdXRbMF0gPSAwLjA7XG4gIG91dFsxXSA9IDAuMDtcbiAgb3V0WzJdID0gMC4wO1xuICBvdXRbM10gPSAwLjA7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIHZlY3RvclxyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzR9IGEgdmVjdG9yIHRvIHJlcHJlc2VudCBhcyBhIHN0cmluZ1xyXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHZlY3RvclxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHN0cihhKSB7XG4gIHJldHVybiAndmVjNCgnICsgYVswXSArICcsICcgKyBhWzFdICsgJywgJyArIGFbMl0gKyAnLCAnICsgYVszXSArICcpJztcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSB2ZWN0b3JzIGhhdmUgZXhhY3RseSB0aGUgc2FtZSBlbGVtZW50cyBpbiB0aGUgc2FtZSBwb3NpdGlvbiAod2hlbiBjb21wYXJlZCB3aXRoID09PSlcclxuICpcclxuICogQHBhcmFtIHt2ZWM0fSBhIFRoZSBmaXJzdCB2ZWN0b3IuXHJcbiAqIEBwYXJhbSB7dmVjNH0gYiBUaGUgc2Vjb25kIHZlY3Rvci5cclxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZlY3RvcnMgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZXhhY3RFcXVhbHMoYSwgYikge1xuICByZXR1cm4gYVswXSA9PT0gYlswXSAmJiBhWzFdID09PSBiWzFdICYmIGFbMl0gPT09IGJbMl0gJiYgYVszXSA9PT0gYlszXTtcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSB2ZWN0b3JzIGhhdmUgYXBwcm94aW1hdGVseSB0aGUgc2FtZSBlbGVtZW50cyBpbiB0aGUgc2FtZSBwb3NpdGlvbi5cclxuICpcclxuICogQHBhcmFtIHt2ZWM0fSBhIFRoZSBmaXJzdCB2ZWN0b3IuXHJcbiAqIEBwYXJhbSB7dmVjNH0gYiBUaGUgc2Vjb25kIHZlY3Rvci5cclxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZlY3RvcnMgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZXF1YWxzKGEsIGIpIHtcbiAgdmFyIGEwID0gYVswXSxcbiAgICAgIGExID0gYVsxXSxcbiAgICAgIGEyID0gYVsyXSxcbiAgICAgIGEzID0gYVszXTtcbiAgdmFyIGIwID0gYlswXSxcbiAgICAgIGIxID0gYlsxXSxcbiAgICAgIGIyID0gYlsyXSxcbiAgICAgIGIzID0gYlszXTtcbiAgcmV0dXJuIE1hdGguYWJzKGEwIC0gYjApIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGEwKSwgTWF0aC5hYnMoYjApKSAmJiBNYXRoLmFicyhhMSAtIGIxKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMSksIE1hdGguYWJzKGIxKSkgJiYgTWF0aC5hYnMoYTIgLSBiMikgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTIpLCBNYXRoLmFicyhiMikpICYmIE1hdGguYWJzKGEzIC0gYjMpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGEzKSwgTWF0aC5hYnMoYjMpKTtcbn1cbi8qKlxyXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzQuc3VidHJhY3R9XHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IHZhciBzdWIgPSBzdWJ0cmFjdDtcbi8qKlxyXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzQubXVsdGlwbHl9XHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IHZhciBtdWwgPSBtdWx0aXBseTtcbi8qKlxyXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzQuZGl2aWRlfVxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCB2YXIgZGl2ID0gZGl2aWRlO1xuLyoqXHJcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjNC5kaXN0YW5jZX1cclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIGRpc3QgPSBkaXN0YW5jZTtcbi8qKlxyXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzQuc3F1YXJlZERpc3RhbmNlfVxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCB2YXIgc3FyRGlzdCA9IHNxdWFyZWREaXN0YW5jZTtcbi8qKlxyXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzQubGVuZ3RofVxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCB2YXIgbGVuID0gbGVuZ3RoO1xuLyoqXHJcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjNC5zcXVhcmVkTGVuZ3RofVxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCB2YXIgc3FyTGVuID0gc3F1YXJlZExlbmd0aDtcbi8qKlxyXG4gKiBQZXJmb3JtIHNvbWUgb3BlcmF0aW9uIG92ZXIgYW4gYXJyYXkgb2YgdmVjNHMuXHJcbiAqXHJcbiAqIEBwYXJhbSB7QXJyYXl9IGEgdGhlIGFycmF5IG9mIHZlY3RvcnMgdG8gaXRlcmF0ZSBvdmVyXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBzdHJpZGUgTnVtYmVyIG9mIGVsZW1lbnRzIGJldHdlZW4gdGhlIHN0YXJ0IG9mIGVhY2ggdmVjNC4gSWYgMCBhc3N1bWVzIHRpZ2h0bHkgcGFja2VkXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBvZmZzZXQgTnVtYmVyIG9mIGVsZW1lbnRzIHRvIHNraXAgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYXJyYXlcclxuICogQHBhcmFtIHtOdW1iZXJ9IGNvdW50IE51bWJlciBvZiB2ZWM0cyB0byBpdGVyYXRlIG92ZXIuIElmIDAgaXRlcmF0ZXMgb3ZlciBlbnRpcmUgYXJyYXlcclxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gRnVuY3Rpb24gdG8gY2FsbCBmb3IgZWFjaCB2ZWN0b3IgaW4gdGhlIGFycmF5XHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBbYXJnXSBhZGRpdGlvbmFsIGFyZ3VtZW50IHRvIHBhc3MgdG8gZm5cclxuICogQHJldHVybnMge0FycmF5fSBhXHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IHZhciBmb3JFYWNoID0gZnVuY3Rpb24gKCkge1xuICB2YXIgdmVjID0gY3JlYXRlKCk7XG4gIHJldHVybiBmdW5jdGlvbiAoYSwgc3RyaWRlLCBvZmZzZXQsIGNvdW50LCBmbiwgYXJnKSB7XG4gICAgdmFyIGksIGw7XG5cbiAgICBpZiAoIXN0cmlkZSkge1xuICAgICAgc3RyaWRlID0gNDtcbiAgICB9XG5cbiAgICBpZiAoIW9mZnNldCkge1xuICAgICAgb2Zmc2V0ID0gMDtcbiAgICB9XG5cbiAgICBpZiAoY291bnQpIHtcbiAgICAgIGwgPSBNYXRoLm1pbihjb3VudCAqIHN0cmlkZSArIG9mZnNldCwgYS5sZW5ndGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsID0gYS5sZW5ndGg7XG4gICAgfVxuXG4gICAgZm9yIChpID0gb2Zmc2V0OyBpIDwgbDsgaSArPSBzdHJpZGUpIHtcbiAgICAgIHZlY1swXSA9IGFbaV07XG4gICAgICB2ZWNbMV0gPSBhW2kgKyAxXTtcbiAgICAgIHZlY1syXSA9IGFbaSArIDJdO1xuICAgICAgdmVjWzNdID0gYVtpICsgM107XG4gICAgICBmbih2ZWMsIHZlYywgYXJnKTtcbiAgICAgIGFbaV0gPSB2ZWNbMF07XG4gICAgICBhW2kgKyAxXSA9IHZlY1sxXTtcbiAgICAgIGFbaSArIDJdID0gdmVjWzJdO1xuICAgICAgYVtpICsgM10gPSB2ZWNbM107XG4gICAgfVxuXG4gICAgcmV0dXJuIGE7XG4gIH07XG59KCk7IiwiaW1wb3J0ICogYXMgZ2xNYXRyaXggZnJvbSBcIi4vY29tbW9uLmpzXCI7XG5pbXBvcnQgKiBhcyBtYXQzIGZyb20gXCIuL21hdDMuanNcIjtcbmltcG9ydCAqIGFzIHZlYzMgZnJvbSBcIi4vdmVjMy5qc1wiO1xuaW1wb3J0ICogYXMgdmVjNCBmcm9tIFwiLi92ZWM0LmpzXCI7XG4vKipcclxuICogUXVhdGVybmlvblxyXG4gKiBAbW9kdWxlIHF1YXRcclxuICovXG5cbi8qKlxyXG4gKiBDcmVhdGVzIGEgbmV3IGlkZW50aXR5IHF1YXRcclxuICpcclxuICogQHJldHVybnMge3F1YXR9IGEgbmV3IHF1YXRlcm5pb25cclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGUoKSB7XG4gIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSg0KTtcblxuICBpZiAoZ2xNYXRyaXguQVJSQVlfVFlQRSAhPSBGbG9hdDMyQXJyYXkpIHtcbiAgICBvdXRbMF0gPSAwO1xuICAgIG91dFsxXSA9IDA7XG4gICAgb3V0WzJdID0gMDtcbiAgfVxuXG4gIG91dFszXSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogU2V0IGEgcXVhdCB0byB0aGUgaWRlbnRpdHkgcXVhdGVybmlvblxyXG4gKlxyXG4gKiBAcGFyYW0ge3F1YXR9IG91dCB0aGUgcmVjZWl2aW5nIHF1YXRlcm5pb25cclxuICogQHJldHVybnMge3F1YXR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGlkZW50aXR5KG91dCkge1xuICBvdXRbMF0gPSAwO1xuICBvdXRbMV0gPSAwO1xuICBvdXRbMl0gPSAwO1xuICBvdXRbM10gPSAxO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFNldHMgYSBxdWF0IGZyb20gdGhlIGdpdmVuIGFuZ2xlIGFuZCByb3RhdGlvbiBheGlzLFxyXG4gKiB0aGVuIHJldHVybnMgaXQuXHJcbiAqXHJcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvblxyXG4gKiBAcGFyYW0ge3ZlYzN9IGF4aXMgdGhlIGF4aXMgYXJvdW5kIHdoaWNoIHRvIHJvdGF0ZVxyXG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIHRoZSBhbmdsZSBpbiByYWRpYW5zXHJcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcclxuICoqL1xuXG5leHBvcnQgZnVuY3Rpb24gc2V0QXhpc0FuZ2xlKG91dCwgYXhpcywgcmFkKSB7XG4gIHJhZCA9IHJhZCAqIDAuNTtcbiAgdmFyIHMgPSBNYXRoLnNpbihyYWQpO1xuICBvdXRbMF0gPSBzICogYXhpc1swXTtcbiAgb3V0WzFdID0gcyAqIGF4aXNbMV07XG4gIG91dFsyXSA9IHMgKiBheGlzWzJdO1xuICBvdXRbM10gPSBNYXRoLmNvcyhyYWQpO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIEdldHMgdGhlIHJvdGF0aW9uIGF4aXMgYW5kIGFuZ2xlIGZvciBhIGdpdmVuXHJcbiAqICBxdWF0ZXJuaW9uLiBJZiBhIHF1YXRlcm5pb24gaXMgY3JlYXRlZCB3aXRoXHJcbiAqICBzZXRBeGlzQW5nbGUsIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIHRoZSBzYW1lXHJcbiAqICB2YWx1ZXMgYXMgcHJvdmlkaWVkIGluIHRoZSBvcmlnaW5hbCBwYXJhbWV0ZXIgbGlzdFxyXG4gKiAgT1IgZnVuY3Rpb25hbGx5IGVxdWl2YWxlbnQgdmFsdWVzLlxyXG4gKiBFeGFtcGxlOiBUaGUgcXVhdGVybmlvbiBmb3JtZWQgYnkgYXhpcyBbMCwgMCwgMV0gYW5kXHJcbiAqICBhbmdsZSAtOTAgaXMgdGhlIHNhbWUgYXMgdGhlIHF1YXRlcm5pb24gZm9ybWVkIGJ5XHJcbiAqICBbMCwgMCwgMV0gYW5kIDI3MC4gVGhpcyBtZXRob2QgZmF2b3JzIHRoZSBsYXR0ZXIuXHJcbiAqIEBwYXJhbSAge3ZlYzN9IG91dF9heGlzICBWZWN0b3IgcmVjZWl2aW5nIHRoZSBheGlzIG9mIHJvdGF0aW9uXHJcbiAqIEBwYXJhbSAge3F1YXR9IHEgICAgIFF1YXRlcm5pb24gdG8gYmUgZGVjb21wb3NlZFxyXG4gKiBAcmV0dXJuIHtOdW1iZXJ9ICAgICBBbmdsZSwgaW4gcmFkaWFucywgb2YgdGhlIHJvdGF0aW9uXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0QXhpc0FuZ2xlKG91dF9heGlzLCBxKSB7XG4gIHZhciByYWQgPSBNYXRoLmFjb3MocVszXSkgKiAyLjA7XG4gIHZhciBzID0gTWF0aC5zaW4ocmFkIC8gMi4wKTtcblxuICBpZiAocyA+IGdsTWF0cml4LkVQU0lMT04pIHtcbiAgICBvdXRfYXhpc1swXSA9IHFbMF0gLyBzO1xuICAgIG91dF9heGlzWzFdID0gcVsxXSAvIHM7XG4gICAgb3V0X2F4aXNbMl0gPSBxWzJdIC8gcztcbiAgfSBlbHNlIHtcbiAgICAvLyBJZiBzIGlzIHplcm8sIHJldHVybiBhbnkgYXhpcyAobm8gcm90YXRpb24gLSBheGlzIGRvZXMgbm90IG1hdHRlcilcbiAgICBvdXRfYXhpc1swXSA9IDE7XG4gICAgb3V0X2F4aXNbMV0gPSAwO1xuICAgIG91dF9heGlzWzJdID0gMDtcbiAgfVxuXG4gIHJldHVybiByYWQ7XG59XG4vKipcclxuICogTXVsdGlwbGllcyB0d28gcXVhdCdzXHJcbiAqXHJcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvblxyXG4gKiBAcGFyYW0ge3F1YXR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHtxdWF0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbXVsdGlwbHkob3V0LCBhLCBiKSB7XG4gIHZhciBheCA9IGFbMF0sXG4gICAgICBheSA9IGFbMV0sXG4gICAgICBheiA9IGFbMl0sXG4gICAgICBhdyA9IGFbM107XG4gIHZhciBieCA9IGJbMF0sXG4gICAgICBieSA9IGJbMV0sXG4gICAgICBieiA9IGJbMl0sXG4gICAgICBidyA9IGJbM107XG4gIG91dFswXSA9IGF4ICogYncgKyBhdyAqIGJ4ICsgYXkgKiBieiAtIGF6ICogYnk7XG4gIG91dFsxXSA9IGF5ICogYncgKyBhdyAqIGJ5ICsgYXogKiBieCAtIGF4ICogYno7XG4gIG91dFsyXSA9IGF6ICogYncgKyBhdyAqIGJ6ICsgYXggKiBieSAtIGF5ICogYng7XG4gIG91dFszXSA9IGF3ICogYncgLSBheCAqIGJ4IC0gYXkgKiBieSAtIGF6ICogYno7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogUm90YXRlcyBhIHF1YXRlcm5pb24gYnkgdGhlIGdpdmVuIGFuZ2xlIGFib3V0IHRoZSBYIGF4aXNcclxuICpcclxuICogQHBhcmFtIHtxdWF0fSBvdXQgcXVhdCByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxyXG4gKiBAcGFyYW0ge3F1YXR9IGEgcXVhdCB0byByb3RhdGVcclxuICogQHBhcmFtIHtudW1iZXJ9IHJhZCBhbmdsZSAoaW4gcmFkaWFucykgdG8gcm90YXRlXHJcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiByb3RhdGVYKG91dCwgYSwgcmFkKSB7XG4gIHJhZCAqPSAwLjU7XG4gIHZhciBheCA9IGFbMF0sXG4gICAgICBheSA9IGFbMV0sXG4gICAgICBheiA9IGFbMl0sXG4gICAgICBhdyA9IGFbM107XG4gIHZhciBieCA9IE1hdGguc2luKHJhZCksXG4gICAgICBidyA9IE1hdGguY29zKHJhZCk7XG4gIG91dFswXSA9IGF4ICogYncgKyBhdyAqIGJ4O1xuICBvdXRbMV0gPSBheSAqIGJ3ICsgYXogKiBieDtcbiAgb3V0WzJdID0gYXogKiBidyAtIGF5ICogYng7XG4gIG91dFszXSA9IGF3ICogYncgLSBheCAqIGJ4O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFJvdGF0ZXMgYSBxdWF0ZXJuaW9uIGJ5IHRoZSBnaXZlbiBhbmdsZSBhYm91dCB0aGUgWSBheGlzXHJcbiAqXHJcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHF1YXQgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcclxuICogQHBhcmFtIHtxdWF0fSBhIHF1YXQgdG8gcm90YXRlXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSByYWQgYW5nbGUgKGluIHJhZGlhbnMpIHRvIHJvdGF0ZVxyXG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcm90YXRlWShvdXQsIGEsIHJhZCkge1xuICByYWQgKj0gMC41O1xuICB2YXIgYXggPSBhWzBdLFxuICAgICAgYXkgPSBhWzFdLFxuICAgICAgYXogPSBhWzJdLFxuICAgICAgYXcgPSBhWzNdO1xuICB2YXIgYnkgPSBNYXRoLnNpbihyYWQpLFxuICAgICAgYncgPSBNYXRoLmNvcyhyYWQpO1xuICBvdXRbMF0gPSBheCAqIGJ3IC0gYXogKiBieTtcbiAgb3V0WzFdID0gYXkgKiBidyArIGF3ICogYnk7XG4gIG91dFsyXSA9IGF6ICogYncgKyBheCAqIGJ5O1xuICBvdXRbM10gPSBhdyAqIGJ3IC0gYXkgKiBieTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBSb3RhdGVzIGEgcXVhdGVybmlvbiBieSB0aGUgZ2l2ZW4gYW5nbGUgYWJvdXQgdGhlIFogYXhpc1xyXG4gKlxyXG4gKiBAcGFyYW0ge3F1YXR9IG91dCBxdWF0IHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XHJcbiAqIEBwYXJhbSB7cXVhdH0gYSBxdWF0IHRvIHJvdGF0ZVxyXG4gKiBAcGFyYW0ge251bWJlcn0gcmFkIGFuZ2xlIChpbiByYWRpYW5zKSB0byByb3RhdGVcclxuICogQHJldHVybnMge3F1YXR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJvdGF0ZVoob3V0LCBhLCByYWQpIHtcbiAgcmFkICo9IDAuNTtcbiAgdmFyIGF4ID0gYVswXSxcbiAgICAgIGF5ID0gYVsxXSxcbiAgICAgIGF6ID0gYVsyXSxcbiAgICAgIGF3ID0gYVszXTtcbiAgdmFyIGJ6ID0gTWF0aC5zaW4ocmFkKSxcbiAgICAgIGJ3ID0gTWF0aC5jb3MocmFkKTtcbiAgb3V0WzBdID0gYXggKiBidyArIGF5ICogYno7XG4gIG91dFsxXSA9IGF5ICogYncgLSBheCAqIGJ6O1xuICBvdXRbMl0gPSBheiAqIGJ3ICsgYXcgKiBiejtcbiAgb3V0WzNdID0gYXcgKiBidyAtIGF6ICogYno7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ2FsY3VsYXRlcyB0aGUgVyBjb21wb25lbnQgb2YgYSBxdWF0IGZyb20gdGhlIFgsIFksIGFuZCBaIGNvbXBvbmVudHMuXHJcbiAqIEFzc3VtZXMgdGhhdCBxdWF0ZXJuaW9uIGlzIDEgdW5pdCBpbiBsZW5ndGguXHJcbiAqIEFueSBleGlzdGluZyBXIGNvbXBvbmVudCB3aWxsIGJlIGlnbm9yZWQuXHJcbiAqXHJcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvblxyXG4gKiBAcGFyYW0ge3F1YXR9IGEgcXVhdCB0byBjYWxjdWxhdGUgVyBjb21wb25lbnQgb2ZcclxuICogQHJldHVybnMge3F1YXR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNhbGN1bGF0ZVcob3V0LCBhKSB7XG4gIHZhciB4ID0gYVswXSxcbiAgICAgIHkgPSBhWzFdLFxuICAgICAgeiA9IGFbMl07XG4gIG91dFswXSA9IHg7XG4gIG91dFsxXSA9IHk7XG4gIG91dFsyXSA9IHo7XG4gIG91dFszXSA9IE1hdGguc3FydChNYXRoLmFicygxLjAgLSB4ICogeCAtIHkgKiB5IC0geiAqIHopKTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBQZXJmb3JtcyBhIHNwaGVyaWNhbCBsaW5lYXIgaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIHR3byBxdWF0XHJcbiAqXHJcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvblxyXG4gKiBAcGFyYW0ge3F1YXR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHtxdWF0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge051bWJlcn0gdCBpbnRlcnBvbGF0aW9uIGFtb3VudCwgaW4gdGhlIHJhbmdlIFswLTFdLCBiZXR3ZWVuIHRoZSB0d28gaW5wdXRzXHJcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzbGVycChvdXQsIGEsIGIsIHQpIHtcbiAgLy8gYmVuY2htYXJrczpcbiAgLy8gICAgaHR0cDovL2pzcGVyZi5jb20vcXVhdGVybmlvbi1zbGVycC1pbXBsZW1lbnRhdGlvbnNcbiAgdmFyIGF4ID0gYVswXSxcbiAgICAgIGF5ID0gYVsxXSxcbiAgICAgIGF6ID0gYVsyXSxcbiAgICAgIGF3ID0gYVszXTtcbiAgdmFyIGJ4ID0gYlswXSxcbiAgICAgIGJ5ID0gYlsxXSxcbiAgICAgIGJ6ID0gYlsyXSxcbiAgICAgIGJ3ID0gYlszXTtcbiAgdmFyIG9tZWdhLCBjb3NvbSwgc2lub20sIHNjYWxlMCwgc2NhbGUxOyAvLyBjYWxjIGNvc2luZVxuXG4gIGNvc29tID0gYXggKiBieCArIGF5ICogYnkgKyBheiAqIGJ6ICsgYXcgKiBidzsgLy8gYWRqdXN0IHNpZ25zIChpZiBuZWNlc3NhcnkpXG5cbiAgaWYgKGNvc29tIDwgMC4wKSB7XG4gICAgY29zb20gPSAtY29zb207XG4gICAgYnggPSAtYng7XG4gICAgYnkgPSAtYnk7XG4gICAgYnogPSAtYno7XG4gICAgYncgPSAtYnc7XG4gIH0gLy8gY2FsY3VsYXRlIGNvZWZmaWNpZW50c1xuXG5cbiAgaWYgKDEuMCAtIGNvc29tID4gZ2xNYXRyaXguRVBTSUxPTikge1xuICAgIC8vIHN0YW5kYXJkIGNhc2UgKHNsZXJwKVxuICAgIG9tZWdhID0gTWF0aC5hY29zKGNvc29tKTtcbiAgICBzaW5vbSA9IE1hdGguc2luKG9tZWdhKTtcbiAgICBzY2FsZTAgPSBNYXRoLnNpbigoMS4wIC0gdCkgKiBvbWVnYSkgLyBzaW5vbTtcbiAgICBzY2FsZTEgPSBNYXRoLnNpbih0ICogb21lZ2EpIC8gc2lub207XG4gIH0gZWxzZSB7XG4gICAgLy8gXCJmcm9tXCIgYW5kIFwidG9cIiBxdWF0ZXJuaW9ucyBhcmUgdmVyeSBjbG9zZVxuICAgIC8vICAuLi4gc28gd2UgY2FuIGRvIGEgbGluZWFyIGludGVycG9sYXRpb25cbiAgICBzY2FsZTAgPSAxLjAgLSB0O1xuICAgIHNjYWxlMSA9IHQ7XG4gIH0gLy8gY2FsY3VsYXRlIGZpbmFsIHZhbHVlc1xuXG5cbiAgb3V0WzBdID0gc2NhbGUwICogYXggKyBzY2FsZTEgKiBieDtcbiAgb3V0WzFdID0gc2NhbGUwICogYXkgKyBzY2FsZTEgKiBieTtcbiAgb3V0WzJdID0gc2NhbGUwICogYXogKyBzY2FsZTEgKiBiejtcbiAgb3V0WzNdID0gc2NhbGUwICogYXcgKyBzY2FsZTEgKiBidztcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBHZW5lcmF0ZXMgYSByYW5kb20gcXVhdGVybmlvblxyXG4gKlxyXG4gKiBAcGFyYW0ge3F1YXR9IG91dCB0aGUgcmVjZWl2aW5nIHF1YXRlcm5pb25cclxuICogQHJldHVybnMge3F1YXR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJhbmRvbShvdXQpIHtcbiAgLy8gSW1wbGVtZW50YXRpb24gb2YgaHR0cDovL3BsYW5uaW5nLmNzLnVpdWMuZWR1L25vZGUxOTguaHRtbFxuICAvLyBUT0RPOiBDYWxsaW5nIHJhbmRvbSAzIHRpbWVzIGlzIHByb2JhYmx5IG5vdCB0aGUgZmFzdGVzdCBzb2x1dGlvblxuICB2YXIgdTEgPSBnbE1hdHJpeC5SQU5ET00oKTtcbiAgdmFyIHUyID0gZ2xNYXRyaXguUkFORE9NKCk7XG4gIHZhciB1MyA9IGdsTWF0cml4LlJBTkRPTSgpO1xuICB2YXIgc3FydDFNaW51c1UxID0gTWF0aC5zcXJ0KDEgLSB1MSk7XG4gIHZhciBzcXJ0VTEgPSBNYXRoLnNxcnQodTEpO1xuICBvdXRbMF0gPSBzcXJ0MU1pbnVzVTEgKiBNYXRoLnNpbigyLjAgKiBNYXRoLlBJICogdTIpO1xuICBvdXRbMV0gPSBzcXJ0MU1pbnVzVTEgKiBNYXRoLmNvcygyLjAgKiBNYXRoLlBJICogdTIpO1xuICBvdXRbMl0gPSBzcXJ0VTEgKiBNYXRoLnNpbigyLjAgKiBNYXRoLlBJICogdTMpO1xuICBvdXRbM10gPSBzcXJ0VTEgKiBNYXRoLmNvcygyLjAgKiBNYXRoLlBJICogdTMpO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENhbGN1bGF0ZXMgdGhlIGludmVyc2Ugb2YgYSBxdWF0XHJcbiAqXHJcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvblxyXG4gKiBAcGFyYW0ge3F1YXR9IGEgcXVhdCB0byBjYWxjdWxhdGUgaW52ZXJzZSBvZlxyXG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gaW52ZXJ0KG91dCwgYSkge1xuICB2YXIgYTAgPSBhWzBdLFxuICAgICAgYTEgPSBhWzFdLFxuICAgICAgYTIgPSBhWzJdLFxuICAgICAgYTMgPSBhWzNdO1xuICB2YXIgZG90ID0gYTAgKiBhMCArIGExICogYTEgKyBhMiAqIGEyICsgYTMgKiBhMztcbiAgdmFyIGludkRvdCA9IGRvdCA/IDEuMCAvIGRvdCA6IDA7IC8vIFRPRE86IFdvdWxkIGJlIGZhc3RlciB0byByZXR1cm4gWzAsMCwwLDBdIGltbWVkaWF0ZWx5IGlmIGRvdCA9PSAwXG5cbiAgb3V0WzBdID0gLWEwICogaW52RG90O1xuICBvdXRbMV0gPSAtYTEgKiBpbnZEb3Q7XG4gIG91dFsyXSA9IC1hMiAqIGludkRvdDtcbiAgb3V0WzNdID0gYTMgKiBpbnZEb3Q7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ2FsY3VsYXRlcyB0aGUgY29uanVnYXRlIG9mIGEgcXVhdFxyXG4gKiBJZiB0aGUgcXVhdGVybmlvbiBpcyBub3JtYWxpemVkLCB0aGlzIGZ1bmN0aW9uIGlzIGZhc3RlciB0aGFuIHF1YXQuaW52ZXJzZSBhbmQgcHJvZHVjZXMgdGhlIHNhbWUgcmVzdWx0LlxyXG4gKlxyXG4gKiBAcGFyYW0ge3F1YXR9IG91dCB0aGUgcmVjZWl2aW5nIHF1YXRlcm5pb25cclxuICogQHBhcmFtIHtxdWF0fSBhIHF1YXQgdG8gY2FsY3VsYXRlIGNvbmp1Z2F0ZSBvZlxyXG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY29uanVnYXRlKG91dCwgYSkge1xuICBvdXRbMF0gPSAtYVswXTtcbiAgb3V0WzFdID0gLWFbMV07XG4gIG91dFsyXSA9IC1hWzJdO1xuICBvdXRbM10gPSBhWzNdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENyZWF0ZXMgYSBxdWF0ZXJuaW9uIGZyb20gdGhlIGdpdmVuIDN4MyByb3RhdGlvbiBtYXRyaXguXHJcbiAqXHJcbiAqIE5PVEU6IFRoZSByZXN1bHRhbnQgcXVhdGVybmlvbiBpcyBub3Qgbm9ybWFsaXplZCwgc28geW91IHNob3VsZCBiZSBzdXJlXHJcbiAqIHRvIHJlbm9ybWFsaXplIHRoZSBxdWF0ZXJuaW9uIHlvdXJzZWxmIHdoZXJlIG5lY2Vzc2FyeS5cclxuICpcclxuICogQHBhcmFtIHtxdWF0fSBvdXQgdGhlIHJlY2VpdmluZyBxdWF0ZXJuaW9uXHJcbiAqIEBwYXJhbSB7bWF0M30gbSByb3RhdGlvbiBtYXRyaXhcclxuICogQHJldHVybnMge3F1YXR9IG91dFxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tTWF0MyhvdXQsIG0pIHtcbiAgLy8gQWxnb3JpdGhtIGluIEtlbiBTaG9lbWFrZSdzIGFydGljbGUgaW4gMTk4NyBTSUdHUkFQSCBjb3Vyc2Ugbm90ZXNcbiAgLy8gYXJ0aWNsZSBcIlF1YXRlcm5pb24gQ2FsY3VsdXMgYW5kIEZhc3QgQW5pbWF0aW9uXCIuXG4gIHZhciBmVHJhY2UgPSBtWzBdICsgbVs0XSArIG1bOF07XG4gIHZhciBmUm9vdDtcblxuICBpZiAoZlRyYWNlID4gMC4wKSB7XG4gICAgLy8gfHd8ID4gMS8yLCBtYXkgYXMgd2VsbCBjaG9vc2UgdyA+IDEvMlxuICAgIGZSb290ID0gTWF0aC5zcXJ0KGZUcmFjZSArIDEuMCk7IC8vIDJ3XG5cbiAgICBvdXRbM10gPSAwLjUgKiBmUm9vdDtcbiAgICBmUm9vdCA9IDAuNSAvIGZSb290OyAvLyAxLyg0dylcblxuICAgIG91dFswXSA9IChtWzVdIC0gbVs3XSkgKiBmUm9vdDtcbiAgICBvdXRbMV0gPSAobVs2XSAtIG1bMl0pICogZlJvb3Q7XG4gICAgb3V0WzJdID0gKG1bMV0gLSBtWzNdKSAqIGZSb290O1xuICB9IGVsc2Uge1xuICAgIC8vIHx3fCA8PSAxLzJcbiAgICB2YXIgaSA9IDA7XG4gICAgaWYgKG1bNF0gPiBtWzBdKSBpID0gMTtcbiAgICBpZiAobVs4XSA+IG1baSAqIDMgKyBpXSkgaSA9IDI7XG4gICAgdmFyIGogPSAoaSArIDEpICUgMztcbiAgICB2YXIgayA9IChpICsgMikgJSAzO1xuICAgIGZSb290ID0gTWF0aC5zcXJ0KG1baSAqIDMgKyBpXSAtIG1baiAqIDMgKyBqXSAtIG1bayAqIDMgKyBrXSArIDEuMCk7XG4gICAgb3V0W2ldID0gMC41ICogZlJvb3Q7XG4gICAgZlJvb3QgPSAwLjUgLyBmUm9vdDtcbiAgICBvdXRbM10gPSAobVtqICogMyArIGtdIC0gbVtrICogMyArIGpdKSAqIGZSb290O1xuICAgIG91dFtqXSA9IChtW2ogKiAzICsgaV0gKyBtW2kgKiAzICsgal0pICogZlJvb3Q7XG4gICAgb3V0W2tdID0gKG1bayAqIDMgKyBpXSArIG1baSAqIDMgKyBrXSkgKiBmUm9vdDtcbiAgfVxuXG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ3JlYXRlcyBhIHF1YXRlcm5pb24gZnJvbSB0aGUgZ2l2ZW4gZXVsZXIgYW5nbGUgeCwgeSwgei5cclxuICpcclxuICogQHBhcmFtIHtxdWF0fSBvdXQgdGhlIHJlY2VpdmluZyBxdWF0ZXJuaW9uXHJcbiAqIEBwYXJhbSB7eH0gQW5nbGUgdG8gcm90YXRlIGFyb3VuZCBYIGF4aXMgaW4gZGVncmVlcy5cclxuICogQHBhcmFtIHt5fSBBbmdsZSB0byByb3RhdGUgYXJvdW5kIFkgYXhpcyBpbiBkZWdyZWVzLlxyXG4gKiBAcGFyYW0ge3p9IEFuZ2xlIHRvIHJvdGF0ZSBhcm91bmQgWiBheGlzIGluIGRlZ3JlZXMuXHJcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbUV1bGVyKG91dCwgeCwgeSwgeikge1xuICB2YXIgaGFsZlRvUmFkID0gMC41ICogTWF0aC5QSSAvIDE4MC4wO1xuICB4ICo9IGhhbGZUb1JhZDtcbiAgeSAqPSBoYWxmVG9SYWQ7XG4gIHogKj0gaGFsZlRvUmFkO1xuICB2YXIgc3ggPSBNYXRoLnNpbih4KTtcbiAgdmFyIGN4ID0gTWF0aC5jb3MoeCk7XG4gIHZhciBzeSA9IE1hdGguc2luKHkpO1xuICB2YXIgY3kgPSBNYXRoLmNvcyh5KTtcbiAgdmFyIHN6ID0gTWF0aC5zaW4oeik7XG4gIHZhciBjeiA9IE1hdGguY29zKHopO1xuICBvdXRbMF0gPSBzeCAqIGN5ICogY3ogLSBjeCAqIHN5ICogc3o7XG4gIG91dFsxXSA9IGN4ICogc3kgKiBjeiArIHN4ICogY3kgKiBzejtcbiAgb3V0WzJdID0gY3ggKiBjeSAqIHN6IC0gc3ggKiBzeSAqIGN6O1xuICBvdXRbM10gPSBjeCAqIGN5ICogY3ogKyBzeCAqIHN5ICogc3o7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIHF1YXRlbmlvblxyXG4gKlxyXG4gKiBAcGFyYW0ge3F1YXR9IGEgdmVjdG9yIHRvIHJlcHJlc2VudCBhcyBhIHN0cmluZ1xyXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHZlY3RvclxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHN0cihhKSB7XG4gIHJldHVybiAncXVhdCgnICsgYVswXSArICcsICcgKyBhWzFdICsgJywgJyArIGFbMl0gKyAnLCAnICsgYVszXSArICcpJztcbn1cbi8qKlxyXG4gKiBDcmVhdGVzIGEgbmV3IHF1YXQgaW5pdGlhbGl6ZWQgd2l0aCB2YWx1ZXMgZnJvbSBhbiBleGlzdGluZyBxdWF0ZXJuaW9uXHJcbiAqXHJcbiAqIEBwYXJhbSB7cXVhdH0gYSBxdWF0ZXJuaW9uIHRvIGNsb25lXHJcbiAqIEByZXR1cm5zIHtxdWF0fSBhIG5ldyBxdWF0ZXJuaW9uXHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IHZhciBjbG9uZSA9IHZlYzQuY2xvbmU7XG4vKipcclxuICogQ3JlYXRlcyBhIG5ldyBxdWF0IGluaXRpYWxpemVkIHdpdGggdGhlIGdpdmVuIHZhbHVlc1xyXG4gKlxyXG4gKiBAcGFyYW0ge051bWJlcn0geCBYIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0ge051bWJlcn0geSBZIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0ge051bWJlcn0geiBaIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0ge051bWJlcn0gdyBXIGNvbXBvbmVudFxyXG4gKiBAcmV0dXJucyB7cXVhdH0gYSBuZXcgcXVhdGVybmlvblxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCB2YXIgZnJvbVZhbHVlcyA9IHZlYzQuZnJvbVZhbHVlcztcbi8qKlxyXG4gKiBDb3B5IHRoZSB2YWx1ZXMgZnJvbSBvbmUgcXVhdCB0byBhbm90aGVyXHJcbiAqXHJcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvblxyXG4gKiBAcGFyYW0ge3F1YXR9IGEgdGhlIHNvdXJjZSBxdWF0ZXJuaW9uXHJcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIGNvcHkgPSB2ZWM0LmNvcHk7XG4vKipcclxuICogU2V0IHRoZSBjb21wb25lbnRzIG9mIGEgcXVhdCB0byB0aGUgZ2l2ZW4gdmFsdWVzXHJcbiAqXHJcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvblxyXG4gKiBAcGFyYW0ge051bWJlcn0geCBYIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0ge051bWJlcn0geSBZIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0ge051bWJlcn0geiBaIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0ge051bWJlcn0gdyBXIGNvbXBvbmVudFxyXG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IHZhciBzZXQgPSB2ZWM0LnNldDtcbi8qKlxyXG4gKiBBZGRzIHR3byBxdWF0J3NcclxuICpcclxuICogQHBhcmFtIHtxdWF0fSBvdXQgdGhlIHJlY2VpdmluZyBxdWF0ZXJuaW9uXHJcbiAqIEBwYXJhbSB7cXVhdH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge3F1YXR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIGFkZCA9IHZlYzQuYWRkO1xuLyoqXHJcbiAqIEFsaWFzIGZvciB7QGxpbmsgcXVhdC5tdWx0aXBseX1cclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIG11bCA9IG11bHRpcGx5O1xuLyoqXHJcbiAqIFNjYWxlcyBhIHF1YXQgYnkgYSBzY2FsYXIgbnVtYmVyXHJcbiAqXHJcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7cXVhdH0gYSB0aGUgdmVjdG9yIHRvIHNjYWxlXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBiIGFtb3VudCB0byBzY2FsZSB0aGUgdmVjdG9yIGJ5XHJcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIHNjYWxlID0gdmVjNC5zY2FsZTtcbi8qKlxyXG4gKiBDYWxjdWxhdGVzIHRoZSBkb3QgcHJvZHVjdCBvZiB0d28gcXVhdCdzXHJcbiAqXHJcbiAqIEBwYXJhbSB7cXVhdH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge3F1YXR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IGRvdCBwcm9kdWN0IG9mIGEgYW5kIGJcclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIGRvdCA9IHZlYzQuZG90O1xuLyoqXHJcbiAqIFBlcmZvcm1zIGEgbGluZWFyIGludGVycG9sYXRpb24gYmV0d2VlbiB0d28gcXVhdCdzXHJcbiAqXHJcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvblxyXG4gKiBAcGFyYW0ge3F1YXR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHtxdWF0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge051bWJlcn0gdCBpbnRlcnBvbGF0aW9uIGFtb3VudCwgaW4gdGhlIHJhbmdlIFswLTFdLCBiZXR3ZWVuIHRoZSB0d28gaW5wdXRzXHJcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIGxlcnAgPSB2ZWM0LmxlcnA7XG4vKipcclxuICogQ2FsY3VsYXRlcyB0aGUgbGVuZ3RoIG9mIGEgcXVhdFxyXG4gKlxyXG4gKiBAcGFyYW0ge3F1YXR9IGEgdmVjdG9yIHRvIGNhbGN1bGF0ZSBsZW5ndGggb2ZcclxuICogQHJldHVybnMge051bWJlcn0gbGVuZ3RoIG9mIGFcclxuICovXG5cbmV4cG9ydCB2YXIgbGVuZ3RoID0gdmVjNC5sZW5ndGg7XG4vKipcclxuICogQWxpYXMgZm9yIHtAbGluayBxdWF0Lmxlbmd0aH1cclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIGxlbiA9IGxlbmd0aDtcbi8qKlxyXG4gKiBDYWxjdWxhdGVzIHRoZSBzcXVhcmVkIGxlbmd0aCBvZiBhIHF1YXRcclxuICpcclxuICogQHBhcmFtIHtxdWF0fSBhIHZlY3RvciB0byBjYWxjdWxhdGUgc3F1YXJlZCBsZW5ndGggb2ZcclxuICogQHJldHVybnMge051bWJlcn0gc3F1YXJlZCBsZW5ndGggb2YgYVxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCB2YXIgc3F1YXJlZExlbmd0aCA9IHZlYzQuc3F1YXJlZExlbmd0aDtcbi8qKlxyXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHF1YXQuc3F1YXJlZExlbmd0aH1cclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIHNxckxlbiA9IHNxdWFyZWRMZW5ndGg7XG4vKipcclxuICogTm9ybWFsaXplIGEgcXVhdFxyXG4gKlxyXG4gKiBAcGFyYW0ge3F1YXR9IG91dCB0aGUgcmVjZWl2aW5nIHF1YXRlcm5pb25cclxuICogQHBhcmFtIHtxdWF0fSBhIHF1YXRlcm5pb24gdG8gbm9ybWFsaXplXHJcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIG5vcm1hbGl6ZSA9IHZlYzQubm9ybWFsaXplO1xuLyoqXHJcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHF1YXRlcm5pb25zIGhhdmUgZXhhY3RseSB0aGUgc2FtZSBlbGVtZW50cyBpbiB0aGUgc2FtZSBwb3NpdGlvbiAod2hlbiBjb21wYXJlZCB3aXRoID09PSlcclxuICpcclxuICogQHBhcmFtIHtxdWF0fSBhIFRoZSBmaXJzdCBxdWF0ZXJuaW9uLlxyXG4gKiBAcGFyYW0ge3F1YXR9IGIgVGhlIHNlY29uZCBxdWF0ZXJuaW9uLlxyXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmVjdG9ycyBhcmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS5cclxuICovXG5cbmV4cG9ydCB2YXIgZXhhY3RFcXVhbHMgPSB2ZWM0LmV4YWN0RXF1YWxzO1xuLyoqXHJcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHF1YXRlcm5pb25zIGhhdmUgYXBwcm94aW1hdGVseSB0aGUgc2FtZSBlbGVtZW50cyBpbiB0aGUgc2FtZSBwb3NpdGlvbi5cclxuICpcclxuICogQHBhcmFtIHtxdWF0fSBhIFRoZSBmaXJzdCB2ZWN0b3IuXHJcbiAqIEBwYXJhbSB7cXVhdH0gYiBUaGUgc2Vjb25kIHZlY3Rvci5cclxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZlY3RvcnMgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuXHJcbiAqL1xuXG5leHBvcnQgdmFyIGVxdWFscyA9IHZlYzQuZXF1YWxzO1xuLyoqXHJcbiAqIFNldHMgYSBxdWF0ZXJuaW9uIHRvIHJlcHJlc2VudCB0aGUgc2hvcnRlc3Qgcm90YXRpb24gZnJvbSBvbmVcclxuICogdmVjdG9yIHRvIGFub3RoZXIuXHJcbiAqXHJcbiAqIEJvdGggdmVjdG9ycyBhcmUgYXNzdW1lZCB0byBiZSB1bml0IGxlbmd0aC5cclxuICpcclxuICogQHBhcmFtIHtxdWF0fSBvdXQgdGhlIHJlY2VpdmluZyBxdWF0ZXJuaW9uLlxyXG4gKiBAcGFyYW0ge3ZlYzN9IGEgdGhlIGluaXRpYWwgdmVjdG9yXHJcbiAqIEBwYXJhbSB7dmVjM30gYiB0aGUgZGVzdGluYXRpb24gdmVjdG9yXHJcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcclxuICovXG5cbmV4cG9ydCB2YXIgcm90YXRpb25UbyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHRtcHZlYzMgPSB2ZWMzLmNyZWF0ZSgpO1xuICB2YXIgeFVuaXRWZWMzID0gdmVjMy5mcm9tVmFsdWVzKDEsIDAsIDApO1xuICB2YXIgeVVuaXRWZWMzID0gdmVjMy5mcm9tVmFsdWVzKDAsIDEsIDApO1xuICByZXR1cm4gZnVuY3Rpb24gKG91dCwgYSwgYikge1xuICAgIHZhciBkb3QgPSB2ZWMzLmRvdChhLCBiKTtcblxuICAgIGlmIChkb3QgPCAtMC45OTk5OTkpIHtcbiAgICAgIHZlYzMuY3Jvc3ModG1wdmVjMywgeFVuaXRWZWMzLCBhKTtcbiAgICAgIGlmICh2ZWMzLmxlbih0bXB2ZWMzKSA8IDAuMDAwMDAxKSB2ZWMzLmNyb3NzKHRtcHZlYzMsIHlVbml0VmVjMywgYSk7XG4gICAgICB2ZWMzLm5vcm1hbGl6ZSh0bXB2ZWMzLCB0bXB2ZWMzKTtcbiAgICAgIHNldEF4aXNBbmdsZShvdXQsIHRtcHZlYzMsIE1hdGguUEkpO1xuICAgICAgcmV0dXJuIG91dDtcbiAgICB9IGVsc2UgaWYgKGRvdCA+IDAuOTk5OTk5KSB7XG4gICAgICBvdXRbMF0gPSAwO1xuICAgICAgb3V0WzFdID0gMDtcbiAgICAgIG91dFsyXSA9IDA7XG4gICAgICBvdXRbM10gPSAxO1xuICAgICAgcmV0dXJuIG91dDtcbiAgICB9IGVsc2Uge1xuICAgICAgdmVjMy5jcm9zcyh0bXB2ZWMzLCBhLCBiKTtcbiAgICAgIG91dFswXSA9IHRtcHZlYzNbMF07XG4gICAgICBvdXRbMV0gPSB0bXB2ZWMzWzFdO1xuICAgICAgb3V0WzJdID0gdG1wdmVjM1syXTtcbiAgICAgIG91dFszXSA9IDEgKyBkb3Q7XG4gICAgICByZXR1cm4gbm9ybWFsaXplKG91dCwgb3V0KTtcbiAgICB9XG4gIH07XG59KCk7XG4vKipcclxuICogUGVyZm9ybXMgYSBzcGhlcmljYWwgbGluZWFyIGludGVycG9sYXRpb24gd2l0aCB0d28gY29udHJvbCBwb2ludHNcclxuICpcclxuICogQHBhcmFtIHtxdWF0fSBvdXQgdGhlIHJlY2VpdmluZyBxdWF0ZXJuaW9uXHJcbiAqIEBwYXJhbSB7cXVhdH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge3F1YXR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7cXVhdH0gYyB0aGUgdGhpcmQgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge3F1YXR9IGQgdGhlIGZvdXJ0aCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSB0IGludGVycG9sYXRpb24gYW1vdW50LCBpbiB0aGUgcmFuZ2UgWzAtMV0sIGJldHdlZW4gdGhlIHR3byBpbnB1dHNcclxuICogQHJldHVybnMge3F1YXR9IG91dFxyXG4gKi9cblxuZXhwb3J0IHZhciBzcWxlcnAgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciB0ZW1wMSA9IGNyZWF0ZSgpO1xuICB2YXIgdGVtcDIgPSBjcmVhdGUoKTtcbiAgcmV0dXJuIGZ1bmN0aW9uIChvdXQsIGEsIGIsIGMsIGQsIHQpIHtcbiAgICBzbGVycCh0ZW1wMSwgYSwgZCwgdCk7XG4gICAgc2xlcnAodGVtcDIsIGIsIGMsIHQpO1xuICAgIHNsZXJwKG91dCwgdGVtcDEsIHRlbXAyLCAyICogdCAqICgxIC0gdCkpO1xuICAgIHJldHVybiBvdXQ7XG4gIH07XG59KCk7XG4vKipcclxuICogU2V0cyB0aGUgc3BlY2lmaWVkIHF1YXRlcm5pb24gd2l0aCB2YWx1ZXMgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW5cclxuICogYXhlcy4gRWFjaCBheGlzIGlzIGEgdmVjMyBhbmQgaXMgZXhwZWN0ZWQgdG8gYmUgdW5pdCBsZW5ndGggYW5kXHJcbiAqIHBlcnBlbmRpY3VsYXIgdG8gYWxsIG90aGVyIHNwZWNpZmllZCBheGVzLlxyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzN9IHZpZXcgIHRoZSB2ZWN0b3IgcmVwcmVzZW50aW5nIHRoZSB2aWV3aW5nIGRpcmVjdGlvblxyXG4gKiBAcGFyYW0ge3ZlYzN9IHJpZ2h0IHRoZSB2ZWN0b3IgcmVwcmVzZW50aW5nIHRoZSBsb2NhbCBcInJpZ2h0XCIgZGlyZWN0aW9uXHJcbiAqIEBwYXJhbSB7dmVjM30gdXAgICAgdGhlIHZlY3RvciByZXByZXNlbnRpbmcgdGhlIGxvY2FsIFwidXBcIiBkaXJlY3Rpb25cclxuICogQHJldHVybnMge3F1YXR9IG91dFxyXG4gKi9cblxuZXhwb3J0IHZhciBzZXRBeGVzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgbWF0ciA9IG1hdDMuY3JlYXRlKCk7XG4gIHJldHVybiBmdW5jdGlvbiAob3V0LCB2aWV3LCByaWdodCwgdXApIHtcbiAgICBtYXRyWzBdID0gcmlnaHRbMF07XG4gICAgbWF0clszXSA9IHJpZ2h0WzFdO1xuICAgIG1hdHJbNl0gPSByaWdodFsyXTtcbiAgICBtYXRyWzFdID0gdXBbMF07XG4gICAgbWF0cls0XSA9IHVwWzFdO1xuICAgIG1hdHJbN10gPSB1cFsyXTtcbiAgICBtYXRyWzJdID0gLXZpZXdbMF07XG4gICAgbWF0cls1XSA9IC12aWV3WzFdO1xuICAgIG1hdHJbOF0gPSAtdmlld1syXTtcbiAgICByZXR1cm4gbm9ybWFsaXplKG91dCwgZnJvbU1hdDMob3V0LCBtYXRyKSk7XG4gIH07XG59KCk7IiwiaW1wb3J0ICogYXMgZ2xNYXRyaXggZnJvbSBcIi4vY29tbW9uLmpzXCI7XG5pbXBvcnQgKiBhcyBxdWF0IGZyb20gXCIuL3F1YXQuanNcIjtcbmltcG9ydCAqIGFzIG1hdDQgZnJvbSBcIi4vbWF0NC5qc1wiO1xuLyoqXHJcbiAqIER1YWwgUXVhdGVybmlvbjxicj5cclxuICogRm9ybWF0OiBbcmVhbCwgZHVhbF08YnI+XHJcbiAqIFF1YXRlcm5pb24gZm9ybWF0OiBYWVpXPGJyPlxyXG4gKiBNYWtlIHN1cmUgdG8gaGF2ZSBub3JtYWxpemVkIGR1YWwgcXVhdGVybmlvbnMsIG90aGVyd2lzZSB0aGUgZnVuY3Rpb25zIG1heSBub3Qgd29yayBhcyBpbnRlbmRlZC48YnI+XHJcbiAqIEBtb2R1bGUgcXVhdDJcclxuICovXG5cbi8qKlxyXG4gKiBDcmVhdGVzIGEgbmV3IGlkZW50aXR5IGR1YWwgcXVhdFxyXG4gKlxyXG4gKiBAcmV0dXJucyB7cXVhdDJ9IGEgbmV3IGR1YWwgcXVhdGVybmlvbiBbcmVhbCAtPiByb3RhdGlvbiwgZHVhbCAtPiB0cmFuc2xhdGlvbl1cclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGUoKSB7XG4gIHZhciBkcSA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDgpO1xuXG4gIGlmIChnbE1hdHJpeC5BUlJBWV9UWVBFICE9IEZsb2F0MzJBcnJheSkge1xuICAgIGRxWzBdID0gMDtcbiAgICBkcVsxXSA9IDA7XG4gICAgZHFbMl0gPSAwO1xuICAgIGRxWzRdID0gMDtcbiAgICBkcVs1XSA9IDA7XG4gICAgZHFbNl0gPSAwO1xuICAgIGRxWzddID0gMDtcbiAgfVxuXG4gIGRxWzNdID0gMTtcbiAgcmV0dXJuIGRxO1xufVxuLyoqXHJcbiAqIENyZWF0ZXMgYSBuZXcgcXVhdCBpbml0aWFsaXplZCB3aXRoIHZhbHVlcyBmcm9tIGFuIGV4aXN0aW5nIHF1YXRlcm5pb25cclxuICpcclxuICogQHBhcmFtIHtxdWF0Mn0gYSBkdWFsIHF1YXRlcm5pb24gdG8gY2xvbmVcclxuICogQHJldHVybnMge3F1YXQyfSBuZXcgZHVhbCBxdWF0ZXJuaW9uXHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNsb25lKGEpIHtcbiAgdmFyIGRxID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoOCk7XG4gIGRxWzBdID0gYVswXTtcbiAgZHFbMV0gPSBhWzFdO1xuICBkcVsyXSA9IGFbMl07XG4gIGRxWzNdID0gYVszXTtcbiAgZHFbNF0gPSBhWzRdO1xuICBkcVs1XSA9IGFbNV07XG4gIGRxWzZdID0gYVs2XTtcbiAgZHFbN10gPSBhWzddO1xuICByZXR1cm4gZHE7XG59XG4vKipcclxuICogQ3JlYXRlcyBhIG5ldyBkdWFsIHF1YXQgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgZ2l2ZW4gdmFsdWVzXHJcbiAqXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSB4MSBYIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0ge051bWJlcn0geTEgWSBjb21wb25lbnRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHoxIFogY29tcG9uZW50XHJcbiAqIEBwYXJhbSB7TnVtYmVyfSB3MSBXIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0ge051bWJlcn0geDIgWCBjb21wb25lbnRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHkyIFkgY29tcG9uZW50XHJcbiAqIEBwYXJhbSB7TnVtYmVyfSB6MiBaIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0ge051bWJlcn0gdzIgVyBjb21wb25lbnRcclxuICogQHJldHVybnMge3F1YXQyfSBuZXcgZHVhbCBxdWF0ZXJuaW9uXHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21WYWx1ZXMoeDEsIHkxLCB6MSwgdzEsIHgyLCB5MiwgejIsIHcyKSB7XG4gIHZhciBkcSA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDgpO1xuICBkcVswXSA9IHgxO1xuICBkcVsxXSA9IHkxO1xuICBkcVsyXSA9IHoxO1xuICBkcVszXSA9IHcxO1xuICBkcVs0XSA9IHgyO1xuICBkcVs1XSA9IHkyO1xuICBkcVs2XSA9IHoyO1xuICBkcVs3XSA9IHcyO1xuICByZXR1cm4gZHE7XG59XG4vKipcclxuICogQ3JlYXRlcyBhIG5ldyBkdWFsIHF1YXQgZnJvbSB0aGUgZ2l2ZW4gdmFsdWVzIChxdWF0IGFuZCB0cmFuc2xhdGlvbilcclxuICpcclxuICogQHBhcmFtIHtOdW1iZXJ9IHgxIFggY29tcG9uZW50XHJcbiAqIEBwYXJhbSB7TnVtYmVyfSB5MSBZIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0ge051bWJlcn0gejEgWiBjb21wb25lbnRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHcxIFcgY29tcG9uZW50XHJcbiAqIEBwYXJhbSB7TnVtYmVyfSB4MiBYIGNvbXBvbmVudCAodHJhbnNsYXRpb24pXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSB5MiBZIGNvbXBvbmVudCAodHJhbnNsYXRpb24pXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSB6MiBaIGNvbXBvbmVudCAodHJhbnNsYXRpb24pXHJcbiAqIEByZXR1cm5zIHtxdWF0Mn0gbmV3IGR1YWwgcXVhdGVybmlvblxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tUm90YXRpb25UcmFuc2xhdGlvblZhbHVlcyh4MSwgeTEsIHoxLCB3MSwgeDIsIHkyLCB6Mikge1xuICB2YXIgZHEgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSg4KTtcbiAgZHFbMF0gPSB4MTtcbiAgZHFbMV0gPSB5MTtcbiAgZHFbMl0gPSB6MTtcbiAgZHFbM10gPSB3MTtcbiAgdmFyIGF4ID0geDIgKiAwLjUsXG4gICAgICBheSA9IHkyICogMC41LFxuICAgICAgYXogPSB6MiAqIDAuNTtcbiAgZHFbNF0gPSBheCAqIHcxICsgYXkgKiB6MSAtIGF6ICogeTE7XG4gIGRxWzVdID0gYXkgKiB3MSArIGF6ICogeDEgLSBheCAqIHoxO1xuICBkcVs2XSA9IGF6ICogdzEgKyBheCAqIHkxIC0gYXkgKiB4MTtcbiAgZHFbN10gPSAtYXggKiB4MSAtIGF5ICogeTEgLSBheiAqIHoxO1xuICByZXR1cm4gZHE7XG59XG4vKipcclxuICogQ3JlYXRlcyBhIGR1YWwgcXVhdCBmcm9tIGEgcXVhdGVybmlvbiBhbmQgYSB0cmFuc2xhdGlvblxyXG4gKlxyXG4gKiBAcGFyYW0ge3F1YXQyfSBkdWFsIHF1YXRlcm5pb24gcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcclxuICogQHBhcmFtIHtxdWF0fSBxIHF1YXRlcm5pb25cclxuICogQHBhcmFtIHt2ZWMzfSB0IHRyYW5sYXRpb24gdmVjdG9yXHJcbiAqIEByZXR1cm5zIHtxdWF0Mn0gZHVhbCBxdWF0ZXJuaW9uIHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21Sb3RhdGlvblRyYW5zbGF0aW9uKG91dCwgcSwgdCkge1xuICB2YXIgYXggPSB0WzBdICogMC41LFxuICAgICAgYXkgPSB0WzFdICogMC41LFxuICAgICAgYXogPSB0WzJdICogMC41LFxuICAgICAgYnggPSBxWzBdLFxuICAgICAgYnkgPSBxWzFdLFxuICAgICAgYnogPSBxWzJdLFxuICAgICAgYncgPSBxWzNdO1xuICBvdXRbMF0gPSBieDtcbiAgb3V0WzFdID0gYnk7XG4gIG91dFsyXSA9IGJ6O1xuICBvdXRbM10gPSBidztcbiAgb3V0WzRdID0gYXggKiBidyArIGF5ICogYnogLSBheiAqIGJ5O1xuICBvdXRbNV0gPSBheSAqIGJ3ICsgYXogKiBieCAtIGF4ICogYno7XG4gIG91dFs2XSA9IGF6ICogYncgKyBheCAqIGJ5IC0gYXkgKiBieDtcbiAgb3V0WzddID0gLWF4ICogYnggLSBheSAqIGJ5IC0gYXogKiBiejtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDcmVhdGVzIGEgZHVhbCBxdWF0IGZyb20gYSB0cmFuc2xhdGlvblxyXG4gKlxyXG4gKiBAcGFyYW0ge3F1YXQyfSBkdWFsIHF1YXRlcm5pb24gcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcclxuICogQHBhcmFtIHt2ZWMzfSB0IHRyYW5zbGF0aW9uIHZlY3RvclxyXG4gKiBAcmV0dXJucyB7cXVhdDJ9IGR1YWwgcXVhdGVybmlvbiByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tVHJhbnNsYXRpb24ob3V0LCB0KSB7XG4gIG91dFswXSA9IDA7XG4gIG91dFsxXSA9IDA7XG4gIG91dFsyXSA9IDA7XG4gIG91dFszXSA9IDE7XG4gIG91dFs0XSA9IHRbMF0gKiAwLjU7XG4gIG91dFs1XSA9IHRbMV0gKiAwLjU7XG4gIG91dFs2XSA9IHRbMl0gKiAwLjU7XG4gIG91dFs3XSA9IDA7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ3JlYXRlcyBhIGR1YWwgcXVhdCBmcm9tIGEgcXVhdGVybmlvblxyXG4gKlxyXG4gKiBAcGFyYW0ge3F1YXQyfSBkdWFsIHF1YXRlcm5pb24gcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcclxuICogQHBhcmFtIHtxdWF0fSBxIHRoZSBxdWF0ZXJuaW9uXHJcbiAqIEByZXR1cm5zIHtxdWF0Mn0gZHVhbCBxdWF0ZXJuaW9uIHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21Sb3RhdGlvbihvdXQsIHEpIHtcbiAgb3V0WzBdID0gcVswXTtcbiAgb3V0WzFdID0gcVsxXTtcbiAgb3V0WzJdID0gcVsyXTtcbiAgb3V0WzNdID0gcVszXTtcbiAgb3V0WzRdID0gMDtcbiAgb3V0WzVdID0gMDtcbiAgb3V0WzZdID0gMDtcbiAgb3V0WzddID0gMDtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDcmVhdGVzIGEgbmV3IGR1YWwgcXVhdCBmcm9tIGEgbWF0cml4ICg0eDQpXHJcbiAqXHJcbiAqIEBwYXJhbSB7cXVhdDJ9IG91dCB0aGUgZHVhbCBxdWF0ZXJuaW9uXHJcbiAqIEBwYXJhbSB7bWF0NH0gYSB0aGUgbWF0cml4XHJcbiAqIEByZXR1cm5zIHtxdWF0Mn0gZHVhbCBxdWF0IHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21NYXQ0KG91dCwgYSkge1xuICAvL1RPRE8gT3B0aW1pemUgdGhpc1xuICB2YXIgb3V0ZXIgPSBxdWF0LmNyZWF0ZSgpO1xuICBtYXQ0LmdldFJvdGF0aW9uKG91dGVyLCBhKTtcbiAgdmFyIHQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSgzKTtcbiAgbWF0NC5nZXRUcmFuc2xhdGlvbih0LCBhKTtcbiAgZnJvbVJvdGF0aW9uVHJhbnNsYXRpb24ob3V0LCBvdXRlciwgdCk7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ29weSB0aGUgdmFsdWVzIGZyb20gb25lIGR1YWwgcXVhdCB0byBhbm90aGVyXHJcbiAqXHJcbiAqIEBwYXJhbSB7cXVhdDJ9IG91dCB0aGUgcmVjZWl2aW5nIGR1YWwgcXVhdGVybmlvblxyXG4gKiBAcGFyYW0ge3F1YXQyfSBhIHRoZSBzb3VyY2UgZHVhbCBxdWF0ZXJuaW9uXHJcbiAqIEByZXR1cm5zIHtxdWF0Mn0gb3V0XHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNvcHkob3V0LCBhKSB7XG4gIG91dFswXSA9IGFbMF07XG4gIG91dFsxXSA9IGFbMV07XG4gIG91dFsyXSA9IGFbMl07XG4gIG91dFszXSA9IGFbM107XG4gIG91dFs0XSA9IGFbNF07XG4gIG91dFs1XSA9IGFbNV07XG4gIG91dFs2XSA9IGFbNl07XG4gIG91dFs3XSA9IGFbN107XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogU2V0IGEgZHVhbCBxdWF0IHRvIHRoZSBpZGVudGl0eSBkdWFsIHF1YXRlcm5pb25cclxuICpcclxuICogQHBhcmFtIHtxdWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvblxyXG4gKiBAcmV0dXJucyB7cXVhdDJ9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGlkZW50aXR5KG91dCkge1xuICBvdXRbMF0gPSAwO1xuICBvdXRbMV0gPSAwO1xuICBvdXRbMl0gPSAwO1xuICBvdXRbM10gPSAxO1xuICBvdXRbNF0gPSAwO1xuICBvdXRbNV0gPSAwO1xuICBvdXRbNl0gPSAwO1xuICBvdXRbN10gPSAwO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFNldCB0aGUgY29tcG9uZW50cyBvZiBhIGR1YWwgcXVhdCB0byB0aGUgZ2l2ZW4gdmFsdWVzXHJcbiAqXHJcbiAqIEBwYXJhbSB7cXVhdDJ9IG91dCB0aGUgcmVjZWl2aW5nIHF1YXRlcm5pb25cclxuICogQHBhcmFtIHtOdW1iZXJ9IHgxIFggY29tcG9uZW50XHJcbiAqIEBwYXJhbSB7TnVtYmVyfSB5MSBZIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0ge051bWJlcn0gejEgWiBjb21wb25lbnRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHcxIFcgY29tcG9uZW50XHJcbiAqIEBwYXJhbSB7TnVtYmVyfSB4MiBYIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0ge051bWJlcn0geTIgWSBjb21wb25lbnRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHoyIFogY29tcG9uZW50XHJcbiAqIEBwYXJhbSB7TnVtYmVyfSB3MiBXIGNvbXBvbmVudFxyXG4gKiBAcmV0dXJucyB7cXVhdDJ9IG91dFxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzZXQob3V0LCB4MSwgeTEsIHoxLCB3MSwgeDIsIHkyLCB6MiwgdzIpIHtcbiAgb3V0WzBdID0geDE7XG4gIG91dFsxXSA9IHkxO1xuICBvdXRbMl0gPSB6MTtcbiAgb3V0WzNdID0gdzE7XG4gIG91dFs0XSA9IHgyO1xuICBvdXRbNV0gPSB5MjtcbiAgb3V0WzZdID0gejI7XG4gIG91dFs3XSA9IHcyO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIEdldHMgdGhlIHJlYWwgcGFydCBvZiBhIGR1YWwgcXVhdFxyXG4gKiBAcGFyYW0gIHtxdWF0fSBvdXQgcmVhbCBwYXJ0XHJcbiAqIEBwYXJhbSAge3F1YXQyfSBhIER1YWwgUXVhdGVybmlvblxyXG4gKiBAcmV0dXJuIHtxdWF0fSByZWFsIHBhcnRcclxuICovXG5cbmV4cG9ydCB2YXIgZ2V0UmVhbCA9IHF1YXQuY29weTtcbi8qKlxyXG4gKiBHZXRzIHRoZSBkdWFsIHBhcnQgb2YgYSBkdWFsIHF1YXRcclxuICogQHBhcmFtICB7cXVhdH0gb3V0IGR1YWwgcGFydFxyXG4gKiBAcGFyYW0gIHtxdWF0Mn0gYSBEdWFsIFF1YXRlcm5pb25cclxuICogQHJldHVybiB7cXVhdH0gZHVhbCBwYXJ0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RHVhbChvdXQsIGEpIHtcbiAgb3V0WzBdID0gYVs0XTtcbiAgb3V0WzFdID0gYVs1XTtcbiAgb3V0WzJdID0gYVs2XTtcbiAgb3V0WzNdID0gYVs3XTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBTZXQgdGhlIHJlYWwgY29tcG9uZW50IG9mIGEgZHVhbCBxdWF0IHRvIHRoZSBnaXZlbiBxdWF0ZXJuaW9uXHJcbiAqXHJcbiAqIEBwYXJhbSB7cXVhdDJ9IG91dCB0aGUgcmVjZWl2aW5nIHF1YXRlcm5pb25cclxuICogQHBhcmFtIHtxdWF0fSBxIGEgcXVhdGVybmlvbiByZXByZXNlbnRpbmcgdGhlIHJlYWwgcGFydFxyXG4gKiBAcmV0dXJucyB7cXVhdDJ9IG91dFxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCB2YXIgc2V0UmVhbCA9IHF1YXQuY29weTtcbi8qKlxyXG4gKiBTZXQgdGhlIGR1YWwgY29tcG9uZW50IG9mIGEgZHVhbCBxdWF0IHRvIHRoZSBnaXZlbiBxdWF0ZXJuaW9uXHJcbiAqXHJcbiAqIEBwYXJhbSB7cXVhdDJ9IG91dCB0aGUgcmVjZWl2aW5nIHF1YXRlcm5pb25cclxuICogQHBhcmFtIHtxdWF0fSBxIGEgcXVhdGVybmlvbiByZXByZXNlbnRpbmcgdGhlIGR1YWwgcGFydFxyXG4gKiBAcmV0dXJucyB7cXVhdDJ9IG91dFxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzZXREdWFsKG91dCwgcSkge1xuICBvdXRbNF0gPSBxWzBdO1xuICBvdXRbNV0gPSBxWzFdO1xuICBvdXRbNl0gPSBxWzJdO1xuICBvdXRbN10gPSBxWzNdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIEdldHMgdGhlIHRyYW5zbGF0aW9uIG9mIGEgbm9ybWFsaXplZCBkdWFsIHF1YXRcclxuICogQHBhcmFtICB7dmVjM30gb3V0IHRyYW5zbGF0aW9uXHJcbiAqIEBwYXJhbSAge3F1YXQyfSBhIER1YWwgUXVhdGVybmlvbiB0byBiZSBkZWNvbXBvc2VkXHJcbiAqIEByZXR1cm4ge3ZlYzN9IHRyYW5zbGF0aW9uXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VHJhbnNsYXRpb24ob3V0LCBhKSB7XG4gIHZhciBheCA9IGFbNF0sXG4gICAgICBheSA9IGFbNV0sXG4gICAgICBheiA9IGFbNl0sXG4gICAgICBhdyA9IGFbN10sXG4gICAgICBieCA9IC1hWzBdLFxuICAgICAgYnkgPSAtYVsxXSxcbiAgICAgIGJ6ID0gLWFbMl0sXG4gICAgICBidyA9IGFbM107XG4gIG91dFswXSA9IChheCAqIGJ3ICsgYXcgKiBieCArIGF5ICogYnogLSBheiAqIGJ5KSAqIDI7XG4gIG91dFsxXSA9IChheSAqIGJ3ICsgYXcgKiBieSArIGF6ICogYnggLSBheCAqIGJ6KSAqIDI7XG4gIG91dFsyXSA9IChheiAqIGJ3ICsgYXcgKiBieiArIGF4ICogYnkgLSBheSAqIGJ4KSAqIDI7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogVHJhbnNsYXRlcyBhIGR1YWwgcXVhdCBieSB0aGUgZ2l2ZW4gdmVjdG9yXHJcbiAqXHJcbiAqIEBwYXJhbSB7cXVhdDJ9IG91dCB0aGUgcmVjZWl2aW5nIGR1YWwgcXVhdGVybmlvblxyXG4gKiBAcGFyYW0ge3F1YXQyfSBhIHRoZSBkdWFsIHF1YXRlcm5pb24gdG8gdHJhbnNsYXRlXHJcbiAqIEBwYXJhbSB7dmVjM30gdiB2ZWN0b3IgdG8gdHJhbnNsYXRlIGJ5XHJcbiAqIEByZXR1cm5zIHtxdWF0Mn0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNsYXRlKG91dCwgYSwgdikge1xuICB2YXIgYXgxID0gYVswXSxcbiAgICAgIGF5MSA9IGFbMV0sXG4gICAgICBhejEgPSBhWzJdLFxuICAgICAgYXcxID0gYVszXSxcbiAgICAgIGJ4MSA9IHZbMF0gKiAwLjUsXG4gICAgICBieTEgPSB2WzFdICogMC41LFxuICAgICAgYnoxID0gdlsyXSAqIDAuNSxcbiAgICAgIGF4MiA9IGFbNF0sXG4gICAgICBheTIgPSBhWzVdLFxuICAgICAgYXoyID0gYVs2XSxcbiAgICAgIGF3MiA9IGFbN107XG4gIG91dFswXSA9IGF4MTtcbiAgb3V0WzFdID0gYXkxO1xuICBvdXRbMl0gPSBhejE7XG4gIG91dFszXSA9IGF3MTtcbiAgb3V0WzRdID0gYXcxICogYngxICsgYXkxICogYnoxIC0gYXoxICogYnkxICsgYXgyO1xuICBvdXRbNV0gPSBhdzEgKiBieTEgKyBhejEgKiBieDEgLSBheDEgKiBiejEgKyBheTI7XG4gIG91dFs2XSA9IGF3MSAqIGJ6MSArIGF4MSAqIGJ5MSAtIGF5MSAqIGJ4MSArIGF6MjtcbiAgb3V0WzddID0gLWF4MSAqIGJ4MSAtIGF5MSAqIGJ5MSAtIGF6MSAqIGJ6MSArIGF3MjtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBSb3RhdGVzIGEgZHVhbCBxdWF0IGFyb3VuZCB0aGUgWCBheGlzXHJcbiAqXHJcbiAqIEBwYXJhbSB7cXVhdDJ9IG91dCB0aGUgcmVjZWl2aW5nIGR1YWwgcXVhdGVybmlvblxyXG4gKiBAcGFyYW0ge3F1YXQyfSBhIHRoZSBkdWFsIHF1YXRlcm5pb24gdG8gcm90YXRlXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSByYWQgaG93IGZhciBzaG91bGQgdGhlIHJvdGF0aW9uIGJlXHJcbiAqIEByZXR1cm5zIHtxdWF0Mn0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcm90YXRlWChvdXQsIGEsIHJhZCkge1xuICB2YXIgYnggPSAtYVswXSxcbiAgICAgIGJ5ID0gLWFbMV0sXG4gICAgICBieiA9IC1hWzJdLFxuICAgICAgYncgPSBhWzNdLFxuICAgICAgYXggPSBhWzRdLFxuICAgICAgYXkgPSBhWzVdLFxuICAgICAgYXogPSBhWzZdLFxuICAgICAgYXcgPSBhWzddLFxuICAgICAgYXgxID0gYXggKiBidyArIGF3ICogYnggKyBheSAqIGJ6IC0gYXogKiBieSxcbiAgICAgIGF5MSA9IGF5ICogYncgKyBhdyAqIGJ5ICsgYXogKiBieCAtIGF4ICogYnosXG4gICAgICBhejEgPSBheiAqIGJ3ICsgYXcgKiBieiArIGF4ICogYnkgLSBheSAqIGJ4LFxuICAgICAgYXcxID0gYXcgKiBidyAtIGF4ICogYnggLSBheSAqIGJ5IC0gYXogKiBiejtcbiAgcXVhdC5yb3RhdGVYKG91dCwgYSwgcmFkKTtcbiAgYnggPSBvdXRbMF07XG4gIGJ5ID0gb3V0WzFdO1xuICBieiA9IG91dFsyXTtcbiAgYncgPSBvdXRbM107XG4gIG91dFs0XSA9IGF4MSAqIGJ3ICsgYXcxICogYnggKyBheTEgKiBieiAtIGF6MSAqIGJ5O1xuICBvdXRbNV0gPSBheTEgKiBidyArIGF3MSAqIGJ5ICsgYXoxICogYnggLSBheDEgKiBiejtcbiAgb3V0WzZdID0gYXoxICogYncgKyBhdzEgKiBieiArIGF4MSAqIGJ5IC0gYXkxICogYng7XG4gIG91dFs3XSA9IGF3MSAqIGJ3IC0gYXgxICogYnggLSBheTEgKiBieSAtIGF6MSAqIGJ6O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFJvdGF0ZXMgYSBkdWFsIHF1YXQgYXJvdW5kIHRoZSBZIGF4aXNcclxuICpcclxuICogQHBhcmFtIHtxdWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgZHVhbCBxdWF0ZXJuaW9uXHJcbiAqIEBwYXJhbSB7cXVhdDJ9IGEgdGhlIGR1YWwgcXVhdGVybmlvbiB0byByb3RhdGVcclxuICogQHBhcmFtIHtudW1iZXJ9IHJhZCBob3cgZmFyIHNob3VsZCB0aGUgcm90YXRpb24gYmVcclxuICogQHJldHVybnMge3F1YXQyfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiByb3RhdGVZKG91dCwgYSwgcmFkKSB7XG4gIHZhciBieCA9IC1hWzBdLFxuICAgICAgYnkgPSAtYVsxXSxcbiAgICAgIGJ6ID0gLWFbMl0sXG4gICAgICBidyA9IGFbM10sXG4gICAgICBheCA9IGFbNF0sXG4gICAgICBheSA9IGFbNV0sXG4gICAgICBheiA9IGFbNl0sXG4gICAgICBhdyA9IGFbN10sXG4gICAgICBheDEgPSBheCAqIGJ3ICsgYXcgKiBieCArIGF5ICogYnogLSBheiAqIGJ5LFxuICAgICAgYXkxID0gYXkgKiBidyArIGF3ICogYnkgKyBheiAqIGJ4IC0gYXggKiBieixcbiAgICAgIGF6MSA9IGF6ICogYncgKyBhdyAqIGJ6ICsgYXggKiBieSAtIGF5ICogYngsXG4gICAgICBhdzEgPSBhdyAqIGJ3IC0gYXggKiBieCAtIGF5ICogYnkgLSBheiAqIGJ6O1xuICBxdWF0LnJvdGF0ZVkob3V0LCBhLCByYWQpO1xuICBieCA9IG91dFswXTtcbiAgYnkgPSBvdXRbMV07XG4gIGJ6ID0gb3V0WzJdO1xuICBidyA9IG91dFszXTtcbiAgb3V0WzRdID0gYXgxICogYncgKyBhdzEgKiBieCArIGF5MSAqIGJ6IC0gYXoxICogYnk7XG4gIG91dFs1XSA9IGF5MSAqIGJ3ICsgYXcxICogYnkgKyBhejEgKiBieCAtIGF4MSAqIGJ6O1xuICBvdXRbNl0gPSBhejEgKiBidyArIGF3MSAqIGJ6ICsgYXgxICogYnkgLSBheTEgKiBieDtcbiAgb3V0WzddID0gYXcxICogYncgLSBheDEgKiBieCAtIGF5MSAqIGJ5IC0gYXoxICogYno7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogUm90YXRlcyBhIGR1YWwgcXVhdCBhcm91bmQgdGhlIFogYXhpc1xyXG4gKlxyXG4gKiBAcGFyYW0ge3F1YXQyfSBvdXQgdGhlIHJlY2VpdmluZyBkdWFsIHF1YXRlcm5pb25cclxuICogQHBhcmFtIHtxdWF0Mn0gYSB0aGUgZHVhbCBxdWF0ZXJuaW9uIHRvIHJvdGF0ZVxyXG4gKiBAcGFyYW0ge251bWJlcn0gcmFkIGhvdyBmYXIgc2hvdWxkIHRoZSByb3RhdGlvbiBiZVxyXG4gKiBAcmV0dXJucyB7cXVhdDJ9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJvdGF0ZVoob3V0LCBhLCByYWQpIHtcbiAgdmFyIGJ4ID0gLWFbMF0sXG4gICAgICBieSA9IC1hWzFdLFxuICAgICAgYnogPSAtYVsyXSxcbiAgICAgIGJ3ID0gYVszXSxcbiAgICAgIGF4ID0gYVs0XSxcbiAgICAgIGF5ID0gYVs1XSxcbiAgICAgIGF6ID0gYVs2XSxcbiAgICAgIGF3ID0gYVs3XSxcbiAgICAgIGF4MSA9IGF4ICogYncgKyBhdyAqIGJ4ICsgYXkgKiBieiAtIGF6ICogYnksXG4gICAgICBheTEgPSBheSAqIGJ3ICsgYXcgKiBieSArIGF6ICogYnggLSBheCAqIGJ6LFxuICAgICAgYXoxID0gYXogKiBidyArIGF3ICogYnogKyBheCAqIGJ5IC0gYXkgKiBieCxcbiAgICAgIGF3MSA9IGF3ICogYncgLSBheCAqIGJ4IC0gYXkgKiBieSAtIGF6ICogYno7XG4gIHF1YXQucm90YXRlWihvdXQsIGEsIHJhZCk7XG4gIGJ4ID0gb3V0WzBdO1xuICBieSA9IG91dFsxXTtcbiAgYnogPSBvdXRbMl07XG4gIGJ3ID0gb3V0WzNdO1xuICBvdXRbNF0gPSBheDEgKiBidyArIGF3MSAqIGJ4ICsgYXkxICogYnogLSBhejEgKiBieTtcbiAgb3V0WzVdID0gYXkxICogYncgKyBhdzEgKiBieSArIGF6MSAqIGJ4IC0gYXgxICogYno7XG4gIG91dFs2XSA9IGF6MSAqIGJ3ICsgYXcxICogYnogKyBheDEgKiBieSAtIGF5MSAqIGJ4O1xuICBvdXRbN10gPSBhdzEgKiBidyAtIGF4MSAqIGJ4IC0gYXkxICogYnkgLSBhejEgKiBiejtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBSb3RhdGVzIGEgZHVhbCBxdWF0IGJ5IGEgZ2l2ZW4gcXVhdGVybmlvbiAoYSAqIHEpXHJcbiAqXHJcbiAqIEBwYXJhbSB7cXVhdDJ9IG91dCB0aGUgcmVjZWl2aW5nIGR1YWwgcXVhdGVybmlvblxyXG4gKiBAcGFyYW0ge3F1YXQyfSBhIHRoZSBkdWFsIHF1YXRlcm5pb24gdG8gcm90YXRlXHJcbiAqIEBwYXJhbSB7cXVhdH0gcSBxdWF0ZXJuaW9uIHRvIHJvdGF0ZSBieVxyXG4gKiBAcmV0dXJucyB7cXVhdDJ9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJvdGF0ZUJ5UXVhdEFwcGVuZChvdXQsIGEsIHEpIHtcbiAgdmFyIHF4ID0gcVswXSxcbiAgICAgIHF5ID0gcVsxXSxcbiAgICAgIHF6ID0gcVsyXSxcbiAgICAgIHF3ID0gcVszXSxcbiAgICAgIGF4ID0gYVswXSxcbiAgICAgIGF5ID0gYVsxXSxcbiAgICAgIGF6ID0gYVsyXSxcbiAgICAgIGF3ID0gYVszXTtcbiAgb3V0WzBdID0gYXggKiBxdyArIGF3ICogcXggKyBheSAqIHF6IC0gYXogKiBxeTtcbiAgb3V0WzFdID0gYXkgKiBxdyArIGF3ICogcXkgKyBheiAqIHF4IC0gYXggKiBxejtcbiAgb3V0WzJdID0gYXogKiBxdyArIGF3ICogcXogKyBheCAqIHF5IC0gYXkgKiBxeDtcbiAgb3V0WzNdID0gYXcgKiBxdyAtIGF4ICogcXggLSBheSAqIHF5IC0gYXogKiBxejtcbiAgYXggPSBhWzRdO1xuICBheSA9IGFbNV07XG4gIGF6ID0gYVs2XTtcbiAgYXcgPSBhWzddO1xuICBvdXRbNF0gPSBheCAqIHF3ICsgYXcgKiBxeCArIGF5ICogcXogLSBheiAqIHF5O1xuICBvdXRbNV0gPSBheSAqIHF3ICsgYXcgKiBxeSArIGF6ICogcXggLSBheCAqIHF6O1xuICBvdXRbNl0gPSBheiAqIHF3ICsgYXcgKiBxeiArIGF4ICogcXkgLSBheSAqIHF4O1xuICBvdXRbN10gPSBhdyAqIHF3IC0gYXggKiBxeCAtIGF5ICogcXkgLSBheiAqIHF6O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFJvdGF0ZXMgYSBkdWFsIHF1YXQgYnkgYSBnaXZlbiBxdWF0ZXJuaW9uIChxICogYSlcclxuICpcclxuICogQHBhcmFtIHtxdWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgZHVhbCBxdWF0ZXJuaW9uXHJcbiAqIEBwYXJhbSB7cXVhdH0gcSBxdWF0ZXJuaW9uIHRvIHJvdGF0ZSBieVxyXG4gKiBAcGFyYW0ge3F1YXQyfSBhIHRoZSBkdWFsIHF1YXRlcm5pb24gdG8gcm90YXRlXHJcbiAqIEByZXR1cm5zIHtxdWF0Mn0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcm90YXRlQnlRdWF0UHJlcGVuZChvdXQsIHEsIGEpIHtcbiAgdmFyIHF4ID0gcVswXSxcbiAgICAgIHF5ID0gcVsxXSxcbiAgICAgIHF6ID0gcVsyXSxcbiAgICAgIHF3ID0gcVszXSxcbiAgICAgIGJ4ID0gYVswXSxcbiAgICAgIGJ5ID0gYVsxXSxcbiAgICAgIGJ6ID0gYVsyXSxcbiAgICAgIGJ3ID0gYVszXTtcbiAgb3V0WzBdID0gcXggKiBidyArIHF3ICogYnggKyBxeSAqIGJ6IC0gcXogKiBieTtcbiAgb3V0WzFdID0gcXkgKiBidyArIHF3ICogYnkgKyBxeiAqIGJ4IC0gcXggKiBiejtcbiAgb3V0WzJdID0gcXogKiBidyArIHF3ICogYnogKyBxeCAqIGJ5IC0gcXkgKiBieDtcbiAgb3V0WzNdID0gcXcgKiBidyAtIHF4ICogYnggLSBxeSAqIGJ5IC0gcXogKiBiejtcbiAgYnggPSBhWzRdO1xuICBieSA9IGFbNV07XG4gIGJ6ID0gYVs2XTtcbiAgYncgPSBhWzddO1xuICBvdXRbNF0gPSBxeCAqIGJ3ICsgcXcgKiBieCArIHF5ICogYnogLSBxeiAqIGJ5O1xuICBvdXRbNV0gPSBxeSAqIGJ3ICsgcXcgKiBieSArIHF6ICogYnggLSBxeCAqIGJ6O1xuICBvdXRbNl0gPSBxeiAqIGJ3ICsgcXcgKiBieiArIHF4ICogYnkgLSBxeSAqIGJ4O1xuICBvdXRbN10gPSBxdyAqIGJ3IC0gcXggKiBieCAtIHF5ICogYnkgLSBxeiAqIGJ6O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFJvdGF0ZXMgYSBkdWFsIHF1YXQgYXJvdW5kIGEgZ2l2ZW4gYXhpcy4gRG9lcyB0aGUgbm9ybWFsaXNhdGlvbiBhdXRvbWF0aWNhbGx5XHJcbiAqXHJcbiAqIEBwYXJhbSB7cXVhdDJ9IG91dCB0aGUgcmVjZWl2aW5nIGR1YWwgcXVhdGVybmlvblxyXG4gKiBAcGFyYW0ge3F1YXQyfSBhIHRoZSBkdWFsIHF1YXRlcm5pb24gdG8gcm90YXRlXHJcbiAqIEBwYXJhbSB7dmVjM30gYXhpcyB0aGUgYXhpcyB0byByb3RhdGUgYXJvdW5kXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgaG93IGZhciB0aGUgcm90YXRpb24gc2hvdWxkIGJlXHJcbiAqIEByZXR1cm5zIHtxdWF0Mn0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcm90YXRlQXJvdW5kQXhpcyhvdXQsIGEsIGF4aXMsIHJhZCkge1xuICAvL1NwZWNpYWwgY2FzZSBmb3IgcmFkID0gMFxuICBpZiAoTWF0aC5hYnMocmFkKSA8IGdsTWF0cml4LkVQU0lMT04pIHtcbiAgICByZXR1cm4gY29weShvdXQsIGEpO1xuICB9XG5cbiAgdmFyIGF4aXNMZW5ndGggPSBNYXRoLnNxcnQoYXhpc1swXSAqIGF4aXNbMF0gKyBheGlzWzFdICogYXhpc1sxXSArIGF4aXNbMl0gKiBheGlzWzJdKTtcbiAgcmFkID0gcmFkICogMC41O1xuICB2YXIgcyA9IE1hdGguc2luKHJhZCk7XG4gIHZhciBieCA9IHMgKiBheGlzWzBdIC8gYXhpc0xlbmd0aDtcbiAgdmFyIGJ5ID0gcyAqIGF4aXNbMV0gLyBheGlzTGVuZ3RoO1xuICB2YXIgYnogPSBzICogYXhpc1syXSAvIGF4aXNMZW5ndGg7XG4gIHZhciBidyA9IE1hdGguY29zKHJhZCk7XG4gIHZhciBheDEgPSBhWzBdLFxuICAgICAgYXkxID0gYVsxXSxcbiAgICAgIGF6MSA9IGFbMl0sXG4gICAgICBhdzEgPSBhWzNdO1xuICBvdXRbMF0gPSBheDEgKiBidyArIGF3MSAqIGJ4ICsgYXkxICogYnogLSBhejEgKiBieTtcbiAgb3V0WzFdID0gYXkxICogYncgKyBhdzEgKiBieSArIGF6MSAqIGJ4IC0gYXgxICogYno7XG4gIG91dFsyXSA9IGF6MSAqIGJ3ICsgYXcxICogYnogKyBheDEgKiBieSAtIGF5MSAqIGJ4O1xuICBvdXRbM10gPSBhdzEgKiBidyAtIGF4MSAqIGJ4IC0gYXkxICogYnkgLSBhejEgKiBiejtcbiAgdmFyIGF4ID0gYVs0XSxcbiAgICAgIGF5ID0gYVs1XSxcbiAgICAgIGF6ID0gYVs2XSxcbiAgICAgIGF3ID0gYVs3XTtcbiAgb3V0WzRdID0gYXggKiBidyArIGF3ICogYnggKyBheSAqIGJ6IC0gYXogKiBieTtcbiAgb3V0WzVdID0gYXkgKiBidyArIGF3ICogYnkgKyBheiAqIGJ4IC0gYXggKiBiejtcbiAgb3V0WzZdID0gYXogKiBidyArIGF3ICogYnogKyBheCAqIGJ5IC0gYXkgKiBieDtcbiAgb3V0WzddID0gYXcgKiBidyAtIGF4ICogYnggLSBheSAqIGJ5IC0gYXogKiBiejtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBBZGRzIHR3byBkdWFsIHF1YXQnc1xyXG4gKlxyXG4gKiBAcGFyYW0ge3F1YXQyfSBvdXQgdGhlIHJlY2VpdmluZyBkdWFsIHF1YXRlcm5pb25cclxuICogQHBhcmFtIHtxdWF0Mn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge3F1YXQyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcmV0dXJucyB7cXVhdDJ9IG91dFxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBhZGQob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gKyBiWzBdO1xuICBvdXRbMV0gPSBhWzFdICsgYlsxXTtcbiAgb3V0WzJdID0gYVsyXSArIGJbMl07XG4gIG91dFszXSA9IGFbM10gKyBiWzNdO1xuICBvdXRbNF0gPSBhWzRdICsgYls0XTtcbiAgb3V0WzVdID0gYVs1XSArIGJbNV07XG4gIG91dFs2XSA9IGFbNl0gKyBiWzZdO1xuICBvdXRbN10gPSBhWzddICsgYls3XTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBNdWx0aXBsaWVzIHR3byBkdWFsIHF1YXQnc1xyXG4gKlxyXG4gKiBAcGFyYW0ge3F1YXQyfSBvdXQgdGhlIHJlY2VpdmluZyBkdWFsIHF1YXRlcm5pb25cclxuICogQHBhcmFtIHtxdWF0Mn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge3F1YXQyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcmV0dXJucyB7cXVhdDJ9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG11bHRpcGx5KG91dCwgYSwgYikge1xuICB2YXIgYXgwID0gYVswXSxcbiAgICAgIGF5MCA9IGFbMV0sXG4gICAgICBhejAgPSBhWzJdLFxuICAgICAgYXcwID0gYVszXSxcbiAgICAgIGJ4MSA9IGJbNF0sXG4gICAgICBieTEgPSBiWzVdLFxuICAgICAgYnoxID0gYls2XSxcbiAgICAgIGJ3MSA9IGJbN10sXG4gICAgICBheDEgPSBhWzRdLFxuICAgICAgYXkxID0gYVs1XSxcbiAgICAgIGF6MSA9IGFbNl0sXG4gICAgICBhdzEgPSBhWzddLFxuICAgICAgYngwID0gYlswXSxcbiAgICAgIGJ5MCA9IGJbMV0sXG4gICAgICBiejAgPSBiWzJdLFxuICAgICAgYncwID0gYlszXTtcbiAgb3V0WzBdID0gYXgwICogYncwICsgYXcwICogYngwICsgYXkwICogYnowIC0gYXowICogYnkwO1xuICBvdXRbMV0gPSBheTAgKiBidzAgKyBhdzAgKiBieTAgKyBhejAgKiBieDAgLSBheDAgKiBiejA7XG4gIG91dFsyXSA9IGF6MCAqIGJ3MCArIGF3MCAqIGJ6MCArIGF4MCAqIGJ5MCAtIGF5MCAqIGJ4MDtcbiAgb3V0WzNdID0gYXcwICogYncwIC0gYXgwICogYngwIC0gYXkwICogYnkwIC0gYXowICogYnowO1xuICBvdXRbNF0gPSBheDAgKiBidzEgKyBhdzAgKiBieDEgKyBheTAgKiBiejEgLSBhejAgKiBieTEgKyBheDEgKiBidzAgKyBhdzEgKiBieDAgKyBheTEgKiBiejAgLSBhejEgKiBieTA7XG4gIG91dFs1XSA9IGF5MCAqIGJ3MSArIGF3MCAqIGJ5MSArIGF6MCAqIGJ4MSAtIGF4MCAqIGJ6MSArIGF5MSAqIGJ3MCArIGF3MSAqIGJ5MCArIGF6MSAqIGJ4MCAtIGF4MSAqIGJ6MDtcbiAgb3V0WzZdID0gYXowICogYncxICsgYXcwICogYnoxICsgYXgwICogYnkxIC0gYXkwICogYngxICsgYXoxICogYncwICsgYXcxICogYnowICsgYXgxICogYnkwIC0gYXkxICogYngwO1xuICBvdXRbN10gPSBhdzAgKiBidzEgLSBheDAgKiBieDEgLSBheTAgKiBieTEgLSBhejAgKiBiejEgKyBhdzEgKiBidzAgLSBheDEgKiBieDAgLSBheTEgKiBieTAgLSBhejEgKiBiejA7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQWxpYXMgZm9yIHtAbGluayBxdWF0Mi5tdWx0aXBseX1cclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIG11bCA9IG11bHRpcGx5O1xuLyoqXHJcbiAqIFNjYWxlcyBhIGR1YWwgcXVhdCBieSBhIHNjYWxhciBudW1iZXJcclxuICpcclxuICogQHBhcmFtIHtxdWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgZHVhbCBxdWF0XHJcbiAqIEBwYXJhbSB7cXVhdDJ9IGEgdGhlIGR1YWwgcXVhdCB0byBzY2FsZVxyXG4gKiBAcGFyYW0ge051bWJlcn0gYiBhbW91bnQgdG8gc2NhbGUgdGhlIGR1YWwgcXVhdCBieVxyXG4gKiBAcmV0dXJucyB7cXVhdDJ9IG91dFxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzY2FsZShvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSAqIGI7XG4gIG91dFsxXSA9IGFbMV0gKiBiO1xuICBvdXRbMl0gPSBhWzJdICogYjtcbiAgb3V0WzNdID0gYVszXSAqIGI7XG4gIG91dFs0XSA9IGFbNF0gKiBiO1xuICBvdXRbNV0gPSBhWzVdICogYjtcbiAgb3V0WzZdID0gYVs2XSAqIGI7XG4gIG91dFs3XSA9IGFbN10gKiBiO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENhbGN1bGF0ZXMgdGhlIGRvdCBwcm9kdWN0IG9mIHR3byBkdWFsIHF1YXQncyAoVGhlIGRvdCBwcm9kdWN0IG9mIHRoZSByZWFsIHBhcnRzKVxyXG4gKlxyXG4gKiBAcGFyYW0ge3F1YXQyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7cXVhdDJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IGRvdCBwcm9kdWN0IG9mIGEgYW5kIGJcclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIGRvdCA9IHF1YXQuZG90O1xuLyoqXHJcbiAqIFBlcmZvcm1zIGEgbGluZWFyIGludGVycG9sYXRpb24gYmV0d2VlbiB0d28gZHVhbCBxdWF0cydzXHJcbiAqIE5PVEU6IFRoZSByZXN1bHRpbmcgZHVhbCBxdWF0ZXJuaW9ucyB3b24ndCBhbHdheXMgYmUgbm9ybWFsaXplZCAoVGhlIGVycm9yIGlzIG1vc3Qgbm90aWNlYWJsZSB3aGVuIHQgPSAwLjUpXHJcbiAqXHJcbiAqIEBwYXJhbSB7cXVhdDJ9IG91dCB0aGUgcmVjZWl2aW5nIGR1YWwgcXVhdFxyXG4gKiBAcGFyYW0ge3F1YXQyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7cXVhdDJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSB0IGludGVycG9sYXRpb24gYW1vdW50LCBpbiB0aGUgcmFuZ2UgWzAtMV0sIGJldHdlZW4gdGhlIHR3byBpbnB1dHNcclxuICogQHJldHVybnMge3F1YXQyfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBsZXJwKG91dCwgYSwgYiwgdCkge1xuICB2YXIgbXQgPSAxIC0gdDtcbiAgaWYgKGRvdChhLCBiKSA8IDApIHQgPSAtdDtcbiAgb3V0WzBdID0gYVswXSAqIG10ICsgYlswXSAqIHQ7XG4gIG91dFsxXSA9IGFbMV0gKiBtdCArIGJbMV0gKiB0O1xuICBvdXRbMl0gPSBhWzJdICogbXQgKyBiWzJdICogdDtcbiAgb3V0WzNdID0gYVszXSAqIG10ICsgYlszXSAqIHQ7XG4gIG91dFs0XSA9IGFbNF0gKiBtdCArIGJbNF0gKiB0O1xuICBvdXRbNV0gPSBhWzVdICogbXQgKyBiWzVdICogdDtcbiAgb3V0WzZdID0gYVs2XSAqIG10ICsgYls2XSAqIHQ7XG4gIG91dFs3XSA9IGFbN10gKiBtdCArIGJbN10gKiB0O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENhbGN1bGF0ZXMgdGhlIGludmVyc2Ugb2YgYSBkdWFsIHF1YXQuIElmIHRoZXkgYXJlIG5vcm1hbGl6ZWQsIGNvbmp1Z2F0ZSBpcyBjaGVhcGVyXHJcbiAqXHJcbiAqIEBwYXJhbSB7cXVhdDJ9IG91dCB0aGUgcmVjZWl2aW5nIGR1YWwgcXVhdGVybmlvblxyXG4gKiBAcGFyYW0ge3F1YXQyfSBhIGR1YWwgcXVhdCB0byBjYWxjdWxhdGUgaW52ZXJzZSBvZlxyXG4gKiBAcmV0dXJucyB7cXVhdDJ9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGludmVydChvdXQsIGEpIHtcbiAgdmFyIHNxbGVuID0gc3F1YXJlZExlbmd0aChhKTtcbiAgb3V0WzBdID0gLWFbMF0gLyBzcWxlbjtcbiAgb3V0WzFdID0gLWFbMV0gLyBzcWxlbjtcbiAgb3V0WzJdID0gLWFbMl0gLyBzcWxlbjtcbiAgb3V0WzNdID0gYVszXSAvIHNxbGVuO1xuICBvdXRbNF0gPSAtYVs0XSAvIHNxbGVuO1xuICBvdXRbNV0gPSAtYVs1XSAvIHNxbGVuO1xuICBvdXRbNl0gPSAtYVs2XSAvIHNxbGVuO1xuICBvdXRbN10gPSBhWzddIC8gc3FsZW47XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ2FsY3VsYXRlcyB0aGUgY29uanVnYXRlIG9mIGEgZHVhbCBxdWF0XHJcbiAqIElmIHRoZSBkdWFsIHF1YXRlcm5pb24gaXMgbm9ybWFsaXplZCwgdGhpcyBmdW5jdGlvbiBpcyBmYXN0ZXIgdGhhbiBxdWF0Mi5pbnZlcnNlIGFuZCBwcm9kdWNlcyB0aGUgc2FtZSByZXN1bHQuXHJcbiAqXHJcbiAqIEBwYXJhbSB7cXVhdDJ9IG91dCB0aGUgcmVjZWl2aW5nIHF1YXRlcm5pb25cclxuICogQHBhcmFtIHtxdWF0Mn0gYSBxdWF0IHRvIGNhbGN1bGF0ZSBjb25qdWdhdGUgb2ZcclxuICogQHJldHVybnMge3F1YXQyfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjb25qdWdhdGUob3V0LCBhKSB7XG4gIG91dFswXSA9IC1hWzBdO1xuICBvdXRbMV0gPSAtYVsxXTtcbiAgb3V0WzJdID0gLWFbMl07XG4gIG91dFszXSA9IGFbM107XG4gIG91dFs0XSA9IC1hWzRdO1xuICBvdXRbNV0gPSAtYVs1XTtcbiAgb3V0WzZdID0gLWFbNl07XG4gIG91dFs3XSA9IGFbN107XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ2FsY3VsYXRlcyB0aGUgbGVuZ3RoIG9mIGEgZHVhbCBxdWF0XHJcbiAqXHJcbiAqIEBwYXJhbSB7cXVhdDJ9IGEgZHVhbCBxdWF0IHRvIGNhbGN1bGF0ZSBsZW5ndGggb2ZcclxuICogQHJldHVybnMge051bWJlcn0gbGVuZ3RoIG9mIGFcclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIGxlbmd0aCA9IHF1YXQubGVuZ3RoO1xuLyoqXHJcbiAqIEFsaWFzIGZvciB7QGxpbmsgcXVhdDIubGVuZ3RofVxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCB2YXIgbGVuID0gbGVuZ3RoO1xuLyoqXHJcbiAqIENhbGN1bGF0ZXMgdGhlIHNxdWFyZWQgbGVuZ3RoIG9mIGEgZHVhbCBxdWF0XHJcbiAqXHJcbiAqIEBwYXJhbSB7cXVhdDJ9IGEgZHVhbCBxdWF0IHRvIGNhbGN1bGF0ZSBzcXVhcmVkIGxlbmd0aCBvZlxyXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBzcXVhcmVkIGxlbmd0aCBvZiBhXHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IHZhciBzcXVhcmVkTGVuZ3RoID0gcXVhdC5zcXVhcmVkTGVuZ3RoO1xuLyoqXHJcbiAqIEFsaWFzIGZvciB7QGxpbmsgcXVhdDIuc3F1YXJlZExlbmd0aH1cclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIHNxckxlbiA9IHNxdWFyZWRMZW5ndGg7XG4vKipcclxuICogTm9ybWFsaXplIGEgZHVhbCBxdWF0XHJcbiAqXHJcbiAqIEBwYXJhbSB7cXVhdDJ9IG91dCB0aGUgcmVjZWl2aW5nIGR1YWwgcXVhdGVybmlvblxyXG4gKiBAcGFyYW0ge3F1YXQyfSBhIGR1YWwgcXVhdGVybmlvbiB0byBub3JtYWxpemVcclxuICogQHJldHVybnMge3F1YXQyfSBvdXRcclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplKG91dCwgYSkge1xuICB2YXIgbWFnbml0dWRlID0gc3F1YXJlZExlbmd0aChhKTtcblxuICBpZiAobWFnbml0dWRlID4gMCkge1xuICAgIG1hZ25pdHVkZSA9IE1hdGguc3FydChtYWduaXR1ZGUpO1xuICAgIHZhciBhMCA9IGFbMF0gLyBtYWduaXR1ZGU7XG4gICAgdmFyIGExID0gYVsxXSAvIG1hZ25pdHVkZTtcbiAgICB2YXIgYTIgPSBhWzJdIC8gbWFnbml0dWRlO1xuICAgIHZhciBhMyA9IGFbM10gLyBtYWduaXR1ZGU7XG4gICAgdmFyIGIwID0gYVs0XTtcbiAgICB2YXIgYjEgPSBhWzVdO1xuICAgIHZhciBiMiA9IGFbNl07XG4gICAgdmFyIGIzID0gYVs3XTtcbiAgICB2YXIgYV9kb3RfYiA9IGEwICogYjAgKyBhMSAqIGIxICsgYTIgKiBiMiArIGEzICogYjM7XG4gICAgb3V0WzBdID0gYTA7XG4gICAgb3V0WzFdID0gYTE7XG4gICAgb3V0WzJdID0gYTI7XG4gICAgb3V0WzNdID0gYTM7XG4gICAgb3V0WzRdID0gKGIwIC0gYTAgKiBhX2RvdF9iKSAvIG1hZ25pdHVkZTtcbiAgICBvdXRbNV0gPSAoYjEgLSBhMSAqIGFfZG90X2IpIC8gbWFnbml0dWRlO1xuICAgIG91dFs2XSA9IChiMiAtIGEyICogYV9kb3RfYikgLyBtYWduaXR1ZGU7XG4gICAgb3V0WzddID0gKGIzIC0gYTMgKiBhX2RvdF9iKSAvIG1hZ25pdHVkZTtcbiAgfVxuXG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIGR1YWwgcXVhdGVuaW9uXHJcbiAqXHJcbiAqIEBwYXJhbSB7cXVhdDJ9IGEgZHVhbCBxdWF0ZXJuaW9uIHRvIHJlcHJlc2VudCBhcyBhIHN0cmluZ1xyXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGR1YWwgcXVhdFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHN0cihhKSB7XG4gIHJldHVybiAncXVhdDIoJyArIGFbMF0gKyAnLCAnICsgYVsxXSArICcsICcgKyBhWzJdICsgJywgJyArIGFbM10gKyAnLCAnICsgYVs0XSArICcsICcgKyBhWzVdICsgJywgJyArIGFbNl0gKyAnLCAnICsgYVs3XSArICcpJztcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBkdWFsIHF1YXRlcm5pb25zIGhhdmUgZXhhY3RseSB0aGUgc2FtZSBlbGVtZW50cyBpbiB0aGUgc2FtZSBwb3NpdGlvbiAod2hlbiBjb21wYXJlZCB3aXRoID09PSlcclxuICpcclxuICogQHBhcmFtIHtxdWF0Mn0gYSB0aGUgZmlyc3QgZHVhbCBxdWF0ZXJuaW9uLlxyXG4gKiBAcGFyYW0ge3F1YXQyfSBiIHRoZSBzZWNvbmQgZHVhbCBxdWF0ZXJuaW9uLlxyXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiB0aGUgZHVhbCBxdWF0ZXJuaW9ucyBhcmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS5cclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBleGFjdEVxdWFscyhhLCBiKSB7XG4gIHJldHVybiBhWzBdID09PSBiWzBdICYmIGFbMV0gPT09IGJbMV0gJiYgYVsyXSA9PT0gYlsyXSAmJiBhWzNdID09PSBiWzNdICYmIGFbNF0gPT09IGJbNF0gJiYgYVs1XSA9PT0gYls1XSAmJiBhWzZdID09PSBiWzZdICYmIGFbN10gPT09IGJbN107XG59XG4vKipcclxuICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgZHVhbCBxdWF0ZXJuaW9ucyBoYXZlIGFwcHJveGltYXRlbHkgdGhlIHNhbWUgZWxlbWVudHMgaW4gdGhlIHNhbWUgcG9zaXRpb24uXHJcbiAqXHJcbiAqIEBwYXJhbSB7cXVhdDJ9IGEgdGhlIGZpcnN0IGR1YWwgcXVhdC5cclxuICogQHBhcmFtIHtxdWF0Mn0gYiB0aGUgc2Vjb25kIGR1YWwgcXVhdC5cclxuICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgdGhlIGR1YWwgcXVhdHMgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZXF1YWxzKGEsIGIpIHtcbiAgdmFyIGEwID0gYVswXSxcbiAgICAgIGExID0gYVsxXSxcbiAgICAgIGEyID0gYVsyXSxcbiAgICAgIGEzID0gYVszXSxcbiAgICAgIGE0ID0gYVs0XSxcbiAgICAgIGE1ID0gYVs1XSxcbiAgICAgIGE2ID0gYVs2XSxcbiAgICAgIGE3ID0gYVs3XTtcbiAgdmFyIGIwID0gYlswXSxcbiAgICAgIGIxID0gYlsxXSxcbiAgICAgIGIyID0gYlsyXSxcbiAgICAgIGIzID0gYlszXSxcbiAgICAgIGI0ID0gYls0XSxcbiAgICAgIGI1ID0gYls1XSxcbiAgICAgIGI2ID0gYls2XSxcbiAgICAgIGI3ID0gYls3XTtcbiAgcmV0dXJuIE1hdGguYWJzKGEwIC0gYjApIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGEwKSwgTWF0aC5hYnMoYjApKSAmJiBNYXRoLmFicyhhMSAtIGIxKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMSksIE1hdGguYWJzKGIxKSkgJiYgTWF0aC5hYnMoYTIgLSBiMikgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTIpLCBNYXRoLmFicyhiMikpICYmIE1hdGguYWJzKGEzIC0gYjMpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGEzKSwgTWF0aC5hYnMoYjMpKSAmJiBNYXRoLmFicyhhNCAtIGI0KSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhNCksIE1hdGguYWJzKGI0KSkgJiYgTWF0aC5hYnMoYTUgLSBiNSkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTUpLCBNYXRoLmFicyhiNSkpICYmIE1hdGguYWJzKGE2IC0gYjYpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGE2KSwgTWF0aC5hYnMoYjYpKSAmJiBNYXRoLmFicyhhNyAtIGI3KSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhNyksIE1hdGguYWJzKGI3KSk7XG59IiwiaW1wb3J0ICogYXMgZ2xNYXRyaXggZnJvbSBcIi4vY29tbW9uLmpzXCI7XG4vKipcclxuICogMiBEaW1lbnNpb25hbCBWZWN0b3JcclxuICogQG1vZHVsZSB2ZWMyXHJcbiAqL1xuXG4vKipcclxuICogQ3JlYXRlcyBhIG5ldywgZW1wdHkgdmVjMlxyXG4gKlxyXG4gKiBAcmV0dXJucyB7dmVjMn0gYSBuZXcgMkQgdmVjdG9yXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlKCkge1xuICB2YXIgb3V0ID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoMik7XG5cbiAgaWYgKGdsTWF0cml4LkFSUkFZX1RZUEUgIT0gRmxvYXQzMkFycmF5KSB7XG4gICAgb3V0WzBdID0gMDtcbiAgICBvdXRbMV0gPSAwO1xuICB9XG5cbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDcmVhdGVzIGEgbmV3IHZlYzIgaW5pdGlhbGl6ZWQgd2l0aCB2YWx1ZXMgZnJvbSBhbiBleGlzdGluZyB2ZWN0b3JcclxuICpcclxuICogQHBhcmFtIHt2ZWMyfSBhIHZlY3RvciB0byBjbG9uZVxyXG4gKiBAcmV0dXJucyB7dmVjMn0gYSBuZXcgMkQgdmVjdG9yXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY2xvbmUoYSkge1xuICB2YXIgb3V0ID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoMik7XG4gIG91dFswXSA9IGFbMF07XG4gIG91dFsxXSA9IGFbMV07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ3JlYXRlcyBhIG5ldyB2ZWMyIGluaXRpYWxpemVkIHdpdGggdGhlIGdpdmVuIHZhbHVlc1xyXG4gKlxyXG4gKiBAcGFyYW0ge051bWJlcn0geCBYIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0ge051bWJlcn0geSBZIGNvbXBvbmVudFxyXG4gKiBAcmV0dXJucyB7dmVjMn0gYSBuZXcgMkQgdmVjdG9yXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVZhbHVlcyh4LCB5KSB7XG4gIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSgyKTtcbiAgb3V0WzBdID0geDtcbiAgb3V0WzFdID0geTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDb3B5IHRoZSB2YWx1ZXMgZnJvbSBvbmUgdmVjMiB0byBhbm90aGVyXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7dmVjMn0gYSB0aGUgc291cmNlIHZlY3RvclxyXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY29weShvdXQsIGEpIHtcbiAgb3V0WzBdID0gYVswXTtcbiAgb3V0WzFdID0gYVsxXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBTZXQgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWMyIHRvIHRoZSBnaXZlbiB2YWx1ZXNcclxuICpcclxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtOdW1iZXJ9IHggWCBjb21wb25lbnRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHkgWSBjb21wb25lbnRcclxuICogQHJldHVybnMge3ZlYzJ9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHNldChvdXQsIHgsIHkpIHtcbiAgb3V0WzBdID0geDtcbiAgb3V0WzFdID0geTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBBZGRzIHR3byB2ZWMyJ3NcclxuICpcclxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHt2ZWMyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7dmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge3ZlYzJ9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGFkZChvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSArIGJbMF07XG4gIG91dFsxXSA9IGFbMV0gKyBiWzFdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFN1YnRyYWN0cyB2ZWN0b3IgYiBmcm9tIHZlY3RvciBhXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7dmVjMn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge3ZlYzJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzdWJ0cmFjdChvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSAtIGJbMF07XG4gIG91dFsxXSA9IGFbMV0gLSBiWzFdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIE11bHRpcGxpZXMgdHdvIHZlYzInc1xyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHt2ZWMyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbXVsdGlwbHkob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gKiBiWzBdO1xuICBvdXRbMV0gPSBhWzFdICogYlsxXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBEaXZpZGVzIHR3byB2ZWMyJ3NcclxuICpcclxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHt2ZWMyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7dmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge3ZlYzJ9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGRpdmlkZShvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSAvIGJbMF07XG4gIG91dFsxXSA9IGFbMV0gLyBiWzFdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIE1hdGguY2VpbCB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzJcclxuICpcclxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHt2ZWMyfSBhIHZlY3RvciB0byBjZWlsXHJcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjZWlsKG91dCwgYSkge1xuICBvdXRbMF0gPSBNYXRoLmNlaWwoYVswXSk7XG4gIG91dFsxXSA9IE1hdGguY2VpbChhWzFdKTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBNYXRoLmZsb29yIHRoZSBjb21wb25lbnRzIG9mIGEgdmVjMlxyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgdmVjdG9yIHRvIGZsb29yXHJcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmbG9vcihvdXQsIGEpIHtcbiAgb3V0WzBdID0gTWF0aC5mbG9vcihhWzBdKTtcbiAgb3V0WzFdID0gTWF0aC5mbG9vcihhWzFdKTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBtaW5pbXVtIG9mIHR3byB2ZWMyJ3NcclxuICpcclxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHt2ZWMyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7dmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge3ZlYzJ9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG1pbihvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gTWF0aC5taW4oYVswXSwgYlswXSk7XG4gIG91dFsxXSA9IE1hdGgubWluKGFbMV0sIGJbMV0pO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFJldHVybnMgdGhlIG1heGltdW0gb2YgdHdvIHZlYzInc1xyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHt2ZWMyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbWF4KG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBNYXRoLm1heChhWzBdLCBiWzBdKTtcbiAgb3V0WzFdID0gTWF0aC5tYXgoYVsxXSwgYlsxXSk7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogTWF0aC5yb3VuZCB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzJcclxuICpcclxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHt2ZWMyfSBhIHZlY3RvciB0byByb3VuZFxyXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcm91bmQob3V0LCBhKSB7XG4gIG91dFswXSA9IE1hdGgucm91bmQoYVswXSk7XG4gIG91dFsxXSA9IE1hdGgucm91bmQoYVsxXSk7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogU2NhbGVzIGEgdmVjMiBieSBhIHNjYWxhciBudW1iZXJcclxuICpcclxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHt2ZWMyfSBhIHRoZSB2ZWN0b3IgdG8gc2NhbGVcclxuICogQHBhcmFtIHtOdW1iZXJ9IGIgYW1vdW50IHRvIHNjYWxlIHRoZSB2ZWN0b3IgYnlcclxuICogQHJldHVybnMge3ZlYzJ9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHNjYWxlKG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBhWzBdICogYjtcbiAgb3V0WzFdID0gYVsxXSAqIGI7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQWRkcyB0d28gdmVjMidzIGFmdGVyIHNjYWxpbmcgdGhlIHNlY29uZCBvcGVyYW5kIGJ5IGEgc2NhbGFyIHZhbHVlXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7dmVjMn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge3ZlYzJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBzY2FsZSB0aGUgYW1vdW50IHRvIHNjYWxlIGIgYnkgYmVmb3JlIGFkZGluZ1xyXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc2NhbGVBbmRBZGQob3V0LCBhLCBiLCBzY2FsZSkge1xuICBvdXRbMF0gPSBhWzBdICsgYlswXSAqIHNjYWxlO1xuICBvdXRbMV0gPSBhWzFdICsgYlsxXSAqIHNjYWxlO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENhbGN1bGF0ZXMgdGhlIGV1Y2xpZGlhbiBkaXN0YW5jZSBiZXR3ZWVuIHR3byB2ZWMyJ3NcclxuICpcclxuICogQHBhcmFtIHt2ZWMyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7dmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge051bWJlcn0gZGlzdGFuY2UgYmV0d2VlbiBhIGFuZCBiXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZGlzdGFuY2UoYSwgYikge1xuICB2YXIgeCA9IGJbMF0gLSBhWzBdLFxuICAgICAgeSA9IGJbMV0gLSBhWzFdO1xuICByZXR1cm4gTWF0aC5zcXJ0KHggKiB4ICsgeSAqIHkpO1xufVxuLyoqXHJcbiAqIENhbGN1bGF0ZXMgdGhlIHNxdWFyZWQgZXVjbGlkaWFuIGRpc3RhbmNlIGJldHdlZW4gdHdvIHZlYzInc1xyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHt2ZWMyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBzcXVhcmVkIGRpc3RhbmNlIGJldHdlZW4gYSBhbmQgYlxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHNxdWFyZWREaXN0YW5jZShhLCBiKSB7XG4gIHZhciB4ID0gYlswXSAtIGFbMF0sXG4gICAgICB5ID0gYlsxXSAtIGFbMV07XG4gIHJldHVybiB4ICogeCArIHkgKiB5O1xufVxuLyoqXHJcbiAqIENhbGN1bGF0ZXMgdGhlIGxlbmd0aCBvZiBhIHZlYzJcclxuICpcclxuICogQHBhcmFtIHt2ZWMyfSBhIHZlY3RvciB0byBjYWxjdWxhdGUgbGVuZ3RoIG9mXHJcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IGxlbmd0aCBvZiBhXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbGVuZ3RoKGEpIHtcbiAgdmFyIHggPSBhWzBdLFxuICAgICAgeSA9IGFbMV07XG4gIHJldHVybiBNYXRoLnNxcnQoeCAqIHggKyB5ICogeSk7XG59XG4vKipcclxuICogQ2FsY3VsYXRlcyB0aGUgc3F1YXJlZCBsZW5ndGggb2YgYSB2ZWMyXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjMn0gYSB2ZWN0b3IgdG8gY2FsY3VsYXRlIHNxdWFyZWQgbGVuZ3RoIG9mXHJcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IHNxdWFyZWQgbGVuZ3RoIG9mIGFcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzcXVhcmVkTGVuZ3RoKGEpIHtcbiAgdmFyIHggPSBhWzBdLFxuICAgICAgeSA9IGFbMV07XG4gIHJldHVybiB4ICogeCArIHkgKiB5O1xufVxuLyoqXHJcbiAqIE5lZ2F0ZXMgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWMyXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7dmVjMn0gYSB2ZWN0b3IgdG8gbmVnYXRlXHJcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBuZWdhdGUob3V0LCBhKSB7XG4gIG91dFswXSA9IC1hWzBdO1xuICBvdXRbMV0gPSAtYVsxXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBpbnZlcnNlIG9mIHRoZSBjb21wb25lbnRzIG9mIGEgdmVjMlxyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgdmVjdG9yIHRvIGludmVydFxyXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gaW52ZXJzZShvdXQsIGEpIHtcbiAgb3V0WzBdID0gMS4wIC8gYVswXTtcbiAgb3V0WzFdID0gMS4wIC8gYVsxXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBOb3JtYWxpemUgYSB2ZWMyXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7dmVjMn0gYSB2ZWN0b3IgdG8gbm9ybWFsaXplXHJcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemUob3V0LCBhKSB7XG4gIHZhciB4ID0gYVswXSxcbiAgICAgIHkgPSBhWzFdO1xuICB2YXIgbGVuID0geCAqIHggKyB5ICogeTtcblxuICBpZiAobGVuID4gMCkge1xuICAgIC8vVE9ETzogZXZhbHVhdGUgdXNlIG9mIGdsbV9pbnZzcXJ0IGhlcmU/XG4gICAgbGVuID0gMSAvIE1hdGguc3FydChsZW4pO1xuICB9XG5cbiAgb3V0WzBdID0gYVswXSAqIGxlbjtcbiAgb3V0WzFdID0gYVsxXSAqIGxlbjtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDYWxjdWxhdGVzIHRoZSBkb3QgcHJvZHVjdCBvZiB0d28gdmVjMidzXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjMn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge3ZlYzJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IGRvdCBwcm9kdWN0IG9mIGEgYW5kIGJcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBkb3QoYSwgYikge1xuICByZXR1cm4gYVswXSAqIGJbMF0gKyBhWzFdICogYlsxXTtcbn1cbi8qKlxyXG4gKiBDb21wdXRlcyB0aGUgY3Jvc3MgcHJvZHVjdCBvZiB0d28gdmVjMidzXHJcbiAqIE5vdGUgdGhhdCB0aGUgY3Jvc3MgcHJvZHVjdCBtdXN0IGJ5IGRlZmluaXRpb24gcHJvZHVjZSBhIDNEIHZlY3RvclxyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHt2ZWMyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY3Jvc3Mob3V0LCBhLCBiKSB7XG4gIHZhciB6ID0gYVswXSAqIGJbMV0gLSBhWzFdICogYlswXTtcbiAgb3V0WzBdID0gb3V0WzFdID0gMDtcbiAgb3V0WzJdID0gejtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBQZXJmb3JtcyBhIGxpbmVhciBpbnRlcnBvbGF0aW9uIGJldHdlZW4gdHdvIHZlYzInc1xyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHt2ZWMyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge051bWJlcn0gdCBpbnRlcnBvbGF0aW9uIGFtb3VudCwgaW4gdGhlIHJhbmdlIFswLTFdLCBiZXR3ZWVuIHRoZSB0d28gaW5wdXRzXHJcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBsZXJwKG91dCwgYSwgYiwgdCkge1xuICB2YXIgYXggPSBhWzBdLFxuICAgICAgYXkgPSBhWzFdO1xuICBvdXRbMF0gPSBheCArIHQgKiAoYlswXSAtIGF4KTtcbiAgb3V0WzFdID0gYXkgKyB0ICogKGJbMV0gLSBheSk7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogR2VuZXJhdGVzIGEgcmFuZG9tIHZlY3RvciB3aXRoIHRoZSBnaXZlbiBzY2FsZVxyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge051bWJlcn0gW3NjYWxlXSBMZW5ndGggb2YgdGhlIHJlc3VsdGluZyB2ZWN0b3IuIElmIG9tbWl0dGVkLCBhIHVuaXQgdmVjdG9yIHdpbGwgYmUgcmV0dXJuZWRcclxuICogQHJldHVybnMge3ZlYzJ9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJhbmRvbShvdXQsIHNjYWxlKSB7XG4gIHNjYWxlID0gc2NhbGUgfHwgMS4wO1xuICB2YXIgciA9IGdsTWF0cml4LlJBTkRPTSgpICogMi4wICogTWF0aC5QSTtcbiAgb3V0WzBdID0gTWF0aC5jb3MocikgKiBzY2FsZTtcbiAgb3V0WzFdID0gTWF0aC5zaW4ocikgKiBzY2FsZTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBUcmFuc2Zvcm1zIHRoZSB2ZWMyIHdpdGggYSBtYXQyXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7dmVjMn0gYSB0aGUgdmVjdG9yIHRvIHRyYW5zZm9ybVxyXG4gKiBAcGFyYW0ge21hdDJ9IG0gbWF0cml4IHRvIHRyYW5zZm9ybSB3aXRoXHJcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm1NYXQyKG91dCwgYSwgbSkge1xuICB2YXIgeCA9IGFbMF0sXG4gICAgICB5ID0gYVsxXTtcbiAgb3V0WzBdID0gbVswXSAqIHggKyBtWzJdICogeTtcbiAgb3V0WzFdID0gbVsxXSAqIHggKyBtWzNdICogeTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBUcmFuc2Zvcm1zIHRoZSB2ZWMyIHdpdGggYSBtYXQyZFxyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgdGhlIHZlY3RvciB0byB0cmFuc2Zvcm1cclxuICogQHBhcmFtIHttYXQyZH0gbSBtYXRyaXggdG8gdHJhbnNmb3JtIHdpdGhcclxuICogQHJldHVybnMge3ZlYzJ9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zZm9ybU1hdDJkKG91dCwgYSwgbSkge1xuICB2YXIgeCA9IGFbMF0sXG4gICAgICB5ID0gYVsxXTtcbiAgb3V0WzBdID0gbVswXSAqIHggKyBtWzJdICogeSArIG1bNF07XG4gIG91dFsxXSA9IG1bMV0gKiB4ICsgbVszXSAqIHkgKyBtWzVdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFRyYW5zZm9ybXMgdGhlIHZlYzIgd2l0aCBhIG1hdDNcclxuICogM3JkIHZlY3RvciBjb21wb25lbnQgaXMgaW1wbGljaXRseSAnMSdcclxuICpcclxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHt2ZWMyfSBhIHRoZSB2ZWN0b3IgdG8gdHJhbnNmb3JtXHJcbiAqIEBwYXJhbSB7bWF0M30gbSBtYXRyaXggdG8gdHJhbnNmb3JtIHdpdGhcclxuICogQHJldHVybnMge3ZlYzJ9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zZm9ybU1hdDMob3V0LCBhLCBtKSB7XG4gIHZhciB4ID0gYVswXSxcbiAgICAgIHkgPSBhWzFdO1xuICBvdXRbMF0gPSBtWzBdICogeCArIG1bM10gKiB5ICsgbVs2XTtcbiAgb3V0WzFdID0gbVsxXSAqIHggKyBtWzRdICogeSArIG1bN107XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogVHJhbnNmb3JtcyB0aGUgdmVjMiB3aXRoIGEgbWF0NFxyXG4gKiAzcmQgdmVjdG9yIGNvbXBvbmVudCBpcyBpbXBsaWNpdGx5ICcwJ1xyXG4gKiA0dGggdmVjdG9yIGNvbXBvbmVudCBpcyBpbXBsaWNpdGx5ICcxJ1xyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgdGhlIHZlY3RvciB0byB0cmFuc2Zvcm1cclxuICogQHBhcmFtIHttYXQ0fSBtIG1hdHJpeCB0byB0cmFuc2Zvcm0gd2l0aFxyXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNmb3JtTWF0NChvdXQsIGEsIG0pIHtcbiAgdmFyIHggPSBhWzBdO1xuICB2YXIgeSA9IGFbMV07XG4gIG91dFswXSA9IG1bMF0gKiB4ICsgbVs0XSAqIHkgKyBtWzEyXTtcbiAgb3V0WzFdID0gbVsxXSAqIHggKyBtWzVdICogeSArIG1bMTNdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFJvdGF0ZSBhIDJEIHZlY3RvclxyXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCBUaGUgcmVjZWl2aW5nIHZlYzJcclxuICogQHBhcmFtIHt2ZWMyfSBhIFRoZSB2ZWMyIHBvaW50IHRvIHJvdGF0ZVxyXG4gKiBAcGFyYW0ge3ZlYzJ9IGIgVGhlIG9yaWdpbiBvZiB0aGUgcm90YXRpb25cclxuICogQHBhcmFtIHtOdW1iZXJ9IGMgVGhlIGFuZ2xlIG9mIHJvdGF0aW9uXHJcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiByb3RhdGUob3V0LCBhLCBiLCBjKSB7XG4gIC8vVHJhbnNsYXRlIHBvaW50IHRvIHRoZSBvcmlnaW5cbiAgdmFyIHAwID0gYVswXSAtIGJbMF0sXG4gICAgICBwMSA9IGFbMV0gLSBiWzFdLFxuICAgICAgc2luQyA9IE1hdGguc2luKGMpLFxuICAgICAgY29zQyA9IE1hdGguY29zKGMpOyAvL3BlcmZvcm0gcm90YXRpb24gYW5kIHRyYW5zbGF0ZSB0byBjb3JyZWN0IHBvc2l0aW9uXG5cbiAgb3V0WzBdID0gcDAgKiBjb3NDIC0gcDEgKiBzaW5DICsgYlswXTtcbiAgb3V0WzFdID0gcDAgKiBzaW5DICsgcDEgKiBjb3NDICsgYlsxXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBHZXQgdGhlIGFuZ2xlIGJldHdlZW4gdHdvIDJEIHZlY3RvcnNcclxuICogQHBhcmFtIHt2ZWMyfSBhIFRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7dmVjMn0gYiBUaGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge051bWJlcn0gVGhlIGFuZ2xlIGluIHJhZGlhbnNcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBhbmdsZShhLCBiKSB7XG4gIHZhciB4MSA9IGFbMF0sXG4gICAgICB5MSA9IGFbMV0sXG4gICAgICB4MiA9IGJbMF0sXG4gICAgICB5MiA9IGJbMV07XG4gIHZhciBsZW4xID0geDEgKiB4MSArIHkxICogeTE7XG5cbiAgaWYgKGxlbjEgPiAwKSB7XG4gICAgLy9UT0RPOiBldmFsdWF0ZSB1c2Ugb2YgZ2xtX2ludnNxcnQgaGVyZT9cbiAgICBsZW4xID0gMSAvIE1hdGguc3FydChsZW4xKTtcbiAgfVxuXG4gIHZhciBsZW4yID0geDIgKiB4MiArIHkyICogeTI7XG5cbiAgaWYgKGxlbjIgPiAwKSB7XG4gICAgLy9UT0RPOiBldmFsdWF0ZSB1c2Ugb2YgZ2xtX2ludnNxcnQgaGVyZT9cbiAgICBsZW4yID0gMSAvIE1hdGguc3FydChsZW4yKTtcbiAgfVxuXG4gIHZhciBjb3NpbmUgPSAoeDEgKiB4MiArIHkxICogeTIpICogbGVuMSAqIGxlbjI7XG5cbiAgaWYgKGNvc2luZSA+IDEuMCkge1xuICAgIHJldHVybiAwO1xuICB9IGVsc2UgaWYgKGNvc2luZSA8IC0xLjApIHtcbiAgICByZXR1cm4gTWF0aC5QSTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gTWF0aC5hY29zKGNvc2luZSk7XG4gIH1cbn1cbi8qKlxyXG4gKiBTZXQgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWMyIHRvIHplcm9cclxuICpcclxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHJldHVybnMge3ZlYzJ9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHplcm8ob3V0KSB7XG4gIG91dFswXSA9IDAuMDtcbiAgb3V0WzFdID0gMC4wO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSB2ZWN0b3JcclxuICpcclxuICogQHBhcmFtIHt2ZWMyfSBhIHZlY3RvciB0byByZXByZXNlbnQgYXMgYSBzdHJpbmdcclxuICogQHJldHVybnMge1N0cmluZ30gc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB2ZWN0b3JcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzdHIoYSkge1xuICByZXR1cm4gJ3ZlYzIoJyArIGFbMF0gKyAnLCAnICsgYVsxXSArICcpJztcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSB2ZWN0b3JzIGV4YWN0bHkgaGF2ZSB0aGUgc2FtZSBlbGVtZW50cyBpbiB0aGUgc2FtZSBwb3NpdGlvbiAod2hlbiBjb21wYXJlZCB3aXRoID09PSlcclxuICpcclxuICogQHBhcmFtIHt2ZWMyfSBhIFRoZSBmaXJzdCB2ZWN0b3IuXHJcbiAqIEBwYXJhbSB7dmVjMn0gYiBUaGUgc2Vjb25kIHZlY3Rvci5cclxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZlY3RvcnMgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZXhhY3RFcXVhbHMoYSwgYikge1xuICByZXR1cm4gYVswXSA9PT0gYlswXSAmJiBhWzFdID09PSBiWzFdO1xufVxuLyoqXHJcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHZlY3RvcnMgaGF2ZSBhcHByb3hpbWF0ZWx5IHRoZSBzYW1lIGVsZW1lbnRzIGluIHRoZSBzYW1lIHBvc2l0aW9uLlxyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgVGhlIGZpcnN0IHZlY3Rvci5cclxuICogQHBhcmFtIHt2ZWMyfSBiIFRoZSBzZWNvbmQgdmVjdG9yLlxyXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmVjdG9ycyBhcmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS5cclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBlcXVhbHMoYSwgYikge1xuICB2YXIgYTAgPSBhWzBdLFxuICAgICAgYTEgPSBhWzFdO1xuICB2YXIgYjAgPSBiWzBdLFxuICAgICAgYjEgPSBiWzFdO1xuICByZXR1cm4gTWF0aC5hYnMoYTAgLSBiMCkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTApLCBNYXRoLmFicyhiMCkpICYmIE1hdGguYWJzKGExIC0gYjEpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGExKSwgTWF0aC5hYnMoYjEpKTtcbn1cbi8qKlxyXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzIubGVuZ3RofVxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCB2YXIgbGVuID0gbGVuZ3RoO1xuLyoqXHJcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMi5zdWJ0cmFjdH1cclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIHN1YiA9IHN1YnRyYWN0O1xuLyoqXHJcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMi5tdWx0aXBseX1cclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIG11bCA9IG11bHRpcGx5O1xuLyoqXHJcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMi5kaXZpZGV9XHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IHZhciBkaXYgPSBkaXZpZGU7XG4vKipcclxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMyLmRpc3RhbmNlfVxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCB2YXIgZGlzdCA9IGRpc3RhbmNlO1xuLyoqXHJcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMi5zcXVhcmVkRGlzdGFuY2V9XHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IHZhciBzcXJEaXN0ID0gc3F1YXJlZERpc3RhbmNlO1xuLyoqXHJcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMi5zcXVhcmVkTGVuZ3RofVxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCB2YXIgc3FyTGVuID0gc3F1YXJlZExlbmd0aDtcbi8qKlxyXG4gKiBQZXJmb3JtIHNvbWUgb3BlcmF0aW9uIG92ZXIgYW4gYXJyYXkgb2YgdmVjMnMuXHJcbiAqXHJcbiAqIEBwYXJhbSB7QXJyYXl9IGEgdGhlIGFycmF5IG9mIHZlY3RvcnMgdG8gaXRlcmF0ZSBvdmVyXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBzdHJpZGUgTnVtYmVyIG9mIGVsZW1lbnRzIGJldHdlZW4gdGhlIHN0YXJ0IG9mIGVhY2ggdmVjMi4gSWYgMCBhc3N1bWVzIHRpZ2h0bHkgcGFja2VkXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBvZmZzZXQgTnVtYmVyIG9mIGVsZW1lbnRzIHRvIHNraXAgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYXJyYXlcclxuICogQHBhcmFtIHtOdW1iZXJ9IGNvdW50IE51bWJlciBvZiB2ZWMycyB0byBpdGVyYXRlIG92ZXIuIElmIDAgaXRlcmF0ZXMgb3ZlciBlbnRpcmUgYXJyYXlcclxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gRnVuY3Rpb24gdG8gY2FsbCBmb3IgZWFjaCB2ZWN0b3IgaW4gdGhlIGFycmF5XHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBbYXJnXSBhZGRpdGlvbmFsIGFyZ3VtZW50IHRvIHBhc3MgdG8gZm5cclxuICogQHJldHVybnMge0FycmF5fSBhXHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IHZhciBmb3JFYWNoID0gZnVuY3Rpb24gKCkge1xuICB2YXIgdmVjID0gY3JlYXRlKCk7XG4gIHJldHVybiBmdW5jdGlvbiAoYSwgc3RyaWRlLCBvZmZzZXQsIGNvdW50LCBmbiwgYXJnKSB7XG4gICAgdmFyIGksIGw7XG5cbiAgICBpZiAoIXN0cmlkZSkge1xuICAgICAgc3RyaWRlID0gMjtcbiAgICB9XG5cbiAgICBpZiAoIW9mZnNldCkge1xuICAgICAgb2Zmc2V0ID0gMDtcbiAgICB9XG5cbiAgICBpZiAoY291bnQpIHtcbiAgICAgIGwgPSBNYXRoLm1pbihjb3VudCAqIHN0cmlkZSArIG9mZnNldCwgYS5sZW5ndGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsID0gYS5sZW5ndGg7XG4gICAgfVxuXG4gICAgZm9yIChpID0gb2Zmc2V0OyBpIDwgbDsgaSArPSBzdHJpZGUpIHtcbiAgICAgIHZlY1swXSA9IGFbaV07XG4gICAgICB2ZWNbMV0gPSBhW2kgKyAxXTtcbiAgICAgIGZuKHZlYywgdmVjLCBhcmcpO1xuICAgICAgYVtpXSA9IHZlY1swXTtcbiAgICAgIGFbaSArIDFdID0gdmVjWzFdO1xuICAgIH1cblxuICAgIHJldHVybiBhO1xuICB9O1xufSgpOyIsIi8vIEBmbG93XG5cbmltcG9ydCBTdHlsZUxheWVyIGZyb20gJy4uL3N0eWxlX2xheWVyJztcblxuaW1wb3J0IENpcmNsZUJ1Y2tldCBmcm9tICcuLi8uLi9kYXRhL2J1Y2tldC9jaXJjbGVfYnVja2V0JztcbmltcG9ydCB7IHBvbHlnb25JbnRlcnNlY3RzQnVmZmVyZWRQb2ludCB9IGZyb20gJy4uLy4uL3V0aWwvaW50ZXJzZWN0aW9uX3Rlc3RzJztcbmltcG9ydCB7IGdldE1heGltdW1QYWludFZhbHVlLCB0cmFuc2xhdGVEaXN0YW5jZSwgdHJhbnNsYXRlIH0gZnJvbSAnLi4vcXVlcnlfdXRpbHMnO1xuaW1wb3J0IHByb3BlcnRpZXMgZnJvbSAnLi9jaXJjbGVfc3R5bGVfbGF5ZXJfcHJvcGVydGllcyc7XG5pbXBvcnQgeyBUcmFuc2l0aW9uYWJsZSwgVHJhbnNpdGlvbmluZywgUG9zc2libHlFdmFsdWF0ZWQgfSBmcm9tICcuLi9wcm9wZXJ0aWVzJztcbmltcG9ydCB7IHZlYzQgfSBmcm9tICdnbC1tYXRyaXgnO1xuaW1wb3J0IFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuXG5pbXBvcnQgdHlwZSB7IEZlYXR1cmVTdGF0ZSB9IGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvZXhwcmVzc2lvbic7XG5pbXBvcnQgdHlwZSBUcmFuc2Zvcm0gZnJvbSAnLi4vLi4vZ2VvL3RyYW5zZm9ybSc7XG5pbXBvcnQgdHlwZSB7QnVja2V0LCBCdWNrZXRQYXJhbWV0ZXJzfSBmcm9tICcuLi8uLi9kYXRhL2J1Y2tldCc7XG5pbXBvcnQgdHlwZSB7UGFpbnRQcm9wc30gZnJvbSAnLi9jaXJjbGVfc3R5bGVfbGF5ZXJfcHJvcGVydGllcyc7XG5pbXBvcnQgdHlwZSB7TGF5ZXJTcGVjaWZpY2F0aW9ufSBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL3R5cGVzJztcblxuY2xhc3MgQ2lyY2xlU3R5bGVMYXllciBleHRlbmRzIFN0eWxlTGF5ZXIge1xuICAgIF90cmFuc2l0aW9uYWJsZVBhaW50OiBUcmFuc2l0aW9uYWJsZTxQYWludFByb3BzPjtcbiAgICBfdHJhbnNpdGlvbmluZ1BhaW50OiBUcmFuc2l0aW9uaW5nPFBhaW50UHJvcHM+O1xuICAgIHBhaW50OiBQb3NzaWJseUV2YWx1YXRlZDxQYWludFByb3BzPjtcblxuICAgIGNvbnN0cnVjdG9yKGxheWVyOiBMYXllclNwZWNpZmljYXRpb24pIHtcbiAgICAgICAgc3VwZXIobGF5ZXIsIHByb3BlcnRpZXMpO1xuICAgIH1cblxuICAgIGNyZWF0ZUJ1Y2tldChwYXJhbWV0ZXJzOiBCdWNrZXRQYXJhbWV0ZXJzPCo+KSB7XG4gICAgICAgIHJldHVybiBuZXcgQ2lyY2xlQnVja2V0KHBhcmFtZXRlcnMpO1xuICAgIH1cblxuICAgIHF1ZXJ5UmFkaXVzKGJ1Y2tldDogQnVja2V0KTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgY2lyY2xlQnVja2V0OiBDaXJjbGVCdWNrZXQ8Q2lyY2xlU3R5bGVMYXllcj4gPSAoYnVja2V0OiBhbnkpO1xuICAgICAgICByZXR1cm4gZ2V0TWF4aW11bVBhaW50VmFsdWUoJ2NpcmNsZS1yYWRpdXMnLCB0aGlzLCBjaXJjbGVCdWNrZXQpICtcbiAgICAgICAgICAgIGdldE1heGltdW1QYWludFZhbHVlKCdjaXJjbGUtc3Ryb2tlLXdpZHRoJywgdGhpcywgY2lyY2xlQnVja2V0KSArXG4gICAgICAgICAgICB0cmFuc2xhdGVEaXN0YW5jZSh0aGlzLnBhaW50LmdldCgnY2lyY2xlLXRyYW5zbGF0ZScpKTtcbiAgICB9XG5cbiAgICBxdWVyeUludGVyc2VjdHNGZWF0dXJlKHF1ZXJ5R2VvbWV0cnk6IEFycmF5PFBvaW50PixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmU6IFZlY3RvclRpbGVGZWF0dXJlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZVN0YXRlOiBGZWF0dXJlU3RhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBnZW9tZXRyeTogQXJyYXk8QXJyYXk8UG9pbnQ+PixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHpvb206IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogVHJhbnNmb3JtLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxzVG9UaWxlVW5pdHM6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsUG9zTWF0cml4OiBGbG9hdDMyQXJyYXkpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgdHJhbnNsYXRlZFBvbHlnb24gPSB0cmFuc2xhdGUocXVlcnlHZW9tZXRyeSxcbiAgICAgICAgICAgIHRoaXMucGFpbnQuZ2V0KCdjaXJjbGUtdHJhbnNsYXRlJyksXG4gICAgICAgICAgICB0aGlzLnBhaW50LmdldCgnY2lyY2xlLXRyYW5zbGF0ZS1hbmNob3InKSxcbiAgICAgICAgICAgIHRyYW5zZm9ybS5hbmdsZSwgcGl4ZWxzVG9UaWxlVW5pdHMpO1xuICAgICAgICBjb25zdCByYWRpdXMgPSB0aGlzLnBhaW50LmdldCgnY2lyY2xlLXJhZGl1cycpLmV2YWx1YXRlKGZlYXR1cmUsIGZlYXR1cmVTdGF0ZSk7XG4gICAgICAgIGNvbnN0IHN0cm9rZSA9IHRoaXMucGFpbnQuZ2V0KCdjaXJjbGUtc3Ryb2tlLXdpZHRoJykuZXZhbHVhdGUoZmVhdHVyZSwgZmVhdHVyZVN0YXRlKTtcbiAgICAgICAgY29uc3Qgc2l6ZSAgPSByYWRpdXMgKyBzdHJva2U7XG5cbiAgICAgICAgLy8gRm9yIHBpdGNoLWFsaWdubWVudDogbWFwLCBjb21wYXJlIGZlYXR1cmUgZ2VvbWV0cnkgdG8gcXVlcnkgZ2VvbWV0cnkgaW4gdGhlIHBsYW5lIG9mIHRoZSB0aWxlXG4gICAgICAgIC8vIC8vIE90aGVyd2lzZSwgY29tcGFyZSBnZW9tZXRyeSBpbiB0aGUgcGxhbmUgb2YgdGhlIHZpZXdwb3J0XG4gICAgICAgIC8vIC8vIEEgY2lyY2xlIHdpdGggZml4ZWQgc2NhbGluZyByZWxhdGl2ZSB0byB0aGUgdmlld3BvcnQgZ2V0cyBsYXJnZXIgaW4gdGlsZSBzcGFjZSBhcyBpdCBtb3ZlcyBpbnRvIHRoZSBkaXN0YW5jZVxuICAgICAgICAvLyAvLyBBIGNpcmNsZSB3aXRoIGZpeGVkIHNjYWxpbmcgcmVsYXRpdmUgdG8gdGhlIG1hcCBnZXRzIHNtYWxsZXIgaW4gdmlld3BvcnQgc3BhY2UgYXMgaXQgbW92ZXMgaW50byB0aGUgZGlzdGFuY2VcbiAgICAgICAgY29uc3QgYWxpZ25XaXRoTWFwID0gdGhpcy5wYWludC5nZXQoJ2NpcmNsZS1waXRjaC1hbGlnbm1lbnQnKSA9PT0gJ21hcCc7XG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybWVkUG9seWdvbiA9IGFsaWduV2l0aE1hcCA/IHRyYW5zbGF0ZWRQb2x5Z29uIDogcHJvamVjdFF1ZXJ5R2VvbWV0cnkodHJhbnNsYXRlZFBvbHlnb24sIHBpeGVsUG9zTWF0cml4KTtcbiAgICAgICAgY29uc3QgdHJhbnNmb3JtZWRTaXplID0gYWxpZ25XaXRoTWFwID8gc2l6ZSAqIHBpeGVsc1RvVGlsZVVuaXRzIDogc2l6ZTtcblxuICAgICAgICBmb3IgKGNvbnN0IHJpbmcgb2YgZ2VvbWV0cnkpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcG9pbnQgb2YgcmluZykge1xuXG4gICAgICAgICAgICAgICAgY29uc3QgdHJhbnNmb3JtZWRQb2ludCA9IGFsaWduV2l0aE1hcCA/IHBvaW50IDogcHJvamVjdFBvaW50KHBvaW50LCBwaXhlbFBvc01hdHJpeCk7XG5cbiAgICAgICAgICAgICAgICBsZXQgYWRqdXN0ZWRTaXplID0gdHJhbnNmb3JtZWRTaXplO1xuICAgICAgICAgICAgICAgIGNvbnN0IHByb2plY3RlZENlbnRlciA9IHZlYzQudHJhbnNmb3JtTWF0NChbXSwgW3BvaW50LngsIHBvaW50LnksIDAsIDFdLCBwaXhlbFBvc01hdHJpeCk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucGFpbnQuZ2V0KCdjaXJjbGUtcGl0Y2gtc2NhbGUnKSA9PT0gJ3ZpZXdwb3J0JyAmJiB0aGlzLnBhaW50LmdldCgnY2lyY2xlLXBpdGNoLWFsaWdubWVudCcpID09PSAnbWFwJykge1xuICAgICAgICAgICAgICAgICAgICBhZGp1c3RlZFNpemUgKj0gcHJvamVjdGVkQ2VudGVyWzNdIC8gdHJhbnNmb3JtLmNhbWVyYVRvQ2VudGVyRGlzdGFuY2U7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnBhaW50LmdldCgnY2lyY2xlLXBpdGNoLXNjYWxlJykgPT09ICdtYXAnICYmIHRoaXMucGFpbnQuZ2V0KCdjaXJjbGUtcGl0Y2gtYWxpZ25tZW50JykgPT09ICd2aWV3cG9ydCcpIHtcbiAgICAgICAgICAgICAgICAgICAgYWRqdXN0ZWRTaXplICo9IHRyYW5zZm9ybS5jYW1lcmFUb0NlbnRlckRpc3RhbmNlIC8gcHJvamVjdGVkQ2VudGVyWzNdO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChwb2x5Z29uSW50ZXJzZWN0c0J1ZmZlcmVkUG9pbnQodHJhbnNmb3JtZWRQb2x5Z29uLCB0cmFuc2Zvcm1lZFBvaW50LCBhZGp1c3RlZFNpemUpKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHByb2plY3RQb2ludChwOiBQb2ludCwgcGl4ZWxQb3NNYXRyaXg6IEZsb2F0MzJBcnJheSkge1xuICAgIGNvbnN0IHBvaW50ID0gdmVjNC50cmFuc2Zvcm1NYXQ0KFtdLCBbcC54LCBwLnksIDAsIDFdLCBwaXhlbFBvc01hdHJpeCk7XG4gICAgcmV0dXJuIG5ldyBQb2ludChwb2ludFswXSAvIHBvaW50WzNdLCBwb2ludFsxXSAvIHBvaW50WzNdKTtcbn1cblxuZnVuY3Rpb24gcHJvamVjdFF1ZXJ5R2VvbWV0cnkocXVlcnlHZW9tZXRyeTogQXJyYXk8UG9pbnQ+LCBwaXhlbFBvc01hdHJpeDogRmxvYXQzMkFycmF5KSB7XG4gICAgcmV0dXJuIHF1ZXJ5R2VvbWV0cnkubWFwKChwKSA9PiB7XG4gICAgICAgIHJldHVybiBwcm9qZWN0UG9pbnQocCwgcGl4ZWxQb3NNYXRyaXgpO1xuICAgIH0pO1xufVxuXG5leHBvcnQgZGVmYXVsdCBDaXJjbGVTdHlsZUxheWVyO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IENpcmNsZUJ1Y2tldCBmcm9tICcuL2NpcmNsZV9idWNrZXQnO1xuXG5pbXBvcnQgeyByZWdpc3RlciB9IGZyb20gJy4uLy4uL3V0aWwvd2ViX3dvcmtlcl90cmFuc2Zlcic7XG5cbmltcG9ydCB0eXBlIEhlYXRtYXBTdHlsZUxheWVyIGZyb20gJy4uLy4uL3N0eWxlL3N0eWxlX2xheWVyL2hlYXRtYXBfc3R5bGVfbGF5ZXInO1xuXG5jbGFzcyBIZWF0bWFwQnVja2V0IGV4dGVuZHMgQ2lyY2xlQnVja2V0PEhlYXRtYXBTdHlsZUxheWVyPiB7XG4gICAgLy8gTmVlZGVkIGZvciBmbG93IHRvIGFjY2VwdCBvbWl0OiBbJ2xheWVycyddIGJlbG93LCBkdWUgdG9cbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svZmxvdy9pc3N1ZXMvNDI2MlxuICAgIGxheWVyczogQXJyYXk8SGVhdG1hcFN0eWxlTGF5ZXI+O1xufVxuXG5yZWdpc3RlcignSGVhdG1hcEJ1Y2tldCcsIEhlYXRtYXBCdWNrZXQsIHtvbWl0OiBbJ2xheWVycyddfSk7XG5cbmV4cG9ydCBkZWZhdWx0IEhlYXRtYXBCdWNrZXQ7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5cbmltcG9ydCB7IHJlZ2lzdGVyIH0gZnJvbSAnLi93ZWJfd29ya2VyX3RyYW5zZmVyJztcblxuZXhwb3J0IHR5cGUgU2l6ZSA9IHtcbiAgICB3aWR0aDogbnVtYmVyLFxuICAgIGhlaWdodDogbnVtYmVyXG59O1xuXG50eXBlIFBvaW50ID0ge1xuICAgIHg6IG51bWJlcixcbiAgICB5OiBudW1iZXJcbn07XG5cbmZ1bmN0aW9uIGNyZWF0ZUltYWdlKGltYWdlOiAqLCB7d2lkdGgsIGhlaWdodH06IFNpemUsIGNoYW5uZWxzOiBudW1iZXIsIGRhdGE/OiBVaW50OEFycmF5IHwgVWludDhDbGFtcGVkQXJyYXkpIHtcbiAgICBpZiAoIWRhdGEpIHtcbiAgICAgICAgZGF0YSA9IG5ldyBVaW50OEFycmF5KHdpZHRoICogaGVpZ2h0ICogY2hhbm5lbHMpO1xuICAgIH0gZWxzZSBpZiAoZGF0YS5sZW5ndGggIT09IHdpZHRoICogaGVpZ2h0ICogY2hhbm5lbHMpIHtcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ21pc21hdGNoZWQgaW1hZ2Ugc2l6ZScpO1xuICAgIH1cbiAgICBpbWFnZS53aWR0aCA9IHdpZHRoO1xuICAgIGltYWdlLmhlaWdodCA9IGhlaWdodDtcbiAgICBpbWFnZS5kYXRhID0gZGF0YTtcbiAgICByZXR1cm4gaW1hZ2U7XG59XG5cbmZ1bmN0aW9uIHJlc2l6ZUltYWdlKGltYWdlOiAqLCB7d2lkdGgsIGhlaWdodH06IFNpemUsIGNoYW5uZWxzOiBudW1iZXIpIHtcbiAgICBpZiAod2lkdGggPT09IGltYWdlLndpZHRoICYmIGhlaWdodCA9PT0gaW1hZ2UuaGVpZ2h0KSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBuZXdJbWFnZSA9IGNyZWF0ZUltYWdlKHt9LCB7d2lkdGgsIGhlaWdodH0sIGNoYW5uZWxzKTtcblxuICAgIGNvcHlJbWFnZShpbWFnZSwgbmV3SW1hZ2UsIHt4OiAwLCB5OiAwfSwge3g6IDAsIHk6IDB9LCB7XG4gICAgICAgIHdpZHRoOiBNYXRoLm1pbihpbWFnZS53aWR0aCwgd2lkdGgpLFxuICAgICAgICBoZWlnaHQ6IE1hdGgubWluKGltYWdlLmhlaWdodCwgaGVpZ2h0KVxuICAgIH0sIGNoYW5uZWxzKTtcblxuICAgIGltYWdlLndpZHRoID0gd2lkdGg7XG4gICAgaW1hZ2UuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgIGltYWdlLmRhdGEgPSBuZXdJbWFnZS5kYXRhO1xufVxuXG5mdW5jdGlvbiBjb3B5SW1hZ2Uoc3JjSW1nOiAqLCBkc3RJbWc6ICosIHNyY1B0OiBQb2ludCwgZHN0UHQ6IFBvaW50LCBzaXplOiBTaXplLCBjaGFubmVsczogbnVtYmVyKSB7XG4gICAgaWYgKHNpemUud2lkdGggPT09IDAgfHwgc2l6ZS5oZWlnaHQgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIGRzdEltZztcbiAgICB9XG5cbiAgICBpZiAoc2l6ZS53aWR0aCA+IHNyY0ltZy53aWR0aCB8fFxuICAgICAgICBzaXplLmhlaWdodCA+IHNyY0ltZy5oZWlnaHQgfHxcbiAgICAgICAgc3JjUHQueCA+IHNyY0ltZy53aWR0aCAtIHNpemUud2lkdGggfHxcbiAgICAgICAgc3JjUHQueSA+IHNyY0ltZy5oZWlnaHQgLSBzaXplLmhlaWdodCkge1xuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignb3V0IG9mIHJhbmdlIHNvdXJjZSBjb29yZGluYXRlcyBmb3IgaW1hZ2UgY29weScpO1xuICAgIH1cblxuICAgIGlmIChzaXplLndpZHRoID4gZHN0SW1nLndpZHRoIHx8XG4gICAgICAgIHNpemUuaGVpZ2h0ID4gZHN0SW1nLmhlaWdodCB8fFxuICAgICAgICBkc3RQdC54ID4gZHN0SW1nLndpZHRoIC0gc2l6ZS53aWR0aCB8fFxuICAgICAgICBkc3RQdC55ID4gZHN0SW1nLmhlaWdodCAtIHNpemUuaGVpZ2h0KSB7XG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdvdXQgb2YgcmFuZ2UgZGVzdGluYXRpb24gY29vcmRpbmF0ZXMgZm9yIGltYWdlIGNvcHknKTtcbiAgICB9XG5cbiAgICBjb25zdCBzcmNEYXRhID0gc3JjSW1nLmRhdGE7XG4gICAgY29uc3QgZHN0RGF0YSA9IGRzdEltZy5kYXRhO1xuXG4gICAgYXNzZXJ0KHNyY0RhdGEgIT09IGRzdERhdGEpO1xuXG4gICAgZm9yIChsZXQgeSA9IDA7IHkgPCBzaXplLmhlaWdodDsgeSsrKSB7XG4gICAgICAgIGNvbnN0IHNyY09mZnNldCA9ICgoc3JjUHQueSArIHkpICogc3JjSW1nLndpZHRoICsgc3JjUHQueCkgKiBjaGFubmVscztcbiAgICAgICAgY29uc3QgZHN0T2Zmc2V0ID0gKChkc3RQdC55ICsgeSkgKiBkc3RJbWcud2lkdGggKyBkc3RQdC54KSAqIGNoYW5uZWxzO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNpemUud2lkdGggKiBjaGFubmVsczsgaSsrKSB7XG4gICAgICAgICAgICBkc3REYXRhW2RzdE9mZnNldCArIGldID0gc3JjRGF0YVtzcmNPZmZzZXQgKyBpXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBkc3RJbWc7XG59XG5cbmV4cG9ydCBjbGFzcyBBbHBoYUltYWdlIHtcbiAgICB3aWR0aDogbnVtYmVyO1xuICAgIGhlaWdodDogbnVtYmVyO1xuICAgIGRhdGE6IFVpbnQ4QXJyYXkgfCBVaW50OENsYW1wZWRBcnJheTtcblxuICAgIGNvbnN0cnVjdG9yKHNpemU6IFNpemUsIGRhdGE/OiBVaW50OEFycmF5IHwgVWludDhDbGFtcGVkQXJyYXkpIHtcbiAgICAgICAgY3JlYXRlSW1hZ2UodGhpcywgc2l6ZSwgMSwgZGF0YSk7XG4gICAgfVxuXG4gICAgcmVzaXplKHNpemU6IFNpemUpIHtcbiAgICAgICAgcmVzaXplSW1hZ2UodGhpcywgc2l6ZSwgMSk7XG4gICAgfVxuXG4gICAgY2xvbmUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQWxwaGFJbWFnZSh7d2lkdGg6IHRoaXMud2lkdGgsIGhlaWdodDogdGhpcy5oZWlnaHR9LCBuZXcgVWludDhBcnJheSh0aGlzLmRhdGEpKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgY29weShzcmNJbWc6IEFscGhhSW1hZ2UsIGRzdEltZzogQWxwaGFJbWFnZSwgc3JjUHQ6IFBvaW50LCBkc3RQdDogUG9pbnQsIHNpemU6IFNpemUpIHtcbiAgICAgICAgY29weUltYWdlKHNyY0ltZywgZHN0SW1nLCBzcmNQdCwgZHN0UHQsIHNpemUsIDEpO1xuICAgIH1cbn1cblxuLy8gTm90IHByZW11bHRpcGxpZWQsIGJlY2F1c2UgSW1hZ2VEYXRhIGlzIG5vdCBwcmVtdWx0aXBsaWVkLlxuLy8gVU5QQUNLX1BSRU1VTFRJUExZX0FMUEhBX1dFQkdMIG11c3QgYmUgdXNlZCB3aGVuIHVwbG9hZGluZyB0byBhIHRleHR1cmUuXG5leHBvcnQgY2xhc3MgUkdCQUltYWdlIHtcbiAgICB3aWR0aDogbnVtYmVyO1xuICAgIGhlaWdodDogbnVtYmVyO1xuICAgIGRhdGE6IFVpbnQ4QXJyYXkgfCBVaW50OENsYW1wZWRBcnJheTtcblxuICAgIGNvbnN0cnVjdG9yKHNpemU6IFNpemUsIGRhdGE/OiBVaW50OEFycmF5IHwgVWludDhDbGFtcGVkQXJyYXkpIHtcbiAgICAgICAgY3JlYXRlSW1hZ2UodGhpcywgc2l6ZSwgNCwgZGF0YSk7XG4gICAgfVxuXG4gICAgcmVzaXplKHNpemU6IFNpemUpIHtcbiAgICAgICAgcmVzaXplSW1hZ2UodGhpcywgc2l6ZSwgNCk7XG4gICAgfVxuXG4gICAgcmVwbGFjZShkYXRhOiBVaW50OEFycmF5IHwgVWludDhDbGFtcGVkQXJyYXksIGNvcHk/OiBib29sZWFuKSB7XG4gICAgICAgIGlmIChjb3B5KSB7XG4gICAgICAgICAgICB0aGlzLmRhdGEuc2V0KGRhdGEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNsb25lKCkge1xuICAgICAgICByZXR1cm4gbmV3IFJHQkFJbWFnZSh7d2lkdGg6IHRoaXMud2lkdGgsIGhlaWdodDogdGhpcy5oZWlnaHR9LCBuZXcgVWludDhBcnJheSh0aGlzLmRhdGEpKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgY29weShzcmNJbWc6IFJHQkFJbWFnZSB8IEltYWdlRGF0YSwgZHN0SW1nOiBSR0JBSW1hZ2UsIHNyY1B0OiBQb2ludCwgZHN0UHQ6IFBvaW50LCBzaXplOiBTaXplKSB7XG4gICAgICAgIGNvcHlJbWFnZShzcmNJbWcsIGRzdEltZywgc3JjUHQsIGRzdFB0LCBzaXplLCA0KTtcbiAgICB9XG59XG5cbnJlZ2lzdGVyKCdBbHBoYUltYWdlJywgQWxwaGFJbWFnZSk7XG5yZWdpc3RlcignUkdCQUltYWdlJywgUkdCQUltYWdlKTtcbiIsIi8vIFRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQuIEVkaXQgYnVpbGQvZ2VuZXJhdGUtc3R5bGUtY29kZS5qcywgdGhlbiBydW4gYHlhcm4gcnVuIGNvZGVnZW5gLlxuLy8gQGZsb3dcbi8qIGVzbGludC1kaXNhYmxlICovXG5cbmltcG9ydCBzdHlsZVNwZWMgZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy9yZWZlcmVuY2UvbGF0ZXN0JztcblxuaW1wb3J0IHtcbiAgICBQcm9wZXJ0aWVzLFxuICAgIERhdGFDb25zdGFudFByb3BlcnR5LFxuICAgIERhdGFEcml2ZW5Qcm9wZXJ0eSxcbiAgICBDcm9zc0ZhZGVkRGF0YURyaXZlblByb3BlcnR5LFxuICAgIENyb3NzRmFkZWRQcm9wZXJ0eSxcbiAgICBDb2xvclJhbXBQcm9wZXJ0eVxufSBmcm9tICcuLi9wcm9wZXJ0aWVzJztcblxuaW1wb3J0IHR5cGUgQ29sb3IgZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy91dGlsL2NvbG9yJztcblxuaW1wb3J0IHR5cGUgRm9ybWF0dGVkIGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi90eXBlcy9mb3JtYXR0ZWQnO1xuXG5cbmV4cG9ydCB0eXBlIFBhaW50UHJvcHMgPSB7fFxuICAgIFwiaGVhdG1hcC1yYWRpdXNcIjogRGF0YURyaXZlblByb3BlcnR5PG51bWJlcj4sXG4gICAgXCJoZWF0bWFwLXdlaWdodFwiOiBEYXRhRHJpdmVuUHJvcGVydHk8bnVtYmVyPixcbiAgICBcImhlYXRtYXAtaW50ZW5zaXR5XCI6IERhdGFDb25zdGFudFByb3BlcnR5PG51bWJlcj4sXG4gICAgXCJoZWF0bWFwLWNvbG9yXCI6IENvbG9yUmFtcFByb3BlcnR5LFxuICAgIFwiaGVhdG1hcC1vcGFjaXR5XCI6IERhdGFDb25zdGFudFByb3BlcnR5PG51bWJlcj4sXG58fTtcblxuY29uc3QgcGFpbnQ6IFByb3BlcnRpZXM8UGFpbnRQcm9wcz4gPSBuZXcgUHJvcGVydGllcyh7XG4gICAgXCJoZWF0bWFwLXJhZGl1c1wiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2hlYXRtYXBcIl1bXCJoZWF0bWFwLXJhZGl1c1wiXSksXG4gICAgXCJoZWF0bWFwLXdlaWdodFwiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2hlYXRtYXBcIl1bXCJoZWF0bWFwLXdlaWdodFwiXSksXG4gICAgXCJoZWF0bWFwLWludGVuc2l0eVwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfaGVhdG1hcFwiXVtcImhlYXRtYXAtaW50ZW5zaXR5XCJdKSxcbiAgICBcImhlYXRtYXAtY29sb3JcIjogbmV3IENvbG9yUmFtcFByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2hlYXRtYXBcIl1bXCJoZWF0bWFwLWNvbG9yXCJdKSxcbiAgICBcImhlYXRtYXAtb3BhY2l0eVwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfaGVhdG1hcFwiXVtcImhlYXRtYXAtb3BhY2l0eVwiXSksXG59KTtcblxuLy8gTm90ZTogd2l0aG91dCBhZGRpbmcgdGhlIGV4cGxpY2l0IHR5cGUgYW5ub3RhdGlvbiwgRmxvdyBpbmZlcnMgd2Vha2VyIHR5cGVzXG4vLyBmb3IgdGhlc2Ugb2JqZWN0cyBmcm9tIHRoZWlyIHVzZSBpbiB0aGUgY29uc3RydWN0b3IgdG8gU3R5bGVMYXllciwgYXNcbi8vIHtsYXlvdXQ/OiBQcm9wZXJ0aWVzPC4uLj4sIHBhaW50OiBQcm9wZXJ0aWVzPC4uLj59XG5leHBvcnQgZGVmYXVsdCAoeyBwYWludCB9OiAkRXhhY3Q8e1xuICBwYWludDogUHJvcGVydGllczxQYWludFByb3BzPlxufT4pO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHsgUkdCQUltYWdlIH0gZnJvbSAnLi9pbWFnZSc7XG5cbmltcG9ydCB0eXBlIHtTdHlsZVByb3BlcnR5RXhwcmVzc2lvbn0gZnJvbSAnLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uL2luZGV4JztcblxuLyoqXG4gKiBHaXZlbiBhbiBleHByZXNzaW9uIHRoYXQgc2hvdWxkIGV2YWx1YXRlIHRvIGEgY29sb3IgcmFtcCwgcmV0dXJuXG4gKiBhIDI1NngxIHB4IFJHQkEgaW1hZ2UgcmVwcmVzZW50aW5nIHRoYXQgcmFtcCBleHByZXNzaW9uLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJlbmRlckNvbG9yUmFtcChleHByZXNzaW9uOiBTdHlsZVByb3BlcnR5RXhwcmVzc2lvbiwgY29sb3JSYW1wRXZhbHVhdGlvblBhcmFtZXRlcjogc3RyaW5nKTogUkdCQUltYWdlIHtcbiAgICBjb25zdCBjb2xvclJhbXBEYXRhID0gbmV3IFVpbnQ4QXJyYXkoMjU2ICogNCk7XG4gICAgY29uc3QgZXZhbHVhdGlvbkdsb2JhbHMgPSB7fTtcbiAgICBmb3IgKGxldCBpID0gMCwgaiA9IDA7IGkgPCAyNTY7IGkrKywgaiArPSA0KSB7XG4gICAgICAgIGV2YWx1YXRpb25HbG9iYWxzW2NvbG9yUmFtcEV2YWx1YXRpb25QYXJhbWV0ZXJdID0gaSAvIDI1NTtcbiAgICAgICAgY29uc3QgcHhDb2xvciA9IGV4cHJlc3Npb24uZXZhbHVhdGUoKGV2YWx1YXRpb25HbG9iYWxzOiBhbnkpKTtcbiAgICAgICAgLy8gdGhlIGNvbG9ycyBhcmUgYmVpbmcgdW5wcmVtdWx0aXBsaWVkIGJlY2F1c2UgQ29sb3IgdXNlc1xuICAgICAgICAvLyBwcmVtdWx0aXBsaWVkIHZhbHVlcywgYW5kIHRoZSBUZXh0dXJlIGNsYXNzIGV4cGVjdHMgdW5wcmVtdWx0aXBsaWVkIG9uZXNcbiAgICAgICAgY29sb3JSYW1wRGF0YVtqICsgMF0gPSBNYXRoLmZsb29yKHB4Q29sb3IuciAqIDI1NSAvIHB4Q29sb3IuYSk7XG4gICAgICAgIGNvbG9yUmFtcERhdGFbaiArIDFdID0gTWF0aC5mbG9vcihweENvbG9yLmcgKiAyNTUgLyBweENvbG9yLmEpO1xuICAgICAgICBjb2xvclJhbXBEYXRhW2ogKyAyXSA9IE1hdGguZmxvb3IocHhDb2xvci5iICogMjU1IC8gcHhDb2xvci5hKTtcbiAgICAgICAgY29sb3JSYW1wRGF0YVtqICsgM10gPSBNYXRoLmZsb29yKHB4Q29sb3IuYSAqIDI1NSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBSR0JBSW1hZ2Uoe3dpZHRoOiAyNTYsIGhlaWdodDogMX0sIGNvbG9yUmFtcERhdGEpO1xufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IFN0eWxlTGF5ZXIgZnJvbSAnLi4vc3R5bGVfbGF5ZXInO1xuXG5pbXBvcnQgSGVhdG1hcEJ1Y2tldCBmcm9tICcuLi8uLi9kYXRhL2J1Y2tldC9oZWF0bWFwX2J1Y2tldCc7XG5pbXBvcnQgeyBSR0JBSW1hZ2UgfSBmcm9tICcuLi8uLi91dGlsL2ltYWdlJztcbmltcG9ydCBwcm9wZXJ0aWVzIGZyb20gJy4vaGVhdG1hcF9zdHlsZV9sYXllcl9wcm9wZXJ0aWVzJztcbmltcG9ydCByZW5kZXJDb2xvclJhbXAgZnJvbSAnLi4vLi4vdXRpbC9jb2xvcl9yYW1wJztcbmltcG9ydCB7IFRyYW5zaXRpb25hYmxlLCBUcmFuc2l0aW9uaW5nLCBQb3NzaWJseUV2YWx1YXRlZCB9IGZyb20gJy4uL3Byb3BlcnRpZXMnO1xuXG5pbXBvcnQgdHlwZSBUZXh0dXJlIGZyb20gJy4uLy4uL3JlbmRlci90ZXh0dXJlJztcbmltcG9ydCB0eXBlIEZyYW1lYnVmZmVyIGZyb20gJy4uLy4uL2dsL2ZyYW1lYnVmZmVyJztcbmltcG9ydCB0eXBlIHtQYWludFByb3BzfSBmcm9tICcuL2hlYXRtYXBfc3R5bGVfbGF5ZXJfcHJvcGVydGllcyc7XG5pbXBvcnQgdHlwZSB7TGF5ZXJTcGVjaWZpY2F0aW9ufSBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL3R5cGVzJztcblxuY2xhc3MgSGVhdG1hcFN0eWxlTGF5ZXIgZXh0ZW5kcyBTdHlsZUxheWVyIHtcblxuICAgIGhlYXRtYXBGYm86ID9GcmFtZWJ1ZmZlcjtcbiAgICBjb2xvclJhbXA6IFJHQkFJbWFnZTtcbiAgICBjb2xvclJhbXBUZXh0dXJlOiA/VGV4dHVyZTtcblxuICAgIF90cmFuc2l0aW9uYWJsZVBhaW50OiBUcmFuc2l0aW9uYWJsZTxQYWludFByb3BzPjtcbiAgICBfdHJhbnNpdGlvbmluZ1BhaW50OiBUcmFuc2l0aW9uaW5nPFBhaW50UHJvcHM+O1xuICAgIHBhaW50OiBQb3NzaWJseUV2YWx1YXRlZDxQYWludFByb3BzPjtcblxuICAgIGNyZWF0ZUJ1Y2tldChvcHRpb25zOiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBIZWF0bWFwQnVja2V0KG9wdGlvbnMpO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGxheWVyOiBMYXllclNwZWNpZmljYXRpb24pIHtcbiAgICAgICAgc3VwZXIobGF5ZXIsIHByb3BlcnRpZXMpO1xuXG4gICAgICAgIC8vIG1ha2Ugc3VyZSBjb2xvciByYW1wIHRleHR1cmUgaXMgZ2VuZXJhdGVkIGZvciBkZWZhdWx0IGhlYXRtYXAgY29sb3IgdG9vXG4gICAgICAgIHRoaXMuX3VwZGF0ZUNvbG9yUmFtcCgpO1xuICAgIH1cblxuICAgIF9oYW5kbGVTcGVjaWFsUGFpbnRQcm9wZXJ0eVVwZGF0ZShuYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKG5hbWUgPT09ICdoZWF0bWFwLWNvbG9yJykge1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlQ29sb3JSYW1wKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfdXBkYXRlQ29sb3JSYW1wKCkge1xuICAgICAgICBjb25zdCBleHByZXNzaW9uID0gdGhpcy5fdHJhbnNpdGlvbmFibGVQYWludC5fdmFsdWVzWydoZWF0bWFwLWNvbG9yJ10udmFsdWUuZXhwcmVzc2lvbjtcbiAgICAgICAgdGhpcy5jb2xvclJhbXAgPSByZW5kZXJDb2xvclJhbXAoZXhwcmVzc2lvbiwgJ2hlYXRtYXBEZW5zaXR5Jyk7XG4gICAgICAgIHRoaXMuY29sb3JSYW1wVGV4dHVyZSA9IG51bGw7XG4gICAgfVxuXG4gICAgcmVzaXplKCkge1xuICAgICAgICBpZiAodGhpcy5oZWF0bWFwRmJvKSB7XG4gICAgICAgICAgICB0aGlzLmhlYXRtYXBGYm8uZGVzdHJveSgpO1xuICAgICAgICAgICAgdGhpcy5oZWF0bWFwRmJvID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHF1ZXJ5UmFkaXVzKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIHF1ZXJ5SW50ZXJzZWN0c0ZlYXR1cmUoKTogYm9vbGVhbiAge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaGFzT2Zmc2NyZWVuUGFzcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFpbnQuZ2V0KCdoZWF0bWFwLW9wYWNpdHknKSAhPT0gMCAmJiB0aGlzLnZpc2liaWxpdHkgIT09ICdub25lJztcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEhlYXRtYXBTdHlsZUxheWVyO1xuIiwiLy8gVGhpcyBmaWxlIGlzIGdlbmVyYXRlZC4gRWRpdCBidWlsZC9nZW5lcmF0ZS1zdHlsZS1jb2RlLmpzLCB0aGVuIHJ1biBgeWFybiBydW4gY29kZWdlbmAuXG4vLyBAZmxvd1xuLyogZXNsaW50LWRpc2FibGUgKi9cblxuaW1wb3J0IHN0eWxlU3BlYyBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL3JlZmVyZW5jZS9sYXRlc3QnO1xuXG5pbXBvcnQge1xuICAgIFByb3BlcnRpZXMsXG4gICAgRGF0YUNvbnN0YW50UHJvcGVydHksXG4gICAgRGF0YURyaXZlblByb3BlcnR5LFxuICAgIENyb3NzRmFkZWREYXRhRHJpdmVuUHJvcGVydHksXG4gICAgQ3Jvc3NGYWRlZFByb3BlcnR5LFxuICAgIENvbG9yUmFtcFByb3BlcnR5XG59IGZyb20gJy4uL3Byb3BlcnRpZXMnO1xuXG5pbXBvcnQgdHlwZSBDb2xvciBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL3V0aWwvY29sb3InO1xuXG5pbXBvcnQgdHlwZSBGb3JtYXR0ZWQgZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uL3R5cGVzL2Zvcm1hdHRlZCc7XG5cblxuZXhwb3J0IHR5cGUgUGFpbnRQcm9wcyA9IHt8XG4gICAgXCJoaWxsc2hhZGUtaWxsdW1pbmF0aW9uLWRpcmVjdGlvblwiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxudW1iZXI+LFxuICAgIFwiaGlsbHNoYWRlLWlsbHVtaW5hdGlvbi1hbmNob3JcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8XCJtYXBcIiB8IFwidmlld3BvcnRcIj4sXG4gICAgXCJoaWxsc2hhZGUtZXhhZ2dlcmF0aW9uXCI6IERhdGFDb25zdGFudFByb3BlcnR5PG51bWJlcj4sXG4gICAgXCJoaWxsc2hhZGUtc2hhZG93LWNvbG9yXCI6IERhdGFDb25zdGFudFByb3BlcnR5PENvbG9yPixcbiAgICBcImhpbGxzaGFkZS1oaWdobGlnaHQtY29sb3JcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8Q29sb3I+LFxuICAgIFwiaGlsbHNoYWRlLWFjY2VudC1jb2xvclwiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxDb2xvcj4sXG58fTtcblxuY29uc3QgcGFpbnQ6IFByb3BlcnRpZXM8UGFpbnRQcm9wcz4gPSBuZXcgUHJvcGVydGllcyh7XG4gICAgXCJoaWxsc2hhZGUtaWxsdW1pbmF0aW9uLWRpcmVjdGlvblwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfaGlsbHNoYWRlXCJdW1wiaGlsbHNoYWRlLWlsbHVtaW5hdGlvbi1kaXJlY3Rpb25cIl0pLFxuICAgIFwiaGlsbHNoYWRlLWlsbHVtaW5hdGlvbi1hbmNob3JcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2hpbGxzaGFkZVwiXVtcImhpbGxzaGFkZS1pbGx1bWluYXRpb24tYW5jaG9yXCJdKSxcbiAgICBcImhpbGxzaGFkZS1leGFnZ2VyYXRpb25cIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2hpbGxzaGFkZVwiXVtcImhpbGxzaGFkZS1leGFnZ2VyYXRpb25cIl0pLFxuICAgIFwiaGlsbHNoYWRlLXNoYWRvdy1jb2xvclwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfaGlsbHNoYWRlXCJdW1wiaGlsbHNoYWRlLXNoYWRvdy1jb2xvclwiXSksXG4gICAgXCJoaWxsc2hhZGUtaGlnaGxpZ2h0LWNvbG9yXCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9oaWxsc2hhZGVcIl1bXCJoaWxsc2hhZGUtaGlnaGxpZ2h0LWNvbG9yXCJdKSxcbiAgICBcImhpbGxzaGFkZS1hY2NlbnQtY29sb3JcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2hpbGxzaGFkZVwiXVtcImhpbGxzaGFkZS1hY2NlbnQtY29sb3JcIl0pLFxufSk7XG5cbi8vIE5vdGU6IHdpdGhvdXQgYWRkaW5nIHRoZSBleHBsaWNpdCB0eXBlIGFubm90YXRpb24sIEZsb3cgaW5mZXJzIHdlYWtlciB0eXBlc1xuLy8gZm9yIHRoZXNlIG9iamVjdHMgZnJvbSB0aGVpciB1c2UgaW4gdGhlIGNvbnN0cnVjdG9yIHRvIFN0eWxlTGF5ZXIsIGFzXG4vLyB7bGF5b3V0PzogUHJvcGVydGllczwuLi4+LCBwYWludDogUHJvcGVydGllczwuLi4+fVxuZXhwb3J0IGRlZmF1bHQgKHsgcGFpbnQgfTogJEV4YWN0PHtcbiAgcGFpbnQ6IFByb3BlcnRpZXM8UGFpbnRQcm9wcz5cbn0+KTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCBTdHlsZUxheWVyIGZyb20gJy4uL3N0eWxlX2xheWVyJztcblxuaW1wb3J0IHByb3BlcnRpZXMgZnJvbSAnLi9oaWxsc2hhZGVfc3R5bGVfbGF5ZXJfcHJvcGVydGllcyc7XG5pbXBvcnQgeyBUcmFuc2l0aW9uYWJsZSwgVHJhbnNpdGlvbmluZywgUG9zc2libHlFdmFsdWF0ZWQgfSBmcm9tICcuLi9wcm9wZXJ0aWVzJztcblxuaW1wb3J0IHR5cGUge1BhaW50UHJvcHN9IGZyb20gJy4vaGlsbHNoYWRlX3N0eWxlX2xheWVyX3Byb3BlcnRpZXMnO1xuaW1wb3J0IHR5cGUge0xheWVyU3BlY2lmaWNhdGlvbn0gZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy90eXBlcyc7XG5cbmNsYXNzIEhpbGxzaGFkZVN0eWxlTGF5ZXIgZXh0ZW5kcyBTdHlsZUxheWVyIHtcbiAgICBfdHJhbnNpdGlvbmFibGVQYWludDogVHJhbnNpdGlvbmFibGU8UGFpbnRQcm9wcz47XG4gICAgX3RyYW5zaXRpb25pbmdQYWludDogVHJhbnNpdGlvbmluZzxQYWludFByb3BzPjtcbiAgICBwYWludDogUG9zc2libHlFdmFsdWF0ZWQ8UGFpbnRQcm9wcz47XG5cbiAgICBjb25zdHJ1Y3RvcihsYXllcjogTGF5ZXJTcGVjaWZpY2F0aW9uKSB7XG4gICAgICAgIHN1cGVyKGxheWVyLCBwcm9wZXJ0aWVzKTtcbiAgICB9XG5cbiAgICBoYXNPZmZzY3JlZW5QYXNzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wYWludC5nZXQoJ2hpbGxzaGFkZS1leGFnZ2VyYXRpb24nKSAhPT0gMCAmJiB0aGlzLnZpc2liaWxpdHkgIT09ICdub25lJztcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEhpbGxzaGFkZVN0eWxlTGF5ZXI7XG4iLCIvLyBAZmxvd1xuaW1wb3J0IHsgY3JlYXRlTGF5b3V0IH0gZnJvbSAnLi4vLi4vdXRpbC9zdHJ1Y3RfYXJyYXknO1xuXG5jb25zdCBsYXlvdXQgPSBjcmVhdGVMYXlvdXQoW1xuICAgIHtuYW1lOiAnYV9wb3MnLCBjb21wb25lbnRzOiAyLCB0eXBlOiAnSW50MTYnfVxuXSwgNCk7XG5cbmV4cG9ydCBkZWZhdWx0IGxheW91dDtcbmV4cG9ydCBjb25zdCB7bWVtYmVycywgc2l6ZSwgYWxpZ25tZW50fSA9IGxheW91dDtcbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBlYXJjdXQ7XG5tb2R1bGUuZXhwb3J0cy5kZWZhdWx0ID0gZWFyY3V0O1xuXG5mdW5jdGlvbiBlYXJjdXQoZGF0YSwgaG9sZUluZGljZXMsIGRpbSkge1xuXG4gICAgZGltID0gZGltIHx8IDI7XG5cbiAgICB2YXIgaGFzSG9sZXMgPSBob2xlSW5kaWNlcyAmJiBob2xlSW5kaWNlcy5sZW5ndGgsXG4gICAgICAgIG91dGVyTGVuID0gaGFzSG9sZXMgPyBob2xlSW5kaWNlc1swXSAqIGRpbSA6IGRhdGEubGVuZ3RoLFxuICAgICAgICBvdXRlck5vZGUgPSBsaW5rZWRMaXN0KGRhdGEsIDAsIG91dGVyTGVuLCBkaW0sIHRydWUpLFxuICAgICAgICB0cmlhbmdsZXMgPSBbXTtcblxuICAgIGlmICghb3V0ZXJOb2RlIHx8IG91dGVyTm9kZS5uZXh0ID09PSBvdXRlck5vZGUucHJldikgcmV0dXJuIHRyaWFuZ2xlcztcblxuICAgIHZhciBtaW5YLCBtaW5ZLCBtYXhYLCBtYXhZLCB4LCB5LCBpbnZTaXplO1xuXG4gICAgaWYgKGhhc0hvbGVzKSBvdXRlck5vZGUgPSBlbGltaW5hdGVIb2xlcyhkYXRhLCBob2xlSW5kaWNlcywgb3V0ZXJOb2RlLCBkaW0pO1xuXG4gICAgLy8gaWYgdGhlIHNoYXBlIGlzIG5vdCB0b28gc2ltcGxlLCB3ZSdsbCB1c2Ugei1vcmRlciBjdXJ2ZSBoYXNoIGxhdGVyOyBjYWxjdWxhdGUgcG9seWdvbiBiYm94XG4gICAgaWYgKGRhdGEubGVuZ3RoID4gODAgKiBkaW0pIHtcbiAgICAgICAgbWluWCA9IG1heFggPSBkYXRhWzBdO1xuICAgICAgICBtaW5ZID0gbWF4WSA9IGRhdGFbMV07XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IGRpbTsgaSA8IG91dGVyTGVuOyBpICs9IGRpbSkge1xuICAgICAgICAgICAgeCA9IGRhdGFbaV07XG4gICAgICAgICAgICB5ID0gZGF0YVtpICsgMV07XG4gICAgICAgICAgICBpZiAoeCA8IG1pblgpIG1pblggPSB4O1xuICAgICAgICAgICAgaWYgKHkgPCBtaW5ZKSBtaW5ZID0geTtcbiAgICAgICAgICAgIGlmICh4ID4gbWF4WCkgbWF4WCA9IHg7XG4gICAgICAgICAgICBpZiAoeSA+IG1heFkpIG1heFkgPSB5O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gbWluWCwgbWluWSBhbmQgaW52U2l6ZSBhcmUgbGF0ZXIgdXNlZCB0byB0cmFuc2Zvcm0gY29vcmRzIGludG8gaW50ZWdlcnMgZm9yIHotb3JkZXIgY2FsY3VsYXRpb25cbiAgICAgICAgaW52U2l6ZSA9IE1hdGgubWF4KG1heFggLSBtaW5YLCBtYXhZIC0gbWluWSk7XG4gICAgICAgIGludlNpemUgPSBpbnZTaXplICE9PSAwID8gMSAvIGludlNpemUgOiAwO1xuICAgIH1cblxuICAgIGVhcmN1dExpbmtlZChvdXRlck5vZGUsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBpbnZTaXplKTtcblxuICAgIHJldHVybiB0cmlhbmdsZXM7XG59XG5cbi8vIGNyZWF0ZSBhIGNpcmN1bGFyIGRvdWJseSBsaW5rZWQgbGlzdCBmcm9tIHBvbHlnb24gcG9pbnRzIGluIHRoZSBzcGVjaWZpZWQgd2luZGluZyBvcmRlclxuZnVuY3Rpb24gbGlua2VkTGlzdChkYXRhLCBzdGFydCwgZW5kLCBkaW0sIGNsb2Nrd2lzZSkge1xuICAgIHZhciBpLCBsYXN0O1xuXG4gICAgaWYgKGNsb2Nrd2lzZSA9PT0gKHNpZ25lZEFyZWEoZGF0YSwgc3RhcnQsIGVuZCwgZGltKSA+IDApKSB7XG4gICAgICAgIGZvciAoaSA9IHN0YXJ0OyBpIDwgZW5kOyBpICs9IGRpbSkgbGFzdCA9IGluc2VydE5vZGUoaSwgZGF0YVtpXSwgZGF0YVtpICsgMV0sIGxhc3QpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGZvciAoaSA9IGVuZCAtIGRpbTsgaSA+PSBzdGFydDsgaSAtPSBkaW0pIGxhc3QgPSBpbnNlcnROb2RlKGksIGRhdGFbaV0sIGRhdGFbaSArIDFdLCBsYXN0KTtcbiAgICB9XG5cbiAgICBpZiAobGFzdCAmJiBlcXVhbHMobGFzdCwgbGFzdC5uZXh0KSkge1xuICAgICAgICByZW1vdmVOb2RlKGxhc3QpO1xuICAgICAgICBsYXN0ID0gbGFzdC5uZXh0O1xuICAgIH1cblxuICAgIHJldHVybiBsYXN0O1xufVxuXG4vLyBlbGltaW5hdGUgY29saW5lYXIgb3IgZHVwbGljYXRlIHBvaW50c1xuZnVuY3Rpb24gZmlsdGVyUG9pbnRzKHN0YXJ0LCBlbmQpIHtcbiAgICBpZiAoIXN0YXJ0KSByZXR1cm4gc3RhcnQ7XG4gICAgaWYgKCFlbmQpIGVuZCA9IHN0YXJ0O1xuXG4gICAgdmFyIHAgPSBzdGFydCxcbiAgICAgICAgYWdhaW47XG4gICAgZG8ge1xuICAgICAgICBhZ2FpbiA9IGZhbHNlO1xuXG4gICAgICAgIGlmICghcC5zdGVpbmVyICYmIChlcXVhbHMocCwgcC5uZXh0KSB8fCBhcmVhKHAucHJldiwgcCwgcC5uZXh0KSA9PT0gMCkpIHtcbiAgICAgICAgICAgIHJlbW92ZU5vZGUocCk7XG4gICAgICAgICAgICBwID0gZW5kID0gcC5wcmV2O1xuICAgICAgICAgICAgaWYgKHAgPT09IHAubmV4dCkgYnJlYWs7XG4gICAgICAgICAgICBhZ2FpbiA9IHRydWU7XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHAgPSBwLm5leHQ7XG4gICAgICAgIH1cbiAgICB9IHdoaWxlIChhZ2FpbiB8fCBwICE9PSBlbmQpO1xuXG4gICAgcmV0dXJuIGVuZDtcbn1cblxuLy8gbWFpbiBlYXIgc2xpY2luZyBsb29wIHdoaWNoIHRyaWFuZ3VsYXRlcyBhIHBvbHlnb24gKGdpdmVuIGFzIGEgbGlua2VkIGxpc3QpXG5mdW5jdGlvbiBlYXJjdXRMaW5rZWQoZWFyLCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgaW52U2l6ZSwgcGFzcykge1xuICAgIGlmICghZWFyKSByZXR1cm47XG5cbiAgICAvLyBpbnRlcmxpbmsgcG9seWdvbiBub2RlcyBpbiB6LW9yZGVyXG4gICAgaWYgKCFwYXNzICYmIGludlNpemUpIGluZGV4Q3VydmUoZWFyLCBtaW5YLCBtaW5ZLCBpbnZTaXplKTtcblxuICAgIHZhciBzdG9wID0gZWFyLFxuICAgICAgICBwcmV2LCBuZXh0O1xuXG4gICAgLy8gaXRlcmF0ZSB0aHJvdWdoIGVhcnMsIHNsaWNpbmcgdGhlbSBvbmUgYnkgb25lXG4gICAgd2hpbGUgKGVhci5wcmV2ICE9PSBlYXIubmV4dCkge1xuICAgICAgICBwcmV2ID0gZWFyLnByZXY7XG4gICAgICAgIG5leHQgPSBlYXIubmV4dDtcblxuICAgICAgICBpZiAoaW52U2l6ZSA/IGlzRWFySGFzaGVkKGVhciwgbWluWCwgbWluWSwgaW52U2l6ZSkgOiBpc0VhcihlYXIpKSB7XG4gICAgICAgICAgICAvLyBjdXQgb2ZmIHRoZSB0cmlhbmdsZVxuICAgICAgICAgICAgdHJpYW5nbGVzLnB1c2gocHJldi5pIC8gZGltKTtcbiAgICAgICAgICAgIHRyaWFuZ2xlcy5wdXNoKGVhci5pIC8gZGltKTtcbiAgICAgICAgICAgIHRyaWFuZ2xlcy5wdXNoKG5leHQuaSAvIGRpbSk7XG5cbiAgICAgICAgICAgIHJlbW92ZU5vZGUoZWFyKTtcblxuICAgICAgICAgICAgLy8gc2tpcHBpbmcgdGhlIG5leHQgdmVydGV4IGxlYWRzIHRvIGxlc3Mgc2xpdmVyIHRyaWFuZ2xlc1xuICAgICAgICAgICAgZWFyID0gbmV4dC5uZXh0O1xuICAgICAgICAgICAgc3RvcCA9IG5leHQubmV4dDtcblxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBlYXIgPSBuZXh0O1xuXG4gICAgICAgIC8vIGlmIHdlIGxvb3BlZCB0aHJvdWdoIHRoZSB3aG9sZSByZW1haW5pbmcgcG9seWdvbiBhbmQgY2FuJ3QgZmluZCBhbnkgbW9yZSBlYXJzXG4gICAgICAgIGlmIChlYXIgPT09IHN0b3ApIHtcbiAgICAgICAgICAgIC8vIHRyeSBmaWx0ZXJpbmcgcG9pbnRzIGFuZCBzbGljaW5nIGFnYWluXG4gICAgICAgICAgICBpZiAoIXBhc3MpIHtcbiAgICAgICAgICAgICAgICBlYXJjdXRMaW5rZWQoZmlsdGVyUG9pbnRzKGVhciksIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBpbnZTaXplLCAxKTtcblxuICAgICAgICAgICAgLy8gaWYgdGhpcyBkaWRuJ3Qgd29yaywgdHJ5IGN1cmluZyBhbGwgc21hbGwgc2VsZi1pbnRlcnNlY3Rpb25zIGxvY2FsbHlcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocGFzcyA9PT0gMSkge1xuICAgICAgICAgICAgICAgIGVhciA9IGN1cmVMb2NhbEludGVyc2VjdGlvbnMoZWFyLCB0cmlhbmdsZXMsIGRpbSk7XG4gICAgICAgICAgICAgICAgZWFyY3V0TGlua2VkKGVhciwgdHJpYW5nbGVzLCBkaW0sIG1pblgsIG1pblksIGludlNpemUsIDIpO1xuXG4gICAgICAgICAgICAvLyBhcyBhIGxhc3QgcmVzb3J0LCB0cnkgc3BsaXR0aW5nIHRoZSByZW1haW5pbmcgcG9seWdvbiBpbnRvIHR3b1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwYXNzID09PSAyKSB7XG4gICAgICAgICAgICAgICAgc3BsaXRFYXJjdXQoZWFyLCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgaW52U2l6ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vLyBjaGVjayB3aGV0aGVyIGEgcG9seWdvbiBub2RlIGZvcm1zIGEgdmFsaWQgZWFyIHdpdGggYWRqYWNlbnQgbm9kZXNcbmZ1bmN0aW9uIGlzRWFyKGVhcikge1xuICAgIHZhciBhID0gZWFyLnByZXYsXG4gICAgICAgIGIgPSBlYXIsXG4gICAgICAgIGMgPSBlYXIubmV4dDtcblxuICAgIGlmIChhcmVhKGEsIGIsIGMpID49IDApIHJldHVybiBmYWxzZTsgLy8gcmVmbGV4LCBjYW4ndCBiZSBhbiBlYXJcblxuICAgIC8vIG5vdyBtYWtlIHN1cmUgd2UgZG9uJ3QgaGF2ZSBvdGhlciBwb2ludHMgaW5zaWRlIHRoZSBwb3RlbnRpYWwgZWFyXG4gICAgdmFyIHAgPSBlYXIubmV4dC5uZXh0O1xuXG4gICAgd2hpbGUgKHAgIT09IGVhci5wcmV2KSB7XG4gICAgICAgIGlmIChwb2ludEluVHJpYW5nbGUoYS54LCBhLnksIGIueCwgYi55LCBjLngsIGMueSwgcC54LCBwLnkpICYmXG4gICAgICAgICAgICBhcmVhKHAucHJldiwgcCwgcC5uZXh0KSA+PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHAgPSBwLm5leHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGlzRWFySGFzaGVkKGVhciwgbWluWCwgbWluWSwgaW52U2l6ZSkge1xuICAgIHZhciBhID0gZWFyLnByZXYsXG4gICAgICAgIGIgPSBlYXIsXG4gICAgICAgIGMgPSBlYXIubmV4dDtcblxuICAgIGlmIChhcmVhKGEsIGIsIGMpID49IDApIHJldHVybiBmYWxzZTsgLy8gcmVmbGV4LCBjYW4ndCBiZSBhbiBlYXJcblxuICAgIC8vIHRyaWFuZ2xlIGJib3g7IG1pbiAmIG1heCBhcmUgY2FsY3VsYXRlZCBsaWtlIHRoaXMgZm9yIHNwZWVkXG4gICAgdmFyIG1pblRYID0gYS54IDwgYi54ID8gKGEueCA8IGMueCA/IGEueCA6IGMueCkgOiAoYi54IDwgYy54ID8gYi54IDogYy54KSxcbiAgICAgICAgbWluVFkgPSBhLnkgPCBiLnkgPyAoYS55IDwgYy55ID8gYS55IDogYy55KSA6IChiLnkgPCBjLnkgPyBiLnkgOiBjLnkpLFxuICAgICAgICBtYXhUWCA9IGEueCA+IGIueCA/IChhLnggPiBjLnggPyBhLnggOiBjLngpIDogKGIueCA+IGMueCA/IGIueCA6IGMueCksXG4gICAgICAgIG1heFRZID0gYS55ID4gYi55ID8gKGEueSA+IGMueSA/IGEueSA6IGMueSkgOiAoYi55ID4gYy55ID8gYi55IDogYy55KTtcblxuICAgIC8vIHotb3JkZXIgcmFuZ2UgZm9yIHRoZSBjdXJyZW50IHRyaWFuZ2xlIGJib3g7XG4gICAgdmFyIG1pblogPSB6T3JkZXIobWluVFgsIG1pblRZLCBtaW5YLCBtaW5ZLCBpbnZTaXplKSxcbiAgICAgICAgbWF4WiA9IHpPcmRlcihtYXhUWCwgbWF4VFksIG1pblgsIG1pblksIGludlNpemUpO1xuXG4gICAgdmFyIHAgPSBlYXIucHJldlosXG4gICAgICAgIG4gPSBlYXIubmV4dFo7XG5cbiAgICAvLyBsb29rIGZvciBwb2ludHMgaW5zaWRlIHRoZSB0cmlhbmdsZSBpbiBib3RoIGRpcmVjdGlvbnNcbiAgICB3aGlsZSAocCAmJiBwLnogPj0gbWluWiAmJiBuICYmIG4ueiA8PSBtYXhaKSB7XG4gICAgICAgIGlmIChwICE9PSBlYXIucHJldiAmJiBwICE9PSBlYXIubmV4dCAmJlxuICAgICAgICAgICAgcG9pbnRJblRyaWFuZ2xlKGEueCwgYS55LCBiLngsIGIueSwgYy54LCBjLnksIHAueCwgcC55KSAmJlxuICAgICAgICAgICAgYXJlYShwLnByZXYsIHAsIHAubmV4dCkgPj0gMCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBwID0gcC5wcmV2WjtcblxuICAgICAgICBpZiAobiAhPT0gZWFyLnByZXYgJiYgbiAhPT0gZWFyLm5leHQgJiZcbiAgICAgICAgICAgIHBvaW50SW5UcmlhbmdsZShhLngsIGEueSwgYi54LCBiLnksIGMueCwgYy55LCBuLngsIG4ueSkgJiZcbiAgICAgICAgICAgIGFyZWEobi5wcmV2LCBuLCBuLm5leHQpID49IDApIHJldHVybiBmYWxzZTtcbiAgICAgICAgbiA9IG4ubmV4dFo7XG4gICAgfVxuXG4gICAgLy8gbG9vayBmb3IgcmVtYWluaW5nIHBvaW50cyBpbiBkZWNyZWFzaW5nIHotb3JkZXJcbiAgICB3aGlsZSAocCAmJiBwLnogPj0gbWluWikge1xuICAgICAgICBpZiAocCAhPT0gZWFyLnByZXYgJiYgcCAhPT0gZWFyLm5leHQgJiZcbiAgICAgICAgICAgIHBvaW50SW5UcmlhbmdsZShhLngsIGEueSwgYi54LCBiLnksIGMueCwgYy55LCBwLngsIHAueSkgJiZcbiAgICAgICAgICAgIGFyZWEocC5wcmV2LCBwLCBwLm5leHQpID49IDApIHJldHVybiBmYWxzZTtcbiAgICAgICAgcCA9IHAucHJldlo7XG4gICAgfVxuXG4gICAgLy8gbG9vayBmb3IgcmVtYWluaW5nIHBvaW50cyBpbiBpbmNyZWFzaW5nIHotb3JkZXJcbiAgICB3aGlsZSAobiAmJiBuLnogPD0gbWF4Wikge1xuICAgICAgICBpZiAobiAhPT0gZWFyLnByZXYgJiYgbiAhPT0gZWFyLm5leHQgJiZcbiAgICAgICAgICAgIHBvaW50SW5UcmlhbmdsZShhLngsIGEueSwgYi54LCBiLnksIGMueCwgYy55LCBuLngsIG4ueSkgJiZcbiAgICAgICAgICAgIGFyZWEobi5wcmV2LCBuLCBuLm5leHQpID49IDApIHJldHVybiBmYWxzZTtcbiAgICAgICAgbiA9IG4ubmV4dFo7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG59XG5cbi8vIGdvIHRocm91Z2ggYWxsIHBvbHlnb24gbm9kZXMgYW5kIGN1cmUgc21hbGwgbG9jYWwgc2VsZi1pbnRlcnNlY3Rpb25zXG5mdW5jdGlvbiBjdXJlTG9jYWxJbnRlcnNlY3Rpb25zKHN0YXJ0LCB0cmlhbmdsZXMsIGRpbSkge1xuICAgIHZhciBwID0gc3RhcnQ7XG4gICAgZG8ge1xuICAgICAgICB2YXIgYSA9IHAucHJldixcbiAgICAgICAgICAgIGIgPSBwLm5leHQubmV4dDtcblxuICAgICAgICBpZiAoIWVxdWFscyhhLCBiKSAmJiBpbnRlcnNlY3RzKGEsIHAsIHAubmV4dCwgYikgJiYgbG9jYWxseUluc2lkZShhLCBiKSAmJiBsb2NhbGx5SW5zaWRlKGIsIGEpKSB7XG5cbiAgICAgICAgICAgIHRyaWFuZ2xlcy5wdXNoKGEuaSAvIGRpbSk7XG4gICAgICAgICAgICB0cmlhbmdsZXMucHVzaChwLmkgLyBkaW0pO1xuICAgICAgICAgICAgdHJpYW5nbGVzLnB1c2goYi5pIC8gZGltKTtcblxuICAgICAgICAgICAgLy8gcmVtb3ZlIHR3byBub2RlcyBpbnZvbHZlZFxuICAgICAgICAgICAgcmVtb3ZlTm9kZShwKTtcbiAgICAgICAgICAgIHJlbW92ZU5vZGUocC5uZXh0KTtcblxuICAgICAgICAgICAgcCA9IHN0YXJ0ID0gYjtcbiAgICAgICAgfVxuICAgICAgICBwID0gcC5uZXh0O1xuICAgIH0gd2hpbGUgKHAgIT09IHN0YXJ0KTtcblxuICAgIHJldHVybiBwO1xufVxuXG4vLyB0cnkgc3BsaXR0aW5nIHBvbHlnb24gaW50byB0d28gYW5kIHRyaWFuZ3VsYXRlIHRoZW0gaW5kZXBlbmRlbnRseVxuZnVuY3Rpb24gc3BsaXRFYXJjdXQoc3RhcnQsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBpbnZTaXplKSB7XG4gICAgLy8gbG9vayBmb3IgYSB2YWxpZCBkaWFnb25hbCB0aGF0IGRpdmlkZXMgdGhlIHBvbHlnb24gaW50byB0d29cbiAgICB2YXIgYSA9IHN0YXJ0O1xuICAgIGRvIHtcbiAgICAgICAgdmFyIGIgPSBhLm5leHQubmV4dDtcbiAgICAgICAgd2hpbGUgKGIgIT09IGEucHJldikge1xuICAgICAgICAgICAgaWYgKGEuaSAhPT0gYi5pICYmIGlzVmFsaWREaWFnb25hbChhLCBiKSkge1xuICAgICAgICAgICAgICAgIC8vIHNwbGl0IHRoZSBwb2x5Z29uIGluIHR3byBieSB0aGUgZGlhZ29uYWxcbiAgICAgICAgICAgICAgICB2YXIgYyA9IHNwbGl0UG9seWdvbihhLCBiKTtcblxuICAgICAgICAgICAgICAgIC8vIGZpbHRlciBjb2xpbmVhciBwb2ludHMgYXJvdW5kIHRoZSBjdXRzXG4gICAgICAgICAgICAgICAgYSA9IGZpbHRlclBvaW50cyhhLCBhLm5leHQpO1xuICAgICAgICAgICAgICAgIGMgPSBmaWx0ZXJQb2ludHMoYywgYy5uZXh0KTtcblxuICAgICAgICAgICAgICAgIC8vIHJ1biBlYXJjdXQgb24gZWFjaCBoYWxmXG4gICAgICAgICAgICAgICAgZWFyY3V0TGlua2VkKGEsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBpbnZTaXplKTtcbiAgICAgICAgICAgICAgICBlYXJjdXRMaW5rZWQoYywgdHJpYW5nbGVzLCBkaW0sIG1pblgsIG1pblksIGludlNpemUpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGIgPSBiLm5leHQ7XG4gICAgICAgIH1cbiAgICAgICAgYSA9IGEubmV4dDtcbiAgICB9IHdoaWxlIChhICE9PSBzdGFydCk7XG59XG5cbi8vIGxpbmsgZXZlcnkgaG9sZSBpbnRvIHRoZSBvdXRlciBsb29wLCBwcm9kdWNpbmcgYSBzaW5nbGUtcmluZyBwb2x5Z29uIHdpdGhvdXQgaG9sZXNcbmZ1bmN0aW9uIGVsaW1pbmF0ZUhvbGVzKGRhdGEsIGhvbGVJbmRpY2VzLCBvdXRlck5vZGUsIGRpbSkge1xuICAgIHZhciBxdWV1ZSA9IFtdLFxuICAgICAgICBpLCBsZW4sIHN0YXJ0LCBlbmQsIGxpc3Q7XG5cbiAgICBmb3IgKGkgPSAwLCBsZW4gPSBob2xlSW5kaWNlcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBzdGFydCA9IGhvbGVJbmRpY2VzW2ldICogZGltO1xuICAgICAgICBlbmQgPSBpIDwgbGVuIC0gMSA/IGhvbGVJbmRpY2VzW2kgKyAxXSAqIGRpbSA6IGRhdGEubGVuZ3RoO1xuICAgICAgICBsaXN0ID0gbGlua2VkTGlzdChkYXRhLCBzdGFydCwgZW5kLCBkaW0sIGZhbHNlKTtcbiAgICAgICAgaWYgKGxpc3QgPT09IGxpc3QubmV4dCkgbGlzdC5zdGVpbmVyID0gdHJ1ZTtcbiAgICAgICAgcXVldWUucHVzaChnZXRMZWZ0bW9zdChsaXN0KSk7XG4gICAgfVxuXG4gICAgcXVldWUuc29ydChjb21wYXJlWCk7XG5cbiAgICAvLyBwcm9jZXNzIGhvbGVzIGZyb20gbGVmdCB0byByaWdodFxuICAgIGZvciAoaSA9IDA7IGkgPCBxdWV1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICBlbGltaW5hdGVIb2xlKHF1ZXVlW2ldLCBvdXRlck5vZGUpO1xuICAgICAgICBvdXRlck5vZGUgPSBmaWx0ZXJQb2ludHMob3V0ZXJOb2RlLCBvdXRlck5vZGUubmV4dCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG91dGVyTm9kZTtcbn1cblxuZnVuY3Rpb24gY29tcGFyZVgoYSwgYikge1xuICAgIHJldHVybiBhLnggLSBiLng7XG59XG5cbi8vIGZpbmQgYSBicmlkZ2UgYmV0d2VlbiB2ZXJ0aWNlcyB0aGF0IGNvbm5lY3RzIGhvbGUgd2l0aCBhbiBvdXRlciByaW5nIGFuZCBhbmQgbGluayBpdFxuZnVuY3Rpb24gZWxpbWluYXRlSG9sZShob2xlLCBvdXRlck5vZGUpIHtcbiAgICBvdXRlck5vZGUgPSBmaW5kSG9sZUJyaWRnZShob2xlLCBvdXRlck5vZGUpO1xuICAgIGlmIChvdXRlck5vZGUpIHtcbiAgICAgICAgdmFyIGIgPSBzcGxpdFBvbHlnb24ob3V0ZXJOb2RlLCBob2xlKTtcbiAgICAgICAgZmlsdGVyUG9pbnRzKGIsIGIubmV4dCk7XG4gICAgfVxufVxuXG4vLyBEYXZpZCBFYmVybHkncyBhbGdvcml0aG0gZm9yIGZpbmRpbmcgYSBicmlkZ2UgYmV0d2VlbiBob2xlIGFuZCBvdXRlciBwb2x5Z29uXG5mdW5jdGlvbiBmaW5kSG9sZUJyaWRnZShob2xlLCBvdXRlck5vZGUpIHtcbiAgICB2YXIgcCA9IG91dGVyTm9kZSxcbiAgICAgICAgaHggPSBob2xlLngsXG4gICAgICAgIGh5ID0gaG9sZS55LFxuICAgICAgICBxeCA9IC1JbmZpbml0eSxcbiAgICAgICAgbTtcblxuICAgIC8vIGZpbmQgYSBzZWdtZW50IGludGVyc2VjdGVkIGJ5IGEgcmF5IGZyb20gdGhlIGhvbGUncyBsZWZ0bW9zdCBwb2ludCB0byB0aGUgbGVmdDtcbiAgICAvLyBzZWdtZW50J3MgZW5kcG9pbnQgd2l0aCBsZXNzZXIgeCB3aWxsIGJlIHBvdGVudGlhbCBjb25uZWN0aW9uIHBvaW50XG4gICAgZG8ge1xuICAgICAgICBpZiAoaHkgPD0gcC55ICYmIGh5ID49IHAubmV4dC55ICYmIHAubmV4dC55ICE9PSBwLnkpIHtcbiAgICAgICAgICAgIHZhciB4ID0gcC54ICsgKGh5IC0gcC55KSAqIChwLm5leHQueCAtIHAueCkgLyAocC5uZXh0LnkgLSBwLnkpO1xuICAgICAgICAgICAgaWYgKHggPD0gaHggJiYgeCA+IHF4KSB7XG4gICAgICAgICAgICAgICAgcXggPSB4O1xuICAgICAgICAgICAgICAgIGlmICh4ID09PSBoeCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaHkgPT09IHAueSkgcmV0dXJuIHA7XG4gICAgICAgICAgICAgICAgICAgIGlmIChoeSA9PT0gcC5uZXh0LnkpIHJldHVybiBwLm5leHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG0gPSBwLnggPCBwLm5leHQueCA/IHAgOiBwLm5leHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcCA9IHAubmV4dDtcbiAgICB9IHdoaWxlIChwICE9PSBvdXRlck5vZGUpO1xuXG4gICAgaWYgKCFtKSByZXR1cm4gbnVsbDtcblxuICAgIGlmIChoeCA9PT0gcXgpIHJldHVybiBtLnByZXY7IC8vIGhvbGUgdG91Y2hlcyBvdXRlciBzZWdtZW50OyBwaWNrIGxvd2VyIGVuZHBvaW50XG5cbiAgICAvLyBsb29rIGZvciBwb2ludHMgaW5zaWRlIHRoZSB0cmlhbmdsZSBvZiBob2xlIHBvaW50LCBzZWdtZW50IGludGVyc2VjdGlvbiBhbmQgZW5kcG9pbnQ7XG4gICAgLy8gaWYgdGhlcmUgYXJlIG5vIHBvaW50cyBmb3VuZCwgd2UgaGF2ZSBhIHZhbGlkIGNvbm5lY3Rpb247XG4gICAgLy8gb3RoZXJ3aXNlIGNob29zZSB0aGUgcG9pbnQgb2YgdGhlIG1pbmltdW0gYW5nbGUgd2l0aCB0aGUgcmF5IGFzIGNvbm5lY3Rpb24gcG9pbnRcblxuICAgIHZhciBzdG9wID0gbSxcbiAgICAgICAgbXggPSBtLngsXG4gICAgICAgIG15ID0gbS55LFxuICAgICAgICB0YW5NaW4gPSBJbmZpbml0eSxcbiAgICAgICAgdGFuO1xuXG4gICAgcCA9IG0ubmV4dDtcblxuICAgIHdoaWxlIChwICE9PSBzdG9wKSB7XG4gICAgICAgIGlmIChoeCA+PSBwLnggJiYgcC54ID49IG14ICYmIGh4ICE9PSBwLnggJiZcbiAgICAgICAgICAgICAgICBwb2ludEluVHJpYW5nbGUoaHkgPCBteSA/IGh4IDogcXgsIGh5LCBteCwgbXksIGh5IDwgbXkgPyBxeCA6IGh4LCBoeSwgcC54LCBwLnkpKSB7XG5cbiAgICAgICAgICAgIHRhbiA9IE1hdGguYWJzKGh5IC0gcC55KSAvIChoeCAtIHAueCk7IC8vIHRhbmdlbnRpYWxcblxuICAgICAgICAgICAgaWYgKCh0YW4gPCB0YW5NaW4gfHwgKHRhbiA9PT0gdGFuTWluICYmIHAueCA+IG0ueCkpICYmIGxvY2FsbHlJbnNpZGUocCwgaG9sZSkpIHtcbiAgICAgICAgICAgICAgICBtID0gcDtcbiAgICAgICAgICAgICAgICB0YW5NaW4gPSB0YW47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBwID0gcC5uZXh0O1xuICAgIH1cblxuICAgIHJldHVybiBtO1xufVxuXG4vLyBpbnRlcmxpbmsgcG9seWdvbiBub2RlcyBpbiB6LW9yZGVyXG5mdW5jdGlvbiBpbmRleEN1cnZlKHN0YXJ0LCBtaW5YLCBtaW5ZLCBpbnZTaXplKSB7XG4gICAgdmFyIHAgPSBzdGFydDtcbiAgICBkbyB7XG4gICAgICAgIGlmIChwLnogPT09IG51bGwpIHAueiA9IHpPcmRlcihwLngsIHAueSwgbWluWCwgbWluWSwgaW52U2l6ZSk7XG4gICAgICAgIHAucHJldlogPSBwLnByZXY7XG4gICAgICAgIHAubmV4dFogPSBwLm5leHQ7XG4gICAgICAgIHAgPSBwLm5leHQ7XG4gICAgfSB3aGlsZSAocCAhPT0gc3RhcnQpO1xuXG4gICAgcC5wcmV2Wi5uZXh0WiA9IG51bGw7XG4gICAgcC5wcmV2WiA9IG51bGw7XG5cbiAgICBzb3J0TGlua2VkKHApO1xufVxuXG4vLyBTaW1vbiBUYXRoYW0ncyBsaW5rZWQgbGlzdCBtZXJnZSBzb3J0IGFsZ29yaXRobVxuLy8gaHR0cDovL3d3dy5jaGlhcmsuZ3JlZW5lbmQub3JnLnVrL35zZ3RhdGhhbS9hbGdvcml0aG1zL2xpc3Rzb3J0Lmh0bWxcbmZ1bmN0aW9uIHNvcnRMaW5rZWQobGlzdCkge1xuICAgIHZhciBpLCBwLCBxLCBlLCB0YWlsLCBudW1NZXJnZXMsIHBTaXplLCBxU2l6ZSxcbiAgICAgICAgaW5TaXplID0gMTtcblxuICAgIGRvIHtcbiAgICAgICAgcCA9IGxpc3Q7XG4gICAgICAgIGxpc3QgPSBudWxsO1xuICAgICAgICB0YWlsID0gbnVsbDtcbiAgICAgICAgbnVtTWVyZ2VzID0gMDtcblxuICAgICAgICB3aGlsZSAocCkge1xuICAgICAgICAgICAgbnVtTWVyZ2VzKys7XG4gICAgICAgICAgICBxID0gcDtcbiAgICAgICAgICAgIHBTaXplID0gMDtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBpblNpemU7IGkrKykge1xuICAgICAgICAgICAgICAgIHBTaXplKys7XG4gICAgICAgICAgICAgICAgcSA9IHEubmV4dFo7XG4gICAgICAgICAgICAgICAgaWYgKCFxKSBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHFTaXplID0gaW5TaXplO1xuXG4gICAgICAgICAgICB3aGlsZSAocFNpemUgPiAwIHx8IChxU2l6ZSA+IDAgJiYgcSkpIHtcblxuICAgICAgICAgICAgICAgIGlmIChwU2l6ZSAhPT0gMCAmJiAocVNpemUgPT09IDAgfHwgIXEgfHwgcC56IDw9IHEueikpIHtcbiAgICAgICAgICAgICAgICAgICAgZSA9IHA7XG4gICAgICAgICAgICAgICAgICAgIHAgPSBwLm5leHRaO1xuICAgICAgICAgICAgICAgICAgICBwU2l6ZS0tO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGUgPSBxO1xuICAgICAgICAgICAgICAgICAgICBxID0gcS5uZXh0WjtcbiAgICAgICAgICAgICAgICAgICAgcVNpemUtLTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodGFpbCkgdGFpbC5uZXh0WiA9IGU7XG4gICAgICAgICAgICAgICAgZWxzZSBsaXN0ID0gZTtcblxuICAgICAgICAgICAgICAgIGUucHJldlogPSB0YWlsO1xuICAgICAgICAgICAgICAgIHRhaWwgPSBlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwID0gcTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRhaWwubmV4dFogPSBudWxsO1xuICAgICAgICBpblNpemUgKj0gMjtcblxuICAgIH0gd2hpbGUgKG51bU1lcmdlcyA+IDEpO1xuXG4gICAgcmV0dXJuIGxpc3Q7XG59XG5cbi8vIHotb3JkZXIgb2YgYSBwb2ludCBnaXZlbiBjb29yZHMgYW5kIGludmVyc2Ugb2YgdGhlIGxvbmdlciBzaWRlIG9mIGRhdGEgYmJveFxuZnVuY3Rpb24gek9yZGVyKHgsIHksIG1pblgsIG1pblksIGludlNpemUpIHtcbiAgICAvLyBjb29yZHMgYXJlIHRyYW5zZm9ybWVkIGludG8gbm9uLW5lZ2F0aXZlIDE1LWJpdCBpbnRlZ2VyIHJhbmdlXG4gICAgeCA9IDMyNzY3ICogKHggLSBtaW5YKSAqIGludlNpemU7XG4gICAgeSA9IDMyNzY3ICogKHkgLSBtaW5ZKSAqIGludlNpemU7XG5cbiAgICB4ID0gKHggfCAoeCA8PCA4KSkgJiAweDAwRkYwMEZGO1xuICAgIHggPSAoeCB8ICh4IDw8IDQpKSAmIDB4MEYwRjBGMEY7XG4gICAgeCA9ICh4IHwgKHggPDwgMikpICYgMHgzMzMzMzMzMztcbiAgICB4ID0gKHggfCAoeCA8PCAxKSkgJiAweDU1NTU1NTU1O1xuXG4gICAgeSA9ICh5IHwgKHkgPDwgOCkpICYgMHgwMEZGMDBGRjtcbiAgICB5ID0gKHkgfCAoeSA8PCA0KSkgJiAweDBGMEYwRjBGO1xuICAgIHkgPSAoeSB8ICh5IDw8IDIpKSAmIDB4MzMzMzMzMzM7XG4gICAgeSA9ICh5IHwgKHkgPDwgMSkpICYgMHg1NTU1NTU1NTtcblxuICAgIHJldHVybiB4IHwgKHkgPDwgMSk7XG59XG5cbi8vIGZpbmQgdGhlIGxlZnRtb3N0IG5vZGUgb2YgYSBwb2x5Z29uIHJpbmdcbmZ1bmN0aW9uIGdldExlZnRtb3N0KHN0YXJ0KSB7XG4gICAgdmFyIHAgPSBzdGFydCxcbiAgICAgICAgbGVmdG1vc3QgPSBzdGFydDtcbiAgICBkbyB7XG4gICAgICAgIGlmIChwLnggPCBsZWZ0bW9zdC54IHx8IChwLnggPT09IGxlZnRtb3N0LnggJiYgcC55IDwgbGVmdG1vc3QueSkpIGxlZnRtb3N0ID0gcDtcbiAgICAgICAgcCA9IHAubmV4dDtcbiAgICB9IHdoaWxlIChwICE9PSBzdGFydCk7XG5cbiAgICByZXR1cm4gbGVmdG1vc3Q7XG59XG5cbi8vIGNoZWNrIGlmIGEgcG9pbnQgbGllcyB3aXRoaW4gYSBjb252ZXggdHJpYW5nbGVcbmZ1bmN0aW9uIHBvaW50SW5UcmlhbmdsZShheCwgYXksIGJ4LCBieSwgY3gsIGN5LCBweCwgcHkpIHtcbiAgICByZXR1cm4gKGN4IC0gcHgpICogKGF5IC0gcHkpIC0gKGF4IC0gcHgpICogKGN5IC0gcHkpID49IDAgJiZcbiAgICAgICAgICAgKGF4IC0gcHgpICogKGJ5IC0gcHkpIC0gKGJ4IC0gcHgpICogKGF5IC0gcHkpID49IDAgJiZcbiAgICAgICAgICAgKGJ4IC0gcHgpICogKGN5IC0gcHkpIC0gKGN4IC0gcHgpICogKGJ5IC0gcHkpID49IDA7XG59XG5cbi8vIGNoZWNrIGlmIGEgZGlhZ29uYWwgYmV0d2VlbiB0d28gcG9seWdvbiBub2RlcyBpcyB2YWxpZCAobGllcyBpbiBwb2x5Z29uIGludGVyaW9yKVxuZnVuY3Rpb24gaXNWYWxpZERpYWdvbmFsKGEsIGIpIHtcbiAgICByZXR1cm4gYS5uZXh0LmkgIT09IGIuaSAmJiBhLnByZXYuaSAhPT0gYi5pICYmICFpbnRlcnNlY3RzUG9seWdvbihhLCBiKSAmJlxuICAgICAgICAgICBsb2NhbGx5SW5zaWRlKGEsIGIpICYmIGxvY2FsbHlJbnNpZGUoYiwgYSkgJiYgbWlkZGxlSW5zaWRlKGEsIGIpO1xufVxuXG4vLyBzaWduZWQgYXJlYSBvZiBhIHRyaWFuZ2xlXG5mdW5jdGlvbiBhcmVhKHAsIHEsIHIpIHtcbiAgICByZXR1cm4gKHEueSAtIHAueSkgKiAoci54IC0gcS54KSAtIChxLnggLSBwLngpICogKHIueSAtIHEueSk7XG59XG5cbi8vIGNoZWNrIGlmIHR3byBwb2ludHMgYXJlIGVxdWFsXG5mdW5jdGlvbiBlcXVhbHMocDEsIHAyKSB7XG4gICAgcmV0dXJuIHAxLnggPT09IHAyLnggJiYgcDEueSA9PT0gcDIueTtcbn1cblxuLy8gY2hlY2sgaWYgdHdvIHNlZ21lbnRzIGludGVyc2VjdFxuZnVuY3Rpb24gaW50ZXJzZWN0cyhwMSwgcTEsIHAyLCBxMikge1xuICAgIGlmICgoZXF1YWxzKHAxLCBxMSkgJiYgZXF1YWxzKHAyLCBxMikpIHx8XG4gICAgICAgIChlcXVhbHMocDEsIHEyKSAmJiBlcXVhbHMocDIsIHExKSkpIHJldHVybiB0cnVlO1xuICAgIHJldHVybiBhcmVhKHAxLCBxMSwgcDIpID4gMCAhPT0gYXJlYShwMSwgcTEsIHEyKSA+IDAgJiZcbiAgICAgICAgICAgYXJlYShwMiwgcTIsIHAxKSA+IDAgIT09IGFyZWEocDIsIHEyLCBxMSkgPiAwO1xufVxuXG4vLyBjaGVjayBpZiBhIHBvbHlnb24gZGlhZ29uYWwgaW50ZXJzZWN0cyBhbnkgcG9seWdvbiBzZWdtZW50c1xuZnVuY3Rpb24gaW50ZXJzZWN0c1BvbHlnb24oYSwgYikge1xuICAgIHZhciBwID0gYTtcbiAgICBkbyB7XG4gICAgICAgIGlmIChwLmkgIT09IGEuaSAmJiBwLm5leHQuaSAhPT0gYS5pICYmIHAuaSAhPT0gYi5pICYmIHAubmV4dC5pICE9PSBiLmkgJiZcbiAgICAgICAgICAgICAgICBpbnRlcnNlY3RzKHAsIHAubmV4dCwgYSwgYikpIHJldHVybiB0cnVlO1xuICAgICAgICBwID0gcC5uZXh0O1xuICAgIH0gd2hpbGUgKHAgIT09IGEpO1xuXG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG4vLyBjaGVjayBpZiBhIHBvbHlnb24gZGlhZ29uYWwgaXMgbG9jYWxseSBpbnNpZGUgdGhlIHBvbHlnb25cbmZ1bmN0aW9uIGxvY2FsbHlJbnNpZGUoYSwgYikge1xuICAgIHJldHVybiBhcmVhKGEucHJldiwgYSwgYS5uZXh0KSA8IDAgP1xuICAgICAgICBhcmVhKGEsIGIsIGEubmV4dCkgPj0gMCAmJiBhcmVhKGEsIGEucHJldiwgYikgPj0gMCA6XG4gICAgICAgIGFyZWEoYSwgYiwgYS5wcmV2KSA8IDAgfHwgYXJlYShhLCBhLm5leHQsIGIpIDwgMDtcbn1cblxuLy8gY2hlY2sgaWYgdGhlIG1pZGRsZSBwb2ludCBvZiBhIHBvbHlnb24gZGlhZ29uYWwgaXMgaW5zaWRlIHRoZSBwb2x5Z29uXG5mdW5jdGlvbiBtaWRkbGVJbnNpZGUoYSwgYikge1xuICAgIHZhciBwID0gYSxcbiAgICAgICAgaW5zaWRlID0gZmFsc2UsXG4gICAgICAgIHB4ID0gKGEueCArIGIueCkgLyAyLFxuICAgICAgICBweSA9IChhLnkgKyBiLnkpIC8gMjtcbiAgICBkbyB7XG4gICAgICAgIGlmICgoKHAueSA+IHB5KSAhPT0gKHAubmV4dC55ID4gcHkpKSAmJiBwLm5leHQueSAhPT0gcC55ICYmXG4gICAgICAgICAgICAgICAgKHB4IDwgKHAubmV4dC54IC0gcC54KSAqIChweSAtIHAueSkgLyAocC5uZXh0LnkgLSBwLnkpICsgcC54KSlcbiAgICAgICAgICAgIGluc2lkZSA9ICFpbnNpZGU7XG4gICAgICAgIHAgPSBwLm5leHQ7XG4gICAgfSB3aGlsZSAocCAhPT0gYSk7XG5cbiAgICByZXR1cm4gaW5zaWRlO1xufVxuXG4vLyBsaW5rIHR3byBwb2x5Z29uIHZlcnRpY2VzIHdpdGggYSBicmlkZ2U7IGlmIHRoZSB2ZXJ0aWNlcyBiZWxvbmcgdG8gdGhlIHNhbWUgcmluZywgaXQgc3BsaXRzIHBvbHlnb24gaW50byB0d287XG4vLyBpZiBvbmUgYmVsb25ncyB0byB0aGUgb3V0ZXIgcmluZyBhbmQgYW5vdGhlciB0byBhIGhvbGUsIGl0IG1lcmdlcyBpdCBpbnRvIGEgc2luZ2xlIHJpbmdcbmZ1bmN0aW9uIHNwbGl0UG9seWdvbihhLCBiKSB7XG4gICAgdmFyIGEyID0gbmV3IE5vZGUoYS5pLCBhLngsIGEueSksXG4gICAgICAgIGIyID0gbmV3IE5vZGUoYi5pLCBiLngsIGIueSksXG4gICAgICAgIGFuID0gYS5uZXh0LFxuICAgICAgICBicCA9IGIucHJldjtcblxuICAgIGEubmV4dCA9IGI7XG4gICAgYi5wcmV2ID0gYTtcblxuICAgIGEyLm5leHQgPSBhbjtcbiAgICBhbi5wcmV2ID0gYTI7XG5cbiAgICBiMi5uZXh0ID0gYTI7XG4gICAgYTIucHJldiA9IGIyO1xuXG4gICAgYnAubmV4dCA9IGIyO1xuICAgIGIyLnByZXYgPSBicDtcblxuICAgIHJldHVybiBiMjtcbn1cblxuLy8gY3JlYXRlIGEgbm9kZSBhbmQgb3B0aW9uYWxseSBsaW5rIGl0IHdpdGggcHJldmlvdXMgb25lIChpbiBhIGNpcmN1bGFyIGRvdWJseSBsaW5rZWQgbGlzdClcbmZ1bmN0aW9uIGluc2VydE5vZGUoaSwgeCwgeSwgbGFzdCkge1xuICAgIHZhciBwID0gbmV3IE5vZGUoaSwgeCwgeSk7XG5cbiAgICBpZiAoIWxhc3QpIHtcbiAgICAgICAgcC5wcmV2ID0gcDtcbiAgICAgICAgcC5uZXh0ID0gcDtcblxuICAgIH0gZWxzZSB7XG4gICAgICAgIHAubmV4dCA9IGxhc3QubmV4dDtcbiAgICAgICAgcC5wcmV2ID0gbGFzdDtcbiAgICAgICAgbGFzdC5uZXh0LnByZXYgPSBwO1xuICAgICAgICBsYXN0Lm5leHQgPSBwO1xuICAgIH1cbiAgICByZXR1cm4gcDtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlTm9kZShwKSB7XG4gICAgcC5uZXh0LnByZXYgPSBwLnByZXY7XG4gICAgcC5wcmV2Lm5leHQgPSBwLm5leHQ7XG5cbiAgICBpZiAocC5wcmV2WikgcC5wcmV2Wi5uZXh0WiA9IHAubmV4dFo7XG4gICAgaWYgKHAubmV4dFopIHAubmV4dFoucHJldlogPSBwLnByZXZaO1xufVxuXG5mdW5jdGlvbiBOb2RlKGksIHgsIHkpIHtcbiAgICAvLyB2ZXJ0ZXggaW5kZXggaW4gY29vcmRpbmF0ZXMgYXJyYXlcbiAgICB0aGlzLmkgPSBpO1xuXG4gICAgLy8gdmVydGV4IGNvb3JkaW5hdGVzXG4gICAgdGhpcy54ID0geDtcbiAgICB0aGlzLnkgPSB5O1xuXG4gICAgLy8gcHJldmlvdXMgYW5kIG5leHQgdmVydGV4IG5vZGVzIGluIGEgcG9seWdvbiByaW5nXG4gICAgdGhpcy5wcmV2ID0gbnVsbDtcbiAgICB0aGlzLm5leHQgPSBudWxsO1xuXG4gICAgLy8gei1vcmRlciBjdXJ2ZSB2YWx1ZVxuICAgIHRoaXMueiA9IG51bGw7XG5cbiAgICAvLyBwcmV2aW91cyBhbmQgbmV4dCBub2RlcyBpbiB6LW9yZGVyXG4gICAgdGhpcy5wcmV2WiA9IG51bGw7XG4gICAgdGhpcy5uZXh0WiA9IG51bGw7XG5cbiAgICAvLyBpbmRpY2F0ZXMgd2hldGhlciB0aGlzIGlzIGEgc3RlaW5lciBwb2ludFxuICAgIHRoaXMuc3RlaW5lciA9IGZhbHNlO1xufVxuXG4vLyByZXR1cm4gYSBwZXJjZW50YWdlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgcG9seWdvbiBhcmVhIGFuZCBpdHMgdHJpYW5ndWxhdGlvbiBhcmVhO1xuLy8gdXNlZCB0byB2ZXJpZnkgY29ycmVjdG5lc3Mgb2YgdHJpYW5ndWxhdGlvblxuZWFyY3V0LmRldmlhdGlvbiA9IGZ1bmN0aW9uIChkYXRhLCBob2xlSW5kaWNlcywgZGltLCB0cmlhbmdsZXMpIHtcbiAgICB2YXIgaGFzSG9sZXMgPSBob2xlSW5kaWNlcyAmJiBob2xlSW5kaWNlcy5sZW5ndGg7XG4gICAgdmFyIG91dGVyTGVuID0gaGFzSG9sZXMgPyBob2xlSW5kaWNlc1swXSAqIGRpbSA6IGRhdGEubGVuZ3RoO1xuXG4gICAgdmFyIHBvbHlnb25BcmVhID0gTWF0aC5hYnMoc2lnbmVkQXJlYShkYXRhLCAwLCBvdXRlckxlbiwgZGltKSk7XG4gICAgaWYgKGhhc0hvbGVzKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBob2xlSW5kaWNlcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgdmFyIHN0YXJ0ID0gaG9sZUluZGljZXNbaV0gKiBkaW07XG4gICAgICAgICAgICB2YXIgZW5kID0gaSA8IGxlbiAtIDEgPyBob2xlSW5kaWNlc1tpICsgMV0gKiBkaW0gOiBkYXRhLmxlbmd0aDtcbiAgICAgICAgICAgIHBvbHlnb25BcmVhIC09IE1hdGguYWJzKHNpZ25lZEFyZWEoZGF0YSwgc3RhcnQsIGVuZCwgZGltKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgdHJpYW5nbGVzQXJlYSA9IDA7XG4gICAgZm9yIChpID0gMDsgaSA8IHRyaWFuZ2xlcy5sZW5ndGg7IGkgKz0gMykge1xuICAgICAgICB2YXIgYSA9IHRyaWFuZ2xlc1tpXSAqIGRpbTtcbiAgICAgICAgdmFyIGIgPSB0cmlhbmdsZXNbaSArIDFdICogZGltO1xuICAgICAgICB2YXIgYyA9IHRyaWFuZ2xlc1tpICsgMl0gKiBkaW07XG4gICAgICAgIHRyaWFuZ2xlc0FyZWEgKz0gTWF0aC5hYnMoXG4gICAgICAgICAgICAoZGF0YVthXSAtIGRhdGFbY10pICogKGRhdGFbYiArIDFdIC0gZGF0YVthICsgMV0pIC1cbiAgICAgICAgICAgIChkYXRhW2FdIC0gZGF0YVtiXSkgKiAoZGF0YVtjICsgMV0gLSBkYXRhW2EgKyAxXSkpO1xuICAgIH1cblxuICAgIHJldHVybiBwb2x5Z29uQXJlYSA9PT0gMCAmJiB0cmlhbmdsZXNBcmVhID09PSAwID8gMCA6XG4gICAgICAgIE1hdGguYWJzKCh0cmlhbmdsZXNBcmVhIC0gcG9seWdvbkFyZWEpIC8gcG9seWdvbkFyZWEpO1xufTtcblxuZnVuY3Rpb24gc2lnbmVkQXJlYShkYXRhLCBzdGFydCwgZW5kLCBkaW0pIHtcbiAgICB2YXIgc3VtID0gMDtcbiAgICBmb3IgKHZhciBpID0gc3RhcnQsIGogPSBlbmQgLSBkaW07IGkgPCBlbmQ7IGkgKz0gZGltKSB7XG4gICAgICAgIHN1bSArPSAoZGF0YVtqXSAtIGRhdGFbaV0pICogKGRhdGFbaSArIDFdICsgZGF0YVtqICsgMV0pO1xuICAgICAgICBqID0gaTtcbiAgICB9XG4gICAgcmV0dXJuIHN1bTtcbn1cblxuLy8gdHVybiBhIHBvbHlnb24gaW4gYSBtdWx0aS1kaW1lbnNpb25hbCBhcnJheSBmb3JtIChlLmcuIGFzIGluIEdlb0pTT04pIGludG8gYSBmb3JtIEVhcmN1dCBhY2NlcHRzXG5lYXJjdXQuZmxhdHRlbiA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgdmFyIGRpbSA9IGRhdGFbMF1bMF0ubGVuZ3RoLFxuICAgICAgICByZXN1bHQgPSB7dmVydGljZXM6IFtdLCBob2xlczogW10sIGRpbWVuc2lvbnM6IGRpbX0sXG4gICAgICAgIGhvbGVJbmRleCA9IDA7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBkYXRhW2ldLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBkID0gMDsgZCA8IGRpbTsgZCsrKSByZXN1bHQudmVydGljZXMucHVzaChkYXRhW2ldW2pdW2RdKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaSA+IDApIHtcbiAgICAgICAgICAgIGhvbGVJbmRleCArPSBkYXRhW2kgLSAxXS5sZW5ndGg7XG4gICAgICAgICAgICByZXN1bHQuaG9sZXMucHVzaChob2xlSW5kZXgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59O1xuIiwiXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBxdWlja3NlbGVjdChhcnIsIGssIGxlZnQsIHJpZ2h0LCBjb21wYXJlKSB7XG4gICAgcXVpY2tzZWxlY3RTdGVwKGFyciwgaywgbGVmdCB8fCAwLCByaWdodCB8fCAoYXJyLmxlbmd0aCAtIDEpLCBjb21wYXJlIHx8IGRlZmF1bHRDb21wYXJlKTtcbn1cblxuZnVuY3Rpb24gcXVpY2tzZWxlY3RTdGVwKGFyciwgaywgbGVmdCwgcmlnaHQsIGNvbXBhcmUpIHtcblxuICAgIHdoaWxlIChyaWdodCA+IGxlZnQpIHtcbiAgICAgICAgaWYgKHJpZ2h0IC0gbGVmdCA+IDYwMCkge1xuICAgICAgICAgICAgdmFyIG4gPSByaWdodCAtIGxlZnQgKyAxO1xuICAgICAgICAgICAgdmFyIG0gPSBrIC0gbGVmdCArIDE7XG4gICAgICAgICAgICB2YXIgeiA9IE1hdGgubG9nKG4pO1xuICAgICAgICAgICAgdmFyIHMgPSAwLjUgKiBNYXRoLmV4cCgyICogeiAvIDMpO1xuICAgICAgICAgICAgdmFyIHNkID0gMC41ICogTWF0aC5zcXJ0KHogKiBzICogKG4gLSBzKSAvIG4pICogKG0gLSBuIC8gMiA8IDAgPyAtMSA6IDEpO1xuICAgICAgICAgICAgdmFyIG5ld0xlZnQgPSBNYXRoLm1heChsZWZ0LCBNYXRoLmZsb29yKGsgLSBtICogcyAvIG4gKyBzZCkpO1xuICAgICAgICAgICAgdmFyIG5ld1JpZ2h0ID0gTWF0aC5taW4ocmlnaHQsIE1hdGguZmxvb3IoayArIChuIC0gbSkgKiBzIC8gbiArIHNkKSk7XG4gICAgICAgICAgICBxdWlja3NlbGVjdFN0ZXAoYXJyLCBrLCBuZXdMZWZ0LCBuZXdSaWdodCwgY29tcGFyZSk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgdCA9IGFycltrXTtcbiAgICAgICAgdmFyIGkgPSBsZWZ0O1xuICAgICAgICB2YXIgaiA9IHJpZ2h0O1xuXG4gICAgICAgIHN3YXAoYXJyLCBsZWZ0LCBrKTtcbiAgICAgICAgaWYgKGNvbXBhcmUoYXJyW3JpZ2h0XSwgdCkgPiAwKSBzd2FwKGFyciwgbGVmdCwgcmlnaHQpO1xuXG4gICAgICAgIHdoaWxlIChpIDwgaikge1xuICAgICAgICAgICAgc3dhcChhcnIsIGksIGopO1xuICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgai0tO1xuICAgICAgICAgICAgd2hpbGUgKGNvbXBhcmUoYXJyW2ldLCB0KSA8IDApIGkrKztcbiAgICAgICAgICAgIHdoaWxlIChjb21wYXJlKGFycltqXSwgdCkgPiAwKSBqLS07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29tcGFyZShhcnJbbGVmdF0sIHQpID09PSAwKSBzd2FwKGFyciwgbGVmdCwgaik7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaisrO1xuICAgICAgICAgICAgc3dhcChhcnIsIGosIHJpZ2h0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChqIDw9IGspIGxlZnQgPSBqICsgMTtcbiAgICAgICAgaWYgKGsgPD0gaikgcmlnaHQgPSBqIC0gMTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHN3YXAoYXJyLCBpLCBqKSB7XG4gICAgdmFyIHRtcCA9IGFycltpXTtcbiAgICBhcnJbaV0gPSBhcnJbal07XG4gICAgYXJyW2pdID0gdG1wO1xufVxuXG5mdW5jdGlvbiBkZWZhdWx0Q29tcGFyZShhLCBiKSB7XG4gICAgcmV0dXJuIGEgPCBiID8gLTEgOiBhID4gYiA/IDEgOiAwO1xufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHF1aWNrc2VsZWN0IGZyb20gJ3F1aWNrc2VsZWN0JztcblxuaW1wb3J0IHsgY2FsY3VsYXRlU2lnbmVkQXJlYSB9IGZyb20gJy4vdXRpbCc7XG5cbmltcG9ydCB0eXBlIFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuXG4vLyBjbGFzc2lmaWVzIGFuIGFycmF5IG9mIHJpbmdzIGludG8gcG9seWdvbnMgd2l0aCBvdXRlciByaW5ncyBhbmQgaG9sZXNcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNsYXNzaWZ5UmluZ3MocmluZ3M6IEFycmF5PEFycmF5PFBvaW50Pj4sIG1heFJpbmdzOiBudW1iZXIpIHtcbiAgICBjb25zdCBsZW4gPSByaW5ncy5sZW5ndGg7XG5cbiAgICBpZiAobGVuIDw9IDEpIHJldHVybiBbcmluZ3NdO1xuXG4gICAgY29uc3QgcG9seWdvbnMgPSBbXTtcbiAgICBsZXQgcG9seWdvbixcbiAgICAgICAgY2N3O1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBjb25zdCBhcmVhID0gY2FsY3VsYXRlU2lnbmVkQXJlYShyaW5nc1tpXSk7XG4gICAgICAgIGlmIChhcmVhID09PSAwKSBjb250aW51ZTtcblxuICAgICAgICAocmluZ3NbaV06IGFueSkuYXJlYSA9IE1hdGguYWJzKGFyZWEpO1xuXG4gICAgICAgIGlmIChjY3cgPT09IHVuZGVmaW5lZCkgY2N3ID0gYXJlYSA8IDA7XG5cbiAgICAgICAgaWYgKGNjdyA9PT0gYXJlYSA8IDApIHtcbiAgICAgICAgICAgIGlmIChwb2x5Z29uKSBwb2x5Z29ucy5wdXNoKHBvbHlnb24pO1xuICAgICAgICAgICAgcG9seWdvbiA9IFtyaW5nc1tpXV07XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIChwb2x5Z29uOiBhbnkpLnB1c2gocmluZ3NbaV0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChwb2x5Z29uKSBwb2x5Z29ucy5wdXNoKHBvbHlnb24pO1xuXG4gICAgLy8gRWFyY3V0IHBlcmZvcm1hbmNlIGRlZ3JhZGVzIHdpdGggdGhlICMgb2YgcmluZ3MgaW4gYSBwb2x5Z29uLiBGb3IgdGhpc1xuICAgIC8vIHJlYXNvbiwgd2UgbGltaXQgc3RyaXAgb3V0IGFsbCBidXQgdGhlIGBtYXhSaW5nc2AgbGFyZ2VzdCByaW5ncy5cbiAgICBpZiAobWF4UmluZ3MgPiAxKSB7XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcG9seWdvbnMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGlmIChwb2x5Z29uc1tqXS5sZW5ndGggPD0gbWF4UmluZ3MpIGNvbnRpbnVlO1xuICAgICAgICAgICAgcXVpY2tzZWxlY3QocG9seWdvbnNbal0sIG1heFJpbmdzLCAxLCBwb2x5Z29uc1tqXS5sZW5ndGggLSAxLCBjb21wYXJlQXJlYXMpO1xuICAgICAgICAgICAgcG9seWdvbnNbal0gPSBwb2x5Z29uc1tqXS5zbGljZSgwLCBtYXhSaW5ncyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcG9seWdvbnM7XG59XG5cbmZ1bmN0aW9uIGNvbXBhcmVBcmVhcyhhLCBiKSB7XG4gICAgcmV0dXJuIGIuYXJlYSAtIGEuYXJlYTtcbn1cbiIsIi8vIEBmbG93XG5pbXBvcnQgdHlwZSBGaWxsU3R5bGVMYXllciBmcm9tICcuLi8uLi9zdHlsZS9zdHlsZV9sYXllci9maWxsX3N0eWxlX2xheWVyJztcbmltcG9ydCB0eXBlIEZpbGxFeHRydXNpb25TdHlsZUxheWVyIGZyb20gJy4uLy4uL3N0eWxlL3N0eWxlX2xheWVyL2ZpbGxfZXh0cnVzaW9uX3N0eWxlX2xheWVyJztcbmltcG9ydCB0eXBlIExpbmVTdHlsZUxheWVyIGZyb20gJy4uLy4uL3N0eWxlL3N0eWxlX2xheWVyL2xpbmVfc3R5bGVfbGF5ZXInO1xuXG5pbXBvcnQgdHlwZSB7XG4gICAgQnVja2V0RmVhdHVyZSxcbiAgICBQb3B1bGF0ZVBhcmFtZXRlcnNcbn0gZnJvbSAnLi4vYnVja2V0JztcblxudHlwZSBQYXR0ZXJuU3R5bGVMYXllcnMgPVxuICAgIEFycmF5PExpbmVTdHlsZUxheWVyPiB8XG4gICAgQXJyYXk8RmlsbFN0eWxlTGF5ZXI+IHxcbiAgICBBcnJheTxGaWxsRXh0cnVzaW9uU3R5bGVMYXllcj47XG5cbmV4cG9ydCBmdW5jdGlvbiBoYXNQYXR0ZXJuKHR5cGU6IHN0cmluZywgbGF5ZXJzOiBQYXR0ZXJuU3R5bGVMYXllcnMsIG9wdGlvbnM6IFBvcHVsYXRlUGFyYW1ldGVycykge1xuICAgIGNvbnN0IHBhdHRlcm5zID0gb3B0aW9ucy5wYXR0ZXJuRGVwZW5kZW5jaWVzO1xuICAgIGxldCBoYXNQYXR0ZXJuID0gZmFsc2U7XG5cbiAgICBmb3IgKGNvbnN0IGxheWVyIG9mIGxheWVycykge1xuICAgICAgICBjb25zdCBwYXR0ZXJuUHJvcGVydHkgPSBsYXllci5wYWludC5nZXQoYCR7dHlwZX0tcGF0dGVybmApO1xuICAgICAgICBpZiAoIXBhdHRlcm5Qcm9wZXJ0eS5pc0NvbnN0YW50KCkpIHtcbiAgICAgICAgICAgIGhhc1BhdHRlcm4gPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29uc3RhbnRQYXR0ZXJuID0gcGF0dGVyblByb3BlcnR5LmNvbnN0YW50T3IobnVsbCk7XG4gICAgICAgIGlmIChjb25zdGFudFBhdHRlcm4pIHtcbiAgICAgICAgICAgIGhhc1BhdHRlcm4gPSB0cnVlO1xuICAgICAgICAgICAgcGF0dGVybnNbY29uc3RhbnRQYXR0ZXJuLnRvXSA9ICB0cnVlO1xuICAgICAgICAgICAgcGF0dGVybnNbY29uc3RhbnRQYXR0ZXJuLmZyb21dID0gIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gaGFzUGF0dGVybjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFkZFBhdHRlcm5EZXBlbmRlbmNpZXModHlwZTogc3RyaW5nLCBsYXllcnM6IFBhdHRlcm5TdHlsZUxheWVycywgcGF0dGVybkZlYXR1cmU6IEJ1Y2tldEZlYXR1cmUsIHpvb206IG51bWJlciwgb3B0aW9uczogUG9wdWxhdGVQYXJhbWV0ZXJzKSB7XG4gICAgY29uc3QgcGF0dGVybnMgPSBvcHRpb25zLnBhdHRlcm5EZXBlbmRlbmNpZXM7XG4gICAgZm9yIChjb25zdCBsYXllciBvZiBsYXllcnMpIHtcbiAgICAgICAgY29uc3QgcGF0dGVyblByb3BlcnR5ID0gbGF5ZXIucGFpbnQuZ2V0KGAke3R5cGV9LXBhdHRlcm5gKTtcblxuICAgICAgICBjb25zdCBwYXR0ZXJuUHJvcGVydHlWYWx1ZSA9IHBhdHRlcm5Qcm9wZXJ0eS52YWx1ZTtcbiAgICAgICAgaWYgKHBhdHRlcm5Qcm9wZXJ0eVZhbHVlLmtpbmQgIT09IFwiY29uc3RhbnRcIikge1xuICAgICAgICAgICAgY29uc3QgbWluID0gcGF0dGVyblByb3BlcnR5VmFsdWUuZXZhbHVhdGUoe3pvb206IHpvb20gLSAxfSwgcGF0dGVybkZlYXR1cmUsIHt9KTtcbiAgICAgICAgICAgIGNvbnN0IG1pZCA9IHBhdHRlcm5Qcm9wZXJ0eVZhbHVlLmV2YWx1YXRlKHt6b29tfSwgcGF0dGVybkZlYXR1cmUsIHt9KTtcbiAgICAgICAgICAgIGNvbnN0IG1heCA9IHBhdHRlcm5Qcm9wZXJ0eVZhbHVlLmV2YWx1YXRlKHt6b29tOiB6b29tICsgMX0sIHBhdHRlcm5GZWF0dXJlLCB7fSk7XG4gICAgICAgICAgICAvLyBhZGQgdG8gcGF0dGVybkRlcGVuZGVuY2llc1xuICAgICAgICAgICAgcGF0dGVybnNbbWluXSA9IHRydWU7XG4gICAgICAgICAgICBwYXR0ZXJuc1ttaWRdID0gdHJ1ZTtcbiAgICAgICAgICAgIHBhdHRlcm5zW21heF0gPSB0cnVlO1xuXG4gICAgICAgICAgICAvLyBzYXZlIGZvciBsYXlvdXRcbiAgICAgICAgICAgIHBhdHRlcm5GZWF0dXJlLnBhdHRlcm5zW2xheWVyLmlkXSA9IHsgbWluLCBtaWQsIG1heCB9O1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwYXR0ZXJuRmVhdHVyZTtcbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7IEZpbGxMYXlvdXRBcnJheSB9IGZyb20gJy4uL2FycmF5X3R5cGVzJztcblxuaW1wb3J0IHsgbWVtYmVycyBhcyBsYXlvdXRBdHRyaWJ1dGVzIH0gZnJvbSAnLi9maWxsX2F0dHJpYnV0ZXMnO1xuaW1wb3J0IFNlZ21lbnRWZWN0b3IgZnJvbSAnLi4vc2VnbWVudCc7XG5pbXBvcnQgeyBQcm9ncmFtQ29uZmlndXJhdGlvblNldCB9IGZyb20gJy4uL3Byb2dyYW1fY29uZmlndXJhdGlvbic7XG5pbXBvcnQgeyBMaW5lSW5kZXhBcnJheSwgVHJpYW5nbGVJbmRleEFycmF5IH0gZnJvbSAnLi4vaW5kZXhfYXJyYXlfdHlwZSc7XG5pbXBvcnQgZWFyY3V0IGZyb20gJ2VhcmN1dCc7XG5pbXBvcnQgY2xhc3NpZnlSaW5ncyBmcm9tICcuLi8uLi91dGlsL2NsYXNzaWZ5X3JpbmdzJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmNvbnN0IEVBUkNVVF9NQVhfUklOR1MgPSA1MDA7XG5pbXBvcnQgeyByZWdpc3RlciB9IGZyb20gJy4uLy4uL3V0aWwvd2ViX3dvcmtlcl90cmFuc2Zlcic7XG5pbXBvcnQge2hhc1BhdHRlcm4sIGFkZFBhdHRlcm5EZXBlbmRlbmNpZXN9IGZyb20gJy4vcGF0dGVybl9idWNrZXRfZmVhdHVyZXMnO1xuaW1wb3J0IGxvYWRHZW9tZXRyeSBmcm9tICcuLi9sb2FkX2dlb21ldHJ5JztcbmltcG9ydCBFdmFsdWF0aW9uUGFyYW1ldGVycyBmcm9tICcuLi8uLi9zdHlsZS9ldmFsdWF0aW9uX3BhcmFtZXRlcnMnO1xuXG5pbXBvcnQgdHlwZSB7XG4gICAgQnVja2V0LFxuICAgIEJ1Y2tldFBhcmFtZXRlcnMsXG4gICAgQnVja2V0RmVhdHVyZSxcbiAgICBJbmRleGVkRmVhdHVyZSxcbiAgICBQb3B1bGF0ZVBhcmFtZXRlcnNcbn0gZnJvbSAnLi4vYnVja2V0JztcbmltcG9ydCB0eXBlIEZpbGxTdHlsZUxheWVyIGZyb20gJy4uLy4uL3N0eWxlL3N0eWxlX2xheWVyL2ZpbGxfc3R5bGVfbGF5ZXInO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tICcuLi8uLi9nbC9jb250ZXh0JztcbmltcG9ydCB0eXBlIEluZGV4QnVmZmVyIGZyb20gJy4uLy4uL2dsL2luZGV4X2J1ZmZlcic7XG5pbXBvcnQgdHlwZSBWZXJ0ZXhCdWZmZXIgZnJvbSAnLi4vLi4vZ2wvdmVydGV4X2J1ZmZlcic7XG5pbXBvcnQgdHlwZSBQb2ludCBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcbmltcG9ydCB0eXBlIHtGZWF0dXJlU3RhdGVzfSBmcm9tICcuLi8uLi9zb3VyY2Uvc291cmNlX3N0YXRlJztcbmltcG9ydCB0eXBlIHtJbWFnZVBvc2l0aW9ufSBmcm9tICcuLi8uLi9yZW5kZXIvaW1hZ2VfYXRsYXMnO1xuXG5jbGFzcyBGaWxsQnVja2V0IGltcGxlbWVudHMgQnVja2V0IHtcbiAgICBpbmRleDogbnVtYmVyO1xuICAgIHpvb206IG51bWJlcjtcbiAgICBvdmVyc2NhbGluZzogbnVtYmVyO1xuICAgIGxheWVyczogQXJyYXk8RmlsbFN0eWxlTGF5ZXI+O1xuICAgIGxheWVySWRzOiBBcnJheTxzdHJpbmc+O1xuICAgIHN0YXRlRGVwZW5kZW50TGF5ZXJzOiBBcnJheTxGaWxsU3R5bGVMYXllcj47XG4gICAgc3RhdGVEZXBlbmRlbnRMYXllcklkczogQXJyYXk8c3RyaW5nPjtcblxuICAgIGxheW91dFZlcnRleEFycmF5OiBGaWxsTGF5b3V0QXJyYXk7XG4gICAgbGF5b3V0VmVydGV4QnVmZmVyOiBWZXJ0ZXhCdWZmZXI7XG5cbiAgICBpbmRleEFycmF5OiBUcmlhbmdsZUluZGV4QXJyYXk7XG4gICAgaW5kZXhCdWZmZXI6IEluZGV4QnVmZmVyO1xuXG4gICAgaW5kZXhBcnJheTI6IExpbmVJbmRleEFycmF5O1xuICAgIGluZGV4QnVmZmVyMjogSW5kZXhCdWZmZXI7XG5cbiAgICBoYXNQYXR0ZXJuOiBib29sZWFuO1xuICAgIHByb2dyYW1Db25maWd1cmF0aW9uczogUHJvZ3JhbUNvbmZpZ3VyYXRpb25TZXQ8RmlsbFN0eWxlTGF5ZXI+O1xuICAgIHNlZ21lbnRzOiBTZWdtZW50VmVjdG9yO1xuICAgIHNlZ21lbnRzMjogU2VnbWVudFZlY3RvcjtcbiAgICB1cGxvYWRlZDogYm9vbGVhbjtcbiAgICBmZWF0dXJlczogQXJyYXk8QnVja2V0RmVhdHVyZT47XG5cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOiBCdWNrZXRQYXJhbWV0ZXJzPEZpbGxTdHlsZUxheWVyPikge1xuICAgICAgICB0aGlzLnpvb20gPSBvcHRpb25zLnpvb207XG4gICAgICAgIHRoaXMub3ZlcnNjYWxpbmcgPSBvcHRpb25zLm92ZXJzY2FsaW5nO1xuICAgICAgICB0aGlzLmxheWVycyA9IG9wdGlvbnMubGF5ZXJzO1xuICAgICAgICB0aGlzLmxheWVySWRzID0gdGhpcy5sYXllcnMubWFwKGxheWVyID0+IGxheWVyLmlkKTtcbiAgICAgICAgdGhpcy5pbmRleCA9IG9wdGlvbnMuaW5kZXg7XG4gICAgICAgIHRoaXMuaGFzUGF0dGVybiA9IGZhbHNlO1xuXG4gICAgICAgIHRoaXMubGF5b3V0VmVydGV4QXJyYXkgPSBuZXcgRmlsbExheW91dEFycmF5KCk7XG4gICAgICAgIHRoaXMuaW5kZXhBcnJheSA9IG5ldyBUcmlhbmdsZUluZGV4QXJyYXkoKTtcbiAgICAgICAgdGhpcy5pbmRleEFycmF5MiA9IG5ldyBMaW5lSW5kZXhBcnJheSgpO1xuICAgICAgICB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucyA9IG5ldyBQcm9ncmFtQ29uZmlndXJhdGlvblNldChsYXlvdXRBdHRyaWJ1dGVzLCBvcHRpb25zLmxheWVycywgb3B0aW9ucy56b29tKTtcbiAgICAgICAgdGhpcy5zZWdtZW50cyA9IG5ldyBTZWdtZW50VmVjdG9yKCk7XG4gICAgICAgIHRoaXMuc2VnbWVudHMyID0gbmV3IFNlZ21lbnRWZWN0b3IoKTtcbiAgICAgICAgdGhpcy5zdGF0ZURlcGVuZGVudExheWVySWRzID0gdGhpcy5sYXllcnMuZmlsdGVyKChsKSA9PiBsLmlzU3RhdGVEZXBlbmRlbnQoKSkubWFwKChsKSA9PiBsLmlkKTtcblxuICAgIH1cblxuICAgIHBvcHVsYXRlKGZlYXR1cmVzOiBBcnJheTxJbmRleGVkRmVhdHVyZT4sIG9wdGlvbnM6IFBvcHVsYXRlUGFyYW1ldGVycykge1xuICAgICAgICB0aGlzLmZlYXR1cmVzID0gW107XG4gICAgICAgIHRoaXMuaGFzUGF0dGVybiA9IGhhc1BhdHRlcm4oJ2ZpbGwnLCB0aGlzLmxheWVycywgb3B0aW9ucyk7XG5cbiAgICAgICAgZm9yIChjb25zdCB7ZmVhdHVyZSwgaW5kZXgsIHNvdXJjZUxheWVySW5kZXh9IG9mIGZlYXR1cmVzKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMubGF5ZXJzWzBdLl9mZWF0dXJlRmlsdGVyKG5ldyBFdmFsdWF0aW9uUGFyYW1ldGVycyh0aGlzLnpvb20pLCBmZWF0dXJlKSkgY29udGludWU7XG5cbiAgICAgICAgICAgIGNvbnN0IGdlb21ldHJ5ID0gbG9hZEdlb21ldHJ5KGZlYXR1cmUpO1xuXG4gICAgICAgICAgICBjb25zdCBwYXR0ZXJuRmVhdHVyZTogQnVja2V0RmVhdHVyZSA9IHtcbiAgICAgICAgICAgICAgICBzb3VyY2VMYXllckluZGV4LFxuICAgICAgICAgICAgICAgIGluZGV4LFxuICAgICAgICAgICAgICAgIGdlb21ldHJ5LFxuICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6IGZlYXR1cmUucHJvcGVydGllcyxcbiAgICAgICAgICAgICAgICB0eXBlOiBmZWF0dXJlLnR5cGUsXG4gICAgICAgICAgICAgICAgcGF0dGVybnM6IHt9XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBpZiAodHlwZW9mIGZlYXR1cmUuaWQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgcGF0dGVybkZlYXR1cmUuaWQgPSBmZWF0dXJlLmlkO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5oYXNQYXR0ZXJuKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5mZWF0dXJlcy5wdXNoKGFkZFBhdHRlcm5EZXBlbmRlbmNpZXMoJ2ZpbGwnLCB0aGlzLmxheWVycywgcGF0dGVybkZlYXR1cmUsIHRoaXMuem9vbSwgb3B0aW9ucykpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEZlYXR1cmUocGF0dGVybkZlYXR1cmUsIGdlb21ldHJ5LCBpbmRleCwge30pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBvcHRpb25zLmZlYXR1cmVJbmRleC5pbnNlcnQoZmVhdHVyZSwgZ2VvbWV0cnksIGluZGV4LCBzb3VyY2VMYXllckluZGV4LCB0aGlzLmluZGV4KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHVwZGF0ZShzdGF0ZXM6IEZlYXR1cmVTdGF0ZXMsIHZ0TGF5ZXI6IFZlY3RvclRpbGVMYXllciwgaW1hZ2VQb3NpdGlvbnM6IHtbc3RyaW5nXTogSW1hZ2VQb3NpdGlvbn0pIHtcbiAgICAgICAgaWYgKCF0aGlzLnN0YXRlRGVwZW5kZW50TGF5ZXJzLmxlbmd0aCkgcmV0dXJuO1xuICAgICAgICB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucy51cGRhdGVQYWludEFycmF5cyhzdGF0ZXMsIHZ0TGF5ZXIsIHRoaXMuc3RhdGVEZXBlbmRlbnRMYXllcnMsIGltYWdlUG9zaXRpb25zKTtcbiAgICB9XG5cbiAgICBhZGRGZWF0dXJlcyhvcHRpb25zOiBQb3B1bGF0ZVBhcmFtZXRlcnMsIGltYWdlUG9zaXRpb25zOiB7W3N0cmluZ106IEltYWdlUG9zaXRpb259KSB7XG4gICAgICAgIGZvciAoY29uc3QgZmVhdHVyZSBvZiB0aGlzLmZlYXR1cmVzKSB7XG4gICAgICAgICAgICBjb25zdCB7Z2VvbWV0cnl9ID0gZmVhdHVyZTtcbiAgICAgICAgICAgIHRoaXMuYWRkRmVhdHVyZShmZWF0dXJlLCBnZW9tZXRyeSwgZmVhdHVyZS5pbmRleCwgaW1hZ2VQb3NpdGlvbnMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaXNFbXB0eSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGF5b3V0VmVydGV4QXJyYXkubGVuZ3RoID09PSAwO1xuICAgIH1cblxuICAgIHVwbG9hZFBlbmRpbmcoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhdGhpcy51cGxvYWRlZCB8fCB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucy5uZWVkc1VwbG9hZDtcbiAgICB9XG4gICAgdXBsb2FkKGNvbnRleHQ6IENvbnRleHQpIHtcbiAgICAgICAgaWYgKCF0aGlzLnVwbG9hZGVkKSB7XG4gICAgICAgICAgICB0aGlzLmxheW91dFZlcnRleEJ1ZmZlciA9IGNvbnRleHQuY3JlYXRlVmVydGV4QnVmZmVyKHRoaXMubGF5b3V0VmVydGV4QXJyYXksIGxheW91dEF0dHJpYnV0ZXMpO1xuICAgICAgICAgICAgdGhpcy5pbmRleEJ1ZmZlciA9IGNvbnRleHQuY3JlYXRlSW5kZXhCdWZmZXIodGhpcy5pbmRleEFycmF5KTtcbiAgICAgICAgICAgIHRoaXMuaW5kZXhCdWZmZXIyID0gY29udGV4dC5jcmVhdGVJbmRleEJ1ZmZlcih0aGlzLmluZGV4QXJyYXkyKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucy51cGxvYWQoY29udGV4dCk7XG4gICAgICAgIHRoaXMudXBsb2FkZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGlmICghdGhpcy5sYXlvdXRWZXJ0ZXhCdWZmZXIpIHJldHVybjtcbiAgICAgICAgdGhpcy5sYXlvdXRWZXJ0ZXhCdWZmZXIuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLmluZGV4QnVmZmVyLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5pbmRleEJ1ZmZlcjIuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucy5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMuc2VnbWVudHMuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLnNlZ21lbnRzMi5kZXN0cm95KCk7XG4gICAgfVxuXG4gICAgYWRkRmVhdHVyZShmZWF0dXJlOiBCdWNrZXRGZWF0dXJlLCBnZW9tZXRyeTogQXJyYXk8QXJyYXk8UG9pbnQ+PiwgaW5kZXg6IG51bWJlciwgaW1hZ2VQb3NpdGlvbnM6IHtbc3RyaW5nXTogSW1hZ2VQb3NpdGlvbn0pIHtcbiAgICAgICAgZm9yIChjb25zdCBwb2x5Z29uIG9mIGNsYXNzaWZ5UmluZ3MoZ2VvbWV0cnksIEVBUkNVVF9NQVhfUklOR1MpKSB7XG4gICAgICAgICAgICBsZXQgbnVtVmVydGljZXMgPSAwO1xuICAgICAgICAgICAgZm9yIChjb25zdCByaW5nIG9mIHBvbHlnb24pIHtcbiAgICAgICAgICAgICAgICBudW1WZXJ0aWNlcyArPSByaW5nLmxlbmd0aDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgdHJpYW5nbGVTZWdtZW50ID0gdGhpcy5zZWdtZW50cy5wcmVwYXJlU2VnbWVudChudW1WZXJ0aWNlcywgdGhpcy5sYXlvdXRWZXJ0ZXhBcnJheSwgdGhpcy5pbmRleEFycmF5KTtcbiAgICAgICAgICAgIGNvbnN0IHRyaWFuZ2xlSW5kZXggPSB0cmlhbmdsZVNlZ21lbnQudmVydGV4TGVuZ3RoO1xuXG4gICAgICAgICAgICBjb25zdCBmbGF0dGVuZWQgPSBbXTtcbiAgICAgICAgICAgIGNvbnN0IGhvbGVJbmRpY2VzID0gW107XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgcmluZyBvZiBwb2x5Z29uKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJpbmcubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChyaW5nICE9PSBwb2x5Z29uWzBdKSB7XG4gICAgICAgICAgICAgICAgICAgIGhvbGVJbmRpY2VzLnB1c2goZmxhdHRlbmVkLmxlbmd0aCAvIDIpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGxpbmVTZWdtZW50ID0gdGhpcy5zZWdtZW50czIucHJlcGFyZVNlZ21lbnQocmluZy5sZW5ndGgsIHRoaXMubGF5b3V0VmVydGV4QXJyYXksIHRoaXMuaW5kZXhBcnJheTIpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGxpbmVJbmRleCA9IGxpbmVTZWdtZW50LnZlcnRleExlbmd0aDtcblxuICAgICAgICAgICAgICAgIHRoaXMubGF5b3V0VmVydGV4QXJyYXkuZW1wbGFjZUJhY2socmluZ1swXS54LCByaW5nWzBdLnkpO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5kZXhBcnJheTIuZW1wbGFjZUJhY2sobGluZUluZGV4ICsgcmluZy5sZW5ndGggLSAxLCBsaW5lSW5kZXgpO1xuICAgICAgICAgICAgICAgIGZsYXR0ZW5lZC5wdXNoKHJpbmdbMF0ueCk7XG4gICAgICAgICAgICAgICAgZmxhdHRlbmVkLnB1c2gocmluZ1swXS55KTtcblxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgcmluZy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxheW91dFZlcnRleEFycmF5LmVtcGxhY2VCYWNrKHJpbmdbaV0ueCwgcmluZ1tpXS55KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmRleEFycmF5Mi5lbXBsYWNlQmFjayhsaW5lSW5kZXggKyBpIC0gMSwgbGluZUluZGV4ICsgaSk7XG4gICAgICAgICAgICAgICAgICAgIGZsYXR0ZW5lZC5wdXNoKHJpbmdbaV0ueCk7XG4gICAgICAgICAgICAgICAgICAgIGZsYXR0ZW5lZC5wdXNoKHJpbmdbaV0ueSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGluZVNlZ21lbnQudmVydGV4TGVuZ3RoICs9IHJpbmcubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGxpbmVTZWdtZW50LnByaW1pdGl2ZUxlbmd0aCArPSByaW5nLmxlbmd0aDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgaW5kaWNlcyA9IGVhcmN1dChmbGF0dGVuZWQsIGhvbGVJbmRpY2VzKTtcbiAgICAgICAgICAgIGFzc2VydChpbmRpY2VzLmxlbmd0aCAlIDMgPT09IDApO1xuXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGluZGljZXMubGVuZ3RoOyBpICs9IDMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmluZGV4QXJyYXkuZW1wbGFjZUJhY2soXG4gICAgICAgICAgICAgICAgICAgIHRyaWFuZ2xlSW5kZXggKyBpbmRpY2VzW2ldLFxuICAgICAgICAgICAgICAgICAgICB0cmlhbmdsZUluZGV4ICsgaW5kaWNlc1tpICsgMV0sXG4gICAgICAgICAgICAgICAgICAgIHRyaWFuZ2xlSW5kZXggKyBpbmRpY2VzW2kgKyAyXSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRyaWFuZ2xlU2VnbWVudC52ZXJ0ZXhMZW5ndGggKz0gbnVtVmVydGljZXM7XG4gICAgICAgICAgICB0cmlhbmdsZVNlZ21lbnQucHJpbWl0aXZlTGVuZ3RoICs9IGluZGljZXMubGVuZ3RoIC8gMztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucy5wb3B1bGF0ZVBhaW50QXJyYXlzKHRoaXMubGF5b3V0VmVydGV4QXJyYXkubGVuZ3RoLCBmZWF0dXJlLCBpbmRleCwgaW1hZ2VQb3NpdGlvbnMpO1xuICAgIH1cbn1cblxucmVnaXN0ZXIoJ0ZpbGxCdWNrZXQnLCBGaWxsQnVja2V0LCB7b21pdDogWydsYXllcnMnLCAnZmVhdHVyZXMnXX0pO1xuXG5leHBvcnQgZGVmYXVsdCBGaWxsQnVja2V0O1xuIiwiLy8gVGhpcyBmaWxlIGlzIGdlbmVyYXRlZC4gRWRpdCBidWlsZC9nZW5lcmF0ZS1zdHlsZS1jb2RlLmpzLCB0aGVuIHJ1biBgeWFybiBydW4gY29kZWdlbmAuXG4vLyBAZmxvd1xuLyogZXNsaW50LWRpc2FibGUgKi9cblxuaW1wb3J0IHN0eWxlU3BlYyBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL3JlZmVyZW5jZS9sYXRlc3QnO1xuXG5pbXBvcnQge1xuICAgIFByb3BlcnRpZXMsXG4gICAgRGF0YUNvbnN0YW50UHJvcGVydHksXG4gICAgRGF0YURyaXZlblByb3BlcnR5LFxuICAgIENyb3NzRmFkZWREYXRhRHJpdmVuUHJvcGVydHksXG4gICAgQ3Jvc3NGYWRlZFByb3BlcnR5LFxuICAgIENvbG9yUmFtcFByb3BlcnR5XG59IGZyb20gJy4uL3Byb3BlcnRpZXMnO1xuXG5pbXBvcnQgdHlwZSBDb2xvciBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL3V0aWwvY29sb3InO1xuXG5pbXBvcnQgdHlwZSBGb3JtYXR0ZWQgZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uL3R5cGVzL2Zvcm1hdHRlZCc7XG5cblxuZXhwb3J0IHR5cGUgUGFpbnRQcm9wcyA9IHt8XG4gICAgXCJmaWxsLWFudGlhbGlhc1wiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxib29sZWFuPixcbiAgICBcImZpbGwtb3BhY2l0eVwiOiBEYXRhRHJpdmVuUHJvcGVydHk8bnVtYmVyPixcbiAgICBcImZpbGwtY29sb3JcIjogRGF0YURyaXZlblByb3BlcnR5PENvbG9yPixcbiAgICBcImZpbGwtb3V0bGluZS1jb2xvclwiOiBEYXRhRHJpdmVuUHJvcGVydHk8Q29sb3I+LFxuICAgIFwiZmlsbC10cmFuc2xhdGVcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8W251bWJlciwgbnVtYmVyXT4sXG4gICAgXCJmaWxsLXRyYW5zbGF0ZS1hbmNob3JcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8XCJtYXBcIiB8IFwidmlld3BvcnRcIj4sXG4gICAgXCJmaWxsLXBhdHRlcm5cIjogQ3Jvc3NGYWRlZERhdGFEcml2ZW5Qcm9wZXJ0eTxzdHJpbmc+LFxufH07XG5cbmNvbnN0IHBhaW50OiBQcm9wZXJ0aWVzPFBhaW50UHJvcHM+ID0gbmV3IFByb3BlcnRpZXMoe1xuICAgIFwiZmlsbC1hbnRpYWxpYXNcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2ZpbGxcIl1bXCJmaWxsLWFudGlhbGlhc1wiXSksXG4gICAgXCJmaWxsLW9wYWNpdHlcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9maWxsXCJdW1wiZmlsbC1vcGFjaXR5XCJdKSxcbiAgICBcImZpbGwtY29sb3JcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9maWxsXCJdW1wiZmlsbC1jb2xvclwiXSksXG4gICAgXCJmaWxsLW91dGxpbmUtY29sb3JcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9maWxsXCJdW1wiZmlsbC1vdXRsaW5lLWNvbG9yXCJdKSxcbiAgICBcImZpbGwtdHJhbnNsYXRlXCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9maWxsXCJdW1wiZmlsbC10cmFuc2xhdGVcIl0pLFxuICAgIFwiZmlsbC10cmFuc2xhdGUtYW5jaG9yXCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9maWxsXCJdW1wiZmlsbC10cmFuc2xhdGUtYW5jaG9yXCJdKSxcbiAgICBcImZpbGwtcGF0dGVyblwiOiBuZXcgQ3Jvc3NGYWRlZERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9maWxsXCJdW1wiZmlsbC1wYXR0ZXJuXCJdKSxcbn0pO1xuXG4vLyBOb3RlOiB3aXRob3V0IGFkZGluZyB0aGUgZXhwbGljaXQgdHlwZSBhbm5vdGF0aW9uLCBGbG93IGluZmVycyB3ZWFrZXIgdHlwZXNcbi8vIGZvciB0aGVzZSBvYmplY3RzIGZyb20gdGhlaXIgdXNlIGluIHRoZSBjb25zdHJ1Y3RvciB0byBTdHlsZUxheWVyLCBhc1xuLy8ge2xheW91dD86IFByb3BlcnRpZXM8Li4uPiwgcGFpbnQ6IFByb3BlcnRpZXM8Li4uPn1cbmV4cG9ydCBkZWZhdWx0ICh7IHBhaW50IH06ICRFeGFjdDx7XG4gIHBhaW50OiBQcm9wZXJ0aWVzPFBhaW50UHJvcHM+XG59Pik7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgU3R5bGVMYXllciBmcm9tICcuLi9zdHlsZV9sYXllcic7XG5cbmltcG9ydCBGaWxsQnVja2V0IGZyb20gJy4uLy4uL2RhdGEvYnVja2V0L2ZpbGxfYnVja2V0JztcbmltcG9ydCB7IHBvbHlnb25JbnRlcnNlY3RzTXVsdGlQb2x5Z29uIH0gZnJvbSAnLi4vLi4vdXRpbC9pbnRlcnNlY3Rpb25fdGVzdHMnO1xuaW1wb3J0IHsgdHJhbnNsYXRlRGlzdGFuY2UsIHRyYW5zbGF0ZSB9IGZyb20gJy4uL3F1ZXJ5X3V0aWxzJztcbmltcG9ydCBwcm9wZXJ0aWVzIGZyb20gJy4vZmlsbF9zdHlsZV9sYXllcl9wcm9wZXJ0aWVzJztcbmltcG9ydCB7IFRyYW5zaXRpb25hYmxlLCBUcmFuc2l0aW9uaW5nLCBQb3NzaWJseUV2YWx1YXRlZCB9IGZyb20gJy4uL3Byb3BlcnRpZXMnO1xuXG5pbXBvcnQgdHlwZSB7IEZlYXR1cmVTdGF0ZSB9IGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvZXhwcmVzc2lvbic7XG5pbXBvcnQgdHlwZSB7QnVja2V0UGFyYW1ldGVyc30gZnJvbSAnLi4vLi4vZGF0YS9idWNrZXQnO1xuaW1wb3J0IHR5cGUgUG9pbnQgZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XG5pbXBvcnQgdHlwZSB7UGFpbnRQcm9wc30gZnJvbSAnLi9maWxsX3N0eWxlX2xheWVyX3Byb3BlcnRpZXMnO1xuaW1wb3J0IHR5cGUgRXZhbHVhdGlvblBhcmFtZXRlcnMgZnJvbSAnLi4vZXZhbHVhdGlvbl9wYXJhbWV0ZXJzJztcbmltcG9ydCB0eXBlIFRyYW5zZm9ybSBmcm9tICcuLi8uLi9nZW8vdHJhbnNmb3JtJztcbmltcG9ydCB0eXBlIHtMYXllclNwZWNpZmljYXRpb259IGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvdHlwZXMnO1xuXG5jbGFzcyBGaWxsU3R5bGVMYXllciBleHRlbmRzIFN0eWxlTGF5ZXIge1xuICAgIF90cmFuc2l0aW9uYWJsZVBhaW50OiBUcmFuc2l0aW9uYWJsZTxQYWludFByb3BzPjtcbiAgICBfdHJhbnNpdGlvbmluZ1BhaW50OiBUcmFuc2l0aW9uaW5nPFBhaW50UHJvcHM+O1xuICAgIHBhaW50OiBQb3NzaWJseUV2YWx1YXRlZDxQYWludFByb3BzPjtcblxuICAgIGNvbnN0cnVjdG9yKGxheWVyOiBMYXllclNwZWNpZmljYXRpb24pIHtcbiAgICAgICAgc3VwZXIobGF5ZXIsIHByb3BlcnRpZXMpO1xuICAgIH1cblxuICAgIHJlY2FsY3VsYXRlKHBhcmFtZXRlcnM6IEV2YWx1YXRpb25QYXJhbWV0ZXJzKSB7XG4gICAgICAgIHN1cGVyLnJlY2FsY3VsYXRlKHBhcmFtZXRlcnMpO1xuXG4gICAgICAgIGNvbnN0IG91dGxpbmVDb2xvciA9IHRoaXMucGFpbnQuX3ZhbHVlc1snZmlsbC1vdXRsaW5lLWNvbG9yJ107XG4gICAgICAgIGlmIChvdXRsaW5lQ29sb3IudmFsdWUua2luZCA9PT0gJ2NvbnN0YW50JyAmJiBvdXRsaW5lQ29sb3IudmFsdWUudmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5wYWludC5fdmFsdWVzWydmaWxsLW91dGxpbmUtY29sb3InXSA9IHRoaXMucGFpbnQuX3ZhbHVlc1snZmlsbC1jb2xvciddO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY3JlYXRlQnVja2V0KHBhcmFtZXRlcnM6IEJ1Y2tldFBhcmFtZXRlcnM8Kj4pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBGaWxsQnVja2V0KHBhcmFtZXRlcnMpO1xuICAgIH1cblxuICAgIHF1ZXJ5UmFkaXVzKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0cmFuc2xhdGVEaXN0YW5jZSh0aGlzLnBhaW50LmdldCgnZmlsbC10cmFuc2xhdGUnKSk7XG4gICAgfVxuXG4gICAgcXVlcnlJbnRlcnNlY3RzRmVhdHVyZShxdWVyeUdlb21ldHJ5OiBBcnJheTxQb2ludD4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlOiBWZWN0b3JUaWxlRmVhdHVyZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVTdGF0ZTogRmVhdHVyZVN0YXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VvbWV0cnk6IEFycmF5PEFycmF5PFBvaW50Pj4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICB6b29tOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm06IFRyYW5zZm9ybSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsc1RvVGlsZVVuaXRzOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgdHJhbnNsYXRlZFBvbHlnb24gPSB0cmFuc2xhdGUocXVlcnlHZW9tZXRyeSxcbiAgICAgICAgICAgIHRoaXMucGFpbnQuZ2V0KCdmaWxsLXRyYW5zbGF0ZScpLFxuICAgICAgICAgICAgdGhpcy5wYWludC5nZXQoJ2ZpbGwtdHJhbnNsYXRlLWFuY2hvcicpLFxuICAgICAgICAgICAgdHJhbnNmb3JtLmFuZ2xlLCBwaXhlbHNUb1RpbGVVbml0cyk7XG4gICAgICAgIHJldHVybiBwb2x5Z29uSW50ZXJzZWN0c011bHRpUG9seWdvbih0cmFuc2xhdGVkUG9seWdvbiwgZ2VvbWV0cnkpO1xuICAgIH1cblxuICAgIGlzVGlsZUNsaXBwZWQoKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgRmlsbFN0eWxlTGF5ZXI7XG4iLCIvLyBAZmxvd1xuaW1wb3J0IHsgY3JlYXRlTGF5b3V0IH0gZnJvbSAnLi4vLi4vdXRpbC9zdHJ1Y3RfYXJyYXknO1xuXG5jb25zdCBsYXlvdXQgPSBjcmVhdGVMYXlvdXQoW1xuICAgIHtuYW1lOiAnYV9wb3MnLCAgICAgICAgICBjb21wb25lbnRzOiAyLCB0eXBlOiAnSW50MTYnfSxcbiAgICB7bmFtZTogJ2Ffbm9ybWFsX2VkJywgICAgY29tcG9uZW50czogNCwgdHlwZTogJ0ludDE2J30sXG5dLCA0KTtcblxuZXhwb3J0IGRlZmF1bHQgbGF5b3V0O1xuZXhwb3J0IGNvbnN0IHttZW1iZXJzLCBzaXplLCBhbGlnbm1lbnR9ID0gbGF5b3V0O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgUG9pbnQgPSByZXF1aXJlKCdAbWFwYm94L3BvaW50LWdlb21ldHJ5Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gVmVjdG9yVGlsZUZlYXR1cmU7XG5cbmZ1bmN0aW9uIFZlY3RvclRpbGVGZWF0dXJlKHBiZiwgZW5kLCBleHRlbnQsIGtleXMsIHZhbHVlcykge1xuICAgIC8vIFB1YmxpY1xuICAgIHRoaXMucHJvcGVydGllcyA9IHt9O1xuICAgIHRoaXMuZXh0ZW50ID0gZXh0ZW50O1xuICAgIHRoaXMudHlwZSA9IDA7XG5cbiAgICAvLyBQcml2YXRlXG4gICAgdGhpcy5fcGJmID0gcGJmO1xuICAgIHRoaXMuX2dlb21ldHJ5ID0gLTE7XG4gICAgdGhpcy5fa2V5cyA9IGtleXM7XG4gICAgdGhpcy5fdmFsdWVzID0gdmFsdWVzO1xuXG4gICAgcGJmLnJlYWRGaWVsZHMocmVhZEZlYXR1cmUsIHRoaXMsIGVuZCk7XG59XG5cbmZ1bmN0aW9uIHJlYWRGZWF0dXJlKHRhZywgZmVhdHVyZSwgcGJmKSB7XG4gICAgaWYgKHRhZyA9PSAxKSBmZWF0dXJlLmlkID0gcGJmLnJlYWRWYXJpbnQoKTtcbiAgICBlbHNlIGlmICh0YWcgPT0gMikgcmVhZFRhZyhwYmYsIGZlYXR1cmUpO1xuICAgIGVsc2UgaWYgKHRhZyA9PSAzKSBmZWF0dXJlLnR5cGUgPSBwYmYucmVhZFZhcmludCgpO1xuICAgIGVsc2UgaWYgKHRhZyA9PSA0KSBmZWF0dXJlLl9nZW9tZXRyeSA9IHBiZi5wb3M7XG59XG5cbmZ1bmN0aW9uIHJlYWRUYWcocGJmLCBmZWF0dXJlKSB7XG4gICAgdmFyIGVuZCA9IHBiZi5yZWFkVmFyaW50KCkgKyBwYmYucG9zO1xuXG4gICAgd2hpbGUgKHBiZi5wb3MgPCBlbmQpIHtcbiAgICAgICAgdmFyIGtleSA9IGZlYXR1cmUuX2tleXNbcGJmLnJlYWRWYXJpbnQoKV0sXG4gICAgICAgICAgICB2YWx1ZSA9IGZlYXR1cmUuX3ZhbHVlc1twYmYucmVhZFZhcmludCgpXTtcbiAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzW2tleV0gPSB2YWx1ZTtcbiAgICB9XG59XG5cblZlY3RvclRpbGVGZWF0dXJlLnR5cGVzID0gWydVbmtub3duJywgJ1BvaW50JywgJ0xpbmVTdHJpbmcnLCAnUG9seWdvbiddO1xuXG5WZWN0b3JUaWxlRmVhdHVyZS5wcm90b3R5cGUubG9hZEdlb21ldHJ5ID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHBiZiA9IHRoaXMuX3BiZjtcbiAgICBwYmYucG9zID0gdGhpcy5fZ2VvbWV0cnk7XG5cbiAgICB2YXIgZW5kID0gcGJmLnJlYWRWYXJpbnQoKSArIHBiZi5wb3MsXG4gICAgICAgIGNtZCA9IDEsXG4gICAgICAgIGxlbmd0aCA9IDAsXG4gICAgICAgIHggPSAwLFxuICAgICAgICB5ID0gMCxcbiAgICAgICAgbGluZXMgPSBbXSxcbiAgICAgICAgbGluZTtcblxuICAgIHdoaWxlIChwYmYucG9zIDwgZW5kKSB7XG4gICAgICAgIGlmIChsZW5ndGggPD0gMCkge1xuICAgICAgICAgICAgdmFyIGNtZExlbiA9IHBiZi5yZWFkVmFyaW50KCk7XG4gICAgICAgICAgICBjbWQgPSBjbWRMZW4gJiAweDc7XG4gICAgICAgICAgICBsZW5ndGggPSBjbWRMZW4gPj4gMztcbiAgICAgICAgfVxuXG4gICAgICAgIGxlbmd0aC0tO1xuXG4gICAgICAgIGlmIChjbWQgPT09IDEgfHwgY21kID09PSAyKSB7XG4gICAgICAgICAgICB4ICs9IHBiZi5yZWFkU1ZhcmludCgpO1xuICAgICAgICAgICAgeSArPSBwYmYucmVhZFNWYXJpbnQoKTtcblxuICAgICAgICAgICAgaWYgKGNtZCA9PT0gMSkgeyAvLyBtb3ZlVG9cbiAgICAgICAgICAgICAgICBpZiAobGluZSkgbGluZXMucHVzaChsaW5lKTtcbiAgICAgICAgICAgICAgICBsaW5lID0gW107XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxpbmUucHVzaChuZXcgUG9pbnQoeCwgeSkpO1xuXG4gICAgICAgIH0gZWxzZSBpZiAoY21kID09PSA3KSB7XG5cbiAgICAgICAgICAgIC8vIFdvcmthcm91bmQgZm9yIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvbWFwbmlrLXZlY3Rvci10aWxlL2lzc3Vlcy85MFxuICAgICAgICAgICAgaWYgKGxpbmUpIHtcbiAgICAgICAgICAgICAgICBsaW5lLnB1c2gobGluZVswXS5jbG9uZSgpKTsgLy8gY2xvc2VQb2x5Z29uXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigndW5rbm93biBjb21tYW5kICcgKyBjbWQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGxpbmUpIGxpbmVzLnB1c2gobGluZSk7XG5cbiAgICByZXR1cm4gbGluZXM7XG59O1xuXG5WZWN0b3JUaWxlRmVhdHVyZS5wcm90b3R5cGUuYmJveCA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBwYmYgPSB0aGlzLl9wYmY7XG4gICAgcGJmLnBvcyA9IHRoaXMuX2dlb21ldHJ5O1xuXG4gICAgdmFyIGVuZCA9IHBiZi5yZWFkVmFyaW50KCkgKyBwYmYucG9zLFxuICAgICAgICBjbWQgPSAxLFxuICAgICAgICBsZW5ndGggPSAwLFxuICAgICAgICB4ID0gMCxcbiAgICAgICAgeSA9IDAsXG4gICAgICAgIHgxID0gSW5maW5pdHksXG4gICAgICAgIHgyID0gLUluZmluaXR5LFxuICAgICAgICB5MSA9IEluZmluaXR5LFxuICAgICAgICB5MiA9IC1JbmZpbml0eTtcblxuICAgIHdoaWxlIChwYmYucG9zIDwgZW5kKSB7XG4gICAgICAgIGlmIChsZW5ndGggPD0gMCkge1xuICAgICAgICAgICAgdmFyIGNtZExlbiA9IHBiZi5yZWFkVmFyaW50KCk7XG4gICAgICAgICAgICBjbWQgPSBjbWRMZW4gJiAweDc7XG4gICAgICAgICAgICBsZW5ndGggPSBjbWRMZW4gPj4gMztcbiAgICAgICAgfVxuXG4gICAgICAgIGxlbmd0aC0tO1xuXG4gICAgICAgIGlmIChjbWQgPT09IDEgfHwgY21kID09PSAyKSB7XG4gICAgICAgICAgICB4ICs9IHBiZi5yZWFkU1ZhcmludCgpO1xuICAgICAgICAgICAgeSArPSBwYmYucmVhZFNWYXJpbnQoKTtcbiAgICAgICAgICAgIGlmICh4IDwgeDEpIHgxID0geDtcbiAgICAgICAgICAgIGlmICh4ID4geDIpIHgyID0geDtcbiAgICAgICAgICAgIGlmICh5IDwgeTEpIHkxID0geTtcbiAgICAgICAgICAgIGlmICh5ID4geTIpIHkyID0geTtcblxuICAgICAgICB9IGVsc2UgaWYgKGNtZCAhPT0gNykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bmtub3duIGNvbW1hbmQgJyArIGNtZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gW3gxLCB5MSwgeDIsIHkyXTtcbn07XG5cblZlY3RvclRpbGVGZWF0dXJlLnByb3RvdHlwZS50b0dlb0pTT04gPSBmdW5jdGlvbih4LCB5LCB6KSB7XG4gICAgdmFyIHNpemUgPSB0aGlzLmV4dGVudCAqIE1hdGgucG93KDIsIHopLFxuICAgICAgICB4MCA9IHRoaXMuZXh0ZW50ICogeCxcbiAgICAgICAgeTAgPSB0aGlzLmV4dGVudCAqIHksXG4gICAgICAgIGNvb3JkcyA9IHRoaXMubG9hZEdlb21ldHJ5KCksXG4gICAgICAgIHR5cGUgPSBWZWN0b3JUaWxlRmVhdHVyZS50eXBlc1t0aGlzLnR5cGVdLFxuICAgICAgICBpLCBqO1xuXG4gICAgZnVuY3Rpb24gcHJvamVjdChsaW5lKSB7XG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgbGluZS5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgdmFyIHAgPSBsaW5lW2pdLCB5MiA9IDE4MCAtIChwLnkgKyB5MCkgKiAzNjAgLyBzaXplO1xuICAgICAgICAgICAgbGluZVtqXSA9IFtcbiAgICAgICAgICAgICAgICAocC54ICsgeDApICogMzYwIC8gc2l6ZSAtIDE4MCxcbiAgICAgICAgICAgICAgICAzNjAgLyBNYXRoLlBJICogTWF0aC5hdGFuKE1hdGguZXhwKHkyICogTWF0aC5QSSAvIDE4MCkpIC0gOTBcbiAgICAgICAgICAgIF07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzd2l0Y2ggKHRoaXMudHlwZSkge1xuICAgIGNhc2UgMTpcbiAgICAgICAgdmFyIHBvaW50cyA9IFtdO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29vcmRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBwb2ludHNbaV0gPSBjb29yZHNbaV1bMF07XG4gICAgICAgIH1cbiAgICAgICAgY29vcmRzID0gcG9pbnRzO1xuICAgICAgICBwcm9qZWN0KGNvb3Jkcyk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAyOlxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29vcmRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBwcm9qZWN0KGNvb3Jkc1tpXSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIDM6XG4gICAgICAgIGNvb3JkcyA9IGNsYXNzaWZ5UmluZ3MoY29vcmRzKTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvb3Jkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGNvb3Jkc1tpXS5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIHByb2plY3QoY29vcmRzW2ldW2pdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICBpZiAoY29vcmRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBjb29yZHMgPSBjb29yZHNbMF07XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdHlwZSA9ICdNdWx0aScgKyB0eXBlO1xuICAgIH1cblxuICAgIHZhciByZXN1bHQgPSB7XG4gICAgICAgIHR5cGU6IFwiRmVhdHVyZVwiLFxuICAgICAgICBnZW9tZXRyeToge1xuICAgICAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgICAgIGNvb3JkaW5hdGVzOiBjb29yZHNcbiAgICAgICAgfSxcbiAgICAgICAgcHJvcGVydGllczogdGhpcy5wcm9wZXJ0aWVzXG4gICAgfTtcblxuICAgIGlmICgnaWQnIGluIHRoaXMpIHtcbiAgICAgICAgcmVzdWx0LmlkID0gdGhpcy5pZDtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xufTtcblxuLy8gY2xhc3NpZmllcyBhbiBhcnJheSBvZiByaW5ncyBpbnRvIHBvbHlnb25zIHdpdGggb3V0ZXIgcmluZ3MgYW5kIGhvbGVzXG5cbmZ1bmN0aW9uIGNsYXNzaWZ5UmluZ3MocmluZ3MpIHtcbiAgICB2YXIgbGVuID0gcmluZ3MubGVuZ3RoO1xuXG4gICAgaWYgKGxlbiA8PSAxKSByZXR1cm4gW3JpbmdzXTtcblxuICAgIHZhciBwb2x5Z29ucyA9IFtdLFxuICAgICAgICBwb2x5Z29uLFxuICAgICAgICBjY3c7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIHZhciBhcmVhID0gc2lnbmVkQXJlYShyaW5nc1tpXSk7XG4gICAgICAgIGlmIChhcmVhID09PSAwKSBjb250aW51ZTtcblxuICAgICAgICBpZiAoY2N3ID09PSB1bmRlZmluZWQpIGNjdyA9IGFyZWEgPCAwO1xuXG4gICAgICAgIGlmIChjY3cgPT09IGFyZWEgPCAwKSB7XG4gICAgICAgICAgICBpZiAocG9seWdvbikgcG9seWdvbnMucHVzaChwb2x5Z29uKTtcbiAgICAgICAgICAgIHBvbHlnb24gPSBbcmluZ3NbaV1dO1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwb2x5Z29uLnB1c2gocmluZ3NbaV0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChwb2x5Z29uKSBwb2x5Z29ucy5wdXNoKHBvbHlnb24pO1xuXG4gICAgcmV0dXJuIHBvbHlnb25zO1xufVxuXG5mdW5jdGlvbiBzaWduZWRBcmVhKHJpbmcpIHtcbiAgICB2YXIgc3VtID0gMDtcbiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gcmluZy5sZW5ndGgsIGogPSBsZW4gLSAxLCBwMSwgcDI7IGkgPCBsZW47IGogPSBpKyspIHtcbiAgICAgICAgcDEgPSByaW5nW2ldO1xuICAgICAgICBwMiA9IHJpbmdbal07XG4gICAgICAgIHN1bSArPSAocDIueCAtIHAxLngpICogKHAxLnkgKyBwMi55KTtcbiAgICB9XG4gICAgcmV0dXJuIHN1bTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFZlY3RvclRpbGVGZWF0dXJlID0gcmVxdWlyZSgnLi92ZWN0b3J0aWxlZmVhdHVyZS5qcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFZlY3RvclRpbGVMYXllcjtcblxuZnVuY3Rpb24gVmVjdG9yVGlsZUxheWVyKHBiZiwgZW5kKSB7XG4gICAgLy8gUHVibGljXG4gICAgdGhpcy52ZXJzaW9uID0gMTtcbiAgICB0aGlzLm5hbWUgPSBudWxsO1xuICAgIHRoaXMuZXh0ZW50ID0gNDA5NjtcbiAgICB0aGlzLmxlbmd0aCA9IDA7XG5cbiAgICAvLyBQcml2YXRlXG4gICAgdGhpcy5fcGJmID0gcGJmO1xuICAgIHRoaXMuX2tleXMgPSBbXTtcbiAgICB0aGlzLl92YWx1ZXMgPSBbXTtcbiAgICB0aGlzLl9mZWF0dXJlcyA9IFtdO1xuXG4gICAgcGJmLnJlYWRGaWVsZHMocmVhZExheWVyLCB0aGlzLCBlbmQpO1xuXG4gICAgdGhpcy5sZW5ndGggPSB0aGlzLl9mZWF0dXJlcy5sZW5ndGg7XG59XG5cbmZ1bmN0aW9uIHJlYWRMYXllcih0YWcsIGxheWVyLCBwYmYpIHtcbiAgICBpZiAodGFnID09PSAxNSkgbGF5ZXIudmVyc2lvbiA9IHBiZi5yZWFkVmFyaW50KCk7XG4gICAgZWxzZSBpZiAodGFnID09PSAxKSBsYXllci5uYW1lID0gcGJmLnJlYWRTdHJpbmcoKTtcbiAgICBlbHNlIGlmICh0YWcgPT09IDUpIGxheWVyLmV4dGVudCA9IHBiZi5yZWFkVmFyaW50KCk7XG4gICAgZWxzZSBpZiAodGFnID09PSAyKSBsYXllci5fZmVhdHVyZXMucHVzaChwYmYucG9zKTtcbiAgICBlbHNlIGlmICh0YWcgPT09IDMpIGxheWVyLl9rZXlzLnB1c2gocGJmLnJlYWRTdHJpbmcoKSk7XG4gICAgZWxzZSBpZiAodGFnID09PSA0KSBsYXllci5fdmFsdWVzLnB1c2gocmVhZFZhbHVlTWVzc2FnZShwYmYpKTtcbn1cblxuZnVuY3Rpb24gcmVhZFZhbHVlTWVzc2FnZShwYmYpIHtcbiAgICB2YXIgdmFsdWUgPSBudWxsLFxuICAgICAgICBlbmQgPSBwYmYucmVhZFZhcmludCgpICsgcGJmLnBvcztcblxuICAgIHdoaWxlIChwYmYucG9zIDwgZW5kKSB7XG4gICAgICAgIHZhciB0YWcgPSBwYmYucmVhZFZhcmludCgpID4+IDM7XG5cbiAgICAgICAgdmFsdWUgPSB0YWcgPT09IDEgPyBwYmYucmVhZFN0cmluZygpIDpcbiAgICAgICAgICAgIHRhZyA9PT0gMiA/IHBiZi5yZWFkRmxvYXQoKSA6XG4gICAgICAgICAgICB0YWcgPT09IDMgPyBwYmYucmVhZERvdWJsZSgpIDpcbiAgICAgICAgICAgIHRhZyA9PT0gNCA/IHBiZi5yZWFkVmFyaW50NjQoKSA6XG4gICAgICAgICAgICB0YWcgPT09IDUgPyBwYmYucmVhZFZhcmludCgpIDpcbiAgICAgICAgICAgIHRhZyA9PT0gNiA/IHBiZi5yZWFkU1ZhcmludCgpIDpcbiAgICAgICAgICAgIHRhZyA9PT0gNyA/IHBiZi5yZWFkQm9vbGVhbigpIDogbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWU7XG59XG5cbi8vIHJldHVybiBmZWF0dXJlIGBpYCBmcm9tIHRoaXMgbGF5ZXIgYXMgYSBgVmVjdG9yVGlsZUZlYXR1cmVgXG5WZWN0b3JUaWxlTGF5ZXIucHJvdG90eXBlLmZlYXR1cmUgPSBmdW5jdGlvbihpKSB7XG4gICAgaWYgKGkgPCAwIHx8IGkgPj0gdGhpcy5fZmVhdHVyZXMubGVuZ3RoKSB0aHJvdyBuZXcgRXJyb3IoJ2ZlYXR1cmUgaW5kZXggb3V0IG9mIGJvdW5kcycpO1xuXG4gICAgdGhpcy5fcGJmLnBvcyA9IHRoaXMuX2ZlYXR1cmVzW2ldO1xuXG4gICAgdmFyIGVuZCA9IHRoaXMuX3BiZi5yZWFkVmFyaW50KCkgKyB0aGlzLl9wYmYucG9zO1xuICAgIHJldHVybiBuZXcgVmVjdG9yVGlsZUZlYXR1cmUodGhpcy5fcGJmLCBlbmQsIHRoaXMuZXh0ZW50LCB0aGlzLl9rZXlzLCB0aGlzLl92YWx1ZXMpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFZlY3RvclRpbGVMYXllciA9IHJlcXVpcmUoJy4vdmVjdG9ydGlsZWxheWVyJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gVmVjdG9yVGlsZTtcblxuZnVuY3Rpb24gVmVjdG9yVGlsZShwYmYsIGVuZCkge1xuICAgIHRoaXMubGF5ZXJzID0gcGJmLnJlYWRGaWVsZHMocmVhZFRpbGUsIHt9LCBlbmQpO1xufVxuXG5mdW5jdGlvbiByZWFkVGlsZSh0YWcsIGxheWVycywgcGJmKSB7XG4gICAgaWYgKHRhZyA9PT0gMykge1xuICAgICAgICB2YXIgbGF5ZXIgPSBuZXcgVmVjdG9yVGlsZUxheWVyKHBiZiwgcGJmLnJlYWRWYXJpbnQoKSArIHBiZi5wb3MpO1xuICAgICAgICBpZiAobGF5ZXIubGVuZ3RoKSBsYXllcnNbbGF5ZXIubmFtZV0gPSBsYXllcjtcbiAgICB9XG59XG5cbiIsIm1vZHVsZS5leHBvcnRzLlZlY3RvclRpbGUgPSByZXF1aXJlKCcuL2xpYi92ZWN0b3J0aWxlLmpzJyk7XG5tb2R1bGUuZXhwb3J0cy5WZWN0b3JUaWxlRmVhdHVyZSA9IHJlcXVpcmUoJy4vbGliL3ZlY3RvcnRpbGVmZWF0dXJlLmpzJyk7XG5tb2R1bGUuZXhwb3J0cy5WZWN0b3JUaWxlTGF5ZXIgPSByZXF1aXJlKCcuL2xpYi92ZWN0b3J0aWxlbGF5ZXIuanMnKTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7IEZpbGxFeHRydXNpb25MYXlvdXRBcnJheSB9IGZyb20gJy4uL2FycmF5X3R5cGVzJztcblxuaW1wb3J0IHsgbWVtYmVycyBhcyBsYXlvdXRBdHRyaWJ1dGVzIH0gZnJvbSAnLi9maWxsX2V4dHJ1c2lvbl9hdHRyaWJ1dGVzJztcbmltcG9ydCBTZWdtZW50VmVjdG9yIGZyb20gJy4uL3NlZ21lbnQnO1xuaW1wb3J0IHsgUHJvZ3JhbUNvbmZpZ3VyYXRpb25TZXQgfSBmcm9tICcuLi9wcm9ncmFtX2NvbmZpZ3VyYXRpb24nO1xuaW1wb3J0IHsgVHJpYW5nbGVJbmRleEFycmF5IH0gZnJvbSAnLi4vaW5kZXhfYXJyYXlfdHlwZSc7XG5pbXBvcnQgRVhURU5UIGZyb20gJy4uL2V4dGVudCc7XG5pbXBvcnQgZWFyY3V0IGZyb20gJ2VhcmN1dCc7XG5pbXBvcnQgbXZ0IGZyb20gJ0BtYXBib3gvdmVjdG9yLXRpbGUnO1xuY29uc3QgdmVjdG9yVGlsZUZlYXR1cmVUeXBlcyA9IG12dC5WZWN0b3JUaWxlRmVhdHVyZS50eXBlcztcbmltcG9ydCBjbGFzc2lmeVJpbmdzIGZyb20gJy4uLy4uL3V0aWwvY2xhc3NpZnlfcmluZ3MnO1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuY29uc3QgRUFSQ1VUX01BWF9SSU5HUyA9IDUwMDtcbmltcG9ydCB7IHJlZ2lzdGVyIH0gZnJvbSAnLi4vLi4vdXRpbC93ZWJfd29ya2VyX3RyYW5zZmVyJztcbmltcG9ydCB7aGFzUGF0dGVybiwgYWRkUGF0dGVybkRlcGVuZGVuY2llc30gZnJvbSAnLi9wYXR0ZXJuX2J1Y2tldF9mZWF0dXJlcyc7XG5pbXBvcnQgbG9hZEdlb21ldHJ5IGZyb20gJy4uL2xvYWRfZ2VvbWV0cnknO1xuaW1wb3J0IEV2YWx1YXRpb25QYXJhbWV0ZXJzIGZyb20gJy4uLy4uL3N0eWxlL2V2YWx1YXRpb25fcGFyYW1ldGVycyc7XG5cbmltcG9ydCB0eXBlIHtcbiAgICBCdWNrZXQsXG4gICAgQnVja2V0UGFyYW1ldGVycyxcbiAgICBCdWNrZXRGZWF0dXJlLFxuICAgIEluZGV4ZWRGZWF0dXJlLFxuICAgIFBvcHVsYXRlUGFyYW1ldGVyc1xufSBmcm9tICcuLi9idWNrZXQnO1xuXG5pbXBvcnQgdHlwZSBGaWxsRXh0cnVzaW9uU3R5bGVMYXllciBmcm9tICcuLi8uLi9zdHlsZS9zdHlsZV9sYXllci9maWxsX2V4dHJ1c2lvbl9zdHlsZV9sYXllcic7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gJy4uLy4uL2dsL2NvbnRleHQnO1xuaW1wb3J0IHR5cGUgSW5kZXhCdWZmZXIgZnJvbSAnLi4vLi4vZ2wvaW5kZXhfYnVmZmVyJztcbmltcG9ydCB0eXBlIFZlcnRleEJ1ZmZlciBmcm9tICcuLi8uLi9nbC92ZXJ0ZXhfYnVmZmVyJztcbmltcG9ydCB0eXBlIFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuaW1wb3J0IHR5cGUge0ZlYXR1cmVTdGF0ZXN9IGZyb20gJy4uLy4uL3NvdXJjZS9zb3VyY2Vfc3RhdGUnO1xuaW1wb3J0IHR5cGUge0ltYWdlUG9zaXRpb259IGZyb20gJy4uLy4uL3JlbmRlci9pbWFnZV9hdGxhcyc7XG5cblxuY29uc3QgRkFDVE9SID0gTWF0aC5wb3coMiwgMTMpO1xuXG5mdW5jdGlvbiBhZGRWZXJ0ZXgodmVydGV4QXJyYXksIHgsIHksIG54LCBueSwgbnosIHQsIGUpIHtcbiAgICB2ZXJ0ZXhBcnJheS5lbXBsYWNlQmFjayhcbiAgICAgICAgLy8gYV9wb3NcbiAgICAgICAgeCxcbiAgICAgICAgeSxcbiAgICAgICAgLy8gYV9ub3JtYWxfZWQ6IDMtY29tcG9uZW50IG5vcm1hbCBhbmQgMS1jb21wb25lbnQgZWRnZWRpc3RhbmNlXG4gICAgICAgIE1hdGguZmxvb3IobnggKiBGQUNUT1IpICogMiArIHQsXG4gICAgICAgIG55ICogRkFDVE9SICogMixcbiAgICAgICAgbnogKiBGQUNUT1IgKiAyLFxuICAgICAgICAvLyBlZGdlZGlzdGFuY2UgKHVzZWQgZm9yIHdyYXBwaW5nIHBhdHRlcm5zIGFyb3VuZCBleHRydXNpb24gc2lkZXMpXG4gICAgICAgIE1hdGgucm91bmQoZSlcbiAgICApO1xufVxuXG5cbmNsYXNzIEZpbGxFeHRydXNpb25CdWNrZXQgaW1wbGVtZW50cyBCdWNrZXQge1xuICAgIGluZGV4OiBudW1iZXI7XG4gICAgem9vbTogbnVtYmVyO1xuICAgIG92ZXJzY2FsaW5nOiBudW1iZXI7XG4gICAgbGF5ZXJzOiBBcnJheTxGaWxsRXh0cnVzaW9uU3R5bGVMYXllcj47XG4gICAgbGF5ZXJJZHM6IEFycmF5PHN0cmluZz47XG4gICAgc3RhdGVEZXBlbmRlbnRMYXllcnM6IEFycmF5PEZpbGxFeHRydXNpb25TdHlsZUxheWVyPjtcbiAgICBzdGF0ZURlcGVuZGVudExheWVySWRzOiBBcnJheTxzdHJpbmc+O1xuXG4gICAgbGF5b3V0VmVydGV4QXJyYXk6IEZpbGxFeHRydXNpb25MYXlvdXRBcnJheTtcbiAgICBsYXlvdXRWZXJ0ZXhCdWZmZXI6IFZlcnRleEJ1ZmZlcjtcblxuICAgIGluZGV4QXJyYXk6IFRyaWFuZ2xlSW5kZXhBcnJheTtcbiAgICBpbmRleEJ1ZmZlcjogSW5kZXhCdWZmZXI7XG5cbiAgICBoYXNQYXR0ZXJuOiBib29sZWFuO1xuICAgIHByb2dyYW1Db25maWd1cmF0aW9uczogUHJvZ3JhbUNvbmZpZ3VyYXRpb25TZXQ8RmlsbEV4dHJ1c2lvblN0eWxlTGF5ZXI+O1xuICAgIHNlZ21lbnRzOiBTZWdtZW50VmVjdG9yO1xuICAgIHVwbG9hZGVkOiBib29sZWFuO1xuICAgIGZlYXR1cmVzOiBBcnJheTxCdWNrZXRGZWF0dXJlPjtcblxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM6IEJ1Y2tldFBhcmFtZXRlcnM8RmlsbEV4dHJ1c2lvblN0eWxlTGF5ZXI+KSB7XG4gICAgICAgIHRoaXMuem9vbSA9IG9wdGlvbnMuem9vbTtcbiAgICAgICAgdGhpcy5vdmVyc2NhbGluZyA9IG9wdGlvbnMub3ZlcnNjYWxpbmc7XG4gICAgICAgIHRoaXMubGF5ZXJzID0gb3B0aW9ucy5sYXllcnM7XG4gICAgICAgIHRoaXMubGF5ZXJJZHMgPSB0aGlzLmxheWVycy5tYXAobGF5ZXIgPT4gbGF5ZXIuaWQpO1xuICAgICAgICB0aGlzLmluZGV4ID0gb3B0aW9ucy5pbmRleDtcbiAgICAgICAgdGhpcy5oYXNQYXR0ZXJuID0gZmFsc2U7XG5cbiAgICAgICAgdGhpcy5sYXlvdXRWZXJ0ZXhBcnJheSA9IG5ldyBGaWxsRXh0cnVzaW9uTGF5b3V0QXJyYXkoKTtcbiAgICAgICAgdGhpcy5pbmRleEFycmF5ID0gbmV3IFRyaWFuZ2xlSW5kZXhBcnJheSgpO1xuICAgICAgICB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucyA9IG5ldyBQcm9ncmFtQ29uZmlndXJhdGlvblNldChsYXlvdXRBdHRyaWJ1dGVzLCBvcHRpb25zLmxheWVycywgb3B0aW9ucy56b29tKTtcbiAgICAgICAgdGhpcy5zZWdtZW50cyA9IG5ldyBTZWdtZW50VmVjdG9yKCk7XG4gICAgICAgIHRoaXMuc3RhdGVEZXBlbmRlbnRMYXllcklkcyA9IHRoaXMubGF5ZXJzLmZpbHRlcigobCkgPT4gbC5pc1N0YXRlRGVwZW5kZW50KCkpLm1hcCgobCkgPT4gbC5pZCk7XG5cbiAgICB9XG5cbiAgICBwb3B1bGF0ZShmZWF0dXJlczogQXJyYXk8SW5kZXhlZEZlYXR1cmU+LCBvcHRpb25zOiBQb3B1bGF0ZVBhcmFtZXRlcnMpIHtcbiAgICAgICAgdGhpcy5mZWF0dXJlcyA9IFtdO1xuICAgICAgICB0aGlzLmhhc1BhdHRlcm4gPSBoYXNQYXR0ZXJuKCdmaWxsLWV4dHJ1c2lvbicsIHRoaXMubGF5ZXJzLCBvcHRpb25zKTtcblxuICAgICAgICBmb3IgKGNvbnN0IHtmZWF0dXJlLCBpbmRleCwgc291cmNlTGF5ZXJJbmRleH0gb2YgZmVhdHVyZXMpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5sYXllcnNbMF0uX2ZlYXR1cmVGaWx0ZXIobmV3IEV2YWx1YXRpb25QYXJhbWV0ZXJzKHRoaXMuem9vbSksIGZlYXR1cmUpKSBjb250aW51ZTtcblxuICAgICAgICAgICAgY29uc3QgZ2VvbWV0cnkgPSBsb2FkR2VvbWV0cnkoZmVhdHVyZSk7XG5cbiAgICAgICAgICAgIGNvbnN0IHBhdHRlcm5GZWF0dXJlOiBCdWNrZXRGZWF0dXJlID0ge1xuICAgICAgICAgICAgICAgIHNvdXJjZUxheWVySW5kZXgsXG4gICAgICAgICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgICAgICAgZ2VvbWV0cnksXG4gICAgICAgICAgICAgICAgcHJvcGVydGllczogZmVhdHVyZS5wcm9wZXJ0aWVzLFxuICAgICAgICAgICAgICAgIHR5cGU6IGZlYXR1cmUudHlwZSxcbiAgICAgICAgICAgICAgICBwYXR0ZXJuczoge31cbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgZmVhdHVyZS5pZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBwYXR0ZXJuRmVhdHVyZS5pZCA9IGZlYXR1cmUuaWQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmhhc1BhdHRlcm4pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZlYXR1cmVzLnB1c2goYWRkUGF0dGVybkRlcGVuZGVuY2llcygnZmlsbC1leHRydXNpb24nLCB0aGlzLmxheWVycywgcGF0dGVybkZlYXR1cmUsIHRoaXMuem9vbSwgb3B0aW9ucykpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEZlYXR1cmUocGF0dGVybkZlYXR1cmUsIGdlb21ldHJ5LCBpbmRleCwge30pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBvcHRpb25zLmZlYXR1cmVJbmRleC5pbnNlcnQoZmVhdHVyZSwgZ2VvbWV0cnksIGluZGV4LCBzb3VyY2VMYXllckluZGV4LCB0aGlzLmluZGV4LCB0cnVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFkZEZlYXR1cmVzKG9wdGlvbnM6IFBvcHVsYXRlUGFyYW1ldGVycywgaW1hZ2VQb3NpdGlvbnM6IHtbc3RyaW5nXTogSW1hZ2VQb3NpdGlvbn0pIHtcbiAgICAgICAgZm9yIChjb25zdCBmZWF0dXJlIG9mIHRoaXMuZmVhdHVyZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHtnZW9tZXRyeX0gPSBmZWF0dXJlO1xuICAgICAgICAgICAgdGhpcy5hZGRGZWF0dXJlKGZlYXR1cmUsIGdlb21ldHJ5LCBmZWF0dXJlLmluZGV4LCBpbWFnZVBvc2l0aW9ucyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1cGRhdGUoc3RhdGVzOiBGZWF0dXJlU3RhdGVzLCB2dExheWVyOiBWZWN0b3JUaWxlTGF5ZXIsIGltYWdlUG9zaXRpb25zOiB7W3N0cmluZ106IEltYWdlUG9zaXRpb259KSB7XG4gICAgICAgIGlmICghdGhpcy5zdGF0ZURlcGVuZGVudExheWVycy5sZW5ndGgpIHJldHVybjtcbiAgICAgICAgdGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnMudXBkYXRlUGFpbnRBcnJheXMoc3RhdGVzLCB2dExheWVyLCB0aGlzLnN0YXRlRGVwZW5kZW50TGF5ZXJzLCBpbWFnZVBvc2l0aW9ucyk7XG4gICAgfVxuXG4gICAgaXNFbXB0eSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGF5b3V0VmVydGV4QXJyYXkubGVuZ3RoID09PSAwO1xuICAgIH1cblxuICAgIHVwbG9hZFBlbmRpbmcoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy51cGxvYWRlZCB8fCB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucy5uZWVkc1VwbG9hZDtcbiAgICB9XG5cbiAgICB1cGxvYWQoY29udGV4dDogQ29udGV4dCkge1xuICAgICAgICBpZiAoIXRoaXMudXBsb2FkZWQpIHtcbiAgICAgICAgICAgIHRoaXMubGF5b3V0VmVydGV4QnVmZmVyID0gY29udGV4dC5jcmVhdGVWZXJ0ZXhCdWZmZXIodGhpcy5sYXlvdXRWZXJ0ZXhBcnJheSwgbGF5b3V0QXR0cmlidXRlcyk7XG4gICAgICAgICAgICB0aGlzLmluZGV4QnVmZmVyID0gY29udGV4dC5jcmVhdGVJbmRleEJ1ZmZlcih0aGlzLmluZGV4QXJyYXkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLnVwbG9hZChjb250ZXh0KTtcbiAgICAgICAgdGhpcy51cGxvYWRlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmxheW91dFZlcnRleEJ1ZmZlcikgcmV0dXJuO1xuICAgICAgICB0aGlzLmxheW91dFZlcnRleEJ1ZmZlci5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMuaW5kZXhCdWZmZXIuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucy5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMuc2VnbWVudHMuZGVzdHJveSgpO1xuICAgIH1cblxuICAgIGFkZEZlYXR1cmUoZmVhdHVyZTogQnVja2V0RmVhdHVyZSwgZ2VvbWV0cnk6IEFycmF5PEFycmF5PFBvaW50Pj4sIGluZGV4OiBudW1iZXIsIGltYWdlUG9zaXRpb25zOiB7W3N0cmluZ106IEltYWdlUG9zaXRpb259KSB7XG4gICAgICAgIGZvciAoY29uc3QgcG9seWdvbiBvZiBjbGFzc2lmeVJpbmdzKGdlb21ldHJ5LCBFQVJDVVRfTUFYX1JJTkdTKSkge1xuICAgICAgICAgICAgbGV0IG51bVZlcnRpY2VzID0gMDtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcmluZyBvZiBwb2x5Z29uKSB7XG4gICAgICAgICAgICAgICAgbnVtVmVydGljZXMgKz0gcmluZy5sZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgc2VnbWVudCA9IHRoaXMuc2VnbWVudHMucHJlcGFyZVNlZ21lbnQoNCwgdGhpcy5sYXlvdXRWZXJ0ZXhBcnJheSwgdGhpcy5pbmRleEFycmF5KTtcblxuICAgICAgICAgICAgZm9yIChjb25zdCByaW5nIG9mIHBvbHlnb24pIHtcbiAgICAgICAgICAgICAgICBpZiAocmluZy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGlzRW50aXJlbHlPdXRzaWRlKHJpbmcpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxldCBlZGdlRGlzdGFuY2UgPSAwO1xuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgcCA9IDA7IHAgPCByaW5nLmxlbmd0aDsgcCsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHAxID0gcmluZ1twXTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAocCA+PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwMiA9IHJpbmdbcCAtIDFdO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzQm91bmRhcnlFZGdlKHAxLCBwMikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VnbWVudC52ZXJ0ZXhMZW5ndGggKyA0ID4gU2VnbWVudFZlY3Rvci5NQVhfVkVSVEVYX0FSUkFZX0xFTkdUSCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50ID0gdGhpcy5zZWdtZW50cy5wcmVwYXJlU2VnbWVudCg0LCB0aGlzLmxheW91dFZlcnRleEFycmF5LCB0aGlzLmluZGV4QXJyYXkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBlcnAgPSBwMS5zdWIocDIpLl9wZXJwKCkuX3VuaXQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkaXN0ID0gcDIuZGlzdChwMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVkZ2VEaXN0YW5jZSArIGRpc3QgPiAzMjc2OCkgZWRnZURpc3RhbmNlID0gMDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZFZlcnRleCh0aGlzLmxheW91dFZlcnRleEFycmF5LCBwMS54LCBwMS55LCBwZXJwLngsIHBlcnAueSwgMCwgMCwgZWRnZURpc3RhbmNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRWZXJ0ZXgodGhpcy5sYXlvdXRWZXJ0ZXhBcnJheSwgcDEueCwgcDEueSwgcGVycC54LCBwZXJwLnksIDAsIDEsIGVkZ2VEaXN0YW5jZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZGdlRGlzdGFuY2UgKz0gZGlzdDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZFZlcnRleCh0aGlzLmxheW91dFZlcnRleEFycmF5LCBwMi54LCBwMi55LCBwZXJwLngsIHBlcnAueSwgMCwgMCwgZWRnZURpc3RhbmNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRWZXJ0ZXgodGhpcy5sYXlvdXRWZXJ0ZXhBcnJheSwgcDIueCwgcDIueSwgcGVycC54LCBwZXJwLnksIDAsIDEsIGVkZ2VEaXN0YW5jZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBib3R0b21SaWdodCA9IHNlZ21lbnQudmVydGV4TGVuZ3RoO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gw6LClMKMw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKQXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gw6LClMKCIDAgIDEgw6LClMKCIENvdW50ZXItY2xvY2t3aXNlIHdpbmRpbmcgb3JkZXIuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gw6LClMKCICAgICAgw6LClMKCIFRyaWFuZ2xlIDE6IDAgPT4gMiA9PiAxXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gw6LClMKCIDIgIDMgw6LClMKCIFRyaWFuZ2xlIDI6IDEgPT4gMiA9PiAzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gw6LClMKUw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKYXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmRleEFycmF5LmVtcGxhY2VCYWNrKGJvdHRvbVJpZ2h0LCBib3R0b21SaWdodCArIDIsIGJvdHRvbVJpZ2h0ICsgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmRleEFycmF5LmVtcGxhY2VCYWNrKGJvdHRvbVJpZ2h0ICsgMSwgYm90dG9tUmlnaHQgKyAyLCBib3R0b21SaWdodCArIDMpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VnbWVudC52ZXJ0ZXhMZW5ndGggKz0gNDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50LnByaW1pdGl2ZUxlbmd0aCArPSAyO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoc2VnbWVudC52ZXJ0ZXhMZW5ndGggKyBudW1WZXJ0aWNlcyA+IFNlZ21lbnRWZWN0b3IuTUFYX1ZFUlRFWF9BUlJBWV9MRU5HVEgpIHtcbiAgICAgICAgICAgICAgICBzZWdtZW50ID0gdGhpcy5zZWdtZW50cy5wcmVwYXJlU2VnbWVudChudW1WZXJ0aWNlcywgdGhpcy5sYXlvdXRWZXJ0ZXhBcnJheSwgdGhpcy5pbmRleEFycmF5KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy9Pbmx5IHRyaWFuZ3VsYXRlIGFuZCBkcmF3IHRoZSBhcmVhIG9mIHRoZSBmZWF0dXJlIGlmIGl0IGlzIGEgcG9seWdvblxuICAgICAgICAgICAgLy9PdGhlciBmZWF0dXJlIHR5cGVzIChlLmcuIExpbmVTdHJpbmcpIGRvIG5vdCBoYXZlIGFyZWEsIHNvIHRyaWFuZ3VsYXRpb24gaXMgcG9pbnRsZXNzIC8gdW5kZWZpbmVkXG4gICAgICAgICAgICBpZiAodmVjdG9yVGlsZUZlYXR1cmVUeXBlc1tmZWF0dXJlLnR5cGVdICE9PSAnUG9seWdvbicpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG5cbiAgICAgICAgICAgIGNvbnN0IGZsYXR0ZW5lZCA9IFtdO1xuICAgICAgICAgICAgY29uc3QgaG9sZUluZGljZXMgPSBbXTtcbiAgICAgICAgICAgIGNvbnN0IHRyaWFuZ2xlSW5kZXggPSBzZWdtZW50LnZlcnRleExlbmd0aDtcblxuICAgICAgICAgICAgZm9yIChjb25zdCByaW5nIG9mIHBvbHlnb24pIHtcbiAgICAgICAgICAgICAgICBpZiAocmluZy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHJpbmcgIT09IHBvbHlnb25bMF0pIHtcbiAgICAgICAgICAgICAgICAgICAgaG9sZUluZGljZXMucHVzaChmbGF0dGVuZWQubGVuZ3RoIC8gMik7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByaW5nLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHAgPSByaW5nW2ldO1xuXG4gICAgICAgICAgICAgICAgICAgIGFkZFZlcnRleCh0aGlzLmxheW91dFZlcnRleEFycmF5LCBwLngsIHAueSwgMCwgMCwgMSwgMSwgMCk7XG5cbiAgICAgICAgICAgICAgICAgICAgZmxhdHRlbmVkLnB1c2gocC54KTtcbiAgICAgICAgICAgICAgICAgICAgZmxhdHRlbmVkLnB1c2gocC55KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGluZGljZXMgPSBlYXJjdXQoZmxhdHRlbmVkLCBob2xlSW5kaWNlcyk7XG4gICAgICAgICAgICBhc3NlcnQoaW5kaWNlcy5sZW5ndGggJSAzID09PSAwKTtcblxuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBpbmRpY2VzLmxlbmd0aDsgaiArPSAzKSB7XG4gICAgICAgICAgICAgICAgLy8gQ291bnRlci1jbG9ja3dpc2Ugd2luZGluZyBvcmRlci5cbiAgICAgICAgICAgICAgICB0aGlzLmluZGV4QXJyYXkuZW1wbGFjZUJhY2soXG4gICAgICAgICAgICAgICAgICAgIHRyaWFuZ2xlSW5kZXggKyBpbmRpY2VzW2pdLFxuICAgICAgICAgICAgICAgICAgICB0cmlhbmdsZUluZGV4ICsgaW5kaWNlc1tqICsgMl0sXG4gICAgICAgICAgICAgICAgICAgIHRyaWFuZ2xlSW5kZXggKyBpbmRpY2VzW2ogKyAxXSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHNlZ21lbnQucHJpbWl0aXZlTGVuZ3RoICs9IGluZGljZXMubGVuZ3RoIC8gMztcbiAgICAgICAgICAgIHNlZ21lbnQudmVydGV4TGVuZ3RoICs9IG51bVZlcnRpY2VzO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnMucG9wdWxhdGVQYWludEFycmF5cyh0aGlzLmxheW91dFZlcnRleEFycmF5Lmxlbmd0aCwgZmVhdHVyZSwgaW5kZXgsIGltYWdlUG9zaXRpb25zKTtcbiAgICB9XG59XG5cbnJlZ2lzdGVyKCdGaWxsRXh0cnVzaW9uQnVja2V0JywgRmlsbEV4dHJ1c2lvbkJ1Y2tldCwge29taXQ6IFsnbGF5ZXJzJywgJ2ZlYXR1cmVzJ119KTtcblxuZXhwb3J0IGRlZmF1bHQgRmlsbEV4dHJ1c2lvbkJ1Y2tldDtcblxuZnVuY3Rpb24gaXNCb3VuZGFyeUVkZ2UocDEsIHAyKSB7XG4gICAgcmV0dXJuIChwMS54ID09PSBwMi54ICYmIChwMS54IDwgMCB8fCBwMS54ID4gRVhURU5UKSkgfHxcbiAgICAgICAgKHAxLnkgPT09IHAyLnkgJiYgKHAxLnkgPCAwIHx8IHAxLnkgPiBFWFRFTlQpKTtcbn1cblxuZnVuY3Rpb24gaXNFbnRpcmVseU91dHNpZGUocmluZykge1xuICAgIHJldHVybiByaW5nLmV2ZXJ5KHAgPT4gcC54IDwgMCkgfHxcbiAgICAgICAgcmluZy5ldmVyeShwID0+IHAueCA+IEVYVEVOVCkgfHxcbiAgICAgICAgcmluZy5ldmVyeShwID0+IHAueSA8IDApIHx8XG4gICAgICAgIHJpbmcuZXZlcnkocCA9PiBwLnkgPiBFWFRFTlQpO1xufVxuIiwiLy8gVGhpcyBmaWxlIGlzIGdlbmVyYXRlZC4gRWRpdCBidWlsZC9nZW5lcmF0ZS1zdHlsZS1jb2RlLmpzLCB0aGVuIHJ1biBgeWFybiBydW4gY29kZWdlbmAuXG4vLyBAZmxvd1xuLyogZXNsaW50LWRpc2FibGUgKi9cblxuaW1wb3J0IHN0eWxlU3BlYyBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL3JlZmVyZW5jZS9sYXRlc3QnO1xuXG5pbXBvcnQge1xuICAgIFByb3BlcnRpZXMsXG4gICAgRGF0YUNvbnN0YW50UHJvcGVydHksXG4gICAgRGF0YURyaXZlblByb3BlcnR5LFxuICAgIENyb3NzRmFkZWREYXRhRHJpdmVuUHJvcGVydHksXG4gICAgQ3Jvc3NGYWRlZFByb3BlcnR5LFxuICAgIENvbG9yUmFtcFByb3BlcnR5XG59IGZyb20gJy4uL3Byb3BlcnRpZXMnO1xuXG5pbXBvcnQgdHlwZSBDb2xvciBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL3V0aWwvY29sb3InO1xuXG5pbXBvcnQgdHlwZSBGb3JtYXR0ZWQgZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uL3R5cGVzL2Zvcm1hdHRlZCc7XG5cblxuZXhwb3J0IHR5cGUgUGFpbnRQcm9wcyA9IHt8XG4gICAgXCJmaWxsLWV4dHJ1c2lvbi1vcGFjaXR5XCI6IERhdGFDb25zdGFudFByb3BlcnR5PG51bWJlcj4sXG4gICAgXCJmaWxsLWV4dHJ1c2lvbi1jb2xvclwiOiBEYXRhRHJpdmVuUHJvcGVydHk8Q29sb3I+LFxuICAgIFwiZmlsbC1leHRydXNpb24tdHJhbnNsYXRlXCI6IERhdGFDb25zdGFudFByb3BlcnR5PFtudW1iZXIsIG51bWJlcl0+LFxuICAgIFwiZmlsbC1leHRydXNpb24tdHJhbnNsYXRlLWFuY2hvclwiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxcIm1hcFwiIHwgXCJ2aWV3cG9ydFwiPixcbiAgICBcImZpbGwtZXh0cnVzaW9uLXBhdHRlcm5cIjogQ3Jvc3NGYWRlZERhdGFEcml2ZW5Qcm9wZXJ0eTxzdHJpbmc+LFxuICAgIFwiZmlsbC1leHRydXNpb24taGVpZ2h0XCI6IERhdGFEcml2ZW5Qcm9wZXJ0eTxudW1iZXI+LFxuICAgIFwiZmlsbC1leHRydXNpb24tYmFzZVwiOiBEYXRhRHJpdmVuUHJvcGVydHk8bnVtYmVyPixcbiAgICBcImZpbGwtZXh0cnVzaW9uLXZlcnRpY2FsLWdyYWRpZW50XCI6IERhdGFDb25zdGFudFByb3BlcnR5PGJvb2xlYW4+LFxufH07XG5cbmNvbnN0IHBhaW50OiBQcm9wZXJ0aWVzPFBhaW50UHJvcHM+ID0gbmV3IFByb3BlcnRpZXMoe1xuICAgIFwiZmlsbC1leHRydXNpb24tb3BhY2l0eVwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfZmlsbC1leHRydXNpb25cIl1bXCJmaWxsLWV4dHJ1c2lvbi1vcGFjaXR5XCJdKSxcbiAgICBcImZpbGwtZXh0cnVzaW9uLWNvbG9yXCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfZmlsbC1leHRydXNpb25cIl1bXCJmaWxsLWV4dHJ1c2lvbi1jb2xvclwiXSksXG4gICAgXCJmaWxsLWV4dHJ1c2lvbi10cmFuc2xhdGVcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2ZpbGwtZXh0cnVzaW9uXCJdW1wiZmlsbC1leHRydXNpb24tdHJhbnNsYXRlXCJdKSxcbiAgICBcImZpbGwtZXh0cnVzaW9uLXRyYW5zbGF0ZS1hbmNob3JcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2ZpbGwtZXh0cnVzaW9uXCJdW1wiZmlsbC1leHRydXNpb24tdHJhbnNsYXRlLWFuY2hvclwiXSksXG4gICAgXCJmaWxsLWV4dHJ1c2lvbi1wYXR0ZXJuXCI6IG5ldyBDcm9zc0ZhZGVkRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2ZpbGwtZXh0cnVzaW9uXCJdW1wiZmlsbC1leHRydXNpb24tcGF0dGVyblwiXSksXG4gICAgXCJmaWxsLWV4dHJ1c2lvbi1oZWlnaHRcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9maWxsLWV4dHJ1c2lvblwiXVtcImZpbGwtZXh0cnVzaW9uLWhlaWdodFwiXSksXG4gICAgXCJmaWxsLWV4dHJ1c2lvbi1iYXNlXCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfZmlsbC1leHRydXNpb25cIl1bXCJmaWxsLWV4dHJ1c2lvbi1iYXNlXCJdKSxcbiAgICBcImZpbGwtZXh0cnVzaW9uLXZlcnRpY2FsLWdyYWRpZW50XCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9maWxsLWV4dHJ1c2lvblwiXVtcImZpbGwtZXh0cnVzaW9uLXZlcnRpY2FsLWdyYWRpZW50XCJdKSxcbn0pO1xuXG4vLyBOb3RlOiB3aXRob3V0IGFkZGluZyB0aGUgZXhwbGljaXQgdHlwZSBhbm5vdGF0aW9uLCBGbG93IGluZmVycyB3ZWFrZXIgdHlwZXNcbi8vIGZvciB0aGVzZSBvYmplY3RzIGZyb20gdGhlaXIgdXNlIGluIHRoZSBjb25zdHJ1Y3RvciB0byBTdHlsZUxheWVyLCBhc1xuLy8ge2xheW91dD86IFByb3BlcnRpZXM8Li4uPiwgcGFpbnQ6IFByb3BlcnRpZXM8Li4uPn1cbmV4cG9ydCBkZWZhdWx0ICh7IHBhaW50IH06ICRFeGFjdDx7XG4gIHBhaW50OiBQcm9wZXJ0aWVzPFBhaW50UHJvcHM+XG59Pik7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgU3R5bGVMYXllciBmcm9tICcuLi9zdHlsZV9sYXllcic7XG5cbmltcG9ydCBGaWxsRXh0cnVzaW9uQnVja2V0IGZyb20gJy4uLy4uL2RhdGEvYnVja2V0L2ZpbGxfZXh0cnVzaW9uX2J1Y2tldCc7XG5pbXBvcnQgeyBwb2x5Z29uSW50ZXJzZWN0c1BvbHlnb24sIHBvbHlnb25JbnRlcnNlY3RzTXVsdGlQb2x5Z29uIH0gZnJvbSAnLi4vLi4vdXRpbC9pbnRlcnNlY3Rpb25fdGVzdHMnO1xuaW1wb3J0IHsgdHJhbnNsYXRlRGlzdGFuY2UsIHRyYW5zbGF0ZSB9IGZyb20gJy4uL3F1ZXJ5X3V0aWxzJztcbmltcG9ydCBwcm9wZXJ0aWVzIGZyb20gJy4vZmlsbF9leHRydXNpb25fc3R5bGVfbGF5ZXJfcHJvcGVydGllcyc7XG5pbXBvcnQgeyBUcmFuc2l0aW9uYWJsZSwgVHJhbnNpdGlvbmluZywgUG9zc2libHlFdmFsdWF0ZWQgfSBmcm9tICcuLi9wcm9wZXJ0aWVzJztcbmltcG9ydCB7dmVjNH0gZnJvbSAnZ2wtbWF0cml4JztcbmltcG9ydCBQb2ludCBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcblxuaW1wb3J0IHR5cGUgeyBGZWF0dXJlU3RhdGUgfSBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL2V4cHJlc3Npb24nO1xuaW1wb3J0IHR5cGUge0J1Y2tldFBhcmFtZXRlcnN9IGZyb20gJy4uLy4uL2RhdGEvYnVja2V0JztcbmltcG9ydCB0eXBlIHtQYWludFByb3BzfSBmcm9tICcuL2ZpbGxfZXh0cnVzaW9uX3N0eWxlX2xheWVyX3Byb3BlcnRpZXMnO1xuaW1wb3J0IHR5cGUgVHJhbnNmb3JtIGZyb20gJy4uLy4uL2dlby90cmFuc2Zvcm0nO1xuaW1wb3J0IHR5cGUge0xheWVyU3BlY2lmaWNhdGlvbn0gZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy90eXBlcyc7XG5cbmNsYXNzIEZpbGxFeHRydXNpb25TdHlsZUxheWVyIGV4dGVuZHMgU3R5bGVMYXllciB7XG4gICAgX3RyYW5zaXRpb25hYmxlUGFpbnQ6IFRyYW5zaXRpb25hYmxlPFBhaW50UHJvcHM+O1xuICAgIF90cmFuc2l0aW9uaW5nUGFpbnQ6IFRyYW5zaXRpb25pbmc8UGFpbnRQcm9wcz47XG4gICAgcGFpbnQ6IFBvc3NpYmx5RXZhbHVhdGVkPFBhaW50UHJvcHM+O1xuXG4gICAgY29uc3RydWN0b3IobGF5ZXI6IExheWVyU3BlY2lmaWNhdGlvbikge1xuICAgICAgICBzdXBlcihsYXllciwgcHJvcGVydGllcyk7XG4gICAgfVxuXG4gICAgY3JlYXRlQnVja2V0KHBhcmFtZXRlcnM6IEJ1Y2tldFBhcmFtZXRlcnM8RmlsbEV4dHJ1c2lvblN0eWxlTGF5ZXI+KSB7XG4gICAgICAgIHJldHVybiBuZXcgRmlsbEV4dHJ1c2lvbkJ1Y2tldChwYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICBxdWVyeVJhZGl1cygpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdHJhbnNsYXRlRGlzdGFuY2UodGhpcy5wYWludC5nZXQoJ2ZpbGwtZXh0cnVzaW9uLXRyYW5zbGF0ZScpKTtcbiAgICB9XG5cbiAgICBpczNEKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBxdWVyeUludGVyc2VjdHNGZWF0dXJlKHF1ZXJ5R2VvbWV0cnk6IEFycmF5PFBvaW50PixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmU6IFZlY3RvclRpbGVGZWF0dXJlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZVN0YXRlOiBGZWF0dXJlU3RhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBnZW9tZXRyeTogQXJyYXk8QXJyYXk8UG9pbnQ+PixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHpvb206IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogVHJhbnNmb3JtLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxzVG9UaWxlVW5pdHM6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsUG9zTWF0cml4OiBGbG9hdDMyQXJyYXkpOiBib29sZWFuIHwgbnVtYmVyIHtcblxuICAgICAgICBjb25zdCB0cmFuc2xhdGVkUG9seWdvbiA9IHRyYW5zbGF0ZShxdWVyeUdlb21ldHJ5LFxuICAgICAgICAgICAgdGhpcy5wYWludC5nZXQoJ2ZpbGwtZXh0cnVzaW9uLXRyYW5zbGF0ZScpLFxuICAgICAgICAgICAgdGhpcy5wYWludC5nZXQoJ2ZpbGwtZXh0cnVzaW9uLXRyYW5zbGF0ZS1hbmNob3InKSxcbiAgICAgICAgICAgIHRyYW5zZm9ybS5hbmdsZSwgcGl4ZWxzVG9UaWxlVW5pdHMpO1xuXG4gICAgICAgIGNvbnN0IGhlaWdodCA9IHRoaXMucGFpbnQuZ2V0KCdmaWxsLWV4dHJ1c2lvbi1oZWlnaHQnKS5ldmFsdWF0ZShmZWF0dXJlLCBmZWF0dXJlU3RhdGUpO1xuICAgICAgICBjb25zdCBiYXNlID0gdGhpcy5wYWludC5nZXQoJ2ZpbGwtZXh0cnVzaW9uLWJhc2UnKS5ldmFsdWF0ZShmZWF0dXJlLCBmZWF0dXJlU3RhdGUpO1xuXG4gICAgICAgIGNvbnN0IHByb2plY3RlZFF1ZXJ5R2VvbWV0cnkgPSBwcm9qZWN0UXVlcnlHZW9tZXRyeSh0cmFuc2xhdGVkUG9seWdvbiwgcGl4ZWxQb3NNYXRyaXgsIHRyYW5zZm9ybSwgMCk7XG5cbiAgICAgICAgY29uc3QgcHJvamVjdGVkID0gcHJvamVjdEV4dHJ1c2lvbihnZW9tZXRyeSwgYmFzZSwgaGVpZ2h0LCBwaXhlbFBvc01hdHJpeCk7XG4gICAgICAgIGNvbnN0IHByb2plY3RlZEJhc2UgPSBwcm9qZWN0ZWRbMF07XG4gICAgICAgIGNvbnN0IHByb2plY3RlZFRvcCA9IHByb2plY3RlZFsxXTtcbiAgICAgICAgcmV0dXJuIGNoZWNrSW50ZXJzZWN0aW9uKHByb2plY3RlZEJhc2UsIHByb2plY3RlZFRvcCwgcHJvamVjdGVkUXVlcnlHZW9tZXRyeSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBkb3QoYSwgYikge1xuICAgIHJldHVybiBhLnggKiBiLnggKyBhLnkgKiBiLnk7XG59XG5cbmZ1bmN0aW9uIGdldEludGVyc2VjdGlvbkRpc3RhbmNlKHByb2plY3RlZFF1ZXJ5R2VvbWV0cnk6IEFycmF5PFBvaW50PiwgcHJvamVjdGVkRmFjZTogQXJyYXk8UG9pbnQ+KSB7XG5cbiAgICBpZiAocHJvamVjdGVkUXVlcnlHZW9tZXRyeS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgLy8gRm9yIHBvaW50IHF1ZXJpZXMgY2FsY3VsYXRlIHRoZSB6IGF0IHdoaWNoIHRoZSBwb2ludCBpbnRlcnNlY3RzIHRoZSBmYWNlXG4gICAgICAgIC8vIHVzaW5nIGJhcnljZW50cmljIGNvb3JkaW5hdGVzLlxuXG4gICAgICAgIC8vIEZpbmQgdGhlIGJhcnljZW50cmljIGNvb3JkaW5hdGVzIG9mIHRoZSBwcm9qZWN0ZWQgcG9pbnQgd2l0aGluIHRoZSBmaXJzdFxuICAgICAgICAvLyB0cmlhbmdsZSBvZiB0aGUgZmFjZSwgdXNpbmcgb25seSB0aGUgeHkgcGxhbmUuIEl0IGRvZXNuJ3QgbWF0dGVyIGlmIHRoZVxuICAgICAgICAvLyBwb2ludCBpcyBvdXRzaWRlIHRoZSBmaXJzdCB0cmlhbmdsZSBiZWNhdXNlIGFsbCB0aGUgdHJpYW5nbGVzIGluIHRoZSBmYWNlXG4gICAgICAgIC8vIGFyZSBpbiB0aGUgc2FtZSBwbGFuZS5cbiAgICAgICAgY29uc3QgYSA9IHByb2plY3RlZEZhY2VbMF07XG4gICAgICAgIGNvbnN0IGIgPSBwcm9qZWN0ZWRGYWNlWzFdO1xuICAgICAgICBjb25zdCBjID0gcHJvamVjdGVkRmFjZVszXTtcbiAgICAgICAgY29uc3QgcCA9IHByb2plY3RlZFF1ZXJ5R2VvbWV0cnlbMF07XG5cbiAgICAgICAgY29uc3QgYWIgPSBiLnN1YihhKTtcbiAgICAgICAgY29uc3QgYWMgPSBjLnN1YihhKTtcbiAgICAgICAgY29uc3QgYXAgPSBwLnN1YihhKTtcblxuICAgICAgICBjb25zdCBkb3RBQkFCID0gZG90KGFiLCBhYik7XG4gICAgICAgIGNvbnN0IGRvdEFCQUMgPSBkb3QoYWIsIGFjKTtcbiAgICAgICAgY29uc3QgZG90QUNBQyA9IGRvdChhYywgYWMpO1xuICAgICAgICBjb25zdCBkb3RBUEFCID0gZG90KGFwLCBhYik7XG4gICAgICAgIGNvbnN0IGRvdEFQQUMgPSBkb3QoYXAsIGFjKTtcbiAgICAgICAgY29uc3QgZGVub20gPSBkb3RBQkFCICogZG90QUNBQyAtIGRvdEFCQUMgKiBkb3RBQkFDO1xuICAgICAgICBjb25zdCB2ID0gKGRvdEFDQUMgKiBkb3RBUEFCIC0gZG90QUJBQyAqIGRvdEFQQUMpIC8gZGVub207XG4gICAgICAgIGNvbnN0IHcgPSAoZG90QUJBQiAqIGRvdEFQQUMgLSBkb3RBQkFDICogZG90QVBBQikgLyBkZW5vbTtcbiAgICAgICAgY29uc3QgdSA9IDEgLSB2IC0gdztcblxuICAgICAgICAvLyBVc2UgdGhlIGJhcnljZW50cmljIHdlaWdodGluZyBhbG9uZyB3aXRoIHRoZSBvcmlnaW5hbCB0cmlhbmdsZSB6IGNvb3JkaW5hdGVzIHRvIGdldCB0aGUgcG9pbnQgb2YgaW50ZXJzZWN0aW9uLlxuICAgICAgICByZXR1cm4gYS56ICogdSArIGIueiAqIHYgKyBjLnogKiB3O1xuXG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVGhlIGNvdW50cyBhcyBjbG9zZXN0IGlzIGxlc3MgY2xlYXIgd2hlbiB0aGUgcXVlcnkgaXMgYSBib3guIFRoaXNcbiAgICAgICAgLy8gcmV0dXJucyB0aGUgZGlzdGFuY2UgdG8gdGhlIG5lYXJlc3QgcG9pbnQgb24gdGhlIGZhY2UsIHdoZXRoZXIgaXQgaXNcbiAgICAgICAgLy8gd2l0aGluIHRoZSBxdWVyeSBvciBub3QuIEl0IGNvdWxkIGJlIG1vcmUgY29ycmVjdCB0byByZXR1cm4gdGhlXG4gICAgICAgIC8vIGRpc3RhbmNlIHRvIHRoZSBjbG9zZXN0IHBvaW50IHdpdGhpbiB0aGUgcXVlcnkgYm94IGJ1dCB0aGlzIHdvdWxkIGJlXG4gICAgICAgIC8vIG1vcmUgY29tcGxpY2F0ZWQgYW5kIGV4cGVuc2l2ZSB0byBjYWxjdWxhdGUgd2l0aCBsaXR0bGUgYmVuZWZpdC5cbiAgICAgICAgbGV0IGNsb3Nlc3REaXN0YW5jZSA9IEluZmluaXR5O1xuICAgICAgICBmb3IgKGNvbnN0IHAgb2YgcHJvamVjdGVkRmFjZSkge1xuICAgICAgICAgICAgY2xvc2VzdERpc3RhbmNlID0gTWF0aC5taW4oY2xvc2VzdERpc3RhbmNlLCBwLnopO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjbG9zZXN0RGlzdGFuY2U7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBjaGVja0ludGVyc2VjdGlvbihwcm9qZWN0ZWRCYXNlOiBBcnJheTxQb2ludD4sIHByb2plY3RlZFRvcDogQXJyYXk8UG9pbnQ+LCBwcm9qZWN0ZWRRdWVyeUdlb21ldHJ5OiBBcnJheTxQb2ludD4pIHtcbiAgICBsZXQgY2xvc2VzdERpc3RhbmNlID0gSW5maW5pdHk7XG5cbiAgICBpZiAocG9seWdvbkludGVyc2VjdHNNdWx0aVBvbHlnb24ocHJvamVjdGVkUXVlcnlHZW9tZXRyeSwgcHJvamVjdGVkVG9wKSkge1xuICAgICAgICBjbG9zZXN0RGlzdGFuY2UgPSBnZXRJbnRlcnNlY3Rpb25EaXN0YW5jZShwcm9qZWN0ZWRRdWVyeUdlb21ldHJ5LCBwcm9qZWN0ZWRUb3BbMF0pO1xuICAgIH1cblxuICAgIGZvciAobGV0IHIgPSAwOyByIDwgcHJvamVjdGVkVG9wLmxlbmd0aDsgcisrKSB7XG4gICAgICAgIGNvbnN0IHJpbmdUb3AgPSBwcm9qZWN0ZWRUb3Bbcl07XG4gICAgICAgIGNvbnN0IHJpbmdCYXNlID0gcHJvamVjdGVkQmFzZVtyXTtcbiAgICAgICAgZm9yIChsZXQgcCA9IDA7IHAgPCByaW5nVG9wLmxlbmd0aCAtIDE7IHArKykge1xuICAgICAgICAgICAgY29uc3QgdG9wQSA9IHJpbmdUb3BbcF07XG4gICAgICAgICAgICBjb25zdCB0b3BCID0gcmluZ1RvcFtwICsgMV07XG4gICAgICAgICAgICBjb25zdCBiYXNlQSA9IHJpbmdCYXNlW3BdO1xuICAgICAgICAgICAgY29uc3QgYmFzZUIgPSByaW5nQmFzZVtwICsgMV07XG4gICAgICAgICAgICBjb25zdCBmYWNlID0gW3RvcEEsIHRvcEIsIGJhc2VCLCBiYXNlQSwgdG9wQV07XG4gICAgICAgICAgICBpZiAocG9seWdvbkludGVyc2VjdHNQb2x5Z29uKHByb2plY3RlZFF1ZXJ5R2VvbWV0cnksIGZhY2UpKSB7XG4gICAgICAgICAgICAgICAgY2xvc2VzdERpc3RhbmNlID0gTWF0aC5taW4oY2xvc2VzdERpc3RhbmNlLCBnZXRJbnRlcnNlY3Rpb25EaXN0YW5jZShwcm9qZWN0ZWRRdWVyeUdlb21ldHJ5LCBmYWNlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY2xvc2VzdERpc3RhbmNlID09PSBJbmZpbml0eSA/IGZhbHNlIDogY2xvc2VzdERpc3RhbmNlO1xufVxuXG4vKlxuICogUHJvamVjdCB0aGUgZ2VvbWV0cnkgdXNpbmcgbWF0cml4IGBtYC4gVGhpcyBpcyBlc3NlbnRpYWxseSBkb2luZ1xuICogYHZlYzQudHJhbnNmb3JtTWF0NChbXSwgW3AueCwgcC55LCB6LCAxXSwgbSlgIGJ1dCB0aGUgbXVsdGlwbGljYXRpb25cbiAqIGlzIGlubGluZWQgc28gdGhhdCBwYXJ0cyBvZiB0aGUgcHJvamVjdGlvbiB0aGF0IGFyZSB0aGUgc2FtZSBhY3Jvc3NcbiAqIGRpZmZlcmVudCBwb2ludHMgY2FuIG9ubHkgYmUgZG9uZSBvbmNlLiBUaGlzIHByb2R1Y2VkIGEgbWVhc3VyYWJsZVxuICogcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQuXG4gKi9cbmZ1bmN0aW9uIHByb2plY3RFeHRydXNpb24oZ2VvbWV0cnk6IEFycmF5PEFycmF5PFBvaW50Pj4sIHpCYXNlOiBudW1iZXIsIHpUb3A6IG51bWJlciwgbTogRmxvYXQzMkFycmF5KSB7XG4gICAgY29uc3QgcHJvamVjdGVkQmFzZSA9IFtdO1xuICAgIGNvbnN0IHByb2plY3RlZFRvcCA9IFtdO1xuXG4gICAgY29uc3QgYmFzZVhaID0gbVs4XSAqIHpCYXNlO1xuICAgIGNvbnN0IGJhc2VZWiA9IG1bOV0gKiB6QmFzZTtcbiAgICBjb25zdCBiYXNlWlogPSBtWzEwXSAqIHpCYXNlO1xuICAgIGNvbnN0IGJhc2VXWiA9IG1bMTFdICogekJhc2U7XG4gICAgY29uc3QgdG9wWFogPSBtWzhdICogelRvcDtcbiAgICBjb25zdCB0b3BZWiA9IG1bOV0gKiB6VG9wO1xuICAgIGNvbnN0IHRvcFpaID0gbVsxMF0gKiB6VG9wO1xuICAgIGNvbnN0IHRvcFdaID0gbVsxMV0gKiB6VG9wO1xuXG4gICAgZm9yIChjb25zdCByIG9mIGdlb21ldHJ5KSB7XG4gICAgICAgIGNvbnN0IHJpbmdCYXNlID0gW107XG4gICAgICAgIGNvbnN0IHJpbmdUb3AgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBwIG9mIHIpIHtcbiAgICAgICAgICAgIGNvbnN0IHggPSBwLng7XG4gICAgICAgICAgICBjb25zdCB5ID0gcC55O1xuXG4gICAgICAgICAgICBjb25zdCBzWCA9IG1bMF0gKiB4ICsgbVs0XSAqIHkgKyBtWzEyXTtcbiAgICAgICAgICAgIGNvbnN0IHNZID0gbVsxXSAqIHggKyBtWzVdICogeSArIG1bMTNdO1xuICAgICAgICAgICAgY29uc3Qgc1ogPSBtWzJdICogeCArIG1bNl0gKiB5ICsgbVsxNF07XG4gICAgICAgICAgICBjb25zdCBzVyA9IG1bM10gKiB4ICsgbVs3XSAqIHkgKyBtWzE1XTtcblxuICAgICAgICAgICAgY29uc3QgYmFzZVggPSBzWCArIGJhc2VYWjtcbiAgICAgICAgICAgIGNvbnN0IGJhc2VZID0gc1kgKyBiYXNlWVo7XG4gICAgICAgICAgICBjb25zdCBiYXNlWiA9IHNaICsgYmFzZVpaO1xuICAgICAgICAgICAgY29uc3QgYmFzZVcgPSBzVyArIGJhc2VXWjtcblxuICAgICAgICAgICAgY29uc3QgdG9wWCA9IHNYICsgdG9wWFo7XG4gICAgICAgICAgICBjb25zdCB0b3BZID0gc1kgKyB0b3BZWjtcbiAgICAgICAgICAgIGNvbnN0IHRvcFogPSBzWiArIHRvcFpaO1xuICAgICAgICAgICAgY29uc3QgdG9wVyA9IHNXICsgdG9wV1o7XG5cbiAgICAgICAgICAgIGNvbnN0IGIgPSBuZXcgUG9pbnQoYmFzZVggLyBiYXNlVywgYmFzZVkgLyBiYXNlVyk7XG4gICAgICAgICAgICBiLnogPSBiYXNlWiAvIGJhc2VXO1xuICAgICAgICAgICAgcmluZ0Jhc2UucHVzaChiKTtcblxuICAgICAgICAgICAgY29uc3QgdCA9IG5ldyBQb2ludCh0b3BYIC8gdG9wVywgdG9wWSAvIHRvcFcpO1xuICAgICAgICAgICAgdC56ID0gdG9wWiAvIHRvcFc7XG4gICAgICAgICAgICByaW5nVG9wLnB1c2godCk7XG4gICAgICAgIH1cbiAgICAgICAgcHJvamVjdGVkQmFzZS5wdXNoKHJpbmdCYXNlKTtcbiAgICAgICAgcHJvamVjdGVkVG9wLnB1c2gocmluZ1RvcCk7XG4gICAgfVxuICAgIHJldHVybiBbcHJvamVjdGVkQmFzZSwgcHJvamVjdGVkVG9wXTtcbn1cblxuZnVuY3Rpb24gcHJvamVjdFF1ZXJ5R2VvbWV0cnkocXVlcnlHZW9tZXRyeTogQXJyYXk8UG9pbnQ+LCBwaXhlbFBvc01hdHJpeDogRmxvYXQzMkFycmF5LCB0cmFuc2Zvcm06IFRyYW5zZm9ybSwgejogbnVtYmVyKSB7XG4gICAgY29uc3QgcHJvamVjdGVkUXVlcnlHZW9tZXRyeSA9IFtdO1xuICAgIGZvciAoY29uc3QgcCBvZiBxdWVyeUdlb21ldHJ5KSB7XG4gICAgICAgIGNvbnN0IHYgPSBbcC54LCBwLnksIHosIDFdO1xuICAgICAgICB2ZWM0LnRyYW5zZm9ybU1hdDQodiwgdiwgcGl4ZWxQb3NNYXRyaXgpO1xuICAgICAgICBwcm9qZWN0ZWRRdWVyeUdlb21ldHJ5LnB1c2gobmV3IFBvaW50KHZbMF0gLyB2WzNdLCB2WzFdIC8gdlszXSkpO1xuICAgIH1cbiAgICByZXR1cm4gcHJvamVjdGVkUXVlcnlHZW9tZXRyeTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgRmlsbEV4dHJ1c2lvblN0eWxlTGF5ZXI7XG4iLCIvLyBAZmxvd1xuaW1wb3J0IHsgY3JlYXRlTGF5b3V0IH0gZnJvbSAnLi4vLi4vdXRpbC9zdHJ1Y3RfYXJyYXknO1xuXG5jb25zdCBsaW5lTGF5b3V0QXR0cmlidXRlcyA9IGNyZWF0ZUxheW91dChbXG4gICAge25hbWU6ICdhX3Bvc19ub3JtYWwnLCBjb21wb25lbnRzOiA0LCB0eXBlOiAnSW50MTYnfSxcbiAgICB7bmFtZTogJ2FfZGF0YScsIGNvbXBvbmVudHM6IDQsIHR5cGU6ICdVaW50OCd9XG5dLCA0KTtcblxuZXhwb3J0IGRlZmF1bHQgbGluZUxheW91dEF0dHJpYnV0ZXM7XG5leHBvcnQgY29uc3Qge21lbWJlcnMsIHNpemUsIGFsaWdubWVudH0gPSBsaW5lTGF5b3V0QXR0cmlidXRlcztcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7IExpbmVMYXlvdXRBcnJheSB9IGZyb20gJy4uL2FycmF5X3R5cGVzJztcblxuaW1wb3J0IHsgbWVtYmVycyBhcyBsYXlvdXRBdHRyaWJ1dGVzIH0gZnJvbSAnLi9saW5lX2F0dHJpYnV0ZXMnO1xuaW1wb3J0IFNlZ21lbnRWZWN0b3IgZnJvbSAnLi4vc2VnbWVudCc7XG5pbXBvcnQgeyBQcm9ncmFtQ29uZmlndXJhdGlvblNldCB9IGZyb20gJy4uL3Byb2dyYW1fY29uZmlndXJhdGlvbic7XG5pbXBvcnQgeyBUcmlhbmdsZUluZGV4QXJyYXkgfSBmcm9tICcuLi9pbmRleF9hcnJheV90eXBlJztcbmltcG9ydCBFWFRFTlQgZnJvbSAnLi4vZXh0ZW50JztcbmltcG9ydCBtdnQgZnJvbSAnQG1hcGJveC92ZWN0b3ItdGlsZSc7XG5jb25zdCB2ZWN0b3JUaWxlRmVhdHVyZVR5cGVzID0gbXZ0LlZlY3RvclRpbGVGZWF0dXJlLnR5cGVzO1xuaW1wb3J0IHsgcmVnaXN0ZXIgfSBmcm9tICcuLi8uLi91dGlsL3dlYl93b3JrZXJfdHJhbnNmZXInO1xuaW1wb3J0IHtoYXNQYXR0ZXJuLCBhZGRQYXR0ZXJuRGVwZW5kZW5jaWVzfSBmcm9tICcuL3BhdHRlcm5fYnVja2V0X2ZlYXR1cmVzJztcbmltcG9ydCBsb2FkR2VvbWV0cnkgZnJvbSAnLi4vbG9hZF9nZW9tZXRyeSc7XG5pbXBvcnQgRXZhbHVhdGlvblBhcmFtZXRlcnMgZnJvbSAnLi4vLi4vc3R5bGUvZXZhbHVhdGlvbl9wYXJhbWV0ZXJzJztcblxuaW1wb3J0IHR5cGUge1xuICAgIEJ1Y2tldCxcbiAgICBCdWNrZXRQYXJhbWV0ZXJzLFxuICAgIEJ1Y2tldEZlYXR1cmUsXG4gICAgSW5kZXhlZEZlYXR1cmUsXG4gICAgUG9wdWxhdGVQYXJhbWV0ZXJzXG59IGZyb20gJy4uL2J1Y2tldCc7XG5pbXBvcnQgdHlwZSBMaW5lU3R5bGVMYXllciBmcm9tICcuLi8uLi9zdHlsZS9zdHlsZV9sYXllci9saW5lX3N0eWxlX2xheWVyJztcbmltcG9ydCB0eXBlIFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuaW1wb3J0IHR5cGUge1NlZ21lbnR9IGZyb20gJy4uL3NlZ21lbnQnO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tICcuLi8uLi9nbC9jb250ZXh0JztcbmltcG9ydCB0eXBlIEluZGV4QnVmZmVyIGZyb20gJy4uLy4uL2dsL2luZGV4X2J1ZmZlcic7XG5pbXBvcnQgdHlwZSBWZXJ0ZXhCdWZmZXIgZnJvbSAnLi4vLi4vZ2wvdmVydGV4X2J1ZmZlcic7XG5pbXBvcnQgdHlwZSB7RmVhdHVyZVN0YXRlc30gZnJvbSAnLi4vLi4vc291cmNlL3NvdXJjZV9zdGF0ZSc7XG5pbXBvcnQgdHlwZSB7SW1hZ2VQb3NpdGlvbn0gZnJvbSAnLi4vLi4vcmVuZGVyL2ltYWdlX2F0bGFzJztcblxuLy8gTk9URSBPTiBFWFRSVURFIFNDQUxFOlxuLy8gc2NhbGUgdGhlIGV4dHJ1c2lvbiB2ZWN0b3Igc28gdGhhdCB0aGUgbm9ybWFsIGxlbmd0aCBpcyB0aGlzIHZhbHVlLlxuLy8gY29udGFpbnMgdGhlIFwidGV4dHVyZVwiIG5vcm1hbHMgKC0xLi4xKS4gdGhpcyBpcyBkaXN0aW5jdCBmcm9tIHRoZSBleHRydWRlXG4vLyBub3JtYWxzIGZvciBsaW5lIGpvaW5zLCBiZWNhdXNlIHRoZSB4LXZhbHVlIHJlbWFpbnMgMCBmb3IgdGhlIHRleHR1cmVcbi8vIG5vcm1hbCBhcnJheSwgd2hpbGUgdGhlIGV4dHJ1ZGUgbm9ybWFsIGFjdHVhbGx5IG1vdmVzIHRoZSB2ZXJ0ZXggdG8gY3JlYXRlXG4vLyB0aGUgYWN1dGUvYmV2ZWxsZWQgbGluZSBqb2luLlxuY29uc3QgRVhUUlVERV9TQ0FMRSA9IDYzO1xuXG4vKlxuICogU2hhcnAgY29ybmVycyBjYXVzZSBkYXNoZWQgbGluZXMgdG8gdGlsdCBiZWNhdXNlIHRoZSBkaXN0YW5jZSBhbG9uZyB0aGUgbGluZVxuICogaXMgdGhlIHNhbWUgYXQgYm90aCB0aGUgaW5uZXIgYW5kIG91dGVyIGNvcm5lcnMuIFRvIGltcHJvdmUgdGhlIGFwcGVhcmFuY2Ugb2ZcbiAqIGRhc2hlZCBsaW5lcyB3ZSBhZGQgZXh0cmEgcG9pbnRzIG5lYXIgc2hhcnAgY29ybmVycyBzbyB0aGF0IGEgc21hbGxlciBwYXJ0XG4gKiBvZiB0aGUgbGluZSBpcyB0aWx0ZWQuXG4gKlxuICogQ09TX0hBTEZfU0hBUlBfQ09STkVSIGNvbnRyb2xzIGhvdyBzaGFycCBhIGNvcm5lciBoYXMgdG8gYmUgZm9yIHVzIHRvIGFkZCBhblxuICogZXh0cmEgdmVydGV4LiBUaGUgZGVmYXVsdCBpcyA3NSBkZWdyZWVzLlxuICpcbiAqIFRoZSBuZXdseSBjcmVhdGVkIHZlcnRpY2VzIGFyZSBwbGFjZWQgU0hBUlBfQ09STkVSX09GRlNFVCBwaXhlbHMgZnJvbSB0aGUgY29ybmVyLlxuICovXG5jb25zdCBDT1NfSEFMRl9TSEFSUF9DT1JORVIgPSBNYXRoLmNvcyg3NSAvIDIgKiAoTWF0aC5QSSAvIDE4MCkpO1xuY29uc3QgU0hBUlBfQ09STkVSX09GRlNFVCA9IDE1O1xuXG4vLyBUaGUgbnVtYmVyIG9mIGJpdHMgdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSBsaW5lIGRpc3RhbmNlIGluIHRoZSBidWZmZXIuXG5jb25zdCBMSU5FX0RJU1RBTkNFX0JVRkZFUl9CSVRTID0gMTU7XG5cbi8vIFdlIGRvbid0IGhhdmUgZW5vdWdoIGJpdHMgZm9yIHRoZSBsaW5lIGRpc3RhbmNlIGFzIHdlJ2QgbGlrZSB0byBoYXZlLCBzb1xuLy8gdXNlIHRoaXMgdmFsdWUgdG8gc2NhbGUgdGhlIGxpbmUgZGlzdGFuY2UgKGluIHRpbGUgdW5pdHMpIGRvd24gdG8gYSBzbWFsbGVyXG4vLyB2YWx1ZS4gVGhpcyBsZXRzIHVzIHN0b3JlIGxvbmdlciBkaXN0YW5jZXMgd2hpbGUgc2FjcmlmaWNpbmcgcHJlY2lzaW9uLlxuY29uc3QgTElORV9ESVNUQU5DRV9TQ0FMRSA9IDEgLyAyO1xuXG4vLyBUaGUgbWF4aW11bSBsaW5lIGRpc3RhbmNlLCBpbiB0aWxlIHVuaXRzLCB0aGF0IGZpdHMgaW4gdGhlIGJ1ZmZlci5cbmNvbnN0IE1BWF9MSU5FX0RJU1RBTkNFID0gTWF0aC5wb3coMiwgTElORV9ESVNUQU5DRV9CVUZGRVJfQklUUyAtIDEpIC8gTElORV9ESVNUQU5DRV9TQ0FMRTtcblxuZnVuY3Rpb24gYWRkTGluZVZlcnRleChsYXlvdXRWZXJ0ZXhCdWZmZXIsIHBvaW50OiBQb2ludCwgZXh0cnVkZTogUG9pbnQsIHJvdW5kOiBib29sZWFuLCB1cDogYm9vbGVhbiwgZGlyOiBudW1iZXIsIGxpbmVzb2ZhcjogbnVtYmVyKSB7XG4gICAgbGF5b3V0VmVydGV4QnVmZmVyLmVtcGxhY2VCYWNrKFxuICAgICAgICAvLyBhX3Bvc19ub3JtYWxcbiAgICAgICAgcG9pbnQueCxcbiAgICAgICAgcG9pbnQueSxcbiAgICAgICAgcm91bmQgPyAxIDogMCxcbiAgICAgICAgdXAgPyAxIDogLTEsXG4gICAgICAgIC8vIGFfZGF0YVxuICAgICAgICAvLyBhZGQgMTI4IHRvIHN0b3JlIGEgYnl0ZSBpbiBhbiB1bnNpZ25lZCBieXRlXG4gICAgICAgIE1hdGgucm91bmQoRVhUUlVERV9TQ0FMRSAqIGV4dHJ1ZGUueCkgKyAxMjgsXG4gICAgICAgIE1hdGgucm91bmQoRVhUUlVERV9TQ0FMRSAqIGV4dHJ1ZGUueSkgKyAxMjgsXG4gICAgICAgIC8vIEVuY29kZSB0aGUgLTEvMC8xIGRpcmVjdGlvbiB2YWx1ZSBpbnRvIHRoZSBmaXJzdCB0d28gYml0cyBvZiAueiBvZiBhX2RhdGEuXG4gICAgICAgIC8vIENvbWJpbmUgaXQgd2l0aCB0aGUgbG93ZXIgNiBiaXRzIG9mIGBsaW5lc29mYXJgIChzaGlmdGVkIGJ5IDIgYml0ZXMgdG8gbWFrZVxuICAgICAgICAvLyByb29tIGZvciB0aGUgZGlyZWN0aW9uIHZhbHVlKS4gVGhlIHVwcGVyIDggYml0cyBvZiBgbGluZXNvZmFyYCBhcmUgcGxhY2VkIGluXG4gICAgICAgIC8vIHRoZSBgd2AgY29tcG9uZW50LiBgbGluZXNvZmFyYCBpcyBzY2FsZWQgZG93biBieSBgTElORV9ESVNUQU5DRV9TQ0FMRWAgc28gdGhhdFxuICAgICAgICAvLyB3ZSBjYW4gc3RvcmUgbG9uZ2VyIGRpc3RhbmNlcyB3aGlsZSBzYWNyaWZpY2luZyBwcmVjaXNpb24uXG4gICAgICAgICgoZGlyID09PSAwID8gMCA6IChkaXIgPCAwID8gLTEgOiAxKSkgKyAxKSB8ICgoKGxpbmVzb2ZhciAqIExJTkVfRElTVEFOQ0VfU0NBTEUpICYgMHgzRikgPDwgMiksXG4gICAgICAgIChsaW5lc29mYXIgKiBMSU5FX0RJU1RBTkNFX1NDQUxFKSA+PiA2KTtcbn1cblxuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIExpbmVCdWNrZXQgaW1wbGVtZW50cyBCdWNrZXQge1xuICAgIGRpc3RhbmNlOiBudW1iZXI7XG4gICAgZTE6IG51bWJlcjtcbiAgICBlMjogbnVtYmVyO1xuICAgIGUzOiBudW1iZXI7XG5cbiAgICBpbmRleDogbnVtYmVyO1xuICAgIHpvb206IG51bWJlcjtcbiAgICBvdmVyc2NhbGluZzogbnVtYmVyO1xuICAgIGxheWVyczogQXJyYXk8TGluZVN0eWxlTGF5ZXI+O1xuICAgIGxheWVySWRzOiBBcnJheTxzdHJpbmc+O1xuICAgIHN0YXRlRGVwZW5kZW50TGF5ZXJzOiBBcnJheTxhbnk+O1xuICAgIHN0YXRlRGVwZW5kZW50TGF5ZXJJZHM6IEFycmF5PHN0cmluZz47XG4gICAgZmVhdHVyZXM6IEFycmF5PEJ1Y2tldEZlYXR1cmU+O1xuXG4gICAgbGF5b3V0VmVydGV4QXJyYXk6IExpbmVMYXlvdXRBcnJheTtcbiAgICBsYXlvdXRWZXJ0ZXhCdWZmZXI6IFZlcnRleEJ1ZmZlcjtcblxuICAgIGluZGV4QXJyYXk6IFRyaWFuZ2xlSW5kZXhBcnJheTtcbiAgICBpbmRleEJ1ZmZlcjogSW5kZXhCdWZmZXI7XG5cbiAgICBoYXNQYXR0ZXJuOiBib29sZWFuO1xuICAgIHByb2dyYW1Db25maWd1cmF0aW9uczogUHJvZ3JhbUNvbmZpZ3VyYXRpb25TZXQ8TGluZVN0eWxlTGF5ZXI+O1xuICAgIHNlZ21lbnRzOiBTZWdtZW50VmVjdG9yO1xuICAgIHVwbG9hZGVkOiBib29sZWFuO1xuXG4gICAgY29uc3RydWN0b3Iob3B0aW9uczogQnVja2V0UGFyYW1ldGVyczxMaW5lU3R5bGVMYXllcj4pIHtcbiAgICAgICAgdGhpcy56b29tID0gb3B0aW9ucy56b29tO1xuICAgICAgICB0aGlzLm92ZXJzY2FsaW5nID0gb3B0aW9ucy5vdmVyc2NhbGluZztcbiAgICAgICAgdGhpcy5sYXllcnMgPSBvcHRpb25zLmxheWVycztcbiAgICAgICAgdGhpcy5sYXllcklkcyA9IHRoaXMubGF5ZXJzLm1hcChsYXllciA9PiBsYXllci5pZCk7XG4gICAgICAgIHRoaXMuaW5kZXggPSBvcHRpb25zLmluZGV4O1xuICAgICAgICB0aGlzLmZlYXR1cmVzID0gW107XG4gICAgICAgIHRoaXMuaGFzUGF0dGVybiA9IGZhbHNlO1xuXG4gICAgICAgIHRoaXMubGF5b3V0VmVydGV4QXJyYXkgPSBuZXcgTGluZUxheW91dEFycmF5KCk7XG4gICAgICAgIHRoaXMuaW5kZXhBcnJheSA9IG5ldyBUcmlhbmdsZUluZGV4QXJyYXkoKTtcbiAgICAgICAgdGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnMgPSBuZXcgUHJvZ3JhbUNvbmZpZ3VyYXRpb25TZXQobGF5b3V0QXR0cmlidXRlcywgb3B0aW9ucy5sYXllcnMsIG9wdGlvbnMuem9vbSk7XG4gICAgICAgIHRoaXMuc2VnbWVudHMgPSBuZXcgU2VnbWVudFZlY3RvcigpO1xuXG4gICAgICAgIHRoaXMuc3RhdGVEZXBlbmRlbnRMYXllcklkcyA9IHRoaXMubGF5ZXJzLmZpbHRlcigobCkgPT4gbC5pc1N0YXRlRGVwZW5kZW50KCkpLm1hcCgobCkgPT4gbC5pZCk7XG4gICAgfVxuXG4gICAgcG9wdWxhdGUoZmVhdHVyZXM6IEFycmF5PEluZGV4ZWRGZWF0dXJlPiwgb3B0aW9uczogUG9wdWxhdGVQYXJhbWV0ZXJzKSB7XG4gICAgICAgIHRoaXMuZmVhdHVyZXMgPSBbXTtcbiAgICAgICAgdGhpcy5oYXNQYXR0ZXJuID0gaGFzUGF0dGVybignbGluZScsIHRoaXMubGF5ZXJzLCBvcHRpb25zKTtcblxuICAgICAgICBmb3IgKGNvbnN0IHtmZWF0dXJlLCBpbmRleCwgc291cmNlTGF5ZXJJbmRleH0gb2YgZmVhdHVyZXMpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5sYXllcnNbMF0uX2ZlYXR1cmVGaWx0ZXIobmV3IEV2YWx1YXRpb25QYXJhbWV0ZXJzKHRoaXMuem9vbSksIGZlYXR1cmUpKSBjb250aW51ZTtcblxuICAgICAgICAgICAgY29uc3QgZ2VvbWV0cnkgPSBsb2FkR2VvbWV0cnkoZmVhdHVyZSk7XG5cbiAgICAgICAgICAgIGNvbnN0IHBhdHRlcm5GZWF0dXJlOiBCdWNrZXRGZWF0dXJlID0ge1xuICAgICAgICAgICAgICAgIHNvdXJjZUxheWVySW5kZXgsXG4gICAgICAgICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgICAgICAgZ2VvbWV0cnksXG4gICAgICAgICAgICAgICAgcHJvcGVydGllczogZmVhdHVyZS5wcm9wZXJ0aWVzLFxuICAgICAgICAgICAgICAgIHR5cGU6IGZlYXR1cmUudHlwZSxcbiAgICAgICAgICAgICAgICBwYXR0ZXJuczoge31cbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgZmVhdHVyZS5pZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBwYXR0ZXJuRmVhdHVyZS5pZCA9IGZlYXR1cmUuaWQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmhhc1BhdHRlcm4pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZlYXR1cmVzLnB1c2goYWRkUGF0dGVybkRlcGVuZGVuY2llcygnbGluZScsIHRoaXMubGF5ZXJzLCBwYXR0ZXJuRmVhdHVyZSwgdGhpcy56b29tLCBvcHRpb25zKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkRmVhdHVyZShwYXR0ZXJuRmVhdHVyZSwgZ2VvbWV0cnksIGluZGV4LCB7fSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG9wdGlvbnMuZmVhdHVyZUluZGV4Lmluc2VydChmZWF0dXJlLCBnZW9tZXRyeSwgaW5kZXgsIHNvdXJjZUxheWVySW5kZXgsIHRoaXMuaW5kZXgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdXBkYXRlKHN0YXRlczogRmVhdHVyZVN0YXRlcywgdnRMYXllcjogVmVjdG9yVGlsZUxheWVyLCBpbWFnZVBvc2l0aW9uczoge1tzdHJpbmddOiBJbWFnZVBvc2l0aW9ufSkge1xuICAgICAgICBpZiAoIXRoaXMuc3RhdGVEZXBlbmRlbnRMYXllcnMubGVuZ3RoKSByZXR1cm47XG4gICAgICAgIHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLnVwZGF0ZVBhaW50QXJyYXlzKHN0YXRlcywgdnRMYXllciwgdGhpcy5zdGF0ZURlcGVuZGVudExheWVycywgaW1hZ2VQb3NpdGlvbnMpO1xuICAgIH1cblxuICAgIGFkZEZlYXR1cmVzKG9wdGlvbnM6IFBvcHVsYXRlUGFyYW1ldGVycywgaW1hZ2VQb3NpdGlvbnM6IHtbc3RyaW5nXTogSW1hZ2VQb3NpdGlvbn0pIHtcbiAgICAgICAgZm9yIChjb25zdCBmZWF0dXJlIG9mIHRoaXMuZmVhdHVyZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHtnZW9tZXRyeX0gPSBmZWF0dXJlO1xuICAgICAgICAgICAgdGhpcy5hZGRGZWF0dXJlKGZlYXR1cmUsIGdlb21ldHJ5LCBmZWF0dXJlLmluZGV4LCBpbWFnZVBvc2l0aW9ucyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpc0VtcHR5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sYXlvdXRWZXJ0ZXhBcnJheS5sZW5ndGggPT09IDA7XG4gICAgfVxuXG4gICAgdXBsb2FkUGVuZGluZygpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLnVwbG9hZGVkIHx8IHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLm5lZWRzVXBsb2FkO1xuICAgIH1cblxuICAgIHVwbG9hZChjb250ZXh0OiBDb250ZXh0KSB7XG4gICAgICAgIGlmICghdGhpcy51cGxvYWRlZCkge1xuICAgICAgICAgICAgdGhpcy5sYXlvdXRWZXJ0ZXhCdWZmZXIgPSBjb250ZXh0LmNyZWF0ZVZlcnRleEJ1ZmZlcih0aGlzLmxheW91dFZlcnRleEFycmF5LCBsYXlvdXRBdHRyaWJ1dGVzKTtcbiAgICAgICAgICAgIHRoaXMuaW5kZXhCdWZmZXIgPSBjb250ZXh0LmNyZWF0ZUluZGV4QnVmZmVyKHRoaXMuaW5kZXhBcnJheSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnMudXBsb2FkKGNvbnRleHQpO1xuICAgICAgICB0aGlzLnVwbG9hZGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBpZiAoIXRoaXMubGF5b3V0VmVydGV4QnVmZmVyKSByZXR1cm47XG4gICAgICAgIHRoaXMubGF5b3V0VmVydGV4QnVmZmVyLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5pbmRleEJ1ZmZlci5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5zZWdtZW50cy5kZXN0cm95KCk7XG4gICAgfVxuXG4gICAgYWRkRmVhdHVyZShmZWF0dXJlOiBCdWNrZXRGZWF0dXJlLCBnZW9tZXRyeTogQXJyYXk8QXJyYXk8UG9pbnQ+PiwgaW5kZXg6IG51bWJlciwgaW1hZ2VQb3NpdGlvbnM6IHtbc3RyaW5nXTogSW1hZ2VQb3NpdGlvbn0pIHtcbiAgICAgICAgY29uc3QgbGF5b3V0ID0gdGhpcy5sYXllcnNbMF0ubGF5b3V0O1xuICAgICAgICBjb25zdCBqb2luID0gbGF5b3V0LmdldCgnbGluZS1qb2luJykuZXZhbHVhdGUoZmVhdHVyZSwge30pO1xuICAgICAgICBjb25zdCBjYXAgPSBsYXlvdXQuZ2V0KCdsaW5lLWNhcCcpO1xuICAgICAgICBjb25zdCBtaXRlckxpbWl0ID0gbGF5b3V0LmdldCgnbGluZS1taXRlci1saW1pdCcpO1xuICAgICAgICBjb25zdCByb3VuZExpbWl0ID0gbGF5b3V0LmdldCgnbGluZS1yb3VuZC1saW1pdCcpO1xuXG4gICAgICAgIGZvciAoY29uc3QgbGluZSBvZiBnZW9tZXRyeSkge1xuICAgICAgICAgICAgdGhpcy5hZGRMaW5lKGxpbmUsIGZlYXR1cmUsIGpvaW4sIGNhcCwgbWl0ZXJMaW1pdCwgcm91bmRMaW1pdCwgaW5kZXgsIGltYWdlUG9zaXRpb25zKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFkZExpbmUodmVydGljZXM6IEFycmF5PFBvaW50PiwgZmVhdHVyZTogQnVja2V0RmVhdHVyZSwgam9pbjogc3RyaW5nLCBjYXA6IHN0cmluZywgbWl0ZXJMaW1pdDogbnVtYmVyLCByb3VuZExpbWl0OiBudW1iZXIsIGluZGV4OiBudW1iZXIsIGltYWdlUG9zaXRpb25zOiB7W3N0cmluZ106IEltYWdlUG9zaXRpb259KSB7XG4gICAgICAgIGxldCBsaW5lRGlzdGFuY2VzID0gbnVsbDtcbiAgICAgICAgaWYgKCEhZmVhdHVyZS5wcm9wZXJ0aWVzICYmXG4gICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkoJ21hcGJveF9jbGlwX3N0YXJ0JykgJiZcbiAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eSgnbWFwYm94X2NsaXBfZW5kJykpIHtcbiAgICAgICAgICAgIGxpbmVEaXN0YW5jZXMgPSB7XG4gICAgICAgICAgICAgICAgc3RhcnQ6IGZlYXR1cmUucHJvcGVydGllcy5tYXBib3hfY2xpcF9zdGFydCxcbiAgICAgICAgICAgICAgICBlbmQ6IGZlYXR1cmUucHJvcGVydGllcy5tYXBib3hfY2xpcF9lbmQsXG4gICAgICAgICAgICAgICAgdGlsZVRvdGFsOiB1bmRlZmluZWRcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpc1BvbHlnb24gPSB2ZWN0b3JUaWxlRmVhdHVyZVR5cGVzW2ZlYXR1cmUudHlwZV0gPT09ICdQb2x5Z29uJztcblxuICAgICAgICAvLyBJZiB0aGUgbGluZSBoYXMgZHVwbGljYXRlIHZlcnRpY2VzIGF0IHRoZSBlbmRzLCBhZGp1c3Qgc3RhcnQvbGVuZ3RoIHRvIHJlbW92ZSB0aGVtLlxuICAgICAgICBsZXQgbGVuID0gdmVydGljZXMubGVuZ3RoO1xuICAgICAgICB3aGlsZSAobGVuID49IDIgJiYgdmVydGljZXNbbGVuIC0gMV0uZXF1YWxzKHZlcnRpY2VzW2xlbiAtIDJdKSkge1xuICAgICAgICAgICAgbGVuLS07XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGZpcnN0ID0gMDtcbiAgICAgICAgd2hpbGUgKGZpcnN0IDwgbGVuIC0gMSAmJiB2ZXJ0aWNlc1tmaXJzdF0uZXF1YWxzKHZlcnRpY2VzW2ZpcnN0ICsgMV0pKSB7XG4gICAgICAgICAgICBmaXJzdCsrO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWdub3JlIGludmFsaWQgZ2VvbWV0cnkuXG4gICAgICAgIGlmIChsZW4gPCAoaXNQb2x5Z29uID8gMyA6IDIpKSByZXR1cm47XG5cbiAgICAgICAgaWYgKGxpbmVEaXN0YW5jZXMpIHtcbiAgICAgICAgICAgIGxpbmVEaXN0YW5jZXMudGlsZVRvdGFsID0gY2FsY3VsYXRlRnVsbERpc3RhbmNlKHZlcnRpY2VzLCBmaXJzdCwgbGVuKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChqb2luID09PSAnYmV2ZWwnKSBtaXRlckxpbWl0ID0gMS4wNTtcblxuICAgICAgICBjb25zdCBzaGFycENvcm5lck9mZnNldCA9IFNIQVJQX0NPUk5FUl9PRkZTRVQgKiAoRVhURU5UIC8gKDUxMiAqIHRoaXMub3ZlcnNjYWxpbmcpKTtcblxuICAgICAgICBjb25zdCBmaXJzdFZlcnRleCA9IHZlcnRpY2VzW2ZpcnN0XTtcblxuICAgICAgICAvLyB3ZSBjb3VsZCBiZSBtb3JlIHByZWNpc2UsIGJ1dCBpdCB3b3VsZCBvbmx5IHNhdmUgYSBuZWdsaWdpYmxlIGFtb3VudCBvZiBzcGFjZVxuICAgICAgICBjb25zdCBzZWdtZW50ID0gdGhpcy5zZWdtZW50cy5wcmVwYXJlU2VnbWVudChsZW4gKiAxMCwgdGhpcy5sYXlvdXRWZXJ0ZXhBcnJheSwgdGhpcy5pbmRleEFycmF5KTtcblxuICAgICAgICB0aGlzLmRpc3RhbmNlID0gMDtcblxuICAgICAgICBjb25zdCBiZWdpbkNhcCA9IGNhcCxcbiAgICAgICAgICAgIGVuZENhcCA9IGlzUG9seWdvbiA/ICdidXR0JyA6IGNhcDtcbiAgICAgICAgbGV0IHN0YXJ0T2ZMaW5lID0gdHJ1ZTtcbiAgICAgICAgbGV0IGN1cnJlbnRWZXJ0ZXg7XG4gICAgICAgIGxldCBwcmV2VmVydGV4ID0gKCh1bmRlZmluZWQ6IGFueSk6IFBvaW50KTtcbiAgICAgICAgbGV0IG5leHRWZXJ0ZXggPSAoKHVuZGVmaW5lZDogYW55KTogUG9pbnQpO1xuICAgICAgICBsZXQgcHJldk5vcm1hbCA9ICgodW5kZWZpbmVkOiBhbnkpOiBQb2ludCk7XG4gICAgICAgIGxldCBuZXh0Tm9ybWFsID0gKCh1bmRlZmluZWQ6IGFueSk6IFBvaW50KTtcbiAgICAgICAgbGV0IG9mZnNldEE7XG4gICAgICAgIGxldCBvZmZzZXRCO1xuXG4gICAgICAgIC8vIHRoZSBsYXN0IHRocmVlIHZlcnRpY2VzIGFkZGVkXG4gICAgICAgIHRoaXMuZTEgPSB0aGlzLmUyID0gdGhpcy5lMyA9IC0xO1xuXG4gICAgICAgIGlmIChpc1BvbHlnb24pIHtcbiAgICAgICAgICAgIGN1cnJlbnRWZXJ0ZXggPSB2ZXJ0aWNlc1tsZW4gLSAyXTtcbiAgICAgICAgICAgIG5leHROb3JtYWwgPSBmaXJzdFZlcnRleC5zdWIoY3VycmVudFZlcnRleCkuX3VuaXQoKS5fcGVycCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IGZpcnN0OyBpIDwgbGVuOyBpKyspIHtcblxuICAgICAgICAgICAgbmV4dFZlcnRleCA9IGlzUG9seWdvbiAmJiBpID09PSBsZW4gLSAxID9cbiAgICAgICAgICAgICAgICB2ZXJ0aWNlc1tmaXJzdCArIDFdIDogLy8gaWYgdGhlIGxpbmUgaXMgY2xvc2VkLCB3ZSB0cmVhdCB0aGUgbGFzdCB2ZXJ0ZXggbGlrZSB0aGUgZmlyc3RcbiAgICAgICAgICAgICAgICB2ZXJ0aWNlc1tpICsgMV07IC8vIGp1c3QgdGhlIG5leHQgdmVydGV4XG5cbiAgICAgICAgICAgIC8vIGlmIHR3byBjb25zZWN1dGl2ZSB2ZXJ0aWNlcyBleGlzdCwgc2tpcCB0aGUgY3VycmVudCBvbmVcbiAgICAgICAgICAgIGlmIChuZXh0VmVydGV4ICYmIHZlcnRpY2VzW2ldLmVxdWFscyhuZXh0VmVydGV4KSkgY29udGludWU7XG5cbiAgICAgICAgICAgIGlmIChuZXh0Tm9ybWFsKSBwcmV2Tm9ybWFsID0gbmV4dE5vcm1hbDtcbiAgICAgICAgICAgIGlmIChjdXJyZW50VmVydGV4KSBwcmV2VmVydGV4ID0gY3VycmVudFZlcnRleDtcblxuICAgICAgICAgICAgY3VycmVudFZlcnRleCA9IHZlcnRpY2VzW2ldO1xuXG4gICAgICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIG5vcm1hbCB0b3dhcmRzIHRoZSBuZXh0IHZlcnRleCBpbiB0aGlzIGxpbmUuIEluIGNhc2VcbiAgICAgICAgICAgIC8vIHRoZXJlIGlzIG5vIG5leHQgdmVydGV4LCBwcmV0ZW5kIHRoYXQgdGhlIGxpbmUgaXMgY29udGludWluZyBzdHJhaWdodCxcbiAgICAgICAgICAgIC8vIG1lYW5pbmcgdGhhdCB3ZSBhcmUganVzdCB1c2luZyB0aGUgcHJldmlvdXMgbm9ybWFsLlxuICAgICAgICAgICAgbmV4dE5vcm1hbCA9IG5leHRWZXJ0ZXggPyBuZXh0VmVydGV4LnN1YihjdXJyZW50VmVydGV4KS5fdW5pdCgpLl9wZXJwKCkgOiBwcmV2Tm9ybWFsO1xuXG4gICAgICAgICAgICAvLyBJZiB3ZSBzdGlsbCBkb24ndCBoYXZlIGEgcHJldmlvdXMgbm9ybWFsLCB0aGlzIGlzIHRoZSBiZWdpbm5pbmcgb2YgYVxuICAgICAgICAgICAgLy8gbm9uLWNsb3NlZCBsaW5lLCBzbyB3ZSdyZSBkb2luZyBhIHN0cmFpZ2h0IFwiam9pblwiLlxuICAgICAgICAgICAgcHJldk5vcm1hbCA9IHByZXZOb3JtYWwgfHwgbmV4dE5vcm1hbDtcblxuICAgICAgICAgICAgLy8gRGV0ZXJtaW5lIHRoZSBub3JtYWwgb2YgdGhlIGpvaW4gZXh0cnVzaW9uLiBJdCBpcyB0aGUgYW5nbGUgYmlzZWN0b3JcbiAgICAgICAgICAgIC8vIG9mIHRoZSBzZWdtZW50cyBiZXR3ZWVuIHRoZSBwcmV2aW91cyBsaW5lIGFuZCB0aGUgbmV4dCBsaW5lLlxuICAgICAgICAgICAgLy8gSW4gdGhlIGNhc2Ugb2YgMTgww4LCsCBhbmdsZXMsIHRoZSBwcmV2IGFuZCBuZXh0IG5vcm1hbHMgY2FuY2VsIGVhY2ggb3RoZXIgb3V0OlxuICAgICAgICAgICAgLy8gcHJldk5vcm1hbCArIG5leHROb3JtYWwgPSAoMCwgMCksIGl0cyBtYWduaXR1ZGUgaXMgMCwgc28gdGhlIHVuaXQgdmVjdG9yIHdvdWxkIGJlXG4gICAgICAgICAgICAvLyB1bmRlZmluZWQuIEluIHRoYXQgY2FzZSwgd2UncmUga2VlcGluZyB0aGUgam9pbk5vcm1hbCBhdCAoMCwgMCksIHNvIHRoYXQgdGhlIGNvc0hhbGZBbmdsZVxuICAgICAgICAgICAgLy8gYmVsb3cgd2lsbCBhbHNvIGJlY29tZSAwIGFuZCBtaXRlckxlbmd0aCB3aWxsIGJlY29tZSBJbmZpbml0eS5cbiAgICAgICAgICAgIGxldCBqb2luTm9ybWFsID0gcHJldk5vcm1hbC5hZGQobmV4dE5vcm1hbCk7XG4gICAgICAgICAgICBpZiAoam9pbk5vcm1hbC54ICE9PSAwIHx8IGpvaW5Ob3JtYWwueSAhPT0gMCkge1xuICAgICAgICAgICAgICAgIGpvaW5Ob3JtYWwuX3VuaXQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8qICBqb2luTm9ybWFsICAgICBwcmV2Tm9ybWFsXG4gICAgICAgICAgICAgKiAgICAgICAgICAgICDDosKGwpYgICAgICDDosKGwpFcbiAgICAgICAgICAgICAqICAgICAgICAgICAgICAgIC5fX19fX19fXy4gcHJldlZlcnRleFxuICAgICAgICAgICAgICogICAgICAgICAgICAgICAgfFxuICAgICAgICAgICAgICogbmV4dE5vcm1hbCAgw6LChsKQICB8ICBjdXJyZW50VmVydGV4XG4gICAgICAgICAgICAgKiAgICAgICAgICAgICAgICB8XG4gICAgICAgICAgICAgKiAgICAgbmV4dFZlcnRleCAhXG4gICAgICAgICAgICAgKlxuICAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgbGVuZ3RoIG9mIHRoZSBtaXRlciAodGhlIHJhdGlvIG9mIHRoZSBtaXRlciB0byB0aGUgd2lkdGgpLlxuICAgICAgICAgICAgLy8gRmluZCB0aGUgY29zaW5lIG9mIHRoZSBhbmdsZSBiZXR3ZWVuIHRoZSBuZXh0IGFuZCBqb2luIG5vcm1hbHNcbiAgICAgICAgICAgIC8vIHVzaW5nIGRvdCBwcm9kdWN0LiBUaGUgaW52ZXJzZSBvZiB0aGF0IGlzIHRoZSBtaXRlciBsZW5ndGguXG4gICAgICAgICAgICBjb25zdCBjb3NIYWxmQW5nbGUgPSBqb2luTm9ybWFsLnggKiBuZXh0Tm9ybWFsLnggKyBqb2luTm9ybWFsLnkgKiBuZXh0Tm9ybWFsLnk7XG4gICAgICAgICAgICBjb25zdCBtaXRlckxlbmd0aCA9IGNvc0hhbGZBbmdsZSAhPT0gMCA/IDEgLyBjb3NIYWxmQW5nbGUgOiBJbmZpbml0eTtcblxuICAgICAgICAgICAgY29uc3QgaXNTaGFycENvcm5lciA9IGNvc0hhbGZBbmdsZSA8IENPU19IQUxGX1NIQVJQX0NPUk5FUiAmJiBwcmV2VmVydGV4ICYmIG5leHRWZXJ0ZXg7XG5cbiAgICAgICAgICAgIGlmIChpc1NoYXJwQ29ybmVyICYmIGkgPiBmaXJzdCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHByZXZTZWdtZW50TGVuZ3RoID0gY3VycmVudFZlcnRleC5kaXN0KHByZXZWZXJ0ZXgpO1xuICAgICAgICAgICAgICAgIGlmIChwcmV2U2VnbWVudExlbmd0aCA+IDIgKiBzaGFycENvcm5lck9mZnNldCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdQcmV2VmVydGV4ID0gY3VycmVudFZlcnRleC5zdWIoY3VycmVudFZlcnRleC5zdWIocHJldlZlcnRleCkuX211bHQoc2hhcnBDb3JuZXJPZmZzZXQgLyBwcmV2U2VnbWVudExlbmd0aCkuX3JvdW5kKCkpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3RhbmNlICs9IG5ld1ByZXZWZXJ0ZXguZGlzdChwcmV2VmVydGV4KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRDdXJyZW50VmVydGV4KG5ld1ByZXZWZXJ0ZXgsIHRoaXMuZGlzdGFuY2UsIHByZXZOb3JtYWwubXVsdCgxKSwgMCwgMCwgZmFsc2UsIHNlZ21lbnQsIGxpbmVEaXN0YW5jZXMpO1xuICAgICAgICAgICAgICAgICAgICBwcmV2VmVydGV4ID0gbmV3UHJldlZlcnRleDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFRoZSBqb2luIGlmIGEgbWlkZGxlIHZlcnRleCwgb3RoZXJ3aXNlIHRoZSBjYXAuXG4gICAgICAgICAgICBjb25zdCBtaWRkbGVWZXJ0ZXggPSBwcmV2VmVydGV4ICYmIG5leHRWZXJ0ZXg7XG4gICAgICAgICAgICBsZXQgY3VycmVudEpvaW4gPSBtaWRkbGVWZXJ0ZXggPyBqb2luIDogbmV4dFZlcnRleCA/IGJlZ2luQ2FwIDogZW5kQ2FwO1xuXG4gICAgICAgICAgICBpZiAobWlkZGxlVmVydGV4ICYmIGN1cnJlbnRKb2luID09PSAncm91bmQnKSB7XG4gICAgICAgICAgICAgICAgaWYgKG1pdGVyTGVuZ3RoIDwgcm91bmRMaW1pdCkge1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50Sm9pbiA9ICdtaXRlcic7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtaXRlckxlbmd0aCA8PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRKb2luID0gJ2Zha2Vyb3VuZCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY3VycmVudEpvaW4gPT09ICdtaXRlcicgJiYgbWl0ZXJMZW5ndGggPiBtaXRlckxpbWl0KSB7XG4gICAgICAgICAgICAgICAgY3VycmVudEpvaW4gPSAnYmV2ZWwnO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY3VycmVudEpvaW4gPT09ICdiZXZlbCcpIHtcbiAgICAgICAgICAgICAgICAvLyBUaGUgbWF4aW11bSBleHRydWRlIGxlbmd0aCBpcyAxMjggLyA2MyA9IDIgdGltZXMgdGhlIHdpZHRoIG9mIHRoZSBsaW5lXG4gICAgICAgICAgICAgICAgLy8gc28gaWYgbWl0ZXJMZW5ndGggPj0gMiB3ZSBuZWVkIHRvIGRyYXcgYSBkaWZmZXJlbnQgdHlwZSBvZiBiZXZlbCBoZXJlLlxuICAgICAgICAgICAgICAgIGlmIChtaXRlckxlbmd0aCA+IDIpIGN1cnJlbnRKb2luID0gJ2ZsaXBiZXZlbCc7XG5cbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgbWl0ZXJMZW5ndGggaXMgcmVhbGx5IHNtYWxsIGFuZCB0aGUgbGluZSBiZXZlbCB3b3VsZG4ndCBiZSB2aXNpYmxlLFxuICAgICAgICAgICAgICAgIC8vIGp1c3QgZHJhdyBhIG1pdGVyIGpvaW4gdG8gc2F2ZSBhIHRyaWFuZ2xlLlxuICAgICAgICAgICAgICAgIGlmIChtaXRlckxlbmd0aCA8IG1pdGVyTGltaXQpIGN1cnJlbnRKb2luID0gJ21pdGVyJztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIGhvdyBmYXIgYWxvbmcgdGhlIGxpbmUgdGhlIGN1cnJlbnRWZXJ0ZXggaXNcbiAgICAgICAgICAgIGlmIChwcmV2VmVydGV4KSB0aGlzLmRpc3RhbmNlICs9IGN1cnJlbnRWZXJ0ZXguZGlzdChwcmV2VmVydGV4KTtcblxuICAgICAgICAgICAgaWYgKGN1cnJlbnRKb2luID09PSAnbWl0ZXInKSB7XG5cbiAgICAgICAgICAgICAgICBqb2luTm9ybWFsLl9tdWx0KG1pdGVyTGVuZ3RoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEN1cnJlbnRWZXJ0ZXgoY3VycmVudFZlcnRleCwgdGhpcy5kaXN0YW5jZSwgam9pbk5vcm1hbCwgMCwgMCwgZmFsc2UsIHNlZ21lbnQsIGxpbmVEaXN0YW5jZXMpO1xuXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRKb2luID09PSAnZmxpcGJldmVsJykge1xuICAgICAgICAgICAgICAgIC8vIG1pdGVyIGlzIHRvbyBiaWcsIGZsaXAgdGhlIGRpcmVjdGlvbiB0byBtYWtlIGEgYmV2ZWxlZCBqb2luXG5cbiAgICAgICAgICAgICAgICBpZiAobWl0ZXJMZW5ndGggPiAxMDApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQWxtb3N0IHBhcmFsbGVsIGxpbmVzXG4gICAgICAgICAgICAgICAgICAgIGpvaW5Ob3JtYWwgPSBuZXh0Tm9ybWFsLmNsb25lKCkubXVsdCgtMSk7XG5cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkaXJlY3Rpb24gPSBwcmV2Tm9ybWFsLnggKiBuZXh0Tm9ybWFsLnkgLSBwcmV2Tm9ybWFsLnkgKiBuZXh0Tm9ybWFsLnggPiAwID8gLTEgOiAxO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBiZXZlbExlbmd0aCA9IG1pdGVyTGVuZ3RoICogcHJldk5vcm1hbC5hZGQobmV4dE5vcm1hbCkubWFnKCkgLyBwcmV2Tm9ybWFsLnN1YihuZXh0Tm9ybWFsKS5tYWcoKTtcbiAgICAgICAgICAgICAgICAgICAgam9pbk5vcm1hbC5fcGVycCgpLl9tdWx0KGJldmVsTGVuZ3RoICogZGlyZWN0aW9uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRDdXJyZW50VmVydGV4KGN1cnJlbnRWZXJ0ZXgsIHRoaXMuZGlzdGFuY2UsIGpvaW5Ob3JtYWwsIDAsIDAsIGZhbHNlLCBzZWdtZW50LCBsaW5lRGlzdGFuY2VzKTtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEN1cnJlbnRWZXJ0ZXgoY3VycmVudFZlcnRleCwgdGhpcy5kaXN0YW5jZSwgam9pbk5vcm1hbC5tdWx0KC0xKSwgMCwgMCwgZmFsc2UsIHNlZ21lbnQsIGxpbmVEaXN0YW5jZXMpO1xuXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRKb2luID09PSAnYmV2ZWwnIHx8IGN1cnJlbnRKb2luID09PSAnZmFrZXJvdW5kJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxpbmVUdXJuc0xlZnQgPSAocHJldk5vcm1hbC54ICogbmV4dE5vcm1hbC55IC0gcHJldk5vcm1hbC55ICogbmV4dE5vcm1hbC54KSA+IDA7XG4gICAgICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gLU1hdGguc3FydChtaXRlckxlbmd0aCAqIG1pdGVyTGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICAgICAgaWYgKGxpbmVUdXJuc0xlZnQpIHtcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0QiA9IDA7XG4gICAgICAgICAgICAgICAgICAgIG9mZnNldEEgPSBvZmZzZXQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0QSA9IDA7XG4gICAgICAgICAgICAgICAgICAgIG9mZnNldEIgPSBvZmZzZXQ7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gQ2xvc2UgcHJldmlvdXMgc2VnbWVudCB3aXRoIGEgYmV2ZWxcbiAgICAgICAgICAgICAgICBpZiAoIXN0YXJ0T2ZMaW5lKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkQ3VycmVudFZlcnRleChjdXJyZW50VmVydGV4LCB0aGlzLmRpc3RhbmNlLCBwcmV2Tm9ybWFsLCBvZmZzZXRBLCBvZmZzZXRCLCBmYWxzZSwgc2VnbWVudCwgbGluZURpc3RhbmNlcyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRKb2luID09PSAnZmFrZXJvdW5kJykge1xuICAgICAgICAgICAgICAgICAgICAvLyBUaGUgam9pbiBhbmdsZSBpcyBzaGFycCBlbm91Z2ggdGhhdCBhIHJvdW5kIGpvaW4gd291bGQgYmUgdmlzaWJsZS5cbiAgICAgICAgICAgICAgICAgICAgLy8gQmV2ZWwgam9pbnMgZmlsbCB0aGUgZ2FwIGJldHdlZW4gc2VnbWVudHMgd2l0aCBhIHNpbmdsZSBwaWUgc2xpY2UgdHJpYW5nbGUuXG4gICAgICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIHJvdW5kIGpvaW4gYnkgYWRkaW5nIG11bHRpcGxlIHBpZSBzbGljZXMuIFRoZSBqb2luIGlzbid0IGFjdHVhbGx5IHJvdW5kLCBidXRcbiAgICAgICAgICAgICAgICAgICAgLy8gaXQgbG9va3MgbGlrZSBpdCBpcyBhdCB0aGUgc2l6ZXMgd2UgcmVuZGVyIGxpbmVzIGF0LlxuXG4gICAgICAgICAgICAgICAgICAgIC8vIEFkZCBtb3JlIHRyaWFuZ2xlcyBmb3Igc2hhcnBlciBhbmdsZXMuXG4gICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgbWF0aCBpcyBqdXN0IGEgZ29vZCBlbm91Z2ggYXBwcm94aW1hdGlvbi4gSXQgaXNuJ3QgXCJjb3JyZWN0XCIuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG4gPSBNYXRoLmZsb29yKCgwLjUgLSAoY29zSGFsZkFuZ2xlIC0gMC41KSkgKiA4KTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFwcHJveEZyYWN0aW9uYWxKb2luTm9ybWFsO1xuXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IG0gPSAwOyBtIDwgbjsgbSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcHByb3hGcmFjdGlvbmFsSm9pbk5vcm1hbCA9IG5leHROb3JtYWwubXVsdCgobSArIDEpIC8gKG4gKyAxKSkuX2FkZChwcmV2Tm9ybWFsKS5fdW5pdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRQaWVTbGljZVZlcnRleChjdXJyZW50VmVydGV4LCB0aGlzLmRpc3RhbmNlLCBhcHByb3hGcmFjdGlvbmFsSm9pbk5vcm1hbCwgbGluZVR1cm5zTGVmdCwgc2VnbWVudCwgbGluZURpc3RhbmNlcyk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZFBpZVNsaWNlVmVydGV4KGN1cnJlbnRWZXJ0ZXgsIHRoaXMuZGlzdGFuY2UsIGpvaW5Ob3JtYWwsIGxpbmVUdXJuc0xlZnQsIHNlZ21lbnQsIGxpbmVEaXN0YW5jZXMpO1xuXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGsgPSBuIC0gMTsgayA+PSAwOyBrLS0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwcHJveEZyYWN0aW9uYWxKb2luTm9ybWFsID0gcHJldk5vcm1hbC5tdWx0KChrICsgMSkgLyAobiArIDEpKS5fYWRkKG5leHROb3JtYWwpLl91bml0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZFBpZVNsaWNlVmVydGV4KGN1cnJlbnRWZXJ0ZXgsIHRoaXMuZGlzdGFuY2UsIGFwcHJveEZyYWN0aW9uYWxKb2luTm9ybWFsLCBsaW5lVHVybnNMZWZ0LCBzZWdtZW50LCBsaW5lRGlzdGFuY2VzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFN0YXJ0IG5leHQgc2VnbWVudFxuICAgICAgICAgICAgICAgIGlmIChuZXh0VmVydGV4KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkQ3VycmVudFZlcnRleChjdXJyZW50VmVydGV4LCB0aGlzLmRpc3RhbmNlLCBuZXh0Tm9ybWFsLCAtb2Zmc2V0QSwgLW9mZnNldEIsIGZhbHNlLCBzZWdtZW50LCBsaW5lRGlzdGFuY2VzKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VycmVudEpvaW4gPT09ICdidXR0Jykge1xuICAgICAgICAgICAgICAgIGlmICghc3RhcnRPZkxpbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ2xvc2UgcHJldmlvdXMgc2VnbWVudCB3aXRoIGEgYnV0dFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEN1cnJlbnRWZXJ0ZXgoY3VycmVudFZlcnRleCwgdGhpcy5kaXN0YW5jZSwgcHJldk5vcm1hbCwgMCwgMCwgZmFsc2UsIHNlZ21lbnQsIGxpbmVEaXN0YW5jZXMpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFN0YXJ0IG5leHQgc2VnbWVudCB3aXRoIGEgYnV0dFxuICAgICAgICAgICAgICAgIGlmIChuZXh0VmVydGV4KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkQ3VycmVudFZlcnRleChjdXJyZW50VmVydGV4LCB0aGlzLmRpc3RhbmNlLCBuZXh0Tm9ybWFsLCAwLCAwLCBmYWxzZSwgc2VnbWVudCwgbGluZURpc3RhbmNlcyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRKb2luID09PSAnc3F1YXJlJykge1xuXG4gICAgICAgICAgICAgICAgaWYgKCFzdGFydE9mTGluZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBDbG9zZSBwcmV2aW91cyBzZWdtZW50IHdpdGggYSBzcXVhcmUgY2FwXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkQ3VycmVudFZlcnRleChjdXJyZW50VmVydGV4LCB0aGlzLmRpc3RhbmNlLCBwcmV2Tm9ybWFsLCAxLCAxLCBmYWxzZSwgc2VnbWVudCwgbGluZURpc3RhbmNlcyk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHNlZ21lbnQgaXMgZG9uZS4gVW5zZXQgdmVydGljZXMgdG8gZGlzY29ubmVjdCBzZWdtZW50cy5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lMSA9IHRoaXMuZTIgPSAtMTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBTdGFydCBuZXh0IHNlZ21lbnRcbiAgICAgICAgICAgICAgICBpZiAobmV4dFZlcnRleCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEN1cnJlbnRWZXJ0ZXgoY3VycmVudFZlcnRleCwgdGhpcy5kaXN0YW5jZSwgbmV4dE5vcm1hbCwgLTEsIC0xLCBmYWxzZSwgc2VnbWVudCwgbGluZURpc3RhbmNlcyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRKb2luID09PSAncm91bmQnKSB7XG5cbiAgICAgICAgICAgICAgICBpZiAoIXN0YXJ0T2ZMaW5lKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIENsb3NlIHByZXZpb3VzIHNlZ21lbnQgd2l0aCBidXR0XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkQ3VycmVudFZlcnRleChjdXJyZW50VmVydGV4LCB0aGlzLmRpc3RhbmNlLCBwcmV2Tm9ybWFsLCAwLCAwLCBmYWxzZSwgc2VnbWVudCwgbGluZURpc3RhbmNlcyk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gQWRkIHJvdW5kIGNhcCBvciBsaW5lam9pbiBhdCBlbmQgb2Ygc2VnbWVudFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEN1cnJlbnRWZXJ0ZXgoY3VycmVudFZlcnRleCwgdGhpcy5kaXN0YW5jZSwgcHJldk5vcm1hbCwgMSwgMSwgdHJ1ZSwgc2VnbWVudCwgbGluZURpc3RhbmNlcyk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHNlZ21lbnQgaXMgZG9uZS4gVW5zZXQgdmVydGljZXMgdG8gZGlzY29ubmVjdCBzZWdtZW50cy5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lMSA9IHRoaXMuZTIgPSAtMTtcbiAgICAgICAgICAgICAgICB9XG5cblxuICAgICAgICAgICAgICAgIC8vIFN0YXJ0IG5leHQgc2VnbWVudCB3aXRoIGEgYnV0dFxuICAgICAgICAgICAgICAgIGlmIChuZXh0VmVydGV4KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEFkZCByb3VuZCBjYXAgYmVmb3JlIGZpcnN0IHNlZ21lbnRcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRDdXJyZW50VmVydGV4KGN1cnJlbnRWZXJ0ZXgsIHRoaXMuZGlzdGFuY2UsIG5leHROb3JtYWwsIC0xLCAtMSwgdHJ1ZSwgc2VnbWVudCwgbGluZURpc3RhbmNlcyk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRDdXJyZW50VmVydGV4KGN1cnJlbnRWZXJ0ZXgsIHRoaXMuZGlzdGFuY2UsIG5leHROb3JtYWwsIDAsIDAsIGZhbHNlLCBzZWdtZW50LCBsaW5lRGlzdGFuY2VzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChpc1NoYXJwQ29ybmVyICYmIGkgPCBsZW4gLSAxKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dFNlZ21lbnRMZW5ndGggPSBjdXJyZW50VmVydGV4LmRpc3QobmV4dFZlcnRleCk7XG4gICAgICAgICAgICAgICAgaWYgKG5leHRTZWdtZW50TGVuZ3RoID4gMiAqIHNoYXJwQ29ybmVyT2Zmc2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld0N1cnJlbnRWZXJ0ZXggPSBjdXJyZW50VmVydGV4LmFkZChuZXh0VmVydGV4LnN1YihjdXJyZW50VmVydGV4KS5fbXVsdChzaGFycENvcm5lck9mZnNldCAvIG5leHRTZWdtZW50TGVuZ3RoKS5fcm91bmQoKSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzdGFuY2UgKz0gbmV3Q3VycmVudFZlcnRleC5kaXN0KGN1cnJlbnRWZXJ0ZXgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEN1cnJlbnRWZXJ0ZXgobmV3Q3VycmVudFZlcnRleCwgdGhpcy5kaXN0YW5jZSwgbmV4dE5vcm1hbC5tdWx0KDEpLCAwLCAwLCBmYWxzZSwgc2VnbWVudCwgbGluZURpc3RhbmNlcyk7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRWZXJ0ZXggPSBuZXdDdXJyZW50VmVydGV4O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc3RhcnRPZkxpbmUgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLnBvcHVsYXRlUGFpbnRBcnJheXModGhpcy5sYXlvdXRWZXJ0ZXhBcnJheS5sZW5ndGgsIGZlYXR1cmUsIGluZGV4LCBpbWFnZVBvc2l0aW9ucyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkIHR3byB2ZXJ0aWNlcyB0byB0aGUgYnVmZmVycy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjdXJyZW50VmVydGV4IHRoZSBsaW5lIHZlcnRleCB0byBhZGQgYnVmZmVyIHZlcnRpY2VzIGZvclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBkaXN0YW5jZSB0aGUgZGlzdGFuY2UgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5lIHRvIHRoZSB2ZXJ0ZXhcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZW5kTGVmdCBleHRydWRlIHRvIHNoaWZ0IHRoZSBsZWZ0IHZlcnRleCBhbG9uZyB0aGUgbGluZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBlbmRSaWdodCBleHRydWRlIHRvIHNoaWZ0IHRoZSBsZWZ0IHZlcnRleCBhbG9uZyB0aGUgbGluZVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gcm91bmQgd2hldGhlciB0aGlzIGlzIGEgcm91bmQgY2FwXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBhZGRDdXJyZW50VmVydGV4KGN1cnJlbnRWZXJ0ZXg6IFBvaW50LFxuICAgICAgICAgICAgICAgICAgICAgZGlzdGFuY2U6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgIG5vcm1hbDogUG9pbnQsXG4gICAgICAgICAgICAgICAgICAgICBlbmRMZWZ0OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICBlbmRSaWdodDogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgcm91bmQ6IGJvb2xlYW4sXG4gICAgICAgICAgICAgICAgICAgICBzZWdtZW50OiBTZWdtZW50LFxuICAgICAgICAgICAgICAgICAgICAgZGlzdGFuY2VzRm9yU2NhbGluZzogP09iamVjdCkge1xuICAgICAgICBsZXQgZXh0cnVkZTtcbiAgICAgICAgY29uc3QgbGF5b3V0VmVydGV4QXJyYXkgPSB0aGlzLmxheW91dFZlcnRleEFycmF5O1xuICAgICAgICBjb25zdCBpbmRleEFycmF5ID0gdGhpcy5pbmRleEFycmF5O1xuXG4gICAgICAgIGlmIChkaXN0YW5jZXNGb3JTY2FsaW5nKSB7XG4gICAgICAgICAgICAvLyBGb3IgZ3JhZGllbnQgbGluZXMsIHNjYWxlIGRpc3RhbmNlIGZyb20gdGlsZSB1bml0cyB0byBbMCwgMl4xNSlcbiAgICAgICAgICAgIGRpc3RhbmNlID0gc2NhbGVEaXN0YW5jZShkaXN0YW5jZSwgZGlzdGFuY2VzRm9yU2NhbGluZyk7XG4gICAgICAgIH1cblxuICAgICAgICBleHRydWRlID0gbm9ybWFsLmNsb25lKCk7XG4gICAgICAgIGlmIChlbmRMZWZ0KSBleHRydWRlLl9zdWIobm9ybWFsLnBlcnAoKS5fbXVsdChlbmRMZWZ0KSk7XG4gICAgICAgIGFkZExpbmVWZXJ0ZXgobGF5b3V0VmVydGV4QXJyYXksIGN1cnJlbnRWZXJ0ZXgsIGV4dHJ1ZGUsIHJvdW5kLCBmYWxzZSwgZW5kTGVmdCwgZGlzdGFuY2UpO1xuICAgICAgICB0aGlzLmUzID0gc2VnbWVudC52ZXJ0ZXhMZW5ndGgrKztcbiAgICAgICAgaWYgKHRoaXMuZTEgPj0gMCAmJiB0aGlzLmUyID49IDApIHtcbiAgICAgICAgICAgIGluZGV4QXJyYXkuZW1wbGFjZUJhY2sodGhpcy5lMSwgdGhpcy5lMiwgdGhpcy5lMyk7XG4gICAgICAgICAgICBzZWdtZW50LnByaW1pdGl2ZUxlbmd0aCsrO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZTEgPSB0aGlzLmUyO1xuICAgICAgICB0aGlzLmUyID0gdGhpcy5lMztcblxuICAgICAgICBleHRydWRlID0gbm9ybWFsLm11bHQoLTEpO1xuICAgICAgICBpZiAoZW5kUmlnaHQpIGV4dHJ1ZGUuX3N1Yihub3JtYWwucGVycCgpLl9tdWx0KGVuZFJpZ2h0KSk7XG4gICAgICAgIGFkZExpbmVWZXJ0ZXgobGF5b3V0VmVydGV4QXJyYXksIGN1cnJlbnRWZXJ0ZXgsIGV4dHJ1ZGUsIHJvdW5kLCB0cnVlLCAtZW5kUmlnaHQsIGRpc3RhbmNlKTtcbiAgICAgICAgdGhpcy5lMyA9IHNlZ21lbnQudmVydGV4TGVuZ3RoKys7XG4gICAgICAgIGlmICh0aGlzLmUxID49IDAgJiYgdGhpcy5lMiA+PSAwKSB7XG4gICAgICAgICAgICBpbmRleEFycmF5LmVtcGxhY2VCYWNrKHRoaXMuZTEsIHRoaXMuZTIsIHRoaXMuZTMpO1xuICAgICAgICAgICAgc2VnbWVudC5wcmltaXRpdmVMZW5ndGgrKztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmUxID0gdGhpcy5lMjtcbiAgICAgICAgdGhpcy5lMiA9IHRoaXMuZTM7XG5cbiAgICAgICAgLy8gVGhlcmUgaXMgYSBtYXhpbXVtIFwiZGlzdGFuY2UgYWxvbmcgdGhlIGxpbmVcIiB0aGF0IHdlIGNhbiBzdG9yZSBpbiB0aGUgYnVmZmVycy5cbiAgICAgICAgLy8gV2hlbiB3ZSBnZXQgY2xvc2UgdG8gdGhlIGRpc3RhbmNlLCByZXNldCBpdCB0byB6ZXJvIGFuZCBhZGQgdGhlIHZlcnRleCBhZ2FpbiB3aXRoXG4gICAgICAgIC8vIGEgZGlzdGFuY2Ugb2YgemVyby4gVGhlIG1heCBkaXN0YW5jZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBudW1iZXIgb2YgYml0cyB3ZSBhbGxvY2F0ZVxuICAgICAgICAvLyB0byBgbGluZXNvZmFyYC5cbiAgICAgICAgaWYgKGRpc3RhbmNlID4gTUFYX0xJTkVfRElTVEFOQ0UgLyAyICYmICFkaXN0YW5jZXNGb3JTY2FsaW5nKSB7XG4gICAgICAgICAgICB0aGlzLmRpc3RhbmNlID0gMDtcbiAgICAgICAgICAgIHRoaXMuYWRkQ3VycmVudFZlcnRleChjdXJyZW50VmVydGV4LCB0aGlzLmRpc3RhbmNlLCBub3JtYWwsIGVuZExlZnQsIGVuZFJpZ2h0LCByb3VuZCwgc2VnbWVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGQgYSBzaW5nbGUgbmV3IHZlcnRleCBhbmQgYSB0cmlhbmdsZSB1c2luZyB0d28gcHJldmlvdXMgdmVydGljZXMuXG4gICAgICogVGhpcyBhZGRzIGEgcGllIHNsaWNlIHRyaWFuZ2xlIG5lYXIgYSBqb2luIHRvIHNpbXVsYXRlIHJvdW5kIGpvaW5zXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY3VycmVudFZlcnRleCB0aGUgbGluZSB2ZXJ0ZXggdG8gYWRkIGJ1ZmZlciB2ZXJ0aWNlcyBmb3JcbiAgICAgKiBAcGFyYW0gZGlzdGFuY2UgdGhlIGRpc3RhbmNlIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZSB0byB0aGUgdmVydGV4XG4gICAgICogQHBhcmFtIGV4dHJ1ZGUgdGhlIG9mZnNldCBvZiB0aGUgbmV3IHZlcnRleCBmcm9tIHRoZSBjdXJyZW50VmVydGV4XG4gICAgICogQHBhcmFtIGxpbmVUdXJuc0xlZnQgd2hldGhlciB0aGUgbGluZSBpcyB0dXJuaW5nIGxlZnQgb3IgcmlnaHQgYXQgdGhpcyBhbmdsZVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgYWRkUGllU2xpY2VWZXJ0ZXgoY3VycmVudFZlcnRleDogUG9pbnQsXG4gICAgICAgICAgICAgICAgICAgICAgZGlzdGFuY2U6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICBleHRydWRlOiBQb2ludCxcbiAgICAgICAgICAgICAgICAgICAgICBsaW5lVHVybnNMZWZ0OiBib29sZWFuLFxuICAgICAgICAgICAgICAgICAgICAgIHNlZ21lbnQ6IFNlZ21lbnQsXG4gICAgICAgICAgICAgICAgICAgICAgZGlzdGFuY2VzRm9yU2NhbGluZzogP09iamVjdCkge1xuICAgICAgICBleHRydWRlID0gZXh0cnVkZS5tdWx0KGxpbmVUdXJuc0xlZnQgPyAtMSA6IDEpO1xuICAgICAgICBjb25zdCBsYXlvdXRWZXJ0ZXhBcnJheSA9IHRoaXMubGF5b3V0VmVydGV4QXJyYXk7XG4gICAgICAgIGNvbnN0IGluZGV4QXJyYXkgPSB0aGlzLmluZGV4QXJyYXk7XG5cbiAgICAgICAgaWYgKGRpc3RhbmNlc0ZvclNjYWxpbmcpIGRpc3RhbmNlID0gc2NhbGVEaXN0YW5jZShkaXN0YW5jZSwgZGlzdGFuY2VzRm9yU2NhbGluZyk7XG5cbiAgICAgICAgYWRkTGluZVZlcnRleChsYXlvdXRWZXJ0ZXhBcnJheSwgY3VycmVudFZlcnRleCwgZXh0cnVkZSwgZmFsc2UsIGxpbmVUdXJuc0xlZnQsIDAsIGRpc3RhbmNlKTtcbiAgICAgICAgdGhpcy5lMyA9IHNlZ21lbnQudmVydGV4TGVuZ3RoKys7XG4gICAgICAgIGlmICh0aGlzLmUxID49IDAgJiYgdGhpcy5lMiA+PSAwKSB7XG4gICAgICAgICAgICBpbmRleEFycmF5LmVtcGxhY2VCYWNrKHRoaXMuZTEsIHRoaXMuZTIsIHRoaXMuZTMpO1xuICAgICAgICAgICAgc2VnbWVudC5wcmltaXRpdmVMZW5ndGgrKztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChsaW5lVHVybnNMZWZ0KSB7XG4gICAgICAgICAgICB0aGlzLmUyID0gdGhpcy5lMztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZTEgPSB0aGlzLmUzO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vKipcbiAqIEtub3dpbmcgdGhlIHJhdGlvIG9mIHRoZSBmdWxsIGxpbmVzdHJpbmcgY292ZXJlZCBieSB0aGlzIHRpbGVkIGZlYXR1cmUsIGFzIHdlbGxcbiAqIGFzIHRoZSB0b3RhbCBkaXN0YW5jZSAoaW4gdGlsZSB1bml0cykgb2YgdGhpcyB0aWxlZCBmZWF0dXJlLCBhbmQgdGhlIGRpc3RhbmNlXG4gKiAoaW4gdGlsZSB1bml0cykgb2YgdGhlIGN1cnJlbnQgdmVydGV4LCB3ZSBjYW4gZGV0ZXJtaW5lIHRoZSByZWxhdGl2ZSBkaXN0YW5jZVxuICogb2YgdGhpcyB2ZXJ0ZXggYWxvbmcgdGhlIGZ1bGwgbGluZXN0cmluZyBmZWF0dXJlIGFuZCBzY2FsZSBpdCB0byBbMCwgMl4xNSlcbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gdGlsZURpc3RhbmNlIHRoZSBkaXN0YW5jZSBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHRpbGVkIGxpbmUgdG8gdGhpcyB2ZXJ0ZXhcbiAqIEBwYXJhbSB7T2JqZWN0fSBzdGF0c1xuICogQHBhcmFtIHtudW1iZXJ9IHN0YXRzLnN0YXJ0IHRoZSByYXRpbyAoMC0xKSBhbG9uZyBhIGZ1bGwgb3JpZ2luYWwgbGluZXN0cmluZyBmZWF0dXJlIG9mIHRoZSBzdGFydCBvZiB0aGlzIHRpbGVkIGxpbmUgZmVhdHVyZVxuICogQHBhcmFtIHtudW1iZXJ9IHN0YXRzLmVuZCB0aGUgcmF0aW8gKDAtMSkgYWxvbmcgYSBmdWxsIG9yaWdpbmFsIGxpbmVzdHJpbmcgZmVhdHVyZSBvZiB0aGUgZW5kIG9mIHRoaXMgdGlsZWQgbGluZSBmZWF0dXJlXG4gKiBAcGFyYW0ge251bWJlcn0gc3RhdHMudGlsZVRvdGFsIHRoZSB0b3RhbCBkaXN0YW5jZSwgaW4gdGlsZSB1bml0cywgb2YgdGhpcyB0aWxlZCBsaW5lIGZlYXR1cmVcbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBzY2FsZURpc3RhbmNlKHRpbGVEaXN0YW5jZTogbnVtYmVyLCBzdGF0czogT2JqZWN0KSB7XG4gICAgcmV0dXJuICgodGlsZURpc3RhbmNlIC8gc3RhdHMudGlsZVRvdGFsKSAqIChzdGF0cy5lbmQgLSBzdGF0cy5zdGFydCkgKyBzdGF0cy5zdGFydCkgKiAoTUFYX0xJTkVfRElTVEFOQ0UgLSAxKTtcbn1cblxuLyoqXG4gKiBDYWxjdWxhdGUgdGhlIHRvdGFsIGRpc3RhbmNlLCBpbiB0aWxlIHVuaXRzLCBvZiB0aGlzIHRpbGVkIGxpbmUgZmVhdHVyZVxuICpcbiAqIEBwYXJhbSB7QXJyYXk8UG9pbnQ+fSB2ZXJ0aWNlcyB0aGUgZnVsbCBnZW9tZXRyeSBvZiB0aGlzIHRpbGVkIGxpbmUgZmVhdHVyZVxuICogQHBhcmFtIHtudW1iZXJ9IGZpcnN0IHRoZSBpbmRleCBpbiB0aGUgdmVydGljZXMgYXJyYXkgcmVwcmVzZW50aW5nIHRoZSBmaXJzdCB2ZXJ0ZXggd2Ugc2hvdWxkIGNvbnNpZGVyXG4gKiBAcGFyYW0ge251bWJlcn0gbGVuIHRoZSBjb3VudCBvZiB2ZXJ0aWNlcyB3ZSBzaG91bGQgY29uc2lkZXIgZnJvbSBgZmlyc3RgXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gY2FsY3VsYXRlRnVsbERpc3RhbmNlKHZlcnRpY2VzOiBBcnJheTxQb2ludD4sIGZpcnN0OiBudW1iZXIsIGxlbjogbnVtYmVyKSB7XG4gICAgbGV0IGN1cnJlbnRWZXJ0ZXgsIG5leHRWZXJ0ZXg7XG4gICAgbGV0IHRvdGFsID0gMDtcbiAgICBmb3IgKGxldCBpID0gZmlyc3Q7IGkgPCBsZW4gLSAxOyBpKyspIHtcbiAgICAgICAgY3VycmVudFZlcnRleCA9IHZlcnRpY2VzW2ldO1xuICAgICAgICBuZXh0VmVydGV4ID0gdmVydGljZXNbaSArIDFdO1xuICAgICAgICB0b3RhbCArPSBjdXJyZW50VmVydGV4LmRpc3QobmV4dFZlcnRleCk7XG4gICAgfVxuICAgIHJldHVybiB0b3RhbDtcbn1cblxucmVnaXN0ZXIoJ0xpbmVCdWNrZXQnLCBMaW5lQnVja2V0LCB7b21pdDogWydsYXllcnMnLCAnZmVhdHVyZXMnXX0pO1xuXG5leHBvcnQgZGVmYXVsdCBMaW5lQnVja2V0O1xuIiwiLy8gVGhpcyBmaWxlIGlzIGdlbmVyYXRlZC4gRWRpdCBidWlsZC9nZW5lcmF0ZS1zdHlsZS1jb2RlLmpzLCB0aGVuIHJ1biBgeWFybiBydW4gY29kZWdlbmAuXG4vLyBAZmxvd1xuLyogZXNsaW50LWRpc2FibGUgKi9cblxuaW1wb3J0IHN0eWxlU3BlYyBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL3JlZmVyZW5jZS9sYXRlc3QnO1xuXG5pbXBvcnQge1xuICAgIFByb3BlcnRpZXMsXG4gICAgRGF0YUNvbnN0YW50UHJvcGVydHksXG4gICAgRGF0YURyaXZlblByb3BlcnR5LFxuICAgIENyb3NzRmFkZWREYXRhRHJpdmVuUHJvcGVydHksXG4gICAgQ3Jvc3NGYWRlZFByb3BlcnR5LFxuICAgIENvbG9yUmFtcFByb3BlcnR5XG59IGZyb20gJy4uL3Byb3BlcnRpZXMnO1xuXG5pbXBvcnQgdHlwZSBDb2xvciBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL3V0aWwvY29sb3InO1xuXG5pbXBvcnQgdHlwZSBGb3JtYXR0ZWQgZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uL3R5cGVzL2Zvcm1hdHRlZCc7XG5cbmV4cG9ydCB0eXBlIExheW91dFByb3BzID0ge3xcbiAgICBcImxpbmUtY2FwXCI6IERhdGFDb25zdGFudFByb3BlcnR5PFwiYnV0dFwiIHwgXCJyb3VuZFwiIHwgXCJzcXVhcmVcIj4sXG4gICAgXCJsaW5lLWpvaW5cIjogRGF0YURyaXZlblByb3BlcnR5PFwiYmV2ZWxcIiB8IFwicm91bmRcIiB8IFwibWl0ZXJcIj4sXG4gICAgXCJsaW5lLW1pdGVyLWxpbWl0XCI6IERhdGFDb25zdGFudFByb3BlcnR5PG51bWJlcj4sXG4gICAgXCJsaW5lLXJvdW5kLWxpbWl0XCI6IERhdGFDb25zdGFudFByb3BlcnR5PG51bWJlcj4sXG58fTtcblxuY29uc3QgbGF5b3V0OiBQcm9wZXJ0aWVzPExheW91dFByb3BzPiA9IG5ldyBQcm9wZXJ0aWVzKHtcbiAgICBcImxpbmUtY2FwXCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJsYXlvdXRfbGluZVwiXVtcImxpbmUtY2FwXCJdKSxcbiAgICBcImxpbmUtam9pblwiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcImxheW91dF9saW5lXCJdW1wibGluZS1qb2luXCJdKSxcbiAgICBcImxpbmUtbWl0ZXItbGltaXRcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcImxheW91dF9saW5lXCJdW1wibGluZS1taXRlci1saW1pdFwiXSksXG4gICAgXCJsaW5lLXJvdW5kLWxpbWl0XCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJsYXlvdXRfbGluZVwiXVtcImxpbmUtcm91bmQtbGltaXRcIl0pLFxufSk7XG5cbmV4cG9ydCB0eXBlIFBhaW50UHJvcHMgPSB7fFxuICAgIFwibGluZS1vcGFjaXR5XCI6IERhdGFEcml2ZW5Qcm9wZXJ0eTxudW1iZXI+LFxuICAgIFwibGluZS1jb2xvclwiOiBEYXRhRHJpdmVuUHJvcGVydHk8Q29sb3I+LFxuICAgIFwibGluZS10cmFuc2xhdGVcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8W251bWJlciwgbnVtYmVyXT4sXG4gICAgXCJsaW5lLXRyYW5zbGF0ZS1hbmNob3JcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8XCJtYXBcIiB8IFwidmlld3BvcnRcIj4sXG4gICAgXCJsaW5lLXdpZHRoXCI6IERhdGFEcml2ZW5Qcm9wZXJ0eTxudW1iZXI+LFxuICAgIFwibGluZS1nYXAtd2lkdGhcIjogRGF0YURyaXZlblByb3BlcnR5PG51bWJlcj4sXG4gICAgXCJsaW5lLW9mZnNldFwiOiBEYXRhRHJpdmVuUHJvcGVydHk8bnVtYmVyPixcbiAgICBcImxpbmUtYmx1clwiOiBEYXRhRHJpdmVuUHJvcGVydHk8bnVtYmVyPixcbiAgICBcImxpbmUtZGFzaGFycmF5XCI6IENyb3NzRmFkZWRQcm9wZXJ0eTxBcnJheTxudW1iZXI+PixcbiAgICBcImxpbmUtcGF0dGVyblwiOiBDcm9zc0ZhZGVkRGF0YURyaXZlblByb3BlcnR5PHN0cmluZz4sXG4gICAgXCJsaW5lLWdyYWRpZW50XCI6IENvbG9yUmFtcFByb3BlcnR5LFxufH07XG5cbmNvbnN0IHBhaW50OiBQcm9wZXJ0aWVzPFBhaW50UHJvcHM+ID0gbmV3IFByb3BlcnRpZXMoe1xuICAgIFwibGluZS1vcGFjaXR5XCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfbGluZVwiXVtcImxpbmUtb3BhY2l0eVwiXSksXG4gICAgXCJsaW5lLWNvbG9yXCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfbGluZVwiXVtcImxpbmUtY29sb3JcIl0pLFxuICAgIFwibGluZS10cmFuc2xhdGVcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2xpbmVcIl1bXCJsaW5lLXRyYW5zbGF0ZVwiXSksXG4gICAgXCJsaW5lLXRyYW5zbGF0ZS1hbmNob3JcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2xpbmVcIl1bXCJsaW5lLXRyYW5zbGF0ZS1hbmNob3JcIl0pLFxuICAgIFwibGluZS13aWR0aFwiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2xpbmVcIl1bXCJsaW5lLXdpZHRoXCJdKSxcbiAgICBcImxpbmUtZ2FwLXdpZHRoXCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfbGluZVwiXVtcImxpbmUtZ2FwLXdpZHRoXCJdKSxcbiAgICBcImxpbmUtb2Zmc2V0XCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfbGluZVwiXVtcImxpbmUtb2Zmc2V0XCJdKSxcbiAgICBcImxpbmUtYmx1clwiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2xpbmVcIl1bXCJsaW5lLWJsdXJcIl0pLFxuICAgIFwibGluZS1kYXNoYXJyYXlcIjogbmV3IENyb3NzRmFkZWRQcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9saW5lXCJdW1wibGluZS1kYXNoYXJyYXlcIl0pLFxuICAgIFwibGluZS1wYXR0ZXJuXCI6IG5ldyBDcm9zc0ZhZGVkRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2xpbmVcIl1bXCJsaW5lLXBhdHRlcm5cIl0pLFxuICAgIFwibGluZS1ncmFkaWVudFwiOiBuZXcgQ29sb3JSYW1wUHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfbGluZVwiXVtcImxpbmUtZ3JhZGllbnRcIl0pLFxufSk7XG5cbi8vIE5vdGU6IHdpdGhvdXQgYWRkaW5nIHRoZSBleHBsaWNpdCB0eXBlIGFubm90YXRpb24sIEZsb3cgaW5mZXJzIHdlYWtlciB0eXBlc1xuLy8gZm9yIHRoZXNlIG9iamVjdHMgZnJvbSB0aGVpciB1c2UgaW4gdGhlIGNvbnN0cnVjdG9yIHRvIFN0eWxlTGF5ZXIsIGFzXG4vLyB7bGF5b3V0PzogUHJvcGVydGllczwuLi4+LCBwYWludDogUHJvcGVydGllczwuLi4+fVxuZXhwb3J0IGRlZmF1bHQgKHsgcGFpbnQsIGxheW91dCB9OiAkRXhhY3Q8e1xuICBwYWludDogUHJvcGVydGllczxQYWludFByb3BzPiwgbGF5b3V0OiBQcm9wZXJ0aWVzPExheW91dFByb3BzPlxufT4pO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuXG5pbXBvcnQgU3R5bGVMYXllciBmcm9tICcuLi9zdHlsZV9sYXllcic7XG5pbXBvcnQgTGluZUJ1Y2tldCBmcm9tICcuLi8uLi9kYXRhL2J1Y2tldC9saW5lX2J1Y2tldCc7XG5pbXBvcnQgeyBSR0JBSW1hZ2UgfSBmcm9tICcuLi8uLi91dGlsL2ltYWdlJztcbmltcG9ydCB7IHBvbHlnb25JbnRlcnNlY3RzQnVmZmVyZWRNdWx0aUxpbmUgfSBmcm9tICcuLi8uLi91dGlsL2ludGVyc2VjdGlvbl90ZXN0cyc7XG5pbXBvcnQgeyBnZXRNYXhpbXVtUGFpbnRWYWx1ZSwgdHJhbnNsYXRlRGlzdGFuY2UsIHRyYW5zbGF0ZSB9IGZyb20gJy4uL3F1ZXJ5X3V0aWxzJztcbmltcG9ydCBwcm9wZXJ0aWVzIGZyb20gJy4vbGluZV9zdHlsZV9sYXllcl9wcm9wZXJ0aWVzJztcbmltcG9ydCB7IGV4dGVuZCB9IGZyb20gJy4uLy4uL3V0aWwvdXRpbCc7XG5pbXBvcnQgRXZhbHVhdGlvblBhcmFtZXRlcnMgZnJvbSAnLi4vZXZhbHVhdGlvbl9wYXJhbWV0ZXJzJztcbmltcG9ydCByZW5kZXJDb2xvclJhbXAgZnJvbSAnLi4vLi4vdXRpbC9jb2xvcl9yYW1wJztcbmltcG9ydCB7IFRyYW5zaXRpb25hYmxlLCBUcmFuc2l0aW9uaW5nLCBMYXlvdXQsIFBvc3NpYmx5RXZhbHVhdGVkLCBEYXRhRHJpdmVuUHJvcGVydHkgfSBmcm9tICcuLi9wcm9wZXJ0aWVzJztcblxuaW1wb3J0IHR5cGUgeyBGZWF0dXJlU3RhdGUgfSBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL2V4cHJlc3Npb24nO1xuaW1wb3J0IHR5cGUge0J1Y2tldCwgQnVja2V0UGFyYW1ldGVyc30gZnJvbSAnLi4vLi4vZGF0YS9idWNrZXQnO1xuaW1wb3J0IHR5cGUge0xheW91dFByb3BzLCBQYWludFByb3BzfSBmcm9tICcuL2xpbmVfc3R5bGVfbGF5ZXJfcHJvcGVydGllcyc7XG5pbXBvcnQgdHlwZSBUcmFuc2Zvcm0gZnJvbSAnLi4vLi4vZ2VvL3RyYW5zZm9ybSc7XG5pbXBvcnQgdHlwZSBUZXh0dXJlIGZyb20gJy4uLy4uL3JlbmRlci90ZXh0dXJlJztcbmltcG9ydCB0eXBlIHtMYXllclNwZWNpZmljYXRpb259IGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvdHlwZXMnO1xuXG5cbmNsYXNzIExpbmVGbG9vcndpZHRoUHJvcGVydHkgZXh0ZW5kcyBEYXRhRHJpdmVuUHJvcGVydHk8bnVtYmVyPiB7XG4gICAgdXNlSW50ZWdlclpvb206IHRydWU7XG5cbiAgICBwb3NzaWJseUV2YWx1YXRlKHZhbHVlLCBwYXJhbWV0ZXJzKSB7XG4gICAgICAgIHBhcmFtZXRlcnMgPSBuZXcgRXZhbHVhdGlvblBhcmFtZXRlcnMoTWF0aC5mbG9vcihwYXJhbWV0ZXJzLnpvb20pLCB7XG4gICAgICAgICAgICBub3c6IHBhcmFtZXRlcnMubm93LFxuICAgICAgICAgICAgZmFkZUR1cmF0aW9uOiBwYXJhbWV0ZXJzLmZhZGVEdXJhdGlvbixcbiAgICAgICAgICAgIHpvb21IaXN0b3J5OiBwYXJhbWV0ZXJzLnpvb21IaXN0b3J5LFxuICAgICAgICAgICAgdHJhbnNpdGlvbjogcGFyYW1ldGVycy50cmFuc2l0aW9uXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gc3VwZXIucG9zc2libHlFdmFsdWF0ZSh2YWx1ZSwgcGFyYW1ldGVycyk7XG4gICAgfVxuXG4gICAgZXZhbHVhdGUodmFsdWUsIGdsb2JhbHMsIGZlYXR1cmUsIGZlYXR1cmVTdGF0ZSkge1xuICAgICAgICBnbG9iYWxzID0gZXh0ZW5kKHt9LCBnbG9iYWxzLCB7em9vbTogTWF0aC5mbG9vcihnbG9iYWxzLnpvb20pfSk7XG4gICAgICAgIHJldHVybiBzdXBlci5ldmFsdWF0ZSh2YWx1ZSwgZ2xvYmFscywgZmVhdHVyZSwgZmVhdHVyZVN0YXRlKTtcbiAgICB9XG59XG5cbmNvbnN0IGxpbmVGbG9vcndpZHRoUHJvcGVydHkgPSBuZXcgTGluZUZsb29yd2lkdGhQcm9wZXJ0eShwcm9wZXJ0aWVzLnBhaW50LnByb3BlcnRpZXNbJ2xpbmUtd2lkdGgnXS5zcGVjaWZpY2F0aW9uKTtcbmxpbmVGbG9vcndpZHRoUHJvcGVydHkudXNlSW50ZWdlclpvb20gPSB0cnVlO1xuXG5jbGFzcyBMaW5lU3R5bGVMYXllciBleHRlbmRzIFN0eWxlTGF5ZXIge1xuICAgIF91bmV2YWx1YXRlZExheW91dDogTGF5b3V0PExheW91dFByb3BzPjtcbiAgICBsYXlvdXQ6IFBvc3NpYmx5RXZhbHVhdGVkPExheW91dFByb3BzPjtcblxuICAgIGdyYWRpZW50OiA/UkdCQUltYWdlO1xuICAgIGdyYWRpZW50VGV4dHVyZTogP1RleHR1cmU7XG5cbiAgICBfdHJhbnNpdGlvbmFibGVQYWludDogVHJhbnNpdGlvbmFibGU8UGFpbnRQcm9wcz47XG4gICAgX3RyYW5zaXRpb25pbmdQYWludDogVHJhbnNpdGlvbmluZzxQYWludFByb3BzPjtcbiAgICBwYWludDogUG9zc2libHlFdmFsdWF0ZWQ8UGFpbnRQcm9wcz47XG5cbiAgICBjb25zdHJ1Y3RvcihsYXllcjogTGF5ZXJTcGVjaWZpY2F0aW9uKSB7XG4gICAgICAgIHN1cGVyKGxheWVyLCBwcm9wZXJ0aWVzKTtcbiAgICB9XG5cbiAgICBfaGFuZGxlU3BlY2lhbFBhaW50UHJvcGVydHlVcGRhdGUobmFtZTogc3RyaW5nKSB7XG4gICAgICAgIGlmIChuYW1lID09PSAnbGluZS1ncmFkaWVudCcpIHtcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUdyYWRpZW50KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfdXBkYXRlR3JhZGllbnQoKSB7XG4gICAgICAgIGNvbnN0IGV4cHJlc3Npb24gPSB0aGlzLl90cmFuc2l0aW9uYWJsZVBhaW50Ll92YWx1ZXNbJ2xpbmUtZ3JhZGllbnQnXS52YWx1ZS5leHByZXNzaW9uO1xuICAgICAgICB0aGlzLmdyYWRpZW50ID0gcmVuZGVyQ29sb3JSYW1wKGV4cHJlc3Npb24sICdsaW5lUHJvZ3Jlc3MnKTtcbiAgICAgICAgdGhpcy5ncmFkaWVudFRleHR1cmUgPSBudWxsO1xuICAgIH1cblxuICAgIHJlY2FsY3VsYXRlKHBhcmFtZXRlcnM6IEV2YWx1YXRpb25QYXJhbWV0ZXJzKSB7XG4gICAgICAgIHN1cGVyLnJlY2FsY3VsYXRlKHBhcmFtZXRlcnMpO1xuXG4gICAgICAgICh0aGlzLnBhaW50Ll92YWx1ZXM6IGFueSlbJ2xpbmUtZmxvb3J3aWR0aCddID1cbiAgICAgICAgICAgIGxpbmVGbG9vcndpZHRoUHJvcGVydHkucG9zc2libHlFdmFsdWF0ZSh0aGlzLl90cmFuc2l0aW9uaW5nUGFpbnQuX3ZhbHVlc1snbGluZS13aWR0aCddLnZhbHVlLCBwYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICBjcmVhdGVCdWNrZXQocGFyYW1ldGVyczogQnVja2V0UGFyYW1ldGVyczwqPikge1xuICAgICAgICByZXR1cm4gbmV3IExpbmVCdWNrZXQocGFyYW1ldGVycyk7XG4gICAgfVxuXG4gICAgcXVlcnlSYWRpdXMoYnVja2V0OiBCdWNrZXQpOiBudW1iZXIge1xuICAgICAgICBjb25zdCBsaW5lQnVja2V0OiBMaW5lQnVja2V0ID0gKGJ1Y2tldDogYW55KTtcbiAgICAgICAgY29uc3Qgd2lkdGggPSBnZXRMaW5lV2lkdGgoXG4gICAgICAgICAgICBnZXRNYXhpbXVtUGFpbnRWYWx1ZSgnbGluZS13aWR0aCcsIHRoaXMsIGxpbmVCdWNrZXQpLFxuICAgICAgICAgICAgZ2V0TWF4aW11bVBhaW50VmFsdWUoJ2xpbmUtZ2FwLXdpZHRoJywgdGhpcywgbGluZUJ1Y2tldCkpO1xuICAgICAgICBjb25zdCBvZmZzZXQgPSBnZXRNYXhpbXVtUGFpbnRWYWx1ZSgnbGluZS1vZmZzZXQnLCB0aGlzLCBsaW5lQnVja2V0KTtcbiAgICAgICAgcmV0dXJuIHdpZHRoIC8gMiArIE1hdGguYWJzKG9mZnNldCkgKyB0cmFuc2xhdGVEaXN0YW5jZSh0aGlzLnBhaW50LmdldCgnbGluZS10cmFuc2xhdGUnKSk7XG4gICAgfVxuXG4gICAgcXVlcnlJbnRlcnNlY3RzRmVhdHVyZShxdWVyeUdlb21ldHJ5OiBBcnJheTxQb2ludD4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlOiBWZWN0b3JUaWxlRmVhdHVyZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVTdGF0ZTogRmVhdHVyZVN0YXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VvbWV0cnk6IEFycmF5PEFycmF5PFBvaW50Pj4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICB6b29tOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm06IFRyYW5zZm9ybSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsc1RvVGlsZVVuaXRzOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgdHJhbnNsYXRlZFBvbHlnb24gPSB0cmFuc2xhdGUocXVlcnlHZW9tZXRyeSxcbiAgICAgICAgICAgIHRoaXMucGFpbnQuZ2V0KCdsaW5lLXRyYW5zbGF0ZScpLFxuICAgICAgICAgICAgdGhpcy5wYWludC5nZXQoJ2xpbmUtdHJhbnNsYXRlLWFuY2hvcicpLFxuICAgICAgICAgICAgdHJhbnNmb3JtLmFuZ2xlLCBwaXhlbHNUb1RpbGVVbml0cyk7XG4gICAgICAgIGNvbnN0IGhhbGZXaWR0aCA9IHBpeGVsc1RvVGlsZVVuaXRzIC8gMiAqIGdldExpbmVXaWR0aChcbiAgICAgICAgICAgIHRoaXMucGFpbnQuZ2V0KCdsaW5lLXdpZHRoJykuZXZhbHVhdGUoZmVhdHVyZSwgZmVhdHVyZVN0YXRlKSxcbiAgICAgICAgICAgIHRoaXMucGFpbnQuZ2V0KCdsaW5lLWdhcC13aWR0aCcpLmV2YWx1YXRlKGZlYXR1cmUsIGZlYXR1cmVTdGF0ZSkpO1xuICAgICAgICBjb25zdCBsaW5lT2Zmc2V0ID0gdGhpcy5wYWludC5nZXQoJ2xpbmUtb2Zmc2V0JykuZXZhbHVhdGUoZmVhdHVyZSwgZmVhdHVyZVN0YXRlKTtcbiAgICAgICAgaWYgKGxpbmVPZmZzZXQpIHtcbiAgICAgICAgICAgIGdlb21ldHJ5ID0gb2Zmc2V0TGluZShnZW9tZXRyeSwgbGluZU9mZnNldCAqIHBpeGVsc1RvVGlsZVVuaXRzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcG9seWdvbkludGVyc2VjdHNCdWZmZXJlZE11bHRpTGluZSh0cmFuc2xhdGVkUG9seWdvbiwgZ2VvbWV0cnksIGhhbGZXaWR0aCk7XG4gICAgfVxuXG4gICAgaXNUaWxlQ2xpcHBlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBMaW5lU3R5bGVMYXllcjtcblxuZnVuY3Rpb24gZ2V0TGluZVdpZHRoKGxpbmVXaWR0aCwgbGluZUdhcFdpZHRoKSB7XG4gICAgaWYgKGxpbmVHYXBXaWR0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIGxpbmVHYXBXaWR0aCArIDIgKiBsaW5lV2lkdGg7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGxpbmVXaWR0aDtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIG9mZnNldExpbmUocmluZ3MsIG9mZnNldCkge1xuICAgIGNvbnN0IG5ld1JpbmdzID0gW107XG4gICAgY29uc3QgemVybyA9IG5ldyBQb2ludCgwLCAwKTtcbiAgICBmb3IgKGxldCBrID0gMDsgayA8IHJpbmdzLmxlbmd0aDsgaysrKSB7XG4gICAgICAgIGNvbnN0IHJpbmcgPSByaW5nc1trXTtcbiAgICAgICAgY29uc3QgbmV3UmluZyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJpbmcubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGEgPSByaW5nW2kgLSAxXTtcbiAgICAgICAgICAgIGNvbnN0IGIgPSByaW5nW2ldO1xuICAgICAgICAgICAgY29uc3QgYyA9IHJpbmdbaSArIDFdO1xuICAgICAgICAgICAgY29uc3QgYVRvQiA9IGkgPT09IDAgPyB6ZXJvIDogYi5zdWIoYSkuX3VuaXQoKS5fcGVycCgpO1xuICAgICAgICAgICAgY29uc3QgYlRvQyA9IGkgPT09IHJpbmcubGVuZ3RoIC0gMSA/IHplcm8gOiBjLnN1YihiKS5fdW5pdCgpLl9wZXJwKCk7XG4gICAgICAgICAgICBjb25zdCBleHRydWRlID0gYVRvQi5fYWRkKGJUb0MpLl91bml0KCk7XG5cbiAgICAgICAgICAgIGNvbnN0IGNvc0hhbGZBbmdsZSA9IGV4dHJ1ZGUueCAqIGJUb0MueCArIGV4dHJ1ZGUueSAqIGJUb0MueTtcbiAgICAgICAgICAgIGV4dHJ1ZGUuX211bHQoMSAvIGNvc0hhbGZBbmdsZSk7XG5cbiAgICAgICAgICAgIG5ld1JpbmcucHVzaChleHRydWRlLl9tdWx0KG9mZnNldCkuX2FkZChiKSk7XG4gICAgICAgIH1cbiAgICAgICAgbmV3UmluZ3MucHVzaChuZXdSaW5nKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ld1JpbmdzO1xufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHsgY3JlYXRlTGF5b3V0IH0gZnJvbSAnLi4vLi4vdXRpbC9zdHJ1Y3RfYXJyYXknO1xuXG5leHBvcnQgY29uc3Qgc3ltYm9sTGF5b3V0QXR0cmlidXRlcyA9IGNyZWF0ZUxheW91dChbXG4gICAge25hbWU6ICdhX3Bvc19vZmZzZXQnLCAgY29tcG9uZW50czogNCwgdHlwZTogJ0ludDE2J30sXG4gICAge25hbWU6ICdhX2RhdGEnLCAgICAgICAgY29tcG9uZW50czogNCwgdHlwZTogJ1VpbnQxNid9XG5dKTtcblxuZXhwb3J0IGNvbnN0IGR5bmFtaWNMYXlvdXRBdHRyaWJ1dGVzID0gY3JlYXRlTGF5b3V0KFtcbiAgICB7IG5hbWU6ICdhX3Byb2plY3RlZF9wb3MnLCBjb21wb25lbnRzOiAzLCB0eXBlOiAnRmxvYXQzMicgfVxuXSwgNCk7XG5cbmV4cG9ydCBjb25zdCBwbGFjZW1lbnRPcGFjaXR5QXR0cmlidXRlcyA9IGNyZWF0ZUxheW91dChbXG4gICAgeyBuYW1lOiAnYV9mYWRlX29wYWNpdHknLCBjb21wb25lbnRzOiAxLCB0eXBlOiAnVWludDMyJyB9XG5dLCA0KTtcblxuZXhwb3J0IGNvbnN0IGNvbGxpc2lvblZlcnRleEF0dHJpYnV0ZXMgPSBjcmVhdGVMYXlvdXQoW1xuICAgIHsgbmFtZTogJ2FfcGxhY2VkJywgY29tcG9uZW50czogMiwgdHlwZTogJ1VpbnQ4JyB9LFxuICAgIHsgbmFtZTogJ2Ffc2hpZnQnLCBjb21wb25lbnRzOiAyLCB0eXBlOiAnRmxvYXQzMid9XG5dKTtcblxuZXhwb3J0IGNvbnN0IGNvbGxpc2lvbkJveCA9IGNyZWF0ZUxheW91dChbXG4gICAgLy8gdGhlIGJveCBpcyBjZW50ZXJlZCBhcm91bmQgdGhlIGFuY2hvciBwb2ludFxuICAgIHsgdHlwZTogJ0ludDE2JywgbmFtZTogJ2FuY2hvclBvaW50WCcgfSxcbiAgICB7IHR5cGU6ICdJbnQxNicsIG5hbWU6ICdhbmNob3JQb2ludFknIH0sXG5cbiAgICAvLyBkaXN0YW5jZXMgdG8gdGhlIGVkZ2VzIGZyb20gdGhlIGFuY2hvclxuICAgIHsgdHlwZTogJ0ludDE2JywgbmFtZTogJ3gxJyB9LFxuICAgIHsgdHlwZTogJ0ludDE2JywgbmFtZTogJ3kxJyB9LFxuICAgIHsgdHlwZTogJ0ludDE2JywgbmFtZTogJ3gyJyB9LFxuICAgIHsgdHlwZTogJ0ludDE2JywgbmFtZTogJ3kyJyB9LFxuXG4gICAgLy8gdGhlIGluZGV4IG9mIHRoZSBmZWF0dXJlIGluIHRoZSBvcmlnaW5hbCB2ZWN0b3J0aWxlXG4gICAgeyB0eXBlOiAnVWludDMyJywgbmFtZTogJ2ZlYXR1cmVJbmRleCcgfSxcbiAgICAvLyB0aGUgc291cmNlIGxheWVyIHRoZSBmZWF0dXJlIGFwcGVhcnMgaW5cbiAgICB7IHR5cGU6ICdVaW50MTYnLCBuYW1lOiAnc291cmNlTGF5ZXJJbmRleCcgfSxcbiAgICAvLyB0aGUgYnVja2V0IHRoZSBmZWF0dXJlIGFwcGVhcnMgaW5cbiAgICB7IHR5cGU6ICdVaW50MTYnLCBuYW1lOiAnYnVja2V0SW5kZXgnIH0sXG5cbiAgICAvLyBjb2xsaXNpb24gY2lyY2xlcyBmb3IgbGluZXMgc3RvcmUgdGhlaXIgZGlzdGFuY2UgdG8gdGhlIGFuY2hvciBpbiB0aWxlIHVuaXRzXG4gICAgLy8gc28gdGhhdCB0aGV5IGNhbiBiZSBpZ25vcmVkIGlmIHRoZSBwcm9qZWN0ZWQgbGFiZWwgZG9lc24ndCBleHRlbmQgaW50b1xuICAgIC8vIHRoZSBib3ggYXJlYVxuICAgIHsgdHlwZTogJ0ludDE2JywgbmFtZTogJ3JhZGl1cycgfSxcbiAgICB7IHR5cGU6ICdJbnQxNicsIG5hbWU6ICdzaWduZWREaXN0YW5jZUZyb21BbmNob3InIH1cbl0pO1xuXG5leHBvcnQgY29uc3QgY29sbGlzaW9uQm94TGF5b3V0ID0gY3JlYXRlTGF5b3V0KFsgLy8gdXNlZCB0byByZW5kZXIgY29sbGlzaW9uIGJveGVzIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXNcbiAgICB7bmFtZTogJ2FfcG9zJywgICAgICAgIGNvbXBvbmVudHM6IDIsIHR5cGU6ICdJbnQxNid9LFxuICAgIHtuYW1lOiAnYV9hbmNob3JfcG9zJywgY29tcG9uZW50czogMiwgdHlwZTogJ0ludDE2J30sXG4gICAge25hbWU6ICdhX2V4dHJ1ZGUnLCAgICBjb21wb25lbnRzOiAyLCB0eXBlOiAnSW50MTYnfVxuXSwgNCk7XG5cbmV4cG9ydCBjb25zdCBjb2xsaXNpb25DaXJjbGVMYXlvdXQgPSBjcmVhdGVMYXlvdXQoWyAvLyB1c2VkIHRvIHJlbmRlciBjb2xsaXNpb24gY2lyY2xlcyBmb3IgZGVidWdnaW5nIHB1cnBvc2VzXG4gICAge25hbWU6ICdhX3BvcycsICAgICAgICBjb21wb25lbnRzOiAyLCB0eXBlOiAnSW50MTYnfSxcbiAgICB7bmFtZTogJ2FfYW5jaG9yX3BvcycsIGNvbXBvbmVudHM6IDIsIHR5cGU6ICdJbnQxNid9LFxuICAgIHtuYW1lOiAnYV9leHRydWRlJywgICAgY29tcG9uZW50czogMiwgdHlwZTogJ0ludDE2J31cbl0sIDQpO1xuXG5leHBvcnQgY29uc3QgcGxhY2VtZW50ID0gY3JlYXRlTGF5b3V0KFtcbiAgICB7IHR5cGU6ICdJbnQxNicsIG5hbWU6ICdhbmNob3JYJyB9LFxuICAgIHsgdHlwZTogJ0ludDE2JywgbmFtZTogJ2FuY2hvclknIH0sXG4gICAgeyB0eXBlOiAnVWludDE2JywgbmFtZTogJ2dseXBoU3RhcnRJbmRleCcgfSxcbiAgICB7IHR5cGU6ICdVaW50MTYnLCBuYW1lOiAnbnVtR2x5cGhzJyB9LFxuICAgIHsgdHlwZTogJ1VpbnQzMicsIG5hbWU6ICd2ZXJ0ZXhTdGFydEluZGV4JyB9LFxuICAgIHsgdHlwZTogJ1VpbnQzMicsIG5hbWU6ICdsaW5lU3RhcnRJbmRleCcgfSxcbiAgICB7IHR5cGU6ICdVaW50MzInLCBuYW1lOiAnbGluZUxlbmd0aCcgfSxcbiAgICB7IHR5cGU6ICdVaW50MTYnLCBuYW1lOiAnc2VnbWVudCcgfSxcbiAgICB7IHR5cGU6ICdVaW50MTYnLCBuYW1lOiAnbG93ZXJTaXplJyB9LFxuICAgIHsgdHlwZTogJ1VpbnQxNicsIG5hbWU6ICd1cHBlclNpemUnIH0sXG4gICAgeyB0eXBlOiAnRmxvYXQzMicsIG5hbWU6ICdsaW5lT2Zmc2V0WCcgfSxcbiAgICB7IHR5cGU6ICdGbG9hdDMyJywgbmFtZTogJ2xpbmVPZmZzZXRZJyB9LFxuICAgIHsgdHlwZTogJ1VpbnQ4JywgbmFtZTogJ3dyaXRpbmdNb2RlJyB9LFxuICAgIHsgdHlwZTogJ1VpbnQ4JywgbmFtZTogJ2hpZGRlbicgfSxcbiAgICB7IHR5cGU6ICdVaW50MzInLCBuYW1lOiAnY3Jvc3NUaWxlSUQnfVxuXSk7XG5cbmV4cG9ydCBjb25zdCBzeW1ib2xJbnN0YW5jZSA9IGNyZWF0ZUxheW91dChbXG4gICAgeyB0eXBlOiAnSW50MTYnLCBuYW1lOiAnYW5jaG9yWCcgfSxcbiAgICB7IHR5cGU6ICdJbnQxNicsIG5hbWU6ICdhbmNob3JZJyB9LFxuICAgIHsgdHlwZTogJ0ludDE2JywgbmFtZTogJ3JpZ2h0SnVzdGlmaWVkVGV4dFN5bWJvbEluZGV4JyB9LFxuICAgIHsgdHlwZTogJ0ludDE2JywgbmFtZTogJ2NlbnRlckp1c3RpZmllZFRleHRTeW1ib2xJbmRleCcgfSxcbiAgICB7IHR5cGU6ICdJbnQxNicsIG5hbWU6ICdsZWZ0SnVzdGlmaWVkVGV4dFN5bWJvbEluZGV4JyB9LFxuICAgIHsgdHlwZTogJ0ludDE2JywgbmFtZTogJ3ZlcnRpY2FsUGxhY2VkVGV4dFN5bWJvbEluZGV4JyB9LFxuICAgIHsgdHlwZTogJ1VpbnQxNicsIG5hbWU6ICdrZXknIH0sXG4gICAgeyB0eXBlOiAnVWludDE2JywgbmFtZTogJ3RleHRCb3hTdGFydEluZGV4JyB9LFxuICAgIHsgdHlwZTogJ1VpbnQxNicsIG5hbWU6ICd0ZXh0Qm94RW5kSW5kZXgnIH0sXG4gICAgeyB0eXBlOiAnVWludDE2JywgbmFtZTogJ2ljb25Cb3hTdGFydEluZGV4JyB9LFxuICAgIHsgdHlwZTogJ1VpbnQxNicsIG5hbWU6ICdpY29uQm94RW5kSW5kZXgnIH0sXG4gICAgeyB0eXBlOiAnVWludDE2JywgbmFtZTogJ2ZlYXR1cmVJbmRleCcgfSxcbiAgICB7IHR5cGU6ICdVaW50MTYnLCBuYW1lOiAnbnVtSG9yaXpvbnRhbEdseXBoVmVydGljZXMnIH0sXG4gICAgeyB0eXBlOiAnVWludDE2JywgbmFtZTogJ251bVZlcnRpY2FsR2x5cGhWZXJ0aWNlcycgfSxcbiAgICB7IHR5cGU6ICdVaW50MTYnLCBuYW1lOiAnbnVtSWNvblZlcnRpY2VzJyB9LFxuICAgIHsgdHlwZTogJ1VpbnQzMicsIG5hbWU6ICdjcm9zc1RpbGVJRCcgfSxcbiAgICB7IHR5cGU6ICdGbG9hdDMyJywgbmFtZTogJ3RleHRCb3hTY2FsZSd9LFxuICAgIHsgdHlwZTogJ0Zsb2F0MzInLCBuYW1lOiAncmFkaWFsVGV4dE9mZnNldCd9XG5dKTtcblxuZXhwb3J0IGNvbnN0IGdseXBoT2Zmc2V0ID0gY3JlYXRlTGF5b3V0KFtcbiAgICB7IHR5cGU6ICdGbG9hdDMyJywgbmFtZTogJ29mZnNldFgnIH1cbl0pO1xuXG5leHBvcnQgY29uc3QgbGluZVZlcnRleCA9IGNyZWF0ZUxheW91dChbXG4gICAgeyB0eXBlOiAnSW50MTYnLCBuYW1lOiAneCcgfSxcbiAgICB7IHR5cGU6ICdJbnQxNicsIG5hbWU6ICd5JyB9LFxuICAgIHsgdHlwZTogJ0ludDE2JywgbmFtZTogJ3RpbGVVbml0RGlzdGFuY2VGcm9tQW5jaG9yJyB9XG5dKTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7IHBsdWdpbiBhcyBydGxUZXh0UGx1Z2luIH0gZnJvbSAnLi4vc291cmNlL3J0bF90ZXh0X3BsdWdpbic7XG5cbmltcG9ydCB0eXBlIFN5bWJvbFN0eWxlTGF5ZXIgZnJvbSAnLi4vc3R5bGUvc3R5bGVfbGF5ZXIvc3ltYm9sX3N0eWxlX2xheWVyJztcbmltcG9ydCB0eXBlIHtGZWF0dXJlfSBmcm9tICcuLi9zdHlsZS1zcGVjL2V4cHJlc3Npb24nO1xuaW1wb3J0IEZvcm1hdHRlZCBmcm9tICcuLi9zdHlsZS1zcGVjL2V4cHJlc3Npb24vdHlwZXMvZm9ybWF0dGVkJztcblxuZnVuY3Rpb24gdHJhbnNmb3JtVGV4dCh0ZXh0OiBzdHJpbmcsIGxheWVyOiBTeW1ib2xTdHlsZUxheWVyLCBmZWF0dXJlOiBGZWF0dXJlKSB7XG4gICAgY29uc3QgdHJhbnNmb3JtID0gbGF5ZXIubGF5b3V0LmdldCgndGV4dC10cmFuc2Zvcm0nKS5ldmFsdWF0ZShmZWF0dXJlLCB7fSk7XG4gICAgaWYgKHRyYW5zZm9ybSA9PT0gJ3VwcGVyY2FzZScpIHtcbiAgICAgICAgdGV4dCA9IHRleHQudG9Mb2NhbGVVcHBlckNhc2UoKTtcbiAgICB9IGVsc2UgaWYgKHRyYW5zZm9ybSA9PT0gJ2xvd2VyY2FzZScpIHtcbiAgICAgICAgdGV4dCA9IHRleHQudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICB9XG5cbiAgICBpZiAocnRsVGV4dFBsdWdpbi5hcHBseUFyYWJpY1NoYXBpbmcpIHtcbiAgICAgICAgdGV4dCA9IHJ0bFRleHRQbHVnaW4uYXBwbHlBcmFiaWNTaGFwaW5nKHRleHQpO1xuICAgIH1cblxuICAgIHJldHVybiB0ZXh0O1xufVxuXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHRleHQ6IEZvcm1hdHRlZCwgbGF5ZXI6IFN5bWJvbFN0eWxlTGF5ZXIsIGZlYXR1cmU6IEZlYXR1cmUpOiBGb3JtYXR0ZWQge1xuICAgIHRleHQuc2VjdGlvbnMuZm9yRWFjaChzZWN0aW9uID0+IHtcbiAgICAgICAgc2VjdGlvbi50ZXh0ID0gdHJhbnNmb3JtVGV4dChzZWN0aW9uLnRleHQsIGxheWVyLCBmZWF0dXJlKTtcbiAgICB9KTtcbiAgICByZXR1cm4gdGV4dDtcbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCB0eXBlIHtTeW1ib2xGZWF0dXJlfSBmcm9tICcuLi9kYXRhL2J1Y2tldC9zeW1ib2xfYnVja2V0JztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKGZlYXR1cmVzOiBBcnJheTxTeW1ib2xGZWF0dXJlPik6IEFycmF5PFN5bWJvbEZlYXR1cmU+IHtcbiAgICBjb25zdCBsZWZ0SW5kZXg6IHtbc3RyaW5nXTogbnVtYmVyfSA9IHt9O1xuICAgIGNvbnN0IHJpZ2h0SW5kZXg6IHtbc3RyaW5nXTogbnVtYmVyfSA9IHt9O1xuICAgIGNvbnN0IG1lcmdlZEZlYXR1cmVzID0gW107XG4gICAgbGV0IG1lcmdlZEluZGV4ID0gMDtcblxuICAgIGZ1bmN0aW9uIGFkZChrKSB7XG4gICAgICAgIG1lcmdlZEZlYXR1cmVzLnB1c2goZmVhdHVyZXNba10pO1xuICAgICAgICBtZXJnZWRJbmRleCsrO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1lcmdlRnJvbVJpZ2h0KGxlZnRLZXk6IHN0cmluZywgcmlnaHRLZXk6IHN0cmluZywgZ2VvbSkge1xuICAgICAgICBjb25zdCBpID0gcmlnaHRJbmRleFtsZWZ0S2V5XTtcbiAgICAgICAgZGVsZXRlIHJpZ2h0SW5kZXhbbGVmdEtleV07XG4gICAgICAgIHJpZ2h0SW5kZXhbcmlnaHRLZXldID0gaTtcblxuICAgICAgICBtZXJnZWRGZWF0dXJlc1tpXS5nZW9tZXRyeVswXS5wb3AoKTtcbiAgICAgICAgbWVyZ2VkRmVhdHVyZXNbaV0uZ2VvbWV0cnlbMF0gPSBtZXJnZWRGZWF0dXJlc1tpXS5nZW9tZXRyeVswXS5jb25jYXQoZ2VvbVswXSk7XG4gICAgICAgIHJldHVybiBpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1lcmdlRnJvbUxlZnQobGVmdEtleTogc3RyaW5nLCByaWdodEtleTogc3RyaW5nLCBnZW9tKSB7XG4gICAgICAgIGNvbnN0IGkgPSBsZWZ0SW5kZXhbcmlnaHRLZXldO1xuICAgICAgICBkZWxldGUgbGVmdEluZGV4W3JpZ2h0S2V5XTtcbiAgICAgICAgbGVmdEluZGV4W2xlZnRLZXldID0gaTtcblxuICAgICAgICBtZXJnZWRGZWF0dXJlc1tpXS5nZW9tZXRyeVswXS5zaGlmdCgpO1xuICAgICAgICBtZXJnZWRGZWF0dXJlc1tpXS5nZW9tZXRyeVswXSA9IGdlb21bMF0uY29uY2F0KG1lcmdlZEZlYXR1cmVzW2ldLmdlb21ldHJ5WzBdKTtcbiAgICAgICAgcmV0dXJuIGk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0S2V5KHRleHQsIGdlb20sIG9uUmlnaHQpIHtcbiAgICAgICAgY29uc3QgcG9pbnQgPSBvblJpZ2h0ID8gZ2VvbVswXVtnZW9tWzBdLmxlbmd0aCAtIDFdIDogZ2VvbVswXVswXTtcbiAgICAgICAgcmV0dXJuIGAke3RleHR9OiR7cG9pbnQueH06JHtwb2ludC55fWA7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgayA9IDA7IGsgPCBmZWF0dXJlcy5sZW5ndGg7IGsrKykge1xuICAgICAgICBjb25zdCBmZWF0dXJlID0gZmVhdHVyZXNba107XG4gICAgICAgIGNvbnN0IGdlb20gPSBmZWF0dXJlLmdlb21ldHJ5O1xuICAgICAgICBjb25zdCB0ZXh0ID0gZmVhdHVyZS50ZXh0ID8gZmVhdHVyZS50ZXh0LnRvU3RyaW5nKCkgOiBudWxsO1xuXG4gICAgICAgIGlmICghdGV4dCkge1xuICAgICAgICAgICAgYWRkKGspO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsZWZ0S2V5ID0gZ2V0S2V5KHRleHQsIGdlb20pLFxuICAgICAgICAgICAgcmlnaHRLZXkgPSBnZXRLZXkodGV4dCwgZ2VvbSwgdHJ1ZSk7XG5cbiAgICAgICAgaWYgKChsZWZ0S2V5IGluIHJpZ2h0SW5kZXgpICYmIChyaWdodEtleSBpbiBsZWZ0SW5kZXgpICYmIChyaWdodEluZGV4W2xlZnRLZXldICE9PSBsZWZ0SW5kZXhbcmlnaHRLZXldKSkge1xuICAgICAgICAgICAgLy8gZm91bmQgbGluZXMgd2l0aCB0aGUgc2FtZSB0ZXh0IGFkamFjZW50IHRvIGJvdGggZW5kcyBvZiB0aGUgY3VycmVudCBsaW5lLCBtZXJnZSBhbGwgdGhyZWVcbiAgICAgICAgICAgIGNvbnN0IGogPSBtZXJnZUZyb21MZWZ0KGxlZnRLZXksIHJpZ2h0S2V5LCBnZW9tKTtcbiAgICAgICAgICAgIGNvbnN0IGkgPSBtZXJnZUZyb21SaWdodChsZWZ0S2V5LCByaWdodEtleSwgbWVyZ2VkRmVhdHVyZXNbal0uZ2VvbWV0cnkpO1xuXG4gICAgICAgICAgICBkZWxldGUgbGVmdEluZGV4W2xlZnRLZXldO1xuICAgICAgICAgICAgZGVsZXRlIHJpZ2h0SW5kZXhbcmlnaHRLZXldO1xuXG4gICAgICAgICAgICByaWdodEluZGV4W2dldEtleSh0ZXh0LCBtZXJnZWRGZWF0dXJlc1tpXS5nZW9tZXRyeSwgdHJ1ZSldID0gaTtcbiAgICAgICAgICAgIG1lcmdlZEZlYXR1cmVzW2pdLmdlb21ldHJ5ID0gKG51bGw6IGFueSk7XG5cbiAgICAgICAgfSBlbHNlIGlmIChsZWZ0S2V5IGluIHJpZ2h0SW5kZXgpIHtcbiAgICAgICAgICAgIC8vIGZvdW5kIG1lcmdlYWJsZSBsaW5lIGFkamFjZW50IHRvIHRoZSBzdGFydCBvZiB0aGUgY3VycmVudCBsaW5lLCBtZXJnZVxuICAgICAgICAgICAgbWVyZ2VGcm9tUmlnaHQobGVmdEtleSwgcmlnaHRLZXksIGdlb20pO1xuXG4gICAgICAgIH0gZWxzZSBpZiAocmlnaHRLZXkgaW4gbGVmdEluZGV4KSB7XG4gICAgICAgICAgICAvLyBmb3VuZCBtZXJnZWFibGUgbGluZSBhZGphY2VudCB0byB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IGxpbmUsIG1lcmdlXG4gICAgICAgICAgICBtZXJnZUZyb21MZWZ0KGxlZnRLZXksIHJpZ2h0S2V5LCBnZW9tKTtcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gbm8gYWRqYWNlbnQgbGluZXMsIGFkZCBhcyBhIG5ldyBpdGVtXG4gICAgICAgICAgICBhZGQoayk7XG4gICAgICAgICAgICBsZWZ0SW5kZXhbbGVmdEtleV0gPSBtZXJnZWRJbmRleCAtIDE7XG4gICAgICAgICAgICByaWdodEluZGV4W3JpZ2h0S2V5XSA9IG1lcmdlZEluZGV4IC0gMTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBtZXJnZWRGZWF0dXJlcy5maWx0ZXIoKGYpID0+IGYuZ2VvbWV0cnkpO1xufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHtcbiAgICBjaGFySGFzUm90YXRlZFZlcnRpY2FsT3JpZW50YXRpb24sXG59IGZyb20gJy4vc2NyaXB0X2RldGVjdGlvbic7XG5cbmV4cG9ydCBjb25zdCB2ZXJ0aWNhbGl6ZWRDaGFyYWN0ZXJNYXAgPSB7XG4gICAgJyEnOiAnw6/CuMKVJyxcbiAgICAnIyc6ICfDr8K8woMnLFxuICAgICckJzogJ8OvwrzChCcsXG4gICAgJyUnOiAnw6/CvMKFJyxcbiAgICAnJic6ICfDr8K8woYnLFxuICAgICcoJzogJ8OvwrjCtScsXG4gICAgJyknOiAnw6/CuMK2JyxcbiAgICAnKic6ICfDr8K8woonLFxuICAgICcrJzogJ8OvwrzCiycsXG4gICAgJywnOiAnw6/CuMKQJyxcbiAgICAnLSc6ICfDr8K4wrInLFxuICAgICcuJzogJ8OjwoPCuycsXG4gICAgJy8nOiAnw6/CvMKPJyxcbiAgICAnOic6ICfDr8K4wpMnLFxuICAgICc7JzogJ8OvwrjClCcsXG4gICAgJzwnOiAnw6/CuMK/JyxcbiAgICAnPSc6ICfDr8K8wp0nLFxuICAgICc+JzogJ8OvwrnCgCcsXG4gICAgJz8nOiAnw6/CuMKWJyxcbiAgICAnQCc6ICfDr8K8wqAnLFxuICAgICdbJzogJ8OvwrnChycsXG4gICAgJ1xcXFwnOiAnw6/CvMK8JyxcbiAgICAnXSc6ICfDr8K5wognLFxuICAgICdeJzogJ8OvwrzCvicsXG4gICAgJ18nOiAnw6/CuMKzJyxcbiAgICAnYCc6ICfDr8K9woAnLFxuICAgICd7JzogJ8OvwrjCtycsXG4gICAgJ3wnOiAnw6LCgMKVJyxcbiAgICAnfSc6ICfDr8K4wrgnLFxuICAgICd+JzogJ8Ovwr3CnicsXG4gICAgJ8OCwqInOiAnw6/Cv8KgJyxcbiAgICAnw4LCoyc6ICfDr8K/wqEnLFxuICAgICfDgsKlJzogJ8Ovwr/CpScsXG4gICAgJ8OCwqYnOiAnw6/Cv8KkJyxcbiAgICAnw4LCrCc6ICfDr8K/wqInLFxuICAgICfDgsKvJzogJ8Ovwr/CoycsXG4gICAgJ8OiwoDCkyc6ICfDr8K4wrInLFxuICAgICfDosKAwpQnOiAnw6/CuMKxJyxcbiAgICAnw6LCgMKYJzogJ8OvwrnCgycsXG4gICAgJ8OiwoDCmSc6ICfDr8K5woQnLFxuICAgICfDosKAwpwnOiAnw6/CucKBJyxcbiAgICAnw6LCgMKdJzogJ8OvwrnCgicsXG4gICAgJ8OiwoDCpic6ICfDr8K4wpknLFxuICAgICfDosKAwqcnOiAnw6PCg8K7JyxcbiAgICAnw6LCgsKpJzogJ8Ovwr/CpicsXG4gICAgJ8OjwoDCgSc6ICfDr8K4wpEnLFxuICAgICfDo8KAwoInOiAnw6/CuMKSJyxcbiAgICAnw6PCgMKIJzogJ8OvwrjCvycsXG4gICAgJ8OjwoDCiSc6ICfDr8K5woAnLFxuICAgICfDo8KAwoonOiAnw6/CuMK9JyxcbiAgICAnw6PCgMKLJzogJ8OvwrjCvicsXG4gICAgJ8OjwoDCjCc6ICfDr8K5woEnLFxuICAgICfDo8KAwo0nOiAnw6/CucKCJyxcbiAgICAnw6PCgMKOJzogJ8OvwrnCgycsXG4gICAgJ8OjwoDCjyc6ICfDr8K5woQnLFxuICAgICfDo8KAwpAnOiAnw6/CuMK7JyxcbiAgICAnw6PCgMKRJzogJ8OvwrjCvCcsXG4gICAgJ8OjwoDClCc6ICfDr8K4wrknLFxuICAgICfDo8KAwpUnOiAnw6/CuMK6JyxcbiAgICAnw6PCgMKWJzogJ8OvwrjClycsXG4gICAgJ8OjwoDClyc6ICfDr8K4wpgnLFxuICAgICfDr8K8woEnOiAnw6/CuMKVJyxcbiAgICAnw6/CvMKIJzogJ8OvwrjCtScsXG4gICAgJ8OvwrzCiSc6ICfDr8K4wrYnLFxuICAgICfDr8K8wownOiAnw6/CuMKQJyxcbiAgICAnw6/CvMKNJzogJ8OvwrjCsicsXG4gICAgJ8OvwrzCjic6ICfDo8KDwrsnLFxuICAgICfDr8K8wponOiAnw6/CuMKTJyxcbiAgICAnw6/CvMKbJzogJ8OvwrjClCcsXG4gICAgJ8OvwrzCnCc6ICfDr8K4wr8nLFxuICAgICfDr8K8wp4nOiAnw6/CucKAJyxcbiAgICAnw6/CvMKfJzogJ8OvwrjClicsXG4gICAgJ8OvwrzCuyc6ICfDr8K5wocnLFxuICAgICfDr8K8wr0nOiAnw6/CucKIJyxcbiAgICAnw6/CvMK/JzogJ8OvwrjCsycsXG4gICAgJ8Ovwr3Cmyc6ICfDr8K4wrcnLFxuICAgICfDr8K9wpwnOiAnw6LCgMKVJyxcbiAgICAnw6/CvcKdJzogJ8OvwrjCuCcsXG4gICAgJ8Ovwr3Cnyc6ICfDr8K4wrUnLFxuICAgICfDr8K9wqAnOiAnw6/CuMK2JyxcbiAgICAnw6/CvcKhJzogJ8OvwrjCkicsXG4gICAgJ8Ovwr3Coic6ICfDr8K5woEnLFxuICAgICfDr8K9wqMnOiAnw6/CucKCJ1xufTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdmVydGljYWxpemVQdW5jdHVhdGlvbihpbnB1dDogc3RyaW5nKSB7XG4gICAgbGV0IG91dHB1dCA9ICcnO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnB1dC5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBuZXh0Q2hhckNvZGUgPSBpbnB1dC5jaGFyQ29kZUF0KGkgKyAxKSB8fCBudWxsO1xuICAgICAgICBjb25zdCBwcmV2Q2hhckNvZGUgPSBpbnB1dC5jaGFyQ29kZUF0KGkgLSAxKSB8fCBudWxsO1xuXG4gICAgICAgIGNvbnN0IGNhblJlcGxhY2VQdW5jdHVhdGlvbiA9IChcbiAgICAgICAgICAgICghbmV4dENoYXJDb2RlIHx8ICFjaGFySGFzUm90YXRlZFZlcnRpY2FsT3JpZW50YXRpb24obmV4dENoYXJDb2RlKSB8fCB2ZXJ0aWNhbGl6ZWRDaGFyYWN0ZXJNYXBbaW5wdXRbaSArIDFdXSkgJiZcbiAgICAgICAgICAgICghcHJldkNoYXJDb2RlIHx8ICFjaGFySGFzUm90YXRlZFZlcnRpY2FsT3JpZW50YXRpb24ocHJldkNoYXJDb2RlKSB8fCB2ZXJ0aWNhbGl6ZWRDaGFyYWN0ZXJNYXBbaW5wdXRbaSAtIDFdXSlcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoY2FuUmVwbGFjZVB1bmN0dWF0aW9uICYmIHZlcnRpY2FsaXplZENoYXJhY3Rlck1hcFtpbnB1dFtpXV0pIHtcbiAgICAgICAgICAgIG91dHB1dCArPSB2ZXJ0aWNhbGl6ZWRDaGFyYWN0ZXJNYXBbaW5wdXRbaV1dO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb3V0cHV0ICs9IGlucHV0W2ldO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG91dHB1dDtcbn1cblxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuXG5pbXBvcnQgeyByZWdpc3RlciB9IGZyb20gJy4uL3V0aWwvd2ViX3dvcmtlcl90cmFuc2Zlcic7XG5cbmNsYXNzIEFuY2hvciBleHRlbmRzIFBvaW50IHtcbiAgICBhbmdsZTogYW55O1xuICAgIHNlZ21lbnQ6IG51bWJlciB8IHZvaWQ7XG5cbiAgICBjb25zdHJ1Y3Rvcih4OiBudW1iZXIsIHk6IG51bWJlciwgYW5nbGU6IG51bWJlciwgc2VnbWVudD86IG51bWJlcikge1xuICAgICAgICBzdXBlcih4LCB5KTtcbiAgICAgICAgdGhpcy5hbmdsZSA9IGFuZ2xlO1xuICAgICAgICBpZiAoc2VnbWVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLnNlZ21lbnQgPSBzZWdtZW50O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY2xvbmUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQW5jaG9yKHRoaXMueCwgdGhpcy55LCB0aGlzLmFuZ2xlLCB0aGlzLnNlZ21lbnQpO1xuICAgIH1cbn1cblxucmVnaXN0ZXIoJ0FuY2hvcicsIEFuY2hvcik7XG5cbmV4cG9ydCBkZWZhdWx0IEFuY2hvcjtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7IG5vcm1hbGl6ZVByb3BlcnR5RXhwcmVzc2lvbiB9IGZyb20gJy4uL3N0eWxlLXNwZWMvZXhwcmVzc2lvbic7XG5cbmltcG9ydCB7IG51bWJlciBhcyBpbnRlcnBvbGF0ZSB9IGZyb20gJy4uL3N0eWxlLXNwZWMvdXRpbC9pbnRlcnBvbGF0ZSc7XG5pbXBvcnQgeyBjbGFtcCB9IGZyb20gJy4uL3V0aWwvdXRpbCc7XG5pbXBvcnQgRXZhbHVhdGlvblBhcmFtZXRlcnMgZnJvbSAnLi4vc3R5bGUvZXZhbHVhdGlvbl9wYXJhbWV0ZXJzJztcblxuaW1wb3J0IHR5cGUge1Byb3BlcnR5LCBQcm9wZXJ0eVZhbHVlLCBQb3NzaWJseUV2YWx1YXRlZFByb3BlcnR5VmFsdWV9IGZyb20gJy4uL3N0eWxlL3Byb3BlcnRpZXMnO1xuaW1wb3J0IHR5cGUge0NhbWVyYUV4cHJlc3Npb24sIENvbXBvc2l0ZUV4cHJlc3Npb259IGZyb20gJy4uL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9pbmRleCc7XG5pbXBvcnQgdHlwZSB7UHJvcGVydHlWYWx1ZVNwZWNpZmljYXRpb259IGZyb20gJy4uL3N0eWxlLXNwZWMvdHlwZXMnO1xuXG5jb25zdCBTSVpFX1BBQ0tfRkFDVE9SID0gMjU2O1xuXG5leHBvcnQgeyBnZXRTaXplRGF0YSwgZXZhbHVhdGVTaXplRm9yRmVhdHVyZSwgZXZhbHVhdGVTaXplRm9yWm9vbSwgU0laRV9QQUNLX0ZBQ1RPUiB9O1xuXG5leHBvcnQgdHlwZSBTaXplRGF0YSA9IHtcbiAgICBmdW5jdGlvblR5cGU6ICdjb25zdGFudCcsXG4gICAgbGF5b3V0U2l6ZTogbnVtYmVyXG59IHwge1xuICAgIGZ1bmN0aW9uVHlwZTogJ3NvdXJjZSdcbn0gfCB7XG4gICAgZnVuY3Rpb25UeXBlOiAnY2FtZXJhJyxcbiAgICBsYXlvdXRTaXplOiBudW1iZXIsXG4gICAgem9vbVJhbmdlOiB7bWluOiBudW1iZXIsIG1heDogbnVtYmVyfSxcbiAgICBzaXplUmFuZ2U6IHttaW46IG51bWJlciwgbWF4OiBudW1iZXJ9LFxuICAgIHByb3BlcnR5VmFsdWU6IFByb3BlcnR5VmFsdWVTcGVjaWZpY2F0aW9uPG51bWJlcj5cbn0gfCB7XG4gICAgZnVuY3Rpb25UeXBlOiAnY29tcG9zaXRlJyxcbiAgICB6b29tUmFuZ2U6IHttaW46IG51bWJlciwgbWF4OiBudW1iZXJ9LFxuICAgIHByb3BlcnR5VmFsdWU6IFByb3BlcnR5VmFsdWVTcGVjaWZpY2F0aW9uPG51bWJlcj5cbn07XG5cbi8vIEZvciB7dGV4dCxpY29ufS1zaXplLCBnZXQgdGhlIGJ1Y2tldC1sZXZlbCBkYXRhIHRoYXQgd2lsbCBiZSBuZWVkZWQgYnlcbi8vIHRoZSBwYWludGVyIHRvIHNldCBzeW1ib2wtc2l6ZS1yZWxhdGVkIHVuaWZvcm1zXG5mdW5jdGlvbiBnZXRTaXplRGF0YSh0aWxlWm9vbTogbnVtYmVyLCB2YWx1ZTogUHJvcGVydHlWYWx1ZTxudW1iZXIsIFBvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZTxudW1iZXI+Pik6IFNpemVEYXRhIHtcbiAgICBjb25zdCB7ZXhwcmVzc2lvbn0gPSB2YWx1ZTtcbiAgICBpZiAoZXhwcmVzc2lvbi5raW5kID09PSAnY29uc3RhbnQnKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBmdW5jdGlvblR5cGU6ICdjb25zdGFudCcsXG4gICAgICAgICAgICBsYXlvdXRTaXplOiBleHByZXNzaW9uLmV2YWx1YXRlKG5ldyBFdmFsdWF0aW9uUGFyYW1ldGVycyh0aWxlWm9vbSArIDEpKVxuICAgICAgICB9O1xuICAgIH0gZWxzZSBpZiAoZXhwcmVzc2lvbi5raW5kID09PSAnc291cmNlJykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZnVuY3Rpb25UeXBlOiAnc291cmNlJ1xuICAgICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGNhbGN1bGF0ZSBjb3ZlcmluZyB6b29tIHN0b3BzIGZvciB6b29tLWRlcGVuZGVudCB2YWx1ZXNcbiAgICAgICAgY29uc3QgbGV2ZWxzID0gZXhwcmVzc2lvbi56b29tU3RvcHM7XG5cbiAgICAgICAgbGV0IGxvd2VyID0gMDtcbiAgICAgICAgd2hpbGUgKGxvd2VyIDwgbGV2ZWxzLmxlbmd0aCAmJiBsZXZlbHNbbG93ZXJdIDw9IHRpbGVab29tKSBsb3dlcisrO1xuICAgICAgICBsb3dlciA9IE1hdGgubWF4KDAsIGxvd2VyIC0gMSk7XG4gICAgICAgIGxldCB1cHBlciA9IGxvd2VyO1xuICAgICAgICB3aGlsZSAodXBwZXIgPCBsZXZlbHMubGVuZ3RoICYmIGxldmVsc1t1cHBlcl0gPCB0aWxlWm9vbSArIDEpIHVwcGVyKys7XG4gICAgICAgIHVwcGVyID0gTWF0aC5taW4obGV2ZWxzLmxlbmd0aCAtIDEsIHVwcGVyKTtcblxuICAgICAgICBjb25zdCB6b29tUmFuZ2UgPSB7XG4gICAgICAgICAgICBtaW46IGxldmVsc1tsb3dlcl0sXG4gICAgICAgICAgICBtYXg6IGxldmVsc1t1cHBlcl1cbiAgICAgICAgfTtcblxuICAgICAgICAvLyBXZSdkIGxpa2UgdG8gYmUgYWJsZSB0byB1c2UgQ2FtZXJhRXhwcmVzc2lvbiBvciBDb21wb3NpdGVFeHByZXNzaW9uIGluIHRoZXNlXG4gICAgICAgIC8vIHJldHVybiB0eXBlcyByYXRoZXIgdGhhbiBFeHByZXNzaW9uU3BlY2lmaWNhdGlvbiwgYnV0IHRoZSBmb3JtZXIgYXJlIG5vdFxuICAgICAgICAvLyB0cmFuc2ZlcnJhYmxlIGFjcm9zcyBXZWIgV29ya2VyIGJvdW5kYXJpZXMuXG4gICAgICAgIGlmIChleHByZXNzaW9uLmtpbmQgPT09ICdjb21wb3NpdGUnKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGZ1bmN0aW9uVHlwZTogJ2NvbXBvc2l0ZScsXG4gICAgICAgICAgICAgICAgem9vbVJhbmdlLFxuICAgICAgICAgICAgICAgIHByb3BlcnR5VmFsdWU6ICh2YWx1ZS52YWx1ZTogYW55KVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGZvciBjYW1lcmEgZnVuY3Rpb25zLCBhbHNvIHNhdmUgb2ZmIHRoZSBmdW5jdGlvbiB2YWx1ZXNcbiAgICAgICAgICAgIC8vIGV2YWx1YXRlZCBhdCB0aGUgY292ZXJpbmcgem9vbSBsZXZlbHNcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZnVuY3Rpb25UeXBlOiAnY2FtZXJhJyxcbiAgICAgICAgICAgICAgICBsYXlvdXRTaXplOiBleHByZXNzaW9uLmV2YWx1YXRlKG5ldyBFdmFsdWF0aW9uUGFyYW1ldGVycyh0aWxlWm9vbSArIDEpKSxcbiAgICAgICAgICAgICAgICB6b29tUmFuZ2UsXG4gICAgICAgICAgICAgICAgc2l6ZVJhbmdlOiB7XG4gICAgICAgICAgICAgICAgICAgIG1pbjogZXhwcmVzc2lvbi5ldmFsdWF0ZShuZXcgRXZhbHVhdGlvblBhcmFtZXRlcnMoem9vbVJhbmdlLm1pbikpLFxuICAgICAgICAgICAgICAgICAgICBtYXg6IGV4cHJlc3Npb24uZXZhbHVhdGUobmV3IEV2YWx1YXRpb25QYXJhbWV0ZXJzKHpvb21SYW5nZS5tYXgpKVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcHJvcGVydHlWYWx1ZTogKHZhbHVlLnZhbHVlOiBhbnkpXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxufVxuXG5mdW5jdGlvbiBldmFsdWF0ZVNpemVGb3JGZWF0dXJlKHNpemVEYXRhOiBTaXplRGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydGlhbGx5RXZhbHVhdGVkU2l6ZTogeyB1U2l6ZTogbnVtYmVyLCB1U2l6ZVQ6IG51bWJlciB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2w6IHsgbG93ZXJTaXplOiBudW1iZXIsIHVwcGVyU2l6ZTogbnVtYmVyfSkge1xuICAgIGNvbnN0IHBhcnQgPSBwYXJ0aWFsbHlFdmFsdWF0ZWRTaXplO1xuICAgIGlmIChzaXplRGF0YS5mdW5jdGlvblR5cGUgPT09ICdzb3VyY2UnKSB7XG4gICAgICAgIHJldHVybiBzeW1ib2wubG93ZXJTaXplIC8gU0laRV9QQUNLX0ZBQ1RPUjtcbiAgICB9IGVsc2UgaWYgKHNpemVEYXRhLmZ1bmN0aW9uVHlwZSA9PT0gJ2NvbXBvc2l0ZScpIHtcbiAgICAgICAgcmV0dXJuIGludGVycG9sYXRlKHN5bWJvbC5sb3dlclNpemUgLyBTSVpFX1BBQ0tfRkFDVE9SLCBzeW1ib2wudXBwZXJTaXplIC8gU0laRV9QQUNLX0ZBQ1RPUiwgcGFydC51U2l6ZVQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBwYXJ0LnVTaXplO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZXZhbHVhdGVTaXplRm9yWm9vbShzaXplRGF0YTogU2l6ZURhdGEsIGN1cnJlbnRab29tOiBudW1iZXIsIHByb3BlcnR5OiBQcm9wZXJ0eTxudW1iZXIsIFBvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZTxudW1iZXI+Pikge1xuICAgIGlmIChzaXplRGF0YS5mdW5jdGlvblR5cGUgPT09ICdjb25zdGFudCcpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHVTaXplVDogMCxcbiAgICAgICAgICAgIHVTaXplOiBzaXplRGF0YS5sYXlvdXRTaXplXG4gICAgICAgIH07XG4gICAgfSBlbHNlIGlmIChzaXplRGF0YS5mdW5jdGlvblR5cGUgPT09ICdzb3VyY2UnKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB1U2l6ZVQ6IDAsXG4gICAgICAgICAgICB1U2l6ZTogMFxuICAgICAgICB9O1xuICAgIH0gZWxzZSBpZiAoc2l6ZURhdGEuZnVuY3Rpb25UeXBlID09PSAnY2FtZXJhJykge1xuICAgICAgICBjb25zdCB7cHJvcGVydHlWYWx1ZSwgem9vbVJhbmdlLCBzaXplUmFuZ2V9ID0gc2l6ZURhdGE7XG4gICAgICAgIGNvbnN0IGV4cHJlc3Npb24gPSAoKG5vcm1hbGl6ZVByb3BlcnR5RXhwcmVzc2lvbihwcm9wZXJ0eVZhbHVlLCBwcm9wZXJ0eS5zcGVjaWZpY2F0aW9uKTogYW55KTogQ2FtZXJhRXhwcmVzc2lvbik7XG5cbiAgICAgICAgLy8gRXZlbiB0aG91Z2ggd2UgY291bGQgZ2V0IHRoZSBleGFjdCB2YWx1ZSBvZiB0aGUgY2FtZXJhIGZ1bmN0aW9uXG4gICAgICAgIC8vIGF0IHogPSB0ci56b29tLCB3ZSBpbnRlbnRpb25hbGx5IGRvIG5vdDogaW5zdGVhZCwgd2UgaW50ZXJwb2xhdGVcbiAgICAgICAgLy8gYmV0d2VlbiB0aGUgY2FtZXJhIGZ1bmN0aW9uIHZhbHVlcyBhdCBhIHBhaXIgb2Ygem9vbSBzdG9wcyBjb3ZlcmluZ1xuICAgICAgICAvLyBbdGlsZVpvb20sIHRpbGVab29tICsgMV0gaW4gb3JkZXIgdG8gYmUgY29uc2lzdGVudCB3aXRoIHRoaXNcbiAgICAgICAgLy8gcmVzdHJpY3Rpb24gb24gY29tcG9zaXRlIGZ1bmN0aW9uc1xuICAgICAgICBjb25zdCB0ID0gY2xhbXAoXG4gICAgICAgICAgICBleHByZXNzaW9uLmludGVycG9sYXRpb25GYWN0b3IoY3VycmVudFpvb20sIHpvb21SYW5nZS5taW4sIHpvb21SYW5nZS5tYXgpLFxuICAgICAgICAgICAgMCxcbiAgICAgICAgICAgIDFcbiAgICAgICAgKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdVNpemVUOiAwLFxuICAgICAgICAgICAgdVNpemU6IHNpemVSYW5nZS5taW4gKyB0ICogKHNpemVSYW5nZS5tYXggLSBzaXplUmFuZ2UubWluKVxuICAgICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHtwcm9wZXJ0eVZhbHVlLCB6b29tUmFuZ2V9ID0gc2l6ZURhdGE7XG4gICAgICAgIGNvbnN0IGV4cHJlc3Npb24gPSAoKG5vcm1hbGl6ZVByb3BlcnR5RXhwcmVzc2lvbihwcm9wZXJ0eVZhbHVlLCBwcm9wZXJ0eS5zcGVjaWZpY2F0aW9uKTogYW55KTogQ29tcG9zaXRlRXhwcmVzc2lvbik7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHVTaXplVDogY2xhbXAoXG4gICAgICAgICAgICAgICAgZXhwcmVzc2lvbi5pbnRlcnBvbGF0aW9uRmFjdG9yKGN1cnJlbnRab29tLCB6b29tUmFuZ2UubWluLCB6b29tUmFuZ2UubWF4KSxcbiAgICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICAgIDFcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICB1U2l6ZTogMFxuICAgICAgICB9O1xuICAgIH1cbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7IHN5bWJvbExheW91dEF0dHJpYnV0ZXMsXG4gICAgY29sbGlzaW9uVmVydGV4QXR0cmlidXRlcyxcbiAgICBjb2xsaXNpb25Cb3hMYXlvdXQsXG4gICAgY29sbGlzaW9uQ2lyY2xlTGF5b3V0LFxuICAgIGR5bmFtaWNMYXlvdXRBdHRyaWJ1dGVzXG59IGZyb20gJy4vc3ltYm9sX2F0dHJpYnV0ZXMnO1xuXG5pbXBvcnQgeyBTeW1ib2xMYXlvdXRBcnJheSxcbiAgICBTeW1ib2xEeW5hbWljTGF5b3V0QXJyYXksXG4gICAgU3ltYm9sT3BhY2l0eUFycmF5LFxuICAgIENvbGxpc2lvbkJveExheW91dEFycmF5LFxuICAgIENvbGxpc2lvbkNpcmNsZUxheW91dEFycmF5LFxuICAgIENvbGxpc2lvblZlcnRleEFycmF5LFxuICAgIFBsYWNlZFN5bWJvbEFycmF5LFxuICAgIFN5bWJvbEluc3RhbmNlQXJyYXksXG4gICAgR2x5cGhPZmZzZXRBcnJheSxcbiAgICBTeW1ib2xMaW5lVmVydGV4QXJyYXlcbn0gZnJvbSAnLi4vYXJyYXlfdHlwZXMnO1xuXG5pbXBvcnQgUG9pbnQgZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XG5pbXBvcnQgU2VnbWVudFZlY3RvciBmcm9tICcuLi9zZWdtZW50JztcbmltcG9ydCB7IFByb2dyYW1Db25maWd1cmF0aW9uU2V0IH0gZnJvbSAnLi4vcHJvZ3JhbV9jb25maWd1cmF0aW9uJztcbmltcG9ydCB7IFRyaWFuZ2xlSW5kZXhBcnJheSwgTGluZUluZGV4QXJyYXkgfSBmcm9tICcuLi9pbmRleF9hcnJheV90eXBlJztcbmltcG9ydCB0cmFuc2Zvcm1UZXh0IGZyb20gJy4uLy4uL3N5bWJvbC90cmFuc2Zvcm1fdGV4dCc7XG5pbXBvcnQgbWVyZ2VMaW5lcyBmcm9tICcuLi8uLi9zeW1ib2wvbWVyZ2VsaW5lcyc7XG5pbXBvcnQge2FsbG93c1ZlcnRpY2FsV3JpdGluZ01vZGV9IGZyb20gJy4uLy4uL3V0aWwvc2NyaXB0X2RldGVjdGlvbic7XG5pbXBvcnQgbG9hZEdlb21ldHJ5IGZyb20gJy4uL2xvYWRfZ2VvbWV0cnknO1xuaW1wb3J0IG12dCBmcm9tICdAbWFwYm94L3ZlY3Rvci10aWxlJztcbmNvbnN0IHZlY3RvclRpbGVGZWF0dXJlVHlwZXMgPSBtdnQuVmVjdG9yVGlsZUZlYXR1cmUudHlwZXM7XG5pbXBvcnQge3ZlcnRpY2FsaXplZENoYXJhY3Rlck1hcH0gZnJvbSAnLi4vLi4vdXRpbC92ZXJ0aWNhbGl6ZV9wdW5jdHVhdGlvbic7XG5pbXBvcnQgQW5jaG9yIGZyb20gJy4uLy4uL3N5bWJvbC9hbmNob3InO1xuaW1wb3J0IHsgZ2V0U2l6ZURhdGEgfSBmcm9tICcuLi8uLi9zeW1ib2wvc3ltYm9sX3NpemUnO1xuaW1wb3J0IHsgcmVnaXN0ZXIgfSBmcm9tICcuLi8uLi91dGlsL3dlYl93b3JrZXJfdHJhbnNmZXInO1xuaW1wb3J0IEV2YWx1YXRpb25QYXJhbWV0ZXJzIGZyb20gJy4uLy4uL3N0eWxlL2V2YWx1YXRpb25fcGFyYW1ldGVycyc7XG5pbXBvcnQgRm9ybWF0dGVkIGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi90eXBlcy9mb3JtYXR0ZWQnO1xuXG5cbmltcG9ydCB0eXBlIHtcbiAgICBCdWNrZXQsXG4gICAgQnVja2V0UGFyYW1ldGVycyxcbiAgICBJbmRleGVkRmVhdHVyZSxcbiAgICBQb3B1bGF0ZVBhcmFtZXRlcnNcbn0gZnJvbSAnLi4vYnVja2V0JztcbmltcG9ydCB0eXBlIHtDb2xsaXNpb25Cb3hBcnJheSwgQ29sbGlzaW9uQm94LCBTeW1ib2xJbnN0YW5jZX0gZnJvbSAnLi4vYXJyYXlfdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBTdHJ1Y3RBcnJheSwgU3RydWN0QXJyYXlNZW1iZXIgfSBmcm9tICcuLi8uLi91dGlsL3N0cnVjdF9hcnJheSc7XG5pbXBvcnQgdHlwZSBTeW1ib2xTdHlsZUxheWVyIGZyb20gJy4uLy4uL3N0eWxlL3N0eWxlX2xheWVyL3N5bWJvbF9zdHlsZV9sYXllcic7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gJy4uLy4uL2dsL2NvbnRleHQnO1xuaW1wb3J0IHR5cGUgSW5kZXhCdWZmZXIgZnJvbSAnLi4vLi4vZ2wvaW5kZXhfYnVmZmVyJztcbmltcG9ydCB0eXBlIFZlcnRleEJ1ZmZlciBmcm9tICcuLi8uLi9nbC92ZXJ0ZXhfYnVmZmVyJztcbmltcG9ydCB0eXBlIHtTeW1ib2xRdWFkfSBmcm9tICcuLi8uLi9zeW1ib2wvcXVhZHMnO1xuaW1wb3J0IHR5cGUge1NpemVEYXRhfSBmcm9tICcuLi8uLi9zeW1ib2wvc3ltYm9sX3NpemUnO1xuaW1wb3J0IHR5cGUge0ZlYXR1cmVTdGF0ZXN9IGZyb20gJy4uLy4uL3NvdXJjZS9zb3VyY2Vfc3RhdGUnO1xuaW1wb3J0IHR5cGUge0ltYWdlUG9zaXRpb259IGZyb20gJy4uLy4uL3JlbmRlci9pbWFnZV9hdGxhcyc7XG5cbmV4cG9ydCB0eXBlIFNpbmdsZUNvbGxpc2lvbkJveCA9IHtcbiAgICB4MTogbnVtYmVyO1xuICAgIHkxOiBudW1iZXI7XG4gICAgeDI6IG51bWJlcjtcbiAgICB5MjogbnVtYmVyO1xuICAgIGFuY2hvclBvaW50WDogbnVtYmVyO1xuICAgIGFuY2hvclBvaW50WTogbnVtYmVyO1xufTtcblxuZXhwb3J0IHR5cGUgQ29sbGlzaW9uQXJyYXlzID0ge1xuICAgIHRleHRCb3g/OiBTaW5nbGVDb2xsaXNpb25Cb3g7XG4gICAgaWNvbkJveD86IFNpbmdsZUNvbGxpc2lvbkJveDtcbiAgICB0ZXh0Q2lyY2xlcz86IEFycmF5PG51bWJlcj47XG4gICAgdGV4dEZlYXR1cmVJbmRleD86IG51bWJlcjtcbiAgICBpY29uRmVhdHVyZUluZGV4PzogbnVtYmVyO1xufTtcblxuZXhwb3J0IHR5cGUgU3ltYm9sRmVhdHVyZSA9IHt8XG4gICAgc29ydEtleTogbnVtYmVyIHwgdm9pZCxcbiAgICB0ZXh0OiBGb3JtYXR0ZWQgfCB2b2lkLFxuICAgIGljb246IHN0cmluZyB8IHZvaWQsXG4gICAgaW5kZXg6IG51bWJlcixcbiAgICBzb3VyY2VMYXllckluZGV4OiBudW1iZXIsXG4gICAgZ2VvbWV0cnk6IEFycmF5PEFycmF5PFBvaW50Pj4sXG4gICAgcHJvcGVydGllczogT2JqZWN0LFxuICAgIHR5cGU6ICdQb2ludCcgfCAnTGluZVN0cmluZycgfCAnUG9seWdvbicsXG4gICAgaWQ/OiBhbnlcbnx9O1xuXG4vLyBPcGFjaXR5IGFycmF5cyBhcmUgZnJlcXVlbnRseSB1cGRhdGVkIGJ1dCBkb24ndCBjb250YWluIGEgbG90IG9mIGluZm9ybWF0aW9uLCBzbyB3ZSBwYWNrIHRoZW1cbi8vIHRpZ2h0LiBFYWNoIFVpbnQzMiBpcyBhY3R1YWxseSBmb3VyIGR1cGxpY2F0ZSBVaW50OHMgZm9yIHRoZSBmb3VyIGNvcm5lcnMgb2YgYSBnbHlwaFxuLy8gNyBiaXRzIGFyZSBmb3IgdGhlIGN1cnJlbnQgb3BhY2l0eSwgYW5kIHRoZSBsb3dlc3QgYml0IGlzIHRoZSB0YXJnZXQgb3BhY2l0eVxuXG4vLyBhY3R1YWxseSBkZWZpbmVkIGluIHN5bWJvbF9hdHRyaWJ1dGVzLmpzXG4vLyBjb25zdCBwbGFjZW1lbnRPcGFjaXR5QXR0cmlidXRlcyA9IFtcbi8vICAgICB7IG5hbWU6ICdhX2ZhZGVfb3BhY2l0eScsIGNvbXBvbmVudHM6IDEsIHR5cGU6ICdVaW50MzInIH1cbi8vIF07XG5jb25zdCBzaGFkZXJPcGFjaXR5QXR0cmlidXRlcyA9IFtcbiAgICB7IG5hbWU6ICdhX2ZhZGVfb3BhY2l0eScsIGNvbXBvbmVudHM6IDEsIHR5cGU6ICdVaW50OCcsIG9mZnNldDogMCB9XG5dO1xuXG5mdW5jdGlvbiBhZGRWZXJ0ZXgoYXJyYXksIGFuY2hvclgsIGFuY2hvclksIG94LCBveSwgdHgsIHR5LCBzaXplVmVydGV4KSB7XG4gICAgYXJyYXkuZW1wbGFjZUJhY2soXG4gICAgICAgIC8vIGFfcG9zX29mZnNldFxuICAgICAgICBhbmNob3JYLFxuICAgICAgICBhbmNob3JZLFxuICAgICAgICBNYXRoLnJvdW5kKG94ICogMzIpLFxuICAgICAgICBNYXRoLnJvdW5kKG95ICogMzIpLFxuXG4gICAgICAgIC8vIGFfZGF0YVxuICAgICAgICB0eCwgLy8geCBjb29yZGluYXRlIG9mIHN5bWJvbCBvbiBnbHlwaCBhdGxhcyB0ZXh0dXJlXG4gICAgICAgIHR5LCAvLyB5IGNvb3JkaW5hdGUgb2Ygc3ltYm9sIG9uIGdseXBoIGF0bGFzIHRleHR1cmVcbiAgICAgICAgc2l6ZVZlcnRleCA/IHNpemVWZXJ0ZXhbMF0gOiAwLFxuICAgICAgICBzaXplVmVydGV4ID8gc2l6ZVZlcnRleFsxXSA6IDBcbiAgICApO1xufVxuXG5mdW5jdGlvbiBhZGREeW5hbWljQXR0cmlidXRlcyhkeW5hbWljTGF5b3V0VmVydGV4QXJyYXk6IFN0cnVjdEFycmF5LCBwOiBQb2ludCwgYW5nbGU6IG51bWJlcikge1xuICAgIGR5bmFtaWNMYXlvdXRWZXJ0ZXhBcnJheS5lbXBsYWNlQmFjayhwLngsIHAueSwgYW5nbGUpO1xuICAgIGR5bmFtaWNMYXlvdXRWZXJ0ZXhBcnJheS5lbXBsYWNlQmFjayhwLngsIHAueSwgYW5nbGUpO1xuICAgIGR5bmFtaWNMYXlvdXRWZXJ0ZXhBcnJheS5lbXBsYWNlQmFjayhwLngsIHAueSwgYW5nbGUpO1xuICAgIGR5bmFtaWNMYXlvdXRWZXJ0ZXhBcnJheS5lbXBsYWNlQmFjayhwLngsIHAueSwgYW5nbGUpO1xufVxuXG5leHBvcnQgY2xhc3MgU3ltYm9sQnVmZmVycyB7XG4gICAgbGF5b3V0VmVydGV4QXJyYXk6IFN5bWJvbExheW91dEFycmF5O1xuICAgIGxheW91dFZlcnRleEJ1ZmZlcjogVmVydGV4QnVmZmVyO1xuXG4gICAgaW5kZXhBcnJheTogVHJpYW5nbGVJbmRleEFycmF5O1xuICAgIGluZGV4QnVmZmVyOiBJbmRleEJ1ZmZlcjtcblxuICAgIHByb2dyYW1Db25maWd1cmF0aW9uczogUHJvZ3JhbUNvbmZpZ3VyYXRpb25TZXQ8U3ltYm9sU3R5bGVMYXllcj47XG4gICAgc2VnbWVudHM6IFNlZ21lbnRWZWN0b3I7XG5cbiAgICBkeW5hbWljTGF5b3V0VmVydGV4QXJyYXk6IFN5bWJvbER5bmFtaWNMYXlvdXRBcnJheTtcbiAgICBkeW5hbWljTGF5b3V0VmVydGV4QnVmZmVyOiBWZXJ0ZXhCdWZmZXI7XG5cbiAgICBvcGFjaXR5VmVydGV4QXJyYXk6IFN5bWJvbE9wYWNpdHlBcnJheTtcbiAgICBvcGFjaXR5VmVydGV4QnVmZmVyOiBWZXJ0ZXhCdWZmZXI7XG5cbiAgICBjb2xsaXNpb25WZXJ0ZXhBcnJheTogQ29sbGlzaW9uVmVydGV4QXJyYXk7XG4gICAgY29sbGlzaW9uVmVydGV4QnVmZmVyOiBWZXJ0ZXhCdWZmZXI7XG5cbiAgICBwbGFjZWRTeW1ib2xBcnJheTogUGxhY2VkU3ltYm9sQXJyYXk7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm9ncmFtQ29uZmlndXJhdGlvbnM6IFByb2dyYW1Db25maWd1cmF0aW9uU2V0PFN5bWJvbFN0eWxlTGF5ZXI+KSB7XG4gICAgICAgIHRoaXMubGF5b3V0VmVydGV4QXJyYXkgPSBuZXcgU3ltYm9sTGF5b3V0QXJyYXkoKTtcbiAgICAgICAgdGhpcy5pbmRleEFycmF5ID0gbmV3IFRyaWFuZ2xlSW5kZXhBcnJheSgpO1xuICAgICAgICB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucyA9IHByb2dyYW1Db25maWd1cmF0aW9ucztcbiAgICAgICAgdGhpcy5zZWdtZW50cyA9IG5ldyBTZWdtZW50VmVjdG9yKCk7XG4gICAgICAgIHRoaXMuZHluYW1pY0xheW91dFZlcnRleEFycmF5ID0gbmV3IFN5bWJvbER5bmFtaWNMYXlvdXRBcnJheSgpO1xuICAgICAgICB0aGlzLm9wYWNpdHlWZXJ0ZXhBcnJheSA9IG5ldyBTeW1ib2xPcGFjaXR5QXJyYXkoKTtcbiAgICAgICAgdGhpcy5wbGFjZWRTeW1ib2xBcnJheSA9IG5ldyBQbGFjZWRTeW1ib2xBcnJheSgpO1xuICAgIH1cblxuICAgIHVwbG9hZChjb250ZXh0OiBDb250ZXh0LCBkeW5hbWljSW5kZXhCdWZmZXI6IGJvb2xlYW4sIHVwbG9hZD86IGJvb2xlYW4sIHVwZGF0ZT86IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKHVwbG9hZCkge1xuICAgICAgICAgICAgdGhpcy5sYXlvdXRWZXJ0ZXhCdWZmZXIgPSBjb250ZXh0LmNyZWF0ZVZlcnRleEJ1ZmZlcih0aGlzLmxheW91dFZlcnRleEFycmF5LCBzeW1ib2xMYXlvdXRBdHRyaWJ1dGVzLm1lbWJlcnMpO1xuICAgICAgICAgICAgdGhpcy5pbmRleEJ1ZmZlciA9IGNvbnRleHQuY3JlYXRlSW5kZXhCdWZmZXIodGhpcy5pbmRleEFycmF5LCBkeW5hbWljSW5kZXhCdWZmZXIpO1xuICAgICAgICAgICAgdGhpcy5keW5hbWljTGF5b3V0VmVydGV4QnVmZmVyID0gY29udGV4dC5jcmVhdGVWZXJ0ZXhCdWZmZXIodGhpcy5keW5hbWljTGF5b3V0VmVydGV4QXJyYXksIGR5bmFtaWNMYXlvdXRBdHRyaWJ1dGVzLm1lbWJlcnMsIHRydWUpO1xuICAgICAgICAgICAgdGhpcy5vcGFjaXR5VmVydGV4QnVmZmVyID0gY29udGV4dC5jcmVhdGVWZXJ0ZXhCdWZmZXIodGhpcy5vcGFjaXR5VmVydGV4QXJyYXksIHNoYWRlck9wYWNpdHlBdHRyaWJ1dGVzLCB0cnVlKTtcbiAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBwZXJmb3JtYW5jZSBoYWNrIHNvIHRoYXQgd2UgY2FuIHdyaXRlIHRvIG9wYWNpdHlWZXJ0ZXhBcnJheSB3aXRoIHVpbnQzMnNcbiAgICAgICAgICAgIC8vIGV2ZW4gdGhvdWdoIHRoZSBzaGFkZXJzIHJlYWQgdWludDhzXG4gICAgICAgICAgICB0aGlzLm9wYWNpdHlWZXJ0ZXhCdWZmZXIuaXRlbVNpemUgPSAxO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1cGxvYWQgfHwgdXBkYXRlKSB7XG4gICAgICAgICAgICB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucy51cGxvYWQoY29udGV4dCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBpZiAoIXRoaXMubGF5b3V0VmVydGV4QnVmZmVyKSByZXR1cm47XG4gICAgICAgIHRoaXMubGF5b3V0VmVydGV4QnVmZmVyLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5pbmRleEJ1ZmZlci5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5zZWdtZW50cy5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMuZHluYW1pY0xheW91dFZlcnRleEJ1ZmZlci5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMub3BhY2l0eVZlcnRleEJ1ZmZlci5kZXN0cm95KCk7XG4gICAgfVxufVxuXG5yZWdpc3RlcignU3ltYm9sQnVmZmVycycsIFN5bWJvbEJ1ZmZlcnMpO1xuXG5jbGFzcyBDb2xsaXNpb25CdWZmZXJzIHtcbiAgICBsYXlvdXRWZXJ0ZXhBcnJheTogU3RydWN0QXJyYXk7XG4gICAgbGF5b3V0QXR0cmlidXRlczogQXJyYXk8U3RydWN0QXJyYXlNZW1iZXI+O1xuICAgIGxheW91dFZlcnRleEJ1ZmZlcjogVmVydGV4QnVmZmVyO1xuXG4gICAgaW5kZXhBcnJheTogVHJpYW5nbGVJbmRleEFycmF5IHwgTGluZUluZGV4QXJyYXk7XG4gICAgaW5kZXhCdWZmZXI6IEluZGV4QnVmZmVyO1xuXG4gICAgc2VnbWVudHM6IFNlZ21lbnRWZWN0b3I7XG5cbiAgICBjb2xsaXNpb25WZXJ0ZXhBcnJheTogQ29sbGlzaW9uVmVydGV4QXJyYXk7XG4gICAgY29sbGlzaW9uVmVydGV4QnVmZmVyOiBWZXJ0ZXhCdWZmZXI7XG5cbiAgICBjb25zdHJ1Y3RvcihMYXlvdXRBcnJheTogQ2xhc3M8U3RydWN0QXJyYXk+LFxuICAgICAgICAgICAgICAgIGxheW91dEF0dHJpYnV0ZXM6IEFycmF5PFN0cnVjdEFycmF5TWVtYmVyPixcbiAgICAgICAgICAgICAgICBJbmRleEFycmF5OiBDbGFzczxUcmlhbmdsZUluZGV4QXJyYXkgfCBMaW5lSW5kZXhBcnJheT4pIHtcbiAgICAgICAgdGhpcy5sYXlvdXRWZXJ0ZXhBcnJheSA9IG5ldyBMYXlvdXRBcnJheSgpO1xuICAgICAgICB0aGlzLmxheW91dEF0dHJpYnV0ZXMgPSBsYXlvdXRBdHRyaWJ1dGVzO1xuICAgICAgICB0aGlzLmluZGV4QXJyYXkgPSBuZXcgSW5kZXhBcnJheSgpO1xuICAgICAgICB0aGlzLnNlZ21lbnRzID0gbmV3IFNlZ21lbnRWZWN0b3IoKTtcbiAgICAgICAgdGhpcy5jb2xsaXNpb25WZXJ0ZXhBcnJheSA9IG5ldyBDb2xsaXNpb25WZXJ0ZXhBcnJheSgpO1xuICAgIH1cblxuICAgIHVwbG9hZChjb250ZXh0OiBDb250ZXh0KSB7XG4gICAgICAgIHRoaXMubGF5b3V0VmVydGV4QnVmZmVyID0gY29udGV4dC5jcmVhdGVWZXJ0ZXhCdWZmZXIodGhpcy5sYXlvdXRWZXJ0ZXhBcnJheSwgdGhpcy5sYXlvdXRBdHRyaWJ1dGVzKTtcbiAgICAgICAgdGhpcy5pbmRleEJ1ZmZlciA9IGNvbnRleHQuY3JlYXRlSW5kZXhCdWZmZXIodGhpcy5pbmRleEFycmF5KTtcbiAgICAgICAgdGhpcy5jb2xsaXNpb25WZXJ0ZXhCdWZmZXIgPSBjb250ZXh0LmNyZWF0ZVZlcnRleEJ1ZmZlcih0aGlzLmNvbGxpc2lvblZlcnRleEFycmF5LCBjb2xsaXNpb25WZXJ0ZXhBdHRyaWJ1dGVzLm1lbWJlcnMsIHRydWUpO1xuICAgIH1cblxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGlmICghdGhpcy5sYXlvdXRWZXJ0ZXhCdWZmZXIpIHJldHVybjtcbiAgICAgICAgdGhpcy5sYXlvdXRWZXJ0ZXhCdWZmZXIuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLmluZGV4QnVmZmVyLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5zZWdtZW50cy5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMuY29sbGlzaW9uVmVydGV4QnVmZmVyLmRlc3Ryb3koKTtcbiAgICB9XG59XG5cbnJlZ2lzdGVyKCdDb2xsaXNpb25CdWZmZXJzJywgQ29sbGlzaW9uQnVmZmVycyk7XG5cbi8qKlxuICogVW5saWtlIG90aGVyIGJ1Y2tldHMsIHdoaWNoIHNpbXBseSBpbXBsZW1lbnQgI2FkZEZlYXR1cmUgd2l0aCB0eXBlLXNwZWNpZmljXG4gKiBsb2dpYyBmb3IgKGVzc2VudGlhbGx5KSB0cmlhbmd1bGF0aW5nIGZlYXR1cmUgZ2VvbWV0cmllcywgU3ltYm9sQnVja2V0XG4gKiByZXF1aXJlcyBzcGVjaWFsaXplZCBiZWhhdmlvcjpcbiAqXG4gKiAxLiBXb3JrZXJUaWxlI3BhcnNlKCksIHRoZSBsb2dpY2FsIG93bmVyIG9mIHRoZSBidWNrZXQgY3JlYXRpb24gcHJvY2VzcyxcbiAqICAgIGNhbGxzIFN5bWJvbEJ1Y2tldCNwb3B1bGF0ZSgpLCB3aGljaCByZXNvbHZlcyB0ZXh0IGFuZCBpY29uIHRva2VucyBvblxuICogICAgZWFjaCBmZWF0dXJlLCBhZGRzIGVhY2ggZ2x5cGhzIGFuZCBzeW1ib2xzIG5lZWRlZCB0byB0aGUgcGFzc2VkLWluXG4gKiAgICBjb2xsZWN0aW9ucyBvcHRpb25zLmdseXBoRGVwZW5kZW5jaWVzIGFuZCBvcHRpb25zLmljb25EZXBlbmRlbmNpZXMsIGFuZFxuICogICAgc3RvcmVzIHRoZSBmZWF0dXJlIGRhdGEgZm9yIHVzZSBpbiBzdWJzZXF1ZW50IHN0ZXAgKHRoaXMuZmVhdHVyZXMpLlxuICpcbiAqIDIuIFdvcmtlclRpbGUgYXN5bmNocm9ub3VzbHkgcmVxdWVzdHMgZnJvbSB0aGUgbWFpbiB0aHJlYWQgYWxsIG9mIHRoZSBnbHlwaHNcbiAqICAgIGFuZCBpY29ucyBuZWVkZWQgKGJ5IHRoaXMgYnVja2V0IGFuZCBhbnkgb3RoZXJzKS4gV2hlbiBnbHlwaHMgYW5kIGljb25zXG4gKiAgICBoYXZlIGJlZW4gcmVjZWl2ZWQsIHRoZSBXb3JrZXJUaWxlIGNyZWF0ZXMgYSBDb2xsaXNpb25JbmRleCBhbmQgaW52b2tlczpcbiAqXG4gKiAzLiBwZXJmb3JtU3ltYm9sTGF5b3V0KGJ1Y2tldCwgc3RhY2tzLCBpY29ucykgcGVyZm9ybSB0ZXh0cyBzaGFwaW5nIGFuZFxuICogICAgbGF5b3V0IG9uIGEgU3ltYm9sIEJ1Y2tldC4gVGhpcyBzdGVwIHBvcHVsYXRlczpcbiAqICAgICAgYHRoaXMuc3ltYm9sSW5zdGFuY2VzYDogbWV0YWRhdGEgb24gZ2VuZXJhdGVkIHN5bWJvbHNcbiAqICAgICAgYHRoaXMuY29sbGlzaW9uQm94QXJyYXlgOiBjb2xsaXNpb24gZGF0YSBmb3IgdXNlIGJ5IGZvcmVncm91bmRcbiAqICAgICAgYHRoaXMudGV4dGA6IFN5bWJvbEJ1ZmZlcnMgZm9yIHRleHQgc3ltYm9sc1xuICogICAgICBgdGhpcy5pY29uc2A6IFN5bWJvbEJ1ZmZlcnMgZm9yIGljb25zXG4gKiAgICAgIGB0aGlzLmNvbGxpc2lvbkJveGA6IERlYnVnIFN5bWJvbEJ1ZmZlcnMgZm9yIGNvbGxpc2lvbiBib3hlc1xuICogICAgICBgdGhpcy5jb2xsaXNpb25DaXJjbGVgOiBEZWJ1ZyBTeW1ib2xCdWZmZXJzIGZvciBjb2xsaXNpb24gY2lyY2xlc1xuICogICAgVGhlIHJlc3VsdHMgYXJlIHNlbnQgdG8gdGhlIGZvcmVncm91bmQgZm9yIHJlbmRlcmluZ1xuICpcbiAqIDQuIHBlcmZvcm1TeW1ib2xQbGFjZW1lbnQoYnVja2V0LCBjb2xsaXNpb25JbmRleCkgaXMgcnVuIG9uIHRoZSBmb3JlZ3JvdW5kLFxuICogICAgYW5kIHVzZXMgdGhlIENvbGxpc2lvbkluZGV4IGFsb25nIHdpdGggY3VycmVudCBjYW1lcmEgc2V0dGluZ3MgdG8gZGV0ZXJtaW5lXG4gKiAgICB3aGljaCBzeW1ib2xzIGNhbiBhY3R1YWxseSBzaG93IG9uIHRoZSBtYXAuIENvbGxpZGVkIHN5bWJvbHMgYXJlIGhpZGRlblxuICogICAgdXNpbmcgYSBkeW5hbWljIFwiT3BhY2l0eVZlcnRleEFycmF5XCIuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgU3ltYm9sQnVja2V0IGltcGxlbWVudHMgQnVja2V0IHtcbiAgICBzdGF0aWMgTUFYX0dMWVBIUzogbnVtYmVyO1xuICAgIHN0YXRpYyBhZGREeW5hbWljQXR0cmlidXRlczogdHlwZW9mIGFkZER5bmFtaWNBdHRyaWJ1dGVzO1xuXG4gICAgY29sbGlzaW9uQm94QXJyYXk6IENvbGxpc2lvbkJveEFycmF5O1xuICAgIHpvb206IG51bWJlcjtcbiAgICBvdmVyc2NhbGluZzogbnVtYmVyO1xuICAgIGxheWVyczogQXJyYXk8U3ltYm9sU3R5bGVMYXllcj47XG4gICAgbGF5ZXJJZHM6IEFycmF5PHN0cmluZz47XG4gICAgc3RhdGVEZXBlbmRlbnRMYXllcnM6IEFycmF5PFN5bWJvbFN0eWxlTGF5ZXI+O1xuICAgIHN0YXRlRGVwZW5kZW50TGF5ZXJJZHM6IEFycmF5PHN0cmluZz47XG5cbiAgICBpbmRleDogbnVtYmVyO1xuICAgIHNkZkljb25zOiBib29sZWFuO1xuICAgIGljb25zTmVlZExpbmVhcjogYm9vbGVhbjtcbiAgICBidWNrZXRJbnN0YW5jZUlkOiBudW1iZXI7XG4gICAganVzdFJlbG9hZGVkOiBib29sZWFuO1xuICAgIGhhc1BhdHRlcm46IGJvb2xlYW47XG5cbiAgICB0ZXh0U2l6ZURhdGE6IFNpemVEYXRhO1xuICAgIGljb25TaXplRGF0YTogU2l6ZURhdGE7XG5cbiAgICBnbHlwaE9mZnNldEFycmF5OiBHbHlwaE9mZnNldEFycmF5O1xuICAgIGxpbmVWZXJ0ZXhBcnJheTogU3ltYm9sTGluZVZlcnRleEFycmF5O1xuICAgIGZlYXR1cmVzOiBBcnJheTxTeW1ib2xGZWF0dXJlPjtcbiAgICBzeW1ib2xJbnN0YW5jZXM6IFN5bWJvbEluc3RhbmNlQXJyYXk7XG4gICAgY29sbGlzaW9uQXJyYXlzOiBBcnJheTxDb2xsaXNpb25BcnJheXM+O1xuICAgIHBpeGVsUmF0aW86IG51bWJlcjtcbiAgICB0aWxlUGl4ZWxSYXRpbzogbnVtYmVyO1xuICAgIGNvbXBhcmVUZXh0OiB7W3N0cmluZ106IEFycmF5PFBvaW50Pn07XG4gICAgZmFkZVN0YXJ0VGltZTogbnVtYmVyO1xuICAgIHNvcnRGZWF0dXJlc0J5S2V5OiBib29sZWFuO1xuICAgIHNvcnRGZWF0dXJlc0J5WTogYm9vbGVhbjtcbiAgICBzb3J0ZWRBbmdsZTogbnVtYmVyO1xuICAgIGZlYXR1cmVTb3J0T3JkZXI6IEFycmF5PG51bWJlcj47XG5cbiAgICB0ZXh0OiBTeW1ib2xCdWZmZXJzO1xuICAgIGljb246IFN5bWJvbEJ1ZmZlcnM7XG4gICAgY29sbGlzaW9uQm94OiBDb2xsaXNpb25CdWZmZXJzO1xuICAgIGNvbGxpc2lvbkNpcmNsZTogQ29sbGlzaW9uQnVmZmVycztcbiAgICB1cGxvYWRlZDogYm9vbGVhbjtcbiAgICBzb3VyY2VMYXllckluZGV4OiBudW1iZXI7XG4gICAgc291cmNlSUQ6IHN0cmluZztcblxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM6IEJ1Y2tldFBhcmFtZXRlcnM8U3ltYm9sU3R5bGVMYXllcj4pIHtcbiAgICAgICAgdGhpcy5jb2xsaXNpb25Cb3hBcnJheSA9IG9wdGlvbnMuY29sbGlzaW9uQm94QXJyYXk7XG4gICAgICAgIHRoaXMuem9vbSA9IG9wdGlvbnMuem9vbTtcbiAgICAgICAgdGhpcy5vdmVyc2NhbGluZyA9IG9wdGlvbnMub3ZlcnNjYWxpbmc7XG4gICAgICAgIHRoaXMubGF5ZXJzID0gb3B0aW9ucy5sYXllcnM7XG4gICAgICAgIHRoaXMubGF5ZXJJZHMgPSB0aGlzLmxheWVycy5tYXAobGF5ZXIgPT4gbGF5ZXIuaWQpO1xuICAgICAgICB0aGlzLmluZGV4ID0gb3B0aW9ucy5pbmRleDtcbiAgICAgICAgdGhpcy5waXhlbFJhdGlvID0gb3B0aW9ucy5waXhlbFJhdGlvO1xuICAgICAgICB0aGlzLnNvdXJjZUxheWVySW5kZXggPSBvcHRpb25zLnNvdXJjZUxheWVySW5kZXg7XG4gICAgICAgIHRoaXMuaGFzUGF0dGVybiA9IGZhbHNlO1xuXG4gICAgICAgIGNvbnN0IGxheWVyID0gdGhpcy5sYXllcnNbMF07XG4gICAgICAgIGNvbnN0IHVuZXZhbHVhdGVkTGF5b3V0VmFsdWVzID0gbGF5ZXIuX3VuZXZhbHVhdGVkTGF5b3V0Ll92YWx1ZXM7XG5cbiAgICAgICAgdGhpcy50ZXh0U2l6ZURhdGEgPSBnZXRTaXplRGF0YSh0aGlzLnpvb20sIHVuZXZhbHVhdGVkTGF5b3V0VmFsdWVzWyd0ZXh0LXNpemUnXSk7XG4gICAgICAgIHRoaXMuaWNvblNpemVEYXRhID0gZ2V0U2l6ZURhdGEodGhpcy56b29tLCB1bmV2YWx1YXRlZExheW91dFZhbHVlc1snaWNvbi1zaXplJ10pO1xuXG4gICAgICAgIGNvbnN0IGxheW91dCA9IHRoaXMubGF5ZXJzWzBdLmxheW91dDtcbiAgICAgICAgY29uc3Qgc29ydEtleSA9IGxheW91dC5nZXQoJ3N5bWJvbC1zb3J0LWtleScpO1xuICAgICAgICBjb25zdCB6T3JkZXIgPSBsYXlvdXQuZ2V0KCdzeW1ib2wtei1vcmRlcicpO1xuICAgICAgICB0aGlzLnNvcnRGZWF0dXJlc0J5S2V5ID0gek9yZGVyICE9PSAndmlld3BvcnQteScgJiYgc29ydEtleS5jb25zdGFudE9yKDEpICE9PSB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IHpPcmRlckJ5Vmlld3BvcnRZID0gek9yZGVyID09PSAndmlld3BvcnQteScgfHwgKHpPcmRlciA9PT0gJ2F1dG8nICYmICF0aGlzLnNvcnRGZWF0dXJlc0J5S2V5KTtcbiAgICAgICAgdGhpcy5zb3J0RmVhdHVyZXNCeVkgPSB6T3JkZXJCeVZpZXdwb3J0WSAmJiAobGF5b3V0LmdldCgndGV4dC1hbGxvdy1vdmVybGFwJykgfHwgbGF5b3V0LmdldCgnaWNvbi1hbGxvdy1vdmVybGFwJykgfHxcbiAgICAgICAgICAgIGxheW91dC5nZXQoJ3RleHQtaWdub3JlLXBsYWNlbWVudCcpIHx8IGxheW91dC5nZXQoJ2ljb24taWdub3JlLXBsYWNlbWVudCcpKTtcblxuICAgICAgICB0aGlzLnN0YXRlRGVwZW5kZW50TGF5ZXJJZHMgPSB0aGlzLmxheWVycy5maWx0ZXIoKGwpID0+IGwuaXNTdGF0ZURlcGVuZGVudCgpKS5tYXAoKGwpID0+IGwuaWQpO1xuXG4gICAgICAgIHRoaXMuc291cmNlSUQgPSBvcHRpb25zLnNvdXJjZUlEO1xuICAgIH1cblxuICAgIGNyZWF0ZUFycmF5cygpIHtcbiAgICAgICAgdGhpcy50ZXh0ID0gbmV3IFN5bWJvbEJ1ZmZlcnMobmV3IFByb2dyYW1Db25maWd1cmF0aW9uU2V0KHN5bWJvbExheW91dEF0dHJpYnV0ZXMubWVtYmVycywgdGhpcy5sYXllcnMsIHRoaXMuem9vbSwgcHJvcGVydHkgPT4gL150ZXh0Ly50ZXN0KHByb3BlcnR5KSkpO1xuICAgICAgICB0aGlzLmljb24gPSBuZXcgU3ltYm9sQnVmZmVycyhuZXcgUHJvZ3JhbUNvbmZpZ3VyYXRpb25TZXQoc3ltYm9sTGF5b3V0QXR0cmlidXRlcy5tZW1iZXJzLCB0aGlzLmxheWVycywgdGhpcy56b29tLCBwcm9wZXJ0eSA9PiAvXmljb24vLnRlc3QocHJvcGVydHkpKSk7XG5cbiAgICAgICAgdGhpcy5jb2xsaXNpb25Cb3ggPSBuZXcgQ29sbGlzaW9uQnVmZmVycyhDb2xsaXNpb25Cb3hMYXlvdXRBcnJheSwgY29sbGlzaW9uQm94TGF5b3V0Lm1lbWJlcnMsIExpbmVJbmRleEFycmF5KTtcbiAgICAgICAgdGhpcy5jb2xsaXNpb25DaXJjbGUgPSBuZXcgQ29sbGlzaW9uQnVmZmVycyhDb2xsaXNpb25DaXJjbGVMYXlvdXRBcnJheSwgY29sbGlzaW9uQ2lyY2xlTGF5b3V0Lm1lbWJlcnMsIFRyaWFuZ2xlSW5kZXhBcnJheSk7XG5cbiAgICAgICAgdGhpcy5nbHlwaE9mZnNldEFycmF5ID0gbmV3IEdseXBoT2Zmc2V0QXJyYXkoKTtcbiAgICAgICAgdGhpcy5saW5lVmVydGV4QXJyYXkgPSBuZXcgU3ltYm9sTGluZVZlcnRleEFycmF5KCk7XG4gICAgICAgIHRoaXMuc3ltYm9sSW5zdGFuY2VzID0gbmV3IFN5bWJvbEluc3RhbmNlQXJyYXkoKTtcbiAgICB9XG5cbiAgICBjYWxjdWxhdGVHbHlwaERlcGVuZGVuY2llcyh0ZXh0OiBzdHJpbmcsIHN0YWNrOiB7W251bWJlcl06IGJvb2xlYW59LCB0ZXh0QWxvbmdMaW5lOiBib29sZWFuLCBkb2VzQWxsb3dWZXJ0aWNhbFdyaXRpbmdNb2RlOiBib29sZWFuKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGV4dC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgc3RhY2tbdGV4dC5jaGFyQ29kZUF0KGkpXSA9IHRydWU7XG4gICAgICAgICAgICBpZiAodGV4dEFsb25nTGluZSAmJiBkb2VzQWxsb3dWZXJ0aWNhbFdyaXRpbmdNb2RlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmVydGljYWxDaGFyID0gdmVydGljYWxpemVkQ2hhcmFjdGVyTWFwW3RleHQuY2hhckF0KGkpXTtcbiAgICAgICAgICAgICAgICBpZiAodmVydGljYWxDaGFyKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YWNrW3ZlcnRpY2FsQ2hhci5jaGFyQ29kZUF0KDApXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcG9wdWxhdGUoZmVhdHVyZXM6IEFycmF5PEluZGV4ZWRGZWF0dXJlPiwgb3B0aW9uczogUG9wdWxhdGVQYXJhbWV0ZXJzKSB7XG4gICAgICAgIGNvbnN0IGxheWVyID0gdGhpcy5sYXllcnNbMF07XG4gICAgICAgIGNvbnN0IGxheW91dCA9IGxheWVyLmxheW91dDtcblxuICAgICAgICBjb25zdCB0ZXh0Rm9udCA9IGxheW91dC5nZXQoJ3RleHQtZm9udCcpO1xuICAgICAgICBjb25zdCB0ZXh0RmllbGQgPSBsYXlvdXQuZ2V0KCd0ZXh0LWZpZWxkJyk7XG4gICAgICAgIGNvbnN0IGljb25JbWFnZSA9IGxheW91dC5nZXQoJ2ljb24taW1hZ2UnKTtcbiAgICAgICAgY29uc3QgaGFzVGV4dCA9XG4gICAgICAgICAgICAodGV4dEZpZWxkLnZhbHVlLmtpbmQgIT09ICdjb25zdGFudCcgfHwgdGV4dEZpZWxkLnZhbHVlLnZhbHVlLnRvU3RyaW5nKCkubGVuZ3RoID4gMCkgJiZcbiAgICAgICAgICAgICh0ZXh0Rm9udC52YWx1ZS5raW5kICE9PSAnY29uc3RhbnQnIHx8IHRleHRGb250LnZhbHVlLnZhbHVlLmxlbmd0aCA+IDApO1xuICAgICAgICBjb25zdCBoYXNJY29uID0gaWNvbkltYWdlLnZhbHVlLmtpbmQgIT09ICdjb25zdGFudCcgfHwgaWNvbkltYWdlLnZhbHVlLnZhbHVlICYmIGljb25JbWFnZS52YWx1ZS52YWx1ZS5sZW5ndGggPiAwO1xuICAgICAgICBjb25zdCBzeW1ib2xTb3J0S2V5ID0gbGF5b3V0LmdldCgnc3ltYm9sLXNvcnQta2V5Jyk7XG5cbiAgICAgICAgdGhpcy5mZWF0dXJlcyA9IFtdO1xuXG4gICAgICAgIGlmICghaGFzVGV4dCAmJiAhaGFzSWNvbikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaWNvbnMgPSBvcHRpb25zLmljb25EZXBlbmRlbmNpZXM7XG4gICAgICAgIGNvbnN0IHN0YWNrcyA9IG9wdGlvbnMuZ2x5cGhEZXBlbmRlbmNpZXM7XG4gICAgICAgIGNvbnN0IGdsb2JhbFByb3BlcnRpZXMgPSBuZXcgRXZhbHVhdGlvblBhcmFtZXRlcnModGhpcy56b29tKTtcblxuICAgICAgICBmb3IgKGNvbnN0IHtmZWF0dXJlLCBpbmRleCwgc291cmNlTGF5ZXJJbmRleH0gb2YgZmVhdHVyZXMpIHtcbiAgICAgICAgICAgIGlmICghbGF5ZXIuX2ZlYXR1cmVGaWx0ZXIoZ2xvYmFsUHJvcGVydGllcywgZmVhdHVyZSkpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IHRleHQ6IEZvcm1hdHRlZCB8IHZvaWQ7XG4gICAgICAgICAgICBpZiAoaGFzVGV4dCkge1xuICAgICAgICAgICAgICAgIC8vIEV4cHJlc3Npb24gZXZhbHVhdGlvbiB3aWxsIGF1dG9tYXRpY2FsbHkgY29lcmNlIHRvIEZvcm1hdHRlZFxuICAgICAgICAgICAgICAgIC8vIGJ1dCBwbGFpbiBzdHJpbmcgdG9rZW4gZXZhbHVhdGlvbiBza2lwcyB0aGF0IHBhdGh3YXkgc28gZG8gdGhlXG4gICAgICAgICAgICAgICAgLy8gY29udmVyc2lvbiBoZXJlLlxuICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkVG9rZW5zID0gbGF5ZXIuZ2V0VmFsdWVBbmRSZXNvbHZlVG9rZW5zKCd0ZXh0LWZpZWxkJywgZmVhdHVyZSk7XG4gICAgICAgICAgICAgICAgdGV4dCA9IHRyYW5zZm9ybVRleHQocmVzb2x2ZWRUb2tlbnMgaW5zdGFuY2VvZiBGb3JtYXR0ZWQgP1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlZFRva2VucyA6XG4gICAgICAgICAgICAgICAgICAgIEZvcm1hdHRlZC5mcm9tU3RyaW5nKHJlc29sdmVkVG9rZW5zKSxcbiAgICAgICAgICAgICAgICAgICAgbGF5ZXIsIGZlYXR1cmUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgaWNvbjtcbiAgICAgICAgICAgIGlmIChoYXNJY29uKSB7XG4gICAgICAgICAgICAgICAgaWNvbiA9IGxheWVyLmdldFZhbHVlQW5kUmVzb2x2ZVRva2VucygnaWNvbi1pbWFnZScsIGZlYXR1cmUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIXRleHQgJiYgIWljb24pIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3Qgc29ydEtleSA9IHRoaXMuc29ydEZlYXR1cmVzQnlLZXkgP1xuICAgICAgICAgICAgICAgIHN5bWJvbFNvcnRLZXkuZXZhbHVhdGUoZmVhdHVyZSwge30pIDpcbiAgICAgICAgICAgICAgICB1bmRlZmluZWQ7XG5cbiAgICAgICAgICAgIGNvbnN0IHN5bWJvbEZlYXR1cmU6IFN5bWJvbEZlYXR1cmUgPSB7XG4gICAgICAgICAgICAgICAgdGV4dCxcbiAgICAgICAgICAgICAgICBpY29uLFxuICAgICAgICAgICAgICAgIGluZGV4LFxuICAgICAgICAgICAgICAgIHNvdXJjZUxheWVySW5kZXgsXG4gICAgICAgICAgICAgICAgZ2VvbWV0cnk6IGxvYWRHZW9tZXRyeShmZWF0dXJlKSxcbiAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzOiBmZWF0dXJlLnByb3BlcnRpZXMsXG4gICAgICAgICAgICAgICAgdHlwZTogdmVjdG9yVGlsZUZlYXR1cmVUeXBlc1tmZWF0dXJlLnR5cGVdLFxuICAgICAgICAgICAgICAgIHNvcnRLZXlcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAodHlwZW9mIGZlYXR1cmUuaWQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgc3ltYm9sRmVhdHVyZS5pZCA9IGZlYXR1cmUuaWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmZlYXR1cmVzLnB1c2goc3ltYm9sRmVhdHVyZSk7XG5cbiAgICAgICAgICAgIGlmIChpY29uKSB7XG4gICAgICAgICAgICAgICAgaWNvbnNbaWNvbl0gPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGV4dCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZvbnRTdGFjayA9IHRleHRGb250LmV2YWx1YXRlKGZlYXR1cmUsIHt9KS5qb2luKCcsJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgdGV4dEFsb25nTGluZSA9IGxheW91dC5nZXQoJ3RleHQtcm90YXRpb24tYWxpZ25tZW50JykgPT09ICdtYXAnICYmIGxheW91dC5nZXQoJ3N5bWJvbC1wbGFjZW1lbnQnKSAhPT0gJ3BvaW50JztcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHNlY3Rpb24gb2YgdGV4dC5zZWN0aW9ucykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkb2VzQWxsb3dWZXJ0aWNhbFdyaXRpbmdNb2RlID0gYWxsb3dzVmVydGljYWxXcml0aW5nTW9kZSh0ZXh0LnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWN0aW9uRm9udCA9IHNlY3Rpb24uZm9udFN0YWNrIHx8IGZvbnRTdGFjaztcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VjdGlvblN0YWNrID0gc3RhY2tzW3NlY3Rpb25Gb250XSA9IHN0YWNrc1tzZWN0aW9uRm9udF0gfHwge307XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlR2x5cGhEZXBlbmRlbmNpZXMoc2VjdGlvbi50ZXh0LCBzZWN0aW9uU3RhY2ssIHRleHRBbG9uZ0xpbmUsIGRvZXNBbGxvd1ZlcnRpY2FsV3JpdGluZ01vZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChsYXlvdXQuZ2V0KCdzeW1ib2wtcGxhY2VtZW50JykgPT09ICdsaW5lJykge1xuICAgICAgICAgICAgLy8gTWVyZ2UgYWRqYWNlbnQgbGluZXMgd2l0aCB0aGUgc2FtZSB0ZXh0IHRvIGltcHJvdmUgbGFiZWxsaW5nLlxuICAgICAgICAgICAgLy8gSXQncyBiZXR0ZXIgdG8gcGxhY2UgbGFiZWxzIG9uIG9uZSBsb25nIGxpbmUgdGhhbiBvbiBtYW55IHNob3J0IHNlZ21lbnRzLlxuICAgICAgICAgICAgdGhpcy5mZWF0dXJlcyA9IG1lcmdlTGluZXModGhpcy5mZWF0dXJlcyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5zb3J0RmVhdHVyZXNCeUtleSkge1xuICAgICAgICAgICAgdGhpcy5mZWF0dXJlcy5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gYS5zb3J0S2V5IGlzIGFsd2F5cyBhIG51bWJlciB3aGVuIHNvcnRGZWF0dXJlc0J5S2V5IGlzIHRydWVcbiAgICAgICAgICAgICAgICByZXR1cm4gKChhLnNvcnRLZXk6IGFueSk6IG51bWJlcikgLSAoKGIuc29ydEtleTogYW55KTogbnVtYmVyKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdXBkYXRlKHN0YXRlczogRmVhdHVyZVN0YXRlcywgdnRMYXllcjogVmVjdG9yVGlsZUxheWVyLCBpbWFnZVBvc2l0aW9uczoge1tzdHJpbmddOiBJbWFnZVBvc2l0aW9ufSkge1xuICAgICAgICBpZiAoIXRoaXMuc3RhdGVEZXBlbmRlbnRMYXllcnMubGVuZ3RoKSByZXR1cm47XG4gICAgICAgIHRoaXMudGV4dC5wcm9ncmFtQ29uZmlndXJhdGlvbnMudXBkYXRlUGFpbnRBcnJheXMoc3RhdGVzLCB2dExheWVyLCB0aGlzLmxheWVycywgaW1hZ2VQb3NpdGlvbnMpO1xuICAgICAgICB0aGlzLmljb24ucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLnVwZGF0ZVBhaW50QXJyYXlzKHN0YXRlcywgdnRMYXllciwgdGhpcy5sYXllcnMsIGltYWdlUG9zaXRpb25zKTtcbiAgICB9XG5cbiAgICBpc0VtcHR5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zeW1ib2xJbnN0YW5jZXMubGVuZ3RoID09PSAwO1xuICAgIH1cblxuICAgIHVwbG9hZFBlbmRpbmcoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy51cGxvYWRlZCB8fCB0aGlzLnRleHQucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLm5lZWRzVXBsb2FkIHx8IHRoaXMuaWNvbi5wcm9ncmFtQ29uZmlndXJhdGlvbnMubmVlZHNVcGxvYWQ7XG4gICAgfVxuXG4gICAgdXBsb2FkKGNvbnRleHQ6IENvbnRleHQpIHtcbiAgICAgICAgaWYgKCF0aGlzLnVwbG9hZGVkKSB7XG4gICAgICAgICAgICB0aGlzLmNvbGxpc2lvbkJveC51cGxvYWQoY29udGV4dCk7XG4gICAgICAgICAgICB0aGlzLmNvbGxpc2lvbkNpcmNsZS51cGxvYWQoY29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50ZXh0LnVwbG9hZChjb250ZXh0LCB0aGlzLnNvcnRGZWF0dXJlc0J5WSwgIXRoaXMudXBsb2FkZWQsIHRoaXMudGV4dC5wcm9ncmFtQ29uZmlndXJhdGlvbnMubmVlZHNVcGxvYWQpO1xuICAgICAgICB0aGlzLmljb24udXBsb2FkKGNvbnRleHQsIHRoaXMuc29ydEZlYXR1cmVzQnlZLCAhdGhpcy51cGxvYWRlZCwgdGhpcy5pY29uLnByb2dyYW1Db25maWd1cmF0aW9ucy5uZWVkc1VwbG9hZCk7XG4gICAgICAgIHRoaXMudXBsb2FkZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMudGV4dC5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMuaWNvbi5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMuY29sbGlzaW9uQm94LmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5jb2xsaXNpb25DaXJjbGUuZGVzdHJveSgpO1xuICAgIH1cblxuICAgIGFkZFRvTGluZVZlcnRleEFycmF5KGFuY2hvcjogQW5jaG9yLCBsaW5lOiBhbnkpIHtcbiAgICAgICAgY29uc3QgbGluZVN0YXJ0SW5kZXggPSB0aGlzLmxpbmVWZXJ0ZXhBcnJheS5sZW5ndGg7XG4gICAgICAgIGlmIChhbmNob3Iuc2VnbWVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsZXQgc3VtRm9yd2FyZExlbmd0aCA9IGFuY2hvci5kaXN0KGxpbmVbYW5jaG9yLnNlZ21lbnQgKyAxXSk7XG4gICAgICAgICAgICBsZXQgc3VtQmFja3dhcmRMZW5ndGggPSBhbmNob3IuZGlzdChsaW5lW2FuY2hvci5zZWdtZW50XSk7XG4gICAgICAgICAgICBjb25zdCB2ZXJ0aWNlcyA9IHt9O1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IGFuY2hvci5zZWdtZW50ICsgMTsgaSA8IGxpbmUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2ZXJ0aWNlc1tpXSA9IHsgeDogbGluZVtpXS54LCB5OiBsaW5lW2ldLnksIHRpbGVVbml0RGlzdGFuY2VGcm9tQW5jaG9yOiBzdW1Gb3J3YXJkTGVuZ3RoIH07XG4gICAgICAgICAgICAgICAgaWYgKGkgPCBsaW5lLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgc3VtRm9yd2FyZExlbmd0aCArPSBsaW5lW2kgKyAxXS5kaXN0KGxpbmVbaV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBhbmNob3Iuc2VnbWVudCB8fCAwOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgICAgIHZlcnRpY2VzW2ldID0geyB4OiBsaW5lW2ldLngsIHk6IGxpbmVbaV0ueSwgdGlsZVVuaXREaXN0YW5jZUZyb21BbmNob3I6IHN1bUJhY2t3YXJkTGVuZ3RoIH07XG4gICAgICAgICAgICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHN1bUJhY2t3YXJkTGVuZ3RoICs9IGxpbmVbaSAtIDFdLmRpc3QobGluZVtpXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmVydGV4ID0gdmVydGljZXNbaV07XG4gICAgICAgICAgICAgICAgdGhpcy5saW5lVmVydGV4QXJyYXkuZW1wbGFjZUJhY2sodmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgudGlsZVVuaXREaXN0YW5jZUZyb21BbmNob3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBsaW5lU3RhcnRJbmRleCxcbiAgICAgICAgICAgIGxpbmVMZW5ndGg6IHRoaXMubGluZVZlcnRleEFycmF5Lmxlbmd0aCAtIGxpbmVTdGFydEluZGV4XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgYWRkU3ltYm9scyhhcnJheXM6IFN5bWJvbEJ1ZmZlcnMsXG4gICAgICAgICAgICAgICBxdWFkczogQXJyYXk8U3ltYm9sUXVhZD4sXG4gICAgICAgICAgICAgICBzaXplVmVydGV4OiBhbnksXG4gICAgICAgICAgICAgICBsaW5lT2Zmc2V0OiBbbnVtYmVyLCBudW1iZXJdLFxuICAgICAgICAgICAgICAgYWxvbmdMaW5lOiBib29sZWFuLFxuICAgICAgICAgICAgICAgZmVhdHVyZTogU3ltYm9sRmVhdHVyZSxcbiAgICAgICAgICAgICAgIHdyaXRpbmdNb2RlOiBhbnksXG4gICAgICAgICAgICAgICBsYWJlbEFuY2hvcjogQW5jaG9yLFxuICAgICAgICAgICAgICAgbGluZVN0YXJ0SW5kZXg6IG51bWJlcixcbiAgICAgICAgICAgICAgIGxpbmVMZW5ndGg6IG51bWJlcikge1xuICAgICAgICBjb25zdCBpbmRleEFycmF5ID0gYXJyYXlzLmluZGV4QXJyYXk7XG4gICAgICAgIGNvbnN0IGxheW91dFZlcnRleEFycmF5ID0gYXJyYXlzLmxheW91dFZlcnRleEFycmF5O1xuICAgICAgICBjb25zdCBkeW5hbWljTGF5b3V0VmVydGV4QXJyYXkgPSBhcnJheXMuZHluYW1pY0xheW91dFZlcnRleEFycmF5O1xuXG4gICAgICAgIGNvbnN0IHNlZ21lbnQgPSBhcnJheXMuc2VnbWVudHMucHJlcGFyZVNlZ21lbnQoNCAqIHF1YWRzLmxlbmd0aCwgYXJyYXlzLmxheW91dFZlcnRleEFycmF5LCBhcnJheXMuaW5kZXhBcnJheSwgZmVhdHVyZS5zb3J0S2V5KTtcbiAgICAgICAgY29uc3QgZ2x5cGhPZmZzZXRBcnJheVN0YXJ0ID0gdGhpcy5nbHlwaE9mZnNldEFycmF5Lmxlbmd0aDtcbiAgICAgICAgY29uc3QgdmVydGV4U3RhcnRJbmRleCA9IHNlZ21lbnQudmVydGV4TGVuZ3RoO1xuXG4gICAgICAgIGZvciAoY29uc3Qgc3ltYm9sIG9mIHF1YWRzKSB7XG5cbiAgICAgICAgICAgIGNvbnN0IHRsID0gc3ltYm9sLnRsLFxuICAgICAgICAgICAgICAgIHRyID0gc3ltYm9sLnRyLFxuICAgICAgICAgICAgICAgIGJsID0gc3ltYm9sLmJsLFxuICAgICAgICAgICAgICAgIGJyID0gc3ltYm9sLmJyLFxuICAgICAgICAgICAgICAgIHRleCA9IHN5bWJvbC50ZXg7XG5cbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gc2VnbWVudC52ZXJ0ZXhMZW5ndGg7XG5cbiAgICAgICAgICAgIGNvbnN0IHkgPSBzeW1ib2wuZ2x5cGhPZmZzZXRbMV07XG4gICAgICAgICAgICBhZGRWZXJ0ZXgobGF5b3V0VmVydGV4QXJyYXksIGxhYmVsQW5jaG9yLngsIGxhYmVsQW5jaG9yLnksIHRsLngsIHkgKyB0bC55LCB0ZXgueCwgdGV4LnksIHNpemVWZXJ0ZXgpO1xuICAgICAgICAgICAgYWRkVmVydGV4KGxheW91dFZlcnRleEFycmF5LCBsYWJlbEFuY2hvci54LCBsYWJlbEFuY2hvci55LCB0ci54LCB5ICsgdHIueSwgdGV4LnggKyB0ZXgudywgdGV4LnksIHNpemVWZXJ0ZXgpO1xuICAgICAgICAgICAgYWRkVmVydGV4KGxheW91dFZlcnRleEFycmF5LCBsYWJlbEFuY2hvci54LCBsYWJlbEFuY2hvci55LCBibC54LCB5ICsgYmwueSwgdGV4LngsIHRleC55ICsgdGV4LmgsIHNpemVWZXJ0ZXgpO1xuICAgICAgICAgICAgYWRkVmVydGV4KGxheW91dFZlcnRleEFycmF5LCBsYWJlbEFuY2hvci54LCBsYWJlbEFuY2hvci55LCBici54LCB5ICsgYnIueSwgdGV4LnggKyB0ZXgudywgdGV4LnkgKyB0ZXguaCwgc2l6ZVZlcnRleCk7XG5cbiAgICAgICAgICAgIGFkZER5bmFtaWNBdHRyaWJ1dGVzKGR5bmFtaWNMYXlvdXRWZXJ0ZXhBcnJheSwgbGFiZWxBbmNob3IsIDApO1xuXG4gICAgICAgICAgICBpbmRleEFycmF5LmVtcGxhY2VCYWNrKGluZGV4LCBpbmRleCArIDEsIGluZGV4ICsgMik7XG4gICAgICAgICAgICBpbmRleEFycmF5LmVtcGxhY2VCYWNrKGluZGV4ICsgMSwgaW5kZXggKyAyLCBpbmRleCArIDMpO1xuXG4gICAgICAgICAgICBzZWdtZW50LnZlcnRleExlbmd0aCArPSA0O1xuICAgICAgICAgICAgc2VnbWVudC5wcmltaXRpdmVMZW5ndGggKz0gMjtcblxuICAgICAgICAgICAgdGhpcy5nbHlwaE9mZnNldEFycmF5LmVtcGxhY2VCYWNrKHN5bWJvbC5nbHlwaE9mZnNldFswXSk7XG4gICAgICAgIH1cblxuICAgICAgICBhcnJheXMucGxhY2VkU3ltYm9sQXJyYXkuZW1wbGFjZUJhY2sobGFiZWxBbmNob3IueCwgbGFiZWxBbmNob3IueSxcbiAgICAgICAgICAgIGdseXBoT2Zmc2V0QXJyYXlTdGFydCwgdGhpcy5nbHlwaE9mZnNldEFycmF5Lmxlbmd0aCAtIGdseXBoT2Zmc2V0QXJyYXlTdGFydCwgdmVydGV4U3RhcnRJbmRleCxcbiAgICAgICAgICAgIGxpbmVTdGFydEluZGV4LCBsaW5lTGVuZ3RoLCAobGFiZWxBbmNob3Iuc2VnbWVudDogYW55KSxcbiAgICAgICAgICAgIHNpemVWZXJ0ZXggPyBzaXplVmVydGV4WzBdIDogMCwgc2l6ZVZlcnRleCA/IHNpemVWZXJ0ZXhbMV0gOiAwLFxuICAgICAgICAgICAgbGluZU9mZnNldFswXSwgbGluZU9mZnNldFsxXSxcbiAgICAgICAgICAgIHdyaXRpbmdNb2RlLCAoZmFsc2U6IGFueSksXG4gICAgICAgICAgICAvLyBUaGUgY3Jvc3NUaWxlSUQgaXMgb25seSBmaWxsZWQvdXNlZCBvbiB0aGUgZm9yZWdyb3VuZCBmb3IgZHluYW1pYyB0ZXh0IGFuY2hvcnNcbiAgICAgICAgICAgIDApO1xuXG4gICAgICAgIGFycmF5cy5wcm9ncmFtQ29uZmlndXJhdGlvbnMucG9wdWxhdGVQYWludEFycmF5cyhhcnJheXMubGF5b3V0VmVydGV4QXJyYXkubGVuZ3RoLCBmZWF0dXJlLCBmZWF0dXJlLmluZGV4LCB7fSk7XG4gICAgfVxuXG4gICAgX2FkZENvbGxpc2lvbkRlYnVnVmVydGV4KGxheW91dFZlcnRleEFycmF5OiBTdHJ1Y3RBcnJheSwgY29sbGlzaW9uVmVydGV4QXJyYXk6IFN0cnVjdEFycmF5LCBwb2ludDogUG9pbnQsIGFuY2hvclg6IG51bWJlciwgYW5jaG9yWTogbnVtYmVyLCBleHRydWRlOiBQb2ludCkge1xuICAgICAgICBjb2xsaXNpb25WZXJ0ZXhBcnJheS5lbXBsYWNlQmFjaygwLCAwKTtcbiAgICAgICAgcmV0dXJuIGxheW91dFZlcnRleEFycmF5LmVtcGxhY2VCYWNrKFxuICAgICAgICAgICAgLy8gcG9zXG4gICAgICAgICAgICBwb2ludC54LFxuICAgICAgICAgICAgcG9pbnQueSxcbiAgICAgICAgICAgIC8vIGFfYW5jaG9yX3Bvc1xuICAgICAgICAgICAgYW5jaG9yWCxcbiAgICAgICAgICAgIGFuY2hvclksXG4gICAgICAgICAgICAvLyBleHRydWRlXG4gICAgICAgICAgICBNYXRoLnJvdW5kKGV4dHJ1ZGUueCksXG4gICAgICAgICAgICBNYXRoLnJvdW5kKGV4dHJ1ZGUueSkpO1xuICAgIH1cblxuXG4gICAgYWRkQ29sbGlzaW9uRGVidWdWZXJ0aWNlcyh4MTogbnVtYmVyLCB5MTogbnVtYmVyLCB4MjogbnVtYmVyLCB5MjogbnVtYmVyLCBhcnJheXM6IENvbGxpc2lvbkJ1ZmZlcnMsIGJveEFuY2hvclBvaW50OiBQb2ludCwgc3ltYm9sSW5zdGFuY2U6IFN5bWJvbEluc3RhbmNlLCBpc0NpcmNsZTogYm9vbGVhbikge1xuICAgICAgICBjb25zdCBzZWdtZW50ID0gYXJyYXlzLnNlZ21lbnRzLnByZXBhcmVTZWdtZW50KDQsIGFycmF5cy5sYXlvdXRWZXJ0ZXhBcnJheSwgYXJyYXlzLmluZGV4QXJyYXkpO1xuICAgICAgICBjb25zdCBpbmRleCA9IHNlZ21lbnQudmVydGV4TGVuZ3RoO1xuXG4gICAgICAgIGNvbnN0IGxheW91dFZlcnRleEFycmF5ID0gYXJyYXlzLmxheW91dFZlcnRleEFycmF5O1xuICAgICAgICBjb25zdCBjb2xsaXNpb25WZXJ0ZXhBcnJheSA9IGFycmF5cy5jb2xsaXNpb25WZXJ0ZXhBcnJheTtcblxuICAgICAgICBjb25zdCBhbmNob3JYID0gc3ltYm9sSW5zdGFuY2UuYW5jaG9yWDtcbiAgICAgICAgY29uc3QgYW5jaG9yWSA9IHN5bWJvbEluc3RhbmNlLmFuY2hvclk7XG5cbiAgICAgICAgdGhpcy5fYWRkQ29sbGlzaW9uRGVidWdWZXJ0ZXgobGF5b3V0VmVydGV4QXJyYXksIGNvbGxpc2lvblZlcnRleEFycmF5LCBib3hBbmNob3JQb2ludCwgYW5jaG9yWCwgYW5jaG9yWSwgbmV3IFBvaW50KHgxLCB5MSkpO1xuICAgICAgICB0aGlzLl9hZGRDb2xsaXNpb25EZWJ1Z1ZlcnRleChsYXlvdXRWZXJ0ZXhBcnJheSwgY29sbGlzaW9uVmVydGV4QXJyYXksIGJveEFuY2hvclBvaW50LCBhbmNob3JYLCBhbmNob3JZLCBuZXcgUG9pbnQoeDIsIHkxKSk7XG4gICAgICAgIHRoaXMuX2FkZENvbGxpc2lvbkRlYnVnVmVydGV4KGxheW91dFZlcnRleEFycmF5LCBjb2xsaXNpb25WZXJ0ZXhBcnJheSwgYm94QW5jaG9yUG9pbnQsIGFuY2hvclgsIGFuY2hvclksIG5ldyBQb2ludCh4MiwgeTIpKTtcbiAgICAgICAgdGhpcy5fYWRkQ29sbGlzaW9uRGVidWdWZXJ0ZXgobGF5b3V0VmVydGV4QXJyYXksIGNvbGxpc2lvblZlcnRleEFycmF5LCBib3hBbmNob3JQb2ludCwgYW5jaG9yWCwgYW5jaG9yWSwgbmV3IFBvaW50KHgxLCB5MikpO1xuXG4gICAgICAgIHNlZ21lbnQudmVydGV4TGVuZ3RoICs9IDQ7XG4gICAgICAgIGlmIChpc0NpcmNsZSkge1xuICAgICAgICAgICAgY29uc3QgaW5kZXhBcnJheTogVHJpYW5nbGVJbmRleEFycmF5ID0gKGFycmF5cy5pbmRleEFycmF5OiBhbnkpO1xuICAgICAgICAgICAgaW5kZXhBcnJheS5lbXBsYWNlQmFjayhpbmRleCwgaW5kZXggKyAxLCBpbmRleCArIDIpO1xuICAgICAgICAgICAgaW5kZXhBcnJheS5lbXBsYWNlQmFjayhpbmRleCwgaW5kZXggKyAyLCBpbmRleCArIDMpO1xuXG4gICAgICAgICAgICBzZWdtZW50LnByaW1pdGl2ZUxlbmd0aCArPSAyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgaW5kZXhBcnJheTogTGluZUluZGV4QXJyYXkgPSAoYXJyYXlzLmluZGV4QXJyYXk6IGFueSk7XG4gICAgICAgICAgICBpbmRleEFycmF5LmVtcGxhY2VCYWNrKGluZGV4LCBpbmRleCArIDEpO1xuICAgICAgICAgICAgaW5kZXhBcnJheS5lbXBsYWNlQmFjayhpbmRleCArIDEsIGluZGV4ICsgMik7XG4gICAgICAgICAgICBpbmRleEFycmF5LmVtcGxhY2VCYWNrKGluZGV4ICsgMiwgaW5kZXggKyAzKTtcbiAgICAgICAgICAgIGluZGV4QXJyYXkuZW1wbGFjZUJhY2soaW5kZXggKyAzLCBpbmRleCk7XG5cbiAgICAgICAgICAgIHNlZ21lbnQucHJpbWl0aXZlTGVuZ3RoICs9IDQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhZGREZWJ1Z0NvbGxpc2lvbkJveGVzKHN0YXJ0SW5kZXg6IG51bWJlciwgZW5kSW5kZXg6IG51bWJlciwgc3ltYm9sSW5zdGFuY2U6IFN5bWJvbEluc3RhbmNlKSB7XG4gICAgICAgIGZvciAobGV0IGIgPSBzdGFydEluZGV4OyBiIDwgZW5kSW5kZXg7IGIrKykge1xuICAgICAgICAgICAgY29uc3QgYm94OiBDb2xsaXNpb25Cb3ggPSAodGhpcy5jb2xsaXNpb25Cb3hBcnJheS5nZXQoYik6IGFueSk7XG4gICAgICAgICAgICBjb25zdCB4MSA9IGJveC54MTtcbiAgICAgICAgICAgIGNvbnN0IHkxID0gYm94LnkxO1xuICAgICAgICAgICAgY29uc3QgeDIgPSBib3gueDI7XG4gICAgICAgICAgICBjb25zdCB5MiA9IGJveC55MjtcblxuICAgICAgICAgICAgLy8gSWYgdGhlIHJhZGl1cyA+IDAsIHRoaXMgY29sbGlzaW9uIGJveCBpcyBhY3R1YWxseSBhIGNpcmNsZVxuICAgICAgICAgICAgLy8gVGhlIGRhdGEgd2UgYWRkIHRvIHRoZSBidWZmZXJzIGlzIGV4YWN0bHkgdGhlIHNhbWUsIGJ1dCB3ZSdsbCByZW5kZXIgd2l0aCBhIGRpZmZlcmVudCBzaGFkZXIuXG4gICAgICAgICAgICBjb25zdCBpc0NpcmNsZSA9IGJveC5yYWRpdXMgPiAwO1xuICAgICAgICAgICAgdGhpcy5hZGRDb2xsaXNpb25EZWJ1Z1ZlcnRpY2VzKHgxLCB5MSwgeDIsIHkyLCBpc0NpcmNsZSA/IHRoaXMuY29sbGlzaW9uQ2lyY2xlIDogdGhpcy5jb2xsaXNpb25Cb3gsIGJveC5hbmNob3JQb2ludCwgc3ltYm9sSW5zdGFuY2UsIGlzQ2lyY2xlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdlbmVyYXRlQ29sbGlzaW9uRGVidWdCdWZmZXJzKCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc3ltYm9sSW5zdGFuY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBzeW1ib2xJbnN0YW5jZSA9IHRoaXMuc3ltYm9sSW5zdGFuY2VzLmdldChpKTtcbiAgICAgICAgICAgIHRoaXMuYWRkRGVidWdDb2xsaXNpb25Cb3hlcyhzeW1ib2xJbnN0YW5jZS50ZXh0Qm94U3RhcnRJbmRleCwgc3ltYm9sSW5zdGFuY2UudGV4dEJveEVuZEluZGV4LCBzeW1ib2xJbnN0YW5jZSk7XG4gICAgICAgICAgICB0aGlzLmFkZERlYnVnQ29sbGlzaW9uQm94ZXMoc3ltYm9sSW5zdGFuY2UuaWNvbkJveFN0YXJ0SW5kZXgsIHN5bWJvbEluc3RhbmNlLmljb25Cb3hFbmRJbmRleCwgc3ltYm9sSW5zdGFuY2UpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gVGhlc2UgZmxhdCBhcnJheXMgYXJlIG1lYW50IHRvIGJlIHF1aWNrZXIgdG8gaXRlcmF0ZSBvdmVyIHRoYW4gdGhlIHNvdXJjZVxuICAgIC8vIENvbGxpc2lvbkJveEFycmF5XG4gICAgX2Rlc2VyaWFsaXplQ29sbGlzaW9uQm94ZXNGb3JTeW1ib2woY29sbGlzaW9uQm94QXJyYXk6IENvbGxpc2lvbkJveEFycmF5LCB0ZXh0U3RhcnRJbmRleDogbnVtYmVyLCB0ZXh0RW5kSW5kZXg6IG51bWJlciwgaWNvblN0YXJ0SW5kZXg6IG51bWJlciwgaWNvbkVuZEluZGV4OiBudW1iZXIpOiBDb2xsaXNpb25BcnJheXMge1xuICAgICAgICBjb25zdCBjb2xsaXNpb25BcnJheXMgPSB7fTtcbiAgICAgICAgZm9yIChsZXQgayA9IHRleHRTdGFydEluZGV4OyBrIDwgdGV4dEVuZEluZGV4OyBrKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGJveDogQ29sbGlzaW9uQm94ID0gKGNvbGxpc2lvbkJveEFycmF5LmdldChrKTogYW55KTtcbiAgICAgICAgICAgIGlmIChib3gucmFkaXVzID09PSAwKSB7XG4gICAgICAgICAgICAgICAgY29sbGlzaW9uQXJyYXlzLnRleHRCb3ggPSB7IHgxOiBib3gueDEsIHkxOiBib3gueTEsIHgyOiBib3gueDIsIHkyOiBib3gueTIsIGFuY2hvclBvaW50WDogYm94LmFuY2hvclBvaW50WCwgYW5jaG9yUG9pbnRZOiBib3guYW5jaG9yUG9pbnRZIH07XG4gICAgICAgICAgICAgICAgY29sbGlzaW9uQXJyYXlzLnRleHRGZWF0dXJlSW5kZXggPSBib3guZmVhdHVyZUluZGV4O1xuICAgICAgICAgICAgICAgIGJyZWFrOyAvLyBPbmx5IG9uZSBib3ggYWxsb3dlZCBwZXIgaW5zdGFuY2VcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKCFjb2xsaXNpb25BcnJheXMudGV4dENpcmNsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29sbGlzaW9uQXJyYXlzLnRleHRDaXJjbGVzID0gW107XG4gICAgICAgICAgICAgICAgICAgIGNvbGxpc2lvbkFycmF5cy50ZXh0RmVhdHVyZUluZGV4ID0gYm94LmZlYXR1cmVJbmRleDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgdXNlZCA9IDE7IC8vIE1heSBiZSB1cGRhdGVkIGF0IGNvbGxpc2lvbiBkZXRlY3Rpb24gdGltZVxuICAgICAgICAgICAgICAgIGNvbGxpc2lvbkFycmF5cy50ZXh0Q2lyY2xlcy5wdXNoKGJveC5hbmNob3JQb2ludFgsIGJveC5hbmNob3JQb2ludFksIGJveC5yYWRpdXMsIGJveC5zaWduZWREaXN0YW5jZUZyb21BbmNob3IsIHVzZWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGsgPSBpY29uU3RhcnRJbmRleDsgayA8IGljb25FbmRJbmRleDsgaysrKSB7XG4gICAgICAgICAgICAvLyBBbiBpY29uIGNhbiBvbmx5IGhhdmUgb25lIGJveCBub3csIHNvIHRoaXMgaW5kZXhpbmcgaXMgYSBiaXQgdmVzdGlnaWFsLi4uXG4gICAgICAgICAgICBjb25zdCBib3g6IENvbGxpc2lvbkJveCA9IChjb2xsaXNpb25Cb3hBcnJheS5nZXQoayk6IGFueSk7XG4gICAgICAgICAgICBpZiAoYm94LnJhZGl1cyA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGNvbGxpc2lvbkFycmF5cy5pY29uQm94ID0geyB4MTogYm94LngxLCB5MTogYm94LnkxLCB4MjogYm94LngyLCB5MjogYm94LnkyLCBhbmNob3JQb2ludFg6IGJveC5hbmNob3JQb2ludFgsIGFuY2hvclBvaW50WTogYm94LmFuY2hvclBvaW50WSB9O1xuICAgICAgICAgICAgICAgIGNvbGxpc2lvbkFycmF5cy5pY29uRmVhdHVyZUluZGV4ID0gYm94LmZlYXR1cmVJbmRleDtcbiAgICAgICAgICAgICAgICBicmVhazsgLy8gT25seSBvbmUgYm94IGFsbG93ZWQgcGVyIGluc3RhbmNlXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbGxpc2lvbkFycmF5cztcbiAgICB9XG5cbiAgICBkZXNlcmlhbGl6ZUNvbGxpc2lvbkJveGVzKGNvbGxpc2lvbkJveEFycmF5OiBDb2xsaXNpb25Cb3hBcnJheSkge1xuICAgICAgICB0aGlzLmNvbGxpc2lvbkFycmF5cyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc3ltYm9sSW5zdGFuY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBzeW1ib2xJbnN0YW5jZSA9IHRoaXMuc3ltYm9sSW5zdGFuY2VzLmdldChpKTtcbiAgICAgICAgICAgIHRoaXMuY29sbGlzaW9uQXJyYXlzLnB1c2godGhpcy5fZGVzZXJpYWxpemVDb2xsaXNpb25Cb3hlc0ZvclN5bWJvbChcbiAgICAgICAgICAgICAgICBjb2xsaXNpb25Cb3hBcnJheSxcbiAgICAgICAgICAgICAgICBzeW1ib2xJbnN0YW5jZS50ZXh0Qm94U3RhcnRJbmRleCxcbiAgICAgICAgICAgICAgICBzeW1ib2xJbnN0YW5jZS50ZXh0Qm94RW5kSW5kZXgsXG4gICAgICAgICAgICAgICAgc3ltYm9sSW5zdGFuY2UuaWNvbkJveFN0YXJ0SW5kZXgsXG4gICAgICAgICAgICAgICAgc3ltYm9sSW5zdGFuY2UuaWNvbkJveEVuZEluZGV4XG4gICAgICAgICAgICApKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGhhc1RleHREYXRhKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50ZXh0LnNlZ21lbnRzLmdldCgpLmxlbmd0aCA+IDA7XG4gICAgfVxuXG4gICAgaGFzSWNvbkRhdGEoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmljb24uc2VnbWVudHMuZ2V0KCkubGVuZ3RoID4gMDtcbiAgICB9XG5cbiAgICBoYXNDb2xsaXNpb25Cb3hEYXRhKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb2xsaXNpb25Cb3guc2VnbWVudHMuZ2V0KCkubGVuZ3RoID4gMDtcbiAgICB9XG5cbiAgICBoYXNDb2xsaXNpb25DaXJjbGVEYXRhKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb2xsaXNpb25DaXJjbGUuc2VnbWVudHMuZ2V0KCkubGVuZ3RoID4gMDtcbiAgICB9XG5cbiAgICBhZGRJbmRpY2VzRm9yUGxhY2VkVGV4dFN5bWJvbChwbGFjZWRUZXh0U3ltYm9sSW5kZXg6IG51bWJlcikge1xuICAgICAgICBjb25zdCBwbGFjZWRTeW1ib2wgPSB0aGlzLnRleHQucGxhY2VkU3ltYm9sQXJyYXkuZ2V0KHBsYWNlZFRleHRTeW1ib2xJbmRleCk7XG5cbiAgICAgICAgY29uc3QgZW5kSW5kZXggPSBwbGFjZWRTeW1ib2wudmVydGV4U3RhcnRJbmRleCArIHBsYWNlZFN5bWJvbC5udW1HbHlwaHMgKiA0O1xuICAgICAgICBmb3IgKGxldCB2ZXJ0ZXhJbmRleCA9IHBsYWNlZFN5bWJvbC52ZXJ0ZXhTdGFydEluZGV4OyB2ZXJ0ZXhJbmRleCA8IGVuZEluZGV4OyB2ZXJ0ZXhJbmRleCArPSA0KSB7XG4gICAgICAgICAgICB0aGlzLnRleHQuaW5kZXhBcnJheS5lbXBsYWNlQmFjayh2ZXJ0ZXhJbmRleCwgdmVydGV4SW5kZXggKyAxLCB2ZXJ0ZXhJbmRleCArIDIpO1xuICAgICAgICAgICAgdGhpcy50ZXh0LmluZGV4QXJyYXkuZW1wbGFjZUJhY2sodmVydGV4SW5kZXggKyAxLCB2ZXJ0ZXhJbmRleCArIDIsIHZlcnRleEluZGV4ICsgMyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzb3J0RmVhdHVyZXMoYW5nbGU6IG51bWJlcikge1xuICAgICAgICBpZiAoIXRoaXMuc29ydEZlYXR1cmVzQnlZKSByZXR1cm47XG5cbiAgICAgICAgaWYgKHRoaXMuc29ydGVkQW5nbGUgPT09IGFuZ2xlKSByZXR1cm47XG4gICAgICAgIHRoaXMuc29ydGVkQW5nbGUgPSBhbmdsZTtcblxuICAgICAgICAvLyBUaGUgY3VycmVudCBhcHByb2FjaCB0byBzb3J0aW5nIGRvZXNuJ3Qgc29ydCBhY3Jvc3Mgc2VnbWVudHMgc28gZG9uJ3QgdHJ5LlxuICAgICAgICAvLyBTb3J0aW5nIHdpdGhpbiBzZWdtZW50cyBzZXBhcmF0ZWx5IHNlZW1lZCBub3QgdG8gYmUgd29ydGggdGhlIGNvbXBsZXhpdHkuXG4gICAgICAgIGlmICh0aGlzLnRleHQuc2VnbWVudHMuZ2V0KCkubGVuZ3RoID4gMSB8fCB0aGlzLmljb24uc2VnbWVudHMuZ2V0KCkubGVuZ3RoID4gMSkgcmV0dXJuO1xuXG4gICAgICAgIC8vIElmIHRoZSBzeW1ib2xzIGFyZSBhbGxvd2VkIHRvIG92ZXJsYXAgc29ydCB0aGVtIGJ5IHRoZWlyIHZlcnRpY2FsIHNjcmVlbiBwb3NpdGlvbi5cbiAgICAgICAgLy8gVGhlIGluZGV4IGFycmF5IGJ1ZmZlciBpcyByZXdyaXR0ZW4gdG8gcmVmZXJlbmNlIHRoZSAodW5jaGFuZ2VkKSB2ZXJ0aWNlcyBpbiB0aGVcbiAgICAgICAgLy8gc29ydGVkIG9yZGVyLlxuXG4gICAgICAgIC8vIFRvIGF2b2lkIHNvcnRpbmcgdGhlIGFjdHVhbCBzeW1ib2xJbnN0YW5jZSBhcnJheSB3ZSBzb3J0IGFuIGFycmF5IG9mIGluZGV4ZXMuXG4gICAgICAgIGNvbnN0IHN5bWJvbEluc3RhbmNlSW5kZXhlcyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc3ltYm9sSW5zdGFuY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBzeW1ib2xJbnN0YW5jZUluZGV4ZXMucHVzaChpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNpbiA9IE1hdGguc2luKGFuZ2xlKSxcbiAgICAgICAgICAgIGNvcyA9IE1hdGguY29zKGFuZ2xlKTtcblxuICAgICAgICBjb25zdCByb3RhdGVkWXMgPSBbXTtcbiAgICAgICAgY29uc3QgZmVhdHVyZUluZGV4ZXMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnN5bWJvbEluc3RhbmNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3Qgc3ltYm9sSW5zdGFuY2UgPSB0aGlzLnN5bWJvbEluc3RhbmNlcy5nZXQoaSk7XG4gICAgICAgICAgICByb3RhdGVkWXMucHVzaChNYXRoLnJvdW5kKHNpbiAqIHN5bWJvbEluc3RhbmNlLmFuY2hvclggKyBjb3MgKiBzeW1ib2xJbnN0YW5jZS5hbmNob3JZKSB8IDApO1xuICAgICAgICAgICAgZmVhdHVyZUluZGV4ZXMucHVzaChzeW1ib2xJbnN0YW5jZS5mZWF0dXJlSW5kZXgpO1xuICAgICAgICB9XG5cbiAgICAgICAgc3ltYm9sSW5zdGFuY2VJbmRleGVzLnNvcnQoKGFJbmRleCwgYkluZGV4KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gKHJvdGF0ZWRZc1thSW5kZXhdIC0gcm90YXRlZFlzW2JJbmRleF0pIHx8XG4gICAgICAgICAgICAgICAgICAgKGZlYXR1cmVJbmRleGVzW2JJbmRleF0gLSBmZWF0dXJlSW5kZXhlc1thSW5kZXhdKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy50ZXh0LmluZGV4QXJyYXkuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5pY29uLmluZGV4QXJyYXkuY2xlYXIoKTtcblxuICAgICAgICB0aGlzLmZlYXR1cmVTb3J0T3JkZXIgPSBbXTtcblxuICAgICAgICBmb3IgKGNvbnN0IGkgb2Ygc3ltYm9sSW5zdGFuY2VJbmRleGVzKSB7XG4gICAgICAgICAgICBjb25zdCBzeW1ib2xJbnN0YW5jZSA9IHRoaXMuc3ltYm9sSW5zdGFuY2VzLmdldChpKTtcbiAgICAgICAgICAgIHRoaXMuZmVhdHVyZVNvcnRPcmRlci5wdXNoKHN5bWJvbEluc3RhbmNlLmZlYXR1cmVJbmRleCk7XG5cbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICBzeW1ib2xJbnN0YW5jZS5yaWdodEp1c3RpZmllZFRleHRTeW1ib2xJbmRleCxcbiAgICAgICAgICAgICAgICBzeW1ib2xJbnN0YW5jZS5jZW50ZXJKdXN0aWZpZWRUZXh0U3ltYm9sSW5kZXgsXG4gICAgICAgICAgICAgICAgc3ltYm9sSW5zdGFuY2UubGVmdEp1c3RpZmllZFRleHRTeW1ib2xJbmRleFxuICAgICAgICAgICAgXS5mb3JFYWNoKChpbmRleCwgaSwgYXJyYXkpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBPbmx5IGFkZCBhIGdpdmVuIGluZGV4IHRoZSBmaXJzdCB0aW1lIGl0IHNob3dzIHVwLFxuICAgICAgICAgICAgICAgIC8vIHRvIGF2b2lkIGR1cGxpY2F0ZSBvcGFjaXR5IGVudHJpZXMgd2hlbiBtdWx0aXBsZSBqdXN0aWZpY2F0aW9uc1xuICAgICAgICAgICAgICAgIC8vIHNoYXJlIHRoZSBzYW1lIGdseXBocy5cbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCAmJiBhcnJheS5pbmRleE9mKGluZGV4KSA9PT0gaSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEluZGljZXNGb3JQbGFjZWRUZXh0U3ltYm9sKGluZGV4KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKHN5bWJvbEluc3RhbmNlLnZlcnRpY2FsUGxhY2VkVGV4dFN5bWJvbEluZGV4ID49IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEluZGljZXNGb3JQbGFjZWRUZXh0U3ltYm9sKHN5bWJvbEluc3RhbmNlLnZlcnRpY2FsUGxhY2VkVGV4dFN5bWJvbEluZGV4KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgcGxhY2VkSWNvbiA9IHRoaXMuaWNvbi5wbGFjZWRTeW1ib2xBcnJheS5nZXQoaSk7XG4gICAgICAgICAgICBpZiAocGxhY2VkSWNvbi5udW1HbHlwaHMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB2ZXJ0ZXhJbmRleCA9IHBsYWNlZEljb24udmVydGV4U3RhcnRJbmRleDtcbiAgICAgICAgICAgICAgICB0aGlzLmljb24uaW5kZXhBcnJheS5lbXBsYWNlQmFjayh2ZXJ0ZXhJbmRleCwgdmVydGV4SW5kZXggKyAxLCB2ZXJ0ZXhJbmRleCArIDIpO1xuICAgICAgICAgICAgICAgIHRoaXMuaWNvbi5pbmRleEFycmF5LmVtcGxhY2VCYWNrKHZlcnRleEluZGV4ICsgMSwgdmVydGV4SW5kZXggKyAyLCB2ZXJ0ZXhJbmRleCArIDMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMudGV4dC5pbmRleEJ1ZmZlcikgdGhpcy50ZXh0LmluZGV4QnVmZmVyLnVwZGF0ZURhdGEodGhpcy50ZXh0LmluZGV4QXJyYXkpO1xuICAgICAgICBpZiAodGhpcy5pY29uLmluZGV4QnVmZmVyKSB0aGlzLmljb24uaW5kZXhCdWZmZXIudXBkYXRlRGF0YSh0aGlzLmljb24uaW5kZXhBcnJheSk7XG4gICAgfVxufVxuXG5yZWdpc3RlcignU3ltYm9sQnVja2V0JywgU3ltYm9sQnVja2V0LCB7XG4gICAgb21pdDogWydsYXllcnMnLCAnY29sbGlzaW9uQm94QXJyYXknLCAnZmVhdHVyZXMnLCAnY29tcGFyZVRleHQnXVxufSk7XG5cbi8vIHRoaXMgY29uc3RhbnQgaXMgYmFzZWQgb24gdGhlIHNpemUgb2YgU3RydWN0QXJyYXkgaW5kZXhlcyB1c2VkIGluIGEgc3ltYm9sXG4vLyBidWNrZXQtLW5hbWVseSwgZ2x5cGhPZmZzZXRBcnJheVN0YXJ0XG4vLyBlZyB0aGUgbWF4IHZhbGlkIFVJbnQxNiBpcyA2NSw1MzVcbi8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L21hcGJveC1nbC1qcy9pc3N1ZXMvMjkwNyBmb3IgbW90aXZhdGlvblxuLy8gbGluZVN0YXJ0SW5kZXggYW5kIHRleHRCb3hTdGFydEluZGV4IGNvdWxkIHBvdGVudGlhbGx5IGJlIGNvbmNlcm5zXG4vLyBidXQgd2UgZXhwZWN0IHRoZXJlIHRvIGJlIG1hbnkgZmV3ZXIgYm94ZXMvbGluZXMgdGhhbiBnbHlwaHNcblN5bWJvbEJ1Y2tldC5NQVhfR0xZUEhTID0gNjU1MzU7XG5cblN5bWJvbEJ1Y2tldC5hZGREeW5hbWljQXR0cmlidXRlcyA9IGFkZER5bmFtaWNBdHRyaWJ1dGVzO1xuXG5leHBvcnQgZGVmYXVsdCBTeW1ib2xCdWNrZXQ7XG5leHBvcnQgeyBhZGREeW5hbWljQXR0cmlidXRlcyB9O1xuIiwiLy8gQGZsb3dcbmV4cG9ydCBkZWZhdWx0IHJlc29sdmVUb2tlbnM7XG5cbi8qKlxuICogUmVwbGFjZSB0b2tlbnMgaW4gYSBzdHJpbmcgdGVtcGxhdGUgd2l0aCB2YWx1ZXMgaW4gYW4gb2JqZWN0XG4gKlxuICogQHBhcmFtIHByb3BlcnRpZXMgYSBrZXkvdmFsdWUgcmVsYXRpb25zaGlwIGJldHdlZW4gdG9rZW5zIGFuZCByZXBsYWNlbWVudHNcbiAqIEBwYXJhbSB0ZXh0IHRoZSB0ZW1wbGF0ZSBzdHJpbmdcbiAqIEByZXR1cm5zIHRoZSB0ZW1wbGF0ZSB3aXRoIHRva2VucyByZXBsYWNlZFxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVRva2Vucyhwcm9wZXJ0aWVzOiB7K1tzdHJpbmddOiBtaXhlZH0sIHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRleHQucmVwbGFjZSgveyhbXnt9XSspfS9nLCAobWF0Y2gsIGtleTogc3RyaW5nKSA9PiB7XG4gICAgICAgIHJldHVybiBrZXkgaW4gcHJvcGVydGllcyA/IFN0cmluZyhwcm9wZXJ0aWVzW2tleV0pIDogJyc7XG4gICAgfSk7XG59XG4iLCIvLyBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkLiBFZGl0IGJ1aWxkL2dlbmVyYXRlLXN0eWxlLWNvZGUuanMsIHRoZW4gcnVuIGB5YXJuIHJ1biBjb2RlZ2VuYC5cbi8vIEBmbG93XG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xuXG5pbXBvcnQgc3R5bGVTcGVjIGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvcmVmZXJlbmNlL2xhdGVzdCc7XG5cbmltcG9ydCB7XG4gICAgUHJvcGVydGllcyxcbiAgICBEYXRhQ29uc3RhbnRQcm9wZXJ0eSxcbiAgICBEYXRhRHJpdmVuUHJvcGVydHksXG4gICAgQ3Jvc3NGYWRlZERhdGFEcml2ZW5Qcm9wZXJ0eSxcbiAgICBDcm9zc0ZhZGVkUHJvcGVydHksXG4gICAgQ29sb3JSYW1wUHJvcGVydHlcbn0gZnJvbSAnLi4vcHJvcGVydGllcyc7XG5cbmltcG9ydCB0eXBlIENvbG9yIGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvdXRpbC9jb2xvcic7XG5cbmltcG9ydCB0eXBlIEZvcm1hdHRlZCBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL2V4cHJlc3Npb24vdHlwZXMvZm9ybWF0dGVkJztcblxuZXhwb3J0IHR5cGUgTGF5b3V0UHJvcHMgPSB7fFxuICAgIFwic3ltYm9sLXBsYWNlbWVudFwiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxcInBvaW50XCIgfCBcImxpbmVcIiB8IFwibGluZS1jZW50ZXJcIj4sXG4gICAgXCJzeW1ib2wtc3BhY2luZ1wiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxudW1iZXI+LFxuICAgIFwic3ltYm9sLWF2b2lkLWVkZ2VzXCI6IERhdGFDb25zdGFudFByb3BlcnR5PGJvb2xlYW4+LFxuICAgIFwic3ltYm9sLXNvcnQta2V5XCI6IERhdGFEcml2ZW5Qcm9wZXJ0eTxudW1iZXI+LFxuICAgIFwic3ltYm9sLXotb3JkZXJcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8XCJhdXRvXCIgfCBcInZpZXdwb3J0LXlcIiB8IFwic291cmNlXCI+LFxuICAgIFwiaWNvbi1hbGxvdy1vdmVybGFwXCI6IERhdGFDb25zdGFudFByb3BlcnR5PGJvb2xlYW4+LFxuICAgIFwiaWNvbi1pZ25vcmUtcGxhY2VtZW50XCI6IERhdGFDb25zdGFudFByb3BlcnR5PGJvb2xlYW4+LFxuICAgIFwiaWNvbi1vcHRpb25hbFwiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxib29sZWFuPixcbiAgICBcImljb24tcm90YXRpb24tYWxpZ25tZW50XCI6IERhdGFDb25zdGFudFByb3BlcnR5PFwibWFwXCIgfCBcInZpZXdwb3J0XCIgfCBcImF1dG9cIj4sXG4gICAgXCJpY29uLXNpemVcIjogRGF0YURyaXZlblByb3BlcnR5PG51bWJlcj4sXG4gICAgXCJpY29uLXRleHQtZml0XCI6IERhdGFDb25zdGFudFByb3BlcnR5PFwibm9uZVwiIHwgXCJ3aWR0aFwiIHwgXCJoZWlnaHRcIiB8IFwiYm90aFwiPixcbiAgICBcImljb24tdGV4dC1maXQtcGFkZGluZ1wiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXT4sXG4gICAgXCJpY29uLWltYWdlXCI6IERhdGFEcml2ZW5Qcm9wZXJ0eTxzdHJpbmc+LFxuICAgIFwiaWNvbi1yb3RhdGVcIjogRGF0YURyaXZlblByb3BlcnR5PG51bWJlcj4sXG4gICAgXCJpY29uLXBhZGRpbmdcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8bnVtYmVyPixcbiAgICBcImljb24ta2VlcC11cHJpZ2h0XCI6IERhdGFDb25zdGFudFByb3BlcnR5PGJvb2xlYW4+LFxuICAgIFwiaWNvbi1vZmZzZXRcIjogRGF0YURyaXZlblByb3BlcnR5PFtudW1iZXIsIG51bWJlcl0+LFxuICAgIFwiaWNvbi1hbmNob3JcIjogRGF0YURyaXZlblByb3BlcnR5PFwiY2VudGVyXCIgfCBcImxlZnRcIiB8IFwicmlnaHRcIiB8IFwidG9wXCIgfCBcImJvdHRvbVwiIHwgXCJ0b3AtbGVmdFwiIHwgXCJ0b3AtcmlnaHRcIiB8IFwiYm90dG9tLWxlZnRcIiB8IFwiYm90dG9tLXJpZ2h0XCI+LFxuICAgIFwiaWNvbi1waXRjaC1hbGlnbm1lbnRcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8XCJtYXBcIiB8IFwidmlld3BvcnRcIiB8IFwiYXV0b1wiPixcbiAgICBcInRleHQtcGl0Y2gtYWxpZ25tZW50XCI6IERhdGFDb25zdGFudFByb3BlcnR5PFwibWFwXCIgfCBcInZpZXdwb3J0XCIgfCBcImF1dG9cIj4sXG4gICAgXCJ0ZXh0LXJvdGF0aW9uLWFsaWdubWVudFwiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxcIm1hcFwiIHwgXCJ2aWV3cG9ydFwiIHwgXCJhdXRvXCI+LFxuICAgIFwidGV4dC1maWVsZFwiOiBEYXRhRHJpdmVuUHJvcGVydHk8Rm9ybWF0dGVkPixcbiAgICBcInRleHQtZm9udFwiOiBEYXRhRHJpdmVuUHJvcGVydHk8QXJyYXk8c3RyaW5nPj4sXG4gICAgXCJ0ZXh0LXNpemVcIjogRGF0YURyaXZlblByb3BlcnR5PG51bWJlcj4sXG4gICAgXCJ0ZXh0LW1heC13aWR0aFwiOiBEYXRhRHJpdmVuUHJvcGVydHk8bnVtYmVyPixcbiAgICBcInRleHQtbGluZS1oZWlnaHRcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8bnVtYmVyPixcbiAgICBcInRleHQtbGV0dGVyLXNwYWNpbmdcIjogRGF0YURyaXZlblByb3BlcnR5PG51bWJlcj4sXG4gICAgXCJ0ZXh0LWp1c3RpZnlcIjogRGF0YURyaXZlblByb3BlcnR5PFwiYXV0b1wiIHwgXCJsZWZ0XCIgfCBcImNlbnRlclwiIHwgXCJyaWdodFwiPixcbiAgICBcInRleHQtcmFkaWFsLW9mZnNldFwiOiBEYXRhRHJpdmVuUHJvcGVydHk8bnVtYmVyPixcbiAgICBcInRleHQtdmFyaWFibGUtYW5jaG9yXCI6IERhdGFDb25zdGFudFByb3BlcnR5PEFycmF5PFwiY2VudGVyXCIgfCBcImxlZnRcIiB8IFwicmlnaHRcIiB8IFwidG9wXCIgfCBcImJvdHRvbVwiIHwgXCJ0b3AtbGVmdFwiIHwgXCJ0b3AtcmlnaHRcIiB8IFwiYm90dG9tLWxlZnRcIiB8IFwiYm90dG9tLXJpZ2h0XCI+PixcbiAgICBcInRleHQtYW5jaG9yXCI6IERhdGFEcml2ZW5Qcm9wZXJ0eTxcImNlbnRlclwiIHwgXCJsZWZ0XCIgfCBcInJpZ2h0XCIgfCBcInRvcFwiIHwgXCJib3R0b21cIiB8IFwidG9wLWxlZnRcIiB8IFwidG9wLXJpZ2h0XCIgfCBcImJvdHRvbS1sZWZ0XCIgfCBcImJvdHRvbS1yaWdodFwiPixcbiAgICBcInRleHQtbWF4LWFuZ2xlXCI6IERhdGFDb25zdGFudFByb3BlcnR5PG51bWJlcj4sXG4gICAgXCJ0ZXh0LXJvdGF0ZVwiOiBEYXRhRHJpdmVuUHJvcGVydHk8bnVtYmVyPixcbiAgICBcInRleHQtcGFkZGluZ1wiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxudW1iZXI+LFxuICAgIFwidGV4dC1rZWVwLXVwcmlnaHRcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8Ym9vbGVhbj4sXG4gICAgXCJ0ZXh0LXRyYW5zZm9ybVwiOiBEYXRhRHJpdmVuUHJvcGVydHk8XCJub25lXCIgfCBcInVwcGVyY2FzZVwiIHwgXCJsb3dlcmNhc2VcIj4sXG4gICAgXCJ0ZXh0LW9mZnNldFwiOiBEYXRhRHJpdmVuUHJvcGVydHk8W251bWJlciwgbnVtYmVyXT4sXG4gICAgXCJ0ZXh0LWFsbG93LW92ZXJsYXBcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8Ym9vbGVhbj4sXG4gICAgXCJ0ZXh0LWlnbm9yZS1wbGFjZW1lbnRcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8Ym9vbGVhbj4sXG4gICAgXCJ0ZXh0LW9wdGlvbmFsXCI6IERhdGFDb25zdGFudFByb3BlcnR5PGJvb2xlYW4+LFxufH07XG5cbmNvbnN0IGxheW91dDogUHJvcGVydGllczxMYXlvdXRQcm9wcz4gPSBuZXcgUHJvcGVydGllcyh7XG4gICAgXCJzeW1ib2wtcGxhY2VtZW50XCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJsYXlvdXRfc3ltYm9sXCJdW1wic3ltYm9sLXBsYWNlbWVudFwiXSksXG4gICAgXCJzeW1ib2wtc3BhY2luZ1wiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X3N5bWJvbFwiXVtcInN5bWJvbC1zcGFjaW5nXCJdKSxcbiAgICBcInN5bWJvbC1hdm9pZC1lZGdlc1wiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X3N5bWJvbFwiXVtcInN5bWJvbC1hdm9pZC1lZGdlc1wiXSksXG4gICAgXCJzeW1ib2wtc29ydC1rZXlcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJsYXlvdXRfc3ltYm9sXCJdW1wic3ltYm9sLXNvcnQta2V5XCJdKSxcbiAgICBcInN5bWJvbC16LW9yZGVyXCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJsYXlvdXRfc3ltYm9sXCJdW1wic3ltYm9sLXotb3JkZXJcIl0pLFxuICAgIFwiaWNvbi1hbGxvdy1vdmVybGFwXCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJsYXlvdXRfc3ltYm9sXCJdW1wiaWNvbi1hbGxvdy1vdmVybGFwXCJdKSxcbiAgICBcImljb24taWdub3JlLXBsYWNlbWVudFwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X3N5bWJvbFwiXVtcImljb24taWdub3JlLXBsYWNlbWVudFwiXSksXG4gICAgXCJpY29uLW9wdGlvbmFsXCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJsYXlvdXRfc3ltYm9sXCJdW1wiaWNvbi1vcHRpb25hbFwiXSksXG4gICAgXCJpY29uLXJvdGF0aW9uLWFsaWdubWVudFwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X3N5bWJvbFwiXVtcImljb24tcm90YXRpb24tYWxpZ25tZW50XCJdKSxcbiAgICBcImljb24tc2l6ZVwiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcImxheW91dF9zeW1ib2xcIl1bXCJpY29uLXNpemVcIl0pLFxuICAgIFwiaWNvbi10ZXh0LWZpdFwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X3N5bWJvbFwiXVtcImljb24tdGV4dC1maXRcIl0pLFxuICAgIFwiaWNvbi10ZXh0LWZpdC1wYWRkaW5nXCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJsYXlvdXRfc3ltYm9sXCJdW1wiaWNvbi10ZXh0LWZpdC1wYWRkaW5nXCJdKSxcbiAgICBcImljb24taW1hZ2VcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJsYXlvdXRfc3ltYm9sXCJdW1wiaWNvbi1pbWFnZVwiXSksXG4gICAgXCJpY29uLXJvdGF0ZVwiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcImxheW91dF9zeW1ib2xcIl1bXCJpY29uLXJvdGF0ZVwiXSksXG4gICAgXCJpY29uLXBhZGRpbmdcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcImxheW91dF9zeW1ib2xcIl1bXCJpY29uLXBhZGRpbmdcIl0pLFxuICAgIFwiaWNvbi1rZWVwLXVwcmlnaHRcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcImxheW91dF9zeW1ib2xcIl1bXCJpY29uLWtlZXAtdXByaWdodFwiXSksXG4gICAgXCJpY29uLW9mZnNldFwiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcImxheW91dF9zeW1ib2xcIl1bXCJpY29uLW9mZnNldFwiXSksXG4gICAgXCJpY29uLWFuY2hvclwiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcImxheW91dF9zeW1ib2xcIl1bXCJpY29uLWFuY2hvclwiXSksXG4gICAgXCJpY29uLXBpdGNoLWFsaWdubWVudFwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X3N5bWJvbFwiXVtcImljb24tcGl0Y2gtYWxpZ25tZW50XCJdKSxcbiAgICBcInRleHQtcGl0Y2gtYWxpZ25tZW50XCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJsYXlvdXRfc3ltYm9sXCJdW1widGV4dC1waXRjaC1hbGlnbm1lbnRcIl0pLFxuICAgIFwidGV4dC1yb3RhdGlvbi1hbGlnbm1lbnRcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcImxheW91dF9zeW1ib2xcIl1bXCJ0ZXh0LXJvdGF0aW9uLWFsaWdubWVudFwiXSksXG4gICAgXCJ0ZXh0LWZpZWxkXCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X3N5bWJvbFwiXVtcInRleHQtZmllbGRcIl0pLFxuICAgIFwidGV4dC1mb250XCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X3N5bWJvbFwiXVtcInRleHQtZm9udFwiXSksXG4gICAgXCJ0ZXh0LXNpemVcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJsYXlvdXRfc3ltYm9sXCJdW1widGV4dC1zaXplXCJdKSxcbiAgICBcInRleHQtbWF4LXdpZHRoXCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X3N5bWJvbFwiXVtcInRleHQtbWF4LXdpZHRoXCJdKSxcbiAgICBcInRleHQtbGluZS1oZWlnaHRcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcImxheW91dF9zeW1ib2xcIl1bXCJ0ZXh0LWxpbmUtaGVpZ2h0XCJdKSxcbiAgICBcInRleHQtbGV0dGVyLXNwYWNpbmdcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJsYXlvdXRfc3ltYm9sXCJdW1widGV4dC1sZXR0ZXItc3BhY2luZ1wiXSksXG4gICAgXCJ0ZXh0LWp1c3RpZnlcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJsYXlvdXRfc3ltYm9sXCJdW1widGV4dC1qdXN0aWZ5XCJdKSxcbiAgICBcInRleHQtcmFkaWFsLW9mZnNldFwiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcImxheW91dF9zeW1ib2xcIl1bXCJ0ZXh0LXJhZGlhbC1vZmZzZXRcIl0pLFxuICAgIFwidGV4dC12YXJpYWJsZS1hbmNob3JcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcImxheW91dF9zeW1ib2xcIl1bXCJ0ZXh0LXZhcmlhYmxlLWFuY2hvclwiXSksXG4gICAgXCJ0ZXh0LWFuY2hvclwiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcImxheW91dF9zeW1ib2xcIl1bXCJ0ZXh0LWFuY2hvclwiXSksXG4gICAgXCJ0ZXh0LW1heC1hbmdsZVwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X3N5bWJvbFwiXVtcInRleHQtbWF4LWFuZ2xlXCJdKSxcbiAgICBcInRleHQtcm90YXRlXCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X3N5bWJvbFwiXVtcInRleHQtcm90YXRlXCJdKSxcbiAgICBcInRleHQtcGFkZGluZ1wiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X3N5bWJvbFwiXVtcInRleHQtcGFkZGluZ1wiXSksXG4gICAgXCJ0ZXh0LWtlZXAtdXByaWdodFwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X3N5bWJvbFwiXVtcInRleHQta2VlcC11cHJpZ2h0XCJdKSxcbiAgICBcInRleHQtdHJhbnNmb3JtXCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X3N5bWJvbFwiXVtcInRleHQtdHJhbnNmb3JtXCJdKSxcbiAgICBcInRleHQtb2Zmc2V0XCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X3N5bWJvbFwiXVtcInRleHQtb2Zmc2V0XCJdKSxcbiAgICBcInRleHQtYWxsb3ctb3ZlcmxhcFwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X3N5bWJvbFwiXVtcInRleHQtYWxsb3ctb3ZlcmxhcFwiXSksXG4gICAgXCJ0ZXh0LWlnbm9yZS1wbGFjZW1lbnRcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcImxheW91dF9zeW1ib2xcIl1bXCJ0ZXh0LWlnbm9yZS1wbGFjZW1lbnRcIl0pLFxuICAgIFwidGV4dC1vcHRpb25hbFwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X3N5bWJvbFwiXVtcInRleHQtb3B0aW9uYWxcIl0pLFxufSk7XG5cbmV4cG9ydCB0eXBlIFBhaW50UHJvcHMgPSB7fFxuICAgIFwiaWNvbi1vcGFjaXR5XCI6IERhdGFEcml2ZW5Qcm9wZXJ0eTxudW1iZXI+LFxuICAgIFwiaWNvbi1jb2xvclwiOiBEYXRhRHJpdmVuUHJvcGVydHk8Q29sb3I+LFxuICAgIFwiaWNvbi1oYWxvLWNvbG9yXCI6IERhdGFEcml2ZW5Qcm9wZXJ0eTxDb2xvcj4sXG4gICAgXCJpY29uLWhhbG8td2lkdGhcIjogRGF0YURyaXZlblByb3BlcnR5PG51bWJlcj4sXG4gICAgXCJpY29uLWhhbG8tYmx1clwiOiBEYXRhRHJpdmVuUHJvcGVydHk8bnVtYmVyPixcbiAgICBcImljb24tdHJhbnNsYXRlXCI6IERhdGFDb25zdGFudFByb3BlcnR5PFtudW1iZXIsIG51bWJlcl0+LFxuICAgIFwiaWNvbi10cmFuc2xhdGUtYW5jaG9yXCI6IERhdGFDb25zdGFudFByb3BlcnR5PFwibWFwXCIgfCBcInZpZXdwb3J0XCI+LFxuICAgIFwidGV4dC1vcGFjaXR5XCI6IERhdGFEcml2ZW5Qcm9wZXJ0eTxudW1iZXI+LFxuICAgIFwidGV4dC1jb2xvclwiOiBEYXRhRHJpdmVuUHJvcGVydHk8Q29sb3I+LFxuICAgIFwidGV4dC1oYWxvLWNvbG9yXCI6IERhdGFEcml2ZW5Qcm9wZXJ0eTxDb2xvcj4sXG4gICAgXCJ0ZXh0LWhhbG8td2lkdGhcIjogRGF0YURyaXZlblByb3BlcnR5PG51bWJlcj4sXG4gICAgXCJ0ZXh0LWhhbG8tYmx1clwiOiBEYXRhRHJpdmVuUHJvcGVydHk8bnVtYmVyPixcbiAgICBcInRleHQtdHJhbnNsYXRlXCI6IERhdGFDb25zdGFudFByb3BlcnR5PFtudW1iZXIsIG51bWJlcl0+LFxuICAgIFwidGV4dC10cmFuc2xhdGUtYW5jaG9yXCI6IERhdGFDb25zdGFudFByb3BlcnR5PFwibWFwXCIgfCBcInZpZXdwb3J0XCI+LFxufH07XG5cbmNvbnN0IHBhaW50OiBQcm9wZXJ0aWVzPFBhaW50UHJvcHM+ID0gbmV3IFByb3BlcnRpZXMoe1xuICAgIFwiaWNvbi1vcGFjaXR5XCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfc3ltYm9sXCJdW1wiaWNvbi1vcGFjaXR5XCJdKSxcbiAgICBcImljb24tY29sb3JcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9zeW1ib2xcIl1bXCJpY29uLWNvbG9yXCJdKSxcbiAgICBcImljb24taGFsby1jb2xvclwiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X3N5bWJvbFwiXVtcImljb24taGFsby1jb2xvclwiXSksXG4gICAgXCJpY29uLWhhbG8td2lkdGhcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9zeW1ib2xcIl1bXCJpY29uLWhhbG8td2lkdGhcIl0pLFxuICAgIFwiaWNvbi1oYWxvLWJsdXJcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9zeW1ib2xcIl1bXCJpY29uLWhhbG8tYmx1clwiXSksXG4gICAgXCJpY29uLXRyYW5zbGF0ZVwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfc3ltYm9sXCJdW1wiaWNvbi10cmFuc2xhdGVcIl0pLFxuICAgIFwiaWNvbi10cmFuc2xhdGUtYW5jaG9yXCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9zeW1ib2xcIl1bXCJpY29uLXRyYW5zbGF0ZS1hbmNob3JcIl0pLFxuICAgIFwidGV4dC1vcGFjaXR5XCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfc3ltYm9sXCJdW1widGV4dC1vcGFjaXR5XCJdKSxcbiAgICBcInRleHQtY29sb3JcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9zeW1ib2xcIl1bXCJ0ZXh0LWNvbG9yXCJdKSxcbiAgICBcInRleHQtaGFsby1jb2xvclwiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X3N5bWJvbFwiXVtcInRleHQtaGFsby1jb2xvclwiXSksXG4gICAgXCJ0ZXh0LWhhbG8td2lkdGhcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9zeW1ib2xcIl1bXCJ0ZXh0LWhhbG8td2lkdGhcIl0pLFxuICAgIFwidGV4dC1oYWxvLWJsdXJcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9zeW1ib2xcIl1bXCJ0ZXh0LWhhbG8tYmx1clwiXSksXG4gICAgXCJ0ZXh0LXRyYW5zbGF0ZVwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfc3ltYm9sXCJdW1widGV4dC10cmFuc2xhdGVcIl0pLFxuICAgIFwidGV4dC10cmFuc2xhdGUtYW5jaG9yXCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9zeW1ib2xcIl1bXCJ0ZXh0LXRyYW5zbGF0ZS1hbmNob3JcIl0pLFxufSk7XG5cbi8vIE5vdGU6IHdpdGhvdXQgYWRkaW5nIHRoZSBleHBsaWNpdCB0eXBlIGFubm90YXRpb24sIEZsb3cgaW5mZXJzIHdlYWtlciB0eXBlc1xuLy8gZm9yIHRoZXNlIG9iamVjdHMgZnJvbSB0aGVpciB1c2UgaW4gdGhlIGNvbnN0cnVjdG9yIHRvIFN0eWxlTGF5ZXIsIGFzXG4vLyB7bGF5b3V0PzogUHJvcGVydGllczwuLi4+LCBwYWludDogUHJvcGVydGllczwuLi4+fVxuZXhwb3J0IGRlZmF1bHQgKHsgcGFpbnQsIGxheW91dCB9OiAkRXhhY3Q8e1xuICBwYWludDogUHJvcGVydGllczxQYWludFByb3BzPiwgbGF5b3V0OiBQcm9wZXJ0aWVzPExheW91dFByb3BzPlxufT4pO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IFN0eWxlTGF5ZXIgZnJvbSAnLi4vc3R5bGVfbGF5ZXInO1xuXG5pbXBvcnQgU3ltYm9sQnVja2V0IGZyb20gJy4uLy4uL2RhdGEvYnVja2V0L3N5bWJvbF9idWNrZXQnO1xuaW1wb3J0IHJlc29sdmVUb2tlbnMgZnJvbSAnLi4vLi4vdXRpbC9yZXNvbHZlX3Rva2Vucyc7XG5pbXBvcnQgeyBpc0V4cHJlc3Npb24gfSBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL2V4cHJlc3Npb24nO1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHByb3BlcnRpZXMgZnJvbSAnLi9zeW1ib2xfc3R5bGVfbGF5ZXJfcHJvcGVydGllcyc7XG5pbXBvcnQgeyBUcmFuc2l0aW9uYWJsZSwgVHJhbnNpdGlvbmluZywgTGF5b3V0LCBQb3NzaWJseUV2YWx1YXRlZCB9IGZyb20gJy4uL3Byb3BlcnRpZXMnO1xuXG5pbXBvcnQgdHlwZSB7QnVja2V0UGFyYW1ldGVyc30gZnJvbSAnLi4vLi4vZGF0YS9idWNrZXQnO1xuaW1wb3J0IHR5cGUge0xheW91dFByb3BzLCBQYWludFByb3BzfSBmcm9tICcuL3N5bWJvbF9zdHlsZV9sYXllcl9wcm9wZXJ0aWVzJztcbmltcG9ydCB0eXBlIHtGZWF0dXJlfSBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL2V4cHJlc3Npb24nO1xuaW1wb3J0IHR5cGUgRXZhbHVhdGlvblBhcmFtZXRlcnMgZnJvbSAnLi4vZXZhbHVhdGlvbl9wYXJhbWV0ZXJzJztcbmltcG9ydCB0eXBlIHtMYXllclNwZWNpZmljYXRpb259IGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvdHlwZXMnO1xuXG5jbGFzcyBTeW1ib2xTdHlsZUxheWVyIGV4dGVuZHMgU3R5bGVMYXllciB7XG4gICAgX3VuZXZhbHVhdGVkTGF5b3V0OiBMYXlvdXQ8TGF5b3V0UHJvcHM+O1xuICAgIGxheW91dDogUG9zc2libHlFdmFsdWF0ZWQ8TGF5b3V0UHJvcHM+O1xuXG4gICAgX3RyYW5zaXRpb25hYmxlUGFpbnQ6IFRyYW5zaXRpb25hYmxlPFBhaW50UHJvcHM+O1xuICAgIF90cmFuc2l0aW9uaW5nUGFpbnQ6IFRyYW5zaXRpb25pbmc8UGFpbnRQcm9wcz47XG4gICAgcGFpbnQ6IFBvc3NpYmx5RXZhbHVhdGVkPFBhaW50UHJvcHM+O1xuXG4gICAgY29uc3RydWN0b3IobGF5ZXI6IExheWVyU3BlY2lmaWNhdGlvbikge1xuICAgICAgICBzdXBlcihsYXllciwgcHJvcGVydGllcyk7XG4gICAgfVxuXG4gICAgcmVjYWxjdWxhdGUocGFyYW1ldGVyczogRXZhbHVhdGlvblBhcmFtZXRlcnMpIHtcbiAgICAgICAgc3VwZXIucmVjYWxjdWxhdGUocGFyYW1ldGVycyk7XG5cbiAgICAgICAgaWYgKHRoaXMubGF5b3V0LmdldCgnaWNvbi1yb3RhdGlvbi1hbGlnbm1lbnQnKSA9PT0gJ2F1dG8nKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5sYXlvdXQuZ2V0KCdzeW1ib2wtcGxhY2VtZW50JykgIT09ICdwb2ludCcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxheW91dC5fdmFsdWVzWydpY29uLXJvdGF0aW9uLWFsaWdubWVudCddID0gJ21hcCc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMubGF5b3V0Ll92YWx1ZXNbJ2ljb24tcm90YXRpb24tYWxpZ25tZW50J10gPSAndmlld3BvcnQnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMubGF5b3V0LmdldCgndGV4dC1yb3RhdGlvbi1hbGlnbm1lbnQnKSA9PT0gJ2F1dG8nKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5sYXlvdXQuZ2V0KCdzeW1ib2wtcGxhY2VtZW50JykgIT09ICdwb2ludCcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxheW91dC5fdmFsdWVzWyd0ZXh0LXJvdGF0aW9uLWFsaWdubWVudCddID0gJ21hcCc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMubGF5b3V0Ll92YWx1ZXNbJ3RleHQtcm90YXRpb24tYWxpZ25tZW50J10gPSAndmlld3BvcnQnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgdW5zcGVjaWZpZWQsIGAqLXBpdGNoLWFsaWdubWVudGAgaW5oZXJpdHMgYCotcm90YXRpb24tYWxpZ25tZW50YFxuICAgICAgICBpZiAodGhpcy5sYXlvdXQuZ2V0KCd0ZXh0LXBpdGNoLWFsaWdubWVudCcpID09PSAnYXV0bycpIHtcbiAgICAgICAgICAgIHRoaXMubGF5b3V0Ll92YWx1ZXNbJ3RleHQtcGl0Y2gtYWxpZ25tZW50J10gPSB0aGlzLmxheW91dC5nZXQoJ3RleHQtcm90YXRpb24tYWxpZ25tZW50Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubGF5b3V0LmdldCgnaWNvbi1waXRjaC1hbGlnbm1lbnQnKSA9PT0gJ2F1dG8nKSB7XG4gICAgICAgICAgICB0aGlzLmxheW91dC5fdmFsdWVzWydpY29uLXBpdGNoLWFsaWdubWVudCddID0gdGhpcy5sYXlvdXQuZ2V0KCdpY29uLXJvdGF0aW9uLWFsaWdubWVudCcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0VmFsdWVBbmRSZXNvbHZlVG9rZW5zKG5hbWU6ICosIGZlYXR1cmU6IEZlYXR1cmUpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmxheW91dC5nZXQobmFtZSkuZXZhbHVhdGUoZmVhdHVyZSwge30pO1xuICAgICAgICBjb25zdCB1bmV2YWx1YXRlZCA9IHRoaXMuX3VuZXZhbHVhdGVkTGF5b3V0Ll92YWx1ZXNbbmFtZV07XG4gICAgICAgIGlmICghdW5ldmFsdWF0ZWQuaXNEYXRhRHJpdmVuKCkgJiYgIWlzRXhwcmVzc2lvbih1bmV2YWx1YXRlZC52YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlVG9rZW5zKGZlYXR1cmUucHJvcGVydGllcywgdmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIGNyZWF0ZUJ1Y2tldChwYXJhbWV0ZXJzOiBCdWNrZXRQYXJhbWV0ZXJzPCo+KSB7XG4gICAgICAgIHJldHVybiBuZXcgU3ltYm9sQnVja2V0KHBhcmFtZXRlcnMpO1xuICAgIH1cblxuICAgIHF1ZXJ5UmFkaXVzKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIHF1ZXJ5SW50ZXJzZWN0c0ZlYXR1cmUoKTogYm9vbGVhbiB7XG4gICAgICAgIGFzc2VydChmYWxzZSk7IC8vIFNob3VsZCB0YWtlIGEgZGlmZmVyZW50IHBhdGggaW4gRmVhdHVyZUluZGV4XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFN5bWJvbFN0eWxlTGF5ZXI7XG4iLCIvLyBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkLiBFZGl0IGJ1aWxkL2dlbmVyYXRlLXN0eWxlLWNvZGUuanMsIHRoZW4gcnVuIGB5YXJuIHJ1biBjb2RlZ2VuYC5cbi8vIEBmbG93XG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xuXG5pbXBvcnQgc3R5bGVTcGVjIGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvcmVmZXJlbmNlL2xhdGVzdCc7XG5cbmltcG9ydCB7XG4gICAgUHJvcGVydGllcyxcbiAgICBEYXRhQ29uc3RhbnRQcm9wZXJ0eSxcbiAgICBEYXRhRHJpdmVuUHJvcGVydHksXG4gICAgQ3Jvc3NGYWRlZERhdGFEcml2ZW5Qcm9wZXJ0eSxcbiAgICBDcm9zc0ZhZGVkUHJvcGVydHksXG4gICAgQ29sb3JSYW1wUHJvcGVydHlcbn0gZnJvbSAnLi4vcHJvcGVydGllcyc7XG5cbmltcG9ydCB0eXBlIENvbG9yIGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvdXRpbC9jb2xvcic7XG5cbmltcG9ydCB0eXBlIEZvcm1hdHRlZCBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL2V4cHJlc3Npb24vdHlwZXMvZm9ybWF0dGVkJztcblxuXG5leHBvcnQgdHlwZSBQYWludFByb3BzID0ge3xcbiAgICBcImJhY2tncm91bmQtY29sb3JcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8Q29sb3I+LFxuICAgIFwiYmFja2dyb3VuZC1wYXR0ZXJuXCI6IENyb3NzRmFkZWRQcm9wZXJ0eTxzdHJpbmc+LFxuICAgIFwiYmFja2dyb3VuZC1vcGFjaXR5XCI6IERhdGFDb25zdGFudFByb3BlcnR5PG51bWJlcj4sXG58fTtcblxuY29uc3QgcGFpbnQ6IFByb3BlcnRpZXM8UGFpbnRQcm9wcz4gPSBuZXcgUHJvcGVydGllcyh7XG4gICAgXCJiYWNrZ3JvdW5kLWNvbG9yXCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9iYWNrZ3JvdW5kXCJdW1wiYmFja2dyb3VuZC1jb2xvclwiXSksXG4gICAgXCJiYWNrZ3JvdW5kLXBhdHRlcm5cIjogbmV3IENyb3NzRmFkZWRQcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9iYWNrZ3JvdW5kXCJdW1wiYmFja2dyb3VuZC1wYXR0ZXJuXCJdKSxcbiAgICBcImJhY2tncm91bmQtb3BhY2l0eVwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfYmFja2dyb3VuZFwiXVtcImJhY2tncm91bmQtb3BhY2l0eVwiXSksXG59KTtcblxuLy8gTm90ZTogd2l0aG91dCBhZGRpbmcgdGhlIGV4cGxpY2l0IHR5cGUgYW5ub3RhdGlvbiwgRmxvdyBpbmZlcnMgd2Vha2VyIHR5cGVzXG4vLyBmb3IgdGhlc2Ugb2JqZWN0cyBmcm9tIHRoZWlyIHVzZSBpbiB0aGUgY29uc3RydWN0b3IgdG8gU3R5bGVMYXllciwgYXNcbi8vIHtsYXlvdXQ/OiBQcm9wZXJ0aWVzPC4uLj4sIHBhaW50OiBQcm9wZXJ0aWVzPC4uLj59XG5leHBvcnQgZGVmYXVsdCAoeyBwYWludCB9OiAkRXhhY3Q8e1xuICBwYWludDogUHJvcGVydGllczxQYWludFByb3BzPlxufT4pO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IFN0eWxlTGF5ZXIgZnJvbSAnLi4vc3R5bGVfbGF5ZXInO1xuXG5pbXBvcnQgcHJvcGVydGllcyBmcm9tICcuL2JhY2tncm91bmRfc3R5bGVfbGF5ZXJfcHJvcGVydGllcyc7XG5pbXBvcnQgeyBUcmFuc2l0aW9uYWJsZSwgVHJhbnNpdGlvbmluZywgUG9zc2libHlFdmFsdWF0ZWQgfSBmcm9tICcuLi9wcm9wZXJ0aWVzJztcblxuaW1wb3J0IHR5cGUge1BhaW50UHJvcHN9IGZyb20gJy4vYmFja2dyb3VuZF9zdHlsZV9sYXllcl9wcm9wZXJ0aWVzJztcbmltcG9ydCB0eXBlIHtMYXllclNwZWNpZmljYXRpb259IGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvdHlwZXMnO1xuXG5jbGFzcyBCYWNrZ3JvdW5kU3R5bGVMYXllciBleHRlbmRzIFN0eWxlTGF5ZXIge1xuICAgIF90cmFuc2l0aW9uYWJsZVBhaW50OiBUcmFuc2l0aW9uYWJsZTxQYWludFByb3BzPjtcbiAgICBfdHJhbnNpdGlvbmluZ1BhaW50OiBUcmFuc2l0aW9uaW5nPFBhaW50UHJvcHM+O1xuICAgIHBhaW50OiBQb3NzaWJseUV2YWx1YXRlZDxQYWludFByb3BzPjtcblxuICAgIGNvbnN0cnVjdG9yKGxheWVyOiBMYXllclNwZWNpZmljYXRpb24pIHtcbiAgICAgICAgc3VwZXIobGF5ZXIsIHByb3BlcnRpZXMpO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQmFja2dyb3VuZFN0eWxlTGF5ZXI7XG4iLCIvLyBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkLiBFZGl0IGJ1aWxkL2dlbmVyYXRlLXN0eWxlLWNvZGUuanMsIHRoZW4gcnVuIGB5YXJuIHJ1biBjb2RlZ2VuYC5cbi8vIEBmbG93XG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xuXG5pbXBvcnQgc3R5bGVTcGVjIGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvcmVmZXJlbmNlL2xhdGVzdCc7XG5cbmltcG9ydCB7XG4gICAgUHJvcGVydGllcyxcbiAgICBEYXRhQ29uc3RhbnRQcm9wZXJ0eSxcbiAgICBEYXRhRHJpdmVuUHJvcGVydHksXG4gICAgQ3Jvc3NGYWRlZERhdGFEcml2ZW5Qcm9wZXJ0eSxcbiAgICBDcm9zc0ZhZGVkUHJvcGVydHksXG4gICAgQ29sb3JSYW1wUHJvcGVydHlcbn0gZnJvbSAnLi4vcHJvcGVydGllcyc7XG5cbmltcG9ydCB0eXBlIENvbG9yIGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvdXRpbC9jb2xvcic7XG5cbmltcG9ydCB0eXBlIEZvcm1hdHRlZCBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL2V4cHJlc3Npb24vdHlwZXMvZm9ybWF0dGVkJztcblxuXG5leHBvcnQgdHlwZSBQYWludFByb3BzID0ge3xcbiAgICBcInJhc3Rlci1vcGFjaXR5XCI6IERhdGFDb25zdGFudFByb3BlcnR5PG51bWJlcj4sXG4gICAgXCJyYXN0ZXItaHVlLXJvdGF0ZVwiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxudW1iZXI+LFxuICAgIFwicmFzdGVyLWJyaWdodG5lc3MtbWluXCI6IERhdGFDb25zdGFudFByb3BlcnR5PG51bWJlcj4sXG4gICAgXCJyYXN0ZXItYnJpZ2h0bmVzcy1tYXhcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8bnVtYmVyPixcbiAgICBcInJhc3Rlci1zYXR1cmF0aW9uXCI6IERhdGFDb25zdGFudFByb3BlcnR5PG51bWJlcj4sXG4gICAgXCJyYXN0ZXItY29udHJhc3RcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8bnVtYmVyPixcbiAgICBcInJhc3Rlci1yZXNhbXBsaW5nXCI6IERhdGFDb25zdGFudFByb3BlcnR5PFwibGluZWFyXCIgfCBcIm5lYXJlc3RcIj4sXG4gICAgXCJyYXN0ZXItZmFkZS1kdXJhdGlvblwiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxudW1iZXI+LFxufH07XG5cbmNvbnN0IHBhaW50OiBQcm9wZXJ0aWVzPFBhaW50UHJvcHM+ID0gbmV3IFByb3BlcnRpZXMoe1xuICAgIFwicmFzdGVyLW9wYWNpdHlcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X3Jhc3RlclwiXVtcInJhc3Rlci1vcGFjaXR5XCJdKSxcbiAgICBcInJhc3Rlci1odWUtcm90YXRlXCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9yYXN0ZXJcIl1bXCJyYXN0ZXItaHVlLXJvdGF0ZVwiXSksXG4gICAgXCJyYXN0ZXItYnJpZ2h0bmVzcy1taW5cIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X3Jhc3RlclwiXVtcInJhc3Rlci1icmlnaHRuZXNzLW1pblwiXSksXG4gICAgXCJyYXN0ZXItYnJpZ2h0bmVzcy1tYXhcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X3Jhc3RlclwiXVtcInJhc3Rlci1icmlnaHRuZXNzLW1heFwiXSksXG4gICAgXCJyYXN0ZXItc2F0dXJhdGlvblwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfcmFzdGVyXCJdW1wicmFzdGVyLXNhdHVyYXRpb25cIl0pLFxuICAgIFwicmFzdGVyLWNvbnRyYXN0XCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9yYXN0ZXJcIl1bXCJyYXN0ZXItY29udHJhc3RcIl0pLFxuICAgIFwicmFzdGVyLXJlc2FtcGxpbmdcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X3Jhc3RlclwiXVtcInJhc3Rlci1yZXNhbXBsaW5nXCJdKSxcbiAgICBcInJhc3Rlci1mYWRlLWR1cmF0aW9uXCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9yYXN0ZXJcIl1bXCJyYXN0ZXItZmFkZS1kdXJhdGlvblwiXSksXG59KTtcblxuLy8gTm90ZTogd2l0aG91dCBhZGRpbmcgdGhlIGV4cGxpY2l0IHR5cGUgYW5ub3RhdGlvbiwgRmxvdyBpbmZlcnMgd2Vha2VyIHR5cGVzXG4vLyBmb3IgdGhlc2Ugb2JqZWN0cyBmcm9tIHRoZWlyIHVzZSBpbiB0aGUgY29uc3RydWN0b3IgdG8gU3R5bGVMYXllciwgYXNcbi8vIHtsYXlvdXQ/OiBQcm9wZXJ0aWVzPC4uLj4sIHBhaW50OiBQcm9wZXJ0aWVzPC4uLj59XG5leHBvcnQgZGVmYXVsdCAoeyBwYWludCB9OiAkRXhhY3Q8e1xuICBwYWludDogUHJvcGVydGllczxQYWludFByb3BzPlxufT4pO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IFN0eWxlTGF5ZXIgZnJvbSAnLi4vc3R5bGVfbGF5ZXInO1xuXG5pbXBvcnQgcHJvcGVydGllcyBmcm9tICcuL3Jhc3Rlcl9zdHlsZV9sYXllcl9wcm9wZXJ0aWVzJztcbmltcG9ydCB7IFRyYW5zaXRpb25hYmxlLCBUcmFuc2l0aW9uaW5nLCBQb3NzaWJseUV2YWx1YXRlZCB9IGZyb20gJy4uL3Byb3BlcnRpZXMnO1xuXG5pbXBvcnQgdHlwZSB7UGFpbnRQcm9wc30gZnJvbSAnLi9yYXN0ZXJfc3R5bGVfbGF5ZXJfcHJvcGVydGllcyc7XG5pbXBvcnQgdHlwZSB7TGF5ZXJTcGVjaWZpY2F0aW9ufSBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL3R5cGVzJztcblxuY2xhc3MgUmFzdGVyU3R5bGVMYXllciBleHRlbmRzIFN0eWxlTGF5ZXIge1xuICAgIF90cmFuc2l0aW9uYWJsZVBhaW50OiBUcmFuc2l0aW9uYWJsZTxQYWludFByb3BzPjtcbiAgICBfdHJhbnNpdGlvbmluZ1BhaW50OiBUcmFuc2l0aW9uaW5nPFBhaW50UHJvcHM+O1xuICAgIHBhaW50OiBQb3NzaWJseUV2YWx1YXRlZDxQYWludFByb3BzPjtcblxuICAgIGNvbnN0cnVjdG9yKGxheWVyOiBMYXllclNwZWNpZmljYXRpb24pIHtcbiAgICAgICAgc3VwZXIobGF5ZXIsIHByb3BlcnRpZXMpO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgUmFzdGVyU3R5bGVMYXllcjtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCBTdHlsZUxheWVyIGZyb20gJy4uL3N0eWxlX2xheWVyJztcbmltcG9ydCB0eXBlIE1hcCBmcm9tICcuLi8uLi91aS9tYXAnO1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5cbnR5cGUgQ3VzdG9tUmVuZGVyTWV0aG9kID0gKGdsOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQsIG1hdHJpeDogQXJyYXk8bnVtYmVyPikgPT4gdm9pZDtcblxuLyoqXG4gKiBJbnRlcmZhY2UgZm9yIGN1c3RvbSBzdHlsZSBsYXllcnMuIFRoaXMgaXMgYSBzcGVjaWZpY2F0aW9uIGZvclxuICogaW1wbGVtZW50ZXJzIHRvIG1vZGVsOiBpdCBpcyBub3QgYW4gZXhwb3J0ZWQgbWV0aG9kIG9yIGNsYXNzLlxuICpcbiAqIEN1c3RvbSBsYXllcnMgYWxsb3cgYSB1c2VyIHRvIHJlbmRlciBkaXJlY3RseSBpbnRvIHRoZSBtYXAncyBHTCBjb250ZXh0IHVzaW5nIHRoZSBtYXAncyBjYW1lcmEuXG4gKiBUaGVzZSBsYXllcnMgY2FuIGJlIGFkZGVkIGJldHdlZW4gYW55IHJlZ3VsYXIgbGF5ZXJzIHVzaW5nIHtAbGluayBNYXAjYWRkTGF5ZXJ9LlxuICpcbiAqIEN1c3RvbSBsYXllcnMgbXVzdCBoYXZlIGEgdW5pcXVlIGBpZGAgYW5kIG11c3QgaGF2ZSB0aGUgYHR5cGVgIG9mIGBcImN1c3RvbVwiYC5cbiAqIFRoZXkgbXVzdCBpbXBsZW1lbnQgYHJlbmRlcmAgYW5kIG1heSBpbXBsZW1lbnQgYHByZXJlbmRlcmAsIGBvbkFkZGAgYW5kIGBvblJlbW92ZWAuXG4gKiBUaGV5IGNhbiB0cmlnZ2VyIHJlbmRlcmluZyB1c2luZyB7QGxpbmsgTWFwI3RyaWdnZXJSZXBhaW50fVxuICogYW5kIHRoZXkgc2hvdWxkIGFwcHJvcHJpYXRlbHkgaGFuZGxlIHtAbGluayBNYXAuZXZlbnQ6d2ViZ2xjb250ZXh0bG9zdH0gYW5kXG4gKiB7QGxpbmsgTWFwLmV2ZW50OndlYmdsY29udGV4dHJlc3RvcmVkfS5cbiAqXG4gKiBUaGUgYHJlbmRlcmluZ01vZGVgIHByb3BlcnR5IGNvbnRyb2xzIHdoZXRoZXIgdGhlIGxheWVyIGlzIHRyZWF0ZWQgYXMgYSBgXCIyZFwiYCBvciBgXCIzZFwiYCBtYXAgbGF5ZXIuIFVzZTpcbiAqIC0gYFwicmVuZGVyaW5nTW9kZVwiOiBcIjNkXCJgIHRvIHVzZSB0aGUgZGVwdGggYnVmZmVyIGFuZCBzaGFyZSBpdCB3aXRoIG90aGVyIGxheWVyc1xuICogLSBgXCJyZW5kZXJpbmdNb2RlXCI6IFwiMmRcImAgdG8gYWRkIGEgbGF5ZXIgd2l0aCBubyBkZXB0aC4gSWYgeW91IG5lZWQgdG8gdXNlIHRoZSBkZXB0aCBidWZmZXIgZm9yIGEgYFwiMmRcImAgbGF5ZXIgeW91IG11c3QgdXNlIGFuIG9mZnNjcmVlblxuICogICBmcmFtZWJ1ZmZlciBhbmQge0BsaW5rIEN1c3RvbUxheWVySW50ZXJmYWNlI3ByZXJlbmRlcn1cbiAqXG4gKiBAaW50ZXJmYWNlIEN1c3RvbUxheWVySW50ZXJmYWNlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaWQgQSB1bmlxdWUgbGF5ZXIgaWQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdHlwZSBUaGUgbGF5ZXIncyB0eXBlLiBNdXN0IGJlIGBcImN1c3RvbVwiYC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSByZW5kZXJpbmdNb2RlIEVpdGhlciBgXCIyZFwiYCBvciBgXCIzZFwiYC4gRGVmYXVsdHMgdG8gYFwiMmRcImAuXG4gKiBAZXhhbXBsZVxuICogLy8gQ3VzdG9tIGxheWVyIGltcGxlbWVudGVkIGFzIEVTNiBjbGFzc1xuICogY2xhc3MgTnVsbElzbGFuZExheWVyIHtcbiAqICAgICBjb25zdHJ1Y3RvcigpIHtcbiAqICAgICAgICAgdGhpcy5pZCA9ICdudWxsLWlzbGFuZCc7XG4gKiAgICAgICAgIHRoaXMudHlwZSA9ICdjdXN0b20nO1xuICogICAgICAgICB0aGlzLnJlbmRlcmluZ01vZGUgPSAnMmQnO1xuICogICAgIH1cbiAqXG4gKiAgICAgb25BZGQobWFwLCBnbCkge1xuICogICAgICAgICBjb25zdCB2ZXJ0ZXhTb3VyY2UgPSBgXG4gKiAgICAgICAgIHVuaWZvcm0gbWF0NCB1X21hdHJpeDtcbiAqICAgICAgICAgdm9pZCBtYWluKCkge1xuICogICAgICAgICAgICAgZ2xfUG9zaXRpb24gPSB1X21hdHJpeCAqIHZlYzQoMC41LCAwLjUsIDAuMCwgMS4wKTtcbiAqICAgICAgICAgICAgIGdsX1BvaW50U2l6ZSA9IDIwLjA7XG4gKiAgICAgICAgIH1gO1xuICpcbiAqICAgICAgICAgY29uc3QgZnJhZ21lbnRTb3VyY2UgPSBgXG4gKiAgICAgICAgIHZvaWQgbWFpbigpIHtcbiAqICAgICAgICAgICAgIGdsX0ZyYWdDb2xvciA9IHZlYzQoMS4wLCAwLjAsIDAuMCwgMS4wKTtcbiAqICAgICAgICAgfWA7XG4gKlxuICogICAgICAgICBjb25zdCB2ZXJ0ZXhTaGFkZXIgPSBnbC5jcmVhdGVTaGFkZXIoZ2wuVkVSVEVYX1NIQURFUik7XG4gKiAgICAgICAgIGdsLnNoYWRlclNvdXJjZSh2ZXJ0ZXhTaGFkZXIsIHZlcnRleFNvdXJjZSk7XG4gKiAgICAgICAgIGdsLmNvbXBpbGVTaGFkZXIodmVydGV4U2hhZGVyKTtcbiAqICAgICAgICAgY29uc3QgZnJhZ21lbnRTaGFkZXIgPSBnbC5jcmVhdGVTaGFkZXIoZ2wuRlJBR01FTlRfU0hBREVSKTtcbiAqICAgICAgICAgZ2wuc2hhZGVyU291cmNlKGZyYWdtZW50U2hhZGVyLCBmcmFnbWVudFNvdXJjZSk7XG4gKiAgICAgICAgIGdsLmNvbXBpbGVTaGFkZXIoZnJhZ21lbnRTaGFkZXIpO1xuICpcbiAqICAgICAgICAgdGhpcy5wcm9ncmFtID0gZ2wuY3JlYXRlUHJvZ3JhbSgpO1xuICogICAgICAgICBnbC5hdHRhY2hTaGFkZXIodGhpcy5wcm9ncmFtLCB2ZXJ0ZXhTaGFkZXIpO1xuICogICAgICAgICBnbC5hdHRhY2hTaGFkZXIodGhpcy5wcm9ncmFtLCBmcmFnbWVudFNoYWRlcik7XG4gKiAgICAgICAgIGdsLmxpbmtQcm9ncmFtKHRoaXMucHJvZ3JhbSk7XG4gKiAgICAgfVxuICpcbiAqICAgICByZW5kZXIoZ2wsIG1hdHJpeCkge1xuICogICAgICAgICBnbC51c2VQcm9ncmFtKHRoaXMucHJvZ3JhbSk7XG4gKiAgICAgICAgIGdsLnVuaWZvcm1NYXRyaXg0ZnYoZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHRoaXMucHJvZ3JhbSwgXCJ1X21hdHJpeFwiKSwgZmFsc2UsIG1hdHJpeCk7XG4gKiAgICAgICAgIGdsLmRyYXdBcnJheXMoZ2wuUE9JTlRTLCAwLCAxKTtcbiAqICAgICB9XG4gKiB9XG4gKlxuICogbWFwLm9uKCdsb2FkJywgZnVuY3Rpb24oKSB7XG4gKiAgICAgbWFwLmFkZExheWVyKG5ldyBOdWxsSXNsYW5kTGF5ZXIoKSk7XG4gKiB9KTtcbiAqL1xuXG4vKipcbiAqIE9wdGlvbmFsIG1ldGhvZCBjYWxsZWQgd2hlbiB0aGUgbGF5ZXIgaGFzIGJlZW4gYWRkZWQgdG8gdGhlIE1hcCB3aXRoIHtAbGluayBNYXAjYWRkTGF5ZXJ9LiBUaGlzXG4gKiBnaXZlcyB0aGUgbGF5ZXIgYSBjaGFuY2UgdG8gaW5pdGlhbGl6ZSBnbCByZXNvdXJjZXMgYW5kIHJlZ2lzdGVyIGV2ZW50IGxpc3RlbmVycy5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBtZW1iZXJvZiBDdXN0b21MYXllckludGVyZmFjZVxuICogQGluc3RhbmNlXG4gKiBAbmFtZSBvbkFkZFxuICogQHBhcmFtIHtNYXB9IG1hcCBUaGUgTWFwIHRoaXMgY3VzdG9tIGxheWVyIHdhcyBqdXN0IGFkZGVkIHRvLlxuICogQHBhcmFtIHtXZWJHTFJlbmRlcmluZ0NvbnRleHR9IGdsIFRoZSBnbCBjb250ZXh0IGZvciB0aGUgbWFwLlxuICovXG5cbi8qKlxuICogT3B0aW9uYWwgbWV0aG9kIGNhbGxlZCB3aGVuIHRoZSBsYXllciBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIE1hcCB3aXRoIHtAbGluayBNYXAjcmVtb3ZlTGF5ZXJ9LiBUaGlzXG4gKiBnaXZlcyB0aGUgbGF5ZXIgYSBjaGFuY2UgdG8gY2xlYW4gdXAgZ2wgcmVzb3VyY2VzIGFuZCBldmVudCBsaXN0ZW5lcnMuXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAbWVtYmVyb2YgQ3VzdG9tTGF5ZXJJbnRlcmZhY2VcbiAqIEBpbnN0YW5jZVxuICogQG5hbWUgb25SZW1vdmVcbiAqIEBwYXJhbSB7TWFwfSBtYXAgVGhlIE1hcCB0aGlzIGN1c3RvbSBsYXllciB3YXMganVzdCBhZGRlZCB0by5cbiAqL1xuXG4vKipcbiAqIE9wdGlvbmFsIG1ldGhvZCBjYWxsZWQgZHVyaW5nIGEgcmVuZGVyIGZyYW1lIHRvIGFsbG93IGEgbGF5ZXIgdG8gcHJlcGFyZSByZXNvdXJjZXMgb3IgcmVuZGVyIGludG8gYSB0ZXh0dXJlLlxuICpcbiAqIFRoZSBsYXllciBjYW5ub3QgbWFrZSBhbnkgYXNzdW1wdGlvbnMgYWJvdXQgdGhlIGN1cnJlbnQgR0wgc3RhdGUgYW5kIG11c3QgYmluZCBhIGZyYW1lYnVmZmVyIGJlZm9yZSByZW5kZXJpbmcuXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAbWVtYmVyb2YgQ3VzdG9tTGF5ZXJJbnRlcmZhY2VcbiAqIEBpbnN0YW5jZVxuICogQG5hbWUgcHJlcmVuZGVyXG4gKiBAcGFyYW0ge1dlYkdMUmVuZGVyaW5nQ29udGV4dH0gZ2wgVGhlIG1hcCdzIGdsIGNvbnRleHQuXG4gKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IG1hdHJpeCBUaGUgbWFwJ3MgY2FtZXJhIG1hdHJpeC4gSXQgcHJvamVjdHMgc3BoZXJpY2FsIG1lcmNhdG9yXG4gKiBjb29yZGluYXRlcyB0byBnbCBjb29yZGluYXRlcy4gVGhlIG1lcmNhdG9yIGNvb3JkaW5hdGUgYFswLCAwXWAgcmVwcmVzZW50cyB0aGVcbiAqIHRvcCBsZWZ0IGNvcm5lciBvZiB0aGUgbWVyY2F0b3Igd29ybGQgYW5kIGBbMSwgMV1gIHJlcHJlc2VudHMgdGhlIGJvdHRvbSByaWdodCBjb3JuZXIuIFdoZW5cbiAqIHRoZSBgcmVuZGVyaW5nTW9kZWAgaXMgYFwiM2RcImAsIHRoZSB6IGNvb3JkaW5hdGUgaXMgY29uZm9ybWFsLiBBIGJveCB3aXRoIGlkZW50aWNhbCB4LCB5LCBhbmQgelxuICogbGVuZ3RocyBpbiBtZXJjYXRvciB1bml0cyB3b3VsZCBiZSByZW5kZXJlZCBhcyBhIGN1YmUuIHtAbGluayBNZXJjYXRvckNvb3JkaW5hdGV9LmZyb21MYXRMbmdcbiAqIGNhbiBiZSB1c2VkIHRvIHByb2plY3QgYSBgTG5nTGF0YCB0byBhIG1lcmNhdG9yIGNvb3JkaW5hdGUuXG4gKi9cblxuLyoqXG4gKiBDYWxsZWQgZHVyaW5nIGEgcmVuZGVyIGZyYW1lIGFsbG93aW5nIHRoZSBsYXllciB0byBkcmF3IGludG8gdGhlIEdMIGNvbnRleHQuXG4gKlxuICogVGhlIGxheWVyIGNhbiBhc3N1bWUgYmxlbmRpbmcgYW5kIGRlcHRoIHN0YXRlIGlzIHNldCB0byBhbGxvdyB0aGUgbGF5ZXIgdG8gcHJvcGVybHlcbiAqIGJsZW5kIGFuZCBjbGlwIG90aGVyIGxheWVycy4gVGhlIGxheWVyIGNhbm5vdCBtYWtlIGFueSBvdGhlciBhc3N1bXB0aW9ucyBhYm91dCB0aGVcbiAqIGN1cnJlbnQgR0wgc3RhdGUuXG4gKlxuICogSWYgdGhlIGxheWVyIG5lZWRzIHRvIHJlbmRlciB0byBhIHRleHR1cmUsIGl0IHNob3VsZCBpbXBsZW1lbnQgdGhlIGBwcmVyZW5kZXJgIG1ldGhvZFxuICogdG8gZG8gdGhpcyBhbmQgb25seSB1c2UgdGhlIGByZW5kZXJgIG1ldGhvZCBmb3IgZHJhd2luZyBkaXJlY3RseSBpbnRvIHRoZSBtYWluIGZyYW1lYnVmZmVyLlxuICpcbiAqIFRoZSBibGVuZCBmdW5jdGlvbiBpcyBzZXQgdG8gYGdsLmJsZW5kRnVuYyhnbC5PTkUsIGdsLk9ORV9NSU5VU19TUkNfQUxQSEEpYC4gVGhpcyBleHBlY3RzXG4gKiBjb2xvcnMgdG8gYmUgcHJvdmlkZWQgaW4gcHJlbXVsdGlwbGllZCBhbHBoYSBmb3JtIHdoZXJlIHRoZSBgcmAsIGBnYCBhbmQgYGJgIHZhbHVlcyBhcmUgYWxyZWFkeVxuICogbXVsdGlwbGllZCBieSB0aGUgYGFgIHZhbHVlLiBJZiB5b3UgYXJlIHVuYWJsZSB0byBwcm92aWRlIGNvbG9ycyBpbiBwcmVtdWx0aXBsaWVkIGZvcm0geW91XG4gKiBtYXkgd2FudCB0byBjaGFuZ2UgdGhlIGJsZW5kIGZ1bmN0aW9uIHRvXG4gKiBgZ2wuYmxlbmRGdW5jU2VwYXJhdGUoZ2wuU1JDX0FMUEhBLCBnbC5PTkVfTUlOVVNfU1JDX0FMUEhBLCBnbC5PTkUsIGdsLk9ORV9NSU5VU19TUkNfQUxQSEEpYC5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBtZW1iZXJvZiBDdXN0b21MYXllckludGVyZmFjZVxuICogQGluc3RhbmNlXG4gKiBAbmFtZSByZW5kZXJcbiAqIEBwYXJhbSB7V2ViR0xSZW5kZXJpbmdDb250ZXh0fSBnbCBUaGUgbWFwJ3MgZ2wgY29udGV4dC5cbiAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gbWF0cml4IFRoZSBtYXAncyBjYW1lcmEgbWF0cml4LiBJdCBwcm9qZWN0cyBzcGhlcmljYWwgbWVyY2F0b3JcbiAqIGNvb3JkaW5hdGVzIHRvIGdsIGNvb3JkaW5hdGVzLiBUaGUgc3BoZXJpY2FsIG1lcmNhdG9yIGNvb3JkaW5hdGUgYFswLCAwXWAgcmVwcmVzZW50cyB0aGVcbiAqIHRvcCBsZWZ0IGNvcm5lciBvZiB0aGUgbWVyY2F0b3Igd29ybGQgYW5kIGBbMSwgMV1gIHJlcHJlc2VudHMgdGhlIGJvdHRvbSByaWdodCBjb3JuZXIuIFdoZW5cbiAqIHRoZSBgcmVuZGVyaW5nTW9kZWAgaXMgYFwiM2RcImAsIHRoZSB6IGNvb3JkaW5hdGUgaXMgY29uZm9ybWFsLiBBIGJveCB3aXRoIGlkZW50aWNhbCB4LCB5LCBhbmQgelxuICogbGVuZ3RocyBpbiBtZXJjYXRvciB1bml0cyB3b3VsZCBiZSByZW5kZXJlZCBhcyBhIGN1YmUuIHtAbGluayBNZXJjYXRvckNvb3JkaW5hdGV9LmZyb21MYXRMbmdcbiAqIGNhbiBiZSB1c2VkIHRvIHByb2plY3QgYSBgTG5nTGF0YCB0byBhIG1lcmNhdG9yIGNvb3JkaW5hdGUuXG4gKi9cbmV4cG9ydCB0eXBlIEN1c3RvbUxheWVySW50ZXJmYWNlID0ge1xuICAgIGlkOiBzdHJpbmcsXG4gICAgdHlwZTogXCJjdXN0b21cIixcbiAgICByZW5kZXJpbmdNb2RlOiBcIjJkXCIgfCBcIjNkXCIsXG4gICAgcmVuZGVyOiBDdXN0b21SZW5kZXJNZXRob2QsXG4gICAgcHJlcmVuZGVyOiA/Q3VzdG9tUmVuZGVyTWV0aG9kLFxuICAgIG9uQWRkOiA/KG1hcDogTWFwLCBnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0KSA9PiB2b2lkLFxuICAgIG9uUmVtb3ZlOiA/KG1hcDogTWFwKSA9PiB2b2lkXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUN1c3RvbVN0eWxlTGF5ZXIobGF5ZXJPYmplY3Q6IEN1c3RvbUxheWVySW50ZXJmYWNlKSB7XG4gICAgY29uc3QgZXJyb3JzID0gW107XG4gICAgY29uc3QgaWQgPSBsYXllck9iamVjdC5pZDtcblxuICAgIGlmIChpZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKHtcbiAgICAgICAgICAgIG1lc3NhZ2U6IGBsYXllcnMuJHtpZH06IG1pc3NpbmcgcmVxdWlyZWQgcHJvcGVydHkgXCJpZFwiYFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAobGF5ZXJPYmplY3QucmVuZGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goe1xuICAgICAgICAgICAgbWVzc2FnZTogYGxheWVycy4ke2lkfTogbWlzc2luZyByZXF1aXJlZCBtZXRob2QgXCJyZW5kZXJcImBcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGxheWVyT2JqZWN0LnJlbmRlcmluZ01vZGUgJiZcbiAgICAgICAgbGF5ZXJPYmplY3QucmVuZGVyaW5nTW9kZSAhPT0gJzJkJyAmJlxuICAgICAgICBsYXllck9iamVjdC5yZW5kZXJpbmdNb2RlICE9PSAnM2QnKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKHtcbiAgICAgICAgICAgIG1lc3NhZ2U6IGBsYXllcnMuJHtpZH06IHByb3BlcnR5IFwicmVuZGVyaW5nTW9kZVwiIG11c3QgYmUgZWl0aGVyIFwiMmRcIiBvciBcIjNkXCJgXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBlcnJvcnM7XG59XG5cbmNsYXNzIEN1c3RvbVN0eWxlTGF5ZXIgZXh0ZW5kcyBTdHlsZUxheWVyIHtcblxuICAgIGltcGxlbWVudGF0aW9uOiBDdXN0b21MYXllckludGVyZmFjZTtcblxuICAgIGNvbnN0cnVjdG9yKGltcGxlbWVudGF0aW9uOiBDdXN0b21MYXllckludGVyZmFjZSkge1xuICAgICAgICBzdXBlcihpbXBsZW1lbnRhdGlvbiwge30pO1xuICAgICAgICB0aGlzLmltcGxlbWVudGF0aW9uID0gaW1wbGVtZW50YXRpb247XG4gICAgfVxuXG4gICAgaXMzRCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW1wbGVtZW50YXRpb24ucmVuZGVyaW5nTW9kZSA9PT0gJzNkJztcbiAgICB9XG5cbiAgICBoYXNPZmZzY3JlZW5QYXNzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pbXBsZW1lbnRhdGlvbi5wcmVyZW5kZXIgIT09IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICByZWNhbGN1bGF0ZSgpIHt9XG4gICAgdXBkYXRlVHJhbnNpdGlvbnMoKSB7fVxuICAgIGhhc1RyYW5zaXRpb24oKSB7fVxuXG4gICAgc2VyaWFsaXplKCkge1xuICAgICAgICBhc3NlcnQoZmFsc2UsIFwiQ3VzdG9tIGxheWVycyBjYW5ub3QgYmUgc2VyaWFsaXplZFwiKTtcbiAgICB9XG5cbiAgICBvbkFkZChtYXA6IE1hcCkge1xuICAgICAgICBpZiAodGhpcy5pbXBsZW1lbnRhdGlvbi5vbkFkZCkge1xuICAgICAgICAgICAgdGhpcy5pbXBsZW1lbnRhdGlvbi5vbkFkZChtYXAsIG1hcC5wYWludGVyLmNvbnRleHQuZ2wpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25SZW1vdmUobWFwOiBNYXApIHtcbiAgICAgICAgaWYgKHRoaXMuaW1wbGVtZW50YXRpb24ub25SZW1vdmUpIHtcbiAgICAgICAgICAgIHRoaXMuaW1wbGVtZW50YXRpb24ub25SZW1vdmUobWFwKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQ3VzdG9tU3R5bGVMYXllcjtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCBjaXJjbGUgZnJvbSAnLi9zdHlsZV9sYXllci9jaXJjbGVfc3R5bGVfbGF5ZXInO1xuaW1wb3J0IGhlYXRtYXAgZnJvbSAnLi9zdHlsZV9sYXllci9oZWF0bWFwX3N0eWxlX2xheWVyJztcbmltcG9ydCBoaWxsc2hhZGUgZnJvbSAnLi9zdHlsZV9sYXllci9oaWxsc2hhZGVfc3R5bGVfbGF5ZXInO1xuaW1wb3J0IGZpbGwgZnJvbSAnLi9zdHlsZV9sYXllci9maWxsX3N0eWxlX2xheWVyJztcbmltcG9ydCBmaWxsRXh0cnVzaW9uIGZyb20gJy4vc3R5bGVfbGF5ZXIvZmlsbF9leHRydXNpb25fc3R5bGVfbGF5ZXInO1xuaW1wb3J0IGxpbmUgZnJvbSAnLi9zdHlsZV9sYXllci9saW5lX3N0eWxlX2xheWVyJztcbmltcG9ydCBzeW1ib2wgZnJvbSAnLi9zdHlsZV9sYXllci9zeW1ib2xfc3R5bGVfbGF5ZXInO1xuaW1wb3J0IGJhY2tncm91bmQgZnJvbSAnLi9zdHlsZV9sYXllci9iYWNrZ3JvdW5kX3N0eWxlX2xheWVyJztcbmltcG9ydCByYXN0ZXIgZnJvbSAnLi9zdHlsZV9sYXllci9yYXN0ZXJfc3R5bGVfbGF5ZXInO1xuaW1wb3J0IEN1c3RvbVN0eWxlTGF5ZXIgZnJvbSAnLi9zdHlsZV9sYXllci9jdXN0b21fc3R5bGVfbGF5ZXInO1xuaW1wb3J0IHR5cGUge0N1c3RvbUxheWVySW50ZXJmYWNlfSBmcm9tICcuL3N0eWxlX2xheWVyL2N1c3RvbV9zdHlsZV9sYXllcic7XG5cbmltcG9ydCB0eXBlIHtMYXllclNwZWNpZmljYXRpb259IGZyb20gJy4uL3N0eWxlLXNwZWMvdHlwZXMnO1xuXG5jb25zdCBzdWJjbGFzc2VzID0ge1xuICAgIGNpcmNsZSxcbiAgICBoZWF0bWFwLFxuICAgIGhpbGxzaGFkZSxcbiAgICBmaWxsLFxuICAgICdmaWxsLWV4dHJ1c2lvbic6IGZpbGxFeHRydXNpb24sXG4gICAgbGluZSxcbiAgICBzeW1ib2wsXG4gICAgYmFja2dyb3VuZCxcbiAgICByYXN0ZXJcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNyZWF0ZVN0eWxlTGF5ZXIobGF5ZXI6IExheWVyU3BlY2lmaWNhdGlvbiB8IEN1c3RvbUxheWVySW50ZXJmYWNlKSB7XG4gICAgaWYgKGxheWVyLnR5cGUgPT09ICdjdXN0b20nKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ3VzdG9tU3R5bGVMYXllcihsYXllcik7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG5ldyBzdWJjbGFzc2VzW2xheWVyLnR5cGVdKGxheWVyKTtcbiAgICB9XG59XG5cbiIsIlxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcG90cGFjayhib3hlcykge1xuXG4gICAgLy8gY2FsY3VsYXRlIHRvdGFsIGJveCBhcmVhIGFuZCBtYXhpbXVtIGJveCB3aWR0aFxuICAgIGxldCBhcmVhID0gMDtcbiAgICBsZXQgbWF4V2lkdGggPSAwO1xuXG4gICAgZm9yIChjb25zdCBib3ggb2YgYm94ZXMpIHtcbiAgICAgICAgYXJlYSArPSBib3gudyAqIGJveC5oO1xuICAgICAgICBtYXhXaWR0aCA9IE1hdGgubWF4KG1heFdpZHRoLCBib3gudyk7XG4gICAgfVxuXG4gICAgLy8gc29ydCB0aGUgYm94ZXMgZm9yIGluc2VydGlvbiBieSBoZWlnaHQsIGRlc2NlbmRpbmdcbiAgICBib3hlcy5zb3J0KChhLCBiKSA9PiBiLmggLSBhLmgpO1xuXG4gICAgLy8gYWltIGZvciBhIHNxdWFyaXNoIHJlc3VsdGluZyBjb250YWluZXIsXG4gICAgLy8gc2xpZ2h0bHkgYWRqdXN0ZWQgZm9yIHN1Yi0xMDAlIHNwYWNlIHV0aWxpemF0aW9uXG4gICAgY29uc3Qgc3RhcnRXaWR0aCA9IE1hdGgubWF4KE1hdGguY2VpbChNYXRoLnNxcnQoYXJlYSAvIDAuOTUpKSwgbWF4V2lkdGgpO1xuXG4gICAgLy8gc3RhcnQgd2l0aCBhIHNpbmdsZSBlbXB0eSBzcGFjZSwgdW5ib3VuZGVkIGF0IHRoZSBib3R0b21cbiAgICBjb25zdCBzcGFjZXMgPSBbe3g6IDAsIHk6IDAsIHc6IHN0YXJ0V2lkdGgsIGg6IEluZmluaXR5fV07XG5cbiAgICBsZXQgd2lkdGggPSAwO1xuICAgIGxldCBoZWlnaHQgPSAwO1xuXG4gICAgZm9yIChjb25zdCBib3ggb2YgYm94ZXMpIHtcbiAgICAgICAgLy8gbG9vayB0aHJvdWdoIHNwYWNlcyBiYWNrd2FyZHMgc28gdGhhdCB3ZSBjaGVjayBzbWFsbGVyIHNwYWNlcyBmaXJzdFxuICAgICAgICBmb3IgKGxldCBpID0gc3BhY2VzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICBjb25zdCBzcGFjZSA9IHNwYWNlc1tpXTtcblxuICAgICAgICAgICAgLy8gbG9vayBmb3IgZW1wdHkgc3BhY2VzIHRoYXQgY2FuIGFjY29tbW9kYXRlIHRoZSBjdXJyZW50IGJveFxuICAgICAgICAgICAgaWYgKGJveC53ID4gc3BhY2UudyB8fCBib3guaCA+IHNwYWNlLmgpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAvLyBmb3VuZCB0aGUgc3BhY2U7IGFkZCB0aGUgYm94IHRvIGl0cyB0b3AtbGVmdCBjb3JuZXJcbiAgICAgICAgICAgIC8vIHwtLS0tLS0tfC0tLS0tLS18XG4gICAgICAgICAgICAvLyB8ICBib3ggIHwgICAgICAgfFxuICAgICAgICAgICAgLy8gfF9fX19fX198ICAgICAgIHxcbiAgICAgICAgICAgIC8vIHwgICAgICAgICBzcGFjZSB8XG4gICAgICAgICAgICAvLyB8X19fX19fX19fX19fX19ffFxuICAgICAgICAgICAgYm94LnggPSBzcGFjZS54O1xuICAgICAgICAgICAgYm94LnkgPSBzcGFjZS55O1xuXG4gICAgICAgICAgICBoZWlnaHQgPSBNYXRoLm1heChoZWlnaHQsIGJveC55ICsgYm94LmgpO1xuICAgICAgICAgICAgd2lkdGggPSBNYXRoLm1heCh3aWR0aCwgYm94LnggKyBib3gudyk7XG5cbiAgICAgICAgICAgIGlmIChib3gudyA9PT0gc3BhY2UudyAmJiBib3guaCA9PT0gc3BhY2UuaCkge1xuICAgICAgICAgICAgICAgIC8vIHNwYWNlIG1hdGNoZXMgdGhlIGJveCBleGFjdGx5OyByZW1vdmUgaXRcbiAgICAgICAgICAgICAgICBjb25zdCBsYXN0ID0gc3BhY2VzLnBvcCgpO1xuICAgICAgICAgICAgICAgIGlmIChpIDwgc3BhY2VzLmxlbmd0aCkgc3BhY2VzW2ldID0gbGFzdDtcblxuICAgICAgICAgICAgfSBlbHNlIGlmIChib3guaCA9PT0gc3BhY2UuaCkge1xuICAgICAgICAgICAgICAgIC8vIHNwYWNlIG1hdGNoZXMgdGhlIGJveCBoZWlnaHQ7IHVwZGF0ZSBpdCBhY2NvcmRpbmdseVxuICAgICAgICAgICAgICAgIC8vIHwtLS0tLS0tfC0tLS0tLS0tLS0tLS0tLXxcbiAgICAgICAgICAgICAgICAvLyB8ICBib3ggIHwgdXBkYXRlZCBzcGFjZSB8XG4gICAgICAgICAgICAgICAgLy8gfF9fX19fX198X19fX19fX19fX19fX19ffFxuICAgICAgICAgICAgICAgIHNwYWNlLnggKz0gYm94Lnc7XG4gICAgICAgICAgICAgICAgc3BhY2UudyAtPSBib3gudztcblxuICAgICAgICAgICAgfSBlbHNlIGlmIChib3gudyA9PT0gc3BhY2Uudykge1xuICAgICAgICAgICAgICAgIC8vIHNwYWNlIG1hdGNoZXMgdGhlIGJveCB3aWR0aDsgdXBkYXRlIGl0IGFjY29yZGluZ2x5XG4gICAgICAgICAgICAgICAgLy8gfC0tLS0tLS0tLS0tLS0tLXxcbiAgICAgICAgICAgICAgICAvLyB8ICAgICAgYm94ICAgICAgfFxuICAgICAgICAgICAgICAgIC8vIHxfX19fX19fX19fX19fX198XG4gICAgICAgICAgICAgICAgLy8gfCB1cGRhdGVkIHNwYWNlIHxcbiAgICAgICAgICAgICAgICAvLyB8X19fX19fX19fX19fX19ffFxuICAgICAgICAgICAgICAgIHNwYWNlLnkgKz0gYm94Lmg7XG4gICAgICAgICAgICAgICAgc3BhY2UuaCAtPSBib3guaDtcblxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBvdGhlcndpc2UgdGhlIGJveCBzcGxpdHMgdGhlIHNwYWNlIGludG8gdHdvIHNwYWNlc1xuICAgICAgICAgICAgICAgIC8vIHwtLS0tLS0tfC0tLS0tLS0tLS0tfFxuICAgICAgICAgICAgICAgIC8vIHwgIGJveCAgfCBuZXcgc3BhY2UgfFxuICAgICAgICAgICAgICAgIC8vIHxfX19fX19ffF9fX19fX19fX19ffFxuICAgICAgICAgICAgICAgIC8vIHwgdXBkYXRlZCBzcGFjZSAgICAgfFxuICAgICAgICAgICAgICAgIC8vIHxfX19fX19fX19fX19fX19fX19ffFxuICAgICAgICAgICAgICAgIHNwYWNlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgeDogc3BhY2UueCArIGJveC53LFxuICAgICAgICAgICAgICAgICAgICB5OiBzcGFjZS55LFxuICAgICAgICAgICAgICAgICAgICB3OiBzcGFjZS53IC0gYm94LncsXG4gICAgICAgICAgICAgICAgICAgIGg6IGJveC5oXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgc3BhY2UueSArPSBib3guaDtcbiAgICAgICAgICAgICAgICBzcGFjZS5oIC09IGJveC5oO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgICB3OiB3aWR0aCwgLy8gY29udGFpbmVyIHdpZHRoXG4gICAgICAgIGg6IGhlaWdodCwgLy8gY29udGFpbmVyIGhlaWdodFxuICAgICAgICBmaWxsOiAoYXJlYSAvICh3aWR0aCAqIGhlaWdodCkpIHx8IDAgLy8gc3BhY2UgdXRpbGl6YXRpb25cbiAgICB9O1xufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHsgUkdCQUltYWdlIH0gZnJvbSAnLi4vdXRpbC9pbWFnZSc7XG5pbXBvcnQgeyByZWdpc3RlciB9IGZyb20gJy4uL3V0aWwvd2ViX3dvcmtlcl90cmFuc2Zlcic7XG5pbXBvcnQgcG90cGFjayBmcm9tICdwb3RwYWNrJztcblxuaW1wb3J0IHR5cGUge1N0eWxlSW1hZ2V9IGZyb20gJy4uL3N0eWxlL3N0eWxlX2ltYWdlJztcbmltcG9ydCB0eXBlIEltYWdlTWFuYWdlciBmcm9tICcuL2ltYWdlX21hbmFnZXInO1xuaW1wb3J0IHR5cGUgVGV4dHVyZSBmcm9tICcuL3RleHR1cmUnO1xuXG5jb25zdCBwYWRkaW5nID0gMTtcblxudHlwZSBSZWN0ID0ge1xuICAgIHg6IG51bWJlcixcbiAgICB5OiBudW1iZXIsXG4gICAgdzogbnVtYmVyLFxuICAgIGg6IG51bWJlclxufTtcblxuXG5leHBvcnQgY2xhc3MgSW1hZ2VQb3NpdGlvbiB7XG4gICAgcGFkZGVkUmVjdDogUmVjdDtcbiAgICBwaXhlbFJhdGlvOiBudW1iZXI7XG4gICAgdmVyc2lvbjogbnVtYmVyO1xuXG4gICAgY29uc3RydWN0b3IocGFkZGVkUmVjdDogUmVjdCwge3BpeGVsUmF0aW8sIHZlcnNpb259OiBTdHlsZUltYWdlKSB7XG4gICAgICAgIHRoaXMucGFkZGVkUmVjdCA9IHBhZGRlZFJlY3Q7XG4gICAgICAgIHRoaXMucGl4ZWxSYXRpbyA9IHBpeGVsUmF0aW87XG4gICAgICAgIHRoaXMudmVyc2lvbiA9IHZlcnNpb247XG4gICAgfVxuXG4gICAgZ2V0IHRsKCk6IFtudW1iZXIsIG51bWJlcl0ge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgdGhpcy5wYWRkZWRSZWN0LnggKyBwYWRkaW5nLFxuICAgICAgICAgICAgdGhpcy5wYWRkZWRSZWN0LnkgKyBwYWRkaW5nXG4gICAgICAgIF07XG4gICAgfVxuXG4gICAgZ2V0IGJyKCk6IFtudW1iZXIsIG51bWJlcl0ge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgdGhpcy5wYWRkZWRSZWN0LnggKyB0aGlzLnBhZGRlZFJlY3QudyAtIHBhZGRpbmcsXG4gICAgICAgICAgICB0aGlzLnBhZGRlZFJlY3QueSArIHRoaXMucGFkZGVkUmVjdC5oIC0gcGFkZGluZ1xuICAgICAgICBdO1xuICAgIH1cblxuICAgIGdldCB0bGJyKCk6IEFycmF5PG51bWJlcj4ge1xuICAgICAgICByZXR1cm4gdGhpcy50bC5jb25jYXQodGhpcy5icik7XG4gICAgfVxuXG4gICAgZ2V0IGRpc3BsYXlTaXplKCk6IFtudW1iZXIsIG51bWJlcl0ge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgKHRoaXMucGFkZGVkUmVjdC53IC0gcGFkZGluZyAqIDIpIC8gdGhpcy5waXhlbFJhdGlvLFxuICAgICAgICAgICAgKHRoaXMucGFkZGVkUmVjdC5oIC0gcGFkZGluZyAqIDIpIC8gdGhpcy5waXhlbFJhdGlvXG4gICAgICAgIF07XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBJbWFnZUF0bGFzIHtcbiAgICBpbWFnZTogUkdCQUltYWdlO1xuICAgIGljb25Qb3NpdGlvbnM6IHtbc3RyaW5nXTogSW1hZ2VQb3NpdGlvbn07XG4gICAgcGF0dGVyblBvc2l0aW9uczoge1tzdHJpbmddOiBJbWFnZVBvc2l0aW9ufTtcbiAgICBoYXZlUmVuZGVyQ2FsbGJhY2tzOiBBcnJheTxzdHJpbmc+O1xuICAgIHVwbG9hZGVkOiA/Ym9vbGVhbjtcblxuICAgIGNvbnN0cnVjdG9yKGljb25zOiB7W3N0cmluZ106IFN0eWxlSW1hZ2V9LCBwYXR0ZXJuczoge1tzdHJpbmddOiBTdHlsZUltYWdlfSkge1xuICAgICAgICBjb25zdCBpY29uUG9zaXRpb25zID0ge30sIHBhdHRlcm5Qb3NpdGlvbnMgPSB7fTtcbiAgICAgICAgdGhpcy5oYXZlUmVuZGVyQ2FsbGJhY2tzID0gW107XG5cbiAgICAgICAgY29uc3QgYmlucyA9IFtdO1xuXG4gICAgICAgIHRoaXMuYWRkSW1hZ2VzKGljb25zLCBpY29uUG9zaXRpb25zLCBiaW5zKTtcbiAgICAgICAgdGhpcy5hZGRJbWFnZXMocGF0dGVybnMsIHBhdHRlcm5Qb3NpdGlvbnMsIGJpbnMpO1xuXG4gICAgICAgIGNvbnN0IHt3LCBofSA9IHBvdHBhY2soYmlucyk7XG4gICAgICAgIGNvbnN0IGltYWdlID0gbmV3IFJHQkFJbWFnZSh7d2lkdGg6IHcgfHwgMSwgaGVpZ2h0OiBoIHx8IDF9KTtcblxuICAgICAgICBmb3IgKGNvbnN0IGlkIGluIGljb25zKSB7XG4gICAgICAgICAgICBjb25zdCBzcmMgPSBpY29uc1tpZF07XG4gICAgICAgICAgICBjb25zdCBiaW4gPSBpY29uUG9zaXRpb25zW2lkXS5wYWRkZWRSZWN0O1xuICAgICAgICAgICAgUkdCQUltYWdlLmNvcHkoc3JjLmRhdGEsIGltYWdlLCB7eDogMCwgeTogMH0sIHt4OiBiaW4ueCArIHBhZGRpbmcsIHk6IGJpbi55ICsgcGFkZGluZ30sIHNyYy5kYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgaWQgaW4gcGF0dGVybnMpIHtcbiAgICAgICAgICAgIGNvbnN0IHNyYyA9IHBhdHRlcm5zW2lkXTtcbiAgICAgICAgICAgIGNvbnN0IGJpbiA9IHBhdHRlcm5Qb3NpdGlvbnNbaWRdLnBhZGRlZFJlY3Q7XG4gICAgICAgICAgICBjb25zdCB4ID0gYmluLnggKyBwYWRkaW5nLFxuICAgICAgICAgICAgICAgIHkgPSBiaW4ueSArIHBhZGRpbmcsXG4gICAgICAgICAgICAgICAgdyA9IHNyYy5kYXRhLndpZHRoLFxuICAgICAgICAgICAgICAgIGggPSBzcmMuZGF0YS5oZWlnaHQ7XG5cbiAgICAgICAgICAgIFJHQkFJbWFnZS5jb3B5KHNyYy5kYXRhLCBpbWFnZSwge3g6IDAsIHk6IDB9LCB7eCwgeX0sIHNyYy5kYXRhKTtcbiAgICAgICAgICAgIC8vIEFkZCAxIHBpeGVsIHdyYXBwZWQgcGFkZGluZyBvbiBlYWNoIHNpZGUgb2YgdGhlIGltYWdlLlxuICAgICAgICAgICAgUkdCQUltYWdlLmNvcHkoc3JjLmRhdGEsIGltYWdlLCB7IHg6IDAsIHk6IGggLSAxIH0sIHsgeCwgeTogeSAtIDEgfSwgeyB3aWR0aDogdywgaGVpZ2h0OiAxIH0pOyAvLyBUXG4gICAgICAgICAgICBSR0JBSW1hZ2UuY29weShzcmMuZGF0YSwgaW1hZ2UsIHsgeDogMCwgeTogICAgIDAgfSwgeyB4LCB5OiB5ICsgaCB9LCB7IHdpZHRoOiB3LCBoZWlnaHQ6IDEgfSk7IC8vIEJcbiAgICAgICAgICAgIFJHQkFJbWFnZS5jb3B5KHNyYy5kYXRhLCBpbWFnZSwgeyB4OiB3IC0gMSwgeTogMCB9LCB7IHg6IHggLSAxLCB5IH0sIHsgd2lkdGg6IDEsIGhlaWdodDogaCB9KTsgLy8gTFxuICAgICAgICAgICAgUkdCQUltYWdlLmNvcHkoc3JjLmRhdGEsIGltYWdlLCB7IHg6IDAsICAgICB5OiAwIH0sIHsgeDogeCArIHcsIHkgfSwgeyB3aWR0aDogMSwgaGVpZ2h0OiBoIH0pOyAvLyBSXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmltYWdlID0gaW1hZ2U7XG4gICAgICAgIHRoaXMuaWNvblBvc2l0aW9ucyA9IGljb25Qb3NpdGlvbnM7XG4gICAgICAgIHRoaXMucGF0dGVyblBvc2l0aW9ucyA9IHBhdHRlcm5Qb3NpdGlvbnM7XG4gICAgfVxuXG4gICAgYWRkSW1hZ2VzKGltYWdlczoge1tzdHJpbmddOiBTdHlsZUltYWdlfSwgcG9zaXRpb25zOiB7W3N0cmluZ106IEltYWdlUG9zaXRpb259LCBiaW5zOiBBcnJheTxSZWN0Pikge1xuICAgICAgICBmb3IgKGNvbnN0IGlkIGluIGltYWdlcykge1xuICAgICAgICAgICAgY29uc3Qgc3JjID0gaW1hZ2VzW2lkXTtcbiAgICAgICAgICAgIGNvbnN0IGJpbiA9IHtcbiAgICAgICAgICAgICAgICB4OiAwLFxuICAgICAgICAgICAgICAgIHk6IDAsXG4gICAgICAgICAgICAgICAgdzogc3JjLmRhdGEud2lkdGggKyAyICogcGFkZGluZyxcbiAgICAgICAgICAgICAgICBoOiBzcmMuZGF0YS5oZWlnaHQgKyAyICogcGFkZGluZyxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBiaW5zLnB1c2goYmluKTtcbiAgICAgICAgICAgIHBvc2l0aW9uc1tpZF0gPSBuZXcgSW1hZ2VQb3NpdGlvbihiaW4sIHNyYyk7XG5cbiAgICAgICAgICAgIGlmIChzcmMuaGFzUmVuZGVyQ2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhhdmVSZW5kZXJDYWxsYmFja3MucHVzaChpZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwYXRjaFVwZGF0ZWRJbWFnZXMoaW1hZ2VNYW5hZ2VyOiBJbWFnZU1hbmFnZXIsIHRleHR1cmU6IFRleHR1cmUpIHtcbiAgICAgICAgaW1hZ2VNYW5hZ2VyLmRpc3BhdGNoUmVuZGVyQ2FsbGJhY2tzKHRoaXMuaGF2ZVJlbmRlckNhbGxiYWNrcyk7XG4gICAgICAgIGZvciAoY29uc3QgbmFtZSBpbiBpbWFnZU1hbmFnZXIudXBkYXRlZEltYWdlcykge1xuICAgICAgICAgICAgdGhpcy5wYXRjaFVwZGF0ZWRJbWFnZSh0aGlzLmljb25Qb3NpdGlvbnNbbmFtZV0sIGltYWdlTWFuYWdlci5nZXRJbWFnZShuYW1lKSwgdGV4dHVyZSk7XG4gICAgICAgICAgICB0aGlzLnBhdGNoVXBkYXRlZEltYWdlKHRoaXMucGF0dGVyblBvc2l0aW9uc1tuYW1lXSwgaW1hZ2VNYW5hZ2VyLmdldEltYWdlKG5hbWUpLCB0ZXh0dXJlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHBhdGNoVXBkYXRlZEltYWdlKHBvc2l0aW9uOiA/SW1hZ2VQb3NpdGlvbiwgaW1hZ2U6ID9TdHlsZUltYWdlLCB0ZXh0dXJlOiBUZXh0dXJlKSB7XG4gICAgICAgIGlmICghcG9zaXRpb24gfHwgIWltYWdlKSByZXR1cm47XG5cbiAgICAgICAgaWYgKHBvc2l0aW9uLnZlcnNpb24gPT09IGltYWdlLnZlcnNpb24pIHJldHVybjtcblxuICAgICAgICBwb3NpdGlvbi52ZXJzaW9uID0gaW1hZ2UudmVyc2lvbjtcbiAgICAgICAgY29uc3QgW3gsIHldID0gcG9zaXRpb24udGw7XG4gICAgICAgIHRleHR1cmUudXBkYXRlKGltYWdlLmRhdGEsIHVuZGVmaW5lZCwge3gsIHl9KTtcbiAgICB9XG5cbn1cblxucmVnaXN0ZXIoJ0ltYWdlUG9zaXRpb24nLCBJbWFnZVBvc2l0aW9uKTtcbnJlZ2lzdGVyKCdJbWFnZUF0bGFzJywgSW1hZ2VBdGxhcyk7XG5cbiIsIi8vIEBmbG93XG5cbmltcG9ydCB3aW5kb3cgZnJvbSAnLi4vdXRpbC93aW5kb3cnO1xuY29uc3QgeyBIVE1MSW1hZ2VFbGVtZW50LCBIVE1MQ2FudmFzRWxlbWVudCwgSFRNTFZpZGVvRWxlbWVudCwgSW1hZ2VEYXRhIH0gPSB3aW5kb3c7XG5cbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSAnLi4vZ2wvY29udGV4dCc7XG5pbXBvcnQgdHlwZSB7UkdCQUltYWdlLCBBbHBoYUltYWdlfSBmcm9tICcuLi91dGlsL2ltYWdlJztcblxuZXhwb3J0IHR5cGUgVGV4dHVyZUZvcm1hdCA9XG4gICAgfCAkUHJvcGVydHlUeXBlPFdlYkdMUmVuZGVyaW5nQ29udGV4dCwgJ1JHQkEnPlxuICAgIHwgJFByb3BlcnR5VHlwZTxXZWJHTFJlbmRlcmluZ0NvbnRleHQsICdBTFBIQSc+O1xuZXhwb3J0IHR5cGUgVGV4dHVyZUZpbHRlciA9XG4gICAgfCAkUHJvcGVydHlUeXBlPFdlYkdMUmVuZGVyaW5nQ29udGV4dCwgJ0xJTkVBUic+XG4gICAgfCAkUHJvcGVydHlUeXBlPFdlYkdMUmVuZGVyaW5nQ29udGV4dCwgJ0xJTkVBUl9NSVBNQVBfTkVBUkVTVCc+XG4gICAgfCAkUHJvcGVydHlUeXBlPFdlYkdMUmVuZGVyaW5nQ29udGV4dCwgJ05FQVJFU1QnPjtcbmV4cG9ydCB0eXBlIFRleHR1cmVXcmFwID1cbiAgICB8ICRQcm9wZXJ0eVR5cGU8V2ViR0xSZW5kZXJpbmdDb250ZXh0LCAnUkVQRUFUJz5cbiAgICB8ICRQcm9wZXJ0eVR5cGU8V2ViR0xSZW5kZXJpbmdDb250ZXh0LCAnQ0xBTVBfVE9fRURHRSc+XG4gICAgfCAkUHJvcGVydHlUeXBlPFdlYkdMUmVuZGVyaW5nQ29udGV4dCwgJ01JUlJPUkVEX1JFUEVBVCc+O1xuXG50eXBlIEVtcHR5SW1hZ2UgPSB7XG4gICAgd2lkdGg6IG51bWJlcixcbiAgICBoZWlnaHQ6IG51bWJlcixcbiAgICBkYXRhOiBudWxsXG59XG5cbmV4cG9ydCB0eXBlIFRleHR1cmVJbWFnZSA9XG4gICAgfCBSR0JBSW1hZ2VcbiAgICB8IEFscGhhSW1hZ2VcbiAgICB8IEhUTUxJbWFnZUVsZW1lbnRcbiAgICB8IEhUTUxDYW52YXNFbGVtZW50XG4gICAgfCBIVE1MVmlkZW9FbGVtZW50XG4gICAgfCBJbWFnZURhdGFcbiAgICB8IEVtcHR5SW1hZ2U7XG5cbmNsYXNzIFRleHR1cmUge1xuICAgIGNvbnRleHQ6IENvbnRleHQ7XG4gICAgc2l6ZTogW251bWJlciwgbnVtYmVyXTtcbiAgICB0ZXh0dXJlOiBXZWJHTFRleHR1cmU7XG4gICAgZm9ybWF0OiBUZXh0dXJlRm9ybWF0O1xuICAgIGZpbHRlcjogP1RleHR1cmVGaWx0ZXI7XG4gICAgd3JhcDogP1RleHR1cmVXcmFwO1xuICAgIHVzZU1pcG1hcDogYm9vbGVhbjtcblxuICAgIGNvbnN0cnVjdG9yKGNvbnRleHQ6IENvbnRleHQsIGltYWdlOiBUZXh0dXJlSW1hZ2UsIGZvcm1hdDogVGV4dHVyZUZvcm1hdCwgb3B0aW9uczogP3sgcHJlbXVsdGlwbHk/OiBib29sZWFuLCB1c2VNaXBtYXA/OiBib29sZWFuIH0pIHtcbiAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgICAgICAgdGhpcy5mb3JtYXQgPSBmb3JtYXQ7XG4gICAgICAgIHRoaXMudGV4dHVyZSA9IGNvbnRleHQuZ2wuY3JlYXRlVGV4dHVyZSgpO1xuICAgICAgICB0aGlzLnVwZGF0ZShpbWFnZSwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgdXBkYXRlKGltYWdlOiBUZXh0dXJlSW1hZ2UsIG9wdGlvbnM6ID97cHJlbXVsdGlwbHk/OiBib29sZWFuLCB1c2VNaXBtYXA/OiBib29sZWFufSwgcG9zaXRpb24/OiB7IHg6IG51bWJlciwgeTogbnVtYmVyIH0pIHtcbiAgICAgICAgY29uc3Qge3dpZHRoLCBoZWlnaHR9ID0gaW1hZ2U7XG4gICAgICAgIGNvbnN0IHJlc2l6ZSA9ICghdGhpcy5zaXplIHx8IHRoaXMuc2l6ZVswXSAhPT0gd2lkdGggfHwgdGhpcy5zaXplWzFdICE9PSBoZWlnaHQpICYmICFwb3NpdGlvbjtcbiAgICAgICAgY29uc3Qge2NvbnRleHR9ID0gdGhpcztcbiAgICAgICAgY29uc3Qge2dsfSA9IGNvbnRleHQ7XG5cbiAgICAgICAgdGhpcy51c2VNaXBtYXAgPSBCb29sZWFuKG9wdGlvbnMgJiYgb3B0aW9ucy51c2VNaXBtYXApO1xuICAgICAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCB0aGlzLnRleHR1cmUpO1xuXG4gICAgICAgIGNvbnRleHQucGl4ZWxTdG9yZVVucGFja0ZsaXBZLnNldChmYWxzZSk7XG4gICAgICAgIGNvbnRleHQucGl4ZWxTdG9yZVVucGFjay5zZXQoMSk7XG4gICAgICAgIGNvbnRleHQucGl4ZWxTdG9yZVVucGFja1ByZW11bHRpcGx5QWxwaGEuc2V0KHRoaXMuZm9ybWF0ID09PSBnbC5SR0JBICYmICghb3B0aW9ucyB8fCBvcHRpb25zLnByZW11bHRpcGx5ICE9PSBmYWxzZSkpO1xuXG4gICAgICAgIGlmIChyZXNpemUpIHtcbiAgICAgICAgICAgIHRoaXMuc2l6ZSA9IFt3aWR0aCwgaGVpZ2h0XTtcblxuICAgICAgICAgICAgaWYgKGltYWdlIGluc3RhbmNlb2YgSFRNTEltYWdlRWxlbWVudCB8fCBpbWFnZSBpbnN0YW5jZW9mIEhUTUxDYW52YXNFbGVtZW50IHx8IGltYWdlIGluc3RhbmNlb2YgSFRNTFZpZGVvRWxlbWVudCB8fCBpbWFnZSBpbnN0YW5jZW9mIEltYWdlRGF0YSkge1xuICAgICAgICAgICAgICAgIGdsLnRleEltYWdlMkQoZ2wuVEVYVFVSRV8yRCwgMCwgdGhpcy5mb3JtYXQsIHRoaXMuZm9ybWF0LCBnbC5VTlNJR05FRF9CWVRFLCBpbWFnZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGdsLnRleEltYWdlMkQoZ2wuVEVYVFVSRV8yRCwgMCwgdGhpcy5mb3JtYXQsIHdpZHRoLCBoZWlnaHQsIDAsIHRoaXMuZm9ybWF0LCBnbC5VTlNJR05FRF9CWVRFLCBpbWFnZS5kYXRhKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qge3gsIHl9ID0gcG9zaXRpb24gfHwgeyB4OiAwLCB5OiAwfTtcbiAgICAgICAgICAgIGlmIChpbWFnZSBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnQgfHwgaW1hZ2UgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudCB8fCBpbWFnZSBpbnN0YW5jZW9mIEhUTUxWaWRlb0VsZW1lbnQgfHwgaW1hZ2UgaW5zdGFuY2VvZiBJbWFnZURhdGEpIHtcbiAgICAgICAgICAgICAgICBnbC50ZXhTdWJJbWFnZTJEKGdsLlRFWFRVUkVfMkQsIDAsIHgsIHksIGdsLlJHQkEsIGdsLlVOU0lHTkVEX0JZVEUsIGltYWdlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZ2wudGV4U3ViSW1hZ2UyRChnbC5URVhUVVJFXzJELCAwLCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBnbC5SR0JBLCBnbC5VTlNJR05FRF9CWVRFLCBpbWFnZS5kYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnVzZU1pcG1hcCAmJiB0aGlzLmlzU2l6ZVBvd2VyT2ZUd28oKSkge1xuICAgICAgICAgICAgZ2wuZ2VuZXJhdGVNaXBtYXAoZ2wuVEVYVFVSRV8yRCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBiaW5kKGZpbHRlcjogVGV4dHVyZUZpbHRlciwgd3JhcDogVGV4dHVyZVdyYXAsIG1pbkZpbHRlcjogP1RleHR1cmVGaWx0ZXIpIHtcbiAgICAgICAgY29uc3Qge2NvbnRleHR9ID0gdGhpcztcbiAgICAgICAgY29uc3Qge2dsfSA9IGNvbnRleHQ7XG4gICAgICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIHRoaXMudGV4dHVyZSk7XG5cbiAgICAgICAgaWYgKG1pbkZpbHRlciA9PT0gZ2wuTElORUFSX01JUE1BUF9ORUFSRVNUICYmICF0aGlzLmlzU2l6ZVBvd2VyT2ZUd28oKSkge1xuICAgICAgICAgICAgbWluRmlsdGVyID0gZ2wuTElORUFSO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZpbHRlciAhPT0gdGhpcy5maWx0ZXIpIHtcbiAgICAgICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9NQUdfRklMVEVSLCBmaWx0ZXIpO1xuICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01JTl9GSUxURVIsIG1pbkZpbHRlciB8fCBmaWx0ZXIpO1xuICAgICAgICAgICAgdGhpcy5maWx0ZXIgPSBmaWx0ZXI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAod3JhcCAhPT0gdGhpcy53cmFwKSB7XG4gICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9TLCB3cmFwKTtcbiAgICAgICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9XUkFQX1QsIHdyYXApO1xuICAgICAgICAgICAgdGhpcy53cmFwID0gd3JhcDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlzU2l6ZVBvd2VyT2ZUd28oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNpemVbMF0gPT09IHRoaXMuc2l6ZVsxXSAmJiAoTWF0aC5sb2codGhpcy5zaXplWzBdKSAvIE1hdGguTE4yKSAlIDEgPT09IDA7XG4gICAgfVxuXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgY29uc3Qge2dsfSA9IHRoaXMuY29udGV4dDtcbiAgICAgICAgZ2wuZGVsZXRlVGV4dHVyZSh0aGlzLnRleHR1cmUpO1xuICAgICAgICB0aGlzLnRleHR1cmUgPSAobnVsbDogYW55KTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFRleHR1cmU7XG4iLCJleHBvcnRzLnJlYWQgPSBmdW5jdGlvbiAoYnVmZmVyLCBvZmZzZXQsIGlzTEUsIG1MZW4sIG5CeXRlcykge1xuICB2YXIgZSwgbVxuICB2YXIgZUxlbiA9IG5CeXRlcyAqIDggLSBtTGVuIC0gMVxuICB2YXIgZU1heCA9ICgxIDw8IGVMZW4pIC0gMVxuICB2YXIgZUJpYXMgPSBlTWF4ID4+IDFcbiAgdmFyIG5CaXRzID0gLTdcbiAgdmFyIGkgPSBpc0xFID8gKG5CeXRlcyAtIDEpIDogMFxuICB2YXIgZCA9IGlzTEUgPyAtMSA6IDFcbiAgdmFyIHMgPSBidWZmZXJbb2Zmc2V0ICsgaV1cblxuICBpICs9IGRcblxuICBlID0gcyAmICgoMSA8PCAoLW5CaXRzKSkgLSAxKVxuICBzID4+PSAoLW5CaXRzKVxuICBuQml0cyArPSBlTGVuXG4gIGZvciAoOyBuQml0cyA+IDA7IGUgPSBlICogMjU2ICsgYnVmZmVyW29mZnNldCArIGldLCBpICs9IGQsIG5CaXRzIC09IDgpIHt9XG5cbiAgbSA9IGUgJiAoKDEgPDwgKC1uQml0cykpIC0gMSlcbiAgZSA+Pj0gKC1uQml0cylcbiAgbkJpdHMgKz0gbUxlblxuICBmb3IgKDsgbkJpdHMgPiAwOyBtID0gbSAqIDI1NiArIGJ1ZmZlcltvZmZzZXQgKyBpXSwgaSArPSBkLCBuQml0cyAtPSA4KSB7fVxuXG4gIGlmIChlID09PSAwKSB7XG4gICAgZSA9IDEgLSBlQmlhc1xuICB9IGVsc2UgaWYgKGUgPT09IGVNYXgpIHtcbiAgICByZXR1cm4gbSA/IE5hTiA6ICgocyA/IC0xIDogMSkgKiBJbmZpbml0eSlcbiAgfSBlbHNlIHtcbiAgICBtID0gbSArIE1hdGgucG93KDIsIG1MZW4pXG4gICAgZSA9IGUgLSBlQmlhc1xuICB9XG4gIHJldHVybiAocyA/IC0xIDogMSkgKiBtICogTWF0aC5wb3coMiwgZSAtIG1MZW4pXG59XG5cbmV4cG9ydHMud3JpdGUgPSBmdW5jdGlvbiAoYnVmZmVyLCB2YWx1ZSwgb2Zmc2V0LCBpc0xFLCBtTGVuLCBuQnl0ZXMpIHtcbiAgdmFyIGUsIG0sIGNcbiAgdmFyIGVMZW4gPSBuQnl0ZXMgKiA4IC0gbUxlbiAtIDFcbiAgdmFyIGVNYXggPSAoMSA8PCBlTGVuKSAtIDFcbiAgdmFyIGVCaWFzID0gZU1heCA+PiAxXG4gIHZhciBydCA9IChtTGVuID09PSAyMyA/IE1hdGgucG93KDIsIC0yNCkgLSBNYXRoLnBvdygyLCAtNzcpIDogMClcbiAgdmFyIGkgPSBpc0xFID8gMCA6IChuQnl0ZXMgLSAxKVxuICB2YXIgZCA9IGlzTEUgPyAxIDogLTFcbiAgdmFyIHMgPSB2YWx1ZSA8IDAgfHwgKHZhbHVlID09PSAwICYmIDEgLyB2YWx1ZSA8IDApID8gMSA6IDBcblxuICB2YWx1ZSA9IE1hdGguYWJzKHZhbHVlKVxuXG4gIGlmIChpc05hTih2YWx1ZSkgfHwgdmFsdWUgPT09IEluZmluaXR5KSB7XG4gICAgbSA9IGlzTmFOKHZhbHVlKSA/IDEgOiAwXG4gICAgZSA9IGVNYXhcbiAgfSBlbHNlIHtcbiAgICBlID0gTWF0aC5mbG9vcihNYXRoLmxvZyh2YWx1ZSkgLyBNYXRoLkxOMilcbiAgICBpZiAodmFsdWUgKiAoYyA9IE1hdGgucG93KDIsIC1lKSkgPCAxKSB7XG4gICAgICBlLS1cbiAgICAgIGMgKj0gMlxuICAgIH1cbiAgICBpZiAoZSArIGVCaWFzID49IDEpIHtcbiAgICAgIHZhbHVlICs9IHJ0IC8gY1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWx1ZSArPSBydCAqIE1hdGgucG93KDIsIDEgLSBlQmlhcylcbiAgICB9XG4gICAgaWYgKHZhbHVlICogYyA+PSAyKSB7XG4gICAgICBlKytcbiAgICAgIGMgLz0gMlxuICAgIH1cblxuICAgIGlmIChlICsgZUJpYXMgPj0gZU1heCkge1xuICAgICAgbSA9IDBcbiAgICAgIGUgPSBlTWF4XG4gICAgfSBlbHNlIGlmIChlICsgZUJpYXMgPj0gMSkge1xuICAgICAgbSA9ICh2YWx1ZSAqIGMgLSAxKSAqIE1hdGgucG93KDIsIG1MZW4pXG4gICAgICBlID0gZSArIGVCaWFzXG4gICAgfSBlbHNlIHtcbiAgICAgIG0gPSB2YWx1ZSAqIE1hdGgucG93KDIsIGVCaWFzIC0gMSkgKiBNYXRoLnBvdygyLCBtTGVuKVxuICAgICAgZSA9IDBcbiAgICB9XG4gIH1cblxuICBmb3IgKDsgbUxlbiA+PSA4OyBidWZmZXJbb2Zmc2V0ICsgaV0gPSBtICYgMHhmZiwgaSArPSBkLCBtIC89IDI1NiwgbUxlbiAtPSA4KSB7fVxuXG4gIGUgPSAoZSA8PCBtTGVuKSB8IG1cbiAgZUxlbiArPSBtTGVuXG4gIGZvciAoOyBlTGVuID4gMDsgYnVmZmVyW29mZnNldCArIGldID0gZSAmIDB4ZmYsIGkgKz0gZCwgZSAvPSAyNTYsIGVMZW4gLT0gOCkge31cblxuICBidWZmZXJbb2Zmc2V0ICsgaSAtIGRdIHw9IHMgKiAxMjhcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBQYmY7XG5cbnZhciBpZWVlNzU0ID0gcmVxdWlyZSgnaWVlZTc1NCcpO1xuXG5mdW5jdGlvbiBQYmYoYnVmKSB7XG4gICAgdGhpcy5idWYgPSBBcnJheUJ1ZmZlci5pc1ZpZXcgJiYgQXJyYXlCdWZmZXIuaXNWaWV3KGJ1ZikgPyBidWYgOiBuZXcgVWludDhBcnJheShidWYgfHwgMCk7XG4gICAgdGhpcy5wb3MgPSAwO1xuICAgIHRoaXMudHlwZSA9IDA7XG4gICAgdGhpcy5sZW5ndGggPSB0aGlzLmJ1Zi5sZW5ndGg7XG59XG5cblBiZi5WYXJpbnQgID0gMDsgLy8gdmFyaW50OiBpbnQzMiwgaW50NjQsIHVpbnQzMiwgdWludDY0LCBzaW50MzIsIHNpbnQ2NCwgYm9vbCwgZW51bVxuUGJmLkZpeGVkNjQgPSAxOyAvLyA2NC1iaXQ6IGRvdWJsZSwgZml4ZWQ2NCwgc2ZpeGVkNjRcblBiZi5CeXRlcyAgID0gMjsgLy8gbGVuZ3RoLWRlbGltaXRlZDogc3RyaW5nLCBieXRlcywgZW1iZWRkZWQgbWVzc2FnZXMsIHBhY2tlZCByZXBlYXRlZCBmaWVsZHNcblBiZi5GaXhlZDMyID0gNTsgLy8gMzItYml0OiBmbG9hdCwgZml4ZWQzMiwgc2ZpeGVkMzJcblxudmFyIFNISUZUX0xFRlRfMzIgPSAoMSA8PCAxNikgKiAoMSA8PCAxNiksXG4gICAgU0hJRlRfUklHSFRfMzIgPSAxIC8gU0hJRlRfTEVGVF8zMjtcblxuUGJmLnByb3RvdHlwZSA9IHtcblxuICAgIGRlc3Ryb3k6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLmJ1ZiA9IG51bGw7XG4gICAgfSxcblxuICAgIC8vID09PSBSRUFESU5HID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgICByZWFkRmllbGRzOiBmdW5jdGlvbihyZWFkRmllbGQsIHJlc3VsdCwgZW5kKSB7XG4gICAgICAgIGVuZCA9IGVuZCB8fCB0aGlzLmxlbmd0aDtcblxuICAgICAgICB3aGlsZSAodGhpcy5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIHZhciB2YWwgPSB0aGlzLnJlYWRWYXJpbnQoKSxcbiAgICAgICAgICAgICAgICB0YWcgPSB2YWwgPj4gMyxcbiAgICAgICAgICAgICAgICBzdGFydFBvcyA9IHRoaXMucG9zO1xuXG4gICAgICAgICAgICB0aGlzLnR5cGUgPSB2YWwgJiAweDc7XG4gICAgICAgICAgICByZWFkRmllbGQodGFnLCByZXN1bHQsIHRoaXMpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5wb3MgPT09IHN0YXJ0UG9zKSB0aGlzLnNraXAodmFsKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sXG5cbiAgICByZWFkTWVzc2FnZTogZnVuY3Rpb24ocmVhZEZpZWxkLCByZXN1bHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVhZEZpZWxkcyhyZWFkRmllbGQsIHJlc3VsdCwgdGhpcy5yZWFkVmFyaW50KCkgKyB0aGlzLnBvcyk7XG4gICAgfSxcblxuICAgIHJlYWRGaXhlZDMyOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHZhbCA9IHJlYWRVSW50MzIodGhpcy5idWYsIHRoaXMucG9zKTtcbiAgICAgICAgdGhpcy5wb3MgKz0gNDtcbiAgICAgICAgcmV0dXJuIHZhbDtcbiAgICB9LFxuXG4gICAgcmVhZFNGaXhlZDMyOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHZhbCA9IHJlYWRJbnQzMih0aGlzLmJ1ZiwgdGhpcy5wb3MpO1xuICAgICAgICB0aGlzLnBvcyArPSA0O1xuICAgICAgICByZXR1cm4gdmFsO1xuICAgIH0sXG5cbiAgICAvLyA2NC1iaXQgaW50IGhhbmRsaW5nIGlzIGJhc2VkIG9uIGdpdGh1Yi5jb20vZHB3L25vZGUtYnVmZmVyLW1vcmUtaW50cyAoTUlULWxpY2Vuc2VkKVxuXG4gICAgcmVhZEZpeGVkNjQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgdmFsID0gcmVhZFVJbnQzMih0aGlzLmJ1ZiwgdGhpcy5wb3MpICsgcmVhZFVJbnQzMih0aGlzLmJ1ZiwgdGhpcy5wb3MgKyA0KSAqIFNISUZUX0xFRlRfMzI7XG4gICAgICAgIHRoaXMucG9zICs9IDg7XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgfSxcblxuICAgIHJlYWRTRml4ZWQ2NDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciB2YWwgPSByZWFkVUludDMyKHRoaXMuYnVmLCB0aGlzLnBvcykgKyByZWFkSW50MzIodGhpcy5idWYsIHRoaXMucG9zICsgNCkgKiBTSElGVF9MRUZUXzMyO1xuICAgICAgICB0aGlzLnBvcyArPSA4O1xuICAgICAgICByZXR1cm4gdmFsO1xuICAgIH0sXG5cbiAgICByZWFkRmxvYXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgdmFsID0gaWVlZTc1NC5yZWFkKHRoaXMuYnVmLCB0aGlzLnBvcywgdHJ1ZSwgMjMsIDQpO1xuICAgICAgICB0aGlzLnBvcyArPSA0O1xuICAgICAgICByZXR1cm4gdmFsO1xuICAgIH0sXG5cbiAgICByZWFkRG91YmxlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHZhbCA9IGllZWU3NTQucmVhZCh0aGlzLmJ1ZiwgdGhpcy5wb3MsIHRydWUsIDUyLCA4KTtcbiAgICAgICAgdGhpcy5wb3MgKz0gODtcbiAgICAgICAgcmV0dXJuIHZhbDtcbiAgICB9LFxuXG4gICAgcmVhZFZhcmludDogZnVuY3Rpb24oaXNTaWduZWQpIHtcbiAgICAgICAgdmFyIGJ1ZiA9IHRoaXMuYnVmLFxuICAgICAgICAgICAgdmFsLCBiO1xuXG4gICAgICAgIGIgPSBidWZbdGhpcy5wb3MrK107IHZhbCAgPSAgYiAmIDB4N2Y7ICAgICAgICBpZiAoYiA8IDB4ODApIHJldHVybiB2YWw7XG4gICAgICAgIGIgPSBidWZbdGhpcy5wb3MrK107IHZhbCB8PSAoYiAmIDB4N2YpIDw8IDc7ICBpZiAoYiA8IDB4ODApIHJldHVybiB2YWw7XG4gICAgICAgIGIgPSBidWZbdGhpcy5wb3MrK107IHZhbCB8PSAoYiAmIDB4N2YpIDw8IDE0OyBpZiAoYiA8IDB4ODApIHJldHVybiB2YWw7XG4gICAgICAgIGIgPSBidWZbdGhpcy5wb3MrK107IHZhbCB8PSAoYiAmIDB4N2YpIDw8IDIxOyBpZiAoYiA8IDB4ODApIHJldHVybiB2YWw7XG4gICAgICAgIGIgPSBidWZbdGhpcy5wb3NdOyAgIHZhbCB8PSAoYiAmIDB4MGYpIDw8IDI4O1xuXG4gICAgICAgIHJldHVybiByZWFkVmFyaW50UmVtYWluZGVyKHZhbCwgaXNTaWduZWQsIHRoaXMpO1xuICAgIH0sXG5cbiAgICByZWFkVmFyaW50NjQ6IGZ1bmN0aW9uKCkgeyAvLyBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHYyLjAuMVxuICAgICAgICByZXR1cm4gdGhpcy5yZWFkVmFyaW50KHRydWUpO1xuICAgIH0sXG5cbiAgICByZWFkU1ZhcmludDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBudW0gPSB0aGlzLnJlYWRWYXJpbnQoKTtcbiAgICAgICAgcmV0dXJuIG51bSAlIDIgPT09IDEgPyAobnVtICsgMSkgLyAtMiA6IG51bSAvIDI7IC8vIHppZ3phZyBlbmNvZGluZ1xuICAgIH0sXG5cbiAgICByZWFkQm9vbGVhbjogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBCb29sZWFuKHRoaXMucmVhZFZhcmludCgpKTtcbiAgICB9LFxuXG4gICAgcmVhZFN0cmluZzogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBlbmQgPSB0aGlzLnJlYWRWYXJpbnQoKSArIHRoaXMucG9zLFxuICAgICAgICAgICAgc3RyID0gcmVhZFV0ZjgodGhpcy5idWYsIHRoaXMucG9zLCBlbmQpO1xuICAgICAgICB0aGlzLnBvcyA9IGVuZDtcbiAgICAgICAgcmV0dXJuIHN0cjtcbiAgICB9LFxuXG4gICAgcmVhZEJ5dGVzOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGVuZCA9IHRoaXMucmVhZFZhcmludCgpICsgdGhpcy5wb3MsXG4gICAgICAgICAgICBidWZmZXIgPSB0aGlzLmJ1Zi5zdWJhcnJheSh0aGlzLnBvcywgZW5kKTtcbiAgICAgICAgdGhpcy5wb3MgPSBlbmQ7XG4gICAgICAgIHJldHVybiBidWZmZXI7XG4gICAgfSxcblxuICAgIC8vIHZlcmJvc2UgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnM7IGRvZXNuJ3QgYWZmZWN0IGd6aXBwZWQgc2l6ZVxuXG4gICAgcmVhZFBhY2tlZFZhcmludDogZnVuY3Rpb24oYXJyLCBpc1NpZ25lZCkge1xuICAgICAgICB2YXIgZW5kID0gcmVhZFBhY2tlZEVuZCh0aGlzKTtcbiAgICAgICAgYXJyID0gYXJyIHx8IFtdO1xuICAgICAgICB3aGlsZSAodGhpcy5wb3MgPCBlbmQpIGFyci5wdXNoKHRoaXMucmVhZFZhcmludChpc1NpZ25lZCkpO1xuICAgICAgICByZXR1cm4gYXJyO1xuICAgIH0sXG4gICAgcmVhZFBhY2tlZFNWYXJpbnQ6IGZ1bmN0aW9uKGFycikge1xuICAgICAgICB2YXIgZW5kID0gcmVhZFBhY2tlZEVuZCh0aGlzKTtcbiAgICAgICAgYXJyID0gYXJyIHx8IFtdO1xuICAgICAgICB3aGlsZSAodGhpcy5wb3MgPCBlbmQpIGFyci5wdXNoKHRoaXMucmVhZFNWYXJpbnQoKSk7XG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfSxcbiAgICByZWFkUGFja2VkQm9vbGVhbjogZnVuY3Rpb24oYXJyKSB7XG4gICAgICAgIHZhciBlbmQgPSByZWFkUGFja2VkRW5kKHRoaXMpO1xuICAgICAgICBhcnIgPSBhcnIgfHwgW107XG4gICAgICAgIHdoaWxlICh0aGlzLnBvcyA8IGVuZCkgYXJyLnB1c2godGhpcy5yZWFkQm9vbGVhbigpKTtcbiAgICAgICAgcmV0dXJuIGFycjtcbiAgICB9LFxuICAgIHJlYWRQYWNrZWRGbG9hdDogZnVuY3Rpb24oYXJyKSB7XG4gICAgICAgIHZhciBlbmQgPSByZWFkUGFja2VkRW5kKHRoaXMpO1xuICAgICAgICBhcnIgPSBhcnIgfHwgW107XG4gICAgICAgIHdoaWxlICh0aGlzLnBvcyA8IGVuZCkgYXJyLnB1c2godGhpcy5yZWFkRmxvYXQoKSk7XG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfSxcbiAgICByZWFkUGFja2VkRG91YmxlOiBmdW5jdGlvbihhcnIpIHtcbiAgICAgICAgdmFyIGVuZCA9IHJlYWRQYWNrZWRFbmQodGhpcyk7XG4gICAgICAgIGFyciA9IGFyciB8fCBbXTtcbiAgICAgICAgd2hpbGUgKHRoaXMucG9zIDwgZW5kKSBhcnIucHVzaCh0aGlzLnJlYWREb3VibGUoKSk7XG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfSxcbiAgICByZWFkUGFja2VkRml4ZWQzMjogZnVuY3Rpb24oYXJyKSB7XG4gICAgICAgIHZhciBlbmQgPSByZWFkUGFja2VkRW5kKHRoaXMpO1xuICAgICAgICBhcnIgPSBhcnIgfHwgW107XG4gICAgICAgIHdoaWxlICh0aGlzLnBvcyA8IGVuZCkgYXJyLnB1c2godGhpcy5yZWFkRml4ZWQzMigpKTtcbiAgICAgICAgcmV0dXJuIGFycjtcbiAgICB9LFxuICAgIHJlYWRQYWNrZWRTRml4ZWQzMjogZnVuY3Rpb24oYXJyKSB7XG4gICAgICAgIHZhciBlbmQgPSByZWFkUGFja2VkRW5kKHRoaXMpO1xuICAgICAgICBhcnIgPSBhcnIgfHwgW107XG4gICAgICAgIHdoaWxlICh0aGlzLnBvcyA8IGVuZCkgYXJyLnB1c2godGhpcy5yZWFkU0ZpeGVkMzIoKSk7XG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfSxcbiAgICByZWFkUGFja2VkRml4ZWQ2NDogZnVuY3Rpb24oYXJyKSB7XG4gICAgICAgIHZhciBlbmQgPSByZWFkUGFja2VkRW5kKHRoaXMpO1xuICAgICAgICBhcnIgPSBhcnIgfHwgW107XG4gICAgICAgIHdoaWxlICh0aGlzLnBvcyA8IGVuZCkgYXJyLnB1c2godGhpcy5yZWFkRml4ZWQ2NCgpKTtcbiAgICAgICAgcmV0dXJuIGFycjtcbiAgICB9LFxuICAgIHJlYWRQYWNrZWRTRml4ZWQ2NDogZnVuY3Rpb24oYXJyKSB7XG4gICAgICAgIHZhciBlbmQgPSByZWFkUGFja2VkRW5kKHRoaXMpO1xuICAgICAgICBhcnIgPSBhcnIgfHwgW107XG4gICAgICAgIHdoaWxlICh0aGlzLnBvcyA8IGVuZCkgYXJyLnB1c2godGhpcy5yZWFkU0ZpeGVkNjQoKSk7XG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfSxcblxuICAgIHNraXA6IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgICB2YXIgdHlwZSA9IHZhbCAmIDB4NztcbiAgICAgICAgaWYgKHR5cGUgPT09IFBiZi5WYXJpbnQpIHdoaWxlICh0aGlzLmJ1Zlt0aGlzLnBvcysrXSA+IDB4N2YpIHt9XG4gICAgICAgIGVsc2UgaWYgKHR5cGUgPT09IFBiZi5CeXRlcykgdGhpcy5wb3MgPSB0aGlzLnJlYWRWYXJpbnQoKSArIHRoaXMucG9zO1xuICAgICAgICBlbHNlIGlmICh0eXBlID09PSBQYmYuRml4ZWQzMikgdGhpcy5wb3MgKz0gNDtcbiAgICAgICAgZWxzZSBpZiAodHlwZSA9PT0gUGJmLkZpeGVkNjQpIHRoaXMucG9zICs9IDg7XG4gICAgICAgIGVsc2UgdGhyb3cgbmV3IEVycm9yKCdVbmltcGxlbWVudGVkIHR5cGU6ICcgKyB0eXBlKTtcbiAgICB9LFxuXG4gICAgLy8gPT09IFdSSVRJTkcgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAgIHdyaXRlVGFnOiBmdW5jdGlvbih0YWcsIHR5cGUpIHtcbiAgICAgICAgdGhpcy53cml0ZVZhcmludCgodGFnIDw8IDMpIHwgdHlwZSk7XG4gICAgfSxcblxuICAgIHJlYWxsb2M6IGZ1bmN0aW9uKG1pbikge1xuICAgICAgICB2YXIgbGVuZ3RoID0gdGhpcy5sZW5ndGggfHwgMTY7XG5cbiAgICAgICAgd2hpbGUgKGxlbmd0aCA8IHRoaXMucG9zICsgbWluKSBsZW5ndGggKj0gMjtcblxuICAgICAgICBpZiAobGVuZ3RoICE9PSB0aGlzLmxlbmd0aCkge1xuICAgICAgICAgICAgdmFyIGJ1ZiA9IG5ldyBVaW50OEFycmF5KGxlbmd0aCk7XG4gICAgICAgICAgICBidWYuc2V0KHRoaXMuYnVmKTtcbiAgICAgICAgICAgIHRoaXMuYnVmID0gYnVmO1xuICAgICAgICAgICAgdGhpcy5sZW5ndGggPSBsZW5ndGg7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgZmluaXNoOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy5sZW5ndGggPSB0aGlzLnBvcztcbiAgICAgICAgdGhpcy5wb3MgPSAwO1xuICAgICAgICByZXR1cm4gdGhpcy5idWYuc3ViYXJyYXkoMCwgdGhpcy5sZW5ndGgpO1xuICAgIH0sXG5cbiAgICB3cml0ZUZpeGVkMzI6IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgICB0aGlzLnJlYWxsb2MoNCk7XG4gICAgICAgIHdyaXRlSW50MzIodGhpcy5idWYsIHZhbCwgdGhpcy5wb3MpO1xuICAgICAgICB0aGlzLnBvcyArPSA0O1xuICAgIH0sXG5cbiAgICB3cml0ZVNGaXhlZDMyOiBmdW5jdGlvbih2YWwpIHtcbiAgICAgICAgdGhpcy5yZWFsbG9jKDQpO1xuICAgICAgICB3cml0ZUludDMyKHRoaXMuYnVmLCB2YWwsIHRoaXMucG9zKTtcbiAgICAgICAgdGhpcy5wb3MgKz0gNDtcbiAgICB9LFxuXG4gICAgd3JpdGVGaXhlZDY0OiBmdW5jdGlvbih2YWwpIHtcbiAgICAgICAgdGhpcy5yZWFsbG9jKDgpO1xuICAgICAgICB3cml0ZUludDMyKHRoaXMuYnVmLCB2YWwgJiAtMSwgdGhpcy5wb3MpO1xuICAgICAgICB3cml0ZUludDMyKHRoaXMuYnVmLCBNYXRoLmZsb29yKHZhbCAqIFNISUZUX1JJR0hUXzMyKSwgdGhpcy5wb3MgKyA0KTtcbiAgICAgICAgdGhpcy5wb3MgKz0gODtcbiAgICB9LFxuXG4gICAgd3JpdGVTRml4ZWQ2NDogZnVuY3Rpb24odmFsKSB7XG4gICAgICAgIHRoaXMucmVhbGxvYyg4KTtcbiAgICAgICAgd3JpdGVJbnQzMih0aGlzLmJ1ZiwgdmFsICYgLTEsIHRoaXMucG9zKTtcbiAgICAgICAgd3JpdGVJbnQzMih0aGlzLmJ1ZiwgTWF0aC5mbG9vcih2YWwgKiBTSElGVF9SSUdIVF8zMiksIHRoaXMucG9zICsgNCk7XG4gICAgICAgIHRoaXMucG9zICs9IDg7XG4gICAgfSxcblxuICAgIHdyaXRlVmFyaW50OiBmdW5jdGlvbih2YWwpIHtcbiAgICAgICAgdmFsID0gK3ZhbCB8fCAwO1xuXG4gICAgICAgIGlmICh2YWwgPiAweGZmZmZmZmYgfHwgdmFsIDwgMCkge1xuICAgICAgICAgICAgd3JpdGVCaWdWYXJpbnQodmFsLCB0aGlzKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmVhbGxvYyg0KTtcblxuICAgICAgICB0aGlzLmJ1Zlt0aGlzLnBvcysrXSA9ICAgICAgICAgICB2YWwgJiAweDdmICB8ICh2YWwgPiAweDdmID8gMHg4MCA6IDApOyBpZiAodmFsIDw9IDB4N2YpIHJldHVybjtcbiAgICAgICAgdGhpcy5idWZbdGhpcy5wb3MrK10gPSAoKHZhbCA+Pj49IDcpICYgMHg3ZikgfCAodmFsID4gMHg3ZiA/IDB4ODAgOiAwKTsgaWYgKHZhbCA8PSAweDdmKSByZXR1cm47XG4gICAgICAgIHRoaXMuYnVmW3RoaXMucG9zKytdID0gKCh2YWwgPj4+PSA3KSAmIDB4N2YpIHwgKHZhbCA+IDB4N2YgPyAweDgwIDogMCk7IGlmICh2YWwgPD0gMHg3ZikgcmV0dXJuO1xuICAgICAgICB0aGlzLmJ1Zlt0aGlzLnBvcysrXSA9ICAgKHZhbCA+Pj4gNykgJiAweDdmO1xuICAgIH0sXG5cbiAgICB3cml0ZVNWYXJpbnQ6IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgICB0aGlzLndyaXRlVmFyaW50KHZhbCA8IDAgPyAtdmFsICogMiAtIDEgOiB2YWwgKiAyKTtcbiAgICB9LFxuXG4gICAgd3JpdGVCb29sZWFuOiBmdW5jdGlvbih2YWwpIHtcbiAgICAgICAgdGhpcy53cml0ZVZhcmludChCb29sZWFuKHZhbCkpO1xuICAgIH0sXG5cbiAgICB3cml0ZVN0cmluZzogZnVuY3Rpb24oc3RyKSB7XG4gICAgICAgIHN0ciA9IFN0cmluZyhzdHIpO1xuICAgICAgICB0aGlzLnJlYWxsb2Moc3RyLmxlbmd0aCAqIDQpO1xuXG4gICAgICAgIHRoaXMucG9zKys7IC8vIHJlc2VydmUgMSBieXRlIGZvciBzaG9ydCBzdHJpbmcgbGVuZ3RoXG5cbiAgICAgICAgdmFyIHN0YXJ0UG9zID0gdGhpcy5wb3M7XG4gICAgICAgIC8vIHdyaXRlIHRoZSBzdHJpbmcgZGlyZWN0bHkgdG8gdGhlIGJ1ZmZlciBhbmQgc2VlIGhvdyBtdWNoIHdhcyB3cml0dGVuXG4gICAgICAgIHRoaXMucG9zID0gd3JpdGVVdGY4KHRoaXMuYnVmLCBzdHIsIHRoaXMucG9zKTtcbiAgICAgICAgdmFyIGxlbiA9IHRoaXMucG9zIC0gc3RhcnRQb3M7XG5cbiAgICAgICAgaWYgKGxlbiA+PSAweDgwKSBtYWtlUm9vbUZvckV4dHJhTGVuZ3RoKHN0YXJ0UG9zLCBsZW4sIHRoaXMpO1xuXG4gICAgICAgIC8vIGZpbmFsbHksIHdyaXRlIHRoZSBtZXNzYWdlIGxlbmd0aCBpbiB0aGUgcmVzZXJ2ZWQgcGxhY2UgYW5kIHJlc3RvcmUgdGhlIHBvc2l0aW9uXG4gICAgICAgIHRoaXMucG9zID0gc3RhcnRQb3MgLSAxO1xuICAgICAgICB0aGlzLndyaXRlVmFyaW50KGxlbik7XG4gICAgICAgIHRoaXMucG9zICs9IGxlbjtcbiAgICB9LFxuXG4gICAgd3JpdGVGbG9hdDogZnVuY3Rpb24odmFsKSB7XG4gICAgICAgIHRoaXMucmVhbGxvYyg0KTtcbiAgICAgICAgaWVlZTc1NC53cml0ZSh0aGlzLmJ1ZiwgdmFsLCB0aGlzLnBvcywgdHJ1ZSwgMjMsIDQpO1xuICAgICAgICB0aGlzLnBvcyArPSA0O1xuICAgIH0sXG5cbiAgICB3cml0ZURvdWJsZTogZnVuY3Rpb24odmFsKSB7XG4gICAgICAgIHRoaXMucmVhbGxvYyg4KTtcbiAgICAgICAgaWVlZTc1NC53cml0ZSh0aGlzLmJ1ZiwgdmFsLCB0aGlzLnBvcywgdHJ1ZSwgNTIsIDgpO1xuICAgICAgICB0aGlzLnBvcyArPSA4O1xuICAgIH0sXG5cbiAgICB3cml0ZUJ5dGVzOiBmdW5jdGlvbihidWZmZXIpIHtcbiAgICAgICAgdmFyIGxlbiA9IGJ1ZmZlci5sZW5ndGg7XG4gICAgICAgIHRoaXMud3JpdGVWYXJpbnQobGVuKTtcbiAgICAgICAgdGhpcy5yZWFsbG9jKGxlbik7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHRoaXMuYnVmW3RoaXMucG9zKytdID0gYnVmZmVyW2ldO1xuICAgIH0sXG5cbiAgICB3cml0ZVJhd01lc3NhZ2U6IGZ1bmN0aW9uKGZuLCBvYmopIHtcbiAgICAgICAgdGhpcy5wb3MrKzsgLy8gcmVzZXJ2ZSAxIGJ5dGUgZm9yIHNob3J0IG1lc3NhZ2UgbGVuZ3RoXG5cbiAgICAgICAgLy8gd3JpdGUgdGhlIG1lc3NhZ2UgZGlyZWN0bHkgdG8gdGhlIGJ1ZmZlciBhbmQgc2VlIGhvdyBtdWNoIHdhcyB3cml0dGVuXG4gICAgICAgIHZhciBzdGFydFBvcyA9IHRoaXMucG9zO1xuICAgICAgICBmbihvYmosIHRoaXMpO1xuICAgICAgICB2YXIgbGVuID0gdGhpcy5wb3MgLSBzdGFydFBvcztcblxuICAgICAgICBpZiAobGVuID49IDB4ODApIG1ha2VSb29tRm9yRXh0cmFMZW5ndGgoc3RhcnRQb3MsIGxlbiwgdGhpcyk7XG5cbiAgICAgICAgLy8gZmluYWxseSwgd3JpdGUgdGhlIG1lc3NhZ2UgbGVuZ3RoIGluIHRoZSByZXNlcnZlZCBwbGFjZSBhbmQgcmVzdG9yZSB0aGUgcG9zaXRpb25cbiAgICAgICAgdGhpcy5wb3MgPSBzdGFydFBvcyAtIDE7XG4gICAgICAgIHRoaXMud3JpdGVWYXJpbnQobGVuKTtcbiAgICAgICAgdGhpcy5wb3MgKz0gbGVuO1xuICAgIH0sXG5cbiAgICB3cml0ZU1lc3NhZ2U6IGZ1bmN0aW9uKHRhZywgZm4sIG9iaikge1xuICAgICAgICB0aGlzLndyaXRlVGFnKHRhZywgUGJmLkJ5dGVzKTtcbiAgICAgICAgdGhpcy53cml0ZVJhd01lc3NhZ2UoZm4sIG9iaik7XG4gICAgfSxcblxuICAgIHdyaXRlUGFja2VkVmFyaW50OiAgIGZ1bmN0aW9uKHRhZywgYXJyKSB7IHRoaXMud3JpdGVNZXNzYWdlKHRhZywgd3JpdGVQYWNrZWRWYXJpbnQsIGFycik7ICAgfSxcbiAgICB3cml0ZVBhY2tlZFNWYXJpbnQ6ICBmdW5jdGlvbih0YWcsIGFycikgeyB0aGlzLndyaXRlTWVzc2FnZSh0YWcsIHdyaXRlUGFja2VkU1ZhcmludCwgYXJyKTsgIH0sXG4gICAgd3JpdGVQYWNrZWRCb29sZWFuOiAgZnVuY3Rpb24odGFnLCBhcnIpIHsgdGhpcy53cml0ZU1lc3NhZ2UodGFnLCB3cml0ZVBhY2tlZEJvb2xlYW4sIGFycik7ICB9LFxuICAgIHdyaXRlUGFja2VkRmxvYXQ6ICAgIGZ1bmN0aW9uKHRhZywgYXJyKSB7IHRoaXMud3JpdGVNZXNzYWdlKHRhZywgd3JpdGVQYWNrZWRGbG9hdCwgYXJyKTsgICAgfSxcbiAgICB3cml0ZVBhY2tlZERvdWJsZTogICBmdW5jdGlvbih0YWcsIGFycikgeyB0aGlzLndyaXRlTWVzc2FnZSh0YWcsIHdyaXRlUGFja2VkRG91YmxlLCBhcnIpOyAgIH0sXG4gICAgd3JpdGVQYWNrZWRGaXhlZDMyOiAgZnVuY3Rpb24odGFnLCBhcnIpIHsgdGhpcy53cml0ZU1lc3NhZ2UodGFnLCB3cml0ZVBhY2tlZEZpeGVkMzIsIGFycik7ICB9LFxuICAgIHdyaXRlUGFja2VkU0ZpeGVkMzI6IGZ1bmN0aW9uKHRhZywgYXJyKSB7IHRoaXMud3JpdGVNZXNzYWdlKHRhZywgd3JpdGVQYWNrZWRTRml4ZWQzMiwgYXJyKTsgfSxcbiAgICB3cml0ZVBhY2tlZEZpeGVkNjQ6ICBmdW5jdGlvbih0YWcsIGFycikgeyB0aGlzLndyaXRlTWVzc2FnZSh0YWcsIHdyaXRlUGFja2VkRml4ZWQ2NCwgYXJyKTsgIH0sXG4gICAgd3JpdGVQYWNrZWRTRml4ZWQ2NDogZnVuY3Rpb24odGFnLCBhcnIpIHsgdGhpcy53cml0ZU1lc3NhZ2UodGFnLCB3cml0ZVBhY2tlZFNGaXhlZDY0LCBhcnIpOyB9LFxuXG4gICAgd3JpdGVCeXRlc0ZpZWxkOiBmdW5jdGlvbih0YWcsIGJ1ZmZlcikge1xuICAgICAgICB0aGlzLndyaXRlVGFnKHRhZywgUGJmLkJ5dGVzKTtcbiAgICAgICAgdGhpcy53cml0ZUJ5dGVzKGJ1ZmZlcik7XG4gICAgfSxcbiAgICB3cml0ZUZpeGVkMzJGaWVsZDogZnVuY3Rpb24odGFnLCB2YWwpIHtcbiAgICAgICAgdGhpcy53cml0ZVRhZyh0YWcsIFBiZi5GaXhlZDMyKTtcbiAgICAgICAgdGhpcy53cml0ZUZpeGVkMzIodmFsKTtcbiAgICB9LFxuICAgIHdyaXRlU0ZpeGVkMzJGaWVsZDogZnVuY3Rpb24odGFnLCB2YWwpIHtcbiAgICAgICAgdGhpcy53cml0ZVRhZyh0YWcsIFBiZi5GaXhlZDMyKTtcbiAgICAgICAgdGhpcy53cml0ZVNGaXhlZDMyKHZhbCk7XG4gICAgfSxcbiAgICB3cml0ZUZpeGVkNjRGaWVsZDogZnVuY3Rpb24odGFnLCB2YWwpIHtcbiAgICAgICAgdGhpcy53cml0ZVRhZyh0YWcsIFBiZi5GaXhlZDY0KTtcbiAgICAgICAgdGhpcy53cml0ZUZpeGVkNjQodmFsKTtcbiAgICB9LFxuICAgIHdyaXRlU0ZpeGVkNjRGaWVsZDogZnVuY3Rpb24odGFnLCB2YWwpIHtcbiAgICAgICAgdGhpcy53cml0ZVRhZyh0YWcsIFBiZi5GaXhlZDY0KTtcbiAgICAgICAgdGhpcy53cml0ZVNGaXhlZDY0KHZhbCk7XG4gICAgfSxcbiAgICB3cml0ZVZhcmludEZpZWxkOiBmdW5jdGlvbih0YWcsIHZhbCkge1xuICAgICAgICB0aGlzLndyaXRlVGFnKHRhZywgUGJmLlZhcmludCk7XG4gICAgICAgIHRoaXMud3JpdGVWYXJpbnQodmFsKTtcbiAgICB9LFxuICAgIHdyaXRlU1ZhcmludEZpZWxkOiBmdW5jdGlvbih0YWcsIHZhbCkge1xuICAgICAgICB0aGlzLndyaXRlVGFnKHRhZywgUGJmLlZhcmludCk7XG4gICAgICAgIHRoaXMud3JpdGVTVmFyaW50KHZhbCk7XG4gICAgfSxcbiAgICB3cml0ZVN0cmluZ0ZpZWxkOiBmdW5jdGlvbih0YWcsIHN0cikge1xuICAgICAgICB0aGlzLndyaXRlVGFnKHRhZywgUGJmLkJ5dGVzKTtcbiAgICAgICAgdGhpcy53cml0ZVN0cmluZyhzdHIpO1xuICAgIH0sXG4gICAgd3JpdGVGbG9hdEZpZWxkOiBmdW5jdGlvbih0YWcsIHZhbCkge1xuICAgICAgICB0aGlzLndyaXRlVGFnKHRhZywgUGJmLkZpeGVkMzIpO1xuICAgICAgICB0aGlzLndyaXRlRmxvYXQodmFsKTtcbiAgICB9LFxuICAgIHdyaXRlRG91YmxlRmllbGQ6IGZ1bmN0aW9uKHRhZywgdmFsKSB7XG4gICAgICAgIHRoaXMud3JpdGVUYWcodGFnLCBQYmYuRml4ZWQ2NCk7XG4gICAgICAgIHRoaXMud3JpdGVEb3VibGUodmFsKTtcbiAgICB9LFxuICAgIHdyaXRlQm9vbGVhbkZpZWxkOiBmdW5jdGlvbih0YWcsIHZhbCkge1xuICAgICAgICB0aGlzLndyaXRlVmFyaW50RmllbGQodGFnLCBCb29sZWFuKHZhbCkpO1xuICAgIH1cbn07XG5cbmZ1bmN0aW9uIHJlYWRWYXJpbnRSZW1haW5kZXIobCwgcywgcCkge1xuICAgIHZhciBidWYgPSBwLmJ1ZixcbiAgICAgICAgaCwgYjtcblxuICAgIGIgPSBidWZbcC5wb3MrK107IGggID0gKGIgJiAweDcwKSA+PiA0OyAgaWYgKGIgPCAweDgwKSByZXR1cm4gdG9OdW0obCwgaCwgcyk7XG4gICAgYiA9IGJ1ZltwLnBvcysrXTsgaCB8PSAoYiAmIDB4N2YpIDw8IDM7ICBpZiAoYiA8IDB4ODApIHJldHVybiB0b051bShsLCBoLCBzKTtcbiAgICBiID0gYnVmW3AucG9zKytdOyBoIHw9IChiICYgMHg3ZikgPDwgMTA7IGlmIChiIDwgMHg4MCkgcmV0dXJuIHRvTnVtKGwsIGgsIHMpO1xuICAgIGIgPSBidWZbcC5wb3MrK107IGggfD0gKGIgJiAweDdmKSA8PCAxNzsgaWYgKGIgPCAweDgwKSByZXR1cm4gdG9OdW0obCwgaCwgcyk7XG4gICAgYiA9IGJ1ZltwLnBvcysrXTsgaCB8PSAoYiAmIDB4N2YpIDw8IDI0OyBpZiAoYiA8IDB4ODApIHJldHVybiB0b051bShsLCBoLCBzKTtcbiAgICBiID0gYnVmW3AucG9zKytdOyBoIHw9IChiICYgMHgwMSkgPDwgMzE7IGlmIChiIDwgMHg4MCkgcmV0dXJuIHRvTnVtKGwsIGgsIHMpO1xuXG4gICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCB2YXJpbnQgbm90IG1vcmUgdGhhbiAxMCBieXRlcycpO1xufVxuXG5mdW5jdGlvbiByZWFkUGFja2VkRW5kKHBiZikge1xuICAgIHJldHVybiBwYmYudHlwZSA9PT0gUGJmLkJ5dGVzID9cbiAgICAgICAgcGJmLnJlYWRWYXJpbnQoKSArIHBiZi5wb3MgOiBwYmYucG9zICsgMTtcbn1cblxuZnVuY3Rpb24gdG9OdW0obG93LCBoaWdoLCBpc1NpZ25lZCkge1xuICAgIGlmIChpc1NpZ25lZCkge1xuICAgICAgICByZXR1cm4gaGlnaCAqIDB4MTAwMDAwMDAwICsgKGxvdyA+Pj4gMCk7XG4gICAgfVxuXG4gICAgcmV0dXJuICgoaGlnaCA+Pj4gMCkgKiAweDEwMDAwMDAwMCkgKyAobG93ID4+PiAwKTtcbn1cblxuZnVuY3Rpb24gd3JpdGVCaWdWYXJpbnQodmFsLCBwYmYpIHtcbiAgICB2YXIgbG93LCBoaWdoO1xuXG4gICAgaWYgKHZhbCA+PSAwKSB7XG4gICAgICAgIGxvdyAgPSAodmFsICUgMHgxMDAwMDAwMDApIHwgMDtcbiAgICAgICAgaGlnaCA9ICh2YWwgLyAweDEwMDAwMDAwMCkgfCAwO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGxvdyAgPSB+KC12YWwgJSAweDEwMDAwMDAwMCk7XG4gICAgICAgIGhpZ2ggPSB+KC12YWwgLyAweDEwMDAwMDAwMCk7XG5cbiAgICAgICAgaWYgKGxvdyBeIDB4ZmZmZmZmZmYpIHtcbiAgICAgICAgICAgIGxvdyA9IChsb3cgKyAxKSB8IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsb3cgPSAwO1xuICAgICAgICAgICAgaGlnaCA9IChoaWdoICsgMSkgfCAwO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHZhbCA+PSAweDEwMDAwMDAwMDAwMDAwMDAwIHx8IHZhbCA8IC0weDEwMDAwMDAwMDAwMDAwMDAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignR2l2ZW4gdmFyaW50IGRvZXNuXFwndCBmaXQgaW50byAxMCBieXRlcycpO1xuICAgIH1cblxuICAgIHBiZi5yZWFsbG9jKDEwKTtcblxuICAgIHdyaXRlQmlnVmFyaW50TG93KGxvdywgaGlnaCwgcGJmKTtcbiAgICB3cml0ZUJpZ1ZhcmludEhpZ2goaGlnaCwgcGJmKTtcbn1cblxuZnVuY3Rpb24gd3JpdGVCaWdWYXJpbnRMb3cobG93LCBoaWdoLCBwYmYpIHtcbiAgICBwYmYuYnVmW3BiZi5wb3MrK10gPSBsb3cgJiAweDdmIHwgMHg4MDsgbG93ID4+Pj0gNztcbiAgICBwYmYuYnVmW3BiZi5wb3MrK10gPSBsb3cgJiAweDdmIHwgMHg4MDsgbG93ID4+Pj0gNztcbiAgICBwYmYuYnVmW3BiZi5wb3MrK10gPSBsb3cgJiAweDdmIHwgMHg4MDsgbG93ID4+Pj0gNztcbiAgICBwYmYuYnVmW3BiZi5wb3MrK10gPSBsb3cgJiAweDdmIHwgMHg4MDsgbG93ID4+Pj0gNztcbiAgICBwYmYuYnVmW3BiZi5wb3NdICAgPSBsb3cgJiAweDdmO1xufVxuXG5mdW5jdGlvbiB3cml0ZUJpZ1ZhcmludEhpZ2goaGlnaCwgcGJmKSB7XG4gICAgdmFyIGxzYiA9IChoaWdoICYgMHgwNykgPDwgNDtcblxuICAgIHBiZi5idWZbcGJmLnBvcysrXSB8PSBsc2IgICAgICAgICB8ICgoaGlnaCA+Pj49IDMpID8gMHg4MCA6IDApOyBpZiAoIWhpZ2gpIHJldHVybjtcbiAgICBwYmYuYnVmW3BiZi5wb3MrK10gID0gaGlnaCAmIDB4N2YgfCAoKGhpZ2ggPj4+PSA3KSA/IDB4ODAgOiAwKTsgaWYgKCFoaWdoKSByZXR1cm47XG4gICAgcGJmLmJ1ZltwYmYucG9zKytdICA9IGhpZ2ggJiAweDdmIHwgKChoaWdoID4+Pj0gNykgPyAweDgwIDogMCk7IGlmICghaGlnaCkgcmV0dXJuO1xuICAgIHBiZi5idWZbcGJmLnBvcysrXSAgPSBoaWdoICYgMHg3ZiB8ICgoaGlnaCA+Pj49IDcpID8gMHg4MCA6IDApOyBpZiAoIWhpZ2gpIHJldHVybjtcbiAgICBwYmYuYnVmW3BiZi5wb3MrK10gID0gaGlnaCAmIDB4N2YgfCAoKGhpZ2ggPj4+PSA3KSA/IDB4ODAgOiAwKTsgaWYgKCFoaWdoKSByZXR1cm47XG4gICAgcGJmLmJ1ZltwYmYucG9zKytdICA9IGhpZ2ggJiAweDdmO1xufVxuXG5mdW5jdGlvbiBtYWtlUm9vbUZvckV4dHJhTGVuZ3RoKHN0YXJ0UG9zLCBsZW4sIHBiZikge1xuICAgIHZhciBleHRyYUxlbiA9XG4gICAgICAgIGxlbiA8PSAweDNmZmYgPyAxIDpcbiAgICAgICAgbGVuIDw9IDB4MWZmZmZmID8gMiA6XG4gICAgICAgIGxlbiA8PSAweGZmZmZmZmYgPyAzIDogTWF0aC5jZWlsKE1hdGgubG9nKGxlbikgLyAoTWF0aC5MTjIgKiA3KSk7XG5cbiAgICAvLyBpZiAxIGJ5dGUgaXNuJ3QgZW5vdWdoIGZvciBlbmNvZGluZyBtZXNzYWdlIGxlbmd0aCwgc2hpZnQgdGhlIGRhdGEgdG8gdGhlIHJpZ2h0XG4gICAgcGJmLnJlYWxsb2MoZXh0cmFMZW4pO1xuICAgIGZvciAodmFyIGkgPSBwYmYucG9zIC0gMTsgaSA+PSBzdGFydFBvczsgaS0tKSBwYmYuYnVmW2kgKyBleHRyYUxlbl0gPSBwYmYuYnVmW2ldO1xufVxuXG5mdW5jdGlvbiB3cml0ZVBhY2tlZFZhcmludChhcnIsIHBiZikgICB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVWYXJpbnQoYXJyW2ldKTsgICB9XG5mdW5jdGlvbiB3cml0ZVBhY2tlZFNWYXJpbnQoYXJyLCBwYmYpICB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVTVmFyaW50KGFycltpXSk7ICB9XG5mdW5jdGlvbiB3cml0ZVBhY2tlZEZsb2F0KGFyciwgcGJmKSAgICB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVGbG9hdChhcnJbaV0pOyAgICB9XG5mdW5jdGlvbiB3cml0ZVBhY2tlZERvdWJsZShhcnIsIHBiZikgICB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVEb3VibGUoYXJyW2ldKTsgICB9XG5mdW5jdGlvbiB3cml0ZVBhY2tlZEJvb2xlYW4oYXJyLCBwYmYpICB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVCb29sZWFuKGFycltpXSk7ICB9XG5mdW5jdGlvbiB3cml0ZVBhY2tlZEZpeGVkMzIoYXJyLCBwYmYpICB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVGaXhlZDMyKGFycltpXSk7ICB9XG5mdW5jdGlvbiB3cml0ZVBhY2tlZFNGaXhlZDMyKGFyciwgcGJmKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVTRml4ZWQzMihhcnJbaV0pOyB9XG5mdW5jdGlvbiB3cml0ZVBhY2tlZEZpeGVkNjQoYXJyLCBwYmYpICB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVGaXhlZDY0KGFycltpXSk7ICB9XG5mdW5jdGlvbiB3cml0ZVBhY2tlZFNGaXhlZDY0KGFyciwgcGJmKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVTRml4ZWQ2NChhcnJbaV0pOyB9XG5cbi8vIEJ1ZmZlciBjb2RlIGJlbG93IGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXIsIE1JVC1saWNlbnNlZFxuXG5mdW5jdGlvbiByZWFkVUludDMyKGJ1ZiwgcG9zKSB7XG4gICAgcmV0dXJuICgoYnVmW3Bvc10pIHxcbiAgICAgICAgKGJ1Zltwb3MgKyAxXSA8PCA4KSB8XG4gICAgICAgIChidWZbcG9zICsgMl0gPDwgMTYpKSArXG4gICAgICAgIChidWZbcG9zICsgM10gKiAweDEwMDAwMDApO1xufVxuXG5mdW5jdGlvbiB3cml0ZUludDMyKGJ1ZiwgdmFsLCBwb3MpIHtcbiAgICBidWZbcG9zXSA9IHZhbDtcbiAgICBidWZbcG9zICsgMV0gPSAodmFsID4+PiA4KTtcbiAgICBidWZbcG9zICsgMl0gPSAodmFsID4+PiAxNik7XG4gICAgYnVmW3BvcyArIDNdID0gKHZhbCA+Pj4gMjQpO1xufVxuXG5mdW5jdGlvbiByZWFkSW50MzIoYnVmLCBwb3MpIHtcbiAgICByZXR1cm4gKChidWZbcG9zXSkgfFxuICAgICAgICAoYnVmW3BvcyArIDFdIDw8IDgpIHxcbiAgICAgICAgKGJ1Zltwb3MgKyAyXSA8PCAxNikpICtcbiAgICAgICAgKGJ1Zltwb3MgKyAzXSA8PCAyNCk7XG59XG5cbmZ1bmN0aW9uIHJlYWRVdGY4KGJ1ZiwgcG9zLCBlbmQpIHtcbiAgICB2YXIgc3RyID0gJyc7XG4gICAgdmFyIGkgPSBwb3M7XG5cbiAgICB3aGlsZSAoaSA8IGVuZCkge1xuICAgICAgICB2YXIgYjAgPSBidWZbaV07XG4gICAgICAgIHZhciBjID0gbnVsbDsgLy8gY29kZXBvaW50XG4gICAgICAgIHZhciBieXRlc1BlclNlcXVlbmNlID1cbiAgICAgICAgICAgIGIwID4gMHhFRiA/IDQgOlxuICAgICAgICAgICAgYjAgPiAweERGID8gMyA6XG4gICAgICAgICAgICBiMCA+IDB4QkYgPyAyIDogMTtcblxuICAgICAgICBpZiAoaSArIGJ5dGVzUGVyU2VxdWVuY2UgPiBlbmQpIGJyZWFrO1xuXG4gICAgICAgIHZhciBiMSwgYjIsIGIzO1xuXG4gICAgICAgIGlmIChieXRlc1BlclNlcXVlbmNlID09PSAxKSB7XG4gICAgICAgICAgICBpZiAoYjAgPCAweDgwKSB7XG4gICAgICAgICAgICAgICAgYyA9IGIwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGJ5dGVzUGVyU2VxdWVuY2UgPT09IDIpIHtcbiAgICAgICAgICAgIGIxID0gYnVmW2kgKyAxXTtcbiAgICAgICAgICAgIGlmICgoYjEgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgICAgIGMgPSAoYjAgJiAweDFGKSA8PCAweDYgfCAoYjEgJiAweDNGKTtcbiAgICAgICAgICAgICAgICBpZiAoYyA8PSAweDdGKSB7XG4gICAgICAgICAgICAgICAgICAgIGMgPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChieXRlc1BlclNlcXVlbmNlID09PSAzKSB7XG4gICAgICAgICAgICBiMSA9IGJ1ZltpICsgMV07XG4gICAgICAgICAgICBiMiA9IGJ1ZltpICsgMl07XG4gICAgICAgICAgICBpZiAoKGIxICYgMHhDMCkgPT09IDB4ODAgJiYgKGIyICYgMHhDMCkgPT09IDB4ODApIHtcbiAgICAgICAgICAgICAgICBjID0gKGIwICYgMHhGKSA8PCAweEMgfCAoYjEgJiAweDNGKSA8PCAweDYgfCAoYjIgJiAweDNGKTtcbiAgICAgICAgICAgICAgICBpZiAoYyA8PSAweDdGRiB8fCAoYyA+PSAweEQ4MDAgJiYgYyA8PSAweERGRkYpKSB7XG4gICAgICAgICAgICAgICAgICAgIGMgPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChieXRlc1BlclNlcXVlbmNlID09PSA0KSB7XG4gICAgICAgICAgICBiMSA9IGJ1ZltpICsgMV07XG4gICAgICAgICAgICBiMiA9IGJ1ZltpICsgMl07XG4gICAgICAgICAgICBiMyA9IGJ1ZltpICsgM107XG4gICAgICAgICAgICBpZiAoKGIxICYgMHhDMCkgPT09IDB4ODAgJiYgKGIyICYgMHhDMCkgPT09IDB4ODAgJiYgKGIzICYgMHhDMCkgPT09IDB4ODApIHtcbiAgICAgICAgICAgICAgICBjID0gKGIwICYgMHhGKSA8PCAweDEyIHwgKGIxICYgMHgzRikgPDwgMHhDIHwgKGIyICYgMHgzRikgPDwgMHg2IHwgKGIzICYgMHgzRik7XG4gICAgICAgICAgICAgICAgaWYgKGMgPD0gMHhGRkZGIHx8IGMgPj0gMHgxMTAwMDApIHtcbiAgICAgICAgICAgICAgICAgICAgYyA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGMgPT09IG51bGwpIHtcbiAgICAgICAgICAgIGMgPSAweEZGRkQ7XG4gICAgICAgICAgICBieXRlc1BlclNlcXVlbmNlID0gMTtcblxuICAgICAgICB9IGVsc2UgaWYgKGMgPiAweEZGRkYpIHtcbiAgICAgICAgICAgIGMgLT0gMHgxMDAwMDtcbiAgICAgICAgICAgIHN0ciArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGMgPj4+IDEwICYgMHgzRkYgfCAweEQ4MDApO1xuICAgICAgICAgICAgYyA9IDB4REMwMCB8IGMgJiAweDNGRjtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0ciArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGMpO1xuICAgICAgICBpICs9IGJ5dGVzUGVyU2VxdWVuY2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0cjtcbn1cblxuZnVuY3Rpb24gd3JpdGVVdGY4KGJ1Ziwgc3RyLCBwb3MpIHtcbiAgICBmb3IgKHZhciBpID0gMCwgYywgbGVhZDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgICAgICBjID0gc3RyLmNoYXJDb2RlQXQoaSk7IC8vIGNvZGUgcG9pbnRcblxuICAgICAgICBpZiAoYyA+IDB4RDdGRiAmJiBjIDwgMHhFMDAwKSB7XG4gICAgICAgICAgICBpZiAobGVhZCkge1xuICAgICAgICAgICAgICAgIGlmIChjIDwgMHhEQzAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGJ1Zltwb3MrK10gPSAweEVGO1xuICAgICAgICAgICAgICAgICAgICBidWZbcG9zKytdID0gMHhCRjtcbiAgICAgICAgICAgICAgICAgICAgYnVmW3BvcysrXSA9IDB4QkQ7XG4gICAgICAgICAgICAgICAgICAgIGxlYWQgPSBjO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjID0gbGVhZCAtIDB4RDgwMCA8PCAxMCB8IGMgLSAweERDMDAgfCAweDEwMDAwO1xuICAgICAgICAgICAgICAgICAgICBsZWFkID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChjID4gMHhEQkZGIHx8IChpICsgMSA9PT0gc3RyLmxlbmd0aCkpIHtcbiAgICAgICAgICAgICAgICAgICAgYnVmW3BvcysrXSA9IDB4RUY7XG4gICAgICAgICAgICAgICAgICAgIGJ1Zltwb3MrK10gPSAweEJGO1xuICAgICAgICAgICAgICAgICAgICBidWZbcG9zKytdID0gMHhCRDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsZWFkID0gYztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAobGVhZCkge1xuICAgICAgICAgICAgYnVmW3BvcysrXSA9IDB4RUY7XG4gICAgICAgICAgICBidWZbcG9zKytdID0gMHhCRjtcbiAgICAgICAgICAgIGJ1Zltwb3MrK10gPSAweEJEO1xuICAgICAgICAgICAgbGVhZCA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYyA8IDB4ODApIHtcbiAgICAgICAgICAgIGJ1Zltwb3MrK10gPSBjO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGMgPCAweDgwMCkge1xuICAgICAgICAgICAgICAgIGJ1Zltwb3MrK10gPSBjID4+IDB4NiB8IDB4QzA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChjIDwgMHgxMDAwMCkge1xuICAgICAgICAgICAgICAgICAgICBidWZbcG9zKytdID0gYyA+PiAweEMgfCAweEUwO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGJ1Zltwb3MrK10gPSBjID4+IDB4MTIgfCAweEYwO1xuICAgICAgICAgICAgICAgICAgICBidWZbcG9zKytdID0gYyA+PiAweEMgJiAweDNGIHwgMHg4MDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnVmW3BvcysrXSA9IGMgPj4gMHg2ICYgMHgzRiB8IDB4ODA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBidWZbcG9zKytdID0gYyAmIDB4M0YgfCAweDgwO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwb3M7XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgeyBBbHBoYUltYWdlIH0gZnJvbSAnLi4vdXRpbC9pbWFnZSc7XG5cbmltcG9ydCBQcm90b2J1ZiBmcm9tICdwYmYnO1xuY29uc3QgYm9yZGVyID0gMztcblxuaW1wb3J0IHR5cGUge1N0eWxlR2x5cGh9IGZyb20gJy4vc3R5bGVfZ2x5cGgnO1xuXG5mdW5jdGlvbiByZWFkRm9udHN0YWNrcyh0YWc6IG51bWJlciwgZ2x5cGhzOiBBcnJheTxTdHlsZUdseXBoPiwgcGJmOiBQcm90b2J1Zikge1xuICAgIGlmICh0YWcgPT09IDEpIHtcbiAgICAgICAgcGJmLnJlYWRNZXNzYWdlKHJlYWRGb250c3RhY2ssIGdseXBocyk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiByZWFkRm9udHN0YWNrKHRhZzogbnVtYmVyLCBnbHlwaHM6IEFycmF5PFN0eWxlR2x5cGg+LCBwYmY6IFByb3RvYnVmKSB7XG4gICAgaWYgKHRhZyA9PT0gMykge1xuICAgICAgICBjb25zdCB7aWQsIGJpdG1hcCwgd2lkdGgsIGhlaWdodCwgbGVmdCwgdG9wLCBhZHZhbmNlfSA9IHBiZi5yZWFkTWVzc2FnZShyZWFkR2x5cGgsIHt9KTtcbiAgICAgICAgZ2x5cGhzLnB1c2goe1xuICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICBiaXRtYXA6IG5ldyBBbHBoYUltYWdlKHtcbiAgICAgICAgICAgICAgICB3aWR0aDogd2lkdGggKyAyICogYm9yZGVyLFxuICAgICAgICAgICAgICAgIGhlaWdodDogaGVpZ2h0ICsgMiAqIGJvcmRlclxuICAgICAgICAgICAgfSwgYml0bWFwKSxcbiAgICAgICAgICAgIG1ldHJpY3M6IHt3aWR0aCwgaGVpZ2h0LCBsZWZ0LCB0b3AsIGFkdmFuY2V9XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gcmVhZEdseXBoKHRhZzogbnVtYmVyLCBnbHlwaDogT2JqZWN0LCBwYmY6IFByb3RvYnVmKSB7XG4gICAgaWYgKHRhZyA9PT0gMSkgZ2x5cGguaWQgPSBwYmYucmVhZFZhcmludCgpO1xuICAgIGVsc2UgaWYgKHRhZyA9PT0gMikgZ2x5cGguYml0bWFwID0gcGJmLnJlYWRCeXRlcygpO1xuICAgIGVsc2UgaWYgKHRhZyA9PT0gMykgZ2x5cGgud2lkdGggPSBwYmYucmVhZFZhcmludCgpO1xuICAgIGVsc2UgaWYgKHRhZyA9PT0gNCkgZ2x5cGguaGVpZ2h0ID0gcGJmLnJlYWRWYXJpbnQoKTtcbiAgICBlbHNlIGlmICh0YWcgPT09IDUpIGdseXBoLmxlZnQgPSBwYmYucmVhZFNWYXJpbnQoKTtcbiAgICBlbHNlIGlmICh0YWcgPT09IDYpIGdseXBoLnRvcCA9IHBiZi5yZWFkU1ZhcmludCgpO1xuICAgIGVsc2UgaWYgKHRhZyA9PT0gNykgZ2x5cGguYWR2YW5jZSA9IHBiZi5yZWFkVmFyaW50KCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIChkYXRhOiBBcnJheUJ1ZmZlciB8IFVpbnQ4QXJyYXkpOiBBcnJheTxTdHlsZUdseXBoPiB7XG4gICAgcmV0dXJuIG5ldyBQcm90b2J1ZihkYXRhKS5yZWFkRmllbGRzKHJlYWRGb250c3RhY2tzLCBbXSk7XG59XG5cbmV4cG9ydCBjb25zdCBHTFlQSF9QQkZfQk9SREVSID0gYm9yZGVyO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHsgYmluZEFsbCB9IGZyb20gJy4vdXRpbCc7XG5pbXBvcnQgeyBzZXJpYWxpemUsIGRlc2VyaWFsaXplIH0gZnJvbSAnLi93ZWJfd29ya2VyX3RyYW5zZmVyJztcblxuaW1wb3J0IHR5cGUge1RyYW5zZmVyYWJsZX0gZnJvbSAnLi4vdHlwZXMvdHJhbnNmZXJhYmxlJztcbmltcG9ydCB0eXBlIHtDYW5jZWxhYmxlfSBmcm9tICcuLi90eXBlcy9jYW5jZWxhYmxlJztcblxuLyoqXG4gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgW0FjdG9yIGRlc2lnbiBwYXR0ZXJuXShodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0FjdG9yX21vZGVsKVxuICogdGhhdCBtYWludGFpbnMgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGFzeW5jaHJvbm91cyB0YXNrcyBhbmQgdGhlIG9iamVjdHNcbiAqIHRoYXQgc3BpbiB0aGVtIG9mZiAtIGluIHRoaXMgY2FzZSwgdGFza3MgbGlrZSBwYXJzaW5nIHBhcnRzIG9mIHN0eWxlcyxcbiAqIG93bmVkIGJ5IHRoZSBzdHlsZXNcbiAqXG4gKiBAcGFyYW0ge1dlYldvcmtlcn0gdGFyZ2V0XG4gKiBAcGFyYW0ge1dlYldvcmtlcn0gcGFyZW50XG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IG1hcElkIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBNYXAgaW5zdGFuY2UgdXNpbmcgdGhpcyBBY3Rvci5cbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIEFjdG9yIHtcbiAgICB0YXJnZXQ6IGFueTtcbiAgICBwYXJlbnQ6IGFueTtcbiAgICBtYXBJZDogc3RyaW5nO1xuICAgIGNhbGxiYWNrczogYW55O1xuICAgIGNhbGxiYWNrSUQ6IG51bWJlcjtcbiAgICBuYW1lOiBzdHJpbmc7XG5cbiAgICBjb25zdHJ1Y3Rvcih0YXJnZXQ6IGFueSwgcGFyZW50OiBhbnksIG1hcElkOiBhbnkpIHtcbiAgICAgICAgdGhpcy50YXJnZXQgPSB0YXJnZXQ7XG4gICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xuICAgICAgICB0aGlzLm1hcElkID0gbWFwSWQ7XG4gICAgICAgIHRoaXMuY2FsbGJhY2tzID0ge307XG4gICAgICAgIHRoaXMuY2FsbGJhY2tJRCA9IDA7XG4gICAgICAgIGJpbmRBbGwoWydyZWNlaXZlJ10sIHRoaXMpO1xuICAgICAgICB0aGlzLnRhcmdldC5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgdGhpcy5yZWNlaXZlLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VuZHMgYSBtZXNzYWdlIGZyb20gYSBtYWluLXRocmVhZCBtYXAgdG8gYSBXb3JrZXIgb3IgZnJvbSBhIFdvcmtlciBiYWNrIHRvXG4gICAgICogYSBtYWluLXRocmVhZCBtYXAgaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdHlwZSBUaGUgbmFtZSBvZiB0aGUgdGFyZ2V0IG1ldGhvZCB0byBpbnZva2Ugb3IgJ1tzb3VyY2UtdHlwZV0uW3NvdXJjZS1uYW1lXS5uYW1lJyBmb3IgYSBtZXRob2Qgb24gYSBXb3JrZXJTb3VyY2UuXG4gICAgICogQHBhcmFtIHRhcmdldE1hcElkIEEgcGFydGljdWxhciBtYXBJZCB0byB3aGljaCB0byBzZW5kIHRoaXMgbWVzc2FnZS5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHNlbmQodHlwZTogc3RyaW5nLCBkYXRhOiBtaXhlZCwgY2FsbGJhY2s6ID9GdW5jdGlvbiwgdGFyZ2V0TWFwSWQ6ID9zdHJpbmcpOiA/Q2FuY2VsYWJsZSB7XG4gICAgICAgIGNvbnN0IGlkID0gY2FsbGJhY2sgPyBgJHt0aGlzLm1hcElkfToke3RoaXMuY2FsbGJhY2tJRCsrfWAgOiBudWxsO1xuICAgICAgICBpZiAoY2FsbGJhY2spIHRoaXMuY2FsbGJhY2tzW2lkXSA9IGNhbGxiYWNrO1xuICAgICAgICBjb25zdCBidWZmZXJzOiBBcnJheTxUcmFuc2ZlcmFibGU+ID0gW107XG4gICAgICAgIHRoaXMudGFyZ2V0LnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgIHRhcmdldE1hcElkLFxuICAgICAgICAgICAgc291cmNlTWFwSWQ6IHRoaXMubWFwSWQsXG4gICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgaWQ6IFN0cmluZyhpZCksXG4gICAgICAgICAgICBkYXRhOiBzZXJpYWxpemUoZGF0YSwgYnVmZmVycylcbiAgICAgICAgfSwgYnVmZmVycyk7XG4gICAgICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBjYW5jZWw6ICgpID0+IHRoaXMudGFyZ2V0LnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0TWFwSWQsXG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZU1hcElkOiB0aGlzLm1hcElkLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnPGNhbmNlbD4nLFxuICAgICAgICAgICAgICAgICAgICBpZDogU3RyaW5nKGlkKVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVjZWl2ZShtZXNzYWdlOiBPYmplY3QpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IG1lc3NhZ2UuZGF0YSxcbiAgICAgICAgICAgIGlkID0gZGF0YS5pZDtcbiAgICAgICAgbGV0IGNhbGxiYWNrO1xuXG4gICAgICAgIGlmIChkYXRhLnRhcmdldE1hcElkICYmIHRoaXMubWFwSWQgIT09IGRhdGEudGFyZ2V0TWFwSWQpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgY29uc3QgZG9uZSA9IChlcnIsIGRhdGEpID0+IHtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNhbGxiYWNrc1tpZF07XG4gICAgICAgICAgICBjb25zdCBidWZmZXJzOiBBcnJheTxUcmFuc2ZlcmFibGU+ID0gW107XG4gICAgICAgICAgICB0aGlzLnRhcmdldC5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICAgICAgc291cmNlTWFwSWQ6IHRoaXMubWFwSWQsXG4gICAgICAgICAgICAgICAgdHlwZTogJzxyZXNwb25zZT4nLFxuICAgICAgICAgICAgICAgIGlkOiBTdHJpbmcoaWQpLFxuICAgICAgICAgICAgICAgIGVycm9yOiBlcnIgPyBzZXJpYWxpemUoZXJyKSA6IG51bGwsXG4gICAgICAgICAgICAgICAgZGF0YTogc2VyaWFsaXplKGRhdGEsIGJ1ZmZlcnMpXG4gICAgICAgICAgICB9LCBidWZmZXJzKTtcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoZGF0YS50eXBlID09PSAnPHJlc3BvbnNlPicgfHwgZGF0YS50eXBlID09PSAnPGNhbmNlbD4nKSB7XG4gICAgICAgICAgICBjYWxsYmFjayA9IHRoaXMuY2FsbGJhY2tzW2RhdGEuaWRdO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuY2FsbGJhY2tzW2RhdGEuaWRdO1xuICAgICAgICAgICAgaWYgKGNhbGxiYWNrICYmIGRhdGEuZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhkZXNlcmlhbGl6ZShkYXRhLmVycm9yKSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgZGVzZXJpYWxpemUoZGF0YS5kYXRhKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGRhdGEuaWQgIT09ICd1bmRlZmluZWQnICYmIHRoaXMucGFyZW50W2RhdGEudHlwZV0pIHtcbiAgICAgICAgICAgIC8vIGRhdGEudHlwZSA9PSAnbG9hZFRpbGUnLCAncmVtb3ZlVGlsZScsIGV0Yy5cbiAgICAgICAgICAgIC8vIEFkZCBhIHBsYWNlaG9sZGVyIHNvIHRoYXQgd2UgY2FuIGRpc2NvdmVyIHdoZW4gdGhlIGRvbmUgY2FsbGJhY2sgd2FzIGNhbGxlZCBhbHJlYWR5LlxuICAgICAgICAgICAgdGhpcy5jYWxsYmFja3NbZGF0YS5pZF0gPSBudWxsO1xuICAgICAgICAgICAgY29uc3QgY2FuY2VsYWJsZSA9IHRoaXMucGFyZW50W2RhdGEudHlwZV0oZGF0YS5zb3VyY2VNYXBJZCwgZGVzZXJpYWxpemUoZGF0YS5kYXRhKSwgZG9uZSk7XG4gICAgICAgICAgICBpZiAoY2FuY2VsYWJsZSAmJiB0aGlzLmNhbGxiYWNrc1tkYXRhLmlkXSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIC8vIE9ubHkgYWRkIHRoZSBjYW5jZWxhYmxlIGNhbGxiYWNrIGlmIHRoZSBkb25lIGNhbGxiYWNrIHdhc24ndCBhbHJlYWR5IGNhbGxlZC5cbiAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2Ugd2Ugd2lsbCBuZXZlciBiZSBhYmxlIHRvIGRlbGV0ZSBpdC5cbiAgICAgICAgICAgICAgICB0aGlzLmNhbGxiYWNrc1tkYXRhLmlkXSA9IGNhbmNlbGFibGUuY2FuY2VsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBkYXRhLmlkICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLnBhcmVudC5nZXRXb3JrZXJTb3VyY2UpIHtcbiAgICAgICAgICAgIC8vIGRhdGEudHlwZSA9PSBzb3VyY2V0eXBlLm1ldGhvZFxuICAgICAgICAgICAgY29uc3Qga2V5cyA9IGRhdGEudHlwZS5zcGxpdCgnLicpO1xuICAgICAgICAgICAgY29uc3QgcGFyYW1zID0gKGRlc2VyaWFsaXplKGRhdGEuZGF0YSk6IGFueSk7XG4gICAgICAgICAgICBjb25zdCB3b3JrZXJTb3VyY2UgPSAodGhpcy5wYXJlbnQ6IGFueSkuZ2V0V29ya2VyU291cmNlKGRhdGEuc291cmNlTWFwSWQsIGtleXNbMF0sIHBhcmFtcy5zb3VyY2UpO1xuICAgICAgICAgICAgd29ya2VyU291cmNlW2tleXNbMV1dKHBhcmFtcywgZG9uZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnBhcmVudFtkYXRhLnR5cGVdKGRlc2VyaWFsaXplKGRhdGEuZGF0YSkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVtb3ZlKCkge1xuICAgICAgICB0aGlzLnRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgdGhpcy5yZWNlaXZlLCBmYWxzZSk7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBBY3RvcjtcbiIsImV4cG9ydCB7IGdldFVSTCwgZ2V0VGlsZUJCb3gsIGdldE1lcmNDb29yZHMgfTtcblxuXG4vKipcbiAqIGdldFVSTFxuICpcbiAqIEBwYXJhbSAgICB7U3RyaW5nfSAgYmFzZVVybCAgQmFzZSB1cmwgb2YgdGhlIFdNUyBzZXJ2ZXJcbiAqIEBwYXJhbSAgICB7U3RyaW5nfSAgbGF5ZXIgICAgTGF5ZXIgbmFtZVxuICogQHBhcmFtICAgIHtOdW1iZXJ9ICB4ICAgICAgICBUaWxlIGNvb3JkaW5hdGUgeFxuICogQHBhcmFtICAgIHtOdW1iZXJ9ICB5ICAgICAgICBUaWxlIGNvb3JkaW5hdGUgeVxuICogQHBhcmFtICAgIHtOdW1iZXJ9ICB6ICAgICAgICBUaWxlIHpvb21cbiAqIEBwYXJhbSAgICB7T2JqZWN0fSAgW29wdGlvbnNdXG4gKiBAcGFyYW0gICAge1N0cmluZ30gIFtvcHRpb25zLmZvcm1hdD0naW1hZ2UvcG5nJ11cbiAqIEBwYXJhbSAgICB7U3RyaW5nfSAgW29wdGlvbnMuc2VydmljZT0nV01TJ11cbiAqIEBwYXJhbSAgICB7U3RyaW5nfSAgW29wdGlvbnMudmVyc2lvbj0nMS4xLjEnXVxuICogQHBhcmFtICAgIHtTdHJpbmd9ICBbb3B0aW9ucy5yZXF1ZXN0PSdHZXRNYXAnXVxuICogQHBhcmFtICAgIHtTdHJpbmd9ICBbb3B0aW9ucy5zcnM9J0VQU0c6Mzg1NyddXG4gKiBAcGFyYW0gICAge051bWJlcn0gIFtvcHRpb25zLndpZHRoPScyNTYnXVxuICogQHBhcmFtICAgIHtOdW1iZXJ9ICBbb3B0aW9ucy5oZWlnaHQ9JzI1NiddXG4gKiBAcmV0dXJucyAge1N0cmluZ30gIHVybFxuICogQGV4YW1wbGVcbiAqIHZhciBiYXNlVXJsID0gJ2h0dHA6Ly9nZW9kYXRhLnN0YXRlLm5qLnVzL2ltYWdlcnl3bXMvTmF0dXJhbDIwMTUnO1xuICogdmFyIGxheWVyID0gJ05hdHVyYWwyMDE1JztcbiAqIHZhciB1cmwgPSB3aG9vdHMuZ2V0VVJMKGJhc2VVcmwsIGxheWVyLCAxNTQzMDgsIDE5NzE2NywgMTkpO1xuICovXG5mdW5jdGlvbiBnZXRVUkwoYmFzZVVybCwgbGF5ZXIsIHgsIHksIHosIG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgIHZhciB1cmwgPSBiYXNlVXJsICsgJz8nICsgW1xuICAgICAgICAnYmJveD0nICAgICsgZ2V0VGlsZUJCb3goeCwgeSwgeiksXG4gICAgICAgICdmb3JtYXQ9JyAgKyAob3B0aW9ucy5mb3JtYXQgfHwgJ2ltYWdlL3BuZycpLFxuICAgICAgICAnc2VydmljZT0nICsgKG9wdGlvbnMuc2VydmljZSB8fCAnV01TJyksXG4gICAgICAgICd2ZXJzaW9uPScgKyAob3B0aW9ucy52ZXJzaW9uIHx8ICcxLjEuMScpLFxuICAgICAgICAncmVxdWVzdD0nICsgKG9wdGlvbnMucmVxdWVzdCB8fCAnR2V0TWFwJyksXG4gICAgICAgICdzcnM9JyAgICAgKyAob3B0aW9ucy5zcnMgfHwgJ0VQU0c6Mzg1NycpLFxuICAgICAgICAnd2lkdGg9JyAgICsgKG9wdGlvbnMud2lkdGggfHwgMjU2KSxcbiAgICAgICAgJ2hlaWdodD0nICArIChvcHRpb25zLmhlaWdodCB8fCAyNTYpLFxuICAgICAgICAnbGF5ZXJzPScgICsgbGF5ZXJcbiAgICBdLmpvaW4oJyYnKTtcblxuICAgIHJldHVybiB1cmw7XG59XG5cblxuLyoqXG4gKiBnZXRUaWxlQkJveFxuICpcbiAqIEBwYXJhbSAgICB7TnVtYmVyfSAgeCAgVGlsZSBjb29yZGluYXRlIHhcbiAqIEBwYXJhbSAgICB7TnVtYmVyfSAgeSAgVGlsZSBjb29yZGluYXRlIHlcbiAqIEBwYXJhbSAgICB7TnVtYmVyfSAgeiAgVGlsZSB6b29tXG4gKiBAcmV0dXJucyAge1N0cmluZ30gIFN0cmluZyBvZiB0aGUgYm91bmRpbmcgYm94XG4gKi9cbmZ1bmN0aW9uIGdldFRpbGVCQm94KHgsIHksIHopIHtcbiAgICAvLyBmb3IgR29vZ2xlL09TTSB0aWxlIHNjaGVtZSB3ZSBuZWVkIHRvIGFsdGVyIHRoZSB5XG4gICAgeSA9IChNYXRoLnBvdygyLCB6KSAtIHkgLSAxKTtcblxuICAgIHZhciBtaW4gPSBnZXRNZXJjQ29vcmRzKHggKiAyNTYsIHkgKiAyNTYsIHopLFxuICAgICAgICBtYXggPSBnZXRNZXJjQ29vcmRzKCh4ICsgMSkgKiAyNTYsICh5ICsgMSkgKiAyNTYsIHopO1xuXG4gICAgcmV0dXJuIG1pblswXSArICcsJyArIG1pblsxXSArICcsJyArIG1heFswXSArICcsJyArIG1heFsxXTtcbn1cblxuXG4vKipcbiAqIGdldE1lcmNDb29yZHNcbiAqXG4gKiBAcGFyYW0gICAge051bWJlcn0gIHggIFBpeGVsIGNvb3JkaW5hdGUgeFxuICogQHBhcmFtICAgIHtOdW1iZXJ9ICB5ICBQaXhlbCBjb29yZGluYXRlIHlcbiAqIEBwYXJhbSAgICB7TnVtYmVyfSAgeiAgVGlsZSB6b29tXG4gKiBAcmV0dXJucyAge0FycmF5fSAgIFt4LCB5XVxuICovXG5mdW5jdGlvbiBnZXRNZXJjQ29vcmRzKHgsIHksIHopIHtcbiAgICB2YXIgcmVzb2x1dGlvbiA9ICgyICogTWF0aC5QSSAqIDYzNzgxMzcgLyAyNTYpIC8gTWF0aC5wb3coMiwgeiksXG4gICAgICAgIG1lcmNfeCA9ICh4ICogcmVzb2x1dGlvbiAtIDIgKiBNYXRoLlBJICAqIDYzNzgxMzcgLyAyLjApLFxuICAgICAgICBtZXJjX3kgPSAoeSAqIHJlc29sdXRpb24gLSAyICogTWF0aC5QSSAgKiA2Mzc4MTM3IC8gMi4wKTtcblxuICAgIHJldHVybiBbbWVyY194LCBtZXJjX3ldO1xufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IExuZ0xhdCBmcm9tICcuL2xuZ19sYXQnO1xuXG5pbXBvcnQgdHlwZSB7TG5nTGF0TGlrZX0gZnJvbSAnLi9sbmdfbGF0JztcblxuLyoqXG4gKiBBIGBMbmdMYXRCb3VuZHNgIG9iamVjdCByZXByZXNlbnRzIGEgZ2VvZ3JhcGhpY2FsIGJvdW5kaW5nIGJveCxcbiAqIGRlZmluZWQgYnkgaXRzIHNvdXRod2VzdCBhbmQgbm9ydGhlYXN0IHBvaW50cyBpbiBsb25naXR1ZGUgYW5kIGxhdGl0dWRlLlxuICpcbiAqIElmIG5vIGFyZ3VtZW50cyBhcmUgcHJvdmlkZWQgdG8gdGhlIGNvbnN0cnVjdG9yLCBhIGBudWxsYCBib3VuZGluZyBib3ggaXMgY3JlYXRlZC5cbiAqXG4gKiBOb3RlIHRoYXQgYW55IE1hcGJveCBHTCBtZXRob2QgdGhhdCBhY2NlcHRzIGEgYExuZ0xhdEJvdW5kc2Agb2JqZWN0IGFzIGFuIGFyZ3VtZW50IG9yIG9wdGlvblxuICogY2FuIGFsc28gYWNjZXB0IGFuIGBBcnJheWAgb2YgdHdvIHtAbGluayBMbmdMYXRMaWtlfSBjb25zdHJ1Y3RzIGFuZCB3aWxsIHBlcmZvcm0gYW4gaW1wbGljaXQgY29udmVyc2lvbi5cbiAqIFRoaXMgZmxleGlibGUgdHlwZSBpcyBkb2N1bWVudGVkIGFzIHtAbGluayBMbmdMYXRCb3VuZHNMaWtlfS5cbiAqXG4gKiBAcGFyYW0ge0xuZ0xhdExpa2V9IFtzd10gVGhlIHNvdXRod2VzdCBjb3JuZXIgb2YgdGhlIGJvdW5kaW5nIGJveC5cbiAqIEBwYXJhbSB7TG5nTGF0TGlrZX0gW25lXSBUaGUgbm9ydGhlYXN0IGNvcm5lciBvZiB0aGUgYm91bmRpbmcgYm94LlxuICogQGV4YW1wbGVcbiAqIHZhciBzdyA9IG5ldyBtYXBib3hnbC5MbmdMYXQoLTczLjk4NzYsIDQwLjc2NjEpO1xuICogdmFyIG5lID0gbmV3IG1hcGJveGdsLkxuZ0xhdCgtNzMuOTM5NywgNDAuODAwMik7XG4gKiB2YXIgbGxiID0gbmV3IG1hcGJveGdsLkxuZ0xhdEJvdW5kcyhzdywgbmUpO1xuICovXG5jbGFzcyBMbmdMYXRCb3VuZHMge1xuICAgIF9uZTogTG5nTGF0O1xuICAgIF9zdzogTG5nTGF0O1xuXG4gICAgLy8gVGhpcyBjb25zdHJ1Y3RvciBpcyB0b28gZmxleGlibGUgdG8gdHlwZS4gSXQgc2hvdWxkIG5vdCBiZSBzbyBmbGV4aWJsZS5cbiAgICBjb25zdHJ1Y3RvcihzdzogYW55LCBuZTogYW55KSB7XG4gICAgICAgIGlmICghc3cpIHtcbiAgICAgICAgICAgIC8vIG5vb3BcbiAgICAgICAgfSBlbHNlIGlmIChuZSkge1xuICAgICAgICAgICAgdGhpcy5zZXRTb3V0aFdlc3Qoc3cpLnNldE5vcnRoRWFzdChuZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3cubGVuZ3RoID09PSA0KSB7XG4gICAgICAgICAgICB0aGlzLnNldFNvdXRoV2VzdChbc3dbMF0sIHN3WzFdXSkuc2V0Tm9ydGhFYXN0KFtzd1syXSwgc3dbM11dKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2V0U291dGhXZXN0KHN3WzBdKS5zZXROb3J0aEVhc3Qoc3dbMV0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBub3J0aGVhc3QgY29ybmVyIG9mIHRoZSBib3VuZGluZyBib3hcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7TG5nTGF0TGlrZX0gbmVcbiAgICAgKiBAcmV0dXJucyB7TG5nTGF0Qm91bmRzfSBgdGhpc2BcbiAgICAgKi9cbiAgICBzZXROb3J0aEVhc3QobmU6IExuZ0xhdExpa2UpIHtcbiAgICAgICAgdGhpcy5fbmUgPSBuZSBpbnN0YW5jZW9mIExuZ0xhdCA/IG5ldyBMbmdMYXQobmUubG5nLCBuZS5sYXQpIDogTG5nTGF0LmNvbnZlcnQobmUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIHNvdXRod2VzdCBjb3JuZXIgb2YgdGhlIGJvdW5kaW5nIGJveFxuICAgICAqXG4gICAgICogQHBhcmFtIHtMbmdMYXRMaWtlfSBzd1xuICAgICAqIEByZXR1cm5zIHtMbmdMYXRCb3VuZHN9IGB0aGlzYFxuICAgICAqL1xuICAgIHNldFNvdXRoV2VzdChzdzogTG5nTGF0TGlrZSkge1xuICAgICAgICB0aGlzLl9zdyA9IHN3IGluc3RhbmNlb2YgTG5nTGF0ID8gbmV3IExuZ0xhdChzdy5sbmcsIHN3LmxhdCkgOiBMbmdMYXQuY29udmVydChzdyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4dGVuZCB0aGUgYm91bmRzIHRvIGluY2x1ZGUgYSBnaXZlbiBMbmdMYXQgb3IgTG5nTGF0Qm91bmRzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtMbmdMYXR8TG5nTGF0Qm91bmRzfSBvYmogb2JqZWN0IHRvIGV4dGVuZCB0b1xuICAgICAqIEByZXR1cm5zIHtMbmdMYXRCb3VuZHN9IGB0aGlzYFxuICAgICAqL1xuICAgIGV4dGVuZChvYmo6IExuZ0xhdCB8IExuZ0xhdEJvdW5kcykge1xuICAgICAgICBjb25zdCBzdyA9IHRoaXMuX3N3LFxuICAgICAgICAgICAgbmUgPSB0aGlzLl9uZTtcbiAgICAgICAgbGV0IHN3MiwgbmUyO1xuXG4gICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBMbmdMYXQpIHtcbiAgICAgICAgICAgIHN3MiA9IG9iajtcbiAgICAgICAgICAgIG5lMiA9IG9iajtcblxuICAgICAgICB9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIExuZ0xhdEJvdW5kcykge1xuICAgICAgICAgICAgc3cyID0gb2JqLl9zdztcbiAgICAgICAgICAgIG5lMiA9IG9iai5fbmU7XG5cbiAgICAgICAgICAgIGlmICghc3cyIHx8ICFuZTIpIHJldHVybiB0aGlzO1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgICAgICAgICAgICAgaWYgKG9iai5ldmVyeShBcnJheS5pc0FycmF5KSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5leHRlbmQoTG5nTGF0Qm91bmRzLmNvbnZlcnQob2JqKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXh0ZW5kKExuZ0xhdC5jb252ZXJ0KG9iaikpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFzdyAmJiAhbmUpIHtcbiAgICAgICAgICAgIHRoaXMuX3N3ID0gbmV3IExuZ0xhdChzdzIubG5nLCBzdzIubGF0KTtcbiAgICAgICAgICAgIHRoaXMuX25lID0gbmV3IExuZ0xhdChuZTIubG5nLCBuZTIubGF0KTtcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3cubG5nID0gTWF0aC5taW4oc3cyLmxuZywgc3cubG5nKTtcbiAgICAgICAgICAgIHN3LmxhdCA9IE1hdGgubWluKHN3Mi5sYXQsIHN3LmxhdCk7XG4gICAgICAgICAgICBuZS5sbmcgPSBNYXRoLm1heChuZTIubG5nLCBuZS5sbmcpO1xuICAgICAgICAgICAgbmUubGF0ID0gTWF0aC5tYXgobmUyLmxhdCwgbmUubGF0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGdlb2dyYXBoaWNhbCBjb29yZGluYXRlIGVxdWlkaXN0YW50IGZyb20gdGhlIGJvdW5kaW5nIGJveCdzIGNvcm5lcnMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7TG5nTGF0fSBUaGUgYm91bmRpbmcgYm94J3MgY2VudGVyLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogdmFyIGxsYiA9IG5ldyBtYXBib3hnbC5MbmdMYXRCb3VuZHMoWy03My45ODc2LCA0MC43NjYxXSwgWy03My45Mzk3LCA0MC44MDAyXSk7XG4gICAgICogbGxiLmdldENlbnRlcigpOyAvLyA9IExuZ0xhdCB7bG5nOiAtNzMuOTYzNjUsIGxhdDogNDAuNzgzMTV9XG4gICAgICovXG4gICAgZ2V0Q2VudGVyKCk6IExuZ0xhdCB7XG4gICAgICAgIHJldHVybiBuZXcgTG5nTGF0KCh0aGlzLl9zdy5sbmcgKyB0aGlzLl9uZS5sbmcpIC8gMiwgKHRoaXMuX3N3LmxhdCArIHRoaXMuX25lLmxhdCkgLyAyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBzb3V0aHdlc3QgY29ybmVyIG9mIHRoZSBib3VuZGluZyBib3guXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7TG5nTGF0fSBUaGUgc291dGh3ZXN0IGNvcm5lciBvZiB0aGUgYm91bmRpbmcgYm94LlxuICAgICAqL1xuICAgIGdldFNvdXRoV2VzdCgpOiBMbmdMYXQgeyByZXR1cm4gdGhpcy5fc3c7IH1cblxuICAgIC8qKlxuICAgICogUmV0dXJucyB0aGUgbm9ydGhlYXN0IGNvcm5lciBvZiB0aGUgYm91bmRpbmcgYm94LlxuICAgICpcbiAgICAqIEByZXR1cm5zIHtMbmdMYXR9IFRoZSBub3J0aGVhc3QgY29ybmVyIG9mIHRoZSBib3VuZGluZyBib3guXG4gICAgICovXG4gICAgZ2V0Tm9ydGhFYXN0KCk6IExuZ0xhdCB7IHJldHVybiB0aGlzLl9uZTsgfVxuXG4gICAgLyoqXG4gICAgKiBSZXR1cm5zIHRoZSBub3J0aHdlc3QgY29ybmVyIG9mIHRoZSBib3VuZGluZyBib3guXG4gICAgKlxuICAgICogQHJldHVybnMge0xuZ0xhdH0gVGhlIG5vcnRod2VzdCBjb3JuZXIgb2YgdGhlIGJvdW5kaW5nIGJveC5cbiAgICAgKi9cbiAgICBnZXROb3J0aFdlc3QoKTogTG5nTGF0IHsgcmV0dXJuIG5ldyBMbmdMYXQodGhpcy5nZXRXZXN0KCksIHRoaXMuZ2V0Tm9ydGgoKSk7IH1cblxuICAgIC8qKlxuICAgICogUmV0dXJucyB0aGUgc291dGhlYXN0IGNvcm5lciBvZiB0aGUgYm91bmRpbmcgYm94LlxuICAgICpcbiAgICAqIEByZXR1cm5zIHtMbmdMYXR9IFRoZSBzb3V0aGVhc3QgY29ybmVyIG9mIHRoZSBib3VuZGluZyBib3guXG4gICAgICovXG4gICAgZ2V0U291dGhFYXN0KCk6IExuZ0xhdCB7IHJldHVybiBuZXcgTG5nTGF0KHRoaXMuZ2V0RWFzdCgpLCB0aGlzLmdldFNvdXRoKCkpOyB9XG5cbiAgICAvKipcbiAgICAqIFJldHVybnMgdGhlIHdlc3QgZWRnZSBvZiB0aGUgYm91bmRpbmcgYm94LlxuICAgICpcbiAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSB3ZXN0IGVkZ2Ugb2YgdGhlIGJvdW5kaW5nIGJveC5cbiAgICAgKi9cbiAgICBnZXRXZXN0KCk6IG51bWJlciB7IHJldHVybiB0aGlzLl9zdy5sbmc7IH1cblxuICAgIC8qKlxuICAgICogUmV0dXJucyB0aGUgc291dGggZWRnZSBvZiB0aGUgYm91bmRpbmcgYm94LlxuICAgICpcbiAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSBzb3V0aCBlZGdlIG9mIHRoZSBib3VuZGluZyBib3guXG4gICAgICovXG4gICAgZ2V0U291dGgoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX3N3LmxhdDsgfVxuXG4gICAgLyoqXG4gICAgKiBSZXR1cm5zIHRoZSBlYXN0IGVkZ2Ugb2YgdGhlIGJvdW5kaW5nIGJveC5cbiAgICAqXG4gICAgKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgZWFzdCBlZGdlIG9mIHRoZSBib3VuZGluZyBib3guXG4gICAgICovXG4gICAgZ2V0RWFzdCgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5fbmUubG5nOyB9XG5cbiAgICAvKipcbiAgICAqIFJldHVybnMgdGhlIG5vcnRoIGVkZ2Ugb2YgdGhlIGJvdW5kaW5nIGJveC5cbiAgICAqXG4gICAgKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgbm9ydGggZWRnZSBvZiB0aGUgYm91bmRpbmcgYm94LlxuICAgICAqL1xuICAgIGdldE5vcnRoKCk6IG51bWJlciB7IHJldHVybiB0aGlzLl9uZS5sYXQ7IH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGJvdW5kaW5nIGJveCByZXByZXNlbnRlZCBhcyBhbiBhcnJheS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtBcnJheTxBcnJheTxudW1iZXI+Pn0gVGhlIGJvdW5kaW5nIGJveCByZXByZXNlbnRlZCBhcyBhbiBhcnJheSwgY29uc2lzdGluZyBvZiB0aGVcbiAgICAgKiAgIHNvdXRod2VzdCBhbmQgbm9ydGhlYXN0IGNvb3JkaW5hdGVzIG9mIHRoZSBib3VuZGluZyByZXByZXNlbnRlZCBhcyBhcnJheXMgb2YgbnVtYmVycy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIHZhciBsbGIgPSBuZXcgbWFwYm94Z2wuTG5nTGF0Qm91bmRzKFstNzMuOTg3NiwgNDAuNzY2MV0sIFstNzMuOTM5NywgNDAuODAwMl0pO1xuICAgICAqIGxsYi50b0FycmF5KCk7IC8vID0gW1stNzMuOTg3NiwgNDAuNzY2MV0sIFstNzMuOTM5NywgNDAuODAwMl1dXG4gICAgICovXG4gICAgdG9BcnJheSgpIHtcbiAgICAgICAgcmV0dXJuIFt0aGlzLl9zdy50b0FycmF5KCksIHRoaXMuX25lLnRvQXJyYXkoKV07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRoZSBib3VuZGluZyBib3ggcmVwcmVzZW50ZWQgYXMgYSBzdHJpbmcuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgYm91bmRpbmcgYm94IHJlcHJlc2VudHMgYXMgYSBzdHJpbmcgb2YgdGhlIGZvcm1hdFxuICAgICAqICAgYCdMbmdMYXRCb3VuZHMoTG5nTGF0KGxuZywgbGF0KSwgTG5nTGF0KGxuZywgbGF0KSknYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIHZhciBsbGIgPSBuZXcgbWFwYm94Z2wuTG5nTGF0Qm91bmRzKFstNzMuOTg3NiwgNDAuNzY2MV0sIFstNzMuOTM5NywgNDAuODAwMl0pO1xuICAgICAqIGxsYi50b1N0cmluZygpOyAvLyA9IFwiTG5nTGF0Qm91bmRzKExuZ0xhdCgtNzMuOTg3NiwgNDAuNzY2MSksIExuZ0xhdCgtNzMuOTM5NywgNDAuODAwMikpXCJcbiAgICAgKi9cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIGBMbmdMYXRCb3VuZHMoJHt0aGlzLl9zdy50b1N0cmluZygpfSwgJHt0aGlzLl9uZS50b1N0cmluZygpfSlgO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIHRoZSBib3VuZGluZyBib3ggaXMgYW4gZW1wdHkvYG51bGxgLXR5cGUgYm94LlxuICAgICAqXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgYm91bmRzIGhhdmUgYmVlbiBkZWZpbmVkLCBvdGhlcndpc2UgZmFsc2UuXG4gICAgICovXG4gICAgaXNFbXB0eSgpIHtcbiAgICAgICAgcmV0dXJuICEodGhpcy5fc3cgJiYgdGhpcy5fbmUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGFuIGFycmF5IHRvIGEgYExuZ0xhdEJvdW5kc2Agb2JqZWN0LlxuICAgICAqXG4gICAgICogSWYgYSBgTG5nTGF0Qm91bmRzYCBvYmplY3QgaXMgcGFzc2VkIGluLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBpdCB1bmNoYW5nZWQuXG4gICAgICpcbiAgICAgKiBJbnRlcm5hbGx5LCB0aGUgZnVuY3Rpb24gY2FsbHMgYExuZ0xhdCNjb252ZXJ0YCB0byBjb252ZXJ0IGFycmF5cyB0byBgTG5nTGF0YCB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0xuZ0xhdEJvdW5kc0xpa2V9IGlucHV0IEFuIGFycmF5IG9mIHR3byBjb29yZGluYXRlcyB0byBjb252ZXJ0LCBvciBhIGBMbmdMYXRCb3VuZHNgIG9iamVjdCB0byByZXR1cm4uXG4gICAgICogQHJldHVybnMge0xuZ0xhdEJvdW5kc30gQSBuZXcgYExuZ0xhdEJvdW5kc2Agb2JqZWN0LCBpZiBhIGNvbnZlcnNpb24gb2NjdXJyZWQsIG9yIHRoZSBvcmlnaW5hbCBgTG5nTGF0Qm91bmRzYCBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiB2YXIgYXJyID0gW1stNzMuOTg3NiwgNDAuNzY2MV0sIFstNzMuOTM5NywgNDAuODAwMl1dO1xuICAgICAqIHZhciBsbGIgPSBtYXBib3hnbC5MbmdMYXRCb3VuZHMuY29udmVydChhcnIpO1xuICAgICAqIGxsYjsgICAvLyA9IExuZ0xhdEJvdW5kcyB7X3N3OiBMbmdMYXQge2xuZzogLTczLjk4NzYsIGxhdDogNDAuNzY2MX0sIF9uZTogTG5nTGF0IHtsbmc6IC03My45Mzk3LCBsYXQ6IDQwLjgwMDJ9fVxuICAgICAqL1xuICAgIHN0YXRpYyBjb252ZXJ0KGlucHV0OiBMbmdMYXRCb3VuZHNMaWtlKTogTG5nTGF0Qm91bmRzIHtcbiAgICAgICAgaWYgKCFpbnB1dCB8fCBpbnB1dCBpbnN0YW5jZW9mIExuZ0xhdEJvdW5kcykgcmV0dXJuIGlucHV0O1xuICAgICAgICByZXR1cm4gbmV3IExuZ0xhdEJvdW5kcyhpbnB1dCk7XG4gICAgfVxufVxuXG4vKipcbiAqIEEge0BsaW5rIExuZ0xhdEJvdW5kc30gb2JqZWN0LCBhbiBhcnJheSBvZiB7QGxpbmsgTG5nTGF0TGlrZX0gb2JqZWN0cyBpbiBbc3csIG5lXSBvcmRlcixcbiAqIG9yIGFuIGFycmF5IG9mIG51bWJlcnMgaW4gW3dlc3QsIHNvdXRoLCBlYXN0LCBub3J0aF0gb3JkZXIuXG4gKlxuICogQHR5cGVkZWYge0xuZ0xhdEJvdW5kcyB8IFtMbmdMYXRMaWtlLCBMbmdMYXRMaWtlXSB8IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdfSBMbmdMYXRCb3VuZHNMaWtlXG4gKiBAZXhhbXBsZVxuICogdmFyIHYxID0gbmV3IG1hcGJveGdsLkxuZ0xhdEJvdW5kcyhcbiAqICAgbmV3IG1hcGJveGdsLkxuZ0xhdCgtNzMuOTg3NiwgNDAuNzY2MSksXG4gKiAgIG5ldyBtYXBib3hnbC5MbmdMYXQoLTczLjkzOTcsIDQwLjgwMDIpXG4gKiApO1xuICogdmFyIHYyID0gbmV3IG1hcGJveGdsLkxuZ0xhdEJvdW5kcyhbLTczLjk4NzYsIDQwLjc2NjFdLCBbLTczLjkzOTcsIDQwLjgwMDJdKVxuICogdmFyIHYzID0gW1stNzMuOTg3NiwgNDAuNzY2MV0sIFstNzMuOTM5NywgNDAuODAwMl1dO1xuICovXG5leHBvcnQgdHlwZSBMbmdMYXRCb3VuZHNMaWtlID0gTG5nTGF0Qm91bmRzIHwgW0xuZ0xhdExpa2UsIExuZ0xhdExpa2VdIHwgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl07XG5cbmV4cG9ydCBkZWZhdWx0IExuZ0xhdEJvdW5kcztcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7IHdyYXAgfSBmcm9tICcuLi91dGlsL3V0aWwnO1xuaW1wb3J0IExuZ0xhdEJvdW5kcyBmcm9tICcuL2xuZ19sYXRfYm91bmRzJztcblxuLyoqXG4gKiBBIGBMbmdMYXRgIG9iamVjdCByZXByZXNlbnRzIGEgZ2l2ZW4gbG9uZ2l0dWRlIGFuZCBsYXRpdHVkZSBjb29yZGluYXRlLCBtZWFzdXJlZCBpbiBkZWdyZWVzLlxuICpcbiAqIE1hcGJveCBHTCB1c2VzIGxvbmdpdHVkZSwgbGF0aXR1ZGUgY29vcmRpbmF0ZSBvcmRlciAoYXMgb3Bwb3NlZCB0byBsYXRpdHVkZSwgbG9uZ2l0dWRlKSB0byBtYXRjaCBHZW9KU09OLlxuICpcbiAqIE5vdGUgdGhhdCBhbnkgTWFwYm94IEdMIG1ldGhvZCB0aGF0IGFjY2VwdHMgYSBgTG5nTGF0YCBvYmplY3QgYXMgYW4gYXJndW1lbnQgb3Igb3B0aW9uXG4gKiBjYW4gYWxzbyBhY2NlcHQgYW4gYEFycmF5YCBvZiB0d28gbnVtYmVycyBhbmQgd2lsbCBwZXJmb3JtIGFuIGltcGxpY2l0IGNvbnZlcnNpb24uXG4gKiBUaGlzIGZsZXhpYmxlIHR5cGUgaXMgZG9jdW1lbnRlZCBhcyB7QGxpbmsgTG5nTGF0TGlrZX0uXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IGxuZyBMb25naXR1ZGUsIG1lYXN1cmVkIGluIGRlZ3JlZXMuXG4gKiBAcGFyYW0ge251bWJlcn0gbGF0IExhdGl0dWRlLCBtZWFzdXJlZCBpbiBkZWdyZWVzLlxuICogQGV4YW1wbGVcbiAqIHZhciBsbCA9IG5ldyBtYXBib3hnbC5MbmdMYXQoLTczLjk3NDksIDQwLjc3MzYpO1xuICogQHNlZSBbR2V0IGNvb3JkaW5hdGVzIG9mIHRoZSBtb3VzZSBwb2ludGVyXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL21vdXNlLXBvc2l0aW9uLylcbiAqIEBzZWUgW0Rpc3BsYXkgYSBwb3B1cF0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9wb3B1cC8pXG4gKiBAc2VlIFtIaWdobGlnaHQgZmVhdHVyZXMgd2l0aGluIGEgYm91bmRpbmcgYm94XShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3VzaW5nLWJveC1xdWVyeXJlbmRlcmVkZmVhdHVyZXMvKVxuICogQHNlZSBbQ3JlYXRlIGEgdGltZWxpbmUgYW5pbWF0aW9uXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3RpbWVsaW5lLWFuaW1hdGlvbi8pXG4gKi9cbmNsYXNzIExuZ0xhdCB7XG4gICAgbG5nOiBudW1iZXI7XG4gICAgbGF0OiBudW1iZXI7XG5cbiAgICBjb25zdHJ1Y3Rvcihsbmc6IG51bWJlciwgbGF0OiBudW1iZXIpIHtcbiAgICAgICAgaWYgKGlzTmFOKGxuZykgfHwgaXNOYU4obGF0KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIExuZ0xhdCBvYmplY3Q6ICgke2xuZ30sICR7bGF0fSlgKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxuZyA9ICtsbmc7XG4gICAgICAgIHRoaXMubGF0ID0gK2xhdDtcbiAgICAgICAgaWYgKHRoaXMubGF0ID4gOTAgfHwgdGhpcy5sYXQgPCAtOTApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBMbmdMYXQgbGF0aXR1ZGUgdmFsdWU6IG11c3QgYmUgYmV0d2VlbiAtOTAgYW5kIDkwJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgbmV3IGBMbmdMYXRgIG9iamVjdCB3aG9zZSBsb25naXR1ZGUgaXMgd3JhcHBlZCB0byB0aGUgcmFuZ2UgKC0xODAsIDE4MCkuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7TG5nTGF0fSBUaGUgd3JhcHBlZCBgTG5nTGF0YCBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiB2YXIgbGwgPSBuZXcgbWFwYm94Z2wuTG5nTGF0KDI4Ni4wMjUxLCA0MC43NzM2KTtcbiAgICAgKiB2YXIgd3JhcHBlZCA9IGxsLndyYXAoKTtcbiAgICAgKiB3cmFwcGVkLmxuZzsgLy8gPSAtNzMuOTc0OVxuICAgICAqL1xuICAgIHdyYXAoKSB7XG4gICAgICAgIHJldHVybiBuZXcgTG5nTGF0KHdyYXAodGhpcy5sbmcsIC0xODAsIDE4MCksIHRoaXMubGF0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBjb29yZGluYXRlcyByZXByZXNlbnRlZCBhcyBhbiBhcnJheSBvZiB0d28gbnVtYmVycy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtBcnJheTxudW1iZXI+fSBUaGUgY29vcmRpbmF0ZXMgcmVwcmVzZXRlZCBhcyBhbiBhcnJheSBvZiBsb25naXR1ZGUgYW5kIGxhdGl0dWRlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogdmFyIGxsID0gbmV3IG1hcGJveGdsLkxuZ0xhdCgtNzMuOTc0OSwgNDAuNzczNik7XG4gICAgICogbGwudG9BcnJheSgpOyAvLyA9IFstNzMuOTc0OSwgNDAuNzczNl1cbiAgICAgKi9cbiAgICB0b0FycmF5KCkge1xuICAgICAgICByZXR1cm4gW3RoaXMubG5nLCB0aGlzLmxhdF07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgY29vcmRpbmF0ZXMgcmVwcmVzZW50IGFzIGEgc3RyaW5nLlxuICAgICAqXG4gICAgICogQHJldHVybnMge3N0cmluZ30gVGhlIGNvb3JkaW5hdGVzIHJlcHJlc2VudGVkIGFzIGEgc3RyaW5nIG9mIHRoZSBmb3JtYXQgYCdMbmdMYXQobG5nLCBsYXQpJ2AuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiB2YXIgbGwgPSBuZXcgbWFwYm94Z2wuTG5nTGF0KC03My45NzQ5LCA0MC43NzM2KTtcbiAgICAgKiBsbC50b1N0cmluZygpOyAvLyA9IFwiTG5nTGF0KC03My45NzQ5LCA0MC43NzM2KVwiXG4gICAgICovXG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiBgTG5nTGF0KCR7dGhpcy5sbmd9LCAke3RoaXMubGF0fSlgO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBgTG5nTGF0Qm91bmRzYCBmcm9tIHRoZSBjb29yZGluYXRlcyBleHRlbmRlZCBieSBhIGdpdmVuIGByYWRpdXNgLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtyYWRpdXM9MF0gRGlzdGFuY2UgaW4gbWV0ZXJzIGZyb20gdGhlIGNvb3JkaW5hdGVzIHRvIGV4dGVuZCB0aGUgYm91bmRzLlxuICAgICAqIEByZXR1cm5zIHtMbmdMYXRCb3VuZHN9IEEgbmV3IGBMbmdMYXRCb3VuZHNgIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGNvb3JkaW5hdGVzIGV4dGVuZGVkIGJ5IHRoZSBgcmFkaXVzYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIHZhciBsbCA9IG5ldyBtYXBib3hnbC5MbmdMYXQoLTczLjk3NDksIDQwLjc3MzYpO1xuICAgICAqIGxsLnRvQm91bmRzKDEwMCkudG9BcnJheSgpOyAvLyA9IFtbLTczLjk3NTAxODYyMTQxMzI4LCA0MC43NzM1MTAxNjg0NzIyOV0sIFstNzMuOTc0NzgxMzc4NTg2NzMsIDQwLjc3MzY4OTgzMTUyNzcxXV1cbiAgICAgKi9cbiAgICB0b0JvdW5kcyhyYWRpdXM/OiBudW1iZXIgPSAwKSB7XG4gICAgICAgIGNvbnN0IGVhcnRoQ2lyY3VtZmVyZW5jZUluTWV0ZXJzQXRFcXVhdG9yID0gNDAwNzUwMTc7XG4gICAgICAgIGNvbnN0IGxhdEFjY3VyYWN5ID0gMzYwICogcmFkaXVzIC8gZWFydGhDaXJjdW1mZXJlbmNlSW5NZXRlcnNBdEVxdWF0b3IsXG4gICAgICAgICAgICBsbmdBY2N1cmFjeSA9IGxhdEFjY3VyYWN5IC8gTWF0aC5jb3MoKE1hdGguUEkgLyAxODApICogdGhpcy5sYXQpO1xuXG4gICAgICAgIHJldHVybiBuZXcgTG5nTGF0Qm91bmRzKG5ldyBMbmdMYXQodGhpcy5sbmcgLSBsbmdBY2N1cmFjeSwgdGhpcy5sYXQgLSBsYXRBY2N1cmFjeSksXG4gICAgICAgICAgICBuZXcgTG5nTGF0KHRoaXMubG5nICsgbG5nQWNjdXJhY3ksIHRoaXMubGF0ICsgbGF0QWNjdXJhY3kpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBhbiBhcnJheSBvZiB0d28gbnVtYmVycyBvciBhbiBvYmplY3Qgd2l0aCBgbG5nYCBhbmQgYGxhdGAgb3IgYGxvbmAgYW5kIGBsYXRgIHByb3BlcnRpZXNcbiAgICAgKiB0byBhIGBMbmdMYXRgIG9iamVjdC5cbiAgICAgKlxuICAgICAqIElmIGEgYExuZ0xhdGAgb2JqZWN0IGlzIHBhc3NlZCBpbiwgdGhlIGZ1bmN0aW9uIHJldHVybnMgaXQgdW5jaGFuZ2VkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtMbmdMYXRMaWtlfSBpbnB1dCBBbiBhcnJheSBvZiB0d28gbnVtYmVycyBvciBvYmplY3QgdG8gY29udmVydCwgb3IgYSBgTG5nTGF0YCBvYmplY3QgdG8gcmV0dXJuLlxuICAgICAqIEByZXR1cm5zIHtMbmdMYXR9IEEgbmV3IGBMbmdMYXRgIG9iamVjdCwgaWYgYSBjb252ZXJzaW9uIG9jY3VycmVkLCBvciB0aGUgb3JpZ2luYWwgYExuZ0xhdGAgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICogdmFyIGFyciA9IFstNzMuOTc0OSwgNDAuNzczNl07XG4gICAgICogdmFyIGxsID0gbWFwYm94Z2wuTG5nTGF0LmNvbnZlcnQoYXJyKTtcbiAgICAgKiBsbDsgICAvLyA9IExuZ0xhdCB7bG5nOiAtNzMuOTc0OSwgbGF0OiA0MC43NzM2fVxuICAgICAqL1xuICAgIHN0YXRpYyBjb252ZXJ0KGlucHV0OiBMbmdMYXRMaWtlKTogTG5nTGF0IHtcbiAgICAgICAgaWYgKGlucHV0IGluc3RhbmNlb2YgTG5nTGF0KSB7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaW5wdXQpICYmIChpbnB1dC5sZW5ndGggPT09IDIgfHwgaW5wdXQubGVuZ3RoID09PSAzKSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBMbmdMYXQoTnVtYmVyKGlucHV0WzBdKSwgTnVtYmVyKGlucHV0WzFdKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGlucHV0KSAmJiB0eXBlb2YgaW5wdXQgPT09ICdvYmplY3QnICYmIGlucHV0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IExuZ0xhdChcbiAgICAgICAgICAgICAgICAvLyBmbG93IGNhbid0IHJlZmluZSB0aGlzIHRvIGhhdmUgb25lIG9mIGxuZyBvciBsYXQsIHNvIHdlIGhhdmUgdG8gY2FzdCB0byBhbnlcbiAgICAgICAgICAgICAgICBOdW1iZXIoJ2xuZycgaW4gaW5wdXQgPyAoaW5wdXQ6IGFueSkubG5nIDogKGlucHV0OiBhbnkpLmxvbiksXG4gICAgICAgICAgICAgICAgTnVtYmVyKGlucHV0LmxhdClcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiYExuZ0xhdExpa2VgIGFyZ3VtZW50IG11c3QgYmUgc3BlY2lmaWVkIGFzIGEgTG5nTGF0IGluc3RhbmNlLCBhbiBvYmplY3Qge2xuZzogPGxuZz4sIGxhdDogPGxhdD59LCBhbiBvYmplY3Qge2xvbjogPGxuZz4sIGxhdDogPGxhdD59LCBvciBhbiBhcnJheSBvZiBbPGxuZz4sIDxsYXQ+XVwiKTtcbiAgICB9XG59XG5cbi8qKlxuICogQSB7QGxpbmsgTG5nTGF0fSBvYmplY3QsIGFuIGFycmF5IG9mIHR3byBudW1iZXJzIHJlcHJlc2VudGluZyBsb25naXR1ZGUgYW5kIGxhdGl0dWRlLFxuICogb3IgYW4gb2JqZWN0IHdpdGggYGxuZ2AgYW5kIGBsYXRgIG9yIGBsb25gIGFuZCBgbGF0YCBwcm9wZXJ0aWVzLlxuICpcbiAqIEB0eXBlZGVmIHtMbmdMYXQgfCB7bG5nOiBudW1iZXIsIGxhdDogbnVtYmVyfSB8IHtsb246IG51bWJlciwgbGF0OiBudW1iZXJ9IHwgW251bWJlciwgbnVtYmVyXX0gTG5nTGF0TGlrZVxuICogQGV4YW1wbGVcbiAqIHZhciB2MSA9IG5ldyBtYXBib3hnbC5MbmdMYXQoLTEyMi40MjA2NzksIDM3Ljc3MjUzNyk7XG4gKiB2YXIgdjIgPSBbLTEyMi40MjA2NzksIDM3Ljc3MjUzN107XG4gKiB2YXIgdjMgPSB7bG9uOiAtMTIyLjQyMDY3OSwgbGF0OiAzNy43NzI1Mzd9O1xuICovXG5leHBvcnQgdHlwZSBMbmdMYXRMaWtlID0gTG5nTGF0IHwge2xuZzogbnVtYmVyLCBsYXQ6IG51bWJlcn0gfCB7bG9uOiBudW1iZXIsIGxhdDogbnVtYmVyfSB8IFtudW1iZXIsIG51bWJlcl07XG5cbmV4cG9ydCBkZWZhdWx0IExuZ0xhdDtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCBMbmdMYXQgZnJvbSAnLi4vZ2VvL2xuZ19sYXQnO1xuaW1wb3J0IHR5cGUge0xuZ0xhdExpa2V9IGZyb20gJy4uL2dlby9sbmdfbGF0JztcblxuLypcbiAqIFRoZSBjaXJjdW1mZXJlbmNlIG9mIHRoZSB3b3JsZCBpbiBtZXRlcnMgYXQgdGhlIGdpdmVuIGxhdGl0dWRlLlxuICovXG5mdW5jdGlvbiBjaXJjdW1mZXJlbmNlQXRMYXRpdHVkZShsYXRpdHVkZTogbnVtYmVyKSB7XG4gICAgY29uc3QgY2lyY3VtZmVyZW5jZSA9IDIgKiBNYXRoLlBJICogNjM3ODEzNztcbiAgICByZXR1cm4gY2lyY3VtZmVyZW5jZSAqIE1hdGguY29zKGxhdGl0dWRlICogTWF0aC5QSSAvIDE4MCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtZXJjYXRvclhmcm9tTG5nKGxuZzogbnVtYmVyKSB7XG4gICAgcmV0dXJuICgxODAgKyBsbmcpIC8gMzYwO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWVyY2F0b3JZZnJvbUxhdChsYXQ6IG51bWJlcikge1xuICAgIHJldHVybiAoMTgwIC0gKDE4MCAvIE1hdGguUEkgKiBNYXRoLmxvZyhNYXRoLnRhbihNYXRoLlBJIC8gNCArIGxhdCAqIE1hdGguUEkgLyAzNjApKSkpIC8gMzYwO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWVyY2F0b3JaZnJvbUFsdGl0dWRlKGFsdGl0dWRlOiBudW1iZXIsIGxhdDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIGFsdGl0dWRlIC8gY2lyY3VtZmVyZW5jZUF0TGF0aXR1ZGUobGF0KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxuZ0Zyb21NZXJjYXRvclgoeDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIHggKiAzNjAgLSAxODA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBsYXRGcm9tTWVyY2F0b3JZKHk6IG51bWJlcikge1xuICAgIGNvbnN0IHkyID0gMTgwIC0geSAqIDM2MDtcbiAgICByZXR1cm4gMzYwIC8gTWF0aC5QSSAqIE1hdGguYXRhbihNYXRoLmV4cCh5MiAqIE1hdGguUEkgLyAxODApKSAtIDkwO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYWx0aXR1ZGVGcm9tTWVyY2F0b3JaKHo6IG51bWJlciwgeTogbnVtYmVyKSB7XG4gICAgcmV0dXJuIHogKiBjaXJjdW1mZXJlbmNlQXRMYXRpdHVkZShsYXRGcm9tTWVyY2F0b3JZKHkpKTtcbn1cblxuLyoqXG4gKiBBIGBNZXJjYXRvckNvb3JkaW5hdGVgIG9iamVjdCByZXByZXNlbnRzIGEgcHJvamVjdGVkIHRocmVlIGRpbWVuc2lvbmFsIHBvc2l0aW9uLlxuICpcbiAqIGBNZXJjYXRvckNvb3JkaW5hdGVgIHVzZXMgdGhlIHdlYiBtZXJjYXRvciBwcm9qZWN0aW9uIChbRVBTRzozODU3XShodHRwczovL2Vwc2cuaW8vMzg1NykpIHdpdGggc2xpZ2h0bHkgZGlmZmVyZW50IHVuaXRzOlxuICogLSB0aGUgc2l6ZSBvZiAxIHVuaXQgaXMgdGhlIHdpZHRoIG9mIHRoZSBwcm9qZWN0ZWQgd29ybGQgaW5zdGVhZCBvZiB0aGUgXCJtZXJjYXRvciBtZXRlclwiXG4gKiAtIHRoZSBvcmlnaW4gb2YgdGhlIGNvb3JkaW5hdGUgc3BhY2UgaXMgYXQgdGhlIG5vcnRoLXdlc3QgY29ybmVyIGluc3RlYWQgb2YgdGhlIG1pZGRsZVxuICpcbiAqIEZvciBleGFtcGxlLCBgTWVyY2F0b3JDb29yZGluYXRlKDAsIDAsIDApYCBpcyB0aGUgbm9ydGgtd2VzdCBjb3JuZXIgb2YgdGhlIG1lcmNhdG9yIHdvcmxkIGFuZFxuICogYE1lcmNhdG9yQ29vcmRpbmF0ZSgxLCAxLCAwKWAgaXMgdGhlIHNvdXRoLWVhc3QgY29ybmVyLiBJZiB5b3UgYXJlIGZhbWlsaWFyIHdpdGhcbiAqIFt2ZWN0b3IgdGlsZXNdKGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvdmVjdG9yLXRpbGUtc3BlYykgaXQgbWF5IGJlIGhlbHBmdWwgdG8gdGhpbmtcbiAqIG9mIHRoZSBjb29yZGluYXRlIHNwYWNlIGFzIHRoZSBgMC8wLzBgIHRpbGUgd2l0aCBhbiBleHRlbnQgb2YgYDFgLlxuICpcbiAqIFRoZSBgemAgZGltZW5zaW9uIG9mIGBNZXJjYXRvckNvb3JkaW5hdGVgIGlzIGNvbmZvcm1hbC4gQSBjdWJlIGluIHRoZSBtZXJjYXRvciBjb29yZGluYXRlIHNwYWNlIHdvdWxkIGJlIHJlbmRlcmVkIGFzIGEgY3ViZS5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0geCBUaGUgeCBjb21wb25lbnQgb2YgdGhlIHBvc2l0aW9uLlxuICogQHBhcmFtIHtudW1iZXJ9IHkgVGhlIHkgY29tcG9uZW50IG9mIHRoZSBwb3NpdGlvbi5cbiAqIEBwYXJhbSB7bnVtYmVyfSB6IFRoZSB6IGNvbXBvbmVudCBvZiB0aGUgcG9zaXRpb24uXG4gKiBAZXhhbXBsZVxuICogdmFyIG51bGxJc2xhbmQgPSBuZXcgbWFwYm94Z2wuTWVyY2F0b3JDb29yZGluYXRlKDAuNSwgMC41LCAwKTtcbiAqXG4gKiBAc2VlIFtBZGQgYSBjdXN0b20gc3R5bGUgbGF5ZXJdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvY3VzdG9tLXN0eWxlLWxheWVyLylcbiAqL1xuY2xhc3MgTWVyY2F0b3JDb29yZGluYXRlIHtcbiAgICB4OiBudW1iZXI7XG4gICAgeTogbnVtYmVyO1xuICAgIHo6IG51bWJlcjtcblxuICAgIGNvbnN0cnVjdG9yKHg6IG51bWJlciwgeTogbnVtYmVyLCB6OiBudW1iZXIgPSAwKSB7XG4gICAgICAgIHRoaXMueCA9ICt4O1xuICAgICAgICB0aGlzLnkgPSAreTtcbiAgICAgICAgdGhpcy56ID0gK3o7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJvamVjdCBhIGBMbmdMYXRgIHRvIGEgYE1lcmNhdG9yQ29vcmRpbmF0ZWAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0xuZ0xhdExpa2V9IGxuZ0xhdExpa2UgVGhlIGxvY2F0aW9uIHRvIHByb2plY3QuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGFsdGl0dWRlIFRoZSBhbHRpdHVkZSBpbiBtZXRlcnMgb2YgdGhlIHBvc2l0aW9uLlxuICAgICAqIEByZXR1cm5zIHtNZXJjYXRvckNvb3JkaW5hdGV9IFRoZSBwcm9qZWN0ZWQgbWVyY2F0b3IgY29vcmRpbmF0ZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIHZhciBjb29yZCA9IG1hcGJveGdsLk1lcmNhdG9yQ29vcmRpbmF0ZS5mcm9tTG5nTGF0KHsgbG5nOiAwLCBsYXQ6IDB9LCAwKTtcbiAgICAgKiBjb29yZDsgLy8gTWVyY2F0b3JDb29yZGluYXRlKDAuNSwgMC41LCAwKVxuICAgICAqL1xuICAgIHN0YXRpYyBmcm9tTG5nTGF0KGxuZ0xhdExpa2U6IExuZ0xhdExpa2UsIGFsdGl0dWRlOiBudW1iZXIgPSAwKSB7XG4gICAgICAgIGNvbnN0IGxuZ0xhdCA9IExuZ0xhdC5jb252ZXJ0KGxuZ0xhdExpa2UpO1xuXG4gICAgICAgIHJldHVybiBuZXcgTWVyY2F0b3JDb29yZGluYXRlKFxuICAgICAgICAgICAgICAgIG1lcmNhdG9yWGZyb21MbmcobG5nTGF0LmxuZyksXG4gICAgICAgICAgICAgICAgbWVyY2F0b3JZZnJvbUxhdChsbmdMYXQubGF0KSxcbiAgICAgICAgICAgICAgICBtZXJjYXRvclpmcm9tQWx0aXR1ZGUoYWx0aXR1ZGUsIGxuZ0xhdC5sYXQpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBgTG5nTGF0YCBmb3IgdGhlIGNvb3JkaW5hdGUuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7TG5nTGF0fSBUaGUgYExuZ0xhdGAgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICogdmFyIGNvb3JkID0gbmV3IG1hcGJveGdsLk1lcmNhdG9yQ29vcmRpbmF0ZSgwLjUsIDAuNSwgMCk7XG4gICAgICogdmFyIGxhdExuZyA9IGNvb3JkLnRvTG5nTGF0KCk7IC8vIExuZ0xhdCgwLCAwKVxuICAgICAqL1xuICAgIHRvTG5nTGF0KCkge1xuICAgICAgICByZXR1cm4gbmV3IExuZ0xhdChcbiAgICAgICAgICAgICAgICBsbmdGcm9tTWVyY2F0b3JYKHRoaXMueCksXG4gICAgICAgICAgICAgICAgbGF0RnJvbU1lcmNhdG9yWSh0aGlzLnkpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBhbHRpdHVkZSBpbiBtZXRlcnMgb2YgdGhlIGNvb3JkaW5hdGUuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgYWx0aXR1ZGUgaW4gbWV0ZXJzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogdmFyIGNvb3JkID0gbmV3IG1hcGJveGdsLk1lcmNhdG9yQ29vcmRpbmF0ZSgwLCAwLCAwLjAyKTtcbiAgICAgKiBjb29yZC50b0FsdGl0dWRlKCk7IC8vIDY5MTQuMjgxOTU2Mjk1MzM5XG4gICAgICovXG4gICAgdG9BbHRpdHVkZSgpIHtcbiAgICAgICAgcmV0dXJuIGFsdGl0dWRlRnJvbU1lcmNhdG9yWih0aGlzLnosIHRoaXMueSk7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBNZXJjYXRvckNvb3JkaW5hdGU7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge2dldFRpbGVCQm94fSBmcm9tICdAbWFwYm94L3dob290cy1qcyc7XG5pbXBvcnQgRVhURU5UIGZyb20gJy4uL2RhdGEvZXh0ZW50JztcbmltcG9ydCBQb2ludCBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcbmltcG9ydCBNZXJjYXRvckNvb3JkaW5hdGUgZnJvbSAnLi4vZ2VvL21lcmNhdG9yX2Nvb3JkaW5hdGUnO1xuXG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgeyByZWdpc3RlciB9IGZyb20gJy4uL3V0aWwvd2ViX3dvcmtlcl90cmFuc2Zlcic7XG5cbmV4cG9ydCBjbGFzcyBDYW5vbmljYWxUaWxlSUQge1xuICAgIHo6IG51bWJlcjtcbiAgICB4OiBudW1iZXI7XG4gICAgeTogbnVtYmVyO1xuICAgIGtleTogbnVtYmVyO1xuXG4gICAgY29uc3RydWN0b3IoejogbnVtYmVyLCB4OiBudW1iZXIsIHk6IG51bWJlcikge1xuICAgICAgICBhc3NlcnQoeiA+PSAwICYmIHogPD0gMjUpO1xuICAgICAgICBhc3NlcnQoeCA+PSAwICYmIHggPCBNYXRoLnBvdygyLCB6KSk7XG4gICAgICAgIGFzc2VydCh5ID49IDAgJiYgeSA8IE1hdGgucG93KDIsIHopKTtcbiAgICAgICAgdGhpcy56ID0gejtcbiAgICAgICAgdGhpcy54ID0geDtcbiAgICAgICAgdGhpcy55ID0geTtcbiAgICAgICAgdGhpcy5rZXkgPSBjYWxjdWxhdGVLZXkoMCwgeiwgeCwgeSk7XG4gICAgfVxuXG4gICAgZXF1YWxzKGlkOiBDYW5vbmljYWxUaWxlSUQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMueiA9PT0gaWQueiAmJiB0aGlzLnggPT09IGlkLnggJiYgdGhpcy55ID09PSBpZC55O1xuICAgIH1cblxuICAgIC8vIGdpdmVuIGEgbGlzdCBvZiB1cmxzLCBjaG9vc2UgYSB1cmwgdGVtcGxhdGUgYW5kIHJldHVybiBhIHRpbGUgVVJMXG4gICAgdXJsKHVybHM6IEFycmF5PHN0cmluZz4sIHNjaGVtZTogP3N0cmluZykge1xuICAgICAgICBjb25zdCBiYm94ID0gZ2V0VGlsZUJCb3godGhpcy54LCB0aGlzLnksIHRoaXMueik7XG4gICAgICAgIGNvbnN0IHF1YWRrZXkgPSBnZXRRdWFka2V5KHRoaXMueiwgdGhpcy54LCB0aGlzLnkpO1xuXG4gICAgICAgIHJldHVybiB1cmxzWyh0aGlzLnggKyB0aGlzLnkpICUgdXJscy5sZW5ndGhdXG4gICAgICAgICAgICAucmVwbGFjZSgne3ByZWZpeH0nLCAodGhpcy54ICUgMTYpLnRvU3RyaW5nKDE2KSArICh0aGlzLnkgJSAxNikudG9TdHJpbmcoMTYpKVxuICAgICAgICAgICAgLnJlcGxhY2UoJ3t6fScsIFN0cmluZyh0aGlzLnopKVxuICAgICAgICAgICAgLnJlcGxhY2UoJ3t4fScsIFN0cmluZyh0aGlzLngpKVxuICAgICAgICAgICAgLnJlcGxhY2UoJ3t5fScsIFN0cmluZyhzY2hlbWUgPT09ICd0bXMnID8gKE1hdGgucG93KDIsIHRoaXMueikgLSB0aGlzLnkgLSAxKSA6IHRoaXMueSkpXG4gICAgICAgICAgICAucmVwbGFjZSgne3F1YWRrZXl9JywgcXVhZGtleSlcbiAgICAgICAgICAgIC5yZXBsYWNlKCd7YmJveC1lcHNnLTM4NTd9JywgYmJveCk7XG4gICAgfVxuXG4gICAgZ2V0VGlsZVBvaW50KGNvb3JkOiBNZXJjYXRvckNvb3JkaW5hdGUpIHtcbiAgICAgICAgY29uc3QgdGlsZXNBdFpvb20gPSBNYXRoLnBvdygyLCB0aGlzLnopO1xuICAgICAgICByZXR1cm4gbmV3IFBvaW50KFxuICAgICAgICAgICAgKGNvb3JkLnggKiB0aWxlc0F0Wm9vbSAtIHRoaXMueCkgKiBFWFRFTlQsXG4gICAgICAgICAgICAoY29vcmQueSAqIHRpbGVzQXRab29tIC0gdGhpcy55KSAqIEVYVEVOVCk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgVW53cmFwcGVkVGlsZUlEIHtcbiAgICB3cmFwOiBudW1iZXI7XG4gICAgY2Fub25pY2FsOiBDYW5vbmljYWxUaWxlSUQ7XG4gICAga2V5OiBudW1iZXI7XG5cbiAgICBjb25zdHJ1Y3Rvcih3cmFwOiBudW1iZXIsIGNhbm9uaWNhbDogQ2Fub25pY2FsVGlsZUlEKSB7XG4gICAgICAgIHRoaXMud3JhcCA9IHdyYXA7XG4gICAgICAgIHRoaXMuY2Fub25pY2FsID0gY2Fub25pY2FsO1xuICAgICAgICB0aGlzLmtleSA9IGNhbGN1bGF0ZUtleSh3cmFwLCBjYW5vbmljYWwueiwgY2Fub25pY2FsLngsIGNhbm9uaWNhbC55KTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBPdmVyc2NhbGVkVGlsZUlEIHtcbiAgICBvdmVyc2NhbGVkWjogbnVtYmVyO1xuICAgIHdyYXA6IG51bWJlcjtcbiAgICBjYW5vbmljYWw6IENhbm9uaWNhbFRpbGVJRDtcbiAgICBrZXk6IG51bWJlcjtcbiAgICBwb3NNYXRyaXg6IEZsb2F0MzJBcnJheTtcblxuICAgIGNvbnN0cnVjdG9yKG92ZXJzY2FsZWRaOiBudW1iZXIsIHdyYXA6IG51bWJlciwgejogbnVtYmVyLCB4OiBudW1iZXIsIHk6IG51bWJlcikge1xuICAgICAgICBhc3NlcnQob3ZlcnNjYWxlZFogPj0geik7XG4gICAgICAgIHRoaXMub3ZlcnNjYWxlZFogPSBvdmVyc2NhbGVkWjtcbiAgICAgICAgdGhpcy53cmFwID0gd3JhcDtcbiAgICAgICAgdGhpcy5jYW5vbmljYWwgPSBuZXcgQ2Fub25pY2FsVGlsZUlEKHosICt4LCAreSk7XG4gICAgICAgIHRoaXMua2V5ID0gY2FsY3VsYXRlS2V5KHdyYXAsIG92ZXJzY2FsZWRaLCB4LCB5KTtcbiAgICB9XG5cbiAgICBlcXVhbHMoaWQ6IE92ZXJzY2FsZWRUaWxlSUQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3ZlcnNjYWxlZFogPT09IGlkLm92ZXJzY2FsZWRaICYmIHRoaXMud3JhcCA9PT0gaWQud3JhcCAmJiB0aGlzLmNhbm9uaWNhbC5lcXVhbHMoaWQuY2Fub25pY2FsKTtcbiAgICB9XG5cbiAgICBzY2FsZWRUbyh0YXJnZXRaOiBudW1iZXIpIHtcbiAgICAgICAgYXNzZXJ0KHRhcmdldFogPD0gdGhpcy5vdmVyc2NhbGVkWik7XG4gICAgICAgIGNvbnN0IHpEaWZmZXJlbmNlID0gdGhpcy5jYW5vbmljYWwueiAtIHRhcmdldFo7XG4gICAgICAgIGlmICh0YXJnZXRaID4gdGhpcy5jYW5vbmljYWwueikge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBPdmVyc2NhbGVkVGlsZUlEKHRhcmdldFosIHRoaXMud3JhcCwgdGhpcy5jYW5vbmljYWwueiwgdGhpcy5jYW5vbmljYWwueCwgdGhpcy5jYW5vbmljYWwueSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IE92ZXJzY2FsZWRUaWxlSUQodGFyZ2V0WiwgdGhpcy53cmFwLCB0YXJnZXRaLCB0aGlzLmNhbm9uaWNhbC54ID4+IHpEaWZmZXJlbmNlLCB0aGlzLmNhbm9uaWNhbC55ID4+IHpEaWZmZXJlbmNlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlzQ2hpbGRPZihwYXJlbnQ6IE92ZXJzY2FsZWRUaWxlSUQpIHtcbiAgICAgICAgaWYgKHBhcmVudC53cmFwICE9PSB0aGlzLndyYXApIHtcbiAgICAgICAgICAgIC8vIFdlIGNhbid0IGJlIGEgY2hpbGQgaWYgd2UncmUgaW4gYSBkaWZmZXJlbnQgd29ybGQgY29weVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHpEaWZmZXJlbmNlID0gdGhpcy5jYW5vbmljYWwueiAtIHBhcmVudC5jYW5vbmljYWwuejtcbiAgICAgICAgLy8gV2UncmUgZmlyc3QgdGVzdGluZyBmb3IgeiA9PSAwLCB0byBhdm9pZCBhIDMyIGJpdCBzaGlmdCwgd2hpY2ggaXMgdW5kZWZpbmVkLlxuICAgICAgICByZXR1cm4gcGFyZW50Lm92ZXJzY2FsZWRaID09PSAwIHx8IChcbiAgICAgICAgICAgIHBhcmVudC5vdmVyc2NhbGVkWiA8IHRoaXMub3ZlcnNjYWxlZFogJiZcbiAgICAgICAgICAgICAgICBwYXJlbnQuY2Fub25pY2FsLnggPT09ICh0aGlzLmNhbm9uaWNhbC54ID4+IHpEaWZmZXJlbmNlKSAmJlxuICAgICAgICAgICAgICAgIHBhcmVudC5jYW5vbmljYWwueSA9PT0gKHRoaXMuY2Fub25pY2FsLnkgPj4gekRpZmZlcmVuY2UpKTtcbiAgICB9XG5cbiAgICBjaGlsZHJlbihzb3VyY2VNYXhab29tOiBudW1iZXIpIHtcbiAgICAgICAgaWYgKHRoaXMub3ZlcnNjYWxlZFogPj0gc291cmNlTWF4Wm9vbSkge1xuICAgICAgICAgICAgLy8gcmV0dXJuIGEgc2luZ2xlIHRpbGUgY29vcmQgcmVwcmVzZW50aW5nIGEgYW4gb3ZlcnNjYWxlZCB0aWxlXG4gICAgICAgICAgICByZXR1cm4gW25ldyBPdmVyc2NhbGVkVGlsZUlEKHRoaXMub3ZlcnNjYWxlZFogKyAxLCB0aGlzLndyYXAsIHRoaXMuY2Fub25pY2FsLnosIHRoaXMuY2Fub25pY2FsLngsIHRoaXMuY2Fub25pY2FsLnkpXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHogPSB0aGlzLmNhbm9uaWNhbC56ICsgMTtcbiAgICAgICAgY29uc3QgeCA9IHRoaXMuY2Fub25pY2FsLnggKiAyO1xuICAgICAgICBjb25zdCB5ID0gdGhpcy5jYW5vbmljYWwueSAqIDI7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBuZXcgT3ZlcnNjYWxlZFRpbGVJRCh6LCB0aGlzLndyYXAsIHosIHgsIHkpLFxuICAgICAgICAgICAgbmV3IE92ZXJzY2FsZWRUaWxlSUQoeiwgdGhpcy53cmFwLCB6LCB4ICsgMSwgeSksXG4gICAgICAgICAgICBuZXcgT3ZlcnNjYWxlZFRpbGVJRCh6LCB0aGlzLndyYXAsIHosIHgsIHkgKyAxKSxcbiAgICAgICAgICAgIG5ldyBPdmVyc2NhbGVkVGlsZUlEKHosIHRoaXMud3JhcCwgeiwgeCArIDEsIHkgKyAxKVxuICAgICAgICBdO1xuICAgIH1cblxuICAgIGlzTGVzc1RoYW4ocmhzOiBPdmVyc2NhbGVkVGlsZUlEKSB7XG4gICAgICAgIGlmICh0aGlzLndyYXAgPCByaHMud3JhcCkgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmICh0aGlzLndyYXAgPiByaHMud3JhcCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGlmICh0aGlzLm92ZXJzY2FsZWRaIDwgcmhzLm92ZXJzY2FsZWRaKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKHRoaXMub3ZlcnNjYWxlZFogPiByaHMub3ZlcnNjYWxlZFopIHJldHVybiBmYWxzZTtcblxuICAgICAgICBpZiAodGhpcy5jYW5vbmljYWwueCA8IHJocy5jYW5vbmljYWwueCkgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmICh0aGlzLmNhbm9uaWNhbC54ID4gcmhzLmNhbm9uaWNhbC54KSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgaWYgKHRoaXMuY2Fub25pY2FsLnkgPCByaHMuY2Fub25pY2FsLnkpIHJldHVybiB0cnVlO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgd3JhcHBlZCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBPdmVyc2NhbGVkVGlsZUlEKHRoaXMub3ZlcnNjYWxlZFosIDAsIHRoaXMuY2Fub25pY2FsLnosIHRoaXMuY2Fub25pY2FsLngsIHRoaXMuY2Fub25pY2FsLnkpO1xuICAgIH1cblxuICAgIHVud3JhcFRvKHdyYXA6IG51bWJlcikge1xuICAgICAgICByZXR1cm4gbmV3IE92ZXJzY2FsZWRUaWxlSUQodGhpcy5vdmVyc2NhbGVkWiwgd3JhcCwgdGhpcy5jYW5vbmljYWwueiwgdGhpcy5jYW5vbmljYWwueCwgdGhpcy5jYW5vbmljYWwueSk7XG4gICAgfVxuXG4gICAgb3ZlcnNjYWxlRmFjdG9yKCkge1xuICAgICAgICByZXR1cm4gTWF0aC5wb3coMiwgdGhpcy5vdmVyc2NhbGVkWiAtIHRoaXMuY2Fub25pY2FsLnopO1xuICAgIH1cblxuICAgIHRvVW53cmFwcGVkKCkge1xuICAgICAgICByZXR1cm4gbmV3IFVud3JhcHBlZFRpbGVJRCh0aGlzLndyYXAsIHRoaXMuY2Fub25pY2FsKTtcbiAgICB9XG5cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIGAke3RoaXMub3ZlcnNjYWxlZFp9LyR7dGhpcy5jYW5vbmljYWwueH0vJHt0aGlzLmNhbm9uaWNhbC55fWA7XG4gICAgfVxuXG4gICAgZ2V0VGlsZVBvaW50KGNvb3JkOiBNZXJjYXRvckNvb3JkaW5hdGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2Fub25pY2FsLmdldFRpbGVQb2ludChuZXcgTWVyY2F0b3JDb29yZGluYXRlKGNvb3JkLnggLSB0aGlzLndyYXAsIGNvb3JkLnkpKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGNhbGN1bGF0ZUtleSh3cmFwOiBudW1iZXIsIHo6IG51bWJlciwgeDogbnVtYmVyLCB5OiBudW1iZXIpIHtcbiAgICB3cmFwICo9IDI7XG4gICAgaWYgKHdyYXAgPCAwKSB3cmFwID0gd3JhcCAqIC0xIC0gMTtcbiAgICBjb25zdCBkaW0gPSAxIDw8IHo7XG4gICAgcmV0dXJuICgoZGltICogZGltICogd3JhcCArIGRpbSAqIHkgKyB4KSAqIDMyKSArIHo7XG59XG5cblxuZnVuY3Rpb24gZ2V0UXVhZGtleSh6LCB4LCB5KSB7XG4gICAgbGV0IHF1YWRrZXkgPSAnJywgbWFzaztcbiAgICBmb3IgKGxldCBpID0gejsgaSA+IDA7IGktLSkge1xuICAgICAgICBtYXNrID0gMSA8PCAoaSAtIDEpO1xuICAgICAgICBxdWFka2V5ICs9ICgoeCAmIG1hc2sgPyAxIDogMCkgKyAoeSAmIG1hc2sgPyAyIDogMCkpO1xuICAgIH1cbiAgICByZXR1cm4gcXVhZGtleTtcbn1cblxucmVnaXN0ZXIoJ0Nhbm9uaWNhbFRpbGVJRCcsIENhbm9uaWNhbFRpbGVJRCk7XG5yZWdpc3RlcignT3ZlcnNjYWxlZFRpbGVJRCcsIE92ZXJzY2FsZWRUaWxlSUQsIHtvbWl0OiBbJ3Bvc01hdHJpeCddfSk7XG4iLCIvLyBAZmxvd1xuaW1wb3J0IHsgUkdCQUltYWdlIH0gZnJvbSAnLi4vdXRpbC9pbWFnZSc7XG5cbmltcG9ydCB7IHdhcm5PbmNlIH0gZnJvbSAnLi4vdXRpbC91dGlsJztcbmltcG9ydCB7IHJlZ2lzdGVyIH0gZnJvbSAnLi4vdXRpbC93ZWJfd29ya2VyX3RyYW5zZmVyJztcblxuLy8gREVNRGF0YSBpcyBhIGRhdGEgc3RydWN0dXJlIGZvciBkZWNvZGluZywgYmFja2ZpbGxpbmcsIGFuZCBzdG9yaW5nIGVsZXZhdGlvbiBkYXRhIGZvciBwcm9jZXNzaW5nIGluIHRoZSBoaWxsc2hhZGUgc2hhZGVyc1xuLy8gZGF0YSBjYW4gYmUgcG9wdWxhdGVkIGVpdGhlciBmcm9tIGEgcG5ncmF3IGltYWdlIHRpbGUgb3IgZnJvbSBzZXJsaWF6ZWQgZGF0YSBzZW50IGJhY2sgZnJvbSBhIHdvcmtlci4gV2hlbiBkYXRhIGlzIGluaXRpYWxseVxuLy8gbG9hZGVkIGZyb20gYSBpbWFnZSB0aWxlLCB3ZSBkZWNvZGUgdGhlIHBpeGVsIHZhbHVlcyB1c2luZyB0aGUgYXBwcm9wcmlhdGUgZGVjb2RpbmcgZm9ybXVsYSwgYnV0IHdlIHN0b3JlIHRoZVxuLy8gZWxldmF0aW9uIGRhdGEgYXMgYW4gSW50MzIgdmFsdWUuIHdlIGFkZCA2NTUzNiAoMl4xNikgdG8gZWxpbWluYXRlIG5lZ2F0aXZlIHZhbHVlcyBhbmQgZW5hYmxlIHRoZSB1c2Ugb2Zcbi8vIGludGVnZXIgb3ZlcmZsb3cgd2hlbiBjcmVhdGluZyB0aGUgdGV4dHVyZSB1c2VkIGluIHRoZSBoaWxsc2hhZGVQcmVwYXJlIHN0ZXAuXG5cbi8vIERFTURhdGEgYWxzbyBoYW5kbGVzIHRoZSBiYWNrZmlsbGluZyBvZiBkYXRhIGZyb20gYSB0aWxlJ3MgbmVpZ2hib3JpbmcgdGlsZXMuIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugd2UgdXNlIGEgcGl4ZWwncyA4XG4vLyBzdXJyb3VuZGluZyBwaXhlbCB2YWx1ZXMgdG8gY29tcHV0ZSB0aGUgc2xvcGUgYXQgdGhhdCBwaXhlbCwgYW5kIHdlIGNhbm5vdCBhY2N1cmF0ZWx5IGNhbGN1bGF0ZSB0aGUgc2xvcGUgYXQgcGl4ZWxzIG9uIGFcbi8vIHRpbGUncyBlZGdlIHdpdGhvdXQgYmFja2ZpbGxpbmcgZnJvbSBuZWlnaGJvcmluZyB0aWxlcy5cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgREVNRGF0YSB7XG4gICAgdWlkOiBzdHJpbmc7XG4gICAgZGF0YTogSW50MzJBcnJheTtcbiAgICBzdHJpZGU6IG51bWJlcjtcbiAgICBkaW06IG51bWJlcjtcblxuICAgIGNvbnN0cnVjdG9yKHVpZDogc3RyaW5nLCBkYXRhOiBSR0JBSW1hZ2UsIGVuY29kaW5nOiBcIm1hcGJveFwiIHwgXCJ0ZXJyYXJpdW1cIikge1xuICAgICAgICB0aGlzLnVpZCA9IHVpZDtcbiAgICAgICAgaWYgKGRhdGEuaGVpZ2h0ICE9PSBkYXRhLndpZHRoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignREVNIHRpbGVzIG11c3QgYmUgc3F1YXJlJyk7XG4gICAgICAgIGlmIChlbmNvZGluZyAmJiBlbmNvZGluZyAhPT0gXCJtYXBib3hcIiAmJiBlbmNvZGluZyAhPT0gXCJ0ZXJyYXJpdW1cIikgcmV0dXJuIHdhcm5PbmNlKFxuICAgICAgICAgICAgYFwiJHtlbmNvZGluZ31cIiBpcyBub3QgYSB2YWxpZCBlbmNvZGluZyB0eXBlLiBWYWxpZCB0eXBlcyBpbmNsdWRlIFwibWFwYm94XCIgYW5kIFwidGVycmFyaXVtXCIuYFxuICAgICAgICApO1xuICAgICAgICBjb25zdCBkaW0gPSB0aGlzLmRpbSA9IGRhdGEuaGVpZ2h0O1xuICAgICAgICB0aGlzLnN0cmlkZSA9IHRoaXMuZGltICsgMjtcbiAgICAgICAgdGhpcy5kYXRhID0gbmV3IEludDMyQXJyYXkodGhpcy5zdHJpZGUgKiB0aGlzLnN0cmlkZSk7XG5cbiAgICAgICAgY29uc3QgcGl4ZWxzID0gZGF0YS5kYXRhO1xuICAgICAgICBjb25zdCB1bnBhY2sgPSBlbmNvZGluZyA9PT0gXCJ0ZXJyYXJpdW1cIiA/IHRoaXMuX3VucGFja1RlcnJhcml1bSA6IHRoaXMuX3VucGFja01hcGJveDtcbiAgICAgICAgZm9yIChsZXQgeSA9IDA7IHkgPCBkaW07IHkrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCBkaW07IHgrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGkgPSB5ICogZGltICsgeDtcbiAgICAgICAgICAgICAgICBjb25zdCBqID0gaSAqIDQ7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXQoeCwgeSwgdW5wYWNrKHBpeGVsc1tqXSwgcGl4ZWxzW2ogKyAxXSwgcGl4ZWxzW2ogKyAyXSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gaW4gb3JkZXIgdG8gYXZvaWQgZmxhc2hpbmcgc2VhbXMgYmV0d2VlbiB0aWxlcywgaGVyZSB3ZSBhcmUgaW5pdGlhbGx5IHBvcHVsYXRpbmcgYSAxcHggYm9yZGVyIG9mIHBpeGVscyBhcm91bmQgdGhlIGltYWdlXG4gICAgICAgIC8vIHdpdGggdGhlIGRhdGEgb2YgdGhlIG5lYXJlc3QgcGl4ZWwgZnJvbSB0aGUgaW1hZ2UuIHRoaXMgZGF0YSBpcyBldmVudHVhbGx5IHJlcGxhY2VkIHdoZW4gdGhlIHRpbGUncyBuZWlnaGJvcmluZ1xuICAgICAgICAvLyB0aWxlcyBhcmUgbG9hZGVkIGFuZCB0aGUgYWNjdXJhdGUgZGF0YSBjYW4gYmUgYmFja2ZpbGxlZCB1c2luZyBERU1EYXRhI2JhY2tmaWxsQm9yZGVyXG4gICAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgZGltOyB4KyspIHtcbiAgICAgICAgICAgIC8vIGxlZnQgdmVydGljYWwgYm9yZGVyXG4gICAgICAgICAgICB0aGlzLnNldCgtMSwgeCwgdGhpcy5nZXQoMCwgeCkpO1xuICAgICAgICAgICAgLy8gcmlnaHQgdmVydGljYWwgYm9yZGVyXG4gICAgICAgICAgICB0aGlzLnNldChkaW0sIHgsIHRoaXMuZ2V0KGRpbSAtIDEsIHgpKTtcbiAgICAgICAgICAgIC8vIGxlZnQgaG9yaXpvbnRhbCBib3JkZXJcbiAgICAgICAgICAgIHRoaXMuc2V0KHgsIC0xLCB0aGlzLmdldCh4LCAwKSk7XG4gICAgICAgICAgICAvLyByaWdodCBob3Jpem9udGFsIGJvcmRlclxuICAgICAgICAgICAgdGhpcy5zZXQoeCwgZGltLCB0aGlzLmdldCh4LCBkaW0gLSAxKSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gY29ybmVyc1xuICAgICAgICB0aGlzLnNldCgtMSwgLTEsIHRoaXMuZ2V0KDAsIDApKTtcbiAgICAgICAgdGhpcy5zZXQoZGltLCAtMSwgdGhpcy5nZXQoZGltIC0gMSwgMCkpO1xuICAgICAgICB0aGlzLnNldCgtMSwgZGltLCB0aGlzLmdldCgwLCBkaW0gLSAxKSk7XG4gICAgICAgIHRoaXMuc2V0KGRpbSwgZGltLCB0aGlzLmdldChkaW0gLSAxLCBkaW0gLSAxKSk7XG4gICAgfVxuXG4gICAgc2V0KHg6IG51bWJlciwgeTogbnVtYmVyLCB2YWx1ZTogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuZGF0YVt0aGlzLl9pZHgoeCwgeSldID0gdmFsdWUgKyA2NTUzNjtcbiAgICB9XG5cbiAgICBnZXQoeDogbnVtYmVyLCB5OiBudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YVt0aGlzLl9pZHgoeCwgeSldIC0gNjU1MzY7XG4gICAgfVxuXG4gICAgX2lkeCh4OiBudW1iZXIsIHk6IG51bWJlcikge1xuICAgICAgICBpZiAoeCA8IC0xIHx8IHggPj0gdGhpcy5kaW0gKyAxIHx8ICB5IDwgLTEgfHwgeSA+PSB0aGlzLmRpbSArIDEpIHRocm93IG5ldyBSYW5nZUVycm9yKCdvdXQgb2YgcmFuZ2Ugc291cmNlIGNvb3JkaW5hdGVzIGZvciBERU0gZGF0YScpO1xuICAgICAgICByZXR1cm4gKHkgKyAxKSAqIHRoaXMuc3RyaWRlICsgKHggKyAxKTtcbiAgICB9XG5cbiAgICBfdW5wYWNrTWFwYm94KHI6IG51bWJlciwgZzogbnVtYmVyLCBiOiBudW1iZXIpIHtcbiAgICAgICAgLy8gdW5wYWNraW5nIGZvcm11bGEgZm9yIG1hcGJveC50ZXJyYWluLXJnYjpcbiAgICAgICAgLy8gaHR0cHM6Ly93d3cubWFwYm94LmNvbS9oZWxwL2FjY2Vzcy1lbGV2YXRpb24tZGF0YS8jbWFwYm94LXRlcnJhaW4tcmdiXG4gICAgICAgIHJldHVybiAoKHIgKiAyNTYgKiAyNTYgKyBnICogMjU2LjAgKyBiKSAvIDEwLjAgLSAxMDAwMC4wKTtcbiAgICB9XG5cbiAgICBfdW5wYWNrVGVycmFyaXVtKHI6IG51bWJlciwgZzogbnVtYmVyLCBiOiBudW1iZXIpIHtcbiAgICAgICAgLy8gdW5wYWNraW5nIGZvcm11bGEgZm9yIG1hcHplbiB0ZXJyYXJpdW06XG4gICAgICAgIC8vIGh0dHBzOi8vYXdzLmFtYXpvbi5jb20vcHVibGljLWRhdGFzZXRzL3RlcnJhaW4vXG4gICAgICAgIHJldHVybiAoKHIgKiAyNTYgKyBnICsgYiAvIDI1NikgLSAzMjc2OC4wKTtcbiAgICB9XG5cbiAgICBnZXRQaXhlbHMoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUkdCQUltYWdlKHt3aWR0aDogdGhpcy5zdHJpZGUsIGhlaWdodDogdGhpcy5zdHJpZGV9LCBuZXcgVWludDhBcnJheSh0aGlzLmRhdGEuYnVmZmVyKSk7XG4gICAgfVxuXG4gICAgYmFja2ZpbGxCb3JkZXIoYm9yZGVyVGlsZTogREVNRGF0YSwgZHg6IG51bWJlciwgZHk6IG51bWJlcikge1xuICAgICAgICBpZiAodGhpcy5kaW0gIT09IGJvcmRlclRpbGUuZGltKSB0aHJvdyBuZXcgRXJyb3IoJ2RlbSBkaW1lbnNpb24gbWlzbWF0Y2gnKTtcblxuICAgICAgICBsZXQgeE1pbiA9IGR4ICogdGhpcy5kaW0sXG4gICAgICAgICAgICB4TWF4ID0gZHggKiB0aGlzLmRpbSArIHRoaXMuZGltLFxuICAgICAgICAgICAgeU1pbiA9IGR5ICogdGhpcy5kaW0sXG4gICAgICAgICAgICB5TWF4ID0gZHkgKiB0aGlzLmRpbSArIHRoaXMuZGltO1xuXG4gICAgICAgIHN3aXRjaCAoZHgpIHtcbiAgICAgICAgY2FzZSAtMTpcbiAgICAgICAgICAgIHhNaW4gPSB4TWF4IC0gMTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICB4TWF4ID0geE1pbiArIDE7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHN3aXRjaCAoZHkpIHtcbiAgICAgICAgY2FzZSAtMTpcbiAgICAgICAgICAgIHlNaW4gPSB5TWF4IC0gMTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICB5TWF4ID0geU1pbiArIDE7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG94ID0gLWR4ICogdGhpcy5kaW07XG4gICAgICAgIGNvbnN0IG95ID0gLWR5ICogdGhpcy5kaW07XG4gICAgICAgIGZvciAobGV0IHkgPSB5TWluOyB5IDwgeU1heDsgeSsrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCB4ID0geE1pbjsgeCA8IHhNYXg7IHgrKykge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0KHgsIHksIGJvcmRlclRpbGUuZ2V0KHggKyBveCwgeSArIG95KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbnJlZ2lzdGVyKCdERU1EYXRhJywgREVNRGF0YSk7XG4iLCIvLyBAZmxvd1xuaW1wb3J0IHsgY3JlYXRlTGF5b3V0IH0gZnJvbSAnLi4vdXRpbC9zdHJ1Y3RfYXJyYXknO1xuXG5leHBvcnQgZGVmYXVsdCBjcmVhdGVMYXlvdXQoW1xuICAgIHsgbmFtZTogJ2FfcG9zJywgdHlwZTogJ0ludDE2JywgY29tcG9uZW50czogMiB9LFxuICAgIHsgbmFtZTogJ2FfdGV4dHVyZV9wb3MnLCB0eXBlOiAnSW50MTYnLCBjb21wb25lbnRzOiAyIH1cbl0pO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHR5cGUge0NvbGxpc2lvbkJveEFycmF5fSBmcm9tICcuL2FycmF5X3R5cGVzJztcbmltcG9ydCB0eXBlIFN0eWxlIGZyb20gJy4uL3N0eWxlL3N0eWxlJztcbmltcG9ydCB0eXBlIHtUeXBlZFN0eWxlTGF5ZXJ9IGZyb20gJy4uL3N0eWxlL3N0eWxlX2xheWVyL3R5cGVkX3N0eWxlX2xheWVyJztcbmltcG9ydCB0eXBlIEZlYXR1cmVJbmRleCBmcm9tICcuL2ZlYXR1cmVfaW5kZXgnO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tICcuLi9nbC9jb250ZXh0JztcbmltcG9ydCB0eXBlIHtGZWF0dXJlU3RhdGVzfSBmcm9tICcuLi9zb3VyY2Uvc291cmNlX3N0YXRlJztcbmltcG9ydCB0eXBlIHtJbWFnZVBvc2l0aW9ufSBmcm9tICcuLi9yZW5kZXIvaW1hZ2VfYXRsYXMnO1xuXG5leHBvcnQgdHlwZSBCdWNrZXRQYXJhbWV0ZXJzPExheWVyOiBUeXBlZFN0eWxlTGF5ZXI+ID0ge1xuICAgIGluZGV4OiBudW1iZXIsXG4gICAgbGF5ZXJzOiBBcnJheTxMYXllcj4sXG4gICAgem9vbTogbnVtYmVyLFxuICAgIHBpeGVsUmF0aW86IG51bWJlcixcbiAgICBvdmVyc2NhbGluZzogbnVtYmVyLFxuICAgIGNvbGxpc2lvbkJveEFycmF5OiBDb2xsaXNpb25Cb3hBcnJheSxcbiAgICBzb3VyY2VMYXllckluZGV4OiBudW1iZXIsXG4gICAgc291cmNlSUQ6IHN0cmluZ1xufVxuXG5leHBvcnQgdHlwZSBQb3B1bGF0ZVBhcmFtZXRlcnMgPSB7XG4gICAgZmVhdHVyZUluZGV4OiBGZWF0dXJlSW5kZXgsXG4gICAgaWNvbkRlcGVuZGVuY2llczoge30sXG4gICAgcGF0dGVybkRlcGVuZGVuY2llczoge30sXG4gICAgZ2x5cGhEZXBlbmRlbmNpZXM6IHt9XG59XG5cbmV4cG9ydCB0eXBlIEluZGV4ZWRGZWF0dXJlID0ge1xuICAgIGZlYXR1cmU6IFZlY3RvclRpbGVGZWF0dXJlLFxuICAgIGluZGV4OiBudW1iZXIsXG4gICAgc291cmNlTGF5ZXJJbmRleDogbnVtYmVyLFxufVxuXG5leHBvcnQgdHlwZSBCdWNrZXRGZWF0dXJlID0ge3xcbiAgICBpbmRleDogbnVtYmVyLFxuICAgIHNvdXJjZUxheWVySW5kZXg6IG51bWJlcixcbiAgICBnZW9tZXRyeTogQXJyYXk8QXJyYXk8UG9pbnQ+PixcbiAgICBwcm9wZXJ0aWVzOiBPYmplY3QsXG4gICAgdHlwZTogMSB8IDIgfCAzLFxuICAgIGlkPzogYW55LFxuICAgICtwYXR0ZXJuczoge1tzdHJpbmddOiB7XCJtaW5cIjogc3RyaW5nLCBcIm1pZFwiOiBzdHJpbmcsIFwibWF4XCI6IHN0cmluZ319XG58fTtcblxuLyoqXG4gKiBUaGUgYEJ1Y2tldGAgaW50ZXJmYWNlIGlzIHRoZSBzaW5nbGUgcG9pbnQgb2Yga25vd2xlZGdlIGFib3V0IHR1cm5pbmcgdmVjdG9yXG4gKiB0aWxlcyBpbnRvIFdlYkdMIGJ1ZmZlcnMuXG4gKlxuICogYEJ1Y2tldGAgaXMgYW4gYWJzdHJhY3QgaW50ZXJmYWNlLiBBbiBpbXBsZW1lbnRhdGlvbiBleGlzdHMgZm9yIGVhY2ggc3R5bGUgbGF5ZXIgdHlwZS5cbiAqIENyZWF0ZSBhIGJ1Y2tldCB2aWEgdGhlIGBTdHlsZUxheWVyI2NyZWF0ZUJ1Y2tldGAgbWV0aG9kLlxuICpcbiAqIFRoZSBjb25jcmV0ZSBidWNrZXQgdHlwZXMsIHVzaW5nIGxheW91dCBvcHRpb25zIGZyb20gdGhlIHN0eWxlIGxheWVyLFxuICogdHJhbnNmb3JtIGZlYXR1cmUgZ2VvbWV0cmllcyBpbnRvIHZlcnRleCBhbmQgaW5kZXggZGF0YSBmb3IgdXNlIGJ5IHRoZVxuICogdmVydGV4IHNoYWRlci4gIFRoZXkgYWxzbyAodmlhIGBQcm9ncmFtQ29uZmlndXJhdGlvbmApIHVzZSBmZWF0dXJlXG4gKiBwcm9wZXJ0aWVzIGFuZCB0aGUgem9vbSBsZXZlbCB0byBwb3B1bGF0ZSB0aGUgYXR0cmlidXRlcyBuZWVkZWQgZm9yXG4gKiBkYXRhLWRyaXZlbiBzdHlsaW5nLlxuICpcbiAqIEJ1Y2tldHMgYXJlIGRlc2lnbmVkIHRvIGJlIGJ1aWx0IG9uIGEgd29ya2VyIHRocmVhZCBhbmQgdGhlbiBzZXJpYWxpemVkIGFuZFxuICogdHJhbnNmZXJyZWQgYmFjayB0byB0aGUgbWFpbiB0aHJlYWQgZm9yIHJlbmRlcmluZy4gIE9uIHRoZSB3b3JrZXIgc2lkZSwgYVxuICogYnVja2V0J3MgdmVydGV4LCBpbmRleCwgYW5kIGF0dHJpYnV0ZSBkYXRhIGlzIHN0b3JlZCBpbiBgYnVja2V0LmFycmF5czpcbiAqIEFycmF5R3JvdXBgLiAgV2hlbiBhIGJ1Y2tldCdzIGRhdGEgaXMgc2VyaWFsaXplZCBhbmQgc2VudCBiYWNrIHRvIHRoZSBtYWluXG4gKiB0aHJlYWQsIGlzIGdldHMgZGVzZXJpYWxpemVkICh1c2luZyBgbmV3IEJ1Y2tldChzZXJpYWxpemVkQnVja2V0RGF0YSlgLCB3aXRoXG4gKiB0aGUgYXJyYXkgZGF0YSBub3cgc3RvcmVkIGluIGBidWNrZXQuYnVmZmVyczogQnVmZmVyR3JvdXBgLiAgQnVmZmVyR3JvdXBzXG4gKiBob2xkIHRoZSBzYW1lIGRhdGEgYXMgQXJyYXlHcm91cHMsIGJ1dCBhcmUgdHVuZWQgZm9yIGNvbnN1bXB0aW9uIGJ5IFdlYkdMLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVja2V0IHtcbiAgICBsYXllcklkczogQXJyYXk8c3RyaW5nPjtcbiAgICBoYXNQYXR0ZXJuOiBib29sZWFuO1xuICAgICtsYXllcnM6IEFycmF5PGFueT47XG4gICAgK3N0YXRlRGVwZW5kZW50TGF5ZXJzOiBBcnJheTxhbnk+O1xuICAgICtzdGF0ZURlcGVuZGVudExheWVySWRzOiBBcnJheTxzdHJpbmc+O1xuICAgIHBvcHVsYXRlKGZlYXR1cmVzOiBBcnJheTxJbmRleGVkRmVhdHVyZT4sIG9wdGlvbnM6IFBvcHVsYXRlUGFyYW1ldGVycyk6IHZvaWQ7XG4gICAgdXBkYXRlKHN0YXRlczogRmVhdHVyZVN0YXRlcywgdnRMYXllcjogVmVjdG9yVGlsZUxheWVyLCBpbWFnZVBvc2l0aW9uczoge1tzdHJpbmddOiBJbWFnZVBvc2l0aW9ufSk6IHZvaWQ7XG4gICAgaXNFbXB0eSgpOiBib29sZWFuO1xuXG4gICAgdXBsb2FkKGNvbnRleHQ6IENvbnRleHQpOiB2b2lkO1xuICAgIHVwbG9hZFBlbmRpbmcoKTogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIFJlbGVhc2UgdGhlIFdlYkdMIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGJ1ZmZlcnMuIE5vdGUgdGhhdCBiZWNhdXNlXG4gICAgICogYnVja2V0cyBhcmUgc2hhcmVkIGJldHdlZW4gbGF5ZXJzIGhhdmluZyB0aGUgc2FtZSBsYXlvdXQgcHJvcGVydGllcywgdGhleVxuICAgICAqIG11c3QgYmUgZGVzdHJveWVkIGluIGdyb3VwcyAoYWxsIGJ1Y2tldHMgZm9yIGEgdGlsZSwgb3IgYWxsIHN5bWJvbCBidWNrZXRzKS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgZGVzdHJveSgpOiB2b2lkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVzZXJpYWxpemUoaW5wdXQ6IEFycmF5PEJ1Y2tldD4sIHN0eWxlOiBTdHlsZSk6IHtbc3RyaW5nXTogQnVja2V0fSB7XG4gICAgY29uc3Qgb3V0cHV0ID0ge307XG5cbiAgICAvLyBHdWFyZCBhZ2FpbnN0IHRoZSBjYXNlIHdoZXJlIHRoZSBtYXAncyBzdHlsZSBoYXMgYmVlbiBzZXQgdG8gbnVsbCB3aGlsZVxuICAgIC8vIHRoaXMgYnVja2V0IGhhcyBiZWVuIHBhcnNpbmcuXG4gICAgaWYgKCFzdHlsZSkgcmV0dXJuIG91dHB1dDtcblxuICAgIGZvciAoY29uc3QgYnVja2V0IG9mIGlucHV0KSB7XG4gICAgICAgIGNvbnN0IGxheWVycyA9IGJ1Y2tldC5sYXllcklkc1xuICAgICAgICAgICAgLm1hcCgoaWQpID0+IHN0eWxlLmdldExheWVyKGlkKSlcbiAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbik7XG5cbiAgICAgICAgaWYgKGxheWVycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gbG9vayB1cCBTdHlsZUxheWVyIG9iamVjdHMgZnJvbSBsYXllciBpZHMgKHNpbmNlIHdlIGRvbid0XG4gICAgICAgIC8vIHdhbnQgdG8gd2FzdGUgdGltZSBzZXJpYWxpemluZy9jb3B5aW5nIHRoZW0gZnJvbSB0aGUgd29ya2VyKVxuICAgICAgICAoYnVja2V0OiBhbnkpLmxheWVycyA9IGxheWVycztcbiAgICAgICAgaWYgKChidWNrZXQ6IGFueSkuc3RhdGVEZXBlbmRlbnRMYXllcklkcykge1xuICAgICAgICAgICAgKGJ1Y2tldDogYW55KS5zdGF0ZURlcGVuZGVudExheWVycyA9IChidWNrZXQ6IGFueSkuc3RhdGVEZXBlbmRlbnRMYXllcklkcy5tYXAoKGxJZCkgPT4gbGF5ZXJzLmZpbHRlcigobCkgPT4gbC5pZCA9PT0gbElkKVswXSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBsYXllciBvZiBsYXllcnMpIHtcbiAgICAgICAgICAgIG91dHB1dFtsYXllci5pZF0gPSBidWNrZXQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gb3V0cHV0O1xufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5jbGFzcyBEaWN0aW9uYXJ5Q29kZXIge1xuICAgIF9zdHJpbmdUb051bWJlcjogeyBbc3RyaW5nXTogbnVtYmVyIH07XG4gICAgX251bWJlclRvU3RyaW5nOiBBcnJheTxzdHJpbmc+O1xuXG4gICAgY29uc3RydWN0b3Ioc3RyaW5nczogQXJyYXk8c3RyaW5nPikge1xuICAgICAgICB0aGlzLl9zdHJpbmdUb051bWJlciA9IHt9O1xuICAgICAgICB0aGlzLl9udW1iZXJUb1N0cmluZyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0cmluZ3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHN0cmluZyA9IHN0cmluZ3NbaV07XG4gICAgICAgICAgICB0aGlzLl9zdHJpbmdUb051bWJlcltzdHJpbmddID0gaTtcbiAgICAgICAgICAgIHRoaXMuX251bWJlclRvU3RyaW5nW2ldID0gc3RyaW5nO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZW5jb2RlKHN0cmluZzogc3RyaW5nKSB7XG4gICAgICAgIGFzc2VydChzdHJpbmcgaW4gdGhpcy5fc3RyaW5nVG9OdW1iZXIpO1xuICAgICAgICByZXR1cm4gdGhpcy5fc3RyaW5nVG9OdW1iZXJbc3RyaW5nXTtcbiAgICB9XG5cbiAgICBkZWNvZGUobjogbnVtYmVyKSB7XG4gICAgICAgIGFzc2VydChuIDwgdGhpcy5fbnVtYmVyVG9TdHJpbmcubGVuZ3RoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX251bWJlclRvU3RyaW5nW25dO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgRGljdGlvbmFyeUNvZGVyO1xuIiwiLy8gQGZsb3dcbmltcG9ydCB0eXBlIHtHZW9KU09OR2VvbWV0cnl9IGZyb20gJ0BtYXBib3gvZ2VvanNvbi10eXBlcyc7XG5cbmNsYXNzIEZlYXR1cmUge1xuICAgIHR5cGU6ICdGZWF0dXJlJztcbiAgICBfZ2VvbWV0cnk6ID9HZW9KU09OR2VvbWV0cnk7XG4gICAgcHJvcGVydGllczoge307XG4gICAgaWQ6IG51bWJlciB8IHN0cmluZyB8IHZvaWQ7XG5cbiAgICBfdmVjdG9yVGlsZUZlYXR1cmU6IFZlY3RvclRpbGVGZWF0dXJlO1xuXG4gICAgY29uc3RydWN0b3IodmVjdG9yVGlsZUZlYXR1cmU6IFZlY3RvclRpbGVGZWF0dXJlLCB6OiBudW1iZXIsIHg6IG51bWJlciwgeTogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMudHlwZSA9ICdGZWF0dXJlJztcblxuICAgICAgICB0aGlzLl92ZWN0b3JUaWxlRmVhdHVyZSA9IHZlY3RvclRpbGVGZWF0dXJlO1xuICAgICAgICAodmVjdG9yVGlsZUZlYXR1cmU6IGFueSkuX3ogPSB6O1xuICAgICAgICAodmVjdG9yVGlsZUZlYXR1cmU6IGFueSkuX3ggPSB4O1xuICAgICAgICAodmVjdG9yVGlsZUZlYXR1cmU6IGFueSkuX3kgPSB5O1xuXG4gICAgICAgIHRoaXMucHJvcGVydGllcyA9IHZlY3RvclRpbGVGZWF0dXJlLnByb3BlcnRpZXM7XG5cbiAgICAgICAgaWYgKHZlY3RvclRpbGVGZWF0dXJlLmlkICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuaWQgPSB2ZWN0b3JUaWxlRmVhdHVyZS5pZDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldCBnZW9tZXRyeSgpOiA/R2VvSlNPTkdlb21ldHJ5IHtcbiAgICAgICAgaWYgKHRoaXMuX2dlb21ldHJ5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2dlb21ldHJ5ID0gdGhpcy5fdmVjdG9yVGlsZUZlYXR1cmUudG9HZW9KU09OKFxuICAgICAgICAgICAgICAgICh0aGlzLl92ZWN0b3JUaWxlRmVhdHVyZTogYW55KS5feCxcbiAgICAgICAgICAgICAgICAodGhpcy5fdmVjdG9yVGlsZUZlYXR1cmU6IGFueSkuX3ksXG4gICAgICAgICAgICAgICAgKHRoaXMuX3ZlY3RvclRpbGVGZWF0dXJlOiBhbnkpLl96KS5nZW9tZXRyeTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fZ2VvbWV0cnk7XG4gICAgfVxuXG4gICAgc2V0IGdlb21ldHJ5KGc6ID9HZW9KU09OR2VvbWV0cnkpIHtcbiAgICAgICAgdGhpcy5fZ2VvbWV0cnkgPSBnO1xuICAgIH1cblxuICAgIHRvSlNPTigpIHtcbiAgICAgICAgY29uc3QganNvbiA9IHtcbiAgICAgICAgICAgIGdlb21ldHJ5OiB0aGlzLmdlb21ldHJ5XG4gICAgICAgIH07XG4gICAgICAgIGZvciAoY29uc3QgaSBpbiB0aGlzKSB7XG4gICAgICAgICAgICBpZiAoaSA9PT0gJ19nZW9tZXRyeScgfHwgaSA9PT0gJ192ZWN0b3JUaWxlRmVhdHVyZScpIGNvbnRpbnVlO1xuICAgICAgICAgICAganNvbltpXSA9ICh0aGlzOiBhbnkpW2ldO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBqc29uO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgRmVhdHVyZTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7IGV4dGVuZCB9IGZyb20gJy4uL3V0aWwvdXRpbCc7XG5pbXBvcnQgVGlsZSBmcm9tICcuL3RpbGUnO1xuaW1wb3J0IHR5cGUge0ZlYXR1cmVTdGF0ZX0gZnJvbSAnLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uJztcblxuZXhwb3J0IHR5cGUgRmVhdHVyZVN0YXRlcyA9IHtbZmVhdHVyZV9pZDogc3RyaW5nXTogRmVhdHVyZVN0YXRlfTtcbmV4cG9ydCB0eXBlIExheWVyRmVhdHVyZVN0YXRlcyA9IHtbbGF5ZXI6IHN0cmluZ106IEZlYXR1cmVTdGF0ZXN9O1xuXG4vKipcbiAqIFNvdXJjZUZlYXR1cmVTdGF0ZSBtYW5hZ2VzIHRoZSBzdGF0ZSBhbmQgcGVuZGluZyBjaGFuZ2VzXG4gKiB0byBmZWF0dXJlcyBpbiBhIHNvdXJjZSwgc2VwYXJhdGVkIGJ5IHNvdXJjZSBsYXllci5cbiAqIHN0YXRlQ2hhbmdlcyBhbmQgZGVsZXRlZFN0YXRlcyBiYXRjaCBhbGwgY2hhbmdlcyB0byB0aGUgdGlsZSAodXBkYXRlcyBhbmQgcmVtb3ZlcywgcmVzcGVjdGl2ZWx5KVxuICogYmV0d2VlbiBjb2FsZXNjZSgpIGV2ZW50cy4gYWRkRmVhdHVyZVN0YXRlKCkgYW5kIHJlbW92ZUZlYXR1cmVTdGF0ZSgpIGFsc28gdXBkYXRlIHRoZWlyIGNvdW50ZXJwYXJ0J3NcbiAqIGxpc3Qgb2YgY2hhbmdlcywgc3VjaCB0aGF0IGNvYWxlc2NlKCkgY2FuIGFwcGx5IHRoZSBwcm9wZXIgc3RhdGUgY2hhbmdlcyB3aGlsZSBhZ25vc3RpYyB0byB0aGUgb3JkZXIgb2Ygb3BlcmF0aW9ucy5cbiAqIEluIGRlbGV0ZWRTdGF0ZXMsIGFsbCBudWxsJ3MgZGVub3RlIGNvbXBsZXRlIHJlbW92YWwgb2Ygc3RhdGUgYXQgdGhhdCBzY29wZVxuICogQHByaXZhdGVcbiovXG5jbGFzcyBTb3VyY2VGZWF0dXJlU3RhdGUge1xuICAgIHN0YXRlOiBMYXllckZlYXR1cmVTdGF0ZXM7XG4gICAgc3RhdGVDaGFuZ2VzOiBMYXllckZlYXR1cmVTdGF0ZXM7XG4gICAgZGVsZXRlZFN0YXRlczoge307XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHt9O1xuICAgICAgICB0aGlzLnN0YXRlQ2hhbmdlcyA9IHt9O1xuICAgICAgICB0aGlzLmRlbGV0ZWRTdGF0ZXMgPSB7fTtcbiAgICB9XG5cbiAgICB1cGRhdGVTdGF0ZShzb3VyY2VMYXllcjogc3RyaW5nLCBmZWF0dXJlSWQ6IG51bWJlciwgbmV3U3RhdGU6IE9iamVjdCkge1xuICAgICAgICBjb25zdCBmZWF0dXJlID0gU3RyaW5nKGZlYXR1cmVJZCk7XG4gICAgICAgIHRoaXMuc3RhdGVDaGFuZ2VzW3NvdXJjZUxheWVyXSA9IHRoaXMuc3RhdGVDaGFuZ2VzW3NvdXJjZUxheWVyXSB8fCB7fTtcbiAgICAgICAgdGhpcy5zdGF0ZUNoYW5nZXNbc291cmNlTGF5ZXJdW2ZlYXR1cmVdID0gdGhpcy5zdGF0ZUNoYW5nZXNbc291cmNlTGF5ZXJdW2ZlYXR1cmVdIHx8IHt9O1xuICAgICAgICBleHRlbmQodGhpcy5zdGF0ZUNoYW5nZXNbc291cmNlTGF5ZXJdW2ZlYXR1cmVdLCBuZXdTdGF0ZSk7XG5cbiAgICAgICAgaWYgKHRoaXMuZGVsZXRlZFN0YXRlc1tzb3VyY2VMYXllcl0gPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuZGVsZXRlZFN0YXRlc1tzb3VyY2VMYXllcl0gPSB7fTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZnQgaW4gdGhpcy5zdGF0ZVtzb3VyY2VMYXllcl0pIHtcbiAgICAgICAgICAgICAgICBpZiAoZnQgIT09IGZlYXR1cmUpIHRoaXMuZGVsZXRlZFN0YXRlc1tzb3VyY2VMYXllcl1bZnRdID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGZlYXR1cmVEZWxldGlvblF1ZXVlZCA9IHRoaXMuZGVsZXRlZFN0YXRlc1tzb3VyY2VMYXllcl0gJiYgdGhpcy5kZWxldGVkU3RhdGVzW3NvdXJjZUxheWVyXVtmZWF0dXJlXSA9PT0gbnVsbDtcbiAgICAgICAgICAgIGlmIChmZWF0dXJlRGVsZXRpb25RdWV1ZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRlbGV0ZWRTdGF0ZXNbc291cmNlTGF5ZXJdW2ZlYXR1cmVdID0ge307XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBwcm9wIGluIHRoaXMuc3RhdGVbc291cmNlTGF5ZXJdW2ZlYXR1cmVdKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghbmV3U3RhdGVbcHJvcF0pIHRoaXMuZGVsZXRlZFN0YXRlc1tzb3VyY2VMYXllcl1bZmVhdHVyZV1bcHJvcF0gPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gbmV3U3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVsZXRpb25JblF1ZXVlID0gdGhpcy5kZWxldGVkU3RhdGVzW3NvdXJjZUxheWVyXSAmJiB0aGlzLmRlbGV0ZWRTdGF0ZXNbc291cmNlTGF5ZXJdW2ZlYXR1cmVdICYmIHRoaXMuZGVsZXRlZFN0YXRlc1tzb3VyY2VMYXllcl1bZmVhdHVyZV1ba2V5XSA9PT0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRlbGV0aW9uSW5RdWV1ZSkgZGVsZXRlIHRoaXMuZGVsZXRlZFN0YXRlc1tzb3VyY2VMYXllcl1bZmVhdHVyZV1ba2V5XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZW1vdmVGZWF0dXJlU3RhdGUoc291cmNlTGF5ZXI6IHN0cmluZywgZmVhdHVyZUlkPzogbnVtYmVyLCBrZXk/OiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3Qgc291cmNlTGF5ZXJEZWxldGVkID0gdGhpcy5kZWxldGVkU3RhdGVzW3NvdXJjZUxheWVyXSA9PT0gbnVsbDtcbiAgICAgICAgaWYgKHNvdXJjZUxheWVyRGVsZXRlZCkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IGZlYXR1cmUgPSBTdHJpbmcoZmVhdHVyZUlkKTtcblxuICAgICAgICB0aGlzLmRlbGV0ZWRTdGF0ZXNbc291cmNlTGF5ZXJdID0gdGhpcy5kZWxldGVkU3RhdGVzW3NvdXJjZUxheWVyXSB8fCB7fTtcblxuICAgICAgICBpZiAoa2V5ICYmIGZlYXR1cmVJZCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuZGVsZXRlZFN0YXRlc1tzb3VyY2VMYXllcl1bZmVhdHVyZV0gIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRlbGV0ZWRTdGF0ZXNbc291cmNlTGF5ZXJdW2ZlYXR1cmVdID0gdGhpcy5kZWxldGVkU3RhdGVzW3NvdXJjZUxheWVyXVtmZWF0dXJlXSB8fCB7fTtcbiAgICAgICAgICAgICAgICB0aGlzLmRlbGV0ZWRTdGF0ZXNbc291cmNlTGF5ZXJdW2ZlYXR1cmVdW2tleV0gPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGZlYXR1cmVJZCkge1xuICAgICAgICAgICAgY29uc3QgdXBkYXRlSW5RdWV1ZSA9IHRoaXMuc3RhdGVDaGFuZ2VzW3NvdXJjZUxheWVyXSAmJiB0aGlzLnN0YXRlQ2hhbmdlc1tzb3VyY2VMYXllcl1bZmVhdHVyZV07XG4gICAgICAgICAgICBpZiAodXBkYXRlSW5RdWV1ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVsZXRlZFN0YXRlc1tzb3VyY2VMYXllcl1bZmVhdHVyZV0gPSB7fTtcbiAgICAgICAgICAgICAgICBmb3IgKGtleSBpbiB0aGlzLnN0YXRlQ2hhbmdlc1tzb3VyY2VMYXllcl1bZmVhdHVyZV0pIHRoaXMuZGVsZXRlZFN0YXRlc1tzb3VyY2VMYXllcl1bZmVhdHVyZV1ba2V5XSA9IG51bGw7XG5cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZWxldGVkU3RhdGVzW3NvdXJjZUxheWVyXVtmZWF0dXJlXSA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmRlbGV0ZWRTdGF0ZXNbc291cmNlTGF5ZXJdID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgfVxuXG4gICAgZ2V0U3RhdGUoc291cmNlTGF5ZXI6IHN0cmluZywgZmVhdHVyZUlkOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgZmVhdHVyZSA9IFN0cmluZyhmZWF0dXJlSWQpO1xuICAgICAgICBjb25zdCBiYXNlID0gdGhpcy5zdGF0ZVtzb3VyY2VMYXllcl0gfHwge307XG4gICAgICAgIGNvbnN0IGNoYW5nZXMgPSB0aGlzLnN0YXRlQ2hhbmdlc1tzb3VyY2VMYXllcl0gfHwge307XG5cbiAgICAgICAgY29uc3QgcmVjb25jaWxlZFN0YXRlID0gZXh0ZW5kKHt9LCBiYXNlW2ZlYXR1cmVdLCBjaGFuZ2VzW2ZlYXR1cmVdKTtcblxuICAgICAgICAvL3JldHVybiBlbXB0eSBvYmplY3QgaWYgdGhlIHdob2xlIHNvdXJjZSBsYXllciBpcyBhd2FpdGluZyBkZWxldGlvblxuICAgICAgICBpZiAodGhpcy5kZWxldGVkU3RhdGVzW3NvdXJjZUxheWVyXSA9PT0gbnVsbCkgcmV0dXJuIHt9O1xuICAgICAgICBlbHNlIGlmICh0aGlzLmRlbGV0ZWRTdGF0ZXNbc291cmNlTGF5ZXJdKSB7XG4gICAgICAgICAgICBjb25zdCBmZWF0dXJlRGVsZXRpb25zID0gdGhpcy5kZWxldGVkU3RhdGVzW3NvdXJjZUxheWVyXVtmZWF0dXJlSWRdO1xuICAgICAgICAgICAgaWYgKGZlYXR1cmVEZWxldGlvbnMgPT09IG51bGwpIHJldHVybiB7fTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcHJvcCBpbiBmZWF0dXJlRGVsZXRpb25zKSBkZWxldGUgcmVjb25jaWxlZFN0YXRlW3Byb3BdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZWNvbmNpbGVkU3RhdGU7XG4gICAgfVxuXG4gICAgaW5pdGlhbGl6ZVRpbGVTdGF0ZSh0aWxlOiBUaWxlLCBwYWludGVyOiBhbnkpIHtcbiAgICAgICAgdGlsZS5zZXRGZWF0dXJlU3RhdGUodGhpcy5zdGF0ZSwgcGFpbnRlcik7XG4gICAgfVxuXG4gICAgY29hbGVzY2VDaGFuZ2VzKHRpbGVzOiB7W2FueV06IFRpbGV9LCBwYWludGVyOiBhbnkpIHtcbiAgICAgICAgLy90cmFjayBjaGFuZ2VzIHdpdGggZnVsbCBzdGF0ZSBvYmplY3RzLCBidXQgb25seSBmb3IgZmVhdHVyZXMgdGhhdCBnb3QgbW9kaWZpZWRcbiAgICAgICAgY29uc3QgZmVhdHVyZXNDaGFuZ2VkOiBMYXllckZlYXR1cmVTdGF0ZXMgPSB7fTtcblxuICAgICAgICBmb3IgKGNvbnN0IHNvdXJjZUxheWVyIGluIHRoaXMuc3RhdGVDaGFuZ2VzKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXRlW3NvdXJjZUxheWVyXSAgPSB0aGlzLnN0YXRlW3NvdXJjZUxheWVyXSB8fCB7fTtcbiAgICAgICAgICAgIGNvbnN0IGxheWVyU3RhdGVzID0ge307XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGZlYXR1cmUgaW4gdGhpcy5zdGF0ZUNoYW5nZXNbc291cmNlTGF5ZXJdKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLnN0YXRlW3NvdXJjZUxheWVyXVtmZWF0dXJlXSkgdGhpcy5zdGF0ZVtzb3VyY2VMYXllcl1bZmVhdHVyZV0gPSB7fTtcbiAgICAgICAgICAgICAgICBleHRlbmQodGhpcy5zdGF0ZVtzb3VyY2VMYXllcl1bZmVhdHVyZV0sIHRoaXMuc3RhdGVDaGFuZ2VzW3NvdXJjZUxheWVyXVtmZWF0dXJlXSk7XG4gICAgICAgICAgICAgICAgbGF5ZXJTdGF0ZXNbZmVhdHVyZV0gPSB0aGlzLnN0YXRlW3NvdXJjZUxheWVyXVtmZWF0dXJlXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZlYXR1cmVzQ2hhbmdlZFtzb3VyY2VMYXllcl0gPSBsYXllclN0YXRlcztcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3Qgc291cmNlTGF5ZXIgaW4gdGhpcy5kZWxldGVkU3RhdGVzKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXRlW3NvdXJjZUxheWVyXSAgPSB0aGlzLnN0YXRlW3NvdXJjZUxheWVyXSB8fCB7fTtcbiAgICAgICAgICAgIGNvbnN0IGxheWVyU3RhdGVzID0ge307XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmRlbGV0ZWRTdGF0ZXNbc291cmNlTGF5ZXJdID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBmdCBpbiB0aGlzLnN0YXRlW3NvdXJjZUxheWVyXSkge1xuICAgICAgICAgICAgICAgICAgICBsYXllclN0YXRlc1tmdF0gPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0ZVtzb3VyY2VMYXllcl1bZnRdID0ge307XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGZlYXR1cmUgaW4gdGhpcy5kZWxldGVkU3RhdGVzW3NvdXJjZUxheWVyXSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZWxldGVXaG9sZUZlYXR1cmVTdGF0ZSA9IHRoaXMuZGVsZXRlZFN0YXRlc1tzb3VyY2VMYXllcl1bZmVhdHVyZV0gPT09IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkZWxldGVXaG9sZUZlYXR1cmVTdGF0ZSkgdGhpcy5zdGF0ZVtzb3VyY2VMYXllcl1bZmVhdHVyZV0gPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh0aGlzLmRlbGV0ZWRTdGF0ZXNbc291cmNlTGF5ZXJdW2ZlYXR1cmVdKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnN0YXRlW3NvdXJjZUxheWVyXVtmZWF0dXJlXVtrZXldO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGxheWVyU3RhdGVzW2ZlYXR1cmVdID0gdGhpcy5zdGF0ZVtzb3VyY2VMYXllcl1bZmVhdHVyZV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmZWF0dXJlc0NoYW5nZWRbc291cmNlTGF5ZXJdID0gZmVhdHVyZXNDaGFuZ2VkW3NvdXJjZUxheWVyXSB8fCB7fTtcbiAgICAgICAgICAgIGV4dGVuZChmZWF0dXJlc0NoYW5nZWRbc291cmNlTGF5ZXJdLCBsYXllclN0YXRlcyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnN0YXRlQ2hhbmdlcyA9IHt9O1xuICAgICAgICB0aGlzLmRlbGV0ZWRTdGF0ZXMgPSB7fTtcblxuICAgICAgICBpZiAoT2JqZWN0LmtleXMoZmVhdHVyZXNDaGFuZ2VkKS5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgICAgICBmb3IgKGNvbnN0IGlkIGluIHRpbGVzKSB7XG4gICAgICAgICAgICBjb25zdCB0aWxlID0gdGlsZXNbaWRdO1xuICAgICAgICAgICAgdGlsZS5zZXRGZWF0dXJlU3RhdGUoZmVhdHVyZXNDaGFuZ2VkLCBwYWludGVyKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgU291cmNlRmVhdHVyZVN0YXRlO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuXG5pbXBvcnQgbG9hZEdlb21ldHJ5IGZyb20gJy4vbG9hZF9nZW9tZXRyeSc7XG5pbXBvcnQgRVhURU5UIGZyb20gJy4vZXh0ZW50JztcbmltcG9ydCBmZWF0dXJlRmlsdGVyIGZyb20gJy4uL3N0eWxlLXNwZWMvZmVhdHVyZV9maWx0ZXInO1xuaW1wb3J0IEdyaWQgZnJvbSAnZ3JpZC1pbmRleCc7XG5pbXBvcnQgRGljdGlvbmFyeUNvZGVyIGZyb20gJy4uL3V0aWwvZGljdGlvbmFyeV9jb2Rlcic7XG5pbXBvcnQgdnQgZnJvbSAnQG1hcGJveC92ZWN0b3ItdGlsZSc7XG5pbXBvcnQgUHJvdG9idWYgZnJvbSAncGJmJztcbmltcG9ydCBHZW9KU09ORmVhdHVyZSBmcm9tICcuLi91dGlsL3ZlY3RvcnRpbGVfdG9fZ2VvanNvbic7XG5pbXBvcnQgeyBhcnJheXNJbnRlcnNlY3QgfSBmcm9tICcuLi91dGlsL3V0aWwnO1xuaW1wb3J0IHsgT3ZlcnNjYWxlZFRpbGVJRCB9IGZyb20gJy4uL3NvdXJjZS90aWxlX2lkJztcbmltcG9ydCB7IHJlZ2lzdGVyIH0gZnJvbSAnLi4vdXRpbC93ZWJfd29ya2VyX3RyYW5zZmVyJztcbmltcG9ydCBFdmFsdWF0aW9uUGFyYW1ldGVycyBmcm9tICcuLi9zdHlsZS9ldmFsdWF0aW9uX3BhcmFtZXRlcnMnO1xuaW1wb3J0IFNvdXJjZUZlYXR1cmVTdGF0ZSBmcm9tICcuLi9zb3VyY2Uvc291cmNlX3N0YXRlJztcbmltcG9ydCB7cG9seWdvbkludGVyc2VjdHNCb3h9IGZyb20gJy4uL3V0aWwvaW50ZXJzZWN0aW9uX3Rlc3RzJztcblxuaW1wb3J0IHR5cGUgU3R5bGVMYXllciBmcm9tICcuLi9zdHlsZS9zdHlsZV9sYXllcic7XG5pbXBvcnQgdHlwZSB7RmVhdHVyZUZpbHRlcn0gZnJvbSAnLi4vc3R5bGUtc3BlYy9mZWF0dXJlX2ZpbHRlcic7XG5pbXBvcnQgdHlwZSBUcmFuc2Zvcm0gZnJvbSAnLi4vZ2VvL3RyYW5zZm9ybSc7XG5pbXBvcnQgdHlwZSB7RmlsdGVyU3BlY2lmaWNhdGlvbn0gZnJvbSAnLi4vc3R5bGUtc3BlYy90eXBlcyc7XG5cbmltcG9ydCB7IEZlYXR1cmVJbmRleEFycmF5IH0gZnJvbSAnLi9hcnJheV90eXBlcyc7XG5cbnR5cGUgUXVlcnlQYXJhbWV0ZXJzID0ge1xuICAgIHNjYWxlOiBudW1iZXIsXG4gICAgcGl4ZWxQb3NNYXRyaXg6IEZsb2F0MzJBcnJheSxcbiAgICB0cmFuc2Zvcm06IFRyYW5zZm9ybSxcbiAgICB0aWxlU2l6ZTogbnVtYmVyLFxuICAgIHF1ZXJ5R2VvbWV0cnk6IEFycmF5PFBvaW50PixcbiAgICBjYW1lcmFRdWVyeUdlb21ldHJ5OiBBcnJheTxQb2ludD4sXG4gICAgcXVlcnlQYWRkaW5nOiBudW1iZXIsXG4gICAgcGFyYW1zOiB7XG4gICAgICAgIGZpbHRlcjogRmlsdGVyU3BlY2lmaWNhdGlvbixcbiAgICAgICAgbGF5ZXJzOiBBcnJheTxzdHJpbmc+LFxuICAgIH1cbn1cblxuY2xhc3MgRmVhdHVyZUluZGV4IHtcbiAgICB0aWxlSUQ6IE92ZXJzY2FsZWRUaWxlSUQ7XG4gICAgeDogbnVtYmVyO1xuICAgIHk6IG51bWJlcjtcbiAgICB6OiBudW1iZXI7XG4gICAgZ3JpZDogR3JpZDtcbiAgICBncmlkM0Q6IEdyaWQ7XG4gICAgZmVhdHVyZUluZGV4QXJyYXk6IEZlYXR1cmVJbmRleEFycmF5O1xuXG4gICAgcmF3VGlsZURhdGE6IEFycmF5QnVmZmVyO1xuICAgIGJ1Y2tldExheWVySURzOiBBcnJheTxBcnJheTxzdHJpbmc+PjtcblxuICAgIHZ0TGF5ZXJzOiB7W3N0cmluZ106IFZlY3RvclRpbGVMYXllcn07XG4gICAgc291cmNlTGF5ZXJDb2RlcjogRGljdGlvbmFyeUNvZGVyO1xuXG4gICAgY29uc3RydWN0b3IodGlsZUlEOiBPdmVyc2NhbGVkVGlsZUlELFxuICAgICAgICAgICAgICAgIGdyaWQ/OiBHcmlkLFxuICAgICAgICAgICAgICAgIGZlYXR1cmVJbmRleEFycmF5PzogRmVhdHVyZUluZGV4QXJyYXkpIHtcbiAgICAgICAgdGhpcy50aWxlSUQgPSB0aWxlSUQ7XG4gICAgICAgIHRoaXMueCA9IHRpbGVJRC5jYW5vbmljYWwueDtcbiAgICAgICAgdGhpcy55ID0gdGlsZUlELmNhbm9uaWNhbC55O1xuICAgICAgICB0aGlzLnogPSB0aWxlSUQuY2Fub25pY2FsLno7XG4gICAgICAgIHRoaXMuZ3JpZCA9IGdyaWQgfHwgbmV3IEdyaWQoRVhURU5ULCAxNiwgMCk7XG4gICAgICAgIHRoaXMuZ3JpZDNEID0gbmV3IEdyaWQoRVhURU5ULCAxNiwgMCk7XG4gICAgICAgIHRoaXMuZmVhdHVyZUluZGV4QXJyYXkgPSBmZWF0dXJlSW5kZXhBcnJheSB8fCBuZXcgRmVhdHVyZUluZGV4QXJyYXkoKTtcbiAgICB9XG5cbiAgICBpbnNlcnQoZmVhdHVyZTogVmVjdG9yVGlsZUZlYXR1cmUsIGdlb21ldHJ5OiBBcnJheTxBcnJheTxQb2ludD4+LCBmZWF0dXJlSW5kZXg6IG51bWJlciwgc291cmNlTGF5ZXJJbmRleDogbnVtYmVyLCBidWNrZXRJbmRleDogbnVtYmVyLCBpczNEPzogYm9vbGVhbikge1xuICAgICAgICBjb25zdCBrZXkgPSB0aGlzLmZlYXR1cmVJbmRleEFycmF5Lmxlbmd0aDtcbiAgICAgICAgdGhpcy5mZWF0dXJlSW5kZXhBcnJheS5lbXBsYWNlQmFjayhmZWF0dXJlSW5kZXgsIHNvdXJjZUxheWVySW5kZXgsIGJ1Y2tldEluZGV4KTtcblxuICAgICAgICBjb25zdCBncmlkID0gaXMzRCA/IHRoaXMuZ3JpZDNEIDogdGhpcy5ncmlkO1xuXG4gICAgICAgIGZvciAobGV0IHIgPSAwOyByIDwgZ2VvbWV0cnkubGVuZ3RoOyByKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHJpbmcgPSBnZW9tZXRyeVtyXTtcblxuICAgICAgICAgICAgY29uc3QgYmJveCA9IFtJbmZpbml0eSwgSW5maW5pdHksIC1JbmZpbml0eSwgLUluZmluaXR5XTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmluZy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHAgPSByaW5nW2ldO1xuICAgICAgICAgICAgICAgIGJib3hbMF0gPSBNYXRoLm1pbihiYm94WzBdLCBwLngpO1xuICAgICAgICAgICAgICAgIGJib3hbMV0gPSBNYXRoLm1pbihiYm94WzFdLCBwLnkpO1xuICAgICAgICAgICAgICAgIGJib3hbMl0gPSBNYXRoLm1heChiYm94WzJdLCBwLngpO1xuICAgICAgICAgICAgICAgIGJib3hbM10gPSBNYXRoLm1heChiYm94WzNdLCBwLnkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoYmJveFswXSA8IEVYVEVOVCAmJlxuICAgICAgICAgICAgICAgIGJib3hbMV0gPCBFWFRFTlQgJiZcbiAgICAgICAgICAgICAgICBiYm94WzJdID49IDAgJiZcbiAgICAgICAgICAgICAgICBiYm94WzNdID49IDApIHtcbiAgICAgICAgICAgICAgICBncmlkLmluc2VydChrZXksIGJib3hbMF0sIGJib3hbMV0sIGJib3hbMl0sIGJib3hbM10pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgbG9hZFZUTGF5ZXJzKCk6IHtbc3RyaW5nXTogVmVjdG9yVGlsZUxheWVyfSB7XG4gICAgICAgIGlmICghdGhpcy52dExheWVycykge1xuICAgICAgICAgICAgdGhpcy52dExheWVycyA9IG5ldyB2dC5WZWN0b3JUaWxlKG5ldyBQcm90b2J1Zih0aGlzLnJhd1RpbGVEYXRhKSkubGF5ZXJzO1xuICAgICAgICAgICAgdGhpcy5zb3VyY2VMYXllckNvZGVyID0gbmV3IERpY3Rpb25hcnlDb2Rlcih0aGlzLnZ0TGF5ZXJzID8gT2JqZWN0LmtleXModGhpcy52dExheWVycykuc29ydCgpIDogWydfZ2VvanNvblRpbGVMYXllciddKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy52dExheWVycztcbiAgICB9XG5cbiAgICAvLyBGaW5kcyBub24tc3ltYm9sIGZlYXR1cmVzIGluIHRoaXMgdGlsZSBhdCBhIHBhcnRpY3VsYXIgcG9zaXRpb24uXG4gICAgcXVlcnkoYXJnczogUXVlcnlQYXJhbWV0ZXJzLCBzdHlsZUxheWVyczoge1tzdHJpbmddOiBTdHlsZUxheWVyfSwgc291cmNlRmVhdHVyZVN0YXRlOiBTb3VyY2VGZWF0dXJlU3RhdGUpOiB7W3N0cmluZ106IEFycmF5PHsgZmVhdHVyZUluZGV4OiBudW1iZXIsIGZlYXR1cmU6IEdlb0pTT05GZWF0dXJlIH0+fSB7XG4gICAgICAgIHRoaXMubG9hZFZUTGF5ZXJzKCk7XG5cbiAgICAgICAgY29uc3QgcGFyYW1zID0gYXJncy5wYXJhbXMgfHwge30sXG4gICAgICAgICAgICBwaXhlbHNUb1RpbGVVbml0cyA9IEVYVEVOVCAvIGFyZ3MudGlsZVNpemUgLyBhcmdzLnNjYWxlLFxuICAgICAgICAgICAgZmlsdGVyID0gZmVhdHVyZUZpbHRlcihwYXJhbXMuZmlsdGVyKTtcblxuICAgICAgICBjb25zdCBxdWVyeUdlb21ldHJ5ID0gYXJncy5xdWVyeUdlb21ldHJ5O1xuICAgICAgICBjb25zdCBxdWVyeVBhZGRpbmcgPSBhcmdzLnF1ZXJ5UGFkZGluZyAqIHBpeGVsc1RvVGlsZVVuaXRzO1xuXG4gICAgICAgIGNvbnN0IGJvdW5kcyA9IGdldEJvdW5kcyhxdWVyeUdlb21ldHJ5KTtcbiAgICAgICAgY29uc3QgbWF0Y2hpbmcgPSB0aGlzLmdyaWQucXVlcnkoYm91bmRzLm1pblggLSBxdWVyeVBhZGRpbmcsIGJvdW5kcy5taW5ZIC0gcXVlcnlQYWRkaW5nLCBib3VuZHMubWF4WCArIHF1ZXJ5UGFkZGluZywgYm91bmRzLm1heFkgKyBxdWVyeVBhZGRpbmcpO1xuXG4gICAgICAgIGNvbnN0IGNhbWVyYUJvdW5kcyA9IGdldEJvdW5kcyhhcmdzLmNhbWVyYVF1ZXJ5R2VvbWV0cnkpO1xuICAgICAgICBjb25zdCBtYXRjaGluZzNEID0gdGhpcy5ncmlkM0QucXVlcnkoXG4gICAgICAgICAgICAgICAgY2FtZXJhQm91bmRzLm1pblggLSBxdWVyeVBhZGRpbmcsIGNhbWVyYUJvdW5kcy5taW5ZIC0gcXVlcnlQYWRkaW5nLCBjYW1lcmFCb3VuZHMubWF4WCArIHF1ZXJ5UGFkZGluZywgY2FtZXJhQm91bmRzLm1heFkgKyBxdWVyeVBhZGRpbmcsXG4gICAgICAgICAgICAgICAgKGJ4MSwgYnkxLCBieDIsIGJ5MikgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcG9seWdvbkludGVyc2VjdHNCb3goYXJncy5jYW1lcmFRdWVyeUdlb21ldHJ5LCBieDEgLSBxdWVyeVBhZGRpbmcsIGJ5MSAtIHF1ZXJ5UGFkZGluZywgYngyICsgcXVlcnlQYWRkaW5nLCBieTIgKyBxdWVyeVBhZGRpbmcpO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIG1hdGNoaW5nM0QpIHtcbiAgICAgICAgICAgIG1hdGNoaW5nLnB1c2goa2V5KTtcbiAgICAgICAgfVxuXG4gICAgICAgIG1hdGNoaW5nLnNvcnQodG9wRG93bkZlYXR1cmVDb21wYXJhdG9yKTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSB7fTtcbiAgICAgICAgbGV0IHByZXZpb3VzSW5kZXg7XG4gICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgbWF0Y2hpbmcubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gbWF0Y2hpbmdba107XG5cbiAgICAgICAgICAgIC8vIGRvbid0IGNoZWNrIHRoZSBzYW1lIGZlYXR1cmUgbW9yZSB0aGFuIG9uY2VcbiAgICAgICAgICAgIGlmIChpbmRleCA9PT0gcHJldmlvdXNJbmRleCkgY29udGludWU7XG4gICAgICAgICAgICBwcmV2aW91c0luZGV4ID0gaW5kZXg7XG5cbiAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gdGhpcy5mZWF0dXJlSW5kZXhBcnJheS5nZXQoaW5kZXgpO1xuICAgICAgICAgICAgbGV0IGZlYXR1cmVHZW9tZXRyeSA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLmxvYWRNYXRjaGluZ0ZlYXR1cmUoXG4gICAgICAgICAgICAgICAgcmVzdWx0LFxuICAgICAgICAgICAgICAgIG1hdGNoLmJ1Y2tldEluZGV4LFxuICAgICAgICAgICAgICAgIG1hdGNoLnNvdXJjZUxheWVySW5kZXgsXG4gICAgICAgICAgICAgICAgbWF0Y2guZmVhdHVyZUluZGV4LFxuICAgICAgICAgICAgICAgIGZpbHRlcixcbiAgICAgICAgICAgICAgICBwYXJhbXMubGF5ZXJzLFxuICAgICAgICAgICAgICAgIHN0eWxlTGF5ZXJzLFxuICAgICAgICAgICAgICAgIChmZWF0dXJlOiBWZWN0b3JUaWxlRmVhdHVyZSwgc3R5bGVMYXllcjogU3R5bGVMYXllcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWZlYXR1cmVHZW9tZXRyeSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZUdlb21ldHJ5ID0gbG9hZEdlb21ldHJ5KGZlYXR1cmUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGxldCBmZWF0dXJlU3RhdGUgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZlYXR1cmUuaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGBmZWF0dXJlLXN0YXRlYCBleHByZXNzaW9uIGV2YWx1YXRpb24gcmVxdWlyZXMgZmVhdHVyZSBzdGF0ZSB0byBiZSBhdmFpbGFibGVcbiAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVTdGF0ZSA9IHNvdXJjZUZlYXR1cmVTdGF0ZS5nZXRTdGF0ZShzdHlsZUxheWVyLnNvdXJjZUxheWVyIHx8ICdfZ2VvanNvblRpbGVMYXllcicsIGZlYXR1cmUuaWQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdHlsZUxheWVyLnF1ZXJ5SW50ZXJzZWN0c0ZlYXR1cmUocXVlcnlHZW9tZXRyeSwgZmVhdHVyZSwgZmVhdHVyZVN0YXRlLCBmZWF0dXJlR2VvbWV0cnksIHRoaXMueiwgYXJncy50cmFuc2Zvcm0sIHBpeGVsc1RvVGlsZVVuaXRzLCBhcmdzLnBpeGVsUG9zTWF0cml4KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBsb2FkTWF0Y2hpbmdGZWF0dXJlKFxuICAgICAgICByZXN1bHQ6IHtbc3RyaW5nXTogQXJyYXk8eyBmZWF0dXJlSW5kZXg6IG51bWJlciwgZmVhdHVyZTogR2VvSlNPTkZlYXR1cmUgfT59LFxuICAgICAgICBidWNrZXRJbmRleDogbnVtYmVyLFxuICAgICAgICBzb3VyY2VMYXllckluZGV4OiBudW1iZXIsXG4gICAgICAgIGZlYXR1cmVJbmRleDogbnVtYmVyLFxuICAgICAgICBmaWx0ZXI6IEZlYXR1cmVGaWx0ZXIsXG4gICAgICAgIGZpbHRlckxheWVySURzOiBBcnJheTxzdHJpbmc+LFxuICAgICAgICBzdHlsZUxheWVyczoge1tzdHJpbmddOiBTdHlsZUxheWVyfSxcbiAgICAgICAgaW50ZXJzZWN0aW9uVGVzdD86IChmZWF0dXJlOiBWZWN0b3JUaWxlRmVhdHVyZSwgc3R5bGVMYXllcjogU3R5bGVMYXllcikgPT4gYm9vbGVhbiB8IG51bWJlcikge1xuXG4gICAgICAgIGNvbnN0IGxheWVySURzID0gdGhpcy5idWNrZXRMYXllcklEc1tidWNrZXRJbmRleF07XG4gICAgICAgIGlmIChmaWx0ZXJMYXllcklEcyAmJiAhYXJyYXlzSW50ZXJzZWN0KGZpbHRlckxheWVySURzLCBsYXllcklEcykpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgY29uc3Qgc291cmNlTGF5ZXJOYW1lID0gdGhpcy5zb3VyY2VMYXllckNvZGVyLmRlY29kZShzb3VyY2VMYXllckluZGV4KTtcbiAgICAgICAgY29uc3Qgc291cmNlTGF5ZXIgPSB0aGlzLnZ0TGF5ZXJzW3NvdXJjZUxheWVyTmFtZV07XG4gICAgICAgIGNvbnN0IGZlYXR1cmUgPSBzb3VyY2VMYXllci5mZWF0dXJlKGZlYXR1cmVJbmRleCk7XG5cbiAgICAgICAgaWYgKCFmaWx0ZXIobmV3IEV2YWx1YXRpb25QYXJhbWV0ZXJzKHRoaXMudGlsZUlELm92ZXJzY2FsZWRaKSwgZmVhdHVyZSkpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgZm9yIChsZXQgbCA9IDA7IGwgPCBsYXllcklEcy5sZW5ndGg7IGwrKykge1xuICAgICAgICAgICAgY29uc3QgbGF5ZXJJRCA9IGxheWVySURzW2xdO1xuXG4gICAgICAgICAgICBpZiAoZmlsdGVyTGF5ZXJJRHMgJiYgZmlsdGVyTGF5ZXJJRHMuaW5kZXhPZihsYXllcklEKSA8IDApIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3Qgc3R5bGVMYXllciA9IHN0eWxlTGF5ZXJzW2xheWVySURdO1xuICAgICAgICAgICAgaWYgKCFzdHlsZUxheWVyKSBjb250aW51ZTtcblxuICAgICAgICAgICAgY29uc3QgaW50ZXJzZWN0aW9uWiA9ICFpbnRlcnNlY3Rpb25UZXN0IHx8IGludGVyc2VjdGlvblRlc3QoZmVhdHVyZSwgc3R5bGVMYXllcik7XG4gICAgICAgICAgICBpZiAoIWludGVyc2VjdGlvblopIHtcbiAgICAgICAgICAgICAgICAvLyBPbmx5IGFwcGxpZWQgZm9yIG5vbi1zeW1ib2wgZmVhdHVyZXNcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgZ2VvanNvbkZlYXR1cmUgPSBuZXcgR2VvSlNPTkZlYXR1cmUoZmVhdHVyZSwgdGhpcy56LCB0aGlzLngsIHRoaXMueSk7XG4gICAgICAgICAgICAoZ2VvanNvbkZlYXR1cmU6IGFueSkubGF5ZXIgPSBzdHlsZUxheWVyLnNlcmlhbGl6ZSgpO1xuICAgICAgICAgICAgbGV0IGxheWVyUmVzdWx0ID0gcmVzdWx0W2xheWVySURdO1xuICAgICAgICAgICAgaWYgKGxheWVyUmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBsYXllclJlc3VsdCA9IHJlc3VsdFtsYXllcklEXSA9IFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGF5ZXJSZXN1bHQucHVzaCh7IGZlYXR1cmVJbmRleCwgZmVhdHVyZTogZ2VvanNvbkZlYXR1cmUsIGludGVyc2VjdGlvblogfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBHaXZlbiBhIHNldCBvZiBzeW1ib2wgaW5kZXhlcyB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuIGxvb2tlZCB1cCxcbiAgICAvLyByZXR1cm4gYSBtYXRjaGluZyBzZXQgb2YgR2VvSlNPTkZlYXR1cmVzXG4gICAgbG9va3VwU3ltYm9sRmVhdHVyZXMoc3ltYm9sRmVhdHVyZUluZGV4ZXM6IEFycmF5PG51bWJlcj4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgYnVja2V0SW5kZXg6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VMYXllckluZGV4OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyU3BlYzogRmlsdGVyU3BlY2lmaWNhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJMYXllcklEczogQXJyYXk8c3RyaW5nPixcbiAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZUxheWVyczoge1tzdHJpbmddOiBTdHlsZUxheWVyfSkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB7fTtcbiAgICAgICAgdGhpcy5sb2FkVlRMYXllcnMoKTtcblxuICAgICAgICBjb25zdCBmaWx0ZXIgPSBmZWF0dXJlRmlsdGVyKGZpbHRlclNwZWMpO1xuXG4gICAgICAgIGZvciAoY29uc3Qgc3ltYm9sRmVhdHVyZUluZGV4IG9mIHN5bWJvbEZlYXR1cmVJbmRleGVzKSB7XG4gICAgICAgICAgICB0aGlzLmxvYWRNYXRjaGluZ0ZlYXR1cmUoXG4gICAgICAgICAgICAgICAgcmVzdWx0LFxuICAgICAgICAgICAgICAgIGJ1Y2tldEluZGV4LFxuICAgICAgICAgICAgICAgIHNvdXJjZUxheWVySW5kZXgsXG4gICAgICAgICAgICAgICAgc3ltYm9sRmVhdHVyZUluZGV4LFxuICAgICAgICAgICAgICAgIGZpbHRlcixcbiAgICAgICAgICAgICAgICBmaWx0ZXJMYXllcklEcyxcbiAgICAgICAgICAgICAgICBzdHlsZUxheWVyc1xuICAgICAgICAgICAgKTtcblxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgaGFzTGF5ZXIoaWQ6IHN0cmluZykge1xuICAgICAgICBmb3IgKGNvbnN0IGxheWVySURzIG9mIHRoaXMuYnVja2V0TGF5ZXJJRHMpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgbGF5ZXJJRCBvZiBsYXllcklEcykge1xuICAgICAgICAgICAgICAgIGlmIChpZCA9PT0gbGF5ZXJJRCkgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuXG5yZWdpc3RlcihcbiAgICAnRmVhdHVyZUluZGV4JyxcbiAgICBGZWF0dXJlSW5kZXgsXG4gICAgeyBvbWl0OiBbJ3Jhd1RpbGVEYXRhJywgJ3NvdXJjZUxheWVyQ29kZXInXSB9XG4pO1xuXG5leHBvcnQgZGVmYXVsdCBGZWF0dXJlSW5kZXg7XG5cbmZ1bmN0aW9uIGdldEJvdW5kcyhnZW9tZXRyeTogQXJyYXk8UG9pbnQ+KSB7XG4gICAgbGV0IG1pblggPSBJbmZpbml0eTtcbiAgICBsZXQgbWluWSA9IEluZmluaXR5O1xuICAgIGxldCBtYXhYID0gLUluZmluaXR5O1xuICAgIGxldCBtYXhZID0gLUluZmluaXR5O1xuICAgIGZvciAoY29uc3QgcCBvZiBnZW9tZXRyeSkge1xuICAgICAgICBtaW5YID0gTWF0aC5taW4obWluWCwgcC54KTtcbiAgICAgICAgbWluWSA9IE1hdGgubWluKG1pblksIHAueSk7XG4gICAgICAgIG1heFggPSBNYXRoLm1heChtYXhYLCBwLngpO1xuICAgICAgICBtYXhZID0gTWF0aC5tYXgobWF4WSwgcC55KTtcbiAgICB9XG4gICAgcmV0dXJuIHsgbWluWCwgbWluWSwgbWF4WCwgbWF4WSB9O1xufVxuXG5mdW5jdGlvbiB0b3BEb3duRmVhdHVyZUNvbXBhcmF0b3IoYSwgYikge1xuICAgIHJldHVybiBiIC0gYTtcbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7IHVuaXF1ZUlkLCBkZWVwRXF1YWwsIHBhcnNlQ2FjaGVDb250cm9sIH0gZnJvbSAnLi4vdXRpbC91dGlsJztcbmltcG9ydCB7IGRlc2VyaWFsaXplIGFzIGRlc2VyaWFsaXplQnVja2V0IH0gZnJvbSAnLi4vZGF0YS9idWNrZXQnO1xuaW1wb3J0IEZlYXR1cmVJbmRleCBmcm9tICcuLi9kYXRhL2ZlYXR1cmVfaW5kZXgnO1xuaW1wb3J0IEdlb0pTT05GZWF0dXJlIGZyb20gJy4uL3V0aWwvdmVjdG9ydGlsZV90b19nZW9qc29uJztcbmltcG9ydCBmZWF0dXJlRmlsdGVyIGZyb20gJy4uL3N0eWxlLXNwZWMvZmVhdHVyZV9maWx0ZXInO1xuaW1wb3J0IFN5bWJvbEJ1Y2tldCBmcm9tICcuLi9kYXRhL2J1Y2tldC9zeW1ib2xfYnVja2V0JztcbmltcG9ydCB7IFJhc3RlckJvdW5kc0FycmF5LCBDb2xsaXNpb25Cb3hBcnJheSB9IGZyb20gJy4uL2RhdGEvYXJyYXlfdHlwZXMnO1xuaW1wb3J0IHJhc3RlckJvdW5kc0F0dHJpYnV0ZXMgZnJvbSAnLi4vZGF0YS9yYXN0ZXJfYm91bmRzX2F0dHJpYnV0ZXMnO1xuaW1wb3J0IEVYVEVOVCBmcm9tICcuLi9kYXRhL2V4dGVudCc7XG5pbXBvcnQgUG9pbnQgZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XG5pbXBvcnQgVGV4dHVyZSBmcm9tICcuLi9yZW5kZXIvdGV4dHVyZSc7XG5pbXBvcnQgU2VnbWVudFZlY3RvciBmcm9tICcuLi9kYXRhL3NlZ21lbnQnO1xuaW1wb3J0IHsgVHJpYW5nbGVJbmRleEFycmF5IH0gZnJvbSAnLi4vZGF0YS9pbmRleF9hcnJheV90eXBlJztcbmltcG9ydCBicm93c2VyIGZyb20gJy4uL3V0aWwvYnJvd3Nlcic7XG5pbXBvcnQgRXZhbHVhdGlvblBhcmFtZXRlcnMgZnJvbSAnLi4vc3R5bGUvZXZhbHVhdGlvbl9wYXJhbWV0ZXJzJztcbmltcG9ydCBTb3VyY2VGZWF0dXJlU3RhdGUgZnJvbSAnLi4vc291cmNlL3NvdXJjZV9zdGF0ZSc7XG5cbmNvbnN0IENMT0NLX1NLRVdfUkVUUllfVElNRU9VVCA9IDMwMDAwO1xuXG5pbXBvcnQgdHlwZSB7QnVja2V0fSBmcm9tICcuLi9kYXRhL2J1Y2tldCc7XG5pbXBvcnQgdHlwZSBTdHlsZUxheWVyIGZyb20gJy4uL3N0eWxlL3N0eWxlX2xheWVyJztcbmltcG9ydCB0eXBlIHtXb3JrZXJUaWxlUmVzdWx0fSBmcm9tICcuL3dvcmtlcl9zb3VyY2UnO1xuaW1wb3J0IHR5cGUgREVNRGF0YSBmcm9tICcuLi9kYXRhL2RlbV9kYXRhJztcbmltcG9ydCB0eXBlIHtBbHBoYUltYWdlfSBmcm9tICcuLi91dGlsL2ltYWdlJztcbmltcG9ydCB0eXBlIEltYWdlQXRsYXMgZnJvbSAnLi4vcmVuZGVyL2ltYWdlX2F0bGFzJztcbmltcG9ydCB0eXBlIEltYWdlTWFuYWdlciBmcm9tICcuLi9yZW5kZXIvaW1hZ2VfbWFuYWdlcic7XG5pbXBvcnQgdHlwZSBNYXNrIGZyb20gJy4uL3JlbmRlci90aWxlX21hc2snO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tICcuLi9nbC9jb250ZXh0JztcbmltcG9ydCB0eXBlIEluZGV4QnVmZmVyIGZyb20gJy4uL2dsL2luZGV4X2J1ZmZlcic7XG5pbXBvcnQgdHlwZSBWZXJ0ZXhCdWZmZXIgZnJvbSAnLi4vZ2wvdmVydGV4X2J1ZmZlcic7XG5pbXBvcnQgdHlwZSB7T3ZlcnNjYWxlZFRpbGVJRH0gZnJvbSAnLi90aWxlX2lkJztcbmltcG9ydCB0eXBlIEZyYW1lYnVmZmVyIGZyb20gJy4uL2dsL2ZyYW1lYnVmZmVyJztcbmltcG9ydCB0eXBlIHtQZXJmb3JtYW5jZVJlc291cmNlVGltaW5nfSBmcm9tICcuLi90eXBlcy9wZXJmb3JtYW5jZV9yZXNvdXJjZV90aW1pbmcnO1xuaW1wb3J0IHR5cGUgVHJhbnNmb3JtIGZyb20gJy4uL2dlby90cmFuc2Zvcm0nO1xuaW1wb3J0IHR5cGUge0xheWVyRmVhdHVyZVN0YXRlc30gZnJvbSAnLi9zb3VyY2Vfc3RhdGUnO1xuaW1wb3J0IHR5cGUge0NhbmNlbGFibGV9IGZyb20gJy4uL3R5cGVzL2NhbmNlbGFibGUnO1xuaW1wb3J0IHR5cGUge0ZpbHRlclNwZWNpZmljYXRpb259IGZyb20gJy4uL3N0eWxlLXNwZWMvdHlwZXMnO1xuXG5leHBvcnQgdHlwZSBUaWxlU3RhdGUgPVxuICAgIHwgJ2xvYWRpbmcnICAgLy8gVGlsZSBkYXRhIGlzIGluIHRoZSBwcm9jZXNzIG9mIGxvYWRpbmcuXG4gICAgfCAnbG9hZGVkJyAgICAvLyBUaWxlIGRhdGEgaGFzIGJlZW4gbG9hZGVkLiBUaWxlIGNhbiBiZSByZW5kZXJlZC5cbiAgICB8ICdyZWxvYWRpbmcnIC8vIFRpbGUgZGF0YSBoYXMgYmVlbiBsb2FkZWQgYW5kIGlzIGJlaW5nIHVwZGF0ZWQuIFRpbGUgY2FuIGJlIHJlbmRlcmVkLlxuICAgIHwgJ3VubG9hZGVkJyAgLy8gVGlsZSBkYXRhIGhhcyBiZWVuIGRlbGV0ZWQuXG4gICAgfCAnZXJyb3JlZCcgICAvLyBUaWxlIGRhdGEgd2FzIG5vdCBsb2FkZWQgYmVjYXVzZSBvZiBhbiBlcnJvci5cbiAgICB8ICdleHBpcmVkJzsgIC8qIFRpbGUgZGF0YSB3YXMgcHJldmlvdXNseSBsb2FkZWQsIGJ1dCBoYXMgZXhwaXJlZCBwZXIgaXRzXG4gICAgICAgICAgICAgICAgICAgKiBIVFRQIGhlYWRlcnMgYW5kIGlzIGluIHRoZSBwcm9jZXNzIG9mIHJlZnJlc2hpbmcuICovXG5cbi8qKlxuICogQSB0aWxlIG9iamVjdCBpcyB0aGUgY29tYmluYXRpb24gb2YgYSBDb29yZGluYXRlLCB3aGljaCBkZWZpbmVzXG4gKiBpdHMgcGxhY2UsIGFzIHdlbGwgYXMgYSB1bmlxdWUgSUQgYW5kIGRhdGEgdHJhY2tpbmcgZm9yIGl0cyBjb250ZW50XG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgVGlsZSB7XG4gICAgdGlsZUlEOiBPdmVyc2NhbGVkVGlsZUlEO1xuICAgIHVpZDogbnVtYmVyO1xuICAgIHVzZXM6IG51bWJlcjtcbiAgICB0aWxlU2l6ZTogbnVtYmVyO1xuICAgIGJ1Y2tldHM6IHtbc3RyaW5nXTogQnVja2V0fTtcbiAgICBsYXRlc3RGZWF0dXJlSW5kZXg6ID9GZWF0dXJlSW5kZXg7XG4gICAgbGF0ZXN0UmF3VGlsZURhdGE6ID9BcnJheUJ1ZmZlcjtcbiAgICBpbWFnZUF0bGFzOiA/SW1hZ2VBdGxhcztcbiAgICBpbWFnZUF0bGFzVGV4dHVyZTogVGV4dHVyZTtcbiAgICBnbHlwaEF0bGFzSW1hZ2U6ID9BbHBoYUltYWdlO1xuICAgIGdseXBoQXRsYXNUZXh0dXJlOiBUZXh0dXJlO1xuICAgIGV4cGlyYXRpb25UaW1lOiBhbnk7XG4gICAgZXhwaXJlZFJlcXVlc3RDb3VudDogbnVtYmVyO1xuICAgIHN0YXRlOiBUaWxlU3RhdGU7XG4gICAgdGltZUFkZGVkOiBhbnk7XG4gICAgZmFkZUVuZFRpbWU6IGFueTtcbiAgICBjb2xsaXNpb25Cb3hBcnJheTogP0NvbGxpc2lvbkJveEFycmF5O1xuICAgIHJlZG9XaGVuRG9uZTogYm9vbGVhbjtcbiAgICBzaG93Q29sbGlzaW9uQm94ZXM6IGJvb2xlYW47XG4gICAgcGxhY2VtZW50U291cmNlOiBhbnk7XG4gICAgd29ya2VySUQ6IG51bWJlciB8IHZvaWQ7XG4gICAgdnRMYXllcnM6IHtbc3RyaW5nXTogVmVjdG9yVGlsZUxheWVyfTtcbiAgICBtYXNrOiBNYXNrO1xuXG4gICAgbmVpZ2hib3JpbmdUaWxlczogP09iamVjdDtcbiAgICBkZW06ID9ERU1EYXRhO1xuICAgIGFib3J0ZWQ6ID9ib29sZWFuO1xuICAgIG1hc2tlZEJvdW5kc0J1ZmZlcjogP1ZlcnRleEJ1ZmZlcjtcbiAgICBtYXNrZWRJbmRleEJ1ZmZlcjogP0luZGV4QnVmZmVyO1xuICAgIHNlZ21lbnRzOiA/U2VnbWVudFZlY3RvcjtcbiAgICBuZWVkc0hpbGxzaGFkZVByZXBhcmU6ID9ib29sZWFuO1xuICAgIHJlcXVlc3Q6ID9DYW5jZWxhYmxlO1xuICAgIHRleHR1cmU6IGFueTtcbiAgICBmYm86ID9GcmFtZWJ1ZmZlcjtcbiAgICBkZW1UZXh0dXJlOiA/VGV4dHVyZTtcbiAgICByZWZyZXNoZWRVcG9uRXhwaXJhdGlvbjogYm9vbGVhbjtcbiAgICByZWxvYWRDYWxsYmFjazogYW55O1xuICAgIHJlc291cmNlVGltaW5nOiA/QXJyYXk8UGVyZm9ybWFuY2VSZXNvdXJjZVRpbWluZz47XG4gICAgcXVlcnlQYWRkaW5nOiBudW1iZXI7XG5cbiAgICBzeW1ib2xGYWRlSG9sZFVudGlsOiA/bnVtYmVyO1xuICAgIGhhc1N5bWJvbEJ1Y2tldHM6IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge092ZXJzY2FsZWRUaWxlSUR9IHRpbGVJRFxuICAgICAqIEBwYXJhbSBzaXplXG4gICAgICovXG4gICAgY29uc3RydWN0b3IodGlsZUlEOiBPdmVyc2NhbGVkVGlsZUlELCBzaXplOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy50aWxlSUQgPSB0aWxlSUQ7XG4gICAgICAgIHRoaXMudWlkID0gdW5pcXVlSWQoKTtcbiAgICAgICAgdGhpcy51c2VzID0gMDtcbiAgICAgICAgdGhpcy50aWxlU2l6ZSA9IHNpemU7XG4gICAgICAgIHRoaXMuYnVja2V0cyA9IHt9O1xuICAgICAgICB0aGlzLmV4cGlyYXRpb25UaW1lID0gbnVsbDtcbiAgICAgICAgdGhpcy5xdWVyeVBhZGRpbmcgPSAwO1xuICAgICAgICB0aGlzLmhhc1N5bWJvbEJ1Y2tldHMgPSBmYWxzZTtcblxuICAgICAgICAvLyBDb3VudHMgdGhlIG51bWJlciBvZiB0aW1lcyBhIHJlc3BvbnNlIHdhcyBhbHJlYWR5IGV4cGlyZWQgd2hlblxuICAgICAgICAvLyByZWNlaXZlZC4gV2UncmUgdXNpbmcgdGhpcyB0byBhZGQgYSBkZWxheSB3aGVuIG1ha2luZyBhIG5ldyByZXF1ZXN0XG4gICAgICAgIC8vIHNvIHdlIGRvbid0IGhhdmUgdG8ga2VlcCByZXRyeWluZyBpbW1lZGlhdGVseSBpbiBjYXNlIG9mIGEgc2VydmVyXG4gICAgICAgIC8vIHNlcnZpbmcgZXhwaXJlZCB0aWxlcy5cbiAgICAgICAgdGhpcy5leHBpcmVkUmVxdWVzdENvdW50ID0gMDtcblxuICAgICAgICB0aGlzLnN0YXRlID0gJ2xvYWRpbmcnO1xuICAgIH1cblxuICAgIHJlZ2lzdGVyRmFkZUR1cmF0aW9uKGR1cmF0aW9uOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgZmFkZUVuZFRpbWUgPSBkdXJhdGlvbiArIHRoaXMudGltZUFkZGVkO1xuICAgICAgICBpZiAoZmFkZUVuZFRpbWUgPCBicm93c2VyLm5vdygpKSByZXR1cm47XG4gICAgICAgIGlmICh0aGlzLmZhZGVFbmRUaW1lICYmIGZhZGVFbmRUaW1lIDwgdGhpcy5mYWRlRW5kVGltZSkgcmV0dXJuO1xuXG4gICAgICAgIHRoaXMuZmFkZUVuZFRpbWUgPSBmYWRlRW5kVGltZTtcbiAgICB9XG5cbiAgICB3YXNSZXF1ZXN0ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXRlID09PSAnZXJyb3JlZCcgfHwgdGhpcy5zdGF0ZSA9PT0gJ2xvYWRlZCcgfHwgdGhpcy5zdGF0ZSA9PT0gJ3JlbG9hZGluZyc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2l2ZW4gYSBkYXRhIG9iamVjdCB3aXRoIGEgJ2J1ZmZlcnMnIHByb3BlcnR5LCBsb2FkIGl0IGludG9cbiAgICAgKiB0aGlzIHRpbGUncyBlbGVtZW50R3JvdXBzIGFuZCBidWZmZXJzIHByb3BlcnRpZXMgYW5kIHNldCBsb2FkZWRcbiAgICAgKiB0byB0cnVlLiBJZiB0aGUgZGF0YSBpcyBudWxsLCBsaWtlIGluIHRoZSBjYXNlIG9mIGFuIGVtcHR5XG4gICAgICogR2VvSlNPTiB0aWxlLCBuby1vcCBidXQgc3RpbGwgc2V0IGxvYWRlZCB0byB0cnVlLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhXG4gICAgICogQHBhcmFtIHBhaW50ZXJcbiAgICAgKiBAcmV0dXJucyB7dW5kZWZpbmVkfVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgbG9hZFZlY3RvckRhdGEoZGF0YTogV29ya2VyVGlsZVJlc3VsdCwgcGFpbnRlcjogYW55LCBqdXN0UmVsb2FkZWQ6ID9ib29sZWFuKSB7XG4gICAgICAgIGlmICh0aGlzLmhhc0RhdGEoKSkge1xuICAgICAgICAgICAgdGhpcy51bmxvYWRWZWN0b3JEYXRhKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnN0YXRlID0gJ2xvYWRlZCc7XG5cbiAgICAgICAgLy8gZW1wdHkgR2VvSlNPTiB0aWxlXG4gICAgICAgIGlmICghZGF0YSkge1xuICAgICAgICAgICAgdGhpcy5jb2xsaXNpb25Cb3hBcnJheSA9IG5ldyBDb2xsaXNpb25Cb3hBcnJheSgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRhdGEuZmVhdHVyZUluZGV4KSB7XG4gICAgICAgICAgICB0aGlzLmxhdGVzdEZlYXR1cmVJbmRleCA9IGRhdGEuZmVhdHVyZUluZGV4O1xuICAgICAgICAgICAgaWYgKGRhdGEucmF3VGlsZURhdGEpIHtcbiAgICAgICAgICAgICAgICAvLyBPbmx5IHZlY3RvciB0aWxlcyBoYXZlIHJhd1RpbGVEYXRhLCBhbmQgdGhleSB3b24ndCB1cGRhdGUgaXQgZm9yXG4gICAgICAgICAgICAgICAgLy8gJ3JlbG9hZFRpbGUnXG4gICAgICAgICAgICAgICAgdGhpcy5sYXRlc3RSYXdUaWxlRGF0YSA9IGRhdGEucmF3VGlsZURhdGE7XG4gICAgICAgICAgICAgICAgdGhpcy5sYXRlc3RGZWF0dXJlSW5kZXgucmF3VGlsZURhdGEgPSBkYXRhLnJhd1RpbGVEYXRhO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmxhdGVzdFJhd1RpbGVEYXRhKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgcmF3VGlsZURhdGEgaGFzbid0IHVwZGF0ZWQsIGhvbGQgb250byBhIHBvaW50ZXIgdG8gdGhlIGxhc3RcbiAgICAgICAgICAgICAgICAvLyBvbmUgd2UgcmVjZWl2ZWRcbiAgICAgICAgICAgICAgICB0aGlzLmxhdGVzdEZlYXR1cmVJbmRleC5yYXdUaWxlRGF0YSA9IHRoaXMubGF0ZXN0UmF3VGlsZURhdGE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb2xsaXNpb25Cb3hBcnJheSA9IGRhdGEuY29sbGlzaW9uQm94QXJyYXk7XG4gICAgICAgIHRoaXMuYnVja2V0cyA9IGRlc2VyaWFsaXplQnVja2V0KGRhdGEuYnVja2V0cywgcGFpbnRlci5zdHlsZSk7XG5cbiAgICAgICAgdGhpcy5oYXNTeW1ib2xCdWNrZXRzID0gZmFsc2U7XG4gICAgICAgIGZvciAoY29uc3QgaWQgaW4gdGhpcy5idWNrZXRzKSB7XG4gICAgICAgICAgICBjb25zdCBidWNrZXQgPSB0aGlzLmJ1Y2tldHNbaWRdO1xuICAgICAgICAgICAgaWYgKGJ1Y2tldCBpbnN0YW5jZW9mIFN5bWJvbEJ1Y2tldCkge1xuICAgICAgICAgICAgICAgIHRoaXMuaGFzU3ltYm9sQnVja2V0cyA9IHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKGp1c3RSZWxvYWRlZCkge1xuICAgICAgICAgICAgICAgICAgICBidWNrZXQuanVzdFJlbG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnF1ZXJ5UGFkZGluZyA9IDA7XG4gICAgICAgIGZvciAoY29uc3QgaWQgaW4gdGhpcy5idWNrZXRzKSB7XG4gICAgICAgICAgICBjb25zdCBidWNrZXQgPSB0aGlzLmJ1Y2tldHNbaWRdO1xuICAgICAgICAgICAgdGhpcy5xdWVyeVBhZGRpbmcgPSBNYXRoLm1heCh0aGlzLnF1ZXJ5UGFkZGluZywgcGFpbnRlci5zdHlsZS5nZXRMYXllcihpZCkucXVlcnlSYWRpdXMoYnVja2V0KSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGF0YS5pbWFnZUF0bGFzKSB7XG4gICAgICAgICAgICB0aGlzLmltYWdlQXRsYXMgPSBkYXRhLmltYWdlQXRsYXM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRhdGEuZ2x5cGhBdGxhc0ltYWdlKSB7XG4gICAgICAgICAgICB0aGlzLmdseXBoQXRsYXNJbWFnZSA9IGRhdGEuZ2x5cGhBdGxhc0ltYWdlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVsZWFzZSBhbnkgZGF0YSBvciBXZWJHTCByZXNvdXJjZXMgcmVmZXJlbmNlZCBieSB0aGlzIHRpbGUuXG4gICAgICogQHJldHVybnMge3VuZGVmaW5lZH1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHVubG9hZFZlY3RvckRhdGEoKSB7XG4gICAgICAgIGZvciAoY29uc3QgaWQgaW4gdGhpcy5idWNrZXRzKSB7XG4gICAgICAgICAgICB0aGlzLmJ1Y2tldHNbaWRdLmRlc3Ryb3koKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmJ1Y2tldHMgPSB7fTtcblxuICAgICAgICBpZiAodGhpcy5pbWFnZUF0bGFzVGV4dHVyZSkge1xuICAgICAgICAgICAgdGhpcy5pbWFnZUF0bGFzVGV4dHVyZS5kZXN0cm95KCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5pbWFnZUF0bGFzKSB7XG4gICAgICAgICAgICB0aGlzLmltYWdlQXRsYXMgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZ2x5cGhBdGxhc1RleHR1cmUpIHtcbiAgICAgICAgICAgIHRoaXMuZ2x5cGhBdGxhc1RleHR1cmUuZGVzdHJveSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5sYXRlc3RGZWF0dXJlSW5kZXggPSBudWxsO1xuICAgICAgICB0aGlzLnN0YXRlID0gJ3VubG9hZGVkJztcbiAgICB9XG5cbiAgICB1bmxvYWRERU1EYXRhKCkge1xuICAgICAgICB0aGlzLmRlbSA9IG51bGw7XG4gICAgICAgIHRoaXMubmVpZ2hib3JpbmdUaWxlcyA9IG51bGw7XG4gICAgICAgIHRoaXMuc3RhdGUgPSAndW5sb2FkZWQnO1xuICAgIH1cblxuICAgIGdldEJ1Y2tldChsYXllcjogU3R5bGVMYXllcikge1xuICAgICAgICByZXR1cm4gdGhpcy5idWNrZXRzW2xheWVyLmlkXTtcbiAgICB9XG5cbiAgICB1cGxvYWQoY29udGV4dDogQ29udGV4dCkge1xuICAgICAgICBmb3IgKGNvbnN0IGlkIGluIHRoaXMuYnVja2V0cykge1xuICAgICAgICAgICAgY29uc3QgYnVja2V0ID0gdGhpcy5idWNrZXRzW2lkXTtcbiAgICAgICAgICAgIGlmIChidWNrZXQudXBsb2FkUGVuZGluZygpKSB7XG4gICAgICAgICAgICAgICAgYnVja2V0LnVwbG9hZChjb250ZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGdsID0gY29udGV4dC5nbDtcbiAgICAgICAgaWYgKHRoaXMuaW1hZ2VBdGxhcyAmJiAhdGhpcy5pbWFnZUF0bGFzLnVwbG9hZGVkKSB7XG4gICAgICAgICAgICB0aGlzLmltYWdlQXRsYXNUZXh0dXJlID0gbmV3IFRleHR1cmUoY29udGV4dCwgdGhpcy5pbWFnZUF0bGFzLmltYWdlLCBnbC5SR0JBKTtcbiAgICAgICAgICAgIHRoaXMuaW1hZ2VBdGxhcy51cGxvYWRlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5nbHlwaEF0bGFzSW1hZ2UpIHtcbiAgICAgICAgICAgIHRoaXMuZ2x5cGhBdGxhc1RleHR1cmUgPSBuZXcgVGV4dHVyZShjb250ZXh0LCB0aGlzLmdseXBoQXRsYXNJbWFnZSwgZ2wuQUxQSEEpO1xuICAgICAgICAgICAgdGhpcy5nbHlwaEF0bGFzSW1hZ2UgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJlcGFyZShpbWFnZU1hbmFnZXI6IEltYWdlTWFuYWdlcikge1xuICAgICAgICBpZiAodGhpcy5pbWFnZUF0bGFzKSB7XG4gICAgICAgICAgICB0aGlzLmltYWdlQXRsYXMucGF0Y2hVcGRhdGVkSW1hZ2VzKGltYWdlTWFuYWdlciwgdGhpcy5pbWFnZUF0bGFzVGV4dHVyZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBRdWVyaWVzIG5vbi1zeW1ib2wgZmVhdHVyZXMgcmVuZGVyZWQgZm9yIHRoaXMgdGlsZS5cbiAgICAvLyBTeW1ib2wgZmVhdHVyZXMgYXJlIHF1ZXJpZWQgZ2xvYmFsbHlcbiAgICBxdWVyeVJlbmRlcmVkRmVhdHVyZXMobGF5ZXJzOiB7W3N0cmluZ106IFN0eWxlTGF5ZXJ9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VGZWF0dXJlU3RhdGU6IFNvdXJjZUZlYXR1cmVTdGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlHZW9tZXRyeTogQXJyYXk8UG9pbnQ+LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmFRdWVyeUdlb21ldHJ5OiBBcnJheTxQb2ludD4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtczogeyBmaWx0ZXI6IEZpbHRlclNwZWNpZmljYXRpb24sIGxheWVyczogQXJyYXk8c3RyaW5nPiB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm06IFRyYW5zZm9ybSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4UGl0Y2hTY2FsZUZhY3RvcjogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbFBvc01hdHJpeDogRmxvYXQzMkFycmF5KToge1tzdHJpbmddOiBBcnJheTx7IGZlYXR1cmVJbmRleDogbnVtYmVyLCBmZWF0dXJlOiBHZW9KU09ORmVhdHVyZSB9Pn0ge1xuICAgICAgICBpZiAoIXRoaXMubGF0ZXN0RmVhdHVyZUluZGV4IHx8ICF0aGlzLmxhdGVzdEZlYXR1cmVJbmRleC5yYXdUaWxlRGF0YSlcbiAgICAgICAgICAgIHJldHVybiB7fTtcblxuICAgICAgICByZXR1cm4gdGhpcy5sYXRlc3RGZWF0dXJlSW5kZXgucXVlcnkoe1xuICAgICAgICAgICAgcXVlcnlHZW9tZXRyeSxcbiAgICAgICAgICAgIGNhbWVyYVF1ZXJ5R2VvbWV0cnksXG4gICAgICAgICAgICBzY2FsZSxcbiAgICAgICAgICAgIHRpbGVTaXplOiB0aGlzLnRpbGVTaXplLFxuICAgICAgICAgICAgcGl4ZWxQb3NNYXRyaXgsXG4gICAgICAgICAgICB0cmFuc2Zvcm0sXG4gICAgICAgICAgICBwYXJhbXMsXG4gICAgICAgICAgICBxdWVyeVBhZGRpbmc6IHRoaXMucXVlcnlQYWRkaW5nICogbWF4UGl0Y2hTY2FsZUZhY3RvclxuICAgICAgICB9LCBsYXllcnMsIHNvdXJjZUZlYXR1cmVTdGF0ZSk7XG4gICAgfVxuXG4gICAgcXVlcnlTb3VyY2VGZWF0dXJlcyhyZXN1bHQ6IEFycmF5PEdlb0pTT05GZWF0dXJlPiwgcGFyYW1zOiBhbnkpIHtcbiAgICAgICAgaWYgKCF0aGlzLmxhdGVzdEZlYXR1cmVJbmRleCB8fCAhdGhpcy5sYXRlc3RGZWF0dXJlSW5kZXgucmF3VGlsZURhdGEpIHJldHVybjtcblxuICAgICAgICBjb25zdCB2dExheWVycyA9IHRoaXMubGF0ZXN0RmVhdHVyZUluZGV4LmxvYWRWVExheWVycygpO1xuXG4gICAgICAgIGNvbnN0IHNvdXJjZUxheWVyID0gcGFyYW1zID8gcGFyYW1zLnNvdXJjZUxheWVyIDogJyc7XG4gICAgICAgIGNvbnN0IGxheWVyID0gdnRMYXllcnMuX2dlb2pzb25UaWxlTGF5ZXIgfHwgdnRMYXllcnNbc291cmNlTGF5ZXJdO1xuXG4gICAgICAgIGlmICghbGF5ZXIpIHJldHVybjtcblxuICAgICAgICBjb25zdCBmaWx0ZXIgPSBmZWF0dXJlRmlsdGVyKHBhcmFtcyAmJiBwYXJhbXMuZmlsdGVyKTtcbiAgICAgICAgY29uc3Qge3osIHgsIHl9ID0gdGhpcy50aWxlSUQuY2Fub25pY2FsO1xuICAgICAgICBjb25zdCBjb29yZCA9IHt6LCB4LCB5fTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxheWVyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBmZWF0dXJlID0gbGF5ZXIuZmVhdHVyZShpKTtcbiAgICAgICAgICAgIGlmIChmaWx0ZXIobmV3IEV2YWx1YXRpb25QYXJhbWV0ZXJzKHRoaXMudGlsZUlELm92ZXJzY2FsZWRaKSwgZmVhdHVyZSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBnZW9qc29uRmVhdHVyZSA9IG5ldyBHZW9KU09ORmVhdHVyZShmZWF0dXJlLCB6LCB4LCB5KTtcbiAgICAgICAgICAgICAgICAoZ2VvanNvbkZlYXR1cmU6IGFueSkudGlsZSA9IGNvb3JkO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGdlb2pzb25GZWF0dXJlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNsZWFyTWFzaygpIHtcbiAgICAgICAgaWYgKHRoaXMuc2VnbWVudHMpIHtcbiAgICAgICAgICAgIHRoaXMuc2VnbWVudHMuZGVzdHJveSgpO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuc2VnbWVudHM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubWFza2VkQm91bmRzQnVmZmVyKSB7XG4gICAgICAgICAgICB0aGlzLm1hc2tlZEJvdW5kc0J1ZmZlci5kZXN0cm95KCk7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5tYXNrZWRCb3VuZHNCdWZmZXI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubWFza2VkSW5kZXhCdWZmZXIpIHtcbiAgICAgICAgICAgIHRoaXMubWFza2VkSW5kZXhCdWZmZXIuZGVzdHJveSgpO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMubWFza2VkSW5kZXhCdWZmZXI7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRNYXNrKG1hc2s6IE1hc2ssIGNvbnRleHQ6IENvbnRleHQpIHtcblxuICAgICAgICAvLyBkb24ndCByZWRvIGJ1ZmZlciB3b3JrIGlmIHRoZSBtYXNrIGlzIHRoZSBzYW1lO1xuICAgICAgICBpZiAoZGVlcEVxdWFsKHRoaXMubWFzaywgbWFzaykpIHJldHVybjtcblxuICAgICAgICB0aGlzLm1hc2sgPSBtYXNrO1xuICAgICAgICB0aGlzLmNsZWFyTWFzaygpO1xuXG4gICAgICAgIC8vIFdlIHdhbnQgdG8gcmVuZGVyIHRoZSBmdWxsIHRpbGUsIGFuZCBrZWVwaW5nIHRoZSBzZWdtZW50cy92ZXJ0aWNlcy9pbmRpY2VzIGVtcHR5IG1lYW5zXG4gICAgICAgIC8vIHVzaW5nIHRoZSBnbG9iYWwgc2hhcmVkIGJ1ZmZlcnMgZm9yIGNvdmVyaW5nIHRoZSBlbnRpcmUgdGlsZS5cbiAgICAgICAgaWYgKGRlZXBFcXVhbChtYXNrLCB7JzAnOiB0cnVlfSkpIHJldHVybjtcblxuICAgICAgICBjb25zdCBtYXNrZWRCb3VuZHNBcnJheSA9IG5ldyBSYXN0ZXJCb3VuZHNBcnJheSgpO1xuICAgICAgICBjb25zdCBpbmRleEFycmF5ID0gbmV3IFRyaWFuZ2xlSW5kZXhBcnJheSgpO1xuXG4gICAgICAgIHRoaXMuc2VnbWVudHMgPSBuZXcgU2VnbWVudFZlY3RvcigpO1xuICAgICAgICAvLyBDcmVhdGUgYSBuZXcgc2VnbWVudCBzbyB0aGF0IHdlIHdpbGwgdXBsb2FkIChlbXB0eSkgYnVmZmVycyBldmVuIHdoZW4gdGhlcmUgaXMgbm90aGluZyB0b1xuICAgICAgICAvLyBkcmF3IGZvciB0aGlzIHRpbGUuXG4gICAgICAgIHRoaXMuc2VnbWVudHMucHJlcGFyZVNlZ21lbnQoMCwgbWFza2VkQm91bmRzQXJyYXksIGluZGV4QXJyYXkpO1xuXG4gICAgICAgIGNvbnN0IG1hc2tBcnJheSA9IE9iamVjdC5rZXlzKG1hc2spO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1hc2tBcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgbWFza0Nvb3JkID0gbWFza1ttYXNrQXJyYXlbaV1dO1xuICAgICAgICAgICAgY29uc3QgdmVydGV4RXh0ZW50ID0gRVhURU5UID4+IG1hc2tDb29yZC56O1xuICAgICAgICAgICAgY29uc3QgdGxWZXJ0ZXggPSBuZXcgUG9pbnQobWFza0Nvb3JkLnggKiB2ZXJ0ZXhFeHRlbnQsIG1hc2tDb29yZC55ICogdmVydGV4RXh0ZW50KTtcbiAgICAgICAgICAgIGNvbnN0IGJyVmVydGV4ID0gbmV3IFBvaW50KHRsVmVydGV4LnggKyB2ZXJ0ZXhFeHRlbnQsIHRsVmVydGV4LnkgKyB2ZXJ0ZXhFeHRlbnQpO1xuXG4gICAgICAgICAgICAvLyBub3Qgc3VyZSB3aHkgZmxvdyBpcyBjb21wbGFpbmluZyBoZXJlIGJlY2F1c2UgaXQgZG9lc24ndCBjb21wbGFpbiBhdCBMNDAxXG4gICAgICAgICAgICBjb25zdCBzZWdtZW50ID0gKHRoaXMuc2VnbWVudHM6IGFueSkucHJlcGFyZVNlZ21lbnQoNCwgbWFza2VkQm91bmRzQXJyYXksIGluZGV4QXJyYXkpO1xuXG4gICAgICAgICAgICBtYXNrZWRCb3VuZHNBcnJheS5lbXBsYWNlQmFjayh0bFZlcnRleC54LCB0bFZlcnRleC55LCB0bFZlcnRleC54LCB0bFZlcnRleC55KTtcbiAgICAgICAgICAgIG1hc2tlZEJvdW5kc0FycmF5LmVtcGxhY2VCYWNrKGJyVmVydGV4LngsIHRsVmVydGV4LnksIGJyVmVydGV4LngsIHRsVmVydGV4LnkpO1xuICAgICAgICAgICAgbWFza2VkQm91bmRzQXJyYXkuZW1wbGFjZUJhY2sodGxWZXJ0ZXgueCwgYnJWZXJ0ZXgueSwgdGxWZXJ0ZXgueCwgYnJWZXJ0ZXgueSk7XG4gICAgICAgICAgICBtYXNrZWRCb3VuZHNBcnJheS5lbXBsYWNlQmFjayhiclZlcnRleC54LCBiclZlcnRleC55LCBiclZlcnRleC54LCBiclZlcnRleC55KTtcblxuICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gc2VnbWVudC52ZXJ0ZXhMZW5ndGg7XG4gICAgICAgICAgICAvLyAwLCAxLCAyXG4gICAgICAgICAgICAvLyAxLCAyLCAzXG4gICAgICAgICAgICBpbmRleEFycmF5LmVtcGxhY2VCYWNrKG9mZnNldCwgb2Zmc2V0ICsgMSwgb2Zmc2V0ICsgMik7XG4gICAgICAgICAgICBpbmRleEFycmF5LmVtcGxhY2VCYWNrKG9mZnNldCArIDEsIG9mZnNldCArIDIsIG9mZnNldCArIDMpO1xuXG4gICAgICAgICAgICBzZWdtZW50LnZlcnRleExlbmd0aCArPSA0O1xuICAgICAgICAgICAgc2VnbWVudC5wcmltaXRpdmVMZW5ndGggKz0gMjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubWFza2VkQm91bmRzQnVmZmVyID0gY29udGV4dC5jcmVhdGVWZXJ0ZXhCdWZmZXIobWFza2VkQm91bmRzQXJyYXksIHJhc3RlckJvdW5kc0F0dHJpYnV0ZXMubWVtYmVycyk7XG4gICAgICAgIHRoaXMubWFza2VkSW5kZXhCdWZmZXIgPSBjb250ZXh0LmNyZWF0ZUluZGV4QnVmZmVyKGluZGV4QXJyYXkpO1xuICAgIH1cblxuICAgIGhhc0RhdGEoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXRlID09PSAnbG9hZGVkJyB8fCB0aGlzLnN0YXRlID09PSAncmVsb2FkaW5nJyB8fCB0aGlzLnN0YXRlID09PSAnZXhwaXJlZCc7XG4gICAgfVxuXG4gICAgcGF0dGVybnNMb2FkZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmltYWdlQXRsYXMgJiYgISFPYmplY3Qua2V5cyh0aGlzLmltYWdlQXRsYXMucGF0dGVyblBvc2l0aW9ucykubGVuZ3RoO1xuICAgIH1cblxuICAgIHNldEV4cGlyeURhdGEoZGF0YTogYW55KSB7XG4gICAgICAgIGNvbnN0IHByaW9yID0gdGhpcy5leHBpcmF0aW9uVGltZTtcblxuICAgICAgICBpZiAoZGF0YS5jYWNoZUNvbnRyb2wpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZENDID0gcGFyc2VDYWNoZUNvbnRyb2woZGF0YS5jYWNoZUNvbnRyb2wpO1xuICAgICAgICAgICAgaWYgKHBhcnNlZENDWydtYXgtYWdlJ10pIHRoaXMuZXhwaXJhdGlvblRpbWUgPSBEYXRlLm5vdygpICsgcGFyc2VkQ0NbJ21heC1hZ2UnXSAqIDEwMDA7XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YS5leHBpcmVzKSB7XG4gICAgICAgICAgICB0aGlzLmV4cGlyYXRpb25UaW1lID0gbmV3IERhdGUoZGF0YS5leHBpcmVzKS5nZXRUaW1lKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5leHBpcmF0aW9uVGltZSkge1xuICAgICAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgIGxldCBpc0V4cGlyZWQgPSBmYWxzZTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuZXhwaXJhdGlvblRpbWUgPiBub3cpIHtcbiAgICAgICAgICAgICAgICBpc0V4cGlyZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIXByaW9yKSB7XG4gICAgICAgICAgICAgICAgaXNFeHBpcmVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5leHBpcmF0aW9uVGltZSA8IHByaW9yKSB7XG4gICAgICAgICAgICAgICAgLy8gRXhwaXJpbmcgZGF0ZSBpcyBnb2luZyBiYWNrd2FyZHM6XG4gICAgICAgICAgICAgICAgLy8gZmFsbCBiYWNrIHRvIGV4cG9uZW50aWFsIGJhY2tvZmZcbiAgICAgICAgICAgICAgICBpc0V4cGlyZWQgPSB0cnVlO1xuXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRlbHRhID0gdGhpcy5leHBpcmF0aW9uVGltZSAtIHByaW9yO1xuXG4gICAgICAgICAgICAgICAgaWYgKCFkZWx0YSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBTZXJ2ZXIgaXMgc2VydmluZyB0aGUgc2FtZSBleHBpcmVkIHJlc291cmNlIG92ZXIgYW5kIG92ZXI6IGZhbGxcbiAgICAgICAgICAgICAgICAgICAgLy8gYmFjayB0byBleHBvbmVudGlhbCBiYWNrb2ZmLlxuICAgICAgICAgICAgICAgICAgICBpc0V4cGlyZWQgPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQXNzdW1lIHRoYXQgZWl0aGVyIHRoZSBjbGllbnQgb3IgdGhlIHNlcnZlciBjbG9jayBpcyB3cm9uZyBhbmRcbiAgICAgICAgICAgICAgICAgICAgLy8gdHJ5IHRvIGludGVycG9sYXRlIGEgdmFsaWQgZXhwaXJhdGlvbiBkYXRlIChmcm9tIHRoZSBjbGllbnQgUE9WKVxuICAgICAgICAgICAgICAgICAgICAvLyBvYnNlcnZpbmcgYSBtaW5pbXVtIHRpbWVvdXQuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXhwaXJhdGlvblRpbWUgPSBub3cgKyBNYXRoLm1heChkZWx0YSwgQ0xPQ0tfU0tFV19SRVRSWV9USU1FT1VUKTtcblxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGlzRXhwaXJlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZXhwaXJlZFJlcXVlc3RDb3VudCsrO1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSAnZXhwaXJlZCc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuZXhwaXJlZFJlcXVlc3RDb3VudCA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRFeHBpcnlUaW1lb3V0KCkge1xuICAgICAgICBpZiAodGhpcy5leHBpcmF0aW9uVGltZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuZXhwaXJlZFJlcXVlc3RDb3VudCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAxMDAwICogKDEgPDwgTWF0aC5taW4odGhpcy5leHBpcmVkUmVxdWVzdENvdW50IC0gMSwgMzEpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gTWF4IHZhbHVlIGZvciBgc2V0VGltZW91dGAgaW1wbGVtZW50YXRpb25zIGlzIGEgMzIgYml0IGludGVnZXI7IGNhcCB0aGlzIGFjY29yZGluZ2x5XG4gICAgICAgICAgICAgICAgcmV0dXJuIE1hdGgubWluKHRoaXMuZXhwaXJhdGlvblRpbWUgLSBuZXcgRGF0ZSgpLmdldFRpbWUoKSwgTWF0aC5wb3coMiwgMzEpIC0gMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRGZWF0dXJlU3RhdGUoc3RhdGVzOiBMYXllckZlYXR1cmVTdGF0ZXMsIHBhaW50ZXI6IGFueSkge1xuICAgICAgICBpZiAoIXRoaXMubGF0ZXN0RmVhdHVyZUluZGV4IHx8XG4gICAgICAgICAgICAhdGhpcy5sYXRlc3RGZWF0dXJlSW5kZXgucmF3VGlsZURhdGEgfHxcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKHN0YXRlcykubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB2dExheWVycyA9IHRoaXMubGF0ZXN0RmVhdHVyZUluZGV4LmxvYWRWVExheWVycygpO1xuXG4gICAgICAgIGZvciAoY29uc3QgaWQgaW4gdGhpcy5idWNrZXRzKSB7XG4gICAgICAgICAgICBjb25zdCBidWNrZXQgPSB0aGlzLmJ1Y2tldHNbaWRdO1xuICAgICAgICAgICAgLy8gQnVja2V0cyBhcmUgZ3JvdXBlZCBieSBjb21tb24gc291cmNlLWxheWVyXG4gICAgICAgICAgICBjb25zdCBzb3VyY2VMYXllcklkID0gYnVja2V0LmxheWVyc1swXVsnc291cmNlTGF5ZXInXSB8fCAnX2dlb2pzb25UaWxlTGF5ZXInO1xuICAgICAgICAgICAgY29uc3Qgc291cmNlTGF5ZXIgPSB2dExheWVyc1tzb3VyY2VMYXllcklkXTtcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZUxheWVyU3RhdGVzID0gc3RhdGVzW3NvdXJjZUxheWVySWRdO1xuICAgICAgICAgICAgaWYgKCFzb3VyY2VMYXllciB8fCAhc291cmNlTGF5ZXJTdGF0ZXMgfHwgT2JqZWN0LmtleXMoc291cmNlTGF5ZXJTdGF0ZXMpLmxlbmd0aCA9PT0gMCkgY29udGludWU7XG5cbiAgICAgICAgICAgIGJ1Y2tldC51cGRhdGUoc291cmNlTGF5ZXJTdGF0ZXMsIHNvdXJjZUxheWVyLCB0aGlzLmltYWdlQXRsYXMgJiYgdGhpcy5pbWFnZUF0bGFzLnBhdHRlcm5Qb3NpdGlvbnMgfHwge30pO1xuICAgICAgICAgICAgaWYgKHBhaW50ZXIgJiYgcGFpbnRlci5zdHlsZSkge1xuICAgICAgICAgICAgICAgIHRoaXMucXVlcnlQYWRkaW5nID0gTWF0aC5tYXgodGhpcy5xdWVyeVBhZGRpbmcsIHBhaW50ZXIuc3R5bGUuZ2V0TGF5ZXIoaWQpLnF1ZXJ5UmFkaXVzKGJ1Y2tldCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgaG9sZGluZ0ZvckZhZGUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnN5bWJvbEZhZGVIb2xkVW50aWwgIT09IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBzeW1ib2xGYWRlRmluaXNoZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhdGhpcy5zeW1ib2xGYWRlSG9sZFVudGlsIHx8IHRoaXMuc3ltYm9sRmFkZUhvbGRVbnRpbCA8IGJyb3dzZXIubm93KCk7XG4gICAgfVxuXG4gICAgY2xlYXJGYWRlSG9sZCgpIHtcbiAgICAgICAgdGhpcy5zeW1ib2xGYWRlSG9sZFVudGlsID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHNldEhvbGREdXJhdGlvbihkdXJhdGlvbjogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuc3ltYm9sRmFkZUhvbGRVbnRpbCA9IGJyb3dzZXIubm93KCkgKyBkdXJhdGlvbjtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFRpbGU7XG4iLCJcbmV4cG9ydCBkZWZhdWx0IFsndHlwZScsICdzb3VyY2UnLCAnc291cmNlLWxheWVyJywgJ21pbnpvb20nLCAnbWF4em9vbScsICdmaWx0ZXInLCAnbGF5b3V0J107XG4iLCIvLyBAZmxvd1xuLy8gT05FX0VNIGNvbnN0YW50IHVzZWQgdG8gZ28gYmV0d2VlbiBcImVtXCIgdW5pdHMgdXNlZCBpbiBzdHlsZSBzcGVjIGFuZCBcInBvaW50c1wiIHVzZWQgaW50ZXJuYWxseSBmb3IgbGF5b3V0XG5cbmV4cG9ydCBkZWZhdWx0IDI0O1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHtcbiAgICBjaGFySGFzVXByaWdodFZlcnRpY2FsT3JpZW50YXRpb24sXG4gICAgY2hhckFsbG93c0lkZW9ncmFwaGljQnJlYWtpbmdcbn0gZnJvbSAnLi4vdXRpbC9zY3JpcHRfZGV0ZWN0aW9uJztcbmltcG9ydCB2ZXJ0aWNhbGl6ZVB1bmN0dWF0aW9uIGZyb20gJy4uL3V0aWwvdmVydGljYWxpemVfcHVuY3R1YXRpb24nO1xuaW1wb3J0IHsgcGx1Z2luIGFzIHJ0bFRleHRQbHVnaW4gfSBmcm9tICcuLi9zb3VyY2UvcnRsX3RleHRfcGx1Z2luJztcbmltcG9ydCBPTkVfRU0gZnJvbSAnLi9vbmVfZW0nO1xuXG5pbXBvcnQgdHlwZSB7U3R5bGVHbHlwaH0gZnJvbSAnLi4vc3R5bGUvc3R5bGVfZ2x5cGgnO1xuaW1wb3J0IHR5cGUge0ltYWdlUG9zaXRpb259IGZyb20gJy4uL3JlbmRlci9pbWFnZV9hdGxhcyc7XG5pbXBvcnQgRm9ybWF0dGVkIGZyb20gJy4uL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi90eXBlcy9mb3JtYXR0ZWQnO1xuXG5jb25zdCBXcml0aW5nTW9kZSA9IHtcbiAgICBob3Jpem9udGFsOiAxLFxuICAgIHZlcnRpY2FsOiAyLFxuICAgIGhvcml6b250YWxPbmx5OiAzXG59O1xuXG5leHBvcnQgeyBzaGFwZVRleHQsIHNoYXBlSWNvbiwgZ2V0QW5jaG9yQWxpZ25tZW50LCBXcml0aW5nTW9kZSB9O1xuXG4vLyBUaGUgcG9zaXRpb24gb2YgYSBnbHlwaCByZWxhdGl2ZSB0byB0aGUgdGV4dCdzIGFuY2hvciBwb2ludC5cbmV4cG9ydCB0eXBlIFBvc2l0aW9uZWRHbHlwaCA9IHtcbiAgICBnbHlwaDogbnVtYmVyLFxuICAgIHg6IG51bWJlcixcbiAgICB5OiBudW1iZXIsXG4gICAgdmVydGljYWw6IGJvb2xlYW4sXG4gICAgc2NhbGU6IG51bWJlcixcbiAgICBmb250U3RhY2s6IHN0cmluZ1xufTtcblxuLy8gQSBjb2xsZWN0aW9uIG9mIHBvc2l0aW9uZWQgZ2x5cGhzIGFuZCBzb21lIG1ldGFkYXRhXG5leHBvcnQgdHlwZSBTaGFwaW5nID0ge1xuICAgIHBvc2l0aW9uZWRHbHlwaHM6IEFycmF5PFBvc2l0aW9uZWRHbHlwaD4sXG4gICAgdG9wOiBudW1iZXIsXG4gICAgYm90dG9tOiBudW1iZXIsXG4gICAgbGVmdDogbnVtYmVyLFxuICAgIHJpZ2h0OiBudW1iZXIsXG4gICAgd3JpdGluZ01vZGU6IDEgfCAyLFxuICAgIGxpbmVDb3VudDogbnVtYmVyLFxuICAgIHRleHQ6IHN0cmluZ1xufTtcblxuZXhwb3J0IHR5cGUgU3ltYm9sQW5jaG9yID0gJ2NlbnRlcicgfCAnbGVmdCcgfCAncmlnaHQnIHwgJ3RvcCcgfCAnYm90dG9tJyB8ICd0b3AtbGVmdCcgfCAndG9wLXJpZ2h0JyB8ICdib3R0b20tbGVmdCcgfCAnYm90dG9tLXJpZ2h0JztcbmV4cG9ydCB0eXBlIFRleHRKdXN0aWZ5ID0gJ2xlZnQnIHwgJ2NlbnRlcicgfCAncmlnaHQnO1xuXG5jbGFzcyBUYWdnZWRTdHJpbmcge1xuICAgIHRleHQ6IHN0cmluZztcbiAgICBzZWN0aW9uSW5kZXg6IEFycmF5PG51bWJlcj4gLy8gbWFwcyBlYWNoIGNoYXJhY3RlciBpbiAndGV4dCcgdG8gaXRzIGNvcnJlc3BvbmRpbmcgZW50cnkgaW4gJ3NlY3Rpb25zJ1xuICAgIHNlY3Rpb25zOiBBcnJheTx7IHNjYWxlOiBudW1iZXIsIGZvbnRTdGFjazogc3RyaW5nIH0+XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy50ZXh0ID0gXCJcIjtcbiAgICAgICAgdGhpcy5zZWN0aW9uSW5kZXggPSBbXTtcbiAgICAgICAgdGhpcy5zZWN0aW9ucyA9IFtdO1xuICAgIH1cblxuICAgIHN0YXRpYyBmcm9tRmVhdHVyZSh0ZXh0OiBGb3JtYXR0ZWQsIGRlZmF1bHRGb250U3RhY2s6IHN0cmluZykge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgVGFnZ2VkU3RyaW5nKCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGV4dC5zZWN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3Qgc2VjdGlvbiA9IHRleHQuc2VjdGlvbnNbaV07XG4gICAgICAgICAgICByZXN1bHQuc2VjdGlvbnMucHVzaCh7XG4gICAgICAgICAgICAgICAgc2NhbGU6IHNlY3Rpb24uc2NhbGUgfHwgMSxcbiAgICAgICAgICAgICAgICBmb250U3RhY2s6IHNlY3Rpb24uZm9udFN0YWNrIHx8IGRlZmF1bHRGb250U3RhY2tcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmVzdWx0LnRleHQgKz0gc2VjdGlvbi50ZXh0O1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBzZWN0aW9uLnRleHQubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICByZXN1bHQuc2VjdGlvbkluZGV4LnB1c2goaSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBsZW5ndGgoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGV4dC5sZW5ndGg7XG4gICAgfVxuXG4gICAgZ2V0U2VjdGlvbihpbmRleDogbnVtYmVyKTogeyBzY2FsZTogbnVtYmVyLCBmb250U3RhY2s6IHN0cmluZyB9IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VjdGlvbnNbdGhpcy5zZWN0aW9uSW5kZXhbaW5kZXhdXTtcbiAgICB9XG5cbiAgICBnZXRDaGFyQ29kZShpbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGV4dC5jaGFyQ29kZUF0KGluZGV4KTtcbiAgICB9XG5cbiAgICB2ZXJ0aWNhbGl6ZVB1bmN0dWF0aW9uKCkge1xuICAgICAgICB0aGlzLnRleHQgPSB2ZXJ0aWNhbGl6ZVB1bmN0dWF0aW9uKHRoaXMudGV4dCk7XG4gICAgfVxuXG4gICAgdHJpbSgpIHtcbiAgICAgICAgbGV0IGJlZ2lubmluZ1doaXRlc3BhY2UgPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gMDtcbiAgICAgICAgICAgIGkgPCB0aGlzLnRleHQubGVuZ3RoICYmIHdoaXRlc3BhY2VbdGhpcy50ZXh0LmNoYXJDb2RlQXQoaSldO1xuICAgICAgICAgICAgaSsrKSB7XG4gICAgICAgICAgICBiZWdpbm5pbmdXaGl0ZXNwYWNlKys7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHRyYWlsaW5nV2hpdGVzcGFjZSA9IHRoaXMudGV4dC5sZW5ndGg7XG4gICAgICAgIGZvciAobGV0IGkgPSB0aGlzLnRleHQubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgIGkgPj0gMCAmJiBpID49IGJlZ2lubmluZ1doaXRlc3BhY2UgJiYgd2hpdGVzcGFjZVt0aGlzLnRleHQuY2hhckNvZGVBdChpKV07XG4gICAgICAgICAgICBpLS0pIHtcbiAgICAgICAgICAgIHRyYWlsaW5nV2hpdGVzcGFjZS0tO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudGV4dCA9IHRoaXMudGV4dC5zdWJzdHJpbmcoYmVnaW5uaW5nV2hpdGVzcGFjZSwgdHJhaWxpbmdXaGl0ZXNwYWNlKTtcbiAgICAgICAgdGhpcy5zZWN0aW9uSW5kZXggPSB0aGlzLnNlY3Rpb25JbmRleC5zbGljZShiZWdpbm5pbmdXaGl0ZXNwYWNlLCB0cmFpbGluZ1doaXRlc3BhY2UpO1xuICAgIH1cblxuICAgIHN1YnN0cmluZyhzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcik6IFRhZ2dlZFN0cmluZyB7XG4gICAgICAgIGNvbnN0IHN1YnN0cmluZyA9IG5ldyBUYWdnZWRTdHJpbmcoKTtcbiAgICAgICAgc3Vic3RyaW5nLnRleHQgPSB0aGlzLnRleHQuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpO1xuICAgICAgICBzdWJzdHJpbmcuc2VjdGlvbkluZGV4ID0gdGhpcy5zZWN0aW9uSW5kZXguc2xpY2Uoc3RhcnQsIGVuZCk7XG4gICAgICAgIHN1YnN0cmluZy5zZWN0aW9ucyA9IHRoaXMuc2VjdGlvbnM7XG4gICAgICAgIHJldHVybiBzdWJzdHJpbmc7XG4gICAgfVxuXG4gICAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGV4dDtcbiAgICB9XG5cbiAgICBnZXRNYXhTY2FsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VjdGlvbkluZGV4LnJlZHVjZSgobWF4LCBpbmRleCkgPT4gTWF0aC5tYXgobWF4LCB0aGlzLnNlY3Rpb25zW2luZGV4XS5zY2FsZSksIDApO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gYnJlYWtMaW5lcyhpbnB1dDogVGFnZ2VkU3RyaW5nLCBsaW5lQnJlYWtQb2ludHM6IEFycmF5PG51bWJlcj4pOiBBcnJheTxUYWdnZWRTdHJpbmc+IHtcbiAgICBjb25zdCBsaW5lcyA9IFtdO1xuICAgIGNvbnN0IHRleHQgPSBpbnB1dC50ZXh0O1xuICAgIGxldCBzdGFydCA9IDA7XG4gICAgZm9yIChjb25zdCBsaW5lQnJlYWsgb2YgbGluZUJyZWFrUG9pbnRzKSB7XG4gICAgICAgIGxpbmVzLnB1c2goaW5wdXQuc3Vic3RyaW5nKHN0YXJ0LCBsaW5lQnJlYWspKTtcbiAgICAgICAgc3RhcnQgPSBsaW5lQnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKHN0YXJ0IDwgdGV4dC5sZW5ndGgpIHtcbiAgICAgICAgbGluZXMucHVzaChpbnB1dC5zdWJzdHJpbmcoc3RhcnQsIHRleHQubGVuZ3RoKSk7XG4gICAgfVxuICAgIHJldHVybiBsaW5lcztcbn1cblxuZnVuY3Rpb24gc2hhcGVUZXh0KHRleHQ6IEZvcm1hdHRlZCxcbiAgICAgICAgICAgICAgICAgICBnbHlwaHM6IHtbc3RyaW5nXToge1tudW1iZXJdOiA/U3R5bGVHbHlwaH19LFxuICAgICAgICAgICAgICAgICAgIGRlZmF1bHRGb250U3RhY2s6IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICBtYXhXaWR0aDogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgIGxpbmVIZWlnaHQ6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICB0ZXh0QW5jaG9yOiBTeW1ib2xBbmNob3IsXG4gICAgICAgICAgICAgICAgICAgdGV4dEp1c3RpZnk6IFRleHRKdXN0aWZ5LFxuICAgICAgICAgICAgICAgICAgIHNwYWNpbmc6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGU6IFtudW1iZXIsIG51bWJlcl0sXG4gICAgICAgICAgICAgICAgICAgd3JpdGluZ01vZGU6IDEgfCAyKTogU2hhcGluZyB8IGZhbHNlIHtcbiAgICBjb25zdCBsb2dpY2FsSW5wdXQgPSBUYWdnZWRTdHJpbmcuZnJvbUZlYXR1cmUodGV4dCwgZGVmYXVsdEZvbnRTdGFjayk7XG5cbiAgICBpZiAod3JpdGluZ01vZGUgPT09IFdyaXRpbmdNb2RlLnZlcnRpY2FsKSB7XG4gICAgICAgIGxvZ2ljYWxJbnB1dC52ZXJ0aWNhbGl6ZVB1bmN0dWF0aW9uKCk7XG4gICAgfVxuXG4gICAgbGV0IGxpbmVzOiBBcnJheTxUYWdnZWRTdHJpbmc+O1xuXG4gICAgY29uc3Qge3Byb2Nlc3NCaWRpcmVjdGlvbmFsVGV4dCwgcHJvY2Vzc1N0eWxlZEJpZGlyZWN0aW9uYWxUZXh0fSA9IHJ0bFRleHRQbHVnaW47XG4gICAgaWYgKHByb2Nlc3NCaWRpcmVjdGlvbmFsVGV4dCAmJiBsb2dpY2FsSW5wdXQuc2VjdGlvbnMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIC8vIEJpZGkgZG9lc24ndCBoYXZlIHRvIGJlIHN0eWxlLWF3YXJlXG4gICAgICAgIGxpbmVzID0gW107XG4gICAgICAgIGNvbnN0IHVudGFnZ2VkTGluZXMgPVxuICAgICAgICAgICAgcHJvY2Vzc0JpZGlyZWN0aW9uYWxUZXh0KGxvZ2ljYWxJbnB1dC50b1N0cmluZygpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGVybWluZUxpbmVCcmVha3MobG9naWNhbElucHV0LCBzcGFjaW5nLCBtYXhXaWR0aCwgZ2x5cGhzKSk7XG4gICAgICAgIGZvciAoY29uc3QgbGluZSBvZiB1bnRhZ2dlZExpbmVzKSB7XG4gICAgICAgICAgICBjb25zdCB0YWdnZWRMaW5lID0gbmV3IFRhZ2dlZFN0cmluZygpO1xuICAgICAgICAgICAgdGFnZ2VkTGluZS50ZXh0ID0gbGluZTtcbiAgICAgICAgICAgIHRhZ2dlZExpbmUuc2VjdGlvbnMgPSBsb2dpY2FsSW5wdXQuc2VjdGlvbnM7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB0YWdnZWRMaW5lLnNlY3Rpb25JbmRleC5wdXNoKDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGluZXMucHVzaCh0YWdnZWRMaW5lKTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvY2Vzc1N0eWxlZEJpZGlyZWN0aW9uYWxUZXh0KSB7XG4gICAgICAgIC8vIE5lZWQgdmVyc2lvbiBvZiBtYXBib3gtZ2wtcnRsLXRleHQgd2l0aCBzdHlsZSBzdXBwb3J0IGZvciBjb21iaW5pbmcgUlRMIHRleHRcbiAgICAgICAgLy8gd2l0aCBmb3JtYXR0aW5nXG4gICAgICAgIGxpbmVzID0gW107XG4gICAgICAgIGNvbnN0IHByb2Nlc3NlZExpbmVzID1cbiAgICAgICAgICAgIHByb2Nlc3NTdHlsZWRCaWRpcmVjdGlvbmFsVGV4dChsb2dpY2FsSW5wdXQudGV4dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dpY2FsSW5wdXQuc2VjdGlvbkluZGV4LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGVybWluZUxpbmVCcmVha3MobG9naWNhbElucHV0LCBzcGFjaW5nLCBtYXhXaWR0aCwgZ2x5cGhzKSk7XG4gICAgICAgIGZvciAoY29uc3QgbGluZSBvZiBwcm9jZXNzZWRMaW5lcykge1xuICAgICAgICAgICAgY29uc3QgdGFnZ2VkTGluZSA9IG5ldyBUYWdnZWRTdHJpbmcoKTtcbiAgICAgICAgICAgIHRhZ2dlZExpbmUudGV4dCA9IGxpbmVbMF07XG4gICAgICAgICAgICB0YWdnZWRMaW5lLnNlY3Rpb25JbmRleCA9IGxpbmVbMV07XG4gICAgICAgICAgICB0YWdnZWRMaW5lLnNlY3Rpb25zID0gbG9naWNhbElucHV0LnNlY3Rpb25zO1xuICAgICAgICAgICAgbGluZXMucHVzaCh0YWdnZWRMaW5lKTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIGxpbmVzID0gYnJlYWtMaW5lcyhsb2dpY2FsSW5wdXQsIGRldGVybWluZUxpbmVCcmVha3MobG9naWNhbElucHV0LCBzcGFjaW5nLCBtYXhXaWR0aCwgZ2x5cGhzKSk7XG4gICAgfVxuXG4gICAgY29uc3QgcG9zaXRpb25lZEdseXBocyA9IFtdO1xuICAgIGNvbnN0IHNoYXBpbmcgPSB7XG4gICAgICAgIHBvc2l0aW9uZWRHbHlwaHMsXG4gICAgICAgIHRleHQ6IGxvZ2ljYWxJbnB1dC50b1N0cmluZygpLFxuICAgICAgICB0b3A6IHRyYW5zbGF0ZVsxXSxcbiAgICAgICAgYm90dG9tOiB0cmFuc2xhdGVbMV0sXG4gICAgICAgIGxlZnQ6IHRyYW5zbGF0ZVswXSxcbiAgICAgICAgcmlnaHQ6IHRyYW5zbGF0ZVswXSxcbiAgICAgICAgd3JpdGluZ01vZGUsXG4gICAgICAgIGxpbmVDb3VudDogbGluZXMubGVuZ3RoXG4gICAgfTtcblxuICAgIHNoYXBlTGluZXMoc2hhcGluZywgZ2x5cGhzLCBsaW5lcywgbGluZUhlaWdodCwgdGV4dEFuY2hvciwgdGV4dEp1c3RpZnksIHdyaXRpbmdNb2RlLCBzcGFjaW5nKTtcbiAgICBpZiAoIXBvc2l0aW9uZWRHbHlwaHMubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG5cbiAgICByZXR1cm4gc2hhcGluZztcbn1cblxuLy8gdXNpbmcgY29tcHV0ZWQgcHJvcGVydGllcyBkdWUgdG8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL2Zsb3cvaXNzdWVzLzM4MFxuLyogZXNsaW50IG5vLXVzZWxlc3MtY29tcHV0ZWQta2V5OiAwICovXG5cbmNvbnN0IHdoaXRlc3BhY2U6IHtbbnVtYmVyXTogYm9vbGVhbn0gPSB7XG4gICAgWzB4MDldOiB0cnVlLCAvLyB0YWJcbiAgICBbMHgwYV06IHRydWUsIC8vIG5ld2xpbmVcbiAgICBbMHgwYl06IHRydWUsIC8vIHZlcnRpY2FsIHRhYlxuICAgIFsweDBjXTogdHJ1ZSwgLy8gZm9ybSBmZWVkXG4gICAgWzB4MGRdOiB0cnVlLCAvLyBjYXJyaWFnZSByZXR1cm5cbiAgICBbMHgyMF06IHRydWUsIC8vIHNwYWNlXG59O1xuXG5jb25zdCBicmVha2FibGU6IHtbbnVtYmVyXTogYm9vbGVhbn0gPSB7XG4gICAgWzB4MGFdOiAgIHRydWUsIC8vIG5ld2xpbmVcbiAgICBbMHgyMF06ICAgdHJ1ZSwgLy8gc3BhY2VcbiAgICBbMHgyNl06ICAgdHJ1ZSwgLy8gYW1wZXJzYW5kXG4gICAgWzB4MjhdOiAgIHRydWUsIC8vIGxlZnQgcGFyZW50aGVzaXNcbiAgICBbMHgyOV06ICAgdHJ1ZSwgLy8gcmlnaHQgcGFyZW50aGVzaXNcbiAgICBbMHgyYl06ICAgdHJ1ZSwgLy8gcGx1cyBzaWduXG4gICAgWzB4MmRdOiAgIHRydWUsIC8vIGh5cGhlbi1taW51c1xuICAgIFsweDJmXTogICB0cnVlLCAvLyBzb2xpZHVzXG4gICAgWzB4YWRdOiAgIHRydWUsIC8vIHNvZnQgaHlwaGVuXG4gICAgWzB4YjddOiAgIHRydWUsIC8vIG1pZGRsZSBkb3RcbiAgICBbMHgyMDBiXTogdHJ1ZSwgLy8gemVyby13aWR0aCBzcGFjZVxuICAgIFsweDIwMTBdOiB0cnVlLCAvLyBoeXBoZW5cbiAgICBbMHgyMDEzXTogdHJ1ZSwgLy8gZW4gZGFzaFxuICAgIFsweDIwMjddOiB0cnVlICAvLyBpbnRlcnB1bmN0XG4gICAgLy8gTWFueSBvdGhlciBjaGFyYWN0ZXJzIG1heSBiZSByZWFzb25hYmxlIGJyZWFrcG9pbnRzXG4gICAgLy8gQ29uc2lkZXIgXCJuZXV0cmFsIG9yaWVudGF0aW9uXCIgY2hhcmFjdGVycyBhdCBzY3JpcHREZXRlY3Rpb24uY2hhckhhc05ldXRyYWxWZXJ0aWNhbE9yaWVudGF0aW9uXG4gICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvbWFwYm94LWdsLWpzL2lzc3Vlcy8zNjU4XG59O1xuXG5mdW5jdGlvbiBkZXRlcm1pbmVBdmVyYWdlTGluZVdpZHRoKGxvZ2ljYWxJbnB1dDogVGFnZ2VkU3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFjaW5nOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFdpZHRoOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoTWFwOiB7W3N0cmluZ106IHtbbnVtYmVyXTogP1N0eWxlR2x5cGh9fSkge1xuICAgIGxldCB0b3RhbFdpZHRoID0gMDtcblxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBsb2dpY2FsSW5wdXQubGVuZ3RoKCk7IGluZGV4KyspIHtcbiAgICAgICAgY29uc3Qgc2VjdGlvbiA9IGxvZ2ljYWxJbnB1dC5nZXRTZWN0aW9uKGluZGV4KTtcbiAgICAgICAgY29uc3QgcG9zaXRpb25zID0gZ2x5cGhNYXBbc2VjdGlvbi5mb250U3RhY2tdO1xuICAgICAgICBjb25zdCBnbHlwaCA9IHBvc2l0aW9ucyAmJiBwb3NpdGlvbnNbbG9naWNhbElucHV0LmdldENoYXJDb2RlKGluZGV4KV07XG4gICAgICAgIGlmICghZ2x5cGgpXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgdG90YWxXaWR0aCArPSBnbHlwaC5tZXRyaWNzLmFkdmFuY2UgKiBzZWN0aW9uLnNjYWxlICsgc3BhY2luZztcbiAgICB9XG5cbiAgICBjb25zdCBsaW5lQ291bnQgPSBNYXRoLm1heCgxLCBNYXRoLmNlaWwodG90YWxXaWR0aCAvIG1heFdpZHRoKSk7XG4gICAgcmV0dXJuIHRvdGFsV2lkdGggLyBsaW5lQ291bnQ7XG59XG5cbmZ1bmN0aW9uIGNhbGN1bGF0ZUJhZG5lc3MobGluZVdpZHRoOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFdpZHRoOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmFsdHk6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaXNMYXN0QnJlYWs6IGJvb2xlYW4pIHtcbiAgICBjb25zdCByYWdnZWRuZXNzID0gTWF0aC5wb3cobGluZVdpZHRoIC0gdGFyZ2V0V2lkdGgsIDIpO1xuICAgIGlmIChpc0xhc3RCcmVhaykge1xuICAgICAgICAvLyBGYXZvciBmaW5hbHMgbGluZXMgc2hvcnRlciB0aGFuIGF2ZXJhZ2Ugb3ZlciBsb25nZXIgdGhhbiBhdmVyYWdlXG4gICAgICAgIGlmIChsaW5lV2lkdGggPCB0YXJnZXRXaWR0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHJhZ2dlZG5lc3MgLyAyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHJhZ2dlZG5lc3MgKiAyO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJhZ2dlZG5lc3MgKyBNYXRoLmFicyhwZW5hbHR5KSAqIHBlbmFsdHk7XG59XG5cbmZ1bmN0aW9uIGNhbGN1bGF0ZVBlbmFsdHkoY29kZVBvaW50OiBudW1iZXIsIG5leHRDb2RlUG9pbnQ6IG51bWJlcikge1xuICAgIGxldCBwZW5hbHR5ID0gMDtcbiAgICAvLyBGb3JjZSBicmVhayBvbiBuZXdsaW5lXG4gICAgaWYgKGNvZGVQb2ludCA9PT0gMHgwYSkge1xuICAgICAgICBwZW5hbHR5IC09IDEwMDAwO1xuICAgIH1cbiAgICAvLyBQZW5hbGl6ZSBvcGVuIHBhcmVudGhlc2lzIGF0IGVuZCBvZiBsaW5lXG4gICAgaWYgKGNvZGVQb2ludCA9PT0gMHgyOCB8fCBjb2RlUG9pbnQgPT09IDB4ZmYwOCkge1xuICAgICAgICBwZW5hbHR5ICs9IDUwO1xuICAgIH1cblxuICAgIC8vIFBlbmFsaXplIGNsb3NlIHBhcmVudGhlc2lzIGF0IGJlZ2lubmluZyBvZiBsaW5lXG4gICAgaWYgKG5leHRDb2RlUG9pbnQgPT09IDB4MjkgfHwgbmV4dENvZGVQb2ludCA9PT0gMHhmZjA5KSB7XG4gICAgICAgIHBlbmFsdHkgKz0gNTA7XG4gICAgfVxuICAgIHJldHVybiBwZW5hbHR5O1xufVxuXG50eXBlIEJyZWFrID0ge1xuICAgIGluZGV4OiBudW1iZXIsXG4gICAgeDogbnVtYmVyLFxuICAgIHByaW9yQnJlYWs6ID9CcmVhayxcbiAgICBiYWRuZXNzOiBudW1iZXJcbn07XG5cbmZ1bmN0aW9uIGV2YWx1YXRlQnJlYWsoYnJlYWtJbmRleDogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICBicmVha1g6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0V2lkdGg6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgcG90ZW50aWFsQnJlYWtzOiBBcnJheTxCcmVhaz4sXG4gICAgICAgICAgICAgICAgICAgICAgIHBlbmFsdHk6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgaXNMYXN0QnJlYWs6IGJvb2xlYW4pOiBCcmVhayB7XG4gICAgLy8gV2UgY291bGQgc2tpcCBldmFsdWF0aW5nIGJyZWFrcyB3aGVyZSB0aGUgbGluZSBsZW5ndGggKGJyZWFrWCAtIHByaW9yQnJlYWsueCkgPiBtYXhXaWR0aFxuICAgIC8vICAuLi5idXQgaW4gZmFjdCB3ZSBhbGxvdyBsaW5lcyBsb25nZXIgdGhhbiBtYXhXaWR0aCAoaWYgdGhlcmUncyBubyBicmVhayBwb2ludHMpXG4gICAgLy8gIC4uLmFuZCB3aGVuIHRhcmdldFdpZHRoIGFuZCBtYXhXaWR0aCBhcmUgY2xvc2UsIHN0cmljdGx5IGVuZm9yY2luZyBtYXhXaWR0aCBjYW4gZ2l2ZVxuICAgIC8vICAgICBtb3JlIGxvcHNpZGVkIHJlc3VsdHMuXG5cbiAgICBsZXQgYmVzdFByaW9yQnJlYWs6ID9CcmVhayA9IG51bGw7XG4gICAgbGV0IGJlc3RCcmVha0JhZG5lc3MgPSBjYWxjdWxhdGVCYWRuZXNzKGJyZWFrWCwgdGFyZ2V0V2lkdGgsIHBlbmFsdHksIGlzTGFzdEJyZWFrKTtcblxuICAgIGZvciAoY29uc3QgcG90ZW50aWFsQnJlYWsgb2YgcG90ZW50aWFsQnJlYWtzKSB7XG4gICAgICAgIGNvbnN0IGxpbmVXaWR0aCA9IGJyZWFrWCAtIHBvdGVudGlhbEJyZWFrLng7XG4gICAgICAgIGNvbnN0IGJyZWFrQmFkbmVzcyA9XG4gICAgICAgICAgICBjYWxjdWxhdGVCYWRuZXNzKGxpbmVXaWR0aCwgdGFyZ2V0V2lkdGgsIHBlbmFsdHksIGlzTGFzdEJyZWFrKSArIHBvdGVudGlhbEJyZWFrLmJhZG5lc3M7XG4gICAgICAgIGlmIChicmVha0JhZG5lc3MgPD0gYmVzdEJyZWFrQmFkbmVzcykge1xuICAgICAgICAgICAgYmVzdFByaW9yQnJlYWsgPSBwb3RlbnRpYWxCcmVhaztcbiAgICAgICAgICAgIGJlc3RCcmVha0JhZG5lc3MgPSBicmVha0JhZG5lc3M7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBpbmRleDogYnJlYWtJbmRleCxcbiAgICAgICAgeDogYnJlYWtYLFxuICAgICAgICBwcmlvckJyZWFrOiBiZXN0UHJpb3JCcmVhayxcbiAgICAgICAgYmFkbmVzczogYmVzdEJyZWFrQmFkbmVzc1xuICAgIH07XG59XG5cbmZ1bmN0aW9uIGxlYXN0QmFkQnJlYWtzKGxhc3RMaW5lQnJlYWs6ID9CcmVhayk6IEFycmF5PG51bWJlcj4ge1xuICAgIGlmICghbGFzdExpbmVCcmVhaykge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIHJldHVybiBsZWFzdEJhZEJyZWFrcyhsYXN0TGluZUJyZWFrLnByaW9yQnJlYWspLmNvbmNhdChsYXN0TGluZUJyZWFrLmluZGV4KTtcbn1cblxuZnVuY3Rpb24gZGV0ZXJtaW5lTGluZUJyZWFrcyhsb2dpY2FsSW5wdXQ6IFRhZ2dlZFN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhY2luZzogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhXaWR0aDogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaE1hcDoge1tzdHJpbmddOiB7W251bWJlcl06ID9TdHlsZUdseXBofX0pOiBBcnJheTxudW1iZXI+IHtcbiAgICBpZiAoIW1heFdpZHRoKVxuICAgICAgICByZXR1cm4gW107XG5cbiAgICBpZiAoIWxvZ2ljYWxJbnB1dClcbiAgICAgICAgcmV0dXJuIFtdO1xuXG4gICAgY29uc3QgcG90ZW50aWFsTGluZUJyZWFrcyA9IFtdO1xuICAgIGNvbnN0IHRhcmdldFdpZHRoID0gZGV0ZXJtaW5lQXZlcmFnZUxpbmVXaWR0aChsb2dpY2FsSW5wdXQsIHNwYWNpbmcsIG1heFdpZHRoLCBnbHlwaE1hcCk7XG5cbiAgICBsZXQgY3VycmVudFggPSAwO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsb2dpY2FsSW5wdXQubGVuZ3RoKCk7IGkrKykge1xuICAgICAgICBjb25zdCBzZWN0aW9uID0gbG9naWNhbElucHV0LmdldFNlY3Rpb24oaSk7XG4gICAgICAgIGNvbnN0IGNvZGVQb2ludCA9IGxvZ2ljYWxJbnB1dC5nZXRDaGFyQ29kZShpKTtcbiAgICAgICAgY29uc3QgcG9zaXRpb25zID0gZ2x5cGhNYXBbc2VjdGlvbi5mb250U3RhY2tdO1xuICAgICAgICBjb25zdCBnbHlwaCA9IHBvc2l0aW9ucyAmJiBwb3NpdGlvbnNbY29kZVBvaW50XTtcblxuICAgICAgICBpZiAoZ2x5cGggJiYgIXdoaXRlc3BhY2VbY29kZVBvaW50XSlcbiAgICAgICAgICAgIGN1cnJlbnRYICs9IGdseXBoLm1ldHJpY3MuYWR2YW5jZSAqIHNlY3Rpb24uc2NhbGUgKyBzcGFjaW5nO1xuXG4gICAgICAgIC8vIElkZW9ncmFwaGljIGNoYXJhY3RlcnMsIHNwYWNlcywgYW5kIHdvcmQtYnJlYWtpbmcgcHVuY3R1YXRpb24gdGhhdCBvZnRlbiBhcHBlYXIgd2l0aG91dFxuICAgICAgICAvLyBzdXJyb3VuZGluZyBzcGFjZXMuXG4gICAgICAgIGlmICgoaSA8IGxvZ2ljYWxJbnB1dC5sZW5ndGgoKSAtIDEpICYmXG4gICAgICAgICAgICAoYnJlYWthYmxlW2NvZGVQb2ludF0gfHxcbiAgICAgICAgICAgICAgICBjaGFyQWxsb3dzSWRlb2dyYXBoaWNCcmVha2luZyhjb2RlUG9pbnQpKSkge1xuXG4gICAgICAgICAgICBwb3RlbnRpYWxMaW5lQnJlYWtzLnB1c2goXG4gICAgICAgICAgICAgICAgZXZhbHVhdGVCcmVhayhcbiAgICAgICAgICAgICAgICAgICAgaSArIDEsXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRYLFxuICAgICAgICAgICAgICAgICAgICB0YXJnZXRXaWR0aCxcbiAgICAgICAgICAgICAgICAgICAgcG90ZW50aWFsTGluZUJyZWFrcyxcbiAgICAgICAgICAgICAgICAgICAgY2FsY3VsYXRlUGVuYWx0eShjb2RlUG9pbnQsIGxvZ2ljYWxJbnB1dC5nZXRDaGFyQ29kZShpICsgMSkpLFxuICAgICAgICAgICAgICAgICAgICBmYWxzZSkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGxlYXN0QmFkQnJlYWtzKFxuICAgICAgICBldmFsdWF0ZUJyZWFrKFxuICAgICAgICAgICAgbG9naWNhbElucHV0Lmxlbmd0aCgpLFxuICAgICAgICAgICAgY3VycmVudFgsXG4gICAgICAgICAgICB0YXJnZXRXaWR0aCxcbiAgICAgICAgICAgIHBvdGVudGlhbExpbmVCcmVha3MsXG4gICAgICAgICAgICAwLFxuICAgICAgICAgICAgdHJ1ZSkpO1xufVxuXG5mdW5jdGlvbiBnZXRBbmNob3JBbGlnbm1lbnQoYW5jaG9yOiBTeW1ib2xBbmNob3IpIHtcbiAgICBsZXQgaG9yaXpvbnRhbEFsaWduID0gMC41LCB2ZXJ0aWNhbEFsaWduID0gMC41O1xuXG4gICAgc3dpdGNoIChhbmNob3IpIHtcbiAgICBjYXNlICdyaWdodCc6XG4gICAgY2FzZSAndG9wLXJpZ2h0JzpcbiAgICBjYXNlICdib3R0b20tcmlnaHQnOlxuICAgICAgICBob3Jpem9udGFsQWxpZ24gPSAxO1xuICAgICAgICBicmVhaztcbiAgICBjYXNlICdsZWZ0JzpcbiAgICBjYXNlICd0b3AtbGVmdCc6XG4gICAgY2FzZSAnYm90dG9tLWxlZnQnOlxuICAgICAgICBob3Jpem9udGFsQWxpZ24gPSAwO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICBzd2l0Y2ggKGFuY2hvcikge1xuICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgY2FzZSAnYm90dG9tLXJpZ2h0JzpcbiAgICBjYXNlICdib3R0b20tbGVmdCc6XG4gICAgICAgIHZlcnRpY2FsQWxpZ24gPSAxO1xuICAgICAgICBicmVhaztcbiAgICBjYXNlICd0b3AnOlxuICAgIGNhc2UgJ3RvcC1yaWdodCc6XG4gICAgY2FzZSAndG9wLWxlZnQnOlxuICAgICAgICB2ZXJ0aWNhbEFsaWduID0gMDtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgaG9yaXpvbnRhbEFsaWduLCB2ZXJ0aWNhbEFsaWduIH07XG59XG5cbmZ1bmN0aW9uIHNoYXBlTGluZXMoc2hhcGluZzogU2hhcGluZyxcbiAgICAgICAgICAgICAgICAgICAgZ2x5cGhNYXA6IHtbc3RyaW5nXToge1tudW1iZXJdOiA/U3R5bGVHbHlwaH19LFxuICAgICAgICAgICAgICAgICAgICBsaW5lczogQXJyYXk8VGFnZ2VkU3RyaW5nPixcbiAgICAgICAgICAgICAgICAgICAgbGluZUhlaWdodDogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICB0ZXh0QW5jaG9yOiBTeW1ib2xBbmNob3IsXG4gICAgICAgICAgICAgICAgICAgIHRleHRKdXN0aWZ5OiBUZXh0SnVzdGlmeSxcbiAgICAgICAgICAgICAgICAgICAgd3JpdGluZ01vZGU6IDEgfCAyLFxuICAgICAgICAgICAgICAgICAgICBzcGFjaW5nOiBudW1iZXIpIHtcbiAgICAvLyB0aGUgeSBvZmZzZXQgKnNob3VsZCogYmUgcGFydCBvZiB0aGUgZm9udCBtZXRhZGF0YVxuICAgIGNvbnN0IHlPZmZzZXQgPSAtMTc7XG5cbiAgICBsZXQgeCA9IDA7XG4gICAgbGV0IHkgPSB5T2Zmc2V0O1xuXG4gICAgbGV0IG1heExpbmVMZW5ndGggPSAwO1xuICAgIGNvbnN0IHBvc2l0aW9uZWRHbHlwaHMgPSBzaGFwaW5nLnBvc2l0aW9uZWRHbHlwaHM7XG5cbiAgICBjb25zdCBqdXN0aWZ5ID1cbiAgICAgICAgdGV4dEp1c3RpZnkgPT09ICdyaWdodCcgPyAxIDpcbiAgICAgICAgdGV4dEp1c3RpZnkgPT09ICdsZWZ0JyA/IDAgOiAwLjU7XG5cbiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcbiAgICAgICAgbGluZS50cmltKCk7XG5cbiAgICAgICAgY29uc3QgbGluZU1heFNjYWxlID0gbGluZS5nZXRNYXhTY2FsZSgpO1xuXG4gICAgICAgIGlmICghbGluZS5sZW5ndGgoKSkge1xuICAgICAgICAgICAgeSArPSBsaW5lSGVpZ2h0OyAvLyBTdGlsbCBuZWVkIGEgbGluZSBmZWVkIGFmdGVyIGVtcHR5IGxpbmVcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbGluZVN0YXJ0SW5kZXggPSBwb3NpdGlvbmVkR2x5cGhzLmxlbmd0aDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lLmxlbmd0aCgpOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHNlY3Rpb24gPSBsaW5lLmdldFNlY3Rpb24oaSk7XG4gICAgICAgICAgICBjb25zdCBjb2RlUG9pbnQgPSBsaW5lLmdldENoYXJDb2RlKGkpO1xuICAgICAgICAgICAgLy8gV2UgZG9uJ3Qga25vdyB0aGUgYmFzZWxpbmUsIGJ1dCBzaW5jZSB3ZSdyZSBsYXlpbmcgb3V0XG4gICAgICAgICAgICAvLyBhdCAyNCBwb2ludHMsIHdlIGNhbiBjYWxjdWxhdGUgaG93IG11Y2ggaXQgd2lsbCBtb3ZlIHdoZW5cbiAgICAgICAgICAgIC8vIHdlIHNjYWxlIHVwIG9yIGRvd24uXG4gICAgICAgICAgICBjb25zdCBiYXNlbGluZU9mZnNldCA9IChsaW5lTWF4U2NhbGUgLSBzZWN0aW9uLnNjYWxlKSAqIDI0O1xuICAgICAgICAgICAgY29uc3QgcG9zaXRpb25zID0gZ2x5cGhNYXBbc2VjdGlvbi5mb250U3RhY2tdO1xuICAgICAgICAgICAgY29uc3QgZ2x5cGggPSBwb3NpdGlvbnMgJiYgcG9zaXRpb25zW2NvZGVQb2ludF07XG5cbiAgICAgICAgICAgIGlmICghZ2x5cGgpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICBpZiAoIWNoYXJIYXNVcHJpZ2h0VmVydGljYWxPcmllbnRhdGlvbihjb2RlUG9pbnQpIHx8IHdyaXRpbmdNb2RlID09PSBXcml0aW5nTW9kZS5ob3Jpem9udGFsKSB7XG4gICAgICAgICAgICAgICAgcG9zaXRpb25lZEdseXBocy5wdXNoKHtnbHlwaDogY29kZVBvaW50LCB4LCB5OiB5ICsgYmFzZWxpbmVPZmZzZXQsIHZlcnRpY2FsOiBmYWxzZSwgc2NhbGU6IHNlY3Rpb24uc2NhbGUsIGZvbnRTdGFjazogc2VjdGlvbi5mb250U3RhY2t9KTtcbiAgICAgICAgICAgICAgICB4ICs9IGdseXBoLm1ldHJpY3MuYWR2YW5jZSAqIHNlY3Rpb24uc2NhbGUgKyBzcGFjaW5nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwb3NpdGlvbmVkR2x5cGhzLnB1c2goe2dseXBoOiBjb2RlUG9pbnQsIHgsIHk6IGJhc2VsaW5lT2Zmc2V0LCB2ZXJ0aWNhbDogdHJ1ZSwgc2NhbGU6IHNlY3Rpb24uc2NhbGUsIGZvbnRTdGFjazogc2VjdGlvbi5mb250U3RhY2t9KTtcbiAgICAgICAgICAgICAgICB4ICs9IE9ORV9FTSAqIHNlY3Rpb24uc2NhbGUgKyBzcGFjaW5nO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gT25seSBqdXN0aWZ5IGlmIHdlIHBsYWNlZCBhdCBsZWFzdCBvbmUgZ2x5cGhcbiAgICAgICAgaWYgKHBvc2l0aW9uZWRHbHlwaHMubGVuZ3RoICE9PSBsaW5lU3RhcnRJbmRleCkge1xuICAgICAgICAgICAgY29uc3QgbGluZUxlbmd0aCA9IHggLSBzcGFjaW5nO1xuICAgICAgICAgICAgbWF4TGluZUxlbmd0aCA9IE1hdGgubWF4KGxpbmVMZW5ndGgsIG1heExpbmVMZW5ndGgpO1xuXG4gICAgICAgICAgICBqdXN0aWZ5TGluZShwb3NpdGlvbmVkR2x5cGhzLCBnbHlwaE1hcCwgbGluZVN0YXJ0SW5kZXgsIHBvc2l0aW9uZWRHbHlwaHMubGVuZ3RoIC0gMSwganVzdGlmeSk7XG4gICAgICAgIH1cblxuICAgICAgICB4ID0gMDtcbiAgICAgICAgeSArPSBsaW5lSGVpZ2h0ICogbGluZU1heFNjYWxlO1xuICAgIH1cblxuICAgIGNvbnN0IHtob3Jpem9udGFsQWxpZ24sIHZlcnRpY2FsQWxpZ259ID0gZ2V0QW5jaG9yQWxpZ25tZW50KHRleHRBbmNob3IpO1xuICAgIGFsaWduKHBvc2l0aW9uZWRHbHlwaHMsIGp1c3RpZnksIGhvcml6b250YWxBbGlnbiwgdmVydGljYWxBbGlnbiwgbWF4TGluZUxlbmd0aCwgbGluZUhlaWdodCwgbGluZXMubGVuZ3RoKTtcblxuICAgIC8vIENhbGN1bGF0ZSB0aGUgYm91bmRpbmcgYm94XG4gICAgY29uc3QgaGVpZ2h0ID0geSAtIHlPZmZzZXQ7XG5cbiAgICBzaGFwaW5nLnRvcCArPSAtdmVydGljYWxBbGlnbiAqIGhlaWdodDtcbiAgICBzaGFwaW5nLmJvdHRvbSA9IHNoYXBpbmcudG9wICsgaGVpZ2h0O1xuICAgIHNoYXBpbmcubGVmdCArPSAtaG9yaXpvbnRhbEFsaWduICogbWF4TGluZUxlbmd0aDtcbiAgICBzaGFwaW5nLnJpZ2h0ID0gc2hhcGluZy5sZWZ0ICsgbWF4TGluZUxlbmd0aDtcbn1cblxuLy8ganVzdGlmeSByaWdodCA9IDEsIGxlZnQgPSAwLCBjZW50ZXIgPSAwLjVcbmZ1bmN0aW9uIGp1c3RpZnlMaW5lKHBvc2l0aW9uZWRHbHlwaHM6IEFycmF5PFBvc2l0aW9uZWRHbHlwaD4sXG4gICAgICAgICAgICAgICAgICAgICBnbHlwaE1hcDoge1tzdHJpbmddOiB7W251bWJlcl06ID9TdHlsZUdseXBofX0sXG4gICAgICAgICAgICAgICAgICAgICBzdGFydDogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgZW5kOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICBqdXN0aWZ5OiAxIHwgMCB8IDAuNSkge1xuICAgIGlmICghanVzdGlmeSlcbiAgICAgICAgcmV0dXJuO1xuXG4gICAgY29uc3QgbGFzdFBvc2l0aW9uZWRHbHlwaCA9IHBvc2l0aW9uZWRHbHlwaHNbZW5kXTtcbiAgICBjb25zdCBwb3NpdGlvbnMgPSBnbHlwaE1hcFtsYXN0UG9zaXRpb25lZEdseXBoLmZvbnRTdGFja107XG4gICAgY29uc3QgZ2x5cGggPSBwb3NpdGlvbnMgJiYgcG9zaXRpb25zW2xhc3RQb3NpdGlvbmVkR2x5cGguZ2x5cGhdO1xuICAgIGlmIChnbHlwaCkge1xuICAgICAgICBjb25zdCBsYXN0QWR2YW5jZSA9IGdseXBoLm1ldHJpY3MuYWR2YW5jZSAqIGxhc3RQb3NpdGlvbmVkR2x5cGguc2NhbGU7XG4gICAgICAgIGNvbnN0IGxpbmVJbmRlbnQgPSAocG9zaXRpb25lZEdseXBoc1tlbmRdLnggKyBsYXN0QWR2YW5jZSkgKiBqdXN0aWZ5O1xuXG4gICAgICAgIGZvciAobGV0IGogPSBzdGFydDsgaiA8PSBlbmQ7IGorKykge1xuICAgICAgICAgICAgcG9zaXRpb25lZEdseXBoc1tqXS54IC09IGxpbmVJbmRlbnQ7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmZ1bmN0aW9uIGFsaWduKHBvc2l0aW9uZWRHbHlwaHM6IEFycmF5PFBvc2l0aW9uZWRHbHlwaD4sXG4gICAgICAgICAgICAgICBqdXN0aWZ5OiBudW1iZXIsXG4gICAgICAgICAgICAgICBob3Jpem9udGFsQWxpZ246IG51bWJlcixcbiAgICAgICAgICAgICAgIHZlcnRpY2FsQWxpZ246IG51bWJlcixcbiAgICAgICAgICAgICAgIG1heExpbmVMZW5ndGg6IG51bWJlcixcbiAgICAgICAgICAgICAgIGxpbmVIZWlnaHQ6IG51bWJlcixcbiAgICAgICAgICAgICAgIGxpbmVDb3VudDogbnVtYmVyKSB7XG4gICAgY29uc3Qgc2hpZnRYID0gKGp1c3RpZnkgLSBob3Jpem9udGFsQWxpZ24pICogbWF4TGluZUxlbmd0aDtcbiAgICBjb25zdCBzaGlmdFkgPSAoLXZlcnRpY2FsQWxpZ24gKiBsaW5lQ291bnQgKyAwLjUpICogbGluZUhlaWdodDtcblxuICAgIGZvciAobGV0IGogPSAwOyBqIDwgcG9zaXRpb25lZEdseXBocy5sZW5ndGg7IGorKykge1xuICAgICAgICBwb3NpdGlvbmVkR2x5cGhzW2pdLnggKz0gc2hpZnRYO1xuICAgICAgICBwb3NpdGlvbmVkR2x5cGhzW2pdLnkgKz0gc2hpZnRZO1xuICAgIH1cbn1cblxuZXhwb3J0IHR5cGUgUG9zaXRpb25lZEljb24gPSB7XG4gICAgaW1hZ2U6IEltYWdlUG9zaXRpb24sXG4gICAgdG9wOiBudW1iZXIsXG4gICAgYm90dG9tOiBudW1iZXIsXG4gICAgbGVmdDogbnVtYmVyLFxuICAgIHJpZ2h0OiBudW1iZXJcbn07XG5cbmZ1bmN0aW9uIHNoYXBlSWNvbihpbWFnZTogSW1hZ2VQb3NpdGlvbiwgaWNvbk9mZnNldDogW251bWJlciwgbnVtYmVyXSwgaWNvbkFuY2hvcjogU3ltYm9sQW5jaG9yKTogUG9zaXRpb25lZEljb24ge1xuICAgIGNvbnN0IHtob3Jpem9udGFsQWxpZ24sIHZlcnRpY2FsQWxpZ259ID0gZ2V0QW5jaG9yQWxpZ25tZW50KGljb25BbmNob3IpO1xuICAgIGNvbnN0IGR4ID0gaWNvbk9mZnNldFswXTtcbiAgICBjb25zdCBkeSA9IGljb25PZmZzZXRbMV07XG4gICAgY29uc3QgeDEgPSBkeCAtIGltYWdlLmRpc3BsYXlTaXplWzBdICogaG9yaXpvbnRhbEFsaWduO1xuICAgIGNvbnN0IHgyID0geDEgKyBpbWFnZS5kaXNwbGF5U2l6ZVswXTtcbiAgICBjb25zdCB5MSA9IGR5IC0gaW1hZ2UuZGlzcGxheVNpemVbMV0gKiB2ZXJ0aWNhbEFsaWduO1xuICAgIGNvbnN0IHkyID0geTEgKyBpbWFnZS5kaXNwbGF5U2l6ZVsxXTtcbiAgICByZXR1cm4ge2ltYWdlLCB0b3A6IHkxLCBib3R0b206IHkyLCBsZWZ0OiB4MSwgcmlnaHQ6IHgyfTtcbn1cbiIsIi8vIEBmbG93XG5cbmV4cG9ydCBkZWZhdWx0IGNoZWNrTWF4QW5nbGU7XG5cbmltcG9ydCB0eXBlIFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuaW1wb3J0IHR5cGUgQW5jaG9yIGZyb20gJy4vYW5jaG9yJztcblxuLyoqXG4gKiBMYWJlbHMgcGxhY2VkIGFyb3VuZCByZWFsbHkgc2hhcnAgYW5nbGVzIGFyZW4ndCByZWFkYWJsZS4gQ2hlY2sgaWYgYW55XG4gKiBwYXJ0IG9mIHRoZSBwb3RlbnRpYWwgbGFiZWwgaGFzIGEgY29tYmluZWQgYW5nbGUgdGhhdCBpcyB0b28gYmlnLlxuICpcbiAqIEBwYXJhbSBsaW5lXG4gKiBAcGFyYW0gYW5jaG9yIFRoZSBwb2ludCBvbiB0aGUgbGluZSBhcm91bmQgd2hpY2ggdGhlIGxhYmVsIGlzIGFuY2hvcmVkLlxuICogQHBhcmFtIGxhYmVsTGVuZ3RoIFRoZSBsZW5ndGggb2YgdGhlIGxhYmVsIGluIGdlb21ldHJ5IHVuaXRzLlxuICogQHBhcmFtIHdpbmRvd1NpemUgVGhlIGNoZWNrIGZhaWxzIGlmIHRoZSBjb21iaW5lZCBhbmdsZXMgd2l0aGluIGEgcGFydCBvZiB0aGUgbGluZSB0aGF0IGlzIGB3aW5kb3dTaXplYCBsb25nIGlzIHRvbyBiaWcuXG4gKiBAcGFyYW0gbWF4QW5nbGUgVGhlIG1heGltdW0gY29tYmluZWQgYW5nbGUgdGhhdCBhbnkgd2luZG93IGFsb25nIHRoZSBsYWJlbCBpcyBhbGxvd2VkIHRvIGhhdmUuXG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IHdoZXRoZXIgdGhlIGxhYmVsIHNob3VsZCBiZSBwbGFjZWRcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGNoZWNrTWF4QW5nbGUobGluZTogQXJyYXk8UG9pbnQ+LCBhbmNob3I6IEFuY2hvciwgbGFiZWxMZW5ndGg6IG51bWJlciwgd2luZG93U2l6ZTogbnVtYmVyLCBtYXhBbmdsZTogbnVtYmVyKSB7XG5cbiAgICAvLyBob3Jpem9udGFsIGxhYmVscyBhbHdheXMgcGFzc1xuICAgIGlmIChhbmNob3Iuc2VnbWVudCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdHJ1ZTtcblxuICAgIGxldCBwID0gYW5jaG9yO1xuICAgIGxldCBpbmRleCA9IGFuY2hvci5zZWdtZW50ICsgMTtcbiAgICBsZXQgYW5jaG9yRGlzdGFuY2UgPSAwO1xuXG4gICAgLy8gbW92ZSBiYWNrd2FyZHMgYWxvbmcgdGhlIGxpbmUgdG8gdGhlIGZpcnN0IHNlZ21lbnQgdGhlIGxhYmVsIGFwcGVhcnMgb25cbiAgICB3aGlsZSAoYW5jaG9yRGlzdGFuY2UgPiAtbGFiZWxMZW5ndGggLyAyKSB7XG4gICAgICAgIGluZGV4LS07XG5cbiAgICAgICAgLy8gdGhlcmUgaXNuJ3QgZW5vdWdoIHJvb20gZm9yIHRoZSBsYWJlbCBhZnRlciB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5lXG4gICAgICAgIGlmIChpbmRleCA8IDApIHJldHVybiBmYWxzZTtcblxuICAgICAgICBhbmNob3JEaXN0YW5jZSAtPSBsaW5lW2luZGV4XS5kaXN0KHApO1xuICAgICAgICBwID0gbGluZVtpbmRleF07XG4gICAgfVxuXG4gICAgYW5jaG9yRGlzdGFuY2UgKz0gbGluZVtpbmRleF0uZGlzdChsaW5lW2luZGV4ICsgMV0pO1xuICAgIGluZGV4Kys7XG5cbiAgICAvLyBzdG9yZSByZWNlbnQgY29ybmVycyBhbmQgdGhlaXIgdG90YWwgYW5nbGUgZGlmZmVyZW5jZVxuICAgIGNvbnN0IHJlY2VudENvcm5lcnMgPSBbXTtcbiAgICBsZXQgcmVjZW50QW5nbGVEZWx0YSA9IDA7XG5cbiAgICAvLyBtb3ZlIGZvcndhcmRzIGJ5IHRoZSBsZW5ndGggb2YgdGhlIGxhYmVsIGFuZCBjaGVjayBhbmdsZXMgYWxvbmcgdGhlIHdheVxuICAgIHdoaWxlIChhbmNob3JEaXN0YW5jZSA8IGxhYmVsTGVuZ3RoIC8gMikge1xuICAgICAgICBjb25zdCBwcmV2ID0gbGluZVtpbmRleCAtIDFdO1xuICAgICAgICBjb25zdCBjdXJyZW50ID0gbGluZVtpbmRleF07XG4gICAgICAgIGNvbnN0IG5leHQgPSBsaW5lW2luZGV4ICsgMV07XG5cbiAgICAgICAgLy8gdGhlcmUgaXNuJ3QgZW5vdWdoIHJvb20gZm9yIHRoZSBsYWJlbCBiZWZvcmUgdGhlIGVuZCBvZiB0aGUgbGluZVxuICAgICAgICBpZiAoIW5leHQpIHJldHVybiBmYWxzZTtcblxuICAgICAgICBsZXQgYW5nbGVEZWx0YSA9IHByZXYuYW5nbGVUbyhjdXJyZW50KSAtIGN1cnJlbnQuYW5nbGVUbyhuZXh0KTtcbiAgICAgICAgLy8gcmVzdHJpY3QgYW5nbGUgdG8gLXBpLi5waSByYW5nZVxuICAgICAgICBhbmdsZURlbHRhID0gTWF0aC5hYnMoKChhbmdsZURlbHRhICsgMyAqIE1hdGguUEkpICUgKE1hdGguUEkgKiAyKSkgLSBNYXRoLlBJKTtcblxuICAgICAgICByZWNlbnRDb3JuZXJzLnB1c2goe1xuICAgICAgICAgICAgZGlzdGFuY2U6IGFuY2hvckRpc3RhbmNlLFxuICAgICAgICAgICAgYW5nbGVEZWx0YVxuICAgICAgICB9KTtcbiAgICAgICAgcmVjZW50QW5nbGVEZWx0YSArPSBhbmdsZURlbHRhO1xuXG4gICAgICAgIC8vIHJlbW92ZSBjb3JuZXJzIHRoYXQgYXJlIGZhciBlbm91Z2ggYXdheSBmcm9tIHRoZSBsaXN0IG9mIHJlY2VudCBhbmNob3JzXG4gICAgICAgIHdoaWxlIChhbmNob3JEaXN0YW5jZSAtIHJlY2VudENvcm5lcnNbMF0uZGlzdGFuY2UgPiB3aW5kb3dTaXplKSB7XG4gICAgICAgICAgICByZWNlbnRBbmdsZURlbHRhIC09IHJlY2VudENvcm5lcnMuc2hpZnQoKS5hbmdsZURlbHRhO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdGhlIHN1bSBvZiBhbmdsZXMgd2l0aGluIHRoZSB3aW5kb3cgYXJlYSBleGNlZWRzIHRoZSBtYXhpbXVtIGFsbG93ZWQgdmFsdWUuIGNoZWNrIGZhaWxzLlxuICAgICAgICBpZiAocmVjZW50QW5nbGVEZWx0YSA+IG1heEFuZ2xlKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgaW5kZXgrKztcbiAgICAgICAgYW5jaG9yRGlzdGFuY2UgKz0gY3VycmVudC5kaXN0KG5leHQpO1xuICAgIH1cblxuICAgIC8vIG5vIHBhcnQgb2YgdGhlIGxpbmUgaGFkIGFuIGFuZ2xlIGdyZWF0ZXIgdGhhbiB0aGUgbWF4aW11bSBhbGxvd2VkLiBjaGVjayBwYXNzZXMuXG4gICAgcmV0dXJuIHRydWU7XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgeyBudW1iZXIgYXMgaW50ZXJwb2xhdGUgfSBmcm9tICcuLi9zdHlsZS1zcGVjL3V0aWwvaW50ZXJwb2xhdGUnO1xuXG5pbXBvcnQgQW5jaG9yIGZyb20gJy4uL3N5bWJvbC9hbmNob3InO1xuaW1wb3J0IGNoZWNrTWF4QW5nbGUgZnJvbSAnLi9jaGVja19tYXhfYW5nbGUnO1xuXG5pbXBvcnQgdHlwZSBQb2ludCBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcbmltcG9ydCB0eXBlIHtTaGFwaW5nLCBQb3NpdGlvbmVkSWNvbn0gZnJvbSAnLi9zaGFwaW5nJztcblxuZXhwb3J0IHsgZ2V0QW5jaG9ycywgZ2V0Q2VudGVyQW5jaG9yIH07XG5cbmZ1bmN0aW9uIGdldExpbmVMZW5ndGgobGluZTogQXJyYXk8UG9pbnQ+KTogbnVtYmVyIHtcbiAgICBsZXQgbGluZUxlbmd0aCA9IDA7XG4gICAgZm9yIChsZXQgayA9IDA7IGsgPCBsaW5lLmxlbmd0aCAtIDE7IGsrKykge1xuICAgICAgICBsaW5lTGVuZ3RoICs9IGxpbmVba10uZGlzdChsaW5lW2sgKyAxXSk7XG4gICAgfVxuICAgIHJldHVybiBsaW5lTGVuZ3RoO1xufVxuXG5mdW5jdGlvbiBnZXRBbmdsZVdpbmRvd1NpemUoc2hhcGVkVGV4dDogP1NoYXBpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhTaXplOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm94U2NhbGU6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIHNoYXBlZFRleHQgP1xuICAgICAgICAzIC8gNSAqIGdseXBoU2l6ZSAqIGJveFNjYWxlIDpcbiAgICAgICAgMDtcbn1cblxuZnVuY3Rpb24gZ2V0U2hhcGVkTGFiZWxMZW5ndGgoc2hhcGVkVGV4dDogP1NoYXBpbmcsIHNoYXBlZEljb246ID9Qb3NpdGlvbmVkSWNvbik6IG51bWJlciB7XG4gICAgcmV0dXJuIE1hdGgubWF4KFxuICAgICAgICBzaGFwZWRUZXh0ID8gc2hhcGVkVGV4dC5yaWdodCAtIHNoYXBlZFRleHQubGVmdCA6IDAsXG4gICAgICAgIHNoYXBlZEljb24gPyBzaGFwZWRJY29uLnJpZ2h0IC0gc2hhcGVkSWNvbi5sZWZ0IDogMCk7XG59XG5cbmZ1bmN0aW9uIGdldENlbnRlckFuY2hvcihsaW5lOiBBcnJheTxQb2ludD4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgbWF4QW5nbGU6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICBzaGFwZWRUZXh0OiA/U2hhcGluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICBzaGFwZWRJY29uOiA/UG9zaXRpb25lZEljb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhTaXplOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgYm94U2NhbGU6IG51bWJlcikge1xuICAgIGNvbnN0IGFuZ2xlV2luZG93U2l6ZSA9IGdldEFuZ2xlV2luZG93U2l6ZShzaGFwZWRUZXh0LCBnbHlwaFNpemUsIGJveFNjYWxlKTtcbiAgICBjb25zdCBsYWJlbExlbmd0aCA9IGdldFNoYXBlZExhYmVsTGVuZ3RoKHNoYXBlZFRleHQsIHNoYXBlZEljb24pICogYm94U2NhbGU7XG5cbiAgICBsZXQgcHJldkRpc3RhbmNlID0gMDtcbiAgICBjb25zdCBjZW50ZXJEaXN0YW5jZSA9IGdldExpbmVMZW5ndGgobGluZSkgLyAyO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lLmxlbmd0aCAtIDE7IGkrKykge1xuXG4gICAgICAgIGNvbnN0IGEgPSBsaW5lW2ldLFxuICAgICAgICAgICAgYiA9IGxpbmVbaSArIDFdO1xuXG4gICAgICAgIGNvbnN0IHNlZ21lbnREaXN0YW5jZSA9IGEuZGlzdChiKTtcblxuICAgICAgICBpZiAocHJldkRpc3RhbmNlICsgc2VnbWVudERpc3RhbmNlID4gY2VudGVyRGlzdGFuY2UpIHtcbiAgICAgICAgICAgIC8vIFRoZSBjZW50ZXIgaXMgb24gdGhpcyBzZWdtZW50XG4gICAgICAgICAgICBjb25zdCB0ID0gKGNlbnRlckRpc3RhbmNlIC0gcHJldkRpc3RhbmNlKSAvIHNlZ21lbnREaXN0YW5jZSxcbiAgICAgICAgICAgICAgICB4ID0gaW50ZXJwb2xhdGUoYS54LCBiLngsIHQpLFxuICAgICAgICAgICAgICAgIHkgPSBpbnRlcnBvbGF0ZShhLnksIGIueSwgdCk7XG5cbiAgICAgICAgICAgIGNvbnN0IGFuY2hvciA9IG5ldyBBbmNob3IoeCwgeSwgYi5hbmdsZVRvKGEpLCBpKTtcbiAgICAgICAgICAgIGFuY2hvci5fcm91bmQoKTtcbiAgICAgICAgICAgIGlmICghYW5nbGVXaW5kb3dTaXplIHx8IGNoZWNrTWF4QW5nbGUobGluZSwgYW5jaG9yLCBsYWJlbExlbmd0aCwgYW5nbGVXaW5kb3dTaXplLCBtYXhBbmdsZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYW5jaG9yO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBwcmV2RGlzdGFuY2UgKz0gc2VnbWVudERpc3RhbmNlO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZ2V0QW5jaG9ycyhsaW5lOiBBcnJheTxQb2ludD4sXG4gICAgICAgICAgICAgICAgICAgIHNwYWNpbmc6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgbWF4QW5nbGU6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgc2hhcGVkVGV4dDogP1NoYXBpbmcsXG4gICAgICAgICAgICAgICAgICAgIHNoYXBlZEljb246ID9Qb3NpdGlvbmVkSWNvbixcbiAgICAgICAgICAgICAgICAgICAgZ2x5cGhTaXplOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgIGJveFNjYWxlOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgIG92ZXJzY2FsaW5nOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgIHRpbGVFeHRlbnQ6IG51bWJlcikge1xuXG4gICAgLy8gUmVzYW1wbGUgYSBsaW5lIHRvIGdldCBhbmNob3IgcG9pbnRzIGZvciBsYWJlbHMgYW5kIGNoZWNrIHRoYXQgZWFjaFxuICAgIC8vIHBvdGVudGlhbCBsYWJlbCBwYXNzZXMgdGV4dC1tYXgtYW5nbGUgY2hlY2sgYW5kIGhhcyBlbm91Z2ggZnJvb20gdG8gZml0XG4gICAgLy8gb24gdGhlIGxpbmUuXG5cbiAgICBjb25zdCBhbmdsZVdpbmRvd1NpemUgPSBnZXRBbmdsZVdpbmRvd1NpemUoc2hhcGVkVGV4dCwgZ2x5cGhTaXplLCBib3hTY2FsZSk7XG4gICAgY29uc3Qgc2hhcGVkTGFiZWxMZW5ndGggPSBnZXRTaGFwZWRMYWJlbExlbmd0aChzaGFwZWRUZXh0LCBzaGFwZWRJY29uKTtcbiAgICBjb25zdCBsYWJlbExlbmd0aCA9IHNoYXBlZExhYmVsTGVuZ3RoICogYm94U2NhbGU7XG5cbiAgICAvLyBJcyB0aGUgbGluZSBjb250aW51ZWQgZnJvbSBvdXRzaWRlIHRoZSB0aWxlIGJvdW5kYXJ5P1xuICAgIGNvbnN0IGlzTGluZUNvbnRpbnVlZCA9IGxpbmVbMF0ueCA9PT0gMCB8fCBsaW5lWzBdLnggPT09IHRpbGVFeHRlbnQgfHwgbGluZVswXS55ID09PSAwIHx8IGxpbmVbMF0ueSA9PT0gdGlsZUV4dGVudDtcblxuICAgIC8vIElzIHRoZSBsYWJlbCBsb25nLCByZWxhdGl2ZSB0byB0aGUgc3BhY2luZz9cbiAgICAvLyBJZiBzbywgYWRqdXN0IHRoZSBzcGFjaW5nIHNvIHRoZXJlIGlzIGFsd2F5cyBhIG1pbmltdW0gc3BhY2Ugb2YgYHNwYWNpbmcgLyA0YCBiZXR3ZWVuIGxhYmVsIGVkZ2VzLlxuICAgIGlmIChzcGFjaW5nIC0gbGFiZWxMZW5ndGggPCBzcGFjaW5nIC8gNCkge1xuICAgICAgICBzcGFjaW5nID0gbGFiZWxMZW5ndGggKyBzcGFjaW5nIC8gNDtcbiAgICB9XG5cbiAgICAvLyBPZmZzZXQgdGhlIGZpcnN0IGFuY2hvciBieTpcbiAgICAvLyBFaXRoZXIgaGFsZiB0aGUgbGFiZWwgbGVuZ3RoIHBsdXMgYSBmaXhlZCBleHRyYSBvZmZzZXQgaWYgdGhlIGxpbmUgaXMgbm90IGNvbnRpbnVlZFxuICAgIC8vIE9yIGhhbGYgdGhlIHNwYWNpbmcgaWYgdGhlIGxpbmUgaXMgY29udGludWVkLlxuXG4gICAgLy8gRm9yIG5vbi1jb250aW51ZWQgbGluZXMsIGFkZCBhIGJpdCBvZiBmaXhlZCBleHRyYSBvZmZzZXQgdG8gYXZvaWQgY29sbGlzaW9ucyBhdCBUIGludGVyc2VjdGlvbnMuXG4gICAgY29uc3QgZml4ZWRFeHRyYU9mZnNldCA9IGdseXBoU2l6ZSAqIDI7XG5cbiAgICBjb25zdCBvZmZzZXQgPSAhaXNMaW5lQ29udGludWVkID9cbiAgICAgICAgKChzaGFwZWRMYWJlbExlbmd0aCAvIDIgKyBmaXhlZEV4dHJhT2Zmc2V0KSAqIGJveFNjYWxlICogb3ZlcnNjYWxpbmcpICUgc3BhY2luZyA6XG4gICAgICAgIChzcGFjaW5nIC8gMiAqIG92ZXJzY2FsaW5nKSAlIHNwYWNpbmc7XG5cbiAgICByZXR1cm4gcmVzYW1wbGUobGluZSwgb2Zmc2V0LCBzcGFjaW5nLCBhbmdsZVdpbmRvd1NpemUsIG1heEFuZ2xlLCBsYWJlbExlbmd0aCwgaXNMaW5lQ29udGludWVkLCBmYWxzZSwgdGlsZUV4dGVudCk7XG59XG5cblxuZnVuY3Rpb24gcmVzYW1wbGUobGluZSwgb2Zmc2V0LCBzcGFjaW5nLCBhbmdsZVdpbmRvd1NpemUsIG1heEFuZ2xlLCBsYWJlbExlbmd0aCwgaXNMaW5lQ29udGludWVkLCBwbGFjZUF0TWlkZGxlLCB0aWxlRXh0ZW50KSB7XG5cbiAgICBjb25zdCBoYWxmTGFiZWxMZW5ndGggPSBsYWJlbExlbmd0aCAvIDI7XG4gICAgY29uc3QgbGluZUxlbmd0aCA9IGdldExpbmVMZW5ndGgobGluZSk7XG5cbiAgICBsZXQgZGlzdGFuY2UgPSAwLFxuICAgICAgICBtYXJrZWREaXN0YW5jZSA9IG9mZnNldCAtIHNwYWNpbmc7XG5cbiAgICBsZXQgYW5jaG9ycyA9IFtdO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lLmxlbmd0aCAtIDE7IGkrKykge1xuXG4gICAgICAgIGNvbnN0IGEgPSBsaW5lW2ldLFxuICAgICAgICAgICAgYiA9IGxpbmVbaSArIDFdO1xuXG4gICAgICAgIGNvbnN0IHNlZ21lbnREaXN0ID0gYS5kaXN0KGIpLFxuICAgICAgICAgICAgYW5nbGUgPSBiLmFuZ2xlVG8oYSk7XG5cbiAgICAgICAgd2hpbGUgKG1hcmtlZERpc3RhbmNlICsgc3BhY2luZyA8IGRpc3RhbmNlICsgc2VnbWVudERpc3QpIHtcbiAgICAgICAgICAgIG1hcmtlZERpc3RhbmNlICs9IHNwYWNpbmc7XG5cbiAgICAgICAgICAgIGNvbnN0IHQgPSAobWFya2VkRGlzdGFuY2UgLSBkaXN0YW5jZSkgLyBzZWdtZW50RGlzdCxcbiAgICAgICAgICAgICAgICB4ID0gaW50ZXJwb2xhdGUoYS54LCBiLngsIHQpLFxuICAgICAgICAgICAgICAgIHkgPSBpbnRlcnBvbGF0ZShhLnksIGIueSwgdCk7XG5cbiAgICAgICAgICAgIC8vIENoZWNrIHRoYXQgdGhlIHBvaW50IGlzIHdpdGhpbiB0aGUgdGlsZSBib3VuZGFyaWVzIGFuZCB0aGF0XG4gICAgICAgICAgICAvLyB0aGUgbGFiZWwgd291bGQgZml0IGJlZm9yZSB0aGUgYmVnaW5uaW5nIGFuZCBlbmQgb2YgdGhlIGxpbmVcbiAgICAgICAgICAgIC8vIGlmIHBsYWNlZCBhdCB0aGlzIHBvaW50LlxuICAgICAgICAgICAgaWYgKHggPj0gMCAmJiB4IDwgdGlsZUV4dGVudCAmJiB5ID49IDAgJiYgeSA8IHRpbGVFeHRlbnQgJiZcbiAgICAgICAgICAgICAgICAgICAgbWFya2VkRGlzdGFuY2UgLSBoYWxmTGFiZWxMZW5ndGggPj0gMCAmJlxuICAgICAgICAgICAgICAgICAgICBtYXJrZWREaXN0YW5jZSArIGhhbGZMYWJlbExlbmd0aCA8PSBsaW5lTGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYW5jaG9yID0gbmV3IEFuY2hvcih4LCB5LCBhbmdsZSwgaSk7XG4gICAgICAgICAgICAgICAgYW5jaG9yLl9yb3VuZCgpO1xuXG4gICAgICAgICAgICAgICAgaWYgKCFhbmdsZVdpbmRvd1NpemUgfHwgY2hlY2tNYXhBbmdsZShsaW5lLCBhbmNob3IsIGxhYmVsTGVuZ3RoLCBhbmdsZVdpbmRvd1NpemUsIG1heEFuZ2xlKSkge1xuICAgICAgICAgICAgICAgICAgICBhbmNob3JzLnB1c2goYW5jaG9yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBkaXN0YW5jZSArPSBzZWdtZW50RGlzdDtcbiAgICB9XG5cbiAgICBpZiAoIXBsYWNlQXRNaWRkbGUgJiYgIWFuY2hvcnMubGVuZ3RoICYmICFpc0xpbmVDb250aW51ZWQpIHtcbiAgICAgICAgLy8gVGhlIGZpcnN0IGF0dGVtcHQgYXQgZmluZGluZyBhbmNob3JzIGF0IHdoaWNoIGxhYmVscyBjYW4gYmUgcGxhY2VkIGZhaWxlZC5cbiAgICAgICAgLy8gVHJ5IGFnYWluLCBidXQgdGhpcyB0aW1lIGp1c3QgdHJ5IHBsYWNpbmcgb25lIGFuY2hvciBhdCB0aGUgbWlkZGxlIG9mIHRoZSBsaW5lLlxuICAgICAgICAvLyBUaGlzIGhhcyB0aGUgbW9zdCBlZmZlY3QgZm9yIHNob3J0IGxpbmVzIGluIG92ZXJzY2FsZWQgdGlsZXMsIHNpbmNlIHRoZVxuICAgICAgICAvLyBpbml0aWFsIG9mZnNldCB1c2VkIGluIG92ZXJzY2FsZWQgdGlsZXMgaXMgY2FsY3VsYXRlZCB0byBhbGlnbiBsYWJlbHMgd2l0aCBwb3NpdGlvbnMgaW5cbiAgICAgICAgLy8gcGFyZW50IHRpbGVzIGluc3RlYWQgb2YgcGxhY2luZyB0aGUgbGFiZWwgYXMgY2xvc2UgdG8gdGhlIGJlZ2lubmluZyBhcyBwb3NzaWJsZS5cbiAgICAgICAgYW5jaG9ycyA9IHJlc2FtcGxlKGxpbmUsIGRpc3RhbmNlIC8gMiwgc3BhY2luZywgYW5nbGVXaW5kb3dTaXplLCBtYXhBbmdsZSwgbGFiZWxMZW5ndGgsIGlzTGluZUNvbnRpbnVlZCwgdHJ1ZSwgdGlsZUV4dGVudCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFuY2hvcnM7XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgUG9pbnQgZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsaXBMaW5lO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIHBhcnQgb2YgYSBtdWx0aWxpbmUgdGhhdCBpbnRlcnNlY3RzIHdpdGggdGhlIHByb3ZpZGVkIHJlY3Rhbmd1bGFyIGJveC5cbiAqXG4gKiBAcGFyYW0gbGluZXNcbiAqIEBwYXJhbSB4MSB0aGUgbGVmdCBlZGdlIG9mIHRoZSBib3hcbiAqIEBwYXJhbSB5MSB0aGUgdG9wIGVkZ2Ugb2YgdGhlIGJveFxuICogQHBhcmFtIHgyIHRoZSByaWdodCBlZGdlIG9mIHRoZSBib3hcbiAqIEBwYXJhbSB5MiB0aGUgYm90dG9tIGVkZ2Ugb2YgdGhlIGJveFxuICogQHJldHVybnMgbGluZXNcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGNsaXBMaW5lKGxpbmVzOiBBcnJheTxBcnJheTxQb2ludD4+LCB4MTogbnVtYmVyLCB5MTogbnVtYmVyLCB4MjogbnVtYmVyLCB5MjogbnVtYmVyKTogQXJyYXk8QXJyYXk8UG9pbnQ+PiB7XG4gICAgY29uc3QgY2xpcHBlZExpbmVzID0gW107XG5cbiAgICBmb3IgKGxldCBsID0gMDsgbCA8IGxpbmVzLmxlbmd0aDsgbCsrKSB7XG4gICAgICAgIGNvbnN0IGxpbmUgPSBsaW5lc1tsXTtcbiAgICAgICAgbGV0IGNsaXBwZWRMaW5lO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZS5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBwMCA9IGxpbmVbaV07XG4gICAgICAgICAgICBsZXQgcDEgPSBsaW5lW2kgKyAxXTtcblxuXG4gICAgICAgICAgICBpZiAocDAueCA8IHgxICYmIHAxLnggPCB4MSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwMC54IDwgeDEpIHtcbiAgICAgICAgICAgICAgICBwMCA9IG5ldyBQb2ludCh4MSwgcDAueSArIChwMS55IC0gcDAueSkgKiAoKHgxIC0gcDAueCkgLyAocDEueCAtIHAwLngpKSkuX3JvdW5kKCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHAxLnggPCB4MSkge1xuICAgICAgICAgICAgICAgIHAxID0gbmV3IFBvaW50KHgxLCBwMC55ICsgKHAxLnkgLSBwMC55KSAqICgoeDEgLSBwMC54KSAvIChwMS54IC0gcDAueCkpKS5fcm91bmQoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHAwLnkgPCB5MSAmJiBwMS55IDwgeTEpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocDAueSA8IHkxKSB7XG4gICAgICAgICAgICAgICAgcDAgPSBuZXcgUG9pbnQocDAueCArIChwMS54IC0gcDAueCkgKiAoKHkxIC0gcDAueSkgLyAocDEueSAtIHAwLnkpKSwgeTEpLl9yb3VuZCgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwMS55IDwgeTEpIHtcbiAgICAgICAgICAgICAgICBwMSA9IG5ldyBQb2ludChwMC54ICsgKHAxLnggLSBwMC54KSAqICgoeTEgLSBwMC55KSAvIChwMS55IC0gcDAueSkpLCB5MSkuX3JvdW5kKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChwMC54ID49IHgyICYmIHAxLnggPj0geDIpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocDAueCA+PSB4Mikge1xuICAgICAgICAgICAgICAgIHAwID0gbmV3IFBvaW50KHgyLCBwMC55ICsgKHAxLnkgLSBwMC55KSAqICgoeDIgLSBwMC54KSAvIChwMS54IC0gcDAueCkpKS5fcm91bmQoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocDEueCA+PSB4Mikge1xuICAgICAgICAgICAgICAgIHAxID0gbmV3IFBvaW50KHgyLCBwMC55ICsgKHAxLnkgLSBwMC55KSAqICgoeDIgLSBwMC54KSAvIChwMS54IC0gcDAueCkpKS5fcm91bmQoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHAwLnkgPj0geTIgJiYgcDEueSA+PSB5Mikge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwMC55ID49IHkyKSB7XG4gICAgICAgICAgICAgICAgcDAgPSBuZXcgUG9pbnQocDAueCArIChwMS54IC0gcDAueCkgKiAoKHkyIC0gcDAueSkgLyAocDEueSAtIHAwLnkpKSwgeTIpLl9yb3VuZCgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwMS55ID49IHkyKSB7XG4gICAgICAgICAgICAgICAgcDEgPSBuZXcgUG9pbnQocDAueCArIChwMS54IC0gcDAueCkgKiAoKHkyIC0gcDAueSkgLyAocDEueSAtIHAwLnkpKSwgeTIpLl9yb3VuZCgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIWNsaXBwZWRMaW5lIHx8ICFwMC5lcXVhbHMoY2xpcHBlZExpbmVbY2xpcHBlZExpbmUubGVuZ3RoIC0gMV0pKSB7XG4gICAgICAgICAgICAgICAgY2xpcHBlZExpbmUgPSBbcDBdO1xuICAgICAgICAgICAgICAgIGNsaXBwZWRMaW5lcy5wdXNoKGNsaXBwZWRMaW5lKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2xpcHBlZExpbmUucHVzaChwMSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY2xpcHBlZExpbmVzO1xufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuXG5pbXBvcnQgeyBHTFlQSF9QQkZfQk9SREVSIH0gZnJvbSAnLi4vc3R5bGUvcGFyc2VfZ2x5cGhfcGJmJztcblxuaW1wb3J0IHR5cGUgQW5jaG9yIGZyb20gJy4vYW5jaG9yJztcbmltcG9ydCB0eXBlIHtQb3NpdGlvbmVkSWNvbiwgU2hhcGluZ30gZnJvbSAnLi9zaGFwaW5nJztcbmltcG9ydCB0eXBlIFN5bWJvbFN0eWxlTGF5ZXIgZnJvbSAnLi4vc3R5bGUvc3R5bGVfbGF5ZXIvc3ltYm9sX3N0eWxlX2xheWVyJztcbmltcG9ydCB0eXBlIHtGZWF0dXJlfSBmcm9tICcuLi9zdHlsZS1zcGVjL2V4cHJlc3Npb24nO1xuaW1wb3J0IHR5cGUge0dseXBoUG9zaXRpb259IGZyb20gJy4uL3JlbmRlci9nbHlwaF9hdGxhcyc7XG5cbi8qKlxuICogQSB0ZXh0dXJlZCBxdWFkIGZvciByZW5kZXJpbmcgYSBzaW5nbGUgaWNvbiBvciBnbHlwaC5cbiAqXG4gKiBUaGUgem9vbSByYW5nZSB0aGUgZ2x5cGggY2FuIGJlIHNob3duIGlzIGRlZmluZWQgYnkgbWluU2NhbGUgYW5kIG1heFNjYWxlLlxuICpcbiAqIEBwYXJhbSB0bCBUaGUgb2Zmc2V0IG9mIHRoZSB0b3AgbGVmdCBjb3JuZXIgZnJvbSB0aGUgYW5jaG9yLlxuICogQHBhcmFtIHRyIFRoZSBvZmZzZXQgb2YgdGhlIHRvcCByaWdodCBjb3JuZXIgZnJvbSB0aGUgYW5jaG9yLlxuICogQHBhcmFtIGJsIFRoZSBvZmZzZXQgb2YgdGhlIGJvdHRvbSBsZWZ0IGNvcm5lciBmcm9tIHRoZSBhbmNob3IuXG4gKiBAcGFyYW0gYnIgVGhlIG9mZnNldCBvZiB0aGUgYm90dG9tIHJpZ2h0IGNvcm5lciBmcm9tIHRoZSBhbmNob3IuXG4gKiBAcGFyYW0gdGV4IFRoZSB0ZXh0dXJlIGNvb3JkaW5hdGVzLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCB0eXBlIFN5bWJvbFF1YWQgPSB7XG4gICAgdGw6IFBvaW50LFxuICAgIHRyOiBQb2ludCxcbiAgICBibDogUG9pbnQsXG4gICAgYnI6IFBvaW50LFxuICAgIHRleDoge1xuICAgICAgICB4OiBudW1iZXIsXG4gICAgICAgIHk6IG51bWJlcixcbiAgICAgICAgdzogbnVtYmVyLFxuICAgICAgICBoOiBudW1iZXJcbiAgICB9LFxuICAgIHdyaXRpbmdNb2RlOiBhbnkgfCB2b2lkLFxuICAgIGdseXBoT2Zmc2V0OiBbbnVtYmVyLCBudW1iZXJdXG59O1xuXG4vKipcbiAqIENyZWF0ZSB0aGUgcXVhZHMgdXNlZCBmb3IgcmVuZGVyaW5nIGFuIGljb24uXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0SWNvblF1YWRzKGFuY2hvcjogQW5jaG9yLFxuICAgICAgICAgICAgICAgICAgICAgIHNoYXBlZEljb246IFBvc2l0aW9uZWRJY29uLFxuICAgICAgICAgICAgICAgICAgICAgIGxheWVyOiBTeW1ib2xTdHlsZUxheWVyLFxuICAgICAgICAgICAgICAgICAgICAgIGFsb25nTGluZTogYm9vbGVhbixcbiAgICAgICAgICAgICAgICAgICAgICBzaGFwZWRUZXh0OiBTaGFwaW5nIHwgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlOiBGZWF0dXJlKTogQXJyYXk8U3ltYm9sUXVhZD4ge1xuICAgIGNvbnN0IGltYWdlID0gc2hhcGVkSWNvbi5pbWFnZTtcbiAgICBjb25zdCBsYXlvdXQgPSBsYXllci5sYXlvdXQ7XG5cbiAgICAvLyBJZiB5b3UgaGF2ZSBhIDEwcHggaWNvbiB0aGF0IGlzbid0IHBlcmZlY3RseSBhbGlnbmVkIHRvIHRoZSBwaXhlbCBncmlkIGl0IHdpbGwgY292ZXIgMTEgYWN0dWFsXG4gICAgLy8gcGl4ZWxzLiBUaGUgcXVhZCBuZWVkcyB0byBiZSBwYWRkZWQgdG8gYWNjb3VudCBmb3IgdGhpcywgb3RoZXJ3aXNlIHRoZXknbGwgbG9vayBzbGlnaHRseSBjbGlwcGVkXG4gICAgLy8gb24gb25lIGVkZ2UgaW4gc29tZSBjYXNlcy5cbiAgICBjb25zdCBib3JkZXIgPSAxO1xuXG4gICAgY29uc3QgdG9wID0gc2hhcGVkSWNvbi50b3AgLSBib3JkZXIgLyBpbWFnZS5waXhlbFJhdGlvO1xuICAgIGNvbnN0IGxlZnQgPSBzaGFwZWRJY29uLmxlZnQgLSBib3JkZXIgLyBpbWFnZS5waXhlbFJhdGlvO1xuICAgIGNvbnN0IGJvdHRvbSA9IHNoYXBlZEljb24uYm90dG9tICsgYm9yZGVyIC8gaW1hZ2UucGl4ZWxSYXRpbztcbiAgICBjb25zdCByaWdodCA9IHNoYXBlZEljb24ucmlnaHQgKyBib3JkZXIgLyBpbWFnZS5waXhlbFJhdGlvO1xuICAgIGxldCB0bCwgdHIsIGJyLCBibDtcblxuICAgIC8vIHRleHQtZml0IG1vZGVcbiAgICBpZiAobGF5b3V0LmdldCgnaWNvbi10ZXh0LWZpdCcpICE9PSAnbm9uZScgJiYgc2hhcGVkVGV4dCkge1xuICAgICAgICBjb25zdCBpY29uV2lkdGggPSAocmlnaHQgLSBsZWZ0KSxcbiAgICAgICAgICAgIGljb25IZWlnaHQgPSAoYm90dG9tIC0gdG9wKSxcbiAgICAgICAgICAgIHNpemUgPSBsYXlvdXQuZ2V0KCd0ZXh0LXNpemUnKS5ldmFsdWF0ZShmZWF0dXJlLCB7fSkgLyAyNCxcbiAgICAgICAgICAgIHRleHRMZWZ0ID0gc2hhcGVkVGV4dC5sZWZ0ICogc2l6ZSxcbiAgICAgICAgICAgIHRleHRSaWdodCA9IHNoYXBlZFRleHQucmlnaHQgKiBzaXplLFxuICAgICAgICAgICAgdGV4dFRvcCA9IHNoYXBlZFRleHQudG9wICogc2l6ZSxcbiAgICAgICAgICAgIHRleHRCb3R0b20gPSBzaGFwZWRUZXh0LmJvdHRvbSAqIHNpemUsXG4gICAgICAgICAgICB0ZXh0V2lkdGggPSB0ZXh0UmlnaHQgLSB0ZXh0TGVmdCxcbiAgICAgICAgICAgIHRleHRIZWlnaHQgPSB0ZXh0Qm90dG9tIC0gdGV4dFRvcCxcbiAgICAgICAgICAgIHBhZFQgPSBsYXlvdXQuZ2V0KCdpY29uLXRleHQtZml0LXBhZGRpbmcnKVswXSxcbiAgICAgICAgICAgIHBhZFIgPSBsYXlvdXQuZ2V0KCdpY29uLXRleHQtZml0LXBhZGRpbmcnKVsxXSxcbiAgICAgICAgICAgIHBhZEIgPSBsYXlvdXQuZ2V0KCdpY29uLXRleHQtZml0LXBhZGRpbmcnKVsyXSxcbiAgICAgICAgICAgIHBhZEwgPSBsYXlvdXQuZ2V0KCdpY29uLXRleHQtZml0LXBhZGRpbmcnKVszXSxcbiAgICAgICAgICAgIG9mZnNldFkgPSBsYXlvdXQuZ2V0KCdpY29uLXRleHQtZml0JykgPT09ICd3aWR0aCcgPyAodGV4dEhlaWdodCAtIGljb25IZWlnaHQpICogMC41IDogMCxcbiAgICAgICAgICAgIG9mZnNldFggPSBsYXlvdXQuZ2V0KCdpY29uLXRleHQtZml0JykgPT09ICdoZWlnaHQnID8gKHRleHRXaWR0aCAtIGljb25XaWR0aCkgKiAwLjUgOiAwLFxuICAgICAgICAgICAgd2lkdGggPSBsYXlvdXQuZ2V0KCdpY29uLXRleHQtZml0JykgPT09ICd3aWR0aCcgfHwgbGF5b3V0LmdldCgnaWNvbi10ZXh0LWZpdCcpID09PSAnYm90aCcgPyB0ZXh0V2lkdGggOiBpY29uV2lkdGgsXG4gICAgICAgICAgICBoZWlnaHQgPSBsYXlvdXQuZ2V0KCdpY29uLXRleHQtZml0JykgPT09ICdoZWlnaHQnIHx8IGxheW91dC5nZXQoJ2ljb24tdGV4dC1maXQnKSA9PT0gJ2JvdGgnID8gdGV4dEhlaWdodCA6IGljb25IZWlnaHQ7XG4gICAgICAgIHRsID0gbmV3IFBvaW50KHRleHRMZWZ0ICsgb2Zmc2V0WCAtIHBhZEwsICAgICAgICAgdGV4dFRvcCArIG9mZnNldFkgLSBwYWRUKTtcbiAgICAgICAgdHIgPSBuZXcgUG9pbnQodGV4dExlZnQgKyBvZmZzZXRYICsgcGFkUiArIHdpZHRoLCB0ZXh0VG9wICsgb2Zmc2V0WSAtIHBhZFQpO1xuICAgICAgICBiciA9IG5ldyBQb2ludCh0ZXh0TGVmdCArIG9mZnNldFggKyBwYWRSICsgd2lkdGgsIHRleHRUb3AgKyBvZmZzZXRZICsgcGFkQiArIGhlaWdodCk7XG4gICAgICAgIGJsID0gbmV3IFBvaW50KHRleHRMZWZ0ICsgb2Zmc2V0WCAtIHBhZEwsICAgICAgICAgdGV4dFRvcCArIG9mZnNldFkgKyBwYWRCICsgaGVpZ2h0KTtcbiAgICAvLyBOb3JtYWwgaWNvbiBzaXplIG1vZGVcbiAgICB9IGVsc2Uge1xuICAgICAgICB0bCA9IG5ldyBQb2ludChsZWZ0LCB0b3ApO1xuICAgICAgICB0ciA9IG5ldyBQb2ludChyaWdodCwgdG9wKTtcbiAgICAgICAgYnIgPSBuZXcgUG9pbnQocmlnaHQsIGJvdHRvbSk7XG4gICAgICAgIGJsID0gbmV3IFBvaW50KGxlZnQsIGJvdHRvbSk7XG4gICAgfVxuXG4gICAgY29uc3QgYW5nbGUgPSBsYXllci5sYXlvdXQuZ2V0KCdpY29uLXJvdGF0ZScpLmV2YWx1YXRlKGZlYXR1cmUsIHt9KSAqIE1hdGguUEkgLyAxODA7XG5cbiAgICBpZiAoYW5nbGUpIHtcbiAgICAgICAgY29uc3Qgc2luID0gTWF0aC5zaW4oYW5nbGUpLFxuICAgICAgICAgICAgY29zID0gTWF0aC5jb3MoYW5nbGUpLFxuICAgICAgICAgICAgbWF0cml4ID0gW2NvcywgLXNpbiwgc2luLCBjb3NdO1xuXG4gICAgICAgIHRsLl9tYXRNdWx0KG1hdHJpeCk7XG4gICAgICAgIHRyLl9tYXRNdWx0KG1hdHJpeCk7XG4gICAgICAgIGJsLl9tYXRNdWx0KG1hdHJpeCk7XG4gICAgICAgIGJyLl9tYXRNdWx0KG1hdHJpeCk7XG4gICAgfVxuXG4gICAgLy8gSWNvbiBxdWFkIGlzIHBhZGRlZCwgc28gdGV4dHVyZSBjb29yZGluYXRlcyBhbHNvIG5lZWQgdG8gYmUgcGFkZGVkLlxuICAgIHJldHVybiBbe3RsLCB0ciwgYmwsIGJyLCB0ZXg6IGltYWdlLnBhZGRlZFJlY3QsIHdyaXRpbmdNb2RlOiB1bmRlZmluZWQsIGdseXBoT2Zmc2V0OiBbMCwgMF19XTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgdGhlIHF1YWRzIHVzZWQgZm9yIHJlbmRlcmluZyBhIHRleHQgbGFiZWwuXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0R2x5cGhRdWFkcyhhbmNob3I6IEFuY2hvcixcbiAgICAgICAgICAgICAgICAgICAgICAgc2hhcGluZzogU2hhcGluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgdGV4dE9mZnNldDogW251bWJlciwgbnVtYmVyXSxcbiAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXI6IFN5bWJvbFN0eWxlTGF5ZXIsXG4gICAgICAgICAgICAgICAgICAgICAgIGFsb25nTGluZTogYm9vbGVhbixcbiAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZTogRmVhdHVyZSxcbiAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25zOiB7W3N0cmluZ106IHtbbnVtYmVyXTogR2x5cGhQb3NpdGlvbn19KTogQXJyYXk8U3ltYm9sUXVhZD4ge1xuXG4gICAgY29uc3QgdGV4dFJvdGF0ZSA9IGxheWVyLmxheW91dC5nZXQoJ3RleHQtcm90YXRlJykuZXZhbHVhdGUoZmVhdHVyZSwge30pICogTWF0aC5QSSAvIDE4MDtcblxuICAgIGNvbnN0IHBvc2l0aW9uZWRHbHlwaHMgPSBzaGFwaW5nLnBvc2l0aW9uZWRHbHlwaHM7XG4gICAgY29uc3QgcXVhZHMgPSBbXTtcblxuXG4gICAgZm9yIChsZXQgayA9IDA7IGsgPCBwb3NpdGlvbmVkR2x5cGhzLmxlbmd0aDsgaysrKSB7XG4gICAgICAgIGNvbnN0IHBvc2l0aW9uZWRHbHlwaCA9IHBvc2l0aW9uZWRHbHlwaHNba107XG4gICAgICAgIGNvbnN0IGdseXBoUG9zaXRpb25zID0gcG9zaXRpb25zW3Bvc2l0aW9uZWRHbHlwaC5mb250U3RhY2tdO1xuICAgICAgICBjb25zdCBnbHlwaCA9IGdseXBoUG9zaXRpb25zICYmIGdseXBoUG9zaXRpb25zW3Bvc2l0aW9uZWRHbHlwaC5nbHlwaF07XG4gICAgICAgIGlmICghZ2x5cGgpIGNvbnRpbnVlO1xuXG4gICAgICAgIGNvbnN0IHJlY3QgPSBnbHlwaC5yZWN0O1xuICAgICAgICBpZiAoIXJlY3QpIGNvbnRpbnVlO1xuXG4gICAgICAgIC8vIFRoZSByZWN0cyBoYXZlIGFuIGFkZGRpdGlvbmFsIGJ1ZmZlciB0aGF0IGlzIG5vdCBpbmNsdWRlZCBpbiB0aGVpciBzaXplLlxuICAgICAgICBjb25zdCBnbHlwaFBhZGRpbmcgPSAxLjA7XG4gICAgICAgIGNvbnN0IHJlY3RCdWZmZXIgPSBHTFlQSF9QQkZfQk9SREVSICsgZ2x5cGhQYWRkaW5nO1xuXG4gICAgICAgIGNvbnN0IGhhbGZBZHZhbmNlID0gZ2x5cGgubWV0cmljcy5hZHZhbmNlICogcG9zaXRpb25lZEdseXBoLnNjYWxlIC8gMjtcblxuICAgICAgICBjb25zdCBnbHlwaE9mZnNldCA9IGFsb25nTGluZSA/XG4gICAgICAgICAgICBbcG9zaXRpb25lZEdseXBoLnggKyBoYWxmQWR2YW5jZSwgcG9zaXRpb25lZEdseXBoLnldIDpcbiAgICAgICAgICAgIFswLCAwXTtcblxuICAgICAgICBjb25zdCBidWlsdEluT2Zmc2V0ID0gYWxvbmdMaW5lID9cbiAgICAgICAgICAgIFswLCAwXSA6XG4gICAgICAgICAgICBbcG9zaXRpb25lZEdseXBoLnggKyBoYWxmQWR2YW5jZSArIHRleHRPZmZzZXRbMF0sIHBvc2l0aW9uZWRHbHlwaC55ICsgdGV4dE9mZnNldFsxXV07XG5cbiAgICAgICAgY29uc3QgeDEgPSAoZ2x5cGgubWV0cmljcy5sZWZ0IC0gcmVjdEJ1ZmZlcikgKiBwb3NpdGlvbmVkR2x5cGguc2NhbGUgLSBoYWxmQWR2YW5jZSArIGJ1aWx0SW5PZmZzZXRbMF07XG4gICAgICAgIGNvbnN0IHkxID0gKC1nbHlwaC5tZXRyaWNzLnRvcCAtIHJlY3RCdWZmZXIpICogcG9zaXRpb25lZEdseXBoLnNjYWxlICsgYnVpbHRJbk9mZnNldFsxXTtcbiAgICAgICAgY29uc3QgeDIgPSB4MSArIHJlY3QudyAqIHBvc2l0aW9uZWRHbHlwaC5zY2FsZTtcbiAgICAgICAgY29uc3QgeTIgPSB5MSArIHJlY3QuaCAqIHBvc2l0aW9uZWRHbHlwaC5zY2FsZTtcblxuICAgICAgICBjb25zdCB0bCA9IG5ldyBQb2ludCh4MSwgeTEpO1xuICAgICAgICBjb25zdCB0ciA9IG5ldyBQb2ludCh4MiwgeTEpO1xuICAgICAgICBjb25zdCBibCAgPSBuZXcgUG9pbnQoeDEsIHkyKTtcbiAgICAgICAgY29uc3QgYnIgPSBuZXcgUG9pbnQoeDIsIHkyKTtcblxuICAgICAgICBpZiAoYWxvbmdMaW5lICYmIHBvc2l0aW9uZWRHbHlwaC52ZXJ0aWNhbCkge1xuICAgICAgICAgICAgLy8gVmVydGljYWwtc3VwcG9ydGluZyBnbHlwaHMgYXJlIGxhaWQgb3V0IGluIDI0eDI0IHBvaW50IGJveGVzICgxIHNxdWFyZSBlbSlcbiAgICAgICAgICAgIC8vIEluIGhvcml6b250YWwgb3JpZW50YXRpb24sIHRoZSB5IHZhbHVlcyBmb3IgZ2x5cGhzIGFyZSBiZWxvdyB0aGUgbWlkbGluZVxuICAgICAgICAgICAgLy8gYW5kIHdlIHVzZSBhIFwieU9mZnNldFwiIG9mIC0xNyB0byBwdWxsIHRoZW0gdXAgdG8gdGhlIG1pZGRsZS5cbiAgICAgICAgICAgIC8vIEJ5IHJvdGF0aW5nIGNvdW50ZXItY2xvY2t3aXNlIGFyb3VuZCB0aGUgcG9pbnQgYXQgdGhlIGNlbnRlciBvZiB0aGUgbGVmdFxuICAgICAgICAgICAgLy8gZWRnZSBvZiBhIDI0eDI0IGxheW91dCBib3ggY2VudGVyZWQgYmVsb3cgdGhlIG1pZGxpbmUsIHdlIGFsaWduIHRoZSBjZW50ZXJcbiAgICAgICAgICAgIC8vIG9mIHRoZSBnbHlwaHMgd2l0aCB0aGUgaG9yaXpvbnRhbCBtaWRsaW5lLCBzbyB0aGUgeU9mZnNldCBpcyBubyBsb25nZXJcbiAgICAgICAgICAgIC8vIG5lY2Vzc2FyeSwgYnV0IHdlIGFsc28gcHVsbCB0aGUgZ2x5cGggdG8gdGhlIGxlZnQgYWxvbmcgdGhlIHggYXhpc1xuICAgICAgICAgICAgY29uc3QgY2VudGVyID0gbmV3IFBvaW50KC1oYWxmQWR2YW5jZSwgaGFsZkFkdmFuY2UpO1xuICAgICAgICAgICAgY29uc3QgdmVydGljYWxSb3RhdGlvbiA9IC1NYXRoLlBJIC8gMjtcbiAgICAgICAgICAgIGNvbnN0IHhPZmZzZXRDb3JyZWN0aW9uID0gbmV3IFBvaW50KDUsIDApO1xuICAgICAgICAgICAgdGwuX3JvdGF0ZUFyb3VuZCh2ZXJ0aWNhbFJvdGF0aW9uLCBjZW50ZXIpLl9hZGQoeE9mZnNldENvcnJlY3Rpb24pO1xuICAgICAgICAgICAgdHIuX3JvdGF0ZUFyb3VuZCh2ZXJ0aWNhbFJvdGF0aW9uLCBjZW50ZXIpLl9hZGQoeE9mZnNldENvcnJlY3Rpb24pO1xuICAgICAgICAgICAgYmwuX3JvdGF0ZUFyb3VuZCh2ZXJ0aWNhbFJvdGF0aW9uLCBjZW50ZXIpLl9hZGQoeE9mZnNldENvcnJlY3Rpb24pO1xuICAgICAgICAgICAgYnIuX3JvdGF0ZUFyb3VuZCh2ZXJ0aWNhbFJvdGF0aW9uLCBjZW50ZXIpLl9hZGQoeE9mZnNldENvcnJlY3Rpb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRleHRSb3RhdGUpIHtcbiAgICAgICAgICAgIGNvbnN0IHNpbiA9IE1hdGguc2luKHRleHRSb3RhdGUpLFxuICAgICAgICAgICAgICAgIGNvcyA9IE1hdGguY29zKHRleHRSb3RhdGUpLFxuICAgICAgICAgICAgICAgIG1hdHJpeCA9IFtjb3MsIC1zaW4sIHNpbiwgY29zXTtcblxuICAgICAgICAgICAgdGwuX21hdE11bHQobWF0cml4KTtcbiAgICAgICAgICAgIHRyLl9tYXRNdWx0KG1hdHJpeCk7XG4gICAgICAgICAgICBibC5fbWF0TXVsdChtYXRyaXgpO1xuICAgICAgICAgICAgYnIuX21hdE11bHQobWF0cml4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHF1YWRzLnB1c2goe3RsLCB0ciwgYmwsIGJyLCB0ZXg6IHJlY3QsIHdyaXRpbmdNb2RlOiBzaGFwaW5nLndyaXRpbmdNb2RlLCBnbHlwaE9mZnNldH0pO1xuICAgIH1cblxuICAgIHJldHVybiBxdWFkcztcbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCB0eXBlIHtDb2xsaXNpb25Cb3hBcnJheX0gZnJvbSAnLi4vZGF0YS9hcnJheV90eXBlcyc7XG5pbXBvcnQgUG9pbnQgZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XG5pbXBvcnQgdHlwZSBBbmNob3IgZnJvbSAnLi9hbmNob3InO1xuXG4vKipcbiAqIEEgQ29sbGlzaW9uRmVhdHVyZSByZXByZXNlbnRzIHRoZSBhcmVhIG9mIHRoZSB0aWxlIGNvdmVyZWQgYnkgYSBzaW5nbGUgbGFiZWwuXG4gKiBJdCBpcyB1c2VkIHdpdGggQ29sbGlzaW9uSW5kZXggdG8gY2hlY2sgaWYgdGhlIGxhYmVsIG92ZXJsYXBzIHdpdGggYW55XG4gKiBwcmV2aW91cyBsYWJlbHMuIEEgQ29sbGlzaW9uRmVhdHVyZSBpcyBtb3N0bHkganVzdCBhIHNldCBvZiBDb2xsaXNpb25Cb3hcbiAqIG9iamVjdHMuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgQ29sbGlzaW9uRmVhdHVyZSB7XG4gICAgYm94U3RhcnRJbmRleDogbnVtYmVyO1xuICAgIGJveEVuZEluZGV4OiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBDb2xsaXNpb25GZWF0dXJlLCBhZGRpbmcgaXRzIGNvbGxpc2lvbiBib3ggZGF0YSB0byB0aGUgZ2l2ZW4gY29sbGlzaW9uQm94QXJyYXkgaW4gdGhlIHByb2Nlc3MuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbGluZSBUaGUgZ2VvbWV0cnkgdGhlIGxhYmVsIGlzIHBsYWNlZCBvbi5cbiAgICAgKiBAcGFyYW0gYW5jaG9yIFRoZSBwb2ludCBhbG9uZyB0aGUgbGluZSBhcm91bmQgd2hpY2ggdGhlIGxhYmVsIGlzIGFuY2hvcmVkLlxuICAgICAqIEBwYXJhbSBzaGFwZWQgVGhlIHRleHQgb3IgaWNvbiBzaGFwaW5nIHJlc3VsdHMuXG4gICAgICogQHBhcmFtIGJveFNjYWxlIEEgbWFnaWMgbnVtYmVyIHVzZWQgdG8gY29udmVydCBmcm9tIGdseXBoIG1ldHJpY3MgdW5pdHMgdG8gZ2VvbWV0cnkgdW5pdHMuXG4gICAgICogQHBhcmFtIHBhZGRpbmcgVGhlIGFtb3VudCBvZiBwYWRkaW5nIHRvIGFkZCBhcm91bmQgdGhlIGxhYmVsIGVkZ2VzLlxuICAgICAqIEBwYXJhbSBhbGlnbkxpbmUgV2hldGhlciB0aGUgbGFiZWwgaXMgYWxpZ25lZCB3aXRoIHRoZSBsaW5lIG9yIHRoZSB2aWV3cG9ydC5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihjb2xsaXNpb25Cb3hBcnJheTogQ29sbGlzaW9uQm94QXJyYXksXG4gICAgICAgICAgICAgICAgbGluZTogQXJyYXk8UG9pbnQ+LFxuICAgICAgICAgICAgICAgIGFuY2hvcjogQW5jaG9yLFxuICAgICAgICAgICAgICAgIGZlYXR1cmVJbmRleDogbnVtYmVyLFxuICAgICAgICAgICAgICAgIHNvdXJjZUxheWVySW5kZXg6IG51bWJlcixcbiAgICAgICAgICAgICAgICBidWNrZXRJbmRleDogbnVtYmVyLFxuICAgICAgICAgICAgICAgIHNoYXBlZDogT2JqZWN0LFxuICAgICAgICAgICAgICAgIGJveFNjYWxlOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgcGFkZGluZzogbnVtYmVyLFxuICAgICAgICAgICAgICAgIGFsaWduTGluZTogYm9vbGVhbixcbiAgICAgICAgICAgICAgICBvdmVyc2NhbGluZzogbnVtYmVyLFxuICAgICAgICAgICAgICAgIHJvdGF0ZTogbnVtYmVyKSB7XG4gICAgICAgIGxldCB5MSA9IHNoYXBlZC50b3AgKiBib3hTY2FsZSAtIHBhZGRpbmc7XG4gICAgICAgIGxldCB5MiA9IHNoYXBlZC5ib3R0b20gKiBib3hTY2FsZSArIHBhZGRpbmc7XG4gICAgICAgIGxldCB4MSA9IHNoYXBlZC5sZWZ0ICogYm94U2NhbGUgLSBwYWRkaW5nO1xuICAgICAgICBsZXQgeDIgPSBzaGFwZWQucmlnaHQgKiBib3hTY2FsZSArIHBhZGRpbmc7XG5cbiAgICAgICAgdGhpcy5ib3hTdGFydEluZGV4ID0gY29sbGlzaW9uQm94QXJyYXkubGVuZ3RoO1xuXG4gICAgICAgIGlmIChhbGlnbkxpbmUpIHtcblxuICAgICAgICAgICAgbGV0IGhlaWdodCA9IHkyIC0geTE7XG4gICAgICAgICAgICBjb25zdCBsZW5ndGggPSB4MiAtIHgxO1xuXG4gICAgICAgICAgICBpZiAoaGVpZ2h0ID4gMCkge1xuICAgICAgICAgICAgICAgIC8vIHNldCBtaW5pbXVtIGJveCBoZWlnaHQgdG8gYXZvaWQgdmVyeSBtYW55IHNtYWxsIGxhYmVsc1xuICAgICAgICAgICAgICAgIGhlaWdodCA9IE1hdGgubWF4KDEwICogYm94U2NhbGUsIGhlaWdodCk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLl9hZGRMaW5lQ29sbGlzaW9uQ2lyY2xlcyhjb2xsaXNpb25Cb3hBcnJheSwgbGluZSwgYW5jaG9yLCAoYW5jaG9yLnNlZ21lbnQ6IGFueSksIGxlbmd0aCwgaGVpZ2h0LCBmZWF0dXJlSW5kZXgsIHNvdXJjZUxheWVySW5kZXgsIGJ1Y2tldEluZGV4LCBvdmVyc2NhbGluZyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChyb3RhdGUpIHtcbiAgICAgICAgICAgICAgICAvLyBBY2NvdW50IGZvciAqLXJvdGF0ZSBpbiBwb2ludCBjb2xsaXNpb24gYm94ZXNcbiAgICAgICAgICAgICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL21hcGJveC9tYXBib3gtZ2wtanMvaXNzdWVzLzYwNzVcbiAgICAgICAgICAgICAgICAvLyBEb2Vzbid0IGFjY291bnQgZm9yIGljb24tdGV4dC1maXRcblxuICAgICAgICAgICAgICAgIGNvbnN0IHRsID0gbmV3IFBvaW50KHgxLCB5MSk7XG4gICAgICAgICAgICAgICAgY29uc3QgdHIgPSBuZXcgUG9pbnQoeDIsIHkxKTtcbiAgICAgICAgICAgICAgICBjb25zdCBibCA9IG5ldyBQb2ludCh4MSwgeTIpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGJyID0gbmV3IFBvaW50KHgyLCB5Mik7XG5cbiAgICAgICAgICAgICAgICBjb25zdCByb3RhdGVSYWRpYW5zID0gcm90YXRlICogTWF0aC5QSSAvIDE4MDtcblxuICAgICAgICAgICAgICAgIHRsLl9yb3RhdGUocm90YXRlUmFkaWFucyk7XG4gICAgICAgICAgICAgICAgdHIuX3JvdGF0ZShyb3RhdGVSYWRpYW5zKTtcbiAgICAgICAgICAgICAgICBibC5fcm90YXRlKHJvdGF0ZVJhZGlhbnMpO1xuICAgICAgICAgICAgICAgIGJyLl9yb3RhdGUocm90YXRlUmFkaWFucyk7XG5cbiAgICAgICAgICAgICAgICAvLyBDb2xsaXNpb24gZmVhdHVyZXMgcmVxdWlyZSBhbiBcIm9uLWF4aXNcIiBnZW9tZXRyeSxcbiAgICAgICAgICAgICAgICAvLyBzbyB0YWtlIHRoZSBlbnZlbG9wZSBvZiB0aGUgcm90YXRlZCBnZW9tZXRyeVxuICAgICAgICAgICAgICAgIC8vIChtYXkgYmUgcXVpdGUgbGFyZ2UgZm9yIHdpZGUgbGFiZWxzIHJvdGF0ZWQgNDUgZGVncmVlcylcbiAgICAgICAgICAgICAgICB4MSA9IE1hdGgubWluKHRsLngsIHRyLngsIGJsLngsIGJyLngpO1xuICAgICAgICAgICAgICAgIHgyID0gTWF0aC5tYXgodGwueCwgdHIueCwgYmwueCwgYnIueCk7XG4gICAgICAgICAgICAgICAgeTEgPSBNYXRoLm1pbih0bC55LCB0ci55LCBibC55LCBici55KTtcbiAgICAgICAgICAgICAgICB5MiA9IE1hdGgubWF4KHRsLnksIHRyLnksIGJsLnksIGJyLnkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29sbGlzaW9uQm94QXJyYXkuZW1wbGFjZUJhY2soYW5jaG9yLngsIGFuY2hvci55LCB4MSwgeTEsIHgyLCB5MiwgZmVhdHVyZUluZGV4LCBzb3VyY2VMYXllckluZGV4LCBidWNrZXRJbmRleCxcbiAgICAgICAgICAgICAgICAwLCAwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuYm94RW5kSW5kZXggPSBjb2xsaXNpb25Cb3hBcnJheS5sZW5ndGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgc2V0IG9mIENvbGxpc2lvbkJveCBvYmplY3RzIGZvciBhIGxpbmUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbGFiZWxMZW5ndGggVGhlIGxlbmd0aCBvZiB0aGUgbGFiZWwgaW4gZ2VvbWV0cnkgdW5pdHMuXG4gICAgICogQHBhcmFtIGFuY2hvciBUaGUgcG9pbnQgYWxvbmcgdGhlIGxpbmUgYXJvdW5kIHdoaWNoIHRoZSBsYWJlbCBpcyBhbmNob3JlZC5cbiAgICAgKiBAcGFyYW0gYm94U2l6ZSBUaGUgc2l6ZSBvZiB0aGUgY29sbGlzaW9uIGJveGVzIHRoYXQgd2lsbCBiZSBjcmVhdGVkLlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX2FkZExpbmVDb2xsaXNpb25DaXJjbGVzKGNvbGxpc2lvbkJveEFycmF5OiBDb2xsaXNpb25Cb3hBcnJheSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmU6IEFycmF5PFBvaW50PixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuY2hvcjogQW5jaG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VnbWVudDogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxMZW5ndGg6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGJveFNpemU6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVJbmRleDogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlTGF5ZXJJbmRleDogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVja2V0SW5kZXg6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJzY2FsaW5nOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3Qgc3RlcCA9IGJveFNpemUgLyAyO1xuICAgICAgICBjb25zdCBuQm94ZXMgPSBNYXRoLmZsb29yKGxhYmVsTGVuZ3RoIC8gc3RlcCkgfHwgMTtcbiAgICAgICAgLy8gV2UgY2FsY3VsYXRlIGxpbmUgY29sbGlzaW9uIGNpcmNsZXMgb3V0IHRvIDMwMCUgb2Ygd2hhdCB3b3VsZCBub3JtYWxseSBiZSBvdXJcbiAgICAgICAgLy8gbWF4IHNpemUsIHRvIGFsbG93IGNvbGxpc2lvbiBkZXRlY3Rpb24gdG8gd29yayBvbiBsYWJlbHMgdGhhdCBleHBhbmQgYXNcbiAgICAgICAgLy8gdGhleSBtb3ZlIGludG8gdGhlIGRpc3RhbmNlXG4gICAgICAgIC8vIFZlcnRpY2FsbHkgb3JpZW50ZWQgbGFiZWxzIGluIHRoZSBkaXN0YW50IGZpZWxkIGNhbiBleHRlbmQgcGFzdCB0aGlzIHBhZGRpbmdcbiAgICAgICAgLy8gVGhpcyBpcyBhIG5vdGljZWFibGUgcHJvYmxlbSBpbiBvdmVyc2NhbGVkIHRpbGVzIHdoZXJlIHRoZSBwaXRjaCAwLWJhc2VkXG4gICAgICAgIC8vIHN5bWJvbCBzcGFjaW5nIHdpbGwgcHV0IGxhYmVscyB2ZXJ5IGNsb3NlIHRvZ2V0aGVyIGluIGEgcGl0Y2hlZCBtYXAuXG4gICAgICAgIC8vIFRvIHJlZHVjZSB0aGUgY29zdCBvZiBhZGRpbmcgZXh0cmEgY29sbGlzaW9uIGNpcmNsZXMsIHdlIHNsb3dseSBpbmNyZWFzZVxuICAgICAgICAvLyB0aGVtIGZvciBvdmVyc2NhbGVkIHRpbGVzLlxuICAgICAgICBjb25zdCBvdmVyc2NhbGluZ1BhZGRpbmdGYWN0b3IgPSAxICsgLjQgKiBNYXRoLmxvZyhvdmVyc2NhbGluZykgLyBNYXRoLkxOMjtcbiAgICAgICAgY29uc3QgblBpdGNoUGFkZGluZ0JveGVzID0gTWF0aC5mbG9vcihuQm94ZXMgKiBvdmVyc2NhbGluZ1BhZGRpbmdGYWN0b3IgLyAyKTtcblxuICAgICAgICAvLyBvZmZzZXQgdGhlIGNlbnRlciBvZiB0aGUgZmlyc3QgYm94IGJ5IGhhbGYgYSBib3ggc28gdGhhdCB0aGUgZWRnZSBvZiB0aGVcbiAgICAgICAgLy8gYm94IGlzIGF0IHRoZSBlZGdlIG9mIHRoZSBsYWJlbC5cbiAgICAgICAgY29uc3QgZmlyc3RCb3hPZmZzZXQgPSAtYm94U2l6ZSAvIDI7XG5cbiAgICAgICAgbGV0IHAgPSBhbmNob3I7XG4gICAgICAgIGxldCBpbmRleCA9IHNlZ21lbnQgKyAxO1xuICAgICAgICBsZXQgYW5jaG9yRGlzdGFuY2UgPSBmaXJzdEJveE9mZnNldDtcbiAgICAgICAgY29uc3QgbGFiZWxTdGFydERpc3RhbmNlID0gLWxhYmVsTGVuZ3RoIC8gMjtcbiAgICAgICAgY29uc3QgcGFkZGluZ1N0YXJ0RGlzdGFuY2UgPSBsYWJlbFN0YXJ0RGlzdGFuY2UgLSBsYWJlbExlbmd0aCAvIDQ7XG4gICAgICAgIC8vIG1vdmUgYmFja3dhcmRzIGFsb25nIHRoZSBsaW5lIHRvIHRoZSBmaXJzdCBzZWdtZW50IHRoZSBsYWJlbCBhcHBlYXJzIG9uXG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIGluZGV4LS07XG5cbiAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHtcbiAgICAgICAgICAgICAgICBpZiAoYW5jaG9yRGlzdGFuY2UgPiBsYWJlbFN0YXJ0RGlzdGFuY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhlcmUgaXNuJ3QgZW5vdWdoIHJvb20gZm9yIHRoZSBsYWJlbCBhZnRlciB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5lXG4gICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrTWF4QW5nbGUgc2hvdWxkIGhhdmUgYWxyZWFkeSBjYXVnaHQgdGhpc1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGxpbmUgZG9lc24ndCBleHRlbmQgZmFyIGVub3VnaCBiYWNrIGZvciBhbGwgb2Ygb3VyIHBhZGRpbmcsXG4gICAgICAgICAgICAgICAgICAgIC8vIGJ1dCB3ZSBnb3QgZmFyIGVub3VnaCB0byBzaG93IHRoZSBsYWJlbCB1bmRlciBtb3N0IGNvbmRpdGlvbnMuXG4gICAgICAgICAgICAgICAgICAgIGluZGV4ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBhbmNob3JEaXN0YW5jZSAtPSBsaW5lW2luZGV4XS5kaXN0KHApO1xuICAgICAgICAgICAgICAgIHAgPSBsaW5lW2luZGV4XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSB3aGlsZSAoYW5jaG9yRGlzdGFuY2UgPiBwYWRkaW5nU3RhcnREaXN0YW5jZSk7XG5cbiAgICAgICAgbGV0IHNlZ21lbnRMZW5ndGggPSBsaW5lW2luZGV4XS5kaXN0KGxpbmVbaW5kZXggKyAxXSk7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IC1uUGl0Y2hQYWRkaW5nQm94ZXM7IGkgPCBuQm94ZXMgKyBuUGl0Y2hQYWRkaW5nQm94ZXM7IGkrKykge1xuXG4gICAgICAgICAgICAvLyB0aGUgZGlzdGFuY2UgdGhlIGJveCB3aWxsIGJlIGZyb20gdGhlIGFuY2hvclxuICAgICAgICAgICAgY29uc3QgYm94T2Zmc2V0ID0gaSAqIHN0ZXA7XG4gICAgICAgICAgICBsZXQgYm94RGlzdGFuY2VUb0FuY2hvciA9IGxhYmVsU3RhcnREaXN0YW5jZSArIGJveE9mZnNldDtcblxuICAgICAgICAgICAgLy8gbWFrZSB0aGUgZGlzdGFuY2UgYmV0d2VlbiBwaXRjaCBwYWRkaW5nIGJveGVzIGJpZ2dlclxuICAgICAgICAgICAgaWYgKGJveE9mZnNldCA8IDApIGJveERpc3RhbmNlVG9BbmNob3IgKz0gYm94T2Zmc2V0O1xuICAgICAgICAgICAgaWYgKGJveE9mZnNldCA+IGxhYmVsTGVuZ3RoKSBib3hEaXN0YW5jZVRvQW5jaG9yICs9IGJveE9mZnNldCAtIGxhYmVsTGVuZ3RoO1xuXG4gICAgICAgICAgICBpZiAoYm94RGlzdGFuY2VUb0FuY2hvciA8IGFuY2hvckRpc3RhbmNlKSB7XG4gICAgICAgICAgICAgICAgLy8gVGhlIGxpbmUgZG9lc24ndCBleHRlbmQgZmFyIGVub3VnaCBiYWNrIGZvciB0aGlzIGJveCwgc2tpcCBpdFxuICAgICAgICAgICAgICAgIC8vIChUaGlzIGNvdWxkIGFsbG93IGZvciBsaW5lIGNvbGxpc2lvbnMgb24gZGlzdGFudCB0aWxlcylcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gdGhlIGJveCBpcyBub3Qgb24gdGhlIGN1cnJlbnQgc2VnbWVudC4gTW92ZSB0byB0aGUgbmV4dCBzZWdtZW50LlxuICAgICAgICAgICAgd2hpbGUgKGFuY2hvckRpc3RhbmNlICsgc2VnbWVudExlbmd0aCA8IGJveERpc3RhbmNlVG9BbmNob3IpIHtcbiAgICAgICAgICAgICAgICBhbmNob3JEaXN0YW5jZSArPSBzZWdtZW50TGVuZ3RoO1xuICAgICAgICAgICAgICAgIGluZGV4Kys7XG5cbiAgICAgICAgICAgICAgICAvLyBUaGVyZSBpc24ndCBlbm91Z2ggcm9vbSBiZWZvcmUgdGhlIGVuZCBvZiB0aGUgbGluZS5cbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggKyAxID49IGxpbmUubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBzZWdtZW50TGVuZ3RoID0gbGluZVtpbmRleF0uZGlzdChsaW5lW2luZGV4ICsgMV0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyB0aGUgZGlzdGFuY2UgdGhlIGJveCB3aWxsIGJlIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgc2VnbWVudFxuICAgICAgICAgICAgY29uc3Qgc2VnbWVudEJveERpc3RhbmNlID0gYm94RGlzdGFuY2VUb0FuY2hvciAtIGFuY2hvckRpc3RhbmNlO1xuXG4gICAgICAgICAgICBjb25zdCBwMCA9IGxpbmVbaW5kZXhdO1xuICAgICAgICAgICAgY29uc3QgcDEgPSBsaW5lW2luZGV4ICsgMV07XG4gICAgICAgICAgICBjb25zdCBib3hBbmNob3JQb2ludCA9IHAxLnN1YihwMCkuX3VuaXQoKS5fbXVsdChzZWdtZW50Qm94RGlzdGFuY2UpLl9hZGQocDApLl9yb3VuZCgpO1xuXG4gICAgICAgICAgICAvLyBJZiB0aGUgYm94IGlzIHdpdGhpbiBib3hTaXplIG9mIHRoZSBhbmNob3IsIGZvcmNlIHRoZSBib3ggdG8gYmUgdXNlZFxuICAgICAgICAgICAgLy8gKHNvIGV2ZW4gMC13aWR0aCBsYWJlbHMgdXNlIGF0IGxlYXN0IG9uZSBib3gpXG4gICAgICAgICAgICAvLyBPdGhlcndpc2UsIHRoZSAuOCBtdWx0aXBsaWNhdGlvbiBnaXZlcyB1cyBhIGxpdHRsZSBiaXQgb2YgY29uc2VydmF0aXZlXG4gICAgICAgICAgICAvLyBwYWRkaW5nIGluIGNob29zaW5nIHdoaWNoIGJveGVzIHRvIHVzZSAoc2VlIENvbGxpc2lvbkluZGV4I3BsYWNlZENvbGxpc2lvbkNpcmNsZXMpXG4gICAgICAgICAgICBjb25zdCBwYWRkZWRBbmNob3JEaXN0YW5jZSA9IE1hdGguYWJzKGJveERpc3RhbmNlVG9BbmNob3IgLSBmaXJzdEJveE9mZnNldCkgPCBzdGVwID9cbiAgICAgICAgICAgICAgICAwIDpcbiAgICAgICAgICAgICAgICAoYm94RGlzdGFuY2VUb0FuY2hvciAtIGZpcnN0Qm94T2Zmc2V0KSAqIDAuODtcblxuICAgICAgICAgICAgY29sbGlzaW9uQm94QXJyYXkuZW1wbGFjZUJhY2soYm94QW5jaG9yUG9pbnQueCwgYm94QW5jaG9yUG9pbnQueSxcbiAgICAgICAgICAgICAgICAtYm94U2l6ZSAvIDIsIC1ib3hTaXplIC8gMiwgYm94U2l6ZSAvIDIsIGJveFNpemUgLyAyLFxuICAgICAgICAgICAgICAgIGZlYXR1cmVJbmRleCwgc291cmNlTGF5ZXJJbmRleCwgYnVja2V0SW5kZXgsXG4gICAgICAgICAgICAgICAgYm94U2l6ZSAvIDIsIHBhZGRlZEFuY2hvckRpc3RhbmNlKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQ29sbGlzaW9uRmVhdHVyZTtcbiIsIlxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGlueVF1ZXVlIHtcbiAgICBjb25zdHJ1Y3RvcihkYXRhID0gW10sIGNvbXBhcmUgPSBkZWZhdWx0Q29tcGFyZSkge1xuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgICAgICB0aGlzLmxlbmd0aCA9IHRoaXMuZGF0YS5sZW5ndGg7XG4gICAgICAgIHRoaXMuY29tcGFyZSA9IGNvbXBhcmU7XG5cbiAgICAgICAgaWYgKHRoaXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9ICh0aGlzLmxlbmd0aCA+PiAxKSAtIDE7IGkgPj0gMDsgaS0tKSB0aGlzLl9kb3duKGkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVzaChpdGVtKSB7XG4gICAgICAgIHRoaXMuZGF0YS5wdXNoKGl0ZW0pO1xuICAgICAgICB0aGlzLmxlbmd0aCsrO1xuICAgICAgICB0aGlzLl91cCh0aGlzLmxlbmd0aCAtIDEpO1xuICAgIH1cblxuICAgIHBvcCgpIHtcbiAgICAgICAgaWYgKHRoaXMubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgICAgIGNvbnN0IHRvcCA9IHRoaXMuZGF0YVswXTtcbiAgICAgICAgdGhpcy5sZW5ndGgtLTtcblxuICAgICAgICBpZiAodGhpcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmRhdGFbMF0gPSB0aGlzLmRhdGFbdGhpcy5sZW5ndGhdO1xuICAgICAgICAgICAgdGhpcy5fZG93bigwKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRhdGEucG9wKCk7XG5cbiAgICAgICAgcmV0dXJuIHRvcDtcbiAgICB9XG5cbiAgICBwZWVrKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhWzBdO1xuICAgIH1cblxuICAgIF91cChwb3MpIHtcbiAgICAgICAgY29uc3Qge2RhdGEsIGNvbXBhcmV9ID0gdGhpcztcbiAgICAgICAgY29uc3QgaXRlbSA9IGRhdGFbcG9zXTtcblxuICAgICAgICB3aGlsZSAocG9zID4gMCkge1xuICAgICAgICAgICAgY29uc3QgcGFyZW50ID0gKHBvcyAtIDEpID4+IDE7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50ID0gZGF0YVtwYXJlbnRdO1xuICAgICAgICAgICAgaWYgKGNvbXBhcmUoaXRlbSwgY3VycmVudCkgPj0gMCkgYnJlYWs7XG4gICAgICAgICAgICBkYXRhW3Bvc10gPSBjdXJyZW50O1xuICAgICAgICAgICAgcG9zID0gcGFyZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgZGF0YVtwb3NdID0gaXRlbTtcbiAgICB9XG5cbiAgICBfZG93bihwb3MpIHtcbiAgICAgICAgY29uc3Qge2RhdGEsIGNvbXBhcmV9ID0gdGhpcztcbiAgICAgICAgY29uc3QgaGFsZkxlbmd0aCA9IHRoaXMubGVuZ3RoID4+IDE7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSBkYXRhW3Bvc107XG5cbiAgICAgICAgd2hpbGUgKHBvcyA8IGhhbGZMZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCBsZWZ0ID0gKHBvcyA8PCAxKSArIDE7XG4gICAgICAgICAgICBsZXQgYmVzdCA9IGRhdGFbbGVmdF07XG4gICAgICAgICAgICBjb25zdCByaWdodCA9IGxlZnQgKyAxO1xuXG4gICAgICAgICAgICBpZiAocmlnaHQgPCB0aGlzLmxlbmd0aCAmJiBjb21wYXJlKGRhdGFbcmlnaHRdLCBiZXN0KSA8IDApIHtcbiAgICAgICAgICAgICAgICBsZWZ0ID0gcmlnaHQ7XG4gICAgICAgICAgICAgICAgYmVzdCA9IGRhdGFbcmlnaHRdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNvbXBhcmUoYmVzdCwgaXRlbSkgPj0gMCkgYnJlYWs7XG5cbiAgICAgICAgICAgIGRhdGFbcG9zXSA9IGJlc3Q7XG4gICAgICAgICAgICBwb3MgPSBsZWZ0O1xuICAgICAgICB9XG5cbiAgICAgICAgZGF0YVtwb3NdID0gaXRlbTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRDb21wYXJlKGEsIGIpIHtcbiAgICByZXR1cm4gYSA8IGIgPyAtMSA6IGEgPiBiID8gMSA6IDA7XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgUXVldWUgZnJvbSAndGlueXF1ZXVlJztcblxuaW1wb3J0IFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuaW1wb3J0IHsgZGlzdFRvU2VnbWVudFNxdWFyZWQgfSBmcm9tICcuL2ludGVyc2VjdGlvbl90ZXN0cyc7XG5cbi8qKlxuICogRmluZHMgYW4gYXBwcm94aW1hdGlvbiBvZiBhIHBvbHlnb24ncyBQb2xlIE9mIEluYWNjZXNzaWJpbGl5IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1BvbGVfb2ZfaW5hY2Nlc3NpYmlsaXR5XG4gKiBUaGlzIGlzIGEgY29weSBvZiBodHRwOi8vZ2l0aHViLmNvbS9tYXBib3gvcG9seWxhYmVsIGFkYXB0ZWQgdG8gdXNlIFBvaW50c1xuICpcbiAqIEBwYXJhbSBwb2x5Z29uUmluZ3MgZmlyc3QgaXRlbSBpbiBhcnJheSBpcyB0aGUgb3V0ZXIgcmluZyBmb2xsb3dlZCBvcHRpb25hbGx5IGJ5IHRoZSBsaXN0IG9mIGhvbGVzLCBzaG91bGQgYmUgYW4gZWxlbWVudCBvZiB0aGUgcmVzdWx0IG9mIHV0aWwvY2xhc3NpZnlfcmluZ3NcbiAqIEBwYXJhbSBwcmVjaXNpb24gU3BlY2lmaWVkIGluIGlucHV0IGNvb3JkaW5hdGUgdW5pdHMuIElmIDAgcmV0dXJucyBhZnRlciBmaXJzdCBydW4sIGlmID4gMCByZXBlYXRlZGx5IG5hcnJvd3MgdGhlIHNlYXJjaCBzcGFjZSB1bnRpbCB0aGUgcmFkaXVzIG9mIHRoZSBhcmVhIHNlYXJjaGVkIGZvciB0aGUgYmVzdCBwb2xlIGlzIGxlc3MgdGhhbiBwcmVjaXNpb25cbiAqIEBwYXJhbSBkZWJ1ZyBQcmludCBzb21lIHN0YXRpc3RpY3MgdG8gdGhlIGNvbnNvbGUgZHVyaW5nIGV4ZWN1dGlvblxuICogQHJldHVybnMgUG9sZSBvZiBJbmFjY2Vzc2liaWxpeS5cbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIChwb2x5Z29uUmluZ3M6IEFycmF5PEFycmF5PFBvaW50Pj4sIHByZWNpc2lvbj86IG51bWJlciA9IDEsIGRlYnVnPzogYm9vbGVhbiA9IGZhbHNlKTogUG9pbnQge1xuICAgIC8vIGZpbmQgdGhlIGJvdW5kaW5nIGJveCBvZiB0aGUgb3V0ZXIgcmluZ1xuICAgIGxldCBtaW5YID0gSW5maW5pdHksIG1pblkgPSBJbmZpbml0eSwgbWF4WCA9IC1JbmZpbml0eSwgbWF4WSA9IC1JbmZpbml0eTtcbiAgICBjb25zdCBvdXRlclJpbmcgPSBwb2x5Z29uUmluZ3NbMF07XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvdXRlclJpbmcubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgcCA9IG91dGVyUmluZ1tpXTtcbiAgICAgICAgaWYgKCFpIHx8IHAueCA8IG1pblgpIG1pblggPSBwLng7XG4gICAgICAgIGlmICghaSB8fCBwLnkgPCBtaW5ZKSBtaW5ZID0gcC55O1xuICAgICAgICBpZiAoIWkgfHwgcC54ID4gbWF4WCkgbWF4WCA9IHAueDtcbiAgICAgICAgaWYgKCFpIHx8IHAueSA+IG1heFkpIG1heFkgPSBwLnk7XG4gICAgfVxuXG4gICAgY29uc3Qgd2lkdGggPSBtYXhYIC0gbWluWDtcbiAgICBjb25zdCBoZWlnaHQgPSBtYXhZIC0gbWluWTtcbiAgICBjb25zdCBjZWxsU2l6ZSA9IE1hdGgubWluKHdpZHRoLCBoZWlnaHQpO1xuICAgIGxldCBoID0gY2VsbFNpemUgLyAyO1xuXG4gICAgLy8gYSBwcmlvcml0eSBxdWV1ZSBvZiBjZWxscyBpbiBvcmRlciBvZiB0aGVpciBcInBvdGVudGlhbFwiIChtYXggZGlzdGFuY2UgdG8gcG9seWdvbilcbiAgICBjb25zdCBjZWxsUXVldWUgPSBuZXcgUXVldWUoW10sIGNvbXBhcmVNYXgpO1xuXG4gICAgaWYgKGNlbGxTaXplID09PSAwKSByZXR1cm4gbmV3IFBvaW50KG1pblgsIG1pblkpO1xuXG4gICAgLy8gY292ZXIgcG9seWdvbiB3aXRoIGluaXRpYWwgY2VsbHNcbiAgICBmb3IgKGxldCB4ID0gbWluWDsgeCA8IG1heFg7IHggKz0gY2VsbFNpemUpIHtcbiAgICAgICAgZm9yIChsZXQgeSA9IG1pblk7IHkgPCBtYXhZOyB5ICs9IGNlbGxTaXplKSB7XG4gICAgICAgICAgICBjZWxsUXVldWUucHVzaChuZXcgQ2VsbCh4ICsgaCwgeSArIGgsIGgsIHBvbHlnb25SaW5ncykpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gdGFrZSBjZW50cm9pZCBhcyB0aGUgZmlyc3QgYmVzdCBndWVzc1xuICAgIGxldCBiZXN0Q2VsbCA9IGdldENlbnRyb2lkQ2VsbChwb2x5Z29uUmluZ3MpO1xuICAgIGxldCBudW1Qcm9iZXMgPSBjZWxsUXVldWUubGVuZ3RoO1xuXG4gICAgd2hpbGUgKGNlbGxRdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgLy8gcGljayB0aGUgbW9zdCBwcm9taXNpbmcgY2VsbCBmcm9tIHRoZSBxdWV1ZVxuICAgICAgICBjb25zdCBjZWxsID0gY2VsbFF1ZXVlLnBvcCgpO1xuXG4gICAgICAgIC8vIHVwZGF0ZSB0aGUgYmVzdCBjZWxsIGlmIHdlIGZvdW5kIGEgYmV0dGVyIG9uZVxuICAgICAgICBpZiAoY2VsbC5kID4gYmVzdENlbGwuZCB8fCAhYmVzdENlbGwuZCkge1xuICAgICAgICAgICAgYmVzdENlbGwgPSBjZWxsO1xuICAgICAgICAgICAgaWYgKGRlYnVnKSBjb25zb2xlLmxvZygnZm91bmQgYmVzdCAlZCBhZnRlciAlZCBwcm9iZXMnLCBNYXRoLnJvdW5kKDFlNCAqIGNlbGwuZCkgLyAxZTQsIG51bVByb2Jlcyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBkbyBub3QgZHJpbGwgZG93biBmdXJ0aGVyIGlmIHRoZXJlJ3Mgbm8gY2hhbmNlIG9mIGEgYmV0dGVyIHNvbHV0aW9uXG4gICAgICAgIGlmIChjZWxsLm1heCAtIGJlc3RDZWxsLmQgPD0gcHJlY2lzaW9uKSBjb250aW51ZTtcblxuICAgICAgICAvLyBzcGxpdCB0aGUgY2VsbCBpbnRvIGZvdXIgY2VsbHNcbiAgICAgICAgaCA9IGNlbGwuaCAvIDI7XG4gICAgICAgIGNlbGxRdWV1ZS5wdXNoKG5ldyBDZWxsKGNlbGwucC54IC0gaCwgY2VsbC5wLnkgLSBoLCBoLCBwb2x5Z29uUmluZ3MpKTtcbiAgICAgICAgY2VsbFF1ZXVlLnB1c2gobmV3IENlbGwoY2VsbC5wLnggKyBoLCBjZWxsLnAueSAtIGgsIGgsIHBvbHlnb25SaW5ncykpO1xuICAgICAgICBjZWxsUXVldWUucHVzaChuZXcgQ2VsbChjZWxsLnAueCAtIGgsIGNlbGwucC55ICsgaCwgaCwgcG9seWdvblJpbmdzKSk7XG4gICAgICAgIGNlbGxRdWV1ZS5wdXNoKG5ldyBDZWxsKGNlbGwucC54ICsgaCwgY2VsbC5wLnkgKyBoLCBoLCBwb2x5Z29uUmluZ3MpKTtcbiAgICAgICAgbnVtUHJvYmVzICs9IDQ7XG4gICAgfVxuXG4gICAgaWYgKGRlYnVnKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBudW0gcHJvYmVzOiAke251bVByb2Jlc31gKTtcbiAgICAgICAgY29uc29sZS5sb2coYGJlc3QgZGlzdGFuY2U6ICR7YmVzdENlbGwuZH1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYmVzdENlbGwucDtcbn1cblxuZnVuY3Rpb24gY29tcGFyZU1heChhLCBiKSB7XG4gICAgcmV0dXJuIGIubWF4IC0gYS5tYXg7XG59XG5cbmZ1bmN0aW9uIENlbGwoeCwgeSwgaCwgcG9seWdvbikge1xuICAgIHRoaXMucCA9IG5ldyBQb2ludCh4LCB5KTtcbiAgICB0aGlzLmggPSBoOyAvLyBoYWxmIHRoZSBjZWxsIHNpemVcbiAgICB0aGlzLmQgPSBwb2ludFRvUG9seWdvbkRpc3QodGhpcy5wLCBwb2x5Z29uKTsgLy8gZGlzdGFuY2UgZnJvbSBjZWxsIGNlbnRlciB0byBwb2x5Z29uXG4gICAgdGhpcy5tYXggPSB0aGlzLmQgKyB0aGlzLmggKiBNYXRoLlNRUlQyOyAvLyBtYXggZGlzdGFuY2UgdG8gcG9seWdvbiB3aXRoaW4gYSBjZWxsXG59XG5cbi8vIHNpZ25lZCBkaXN0YW5jZSBmcm9tIHBvaW50IHRvIHBvbHlnb24gb3V0bGluZSAobmVnYXRpdmUgaWYgcG9pbnQgaXMgb3V0c2lkZSlcbmZ1bmN0aW9uIHBvaW50VG9Qb2x5Z29uRGlzdChwLCBwb2x5Z29uKSB7XG4gICAgbGV0IGluc2lkZSA9IGZhbHNlO1xuICAgIGxldCBtaW5EaXN0U3EgPSBJbmZpbml0eTtcblxuICAgIGZvciAobGV0IGsgPSAwOyBrIDwgcG9seWdvbi5sZW5ndGg7IGsrKykge1xuICAgICAgICBjb25zdCByaW5nID0gcG9seWdvbltrXTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gcmluZy5sZW5ndGgsIGogPSBsZW4gLSAxOyBpIDwgbGVuOyBqID0gaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBhID0gcmluZ1tpXTtcbiAgICAgICAgICAgIGNvbnN0IGIgPSByaW5nW2pdO1xuXG4gICAgICAgICAgICBpZiAoKGEueSA+IHAueSAhPT0gYi55ID4gcC55KSAmJlxuICAgICAgICAgICAgICAgIChwLnggPCAoYi54IC0gYS54KSAqIChwLnkgLSBhLnkpIC8gKGIueSAtIGEueSkgKyBhLngpKSBpbnNpZGUgPSAhaW5zaWRlO1xuXG4gICAgICAgICAgICBtaW5EaXN0U3EgPSBNYXRoLm1pbihtaW5EaXN0U3EsIGRpc3RUb1NlZ21lbnRTcXVhcmVkKHAsIGEsIGIpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiAoaW5zaWRlID8gMSA6IC0xKSAqIE1hdGguc3FydChtaW5EaXN0U3EpO1xufVxuXG4vLyBnZXQgcG9seWdvbiBjZW50cm9pZFxuZnVuY3Rpb24gZ2V0Q2VudHJvaWRDZWxsKHBvbHlnb24pIHtcbiAgICBsZXQgYXJlYSA9IDA7XG4gICAgbGV0IHggPSAwO1xuICAgIGxldCB5ID0gMDtcbiAgICBjb25zdCBwb2ludHMgPSBwb2x5Z29uWzBdO1xuICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBwb2ludHMubGVuZ3RoLCBqID0gbGVuIC0gMTsgaSA8IGxlbjsgaiA9IGkrKykge1xuICAgICAgICBjb25zdCBhID0gcG9pbnRzW2ldO1xuICAgICAgICBjb25zdCBiID0gcG9pbnRzW2pdO1xuICAgICAgICBjb25zdCBmID0gYS54ICogYi55IC0gYi54ICogYS55O1xuICAgICAgICB4ICs9IChhLnggKyBiLngpICogZjtcbiAgICAgICAgeSArPSAoYS55ICsgYi55KSAqIGY7XG4gICAgICAgIGFyZWEgKz0gZiAqIDM7XG4gICAgfVxuICAgIHJldHVybiBuZXcgQ2VsbCh4IC8gYXJlYSwgeSAvIGFyZWEsIDAsIHBvbHlnb24pO1xufVxuIiwiLyoqXG4gKiBKUyBJbXBsZW1lbnRhdGlvbiBvZiBNdXJtdXJIYXNoMyAocjEzNikgKGFzIG9mIE1heSAyMCwgMjAxMSlcbiAqIFxuICogQGF1dGhvciA8YSBocmVmPVwibWFpbHRvOmdhcnkuY291cnRAZ21haWwuY29tXCI+R2FyeSBDb3VydDwvYT5cbiAqIEBzZWUgaHR0cDovL2dpdGh1Yi5jb20vZ2FyeWNvdXJ0L211cm11cmhhc2gtanNcbiAqIEBhdXRob3IgPGEgaHJlZj1cIm1haWx0bzphYXBwbGVieUBnbWFpbC5jb21cIj5BdXN0aW4gQXBwbGVieTwvYT5cbiAqIEBzZWUgaHR0cDovL3NpdGVzLmdvb2dsZS5jb20vc2l0ZS9tdXJtdXJoYXNoL1xuICogXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IEFTQ0lJIG9ubHlcbiAqIEBwYXJhbSB7bnVtYmVyfSBzZWVkIFBvc2l0aXZlIGludGVnZXIgb25seVxuICogQHJldHVybiB7bnVtYmVyfSAzMi1iaXQgcG9zaXRpdmUgaW50ZWdlciBoYXNoIFxuICovXG5cbmZ1bmN0aW9uIG11cm11cmhhc2gzXzMyX2djKGtleSwgc2VlZCkge1xuXHR2YXIgcmVtYWluZGVyLCBieXRlcywgaDEsIGgxYiwgYzEsIGMxYiwgYzIsIGMyYiwgazEsIGk7XG5cdFxuXHRyZW1haW5kZXIgPSBrZXkubGVuZ3RoICYgMzsgLy8ga2V5Lmxlbmd0aCAlIDRcblx0Ynl0ZXMgPSBrZXkubGVuZ3RoIC0gcmVtYWluZGVyO1xuXHRoMSA9IHNlZWQ7XG5cdGMxID0gMHhjYzllMmQ1MTtcblx0YzIgPSAweDFiODczNTkzO1xuXHRpID0gMDtcblx0XG5cdHdoaWxlIChpIDwgYnl0ZXMpIHtcblx0ICBcdGsxID0gXG5cdCAgXHQgICgoa2V5LmNoYXJDb2RlQXQoaSkgJiAweGZmKSkgfFxuXHQgIFx0ICAoKGtleS5jaGFyQ29kZUF0KCsraSkgJiAweGZmKSA8PCA4KSB8XG5cdCAgXHQgICgoa2V5LmNoYXJDb2RlQXQoKytpKSAmIDB4ZmYpIDw8IDE2KSB8XG5cdCAgXHQgICgoa2V5LmNoYXJDb2RlQXQoKytpKSAmIDB4ZmYpIDw8IDI0KTtcblx0XHQrK2k7XG5cdFx0XG5cdFx0azEgPSAoKCgoazEgJiAweGZmZmYpICogYzEpICsgKCgoKGsxID4+PiAxNikgKiBjMSkgJiAweGZmZmYpIDw8IDE2KSkpICYgMHhmZmZmZmZmZjtcblx0XHRrMSA9IChrMSA8PCAxNSkgfCAoazEgPj4+IDE3KTtcblx0XHRrMSA9ICgoKChrMSAmIDB4ZmZmZikgKiBjMikgKyAoKCgoazEgPj4+IDE2KSAqIGMyKSAmIDB4ZmZmZikgPDwgMTYpKSkgJiAweGZmZmZmZmZmO1xuXG5cdFx0aDEgXj0gazE7XG4gICAgICAgIGgxID0gKGgxIDw8IDEzKSB8IChoMSA+Pj4gMTkpO1xuXHRcdGgxYiA9ICgoKChoMSAmIDB4ZmZmZikgKiA1KSArICgoKChoMSA+Pj4gMTYpICogNSkgJiAweGZmZmYpIDw8IDE2KSkpICYgMHhmZmZmZmZmZjtcblx0XHRoMSA9ICgoKGgxYiAmIDB4ZmZmZikgKyAweDZiNjQpICsgKCgoKGgxYiA+Pj4gMTYpICsgMHhlNjU0KSAmIDB4ZmZmZikgPDwgMTYpKTtcblx0fVxuXHRcblx0azEgPSAwO1xuXHRcblx0c3dpdGNoIChyZW1haW5kZXIpIHtcblx0XHRjYXNlIDM6IGsxIF49IChrZXkuY2hhckNvZGVBdChpICsgMikgJiAweGZmKSA8PCAxNjtcblx0XHRjYXNlIDI6IGsxIF49IChrZXkuY2hhckNvZGVBdChpICsgMSkgJiAweGZmKSA8PCA4O1xuXHRcdGNhc2UgMTogazEgXj0gKGtleS5jaGFyQ29kZUF0KGkpICYgMHhmZik7XG5cdFx0XG5cdFx0azEgPSAoKChrMSAmIDB4ZmZmZikgKiBjMSkgKyAoKCgoazEgPj4+IDE2KSAqIGMxKSAmIDB4ZmZmZikgPDwgMTYpKSAmIDB4ZmZmZmZmZmY7XG5cdFx0azEgPSAoazEgPDwgMTUpIHwgKGsxID4+PiAxNyk7XG5cdFx0azEgPSAoKChrMSAmIDB4ZmZmZikgKiBjMikgKyAoKCgoazEgPj4+IDE2KSAqIGMyKSAmIDB4ZmZmZikgPDwgMTYpKSAmIDB4ZmZmZmZmZmY7XG5cdFx0aDEgXj0gazE7XG5cdH1cblx0XG5cdGgxIF49IGtleS5sZW5ndGg7XG5cblx0aDEgXj0gaDEgPj4+IDE2O1xuXHRoMSA9ICgoKGgxICYgMHhmZmZmKSAqIDB4ODVlYmNhNmIpICsgKCgoKGgxID4+PiAxNikgKiAweDg1ZWJjYTZiKSAmIDB4ZmZmZikgPDwgMTYpKSAmIDB4ZmZmZmZmZmY7XG5cdGgxIF49IGgxID4+PiAxMztcblx0aDEgPSAoKCgoaDEgJiAweGZmZmYpICogMHhjMmIyYWUzNSkgKyAoKCgoaDEgPj4+IDE2KSAqIDB4YzJiMmFlMzUpICYgMHhmZmZmKSA8PCAxNikpKSAmIDB4ZmZmZmZmZmY7XG5cdGgxIF49IGgxID4+PiAxNjtcblxuXHRyZXR1cm4gaDEgPj4+IDA7XG59XG5cbmlmKHR5cGVvZiBtb2R1bGUgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSBtdXJtdXJoYXNoM18zMl9nY1xufSIsIi8qKlxuICogSlMgSW1wbGVtZW50YXRpb24gb2YgTXVybXVySGFzaDJcbiAqIFxuICogQGF1dGhvciA8YSBocmVmPVwibWFpbHRvOmdhcnkuY291cnRAZ21haWwuY29tXCI+R2FyeSBDb3VydDwvYT5cbiAqIEBzZWUgaHR0cDovL2dpdGh1Yi5jb20vZ2FyeWNvdXJ0L211cm11cmhhc2gtanNcbiAqIEBhdXRob3IgPGEgaHJlZj1cIm1haWx0bzphYXBwbGVieUBnbWFpbC5jb21cIj5BdXN0aW4gQXBwbGVieTwvYT5cbiAqIEBzZWUgaHR0cDovL3NpdGVzLmdvb2dsZS5jb20vc2l0ZS9tdXJtdXJoYXNoL1xuICogXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyIEFTQ0lJIG9ubHlcbiAqIEBwYXJhbSB7bnVtYmVyfSBzZWVkIFBvc2l0aXZlIGludGVnZXIgb25seVxuICogQHJldHVybiB7bnVtYmVyfSAzMi1iaXQgcG9zaXRpdmUgaW50ZWdlciBoYXNoXG4gKi9cblxuZnVuY3Rpb24gbXVybXVyaGFzaDJfMzJfZ2Moc3RyLCBzZWVkKSB7XG4gIHZhclxuICAgIGwgPSBzdHIubGVuZ3RoLFxuICAgIGggPSBzZWVkIF4gbCxcbiAgICBpID0gMCxcbiAgICBrO1xuICBcbiAgd2hpbGUgKGwgPj0gNCkge1xuICBcdGsgPSBcbiAgXHQgICgoc3RyLmNoYXJDb2RlQXQoaSkgJiAweGZmKSkgfFxuICBcdCAgKChzdHIuY2hhckNvZGVBdCgrK2kpICYgMHhmZikgPDwgOCkgfFxuICBcdCAgKChzdHIuY2hhckNvZGVBdCgrK2kpICYgMHhmZikgPDwgMTYpIHxcbiAgXHQgICgoc3RyLmNoYXJDb2RlQXQoKytpKSAmIDB4ZmYpIDw8IDI0KTtcbiAgICBcbiAgICBrID0gKCgoayAmIDB4ZmZmZikgKiAweDViZDFlOTk1KSArICgoKChrID4+PiAxNikgKiAweDViZDFlOTk1KSAmIDB4ZmZmZikgPDwgMTYpKTtcbiAgICBrIF49IGsgPj4+IDI0O1xuICAgIGsgPSAoKChrICYgMHhmZmZmKSAqIDB4NWJkMWU5OTUpICsgKCgoKGsgPj4+IDE2KSAqIDB4NWJkMWU5OTUpICYgMHhmZmZmKSA8PCAxNikpO1xuXG5cdGggPSAoKChoICYgMHhmZmZmKSAqIDB4NWJkMWU5OTUpICsgKCgoKGggPj4+IDE2KSAqIDB4NWJkMWU5OTUpICYgMHhmZmZmKSA8PCAxNikpIF4gaztcblxuICAgIGwgLT0gNDtcbiAgICArK2k7XG4gIH1cbiAgXG4gIHN3aXRjaCAobCkge1xuICBjYXNlIDM6IGggXj0gKHN0ci5jaGFyQ29kZUF0KGkgKyAyKSAmIDB4ZmYpIDw8IDE2O1xuICBjYXNlIDI6IGggXj0gKHN0ci5jaGFyQ29kZUF0KGkgKyAxKSAmIDB4ZmYpIDw8IDg7XG4gIGNhc2UgMTogaCBePSAoc3RyLmNoYXJDb2RlQXQoaSkgJiAweGZmKTtcbiAgICAgICAgICBoID0gKCgoaCAmIDB4ZmZmZikgKiAweDViZDFlOTk1KSArICgoKChoID4+PiAxNikgKiAweDViZDFlOTk1KSAmIDB4ZmZmZikgPDwgMTYpKTtcbiAgfVxuXG4gIGggXj0gaCA+Pj4gMTM7XG4gIGggPSAoKChoICYgMHhmZmZmKSAqIDB4NWJkMWU5OTUpICsgKCgoKGggPj4+IDE2KSAqIDB4NWJkMWU5OTUpICYgMHhmZmZmKSA8PCAxNikpO1xuICBoIF49IGggPj4+IDE1O1xuXG4gIHJldHVybiBoID4+PiAwO1xufVxuXG5pZih0eXBlb2YgbW9kdWxlICE9PSB1bmRlZmluZWQpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSBtdXJtdXJoYXNoMl8zMl9nY1xufVxuIiwidmFyIG11cm11cjMgPSByZXF1aXJlKFwiLi9tdXJtdXJoYXNoM19nYy5qc1wiKVxudmFyIG11cm11cjIgPSByZXF1aXJlKFwiLi9tdXJtdXJoYXNoMl9nYy5qc1wiKVxuXG5tb2R1bGUuZXhwb3J0cyA9IG11cm11cjNcbm1vZHVsZS5leHBvcnRzLm11cm11cjMgPSBtdXJtdXIzXG5tb2R1bGUuZXhwb3J0cy5tdXJtdXIyID0gbXVybXVyMlxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IEFuY2hvciBmcm9tICcuL2FuY2hvcic7XG5cbmltcG9ydCB7IGdldEFuY2hvcnMsIGdldENlbnRlckFuY2hvciB9IGZyb20gJy4vZ2V0X2FuY2hvcnMnO1xuaW1wb3J0IGNsaXBMaW5lIGZyb20gJy4vY2xpcF9saW5lJztcbmltcG9ydCB7IHNoYXBlVGV4dCwgc2hhcGVJY29uLCBXcml0aW5nTW9kZSB9IGZyb20gJy4vc2hhcGluZyc7XG5pbXBvcnQgeyBnZXRHbHlwaFF1YWRzLCBnZXRJY29uUXVhZHMgfSBmcm9tICcuL3F1YWRzJztcbmltcG9ydCBDb2xsaXNpb25GZWF0dXJlIGZyb20gJy4vY29sbGlzaW9uX2ZlYXR1cmUnO1xuaW1wb3J0IHsgd2Fybk9uY2UgfSBmcm9tICcuLi91dGlsL3V0aWwnO1xuaW1wb3J0IHtcbiAgICBhbGxvd3NWZXJ0aWNhbFdyaXRpbmdNb2RlLFxuICAgIGFsbG93c0xldHRlclNwYWNpbmdcbn0gZnJvbSAnLi4vdXRpbC9zY3JpcHRfZGV0ZWN0aW9uJztcbmltcG9ydCBmaW5kUG9sZU9mSW5hY2Nlc3NpYmlsaXR5IGZyb20gJy4uL3V0aWwvZmluZF9wb2xlX29mX2luYWNjZXNzaWJpbGl0eSc7XG5pbXBvcnQgY2xhc3NpZnlSaW5ncyBmcm9tICcuLi91dGlsL2NsYXNzaWZ5X3JpbmdzJztcbmltcG9ydCBFWFRFTlQgZnJvbSAnLi4vZGF0YS9leHRlbnQnO1xuaW1wb3J0IFN5bWJvbEJ1Y2tldCBmcm9tICcuLi9kYXRhL2J1Y2tldC9zeW1ib2xfYnVja2V0JztcbmltcG9ydCBFdmFsdWF0aW9uUGFyYW1ldGVycyBmcm9tICcuLi9zdHlsZS9ldmFsdWF0aW9uX3BhcmFtZXRlcnMnO1xuaW1wb3J0IHtTSVpFX1BBQ0tfRkFDVE9SfSBmcm9tICcuL3N5bWJvbF9zaXplJztcbmltcG9ydCBPTkVfRU0gZnJvbSAnLi9vbmVfZW0nO1xuXG5pbXBvcnQgdHlwZSB7U2hhcGluZywgUG9zaXRpb25lZEljb24sIFRleHRKdXN0aWZ5fSBmcm9tICcuL3NoYXBpbmcnO1xuaW1wb3J0IHR5cGUge0NvbGxpc2lvbkJveEFycmF5fSBmcm9tICcuLi9kYXRhL2FycmF5X3R5cGVzJztcbmltcG9ydCB0eXBlIHtTeW1ib2xGZWF0dXJlfSBmcm9tICcuLi9kYXRhL2J1Y2tldC9zeW1ib2xfYnVja2V0JztcbmltcG9ydCB0eXBlIHtTdHlsZUltYWdlfSBmcm9tICcuLi9zdHlsZS9zdHlsZV9pbWFnZSc7XG5pbXBvcnQgdHlwZSB7U3R5bGVHbHlwaH0gZnJvbSAnLi4vc3R5bGUvc3R5bGVfZ2x5cGgnO1xuaW1wb3J0IHR5cGUgU3ltYm9sU3R5bGVMYXllciBmcm9tICcuLi9zdHlsZS9zdHlsZV9sYXllci9zeW1ib2xfc3R5bGVfbGF5ZXInO1xuaW1wb3J0IHR5cGUge0ltYWdlUG9zaXRpb259IGZyb20gJy4uL3JlbmRlci9pbWFnZV9hdGxhcyc7XG5pbXBvcnQgdHlwZSB7R2x5cGhQb3NpdGlvbn0gZnJvbSAnLi4vcmVuZGVyL2dseXBoX2F0bGFzJztcbmltcG9ydCB0eXBlIHtQb3NzaWJseUV2YWx1YXRlZFByb3BlcnR5VmFsdWV9IGZyb20gJy4uL3N0eWxlL3Byb3BlcnRpZXMnO1xuXG5pbXBvcnQgUG9pbnQgZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XG5pbXBvcnQgbXVybXVyMyBmcm9tICdtdXJtdXJoYXNoLWpzJztcblxuLy8gVGhlIHN5bWJvbCBsYXlvdXQgcHJvY2VzcyBuZWVkcyBgdGV4dC1zaXplYCBldmFsdWF0ZWQgYXQgdXAgdG8gZml2ZSBkaWZmZXJlbnQgem9vbSBsZXZlbHMsIGFuZFxuLy8gYGljb24tc2l6ZWAgYXQgdXAgdG8gdGhyZWU6XG4vL1xuLy8gICAxLiBgdGV4dC1zaXplYCBhdCB0aGUgem9vbSBsZXZlbCBvZiB0aGUgYnVja2V0LiBVc2VkIHRvIGNhbGN1bGF0ZSBhIHBlci1mZWF0dXJlIHNpemUgZm9yIHNvdXJjZSBgdGV4dC1zaXplYFxuLy8gICAgICAgZXhwcmVzc2lvbnMsIGFuZCB0byBjYWxjdWxhdGUgdGhlIGJveCBkaW1lbnNpb25zIGZvciBpY29uLXRleHQtZml0LlxuLy8gICAyLiBgaWNvbi1zaXplYCBhdCB0aGUgem9vbSBsZXZlbCBvZiB0aGUgYnVja2V0LiBVc2VkIHRvIGNhbGN1bGF0ZSBhIHBlci1mZWF0dXJlIHNpemUgZm9yIHNvdXJjZSBgaWNvbi1zaXplYFxuLy8gICAgICAgZXhwcmVzc2lvbnMuXG4vLyAgIDMuIGB0ZXh0LXNpemVgIGFuZCBgaWNvbi1zaXplYCBhdCB0aGUgem9vbSBsZXZlbCBvZiB0aGUgYnVja2V0LCBwbHVzIG9uZS4gVXNlZCB0byBjYWxjdWxhdGUgY29sbGlzaW9uIGJveGVzLlxuLy8gICA0LiBgdGV4dC1zaXplYCBhdCB6b29tIGxldmVsIDE4LiBVc2VkIGZvciBzb21ldGhpbmcgbGluZS1zeW1ib2wtcGxhY2VtZW50LXJlbGF0ZWQuXG4vLyAgIDUuICBGb3IgY29tcG9zaXRlIGAqLXNpemVgIGV4cHJlc3Npb25zOiB0d28gem9vbSBsZXZlbHMgb2YgY3VydmUgc3RvcHMgdGhhdCBcImNvdmVyXCIgdGhlIHpvb20gbGV2ZWwgb2YgdGhlXG4vLyAgICAgICBidWNrZXQuIFRoZXNlIGdvIGludG8gYSB2ZXJ0ZXggYnVmZmVyIGFuZCBhcmUgdXNlZCBieSB0aGUgc2hhZGVyIHRvIGludGVycG9sYXRlIHRoZSBzaXplIGF0IHJlbmRlciB0aW1lLlxuLy9cbi8vICgxKSBhbmQgKDIpIGFyZSBzdG9yZWQgaW4gYGJ1Y2tldC5sYXllcnNbMF0ubGF5b3V0YC4gVGhlIHJlbWFpbmRlciBhcmUgYmVsb3cuXG4vL1xudHlwZSBTaXplcyA9IHtcbiAgICBsYXlvdXRUZXh0U2l6ZTogUG9zc2libHlFdmFsdWF0ZWRQcm9wZXJ0eVZhbHVlPG51bWJlcj4sIC8vICgzKVxuICAgIGxheW91dEljb25TaXplOiBQb3NzaWJseUV2YWx1YXRlZFByb3BlcnR5VmFsdWU8bnVtYmVyPiwgLy8gKDMpXG4gICAgdGV4dE1heFNpemU6IFBvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZTxudW1iZXI+LCAgICAvLyAoNClcbiAgICBjb21wb3NpdGVUZXh0U2l6ZXM6IFtQb3NzaWJseUV2YWx1YXRlZFByb3BlcnR5VmFsdWU8bnVtYmVyPiwgUG9zc2libHlFdmFsdWF0ZWRQcm9wZXJ0eVZhbHVlPG51bWJlcj5dLCAvLyAoNSlcbiAgICBjb21wb3NpdGVJY29uU2l6ZXM6IFtQb3NzaWJseUV2YWx1YXRlZFByb3BlcnR5VmFsdWU8bnVtYmVyPiwgUG9zc2libHlFdmFsdWF0ZWRQcm9wZXJ0eVZhbHVlPG51bWJlcj5dLCAvLyAoNSlcbn07XG5cbmV4cG9ydCB0eXBlIFRleHRBbmNob3IgPSAnY2VudGVyJyB8ICdsZWZ0JyB8ICdyaWdodCcgfCAndG9wJyB8ICdib3R0b20nIHwgJ3RvcC1sZWZ0JyB8ICd0b3AtcmlnaHQnIHwgJ2JvdHRvbS1sZWZ0JyB8ICdib3R0b20tcmlnaHQnO1xuXG4vLyBUaGUgcmFkaWFsIG9mZnNldCBpcyB0byB0aGUgZWRnZSBvZiB0aGUgdGV4dCBib3hcbi8vIEluIHRoZSBob3Jpem9udGFsIGRpcmVjdGlvbiwgdGhlIGVkZ2Ugb2YgdGhlIHRleHQgYm94IGlzIHdoZXJlIGdseXBocyBzdGFydFxuLy8gQnV0IGluIHRoZSB2ZXJ0aWNhbCBkaXJlY3Rpb24sIHRoZSBnbHlwaHMgYXBwZWFyIHRvIFwic3RhcnRcIiBhdCB0aGUgYmFzZWxpbmVcbi8vIFdlIGRvbid0IGFjdHVhbGx5IGxvYWQgYmFzZWxpbmUgZGF0YSwgYnV0IHdlIGFzc3VtZSBhbiBvZmZzZXQgb2YgT05FX0VNIC0gMTdcbi8vIChzZWUgXCJ5T2Zmc2V0XCIgaW4gc2hhcGluZy5qcylcbmNvbnN0IGJhc2VsaW5lT2Zmc2V0ID0gNztcblxuZXhwb3J0IGZ1bmN0aW9uIGV2YWx1YXRlUmFkaWFsT2Zmc2V0KGFuY2hvcjogVGV4dEFuY2hvciwgcmFkaWFsT2Zmc2V0OiBudW1iZXIpIHtcbiAgICBsZXQgeCA9IDAsIHkgPSAwO1xuICAgIC8vIHNvbHZlIGZvciByIHdoZXJlIHJeMiArIHJeMiA9IHJhZGlhbE9mZnNldF4yXG4gICAgY29uc3QgaHlwb3RlbnVzZSA9IHJhZGlhbE9mZnNldCAvIE1hdGguc3FydCgyKTtcblxuICAgIHN3aXRjaCAoYW5jaG9yKSB7XG4gICAgY2FzZSAndG9wLXJpZ2h0JzpcbiAgICBjYXNlICd0b3AtbGVmdCc6XG4gICAgICAgIHkgPSBoeXBvdGVudXNlIC0gYmFzZWxpbmVPZmZzZXQ7XG4gICAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2JvdHRvbS1yaWdodCc6XG4gICAgY2FzZSAnYm90dG9tLWxlZnQnOlxuICAgICAgICB5ID0gLWh5cG90ZW51c2UgKyBiYXNlbGluZU9mZnNldDtcbiAgICAgICAgYnJlYWs7XG4gICAgY2FzZSAnYm90dG9tJzpcbiAgICAgICAgeSA9IC1yYWRpYWxPZmZzZXQgKyBiYXNlbGluZU9mZnNldDtcbiAgICAgICAgYnJlYWs7XG4gICAgY2FzZSAndG9wJzpcbiAgICAgICAgeSA9IHJhZGlhbE9mZnNldCAtIGJhc2VsaW5lT2Zmc2V0O1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICBzd2l0Y2ggKGFuY2hvcikge1xuICAgIGNhc2UgJ3RvcC1yaWdodCc6XG4gICAgY2FzZSAnYm90dG9tLXJpZ2h0JzpcbiAgICAgICAgeCA9IC1oeXBvdGVudXNlO1xuICAgICAgICBicmVhaztcbiAgICBjYXNlICd0b3AtbGVmdCc6XG4gICAgY2FzZSAnYm90dG9tLWxlZnQnOlxuICAgICAgICB4ID0gaHlwb3RlbnVzZTtcbiAgICAgICAgYnJlYWs7XG4gICAgY2FzZSAnbGVmdCc6XG4gICAgICAgIHggPSByYWRpYWxPZmZzZXQ7XG4gICAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgICAgeCA9IC1yYWRpYWxPZmZzZXQ7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHJldHVybiBbeCwgeV07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwZXJmb3JtU3ltYm9sTGF5b3V0KGJ1Y2tldDogU3ltYm9sQnVja2V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaE1hcDoge1tzdHJpbmddOiB7W251bWJlcl06ID9TdHlsZUdseXBofX0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoUG9zaXRpb25zOiB7W3N0cmluZ106IHtbbnVtYmVyXTogR2x5cGhQb3NpdGlvbn19LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZU1hcDoge1tzdHJpbmddOiBTdHlsZUltYWdlfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VQb3NpdGlvbnM6IHtbc3RyaW5nXTogSW1hZ2VQb3NpdGlvbn0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dDb2xsaXNpb25Cb3hlczogYm9vbGVhbikge1xuICAgIGJ1Y2tldC5jcmVhdGVBcnJheXMoKTtcblxuICAgIGNvbnN0IHRpbGVTaXplID0gNTEyICogYnVja2V0Lm92ZXJzY2FsaW5nO1xuICAgIGJ1Y2tldC50aWxlUGl4ZWxSYXRpbyA9IEVYVEVOVCAvIHRpbGVTaXplO1xuICAgIGJ1Y2tldC5jb21wYXJlVGV4dCA9IHt9O1xuICAgIGJ1Y2tldC5pY29uc05lZWRMaW5lYXIgPSBmYWxzZTtcblxuICAgIGNvbnN0IGxheW91dCA9IGJ1Y2tldC5sYXllcnNbMF0ubGF5b3V0O1xuICAgIGNvbnN0IHVuZXZhbHVhdGVkTGF5b3V0VmFsdWVzID0gYnVja2V0LmxheWVyc1swXS5fdW5ldmFsdWF0ZWRMYXlvdXQuX3ZhbHVlcztcblxuICAgIGNvbnN0IHNpemVzID0ge307XG5cbiAgICBpZiAoYnVja2V0LnRleHRTaXplRGF0YS5mdW5jdGlvblR5cGUgPT09ICdjb21wb3NpdGUnKSB7XG4gICAgICAgIGNvbnN0IHttaW4sIG1heH0gPSBidWNrZXQudGV4dFNpemVEYXRhLnpvb21SYW5nZTtcbiAgICAgICAgc2l6ZXMuY29tcG9zaXRlVGV4dFNpemVzID0gW1xuICAgICAgICAgICAgdW5ldmFsdWF0ZWRMYXlvdXRWYWx1ZXNbJ3RleHQtc2l6ZSddLnBvc3NpYmx5RXZhbHVhdGUobmV3IEV2YWx1YXRpb25QYXJhbWV0ZXJzKG1pbikpLFxuICAgICAgICAgICAgdW5ldmFsdWF0ZWRMYXlvdXRWYWx1ZXNbJ3RleHQtc2l6ZSddLnBvc3NpYmx5RXZhbHVhdGUobmV3IEV2YWx1YXRpb25QYXJhbWV0ZXJzKG1heCkpXG4gICAgICAgIF07XG4gICAgfVxuXG4gICAgaWYgKGJ1Y2tldC5pY29uU2l6ZURhdGEuZnVuY3Rpb25UeXBlID09PSAnY29tcG9zaXRlJykge1xuICAgICAgICBjb25zdCB7bWluLCBtYXh9ID0gYnVja2V0Lmljb25TaXplRGF0YS56b29tUmFuZ2U7XG4gICAgICAgIHNpemVzLmNvbXBvc2l0ZUljb25TaXplcyA9IFtcbiAgICAgICAgICAgIHVuZXZhbHVhdGVkTGF5b3V0VmFsdWVzWydpY29uLXNpemUnXS5wb3NzaWJseUV2YWx1YXRlKG5ldyBFdmFsdWF0aW9uUGFyYW1ldGVycyhtaW4pKSxcbiAgICAgICAgICAgIHVuZXZhbHVhdGVkTGF5b3V0VmFsdWVzWydpY29uLXNpemUnXS5wb3NzaWJseUV2YWx1YXRlKG5ldyBFdmFsdWF0aW9uUGFyYW1ldGVycyhtYXgpKVxuICAgICAgICBdO1xuICAgIH1cblxuICAgIHNpemVzLmxheW91dFRleHRTaXplID0gdW5ldmFsdWF0ZWRMYXlvdXRWYWx1ZXNbJ3RleHQtc2l6ZSddLnBvc3NpYmx5RXZhbHVhdGUobmV3IEV2YWx1YXRpb25QYXJhbWV0ZXJzKGJ1Y2tldC56b29tICsgMSkpO1xuICAgIHNpemVzLmxheW91dEljb25TaXplID0gdW5ldmFsdWF0ZWRMYXlvdXRWYWx1ZXNbJ2ljb24tc2l6ZSddLnBvc3NpYmx5RXZhbHVhdGUobmV3IEV2YWx1YXRpb25QYXJhbWV0ZXJzKGJ1Y2tldC56b29tICsgMSkpO1xuICAgIHNpemVzLnRleHRNYXhTaXplID0gdW5ldmFsdWF0ZWRMYXlvdXRWYWx1ZXNbJ3RleHQtc2l6ZSddLnBvc3NpYmx5RXZhbHVhdGUobmV3IEV2YWx1YXRpb25QYXJhbWV0ZXJzKDE4KSk7XG5cbiAgICBjb25zdCBsaW5lSGVpZ2h0ID0gbGF5b3V0LmdldCgndGV4dC1saW5lLWhlaWdodCcpICogT05FX0VNO1xuICAgIGNvbnN0IHRleHRBbG9uZ0xpbmUgPSBsYXlvdXQuZ2V0KCd0ZXh0LXJvdGF0aW9uLWFsaWdubWVudCcpID09PSAnbWFwJyAmJiBsYXlvdXQuZ2V0KCdzeW1ib2wtcGxhY2VtZW50JykgIT09ICdwb2ludCc7XG4gICAgY29uc3Qga2VlcFVwcmlnaHQgPSBsYXlvdXQuZ2V0KCd0ZXh0LWtlZXAtdXByaWdodCcpO1xuXG5cbiAgICBmb3IgKGNvbnN0IGZlYXR1cmUgb2YgYnVja2V0LmZlYXR1cmVzKSB7XG4gICAgICAgIGNvbnN0IGZvbnRzdGFjayA9IGxheW91dC5nZXQoJ3RleHQtZm9udCcpLmV2YWx1YXRlKGZlYXR1cmUsIHt9KS5qb2luKCcsJyk7XG4gICAgICAgIGNvbnN0IGdseXBoUG9zaXRpb25NYXAgPSBnbHlwaFBvc2l0aW9ucztcblxuICAgICAgICBjb25zdCBzaGFwZWRUZXh0T3JpZW50YXRpb25zID0ge1xuICAgICAgICAgICAgaG9yaXpvbnRhbDoge30sXG4gICAgICAgICAgICB2ZXJ0aWNhbDogdW5kZWZpbmVkXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHRleHQgPSBmZWF0dXJlLnRleHQ7XG4gICAgICAgIGxldCB0ZXh0T2Zmc2V0OiBbbnVtYmVyLCBudW1iZXJdID0gWzAsIDBdO1xuICAgICAgICBpZiAodGV4dCkge1xuICAgICAgICAgICAgY29uc3QgdW5mb3JtYXR0ZWRUZXh0ID0gdGV4dC50b1N0cmluZygpO1xuICAgICAgICAgICAgY29uc3Qgc3BhY2luZyA9IGxheW91dC5nZXQoJ3RleHQtbGV0dGVyLXNwYWNpbmcnKS5ldmFsdWF0ZShmZWF0dXJlLCB7fSkgKiBPTkVfRU07XG4gICAgICAgICAgICBjb25zdCBzcGFjaW5nSWZBbGxvd2VkID0gYWxsb3dzTGV0dGVyU3BhY2luZyh1bmZvcm1hdHRlZFRleHQpID8gc3BhY2luZyA6IDA7XG5cbiAgICAgICAgICAgIGNvbnN0IHRleHRBbmNob3IgPSBsYXlvdXQuZ2V0KCd0ZXh0LWFuY2hvcicpLmV2YWx1YXRlKGZlYXR1cmUsIHt9KTtcbiAgICAgICAgICAgIGNvbnN0IHZhcmlhYmxlVGV4dEFuY2hvciA9IGxheW91dC5nZXQoJ3RleHQtdmFyaWFibGUtYW5jaG9yJyk7XG4gICAgICAgICAgICBjb25zdCByYWRpYWxPZmZzZXQgPSBsYXlvdXQuZ2V0KCd0ZXh0LXJhZGlhbC1vZmZzZXQnKS5ldmFsdWF0ZShmZWF0dXJlLCB7fSk7XG5cbiAgICAgICAgICAgIGlmICghdmFyaWFibGVUZXh0QW5jaG9yKSB7XG4gICAgICAgICAgICAgICAgLy8gTGF5ZXJzIHdpdGggdmFyaWFibGUgYW5jaG9ycyB1c2UgdGhlIGB0ZXh0LXJhZGlhbC1vZmZzZXRgIHByb3BlcnR5IGFuZCB0aGUgW3gsIHldIG9mZnNldCB2ZWN0b3JcbiAgICAgICAgICAgICAgICAvLyBpcyBjYWxjdWxhdGVkIGF0IHBsYWNlbWVudCB0aW1lIGluc3RlYWQgb2YgbGF5b3V0IHRpbWVcbiAgICAgICAgICAgICAgICBpZiAocmFkaWFsT2Zmc2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBzdHlsZSBzcGVjIHNheXMgZG9uJ3QgdXNlIGB0ZXh0LW9mZnNldGAgYW5kIGB0ZXh0LXJhZGlhbC1vZmZzZXRgIHRvZ2V0aGVyXG4gICAgICAgICAgICAgICAgICAgIC8vIGJ1dCBkb2Vzbid0IGFjdHVhbGx5IHNwZWNpZnkgd2hhdCBoYXBwZW5zIGlmIHlvdSB1c2UgYm90aC4gV2UgZ28gd2l0aCB0aGUgcmFkaWFsIG9mZnNldC5cbiAgICAgICAgICAgICAgICAgICAgdGV4dE9mZnNldCA9IGV2YWx1YXRlUmFkaWFsT2Zmc2V0KHRleHRBbmNob3IsIHJhZGlhbE9mZnNldCAqIE9ORV9FTSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dE9mZnNldCA9IChsYXlvdXQuZ2V0KCd0ZXh0LW9mZnNldCcpLmV2YWx1YXRlKGZlYXR1cmUsIHt9KS5tYXAodCA9PiB0ICogT05FX0VNKTogYW55KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCB0ZXh0SnVzdGlmeSA9IHRleHRBbG9uZ0xpbmUgP1xuICAgICAgICAgICAgICAgIFwiY2VudGVyXCIgOlxuICAgICAgICAgICAgICAgIGxheW91dC5nZXQoJ3RleHQtanVzdGlmeScpLmV2YWx1YXRlKGZlYXR1cmUsIHt9KTtcblxuICAgICAgICAgICAgY29uc3QgbWF4V2lkdGggPSBsYXlvdXQuZ2V0KCdzeW1ib2wtcGxhY2VtZW50JykgPT09ICdwb2ludCcgP1xuICAgICAgICAgICAgICAgIGxheW91dC5nZXQoJ3RleHQtbWF4LXdpZHRoJykuZXZhbHVhdGUoZmVhdHVyZSwge30pICogT05FX0VNIDpcbiAgICAgICAgICAgICAgICAwO1xuXG4gICAgICAgICAgICAvLyBJZiB0aGlzIGxheWVyIHVzZXMgdGV4dC12YXJpYWJsZS1hbmNob3IsIGdlbmVyYXRlIHNoYXBpbmdzIGZvciBhbGwganVzdGlmaWNhdGlvbiBwb3NzaWJpbGl0aWVzLlxuICAgICAgICAgICAgaWYgKCF0ZXh0QWxvbmdMaW5lICYmIHZhcmlhYmxlVGV4dEFuY2hvcikge1xuICAgICAgICAgICAgICAgIGNvbnN0IGp1c3RpZmljYXRpb25zID0gdGV4dEp1c3RpZnkgPT09IFwiYXV0b1wiID9cbiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVUZXh0QW5jaG9yLm1hcChhID0+IGdldEFuY2hvckp1c3RpZmljYXRpb24oYSkpIDpcbiAgICAgICAgICAgICAgICAgICAgW3RleHRKdXN0aWZ5XTtcblxuICAgICAgICAgICAgICAgIGxldCBzaW5nbGVMaW5lID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBqdXN0aWZpY2F0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBqdXN0aWZpY2F0aW9uOiBUZXh0SnVzdGlmeSA9IGp1c3RpZmljYXRpb25zW2ldO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2hhcGVkVGV4dE9yaWVudGF0aW9ucy5ob3Jpem9udGFsW2p1c3RpZmljYXRpb25dKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNpbmdsZUxpbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBzaGFwaW5nIGZvciB0aGUgZmlyc3QganVzdGlmaWNhdGlvbiB3YXMgb25seSBhIHNpbmdsZSBsaW5lLCB3ZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FuIHJlLXVzZSBpdCBmb3IgdGhlIG90aGVyIGp1c3RpZmljYXRpb25zXG4gICAgICAgICAgICAgICAgICAgICAgICBzaGFwZWRUZXh0T3JpZW50YXRpb25zLmhvcml6b250YWxbanVzdGlmaWNhdGlvbl0gPSBzaGFwZWRUZXh0T3JpZW50YXRpb25zLmhvcml6b250YWxbMF07XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB1c2luZyB0ZXh0LXZhcmlhYmxlLWFuY2hvciBmb3IgdGhlIGxheWVyLCB3ZSB1c2UgYSBjZW50ZXIgYW5jaG9yIGZvciBhbGwgc2hhcGluZ3MgYW5kIGFwcGx5XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgb2Zmc2V0cyBmb3IgdGhlIGFuY2hvciBpbiB0aGUgcGxhY2VtZW50IHN0ZXAuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFwaW5nID0gc2hhcGVUZXh0KHRleHQsIGdseXBoTWFwLCBmb250c3RhY2ssIG1heFdpZHRoLCBsaW5lSGVpZ2h0LCAnY2VudGVyJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganVzdGlmaWNhdGlvbiwgc3BhY2luZ0lmQWxsb3dlZCwgdGV4dE9mZnNldCwgV3JpdGluZ01vZGUuaG9yaXpvbnRhbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2hhcGluZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXBlZFRleHRPcmllbnRhdGlvbnMuaG9yaXpvbnRhbFtqdXN0aWZpY2F0aW9uXSA9IHNoYXBpbmc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2luZ2xlTGluZSA9IHNoYXBpbmcubGluZUNvdW50ID09PSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAodGV4dEp1c3RpZnkgPT09IFwiYXV0b1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIHRleHRKdXN0aWZ5ID0gZ2V0QW5jaG9ySnVzdGlmaWNhdGlvbih0ZXh0QW5jaG9yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3Qgc2hhcGluZyA9IHNoYXBlVGV4dCh0ZXh0LCBnbHlwaE1hcCwgZm9udHN0YWNrLCBtYXhXaWR0aCwgbGluZUhlaWdodCwgdGV4dEFuY2hvciwgdGV4dEp1c3RpZnksIHNwYWNpbmdJZkFsbG93ZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0T2Zmc2V0LCBXcml0aW5nTW9kZS5ob3Jpem9udGFsKTtcbiAgICAgICAgICAgICAgICBpZiAoc2hhcGluZykgc2hhcGVkVGV4dE9yaWVudGF0aW9ucy5ob3Jpem9udGFsW3RleHRKdXN0aWZ5XSA9IHNoYXBpbmc7XG5cbiAgICAgICAgICAgICAgICBpZiAoYWxsb3dzVmVydGljYWxXcml0aW5nTW9kZSh1bmZvcm1hdHRlZFRleHQpICYmIHRleHRBbG9uZ0xpbmUgJiYga2VlcFVwcmlnaHQpIHtcbiAgICAgICAgICAgICAgICAgICAgc2hhcGVkVGV4dE9yaWVudGF0aW9ucy52ZXJ0aWNhbCA9IHNoYXBlVGV4dCh0ZXh0LCBnbHlwaE1hcCwgZm9udHN0YWNrLCBtYXhXaWR0aCwgbGluZUhlaWdodCwgdGV4dEFuY2hvciwgdGV4dEp1c3RpZnksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhY2luZ0lmQWxsb3dlZCwgdGV4dE9mZnNldCwgV3JpdGluZ01vZGUudmVydGljYWwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHNoYXBlZEljb247XG4gICAgICAgIGlmIChmZWF0dXJlLmljb24pIHtcbiAgICAgICAgICAgIGNvbnN0IGltYWdlID0gaW1hZ2VNYXBbZmVhdHVyZS5pY29uXTtcbiAgICAgICAgICAgIGlmIChpbWFnZSkge1xuICAgICAgICAgICAgICAgIHNoYXBlZEljb24gPSBzaGFwZUljb24oXG4gICAgICAgICAgICAgICAgICAgIGltYWdlUG9zaXRpb25zW2ZlYXR1cmUuaWNvbl0sXG4gICAgICAgICAgICAgICAgICAgIGxheW91dC5nZXQoJ2ljb24tb2Zmc2V0JykuZXZhbHVhdGUoZmVhdHVyZSwge30pLFxuICAgICAgICAgICAgICAgICAgICBsYXlvdXQuZ2V0KCdpY29uLWFuY2hvcicpLmV2YWx1YXRlKGZlYXR1cmUsIHt9KSk7XG4gICAgICAgICAgICAgICAgaWYgKGJ1Y2tldC5zZGZJY29ucyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGJ1Y2tldC5zZGZJY29ucyA9IGltYWdlLnNkZjtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJ1Y2tldC5zZGZJY29ucyAhPT0gaW1hZ2Uuc2RmKSB7XG4gICAgICAgICAgICAgICAgICAgIHdhcm5PbmNlKCdTdHlsZSBzaGVldCB3YXJuaW5nOiBDYW5ub3QgbWl4IFNERiBhbmQgbm9uLVNERiBpY29ucyBpbiBvbmUgYnVmZmVyJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChpbWFnZS5waXhlbFJhdGlvICE9PSBidWNrZXQucGl4ZWxSYXRpbykge1xuICAgICAgICAgICAgICAgICAgICBidWNrZXQuaWNvbnNOZWVkTGluZWFyID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxheW91dC5nZXQoJ2ljb24tcm90YXRlJykuY29uc3RhbnRPcigxKSAhPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBidWNrZXQuaWNvbnNOZWVkTGluZWFyID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoT2JqZWN0LmtleXMoc2hhcGVkVGV4dE9yaWVudGF0aW9ucy5ob3Jpem9udGFsKS5sZW5ndGggfHwgc2hhcGVkSWNvbikge1xuICAgICAgICAgICAgYWRkRmVhdHVyZShidWNrZXQsIGZlYXR1cmUsIHNoYXBlZFRleHRPcmllbnRhdGlvbnMsIHNoYXBlZEljb24sIGdseXBoUG9zaXRpb25NYXAsIHNpemVzLCB0ZXh0T2Zmc2V0KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzaG93Q29sbGlzaW9uQm94ZXMpIHtcbiAgICAgICAgYnVja2V0LmdlbmVyYXRlQ29sbGlzaW9uRGVidWdCdWZmZXJzKCk7XG4gICAgfVxufVxuXG4vLyBDaG9vc2UgdGhlIGp1c3RpZmljYXRpb24gdGhhdCBtYXRjaGVzIHRoZSBkaXJlY3Rpb24gb2YgdGhlIFRleHRBbmNob3JcbmV4cG9ydCBmdW5jdGlvbiBnZXRBbmNob3JKdXN0aWZpY2F0aW9uKGFuY2hvcjogVGV4dEFuY2hvcik6IFRleHRKdXN0aWZ5ICB7XG4gICAgc3dpdGNoIChhbmNob3IpIHtcbiAgICBjYXNlICdyaWdodCc6XG4gICAgY2FzZSAndG9wLXJpZ2h0JzpcbiAgICBjYXNlICdib3R0b20tcmlnaHQnOlxuICAgICAgICByZXR1cm4gJ3JpZ2h0JztcbiAgICBjYXNlICdsZWZ0JzpcbiAgICBjYXNlICd0b3AtbGVmdCc6XG4gICAgY2FzZSAnYm90dG9tLWxlZnQnOlxuICAgICAgICByZXR1cm4gJ2xlZnQnO1xuICAgIH1cbiAgICByZXR1cm4gJ2NlbnRlcic7XG59XG5cbi8qKlxuICogR2l2ZW4gYSBmZWF0dXJlIGFuZCBpdHMgc2hhcGVkIHRleHQgYW5kIGljb24gZGF0YSwgYWRkIGEgJ3N5bWJvbFxuICogaW5zdGFuY2UnIGZvciBlYWNoIF9wb3NzaWJsZV8gcGxhY2VtZW50IG9mIHRoZSBzeW1ib2wgZmVhdHVyZS5cbiAqIChBdCByZW5kZXIgdGltZVBsYWNlU3ltYm9scyNwbGFjZSgpIHNlbGVjdHMgd2hpY2ggb2YgdGhlc2UgaW5zdGFuY2VzIHRvXG4gKiBzaG93IG9yIGhpZGUgYmFzZWQgb24gY29sbGlzaW9ucyB3aXRoIHN5bWJvbHMgaW4gb3RoZXIgbGF5ZXJzLilcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGFkZEZlYXR1cmUoYnVja2V0OiBTeW1ib2xCdWNrZXQsXG4gICAgICAgICAgICAgICAgICAgIGZlYXR1cmU6IFN5bWJvbEZlYXR1cmUsXG4gICAgICAgICAgICAgICAgICAgIHNoYXBlZFRleHRPcmllbnRhdGlvbnM6IGFueSxcbiAgICAgICAgICAgICAgICAgICAgc2hhcGVkSWNvbjogUG9zaXRpb25lZEljb24gfCB2b2lkLFxuICAgICAgICAgICAgICAgICAgICBnbHlwaFBvc2l0aW9uTWFwOiB7W3N0cmluZ106IHtbbnVtYmVyXTogR2x5cGhQb3NpdGlvbn19LFxuICAgICAgICAgICAgICAgICAgICBzaXplczogU2l6ZXMsXG4gICAgICAgICAgICAgICAgICAgIHRleHRPZmZzZXQ6IFtudW1iZXIsIG51bWJlcl0pIHtcbiAgICBjb25zdCBsYXlvdXRUZXh0U2l6ZSA9IHNpemVzLmxheW91dFRleHRTaXplLmV2YWx1YXRlKGZlYXR1cmUsIHt9KTtcbiAgICBjb25zdCBsYXlvdXRJY29uU2l6ZSA9IHNpemVzLmxheW91dEljb25TaXplLmV2YWx1YXRlKGZlYXR1cmUsIHt9KTtcblxuICAgIC8vIFRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIGxhYmVscyB0aGF0IGp1bXAgYXJvdW5kIHdoZW4gem9vbWluZyB3ZSBuZWVkXG4gICAgLy8gdG8gdXNlIGEgdGV4dC1zaXplIHZhbHVlIHRoYXQgaXMgdGhlIHNhbWUgZm9yIGFsbCB6b29tIGxldmVscy5cbiAgICAvLyBidWNrZXQgY2FsY3VsYXRlcyB0ZXh0LXNpemUgYXQgYSBoaWdoIHpvb20gbGV2ZWwgc28gdGhhdCBhbGwgdGlsZXMgY2FuXG4gICAgLy8gdXNlIHRoZSBzYW1lIHZhbHVlIHdoZW4gY2FsY3VsYXRpbmcgYW5jaG9yIHBvc2l0aW9ucy5cbiAgICBsZXQgdGV4dE1heFNpemUgPSBzaXplcy50ZXh0TWF4U2l6ZS5ldmFsdWF0ZShmZWF0dXJlLCB7fSk7XG4gICAgaWYgKHRleHRNYXhTaXplID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGV4dE1heFNpemUgPSBsYXlvdXRUZXh0U2l6ZTtcbiAgICB9XG5cbiAgICBjb25zdCBsYXlvdXQgPSBidWNrZXQubGF5ZXJzWzBdLmxheW91dDtcbiAgICBjb25zdCBpY29uT2Zmc2V0ID0gbGF5b3V0LmdldCgnaWNvbi1vZmZzZXQnKS5ldmFsdWF0ZShmZWF0dXJlLCB7fSk7XG4gICAgY29uc3QgZGVmYXVsdEhvcml6b250YWxTaGFwaW5nID0gZ2V0RGVmYXVsdEhvcml6b250YWxTaGFwaW5nKHNoYXBlZFRleHRPcmllbnRhdGlvbnMuaG9yaXpvbnRhbCk7XG4gICAgY29uc3QgZ2x5cGhTaXplID0gMjQsXG4gICAgICAgIGZvbnRTY2FsZSA9IGxheW91dFRleHRTaXplIC8gZ2x5cGhTaXplLFxuICAgICAgICB0ZXh0Qm94U2NhbGUgPSBidWNrZXQudGlsZVBpeGVsUmF0aW8gKiBmb250U2NhbGUsXG4gICAgICAgIHRleHRNYXhCb3hTY2FsZSA9IGJ1Y2tldC50aWxlUGl4ZWxSYXRpbyAqIHRleHRNYXhTaXplIC8gZ2x5cGhTaXplLFxuICAgICAgICBpY29uQm94U2NhbGUgPSBidWNrZXQudGlsZVBpeGVsUmF0aW8gKiBsYXlvdXRJY29uU2l6ZSxcbiAgICAgICAgc3ltYm9sTWluRGlzdGFuY2UgPSBidWNrZXQudGlsZVBpeGVsUmF0aW8gKiBsYXlvdXQuZ2V0KCdzeW1ib2wtc3BhY2luZycpLFxuICAgICAgICB0ZXh0UGFkZGluZyA9IGxheW91dC5nZXQoJ3RleHQtcGFkZGluZycpICogYnVja2V0LnRpbGVQaXhlbFJhdGlvLFxuICAgICAgICBpY29uUGFkZGluZyA9IGxheW91dC5nZXQoJ2ljb24tcGFkZGluZycpICogYnVja2V0LnRpbGVQaXhlbFJhdGlvLFxuICAgICAgICB0ZXh0TWF4QW5nbGUgPSBsYXlvdXQuZ2V0KCd0ZXh0LW1heC1hbmdsZScpIC8gMTgwICogTWF0aC5QSSxcbiAgICAgICAgdGV4dEFsb25nTGluZSA9IGxheW91dC5nZXQoJ3RleHQtcm90YXRpb24tYWxpZ25tZW50JykgPT09ICdtYXAnICYmIGxheW91dC5nZXQoJ3N5bWJvbC1wbGFjZW1lbnQnKSAhPT0gJ3BvaW50JyxcbiAgICAgICAgaWNvbkFsb25nTGluZSA9IGxheW91dC5nZXQoJ2ljb24tcm90YXRpb24tYWxpZ25tZW50JykgPT09ICdtYXAnICYmIGxheW91dC5nZXQoJ3N5bWJvbC1wbGFjZW1lbnQnKSAhPT0gJ3BvaW50JyxcbiAgICAgICAgc3ltYm9sUGxhY2VtZW50ID0gbGF5b3V0LmdldCgnc3ltYm9sLXBsYWNlbWVudCcpLFxuICAgICAgICB0ZXh0UmVwZWF0RGlzdGFuY2UgPSBzeW1ib2xNaW5EaXN0YW5jZSAvIDI7XG5cbiAgICBjb25zdCBhZGRTeW1ib2xBdEFuY2hvciA9IChsaW5lLCBhbmNob3IpID0+IHtcbiAgICAgICAgaWYgKGFuY2hvci54IDwgMCB8fCBhbmNob3IueCA+PSBFWFRFTlQgfHwgYW5jaG9yLnkgPCAwIHx8IGFuY2hvci55ID49IEVYVEVOVCkge1xuICAgICAgICAgICAgLy8gU3ltYm9sIGxheWVycyBhcmUgZHJhd24gYWNyb3NzIHRpbGUgYm91bmRhcmllcywgV2UgZmlsdGVyIG91dCBzeW1ib2xzXG4gICAgICAgICAgICAvLyBvdXRzaWRlIG91ciB0aWxlIGJvdW5kYXJpZXMgKHdoaWNoIG1heSBiZSBpbmNsdWRlZCBpbiB2ZWN0b3IgdGlsZSBidWZmZXJzKVxuICAgICAgICAgICAgLy8gdG8gcHJldmVudCBkb3VibGUtZHJhd2luZyBzeW1ib2xzLlxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgYWRkU3ltYm9sKGJ1Y2tldCwgYW5jaG9yLCBsaW5lLCBzaGFwZWRUZXh0T3JpZW50YXRpb25zLCBzaGFwZWRJY29uLCBidWNrZXQubGF5ZXJzWzBdLFxuICAgICAgICAgICAgYnVja2V0LmNvbGxpc2lvbkJveEFycmF5LCBmZWF0dXJlLmluZGV4LCBmZWF0dXJlLnNvdXJjZUxheWVySW5kZXgsIGJ1Y2tldC5pbmRleCxcbiAgICAgICAgICAgIHRleHRCb3hTY2FsZSwgdGV4dFBhZGRpbmcsIHRleHRBbG9uZ0xpbmUsIHRleHRPZmZzZXQsXG4gICAgICAgICAgICBpY29uQm94U2NhbGUsIGljb25QYWRkaW5nLCBpY29uQWxvbmdMaW5lLCBpY29uT2Zmc2V0LFxuICAgICAgICAgICAgZmVhdHVyZSwgZ2x5cGhQb3NpdGlvbk1hcCwgc2l6ZXMpO1xuICAgIH07XG5cbiAgICBpZiAoc3ltYm9sUGxhY2VtZW50ID09PSAnbGluZScpIHtcbiAgICAgICAgZm9yIChjb25zdCBsaW5lIG9mIGNsaXBMaW5lKGZlYXR1cmUuZ2VvbWV0cnksIDAsIDAsIEVYVEVOVCwgRVhURU5UKSkge1xuICAgICAgICAgICAgY29uc3QgYW5jaG9ycyA9IGdldEFuY2hvcnMoXG4gICAgICAgICAgICAgICAgbGluZSxcbiAgICAgICAgICAgICAgICBzeW1ib2xNaW5EaXN0YW5jZSxcbiAgICAgICAgICAgICAgICB0ZXh0TWF4QW5nbGUsXG4gICAgICAgICAgICAgICAgc2hhcGVkVGV4dE9yaWVudGF0aW9ucy52ZXJ0aWNhbCB8fCBkZWZhdWx0SG9yaXpvbnRhbFNoYXBpbmcsXG4gICAgICAgICAgICAgICAgc2hhcGVkSWNvbixcbiAgICAgICAgICAgICAgICBnbHlwaFNpemUsXG4gICAgICAgICAgICAgICAgdGV4dE1heEJveFNjYWxlLFxuICAgICAgICAgICAgICAgIGJ1Y2tldC5vdmVyc2NhbGluZyxcbiAgICAgICAgICAgICAgICBFWFRFTlRcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGFuY2hvciBvZiBhbmNob3JzKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2hhcGVkVGV4dCA9IGRlZmF1bHRIb3Jpem9udGFsU2hhcGluZztcbiAgICAgICAgICAgICAgICBpZiAoIXNoYXBlZFRleHQgfHwgIWFuY2hvcklzVG9vQ2xvc2UoYnVja2V0LCBzaGFwZWRUZXh0LnRleHQsIHRleHRSZXBlYXREaXN0YW5jZSwgYW5jaG9yKSkge1xuICAgICAgICAgICAgICAgICAgICBhZGRTeW1ib2xBdEFuY2hvcihsaW5lLCBhbmNob3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0gZWxzZSBpZiAoc3ltYm9sUGxhY2VtZW50ID09PSAnbGluZS1jZW50ZXInKSB7XG4gICAgICAgIC8vIE5vIGNsaXBwaW5nLCBtdWx0aXBsZSBsaW5lcyBwZXIgZmVhdHVyZSBhcmUgYWxsb3dlZFxuICAgICAgICAvLyBcImxpbmVzXCIgd2l0aCBvbmx5IG9uZSBwb2ludCBhcmUgaWdub3JlZCBhcyBpbiBjbGlwTGluZXNcbiAgICAgICAgZm9yIChjb25zdCBsaW5lIG9mIGZlYXR1cmUuZ2VvbWV0cnkpIHtcbiAgICAgICAgICAgIGlmIChsaW5lLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhbmNob3IgPSBnZXRDZW50ZXJBbmNob3IoXG4gICAgICAgICAgICAgICAgICAgIGxpbmUsXG4gICAgICAgICAgICAgICAgICAgIHRleHRNYXhBbmdsZSxcbiAgICAgICAgICAgICAgICAgICAgc2hhcGVkVGV4dE9yaWVudGF0aW9ucy52ZXJ0aWNhbCB8fCBkZWZhdWx0SG9yaXpvbnRhbFNoYXBpbmcsXG4gICAgICAgICAgICAgICAgICAgIHNoYXBlZEljb24sXG4gICAgICAgICAgICAgICAgICAgIGdseXBoU2l6ZSxcbiAgICAgICAgICAgICAgICAgICAgdGV4dE1heEJveFNjYWxlKTtcbiAgICAgICAgICAgICAgICBpZiAoYW5jaG9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGFkZFN5bWJvbEF0QW5jaG9yKGxpbmUsIGFuY2hvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSBlbHNlIGlmIChmZWF0dXJlLnR5cGUgPT09ICdQb2x5Z29uJykge1xuICAgICAgICBmb3IgKGNvbnN0IHBvbHlnb24gb2YgY2xhc3NpZnlSaW5ncyhmZWF0dXJlLmdlb21ldHJ5LCAwKSkge1xuICAgICAgICAgICAgLy8gMTYgaGVyZSByZXByZXNlbnRzIDIgcGl4ZWxzXG4gICAgICAgICAgICBjb25zdCBwb2kgPSBmaW5kUG9sZU9mSW5hY2Nlc3NpYmlsaXR5KHBvbHlnb24sIDE2KTtcbiAgICAgICAgICAgIGFkZFN5bWJvbEF0QW5jaG9yKHBvbHlnb25bMF0sIG5ldyBBbmNob3IocG9pLngsIHBvaS55LCAwKSk7XG4gICAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGZlYXR1cmUudHlwZSA9PT0gJ0xpbmVTdHJpbmcnKSB7XG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvbWFwYm94LWdsLWpzL2lzc3Vlcy8zODA4XG4gICAgICAgIGZvciAoY29uc3QgbGluZSBvZiBmZWF0dXJlLmdlb21ldHJ5KSB7XG4gICAgICAgICAgICBhZGRTeW1ib2xBdEFuY2hvcihsaW5lLCBuZXcgQW5jaG9yKGxpbmVbMF0ueCwgbGluZVswXS55LCAwKSk7XG4gICAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGZlYXR1cmUudHlwZSA9PT0gJ1BvaW50Jykge1xuICAgICAgICBmb3IgKGNvbnN0IHBvaW50cyBvZiBmZWF0dXJlLmdlb21ldHJ5KSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHBvaW50IG9mIHBvaW50cykge1xuICAgICAgICAgICAgICAgIGFkZFN5bWJvbEF0QW5jaG9yKFtwb2ludF0sIG5ldyBBbmNob3IocG9pbnQueCwgcG9pbnQueSwgMCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG5jb25zdCBNQVhfUEFDS0VEX1NJWkUgPSA2NTUzNTtcblxuZnVuY3Rpb24gYWRkVGV4dFZlcnRpY2VzKGJ1Y2tldDogU3ltYm9sQnVja2V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgIGFuY2hvcjogUG9pbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgc2hhcGVkVGV4dDogU2hhcGluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICBsYXllcjogU3ltYm9sU3R5bGVMYXllcixcbiAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0QWxvbmdMaW5lOiBib29sZWFuLFxuICAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmU6IFN5bWJvbEZlYXR1cmUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgdGV4dE9mZnNldDogW251bWJlciwgbnVtYmVyXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lQXJyYXk6IHtsaW5lU3RhcnRJbmRleDogbnVtYmVyLCBsaW5lTGVuZ3RoOiBudW1iZXJ9LFxuICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRpbmdNb2RlOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2VtZW50VHlwZXM6IEFycmF5PCd2ZXJ0aWNhbCcgfCAnY2VudGVyJyB8ICdsZWZ0JyB8ICdyaWdodCc+LFxuICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlZFRleHRTeW1ib2xJbmRpY2VzOiB7W3N0cmluZ106IG51bWJlcn0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhQb3NpdGlvbk1hcDoge1tzdHJpbmddOiB7W251bWJlcl06IEdseXBoUG9zaXRpb259fSxcbiAgICAgICAgICAgICAgICAgICAgICAgICBzaXplczogU2l6ZXMpIHtcbiAgICBjb25zdCBnbHlwaFF1YWRzID0gZ2V0R2x5cGhRdWFkcyhhbmNob3IsIHNoYXBlZFRleHQsIHRleHRPZmZzZXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXIsIHRleHRBbG9uZ0xpbmUsIGZlYXR1cmUsIGdseXBoUG9zaXRpb25NYXApO1xuXG4gICAgY29uc3Qgc2l6ZURhdGEgPSBidWNrZXQudGV4dFNpemVEYXRhO1xuICAgIGxldCB0ZXh0U2l6ZURhdGEgPSBudWxsO1xuXG4gICAgaWYgKHNpemVEYXRhLmZ1bmN0aW9uVHlwZSA9PT0gJ3NvdXJjZScpIHtcbiAgICAgICAgdGV4dFNpemVEYXRhID0gW1xuICAgICAgICAgICAgU0laRV9QQUNLX0ZBQ1RPUiAqIGxheWVyLmxheW91dC5nZXQoJ3RleHQtc2l6ZScpLmV2YWx1YXRlKGZlYXR1cmUsIHt9KVxuICAgICAgICBdO1xuICAgICAgICBpZiAodGV4dFNpemVEYXRhWzBdID4gTUFYX1BBQ0tFRF9TSVpFKSB7XG4gICAgICAgICAgICB3YXJuT25jZShgJHtidWNrZXQubGF5ZXJJZHNbMF19OiBWYWx1ZSBmb3IgXCJ0ZXh0LXNpemVcIiBpcyA+PSAyNTYuIFJlZHVjZSB5b3VyIFwidGV4dC1zaXplXCIuYCk7XG4gICAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHNpemVEYXRhLmZ1bmN0aW9uVHlwZSA9PT0gJ2NvbXBvc2l0ZScpIHtcbiAgICAgICAgdGV4dFNpemVEYXRhID0gW1xuICAgICAgICAgICAgU0laRV9QQUNLX0ZBQ1RPUiAqIHNpemVzLmNvbXBvc2l0ZVRleHRTaXplc1swXS5ldmFsdWF0ZShmZWF0dXJlLCB7fSksXG4gICAgICAgICAgICBTSVpFX1BBQ0tfRkFDVE9SICogc2l6ZXMuY29tcG9zaXRlVGV4dFNpemVzWzFdLmV2YWx1YXRlKGZlYXR1cmUsIHt9KVxuICAgICAgICBdO1xuICAgICAgICBpZiAodGV4dFNpemVEYXRhWzBdID4gTUFYX1BBQ0tFRF9TSVpFIHx8IHRleHRTaXplRGF0YVsxXSA+IE1BWF9QQUNLRURfU0laRSkge1xuICAgICAgICAgICAgd2Fybk9uY2UoYCR7YnVja2V0LmxheWVySWRzWzBdfTogVmFsdWUgZm9yIFwidGV4dC1zaXplXCIgaXMgPj0gMjU2LiBSZWR1Y2UgeW91ciBcInRleHQtc2l6ZVwiLmApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYnVja2V0LmFkZFN5bWJvbHMoXG4gICAgICAgIGJ1Y2tldC50ZXh0LFxuICAgICAgICBnbHlwaFF1YWRzLFxuICAgICAgICB0ZXh0U2l6ZURhdGEsXG4gICAgICAgIHRleHRPZmZzZXQsXG4gICAgICAgIHRleHRBbG9uZ0xpbmUsXG4gICAgICAgIGZlYXR1cmUsXG4gICAgICAgIHdyaXRpbmdNb2RlLFxuICAgICAgICBhbmNob3IsXG4gICAgICAgIGxpbmVBcnJheS5saW5lU3RhcnRJbmRleCxcbiAgICAgICAgbGluZUFycmF5LmxpbmVMZW5ndGgpO1xuXG4gICAgLy8gVGhlIHBsYWNlZFN5bWJvbEFycmF5IGlzIHVzZWQgYXQgcmVuZGVyIHRpbWUgaW4gZHJhd1RpbGVTeW1ib2xzXG4gICAgLy8gVGhlc2UgaW5kaWNlcyBhbGxvdyBhY2Nlc3MgdG8gdGhlIGFycmF5IGF0IGNvbGxpc2lvbiBkZXRlY3Rpb24gdGltZVxuICAgIGZvciAoY29uc3QgcGxhY2VtZW50VHlwZSBvZiBwbGFjZW1lbnRUeXBlcykge1xuICAgICAgICBwbGFjZWRUZXh0U3ltYm9sSW5kaWNlc1twbGFjZW1lbnRUeXBlXSA9IGJ1Y2tldC50ZXh0LnBsYWNlZFN5bWJvbEFycmF5Lmxlbmd0aCAtIDE7XG4gICAgfVxuXG4gICAgcmV0dXJuIGdseXBoUXVhZHMubGVuZ3RoICogNDtcbn1cblxuZnVuY3Rpb24gZ2V0RGVmYXVsdEhvcml6b250YWxTaGFwaW5nKGhvcml6b250YWxTaGFwaW5nOiB7W1RleHRKdXN0aWZ5XTogU2hhcGluZ30pOiBTaGFwaW5nIHwgbnVsbCB7XG4gICAgLy8gV2UgZG9uJ3QgY2FyZSB3aGljaCBzaGFwaW5nIHdlIGdldCBiZWNhdXNlIHRoaXMgaXMgdXNlZCBmb3IgY29sbGlzaW9uIHB1cnBvc2VzXG4gICAgLy8gYW5kIGFsbCB0aGUganVzdGlmaWNhdGlvbnMgaGF2ZSB0aGUgc2FtZSBjb2xsaXNpb24gYm94XG4gICAgZm9yIChjb25zdCBqdXN0aWZpY2F0aW9uOiBhbnkgaW4gaG9yaXpvbnRhbFNoYXBpbmcpIHtcbiAgICAgICAgcmV0dXJuIGhvcml6b250YWxTaGFwaW5nW2p1c3RpZmljYXRpb25dO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cblxuXG4vKipcbiAqIEFkZCBhIHNpbmdsZSBsYWJlbCAmIGljb24gcGxhY2VtZW50LlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGFkZFN5bWJvbChidWNrZXQ6IFN5bWJvbEJ1Y2tldCxcbiAgICAgICAgICAgICAgICAgICBhbmNob3I6IEFuY2hvcixcbiAgICAgICAgICAgICAgICAgICBsaW5lOiBBcnJheTxQb2ludD4sXG4gICAgICAgICAgICAgICAgICAgc2hhcGVkVGV4dE9yaWVudGF0aW9uczogYW55LFxuICAgICAgICAgICAgICAgICAgIHNoYXBlZEljb246IFBvc2l0aW9uZWRJY29uIHwgdm9pZCxcbiAgICAgICAgICAgICAgICAgICBsYXllcjogU3ltYm9sU3R5bGVMYXllcixcbiAgICAgICAgICAgICAgICAgICBjb2xsaXNpb25Cb3hBcnJheTogQ29sbGlzaW9uQm94QXJyYXksXG4gICAgICAgICAgICAgICAgICAgZmVhdHVyZUluZGV4OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgc291cmNlTGF5ZXJJbmRleDogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgIGJ1Y2tldEluZGV4OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgdGV4dEJveFNjYWxlOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgdGV4dFBhZGRpbmc6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICB0ZXh0QWxvbmdMaW5lOiBib29sZWFuLFxuICAgICAgICAgICAgICAgICAgIHRleHRPZmZzZXQ6IFtudW1iZXIsIG51bWJlcl0sXG4gICAgICAgICAgICAgICAgICAgaWNvbkJveFNjYWxlOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgaWNvblBhZGRpbmc6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICBpY29uQWxvbmdMaW5lOiBib29sZWFuLFxuICAgICAgICAgICAgICAgICAgIGljb25PZmZzZXQ6IFtudW1iZXIsIG51bWJlcl0sXG4gICAgICAgICAgICAgICAgICAgZmVhdHVyZTogU3ltYm9sRmVhdHVyZSxcbiAgICAgICAgICAgICAgICAgICBnbHlwaFBvc2l0aW9uTWFwOiB7W3N0cmluZ106IHtbbnVtYmVyXTogR2x5cGhQb3NpdGlvbn19LFxuICAgICAgICAgICAgICAgICAgIHNpemVzOiBTaXplcykge1xuICAgIGNvbnN0IGxpbmVBcnJheSA9IGJ1Y2tldC5hZGRUb0xpbmVWZXJ0ZXhBcnJheShhbmNob3IsIGxpbmUpO1xuXG4gICAgbGV0IHRleHRDb2xsaXNpb25GZWF0dXJlLCBpY29uQ29sbGlzaW9uRmVhdHVyZTtcblxuICAgIGxldCBudW1JY29uVmVydGljZXMgPSAwO1xuICAgIGxldCBudW1Ib3Jpem9udGFsR2x5cGhWZXJ0aWNlcyA9IDA7XG4gICAgbGV0IG51bVZlcnRpY2FsR2x5cGhWZXJ0aWNlcyA9IDA7XG4gICAgY29uc3QgcGxhY2VkVGV4dFN5bWJvbEluZGljZXMgPSB7fTtcbiAgICBsZXQga2V5ID0gbXVybXVyMygnJyk7XG4gICAgY29uc3QgcmFkaWFsVGV4dE9mZnNldCA9IChsYXllci5sYXlvdXQuZ2V0KCd0ZXh0LXJhZGlhbC1vZmZzZXQnKS5ldmFsdWF0ZShmZWF0dXJlLCB7fSkgfHwgMCkgKiBPTkVfRU07XG5cbiAgICBmb3IgKGNvbnN0IGp1c3RpZmljYXRpb246IGFueSBpbiBzaGFwZWRUZXh0T3JpZW50YXRpb25zLmhvcml6b250YWwpIHtcbiAgICAgICAgY29uc3Qgc2hhcGluZyA9IHNoYXBlZFRleHRPcmllbnRhdGlvbnMuaG9yaXpvbnRhbFtqdXN0aWZpY2F0aW9uXTtcblxuICAgICAgICBpZiAoIXRleHRDb2xsaXNpb25GZWF0dXJlKSB7XG4gICAgICAgICAgICBrZXkgPSBtdXJtdXIzKHNoYXBpbmcudGV4dCk7XG4gICAgICAgICAgICBjb25zdCB0ZXh0Um90YXRlID0gbGF5ZXIubGF5b3V0LmdldCgndGV4dC1yb3RhdGUnKS5ldmFsdWF0ZShmZWF0dXJlLCB7fSk7XG4gICAgICAgICAgICAvLyBBcyBhIGNvbGxpc2lvbiBhcHByb3hpbWF0aW9uLCB3ZSBjYW4gdXNlIGVpdGhlciB0aGUgdmVydGljYWwgb3IgYW55IG9mIHRoZSBob3Jpem9udGFsIHZlcnNpb25zIG9mIHRoZSBmZWF0dXJlXG4gICAgICAgICAgICAvLyBXZSdyZSBjb3VudGluZyBvbiBhbGwgdmVyc2lvbnMgaGF2aW5nIHNpbWlsYXIgZGltZW5zaW9uc1xuICAgICAgICAgICAgdGV4dENvbGxpc2lvbkZlYXR1cmUgPSBuZXcgQ29sbGlzaW9uRmVhdHVyZShjb2xsaXNpb25Cb3hBcnJheSwgbGluZSwgYW5jaG9yLCBmZWF0dXJlSW5kZXgsIHNvdXJjZUxheWVySW5kZXgsIGJ1Y2tldEluZGV4LCBzaGFwaW5nLCB0ZXh0Qm94U2NhbGUsIHRleHRQYWRkaW5nLCB0ZXh0QWxvbmdMaW5lLCBidWNrZXQub3ZlcnNjYWxpbmcsIHRleHRSb3RhdGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2luZ2xlTGluZSA9IHNoYXBpbmcubGluZUNvdW50ID09PSAxO1xuICAgICAgICBudW1Ib3Jpem9udGFsR2x5cGhWZXJ0aWNlcyArPSBhZGRUZXh0VmVydGljZXMoXG4gICAgICAgICAgICBidWNrZXQsIGFuY2hvciwgc2hhcGluZywgbGF5ZXIsIHRleHRBbG9uZ0xpbmUsIGZlYXR1cmUsIHRleHRPZmZzZXQsIGxpbmVBcnJheSxcbiAgICAgICAgICAgIHNoYXBlZFRleHRPcmllbnRhdGlvbnMudmVydGljYWwgPyBXcml0aW5nTW9kZS5ob3Jpem9udGFsIDogV3JpdGluZ01vZGUuaG9yaXpvbnRhbE9ubHksXG4gICAgICAgICAgICBzaW5nbGVMaW5lID8gKE9iamVjdC5rZXlzKHNoYXBlZFRleHRPcmllbnRhdGlvbnMuaG9yaXpvbnRhbCk6IGFueSkgOiBbanVzdGlmaWNhdGlvbl0sXG4gICAgICAgICAgICBwbGFjZWRUZXh0U3ltYm9sSW5kaWNlcywgZ2x5cGhQb3NpdGlvbk1hcCwgc2l6ZXMpO1xuXG4gICAgICAgIGlmIChzaW5nbGVMaW5lKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzaGFwZWRUZXh0T3JpZW50YXRpb25zLnZlcnRpY2FsKSB7XG4gICAgICAgIG51bVZlcnRpY2FsR2x5cGhWZXJ0aWNlcyArPSBhZGRUZXh0VmVydGljZXMoXG4gICAgICAgICAgICBidWNrZXQsIGFuY2hvciwgc2hhcGVkVGV4dE9yaWVudGF0aW9ucy52ZXJ0aWNhbCwgbGF5ZXIsIHRleHRBbG9uZ0xpbmUsIGZlYXR1cmUsXG4gICAgICAgICAgICB0ZXh0T2Zmc2V0LCBsaW5lQXJyYXksIFdyaXRpbmdNb2RlLnZlcnRpY2FsLCBbJ3ZlcnRpY2FsJ10sIHBsYWNlZFRleHRTeW1ib2xJbmRpY2VzLCBnbHlwaFBvc2l0aW9uTWFwLCBzaXplcyk7XG4gICAgfVxuXG4gICAgY29uc3QgdGV4dEJveFN0YXJ0SW5kZXggPSB0ZXh0Q29sbGlzaW9uRmVhdHVyZSA/IHRleHRDb2xsaXNpb25GZWF0dXJlLmJveFN0YXJ0SW5kZXggOiBidWNrZXQuY29sbGlzaW9uQm94QXJyYXkubGVuZ3RoO1xuICAgIGNvbnN0IHRleHRCb3hFbmRJbmRleCA9IHRleHRDb2xsaXNpb25GZWF0dXJlID8gdGV4dENvbGxpc2lvbkZlYXR1cmUuYm94RW5kSW5kZXggOiBidWNrZXQuY29sbGlzaW9uQm94QXJyYXkubGVuZ3RoO1xuXG4gICAgaWYgKHNoYXBlZEljb24pIHtcbiAgICAgICAgY29uc3QgaWNvblF1YWRzID0gZ2V0SWNvblF1YWRzKGFuY2hvciwgc2hhcGVkSWNvbiwgbGF5ZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbkFsb25nTGluZSwgZ2V0RGVmYXVsdEhvcml6b250YWxTaGFwaW5nKHNoYXBlZFRleHRPcmllbnRhdGlvbnMuaG9yaXpvbnRhbCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZSk7XG4gICAgICAgIGNvbnN0IGljb25Sb3RhdGUgPSBsYXllci5sYXlvdXQuZ2V0KCdpY29uLXJvdGF0ZScpLmV2YWx1YXRlKGZlYXR1cmUsIHt9KTtcbiAgICAgICAgaWNvbkNvbGxpc2lvbkZlYXR1cmUgPSBuZXcgQ29sbGlzaW9uRmVhdHVyZShjb2xsaXNpb25Cb3hBcnJheSwgbGluZSwgYW5jaG9yLCBmZWF0dXJlSW5kZXgsIHNvdXJjZUxheWVySW5kZXgsIGJ1Y2tldEluZGV4LCBzaGFwZWRJY29uLCBpY29uQm94U2NhbGUsIGljb25QYWRkaW5nLCAvKmFsaWduIGJveGVzIHRvIGxpbmUqL2ZhbHNlLCBidWNrZXQub3ZlcnNjYWxpbmcsIGljb25Sb3RhdGUpO1xuXG4gICAgICAgIG51bUljb25WZXJ0aWNlcyA9IGljb25RdWFkcy5sZW5ndGggKiA0O1xuXG4gICAgICAgIGNvbnN0IHNpemVEYXRhID0gYnVja2V0Lmljb25TaXplRGF0YTtcbiAgICAgICAgbGV0IGljb25TaXplRGF0YSA9IG51bGw7XG5cbiAgICAgICAgaWYgKHNpemVEYXRhLmZ1bmN0aW9uVHlwZSA9PT0gJ3NvdXJjZScpIHtcbiAgICAgICAgICAgIGljb25TaXplRGF0YSA9IFtcbiAgICAgICAgICAgICAgICBTSVpFX1BBQ0tfRkFDVE9SICogbGF5ZXIubGF5b3V0LmdldCgnaWNvbi1zaXplJykuZXZhbHVhdGUoZmVhdHVyZSwge30pXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgaWYgKGljb25TaXplRGF0YVswXSA+IE1BWF9QQUNLRURfU0laRSkge1xuICAgICAgICAgICAgICAgIHdhcm5PbmNlKGAke2J1Y2tldC5sYXllcklkc1swXX06IFZhbHVlIGZvciBcImljb24tc2l6ZVwiIGlzID49IDI1Ni4gUmVkdWNlIHlvdXIgXCJpY29uLXNpemVcIi5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChzaXplRGF0YS5mdW5jdGlvblR5cGUgPT09ICdjb21wb3NpdGUnKSB7XG4gICAgICAgICAgICBpY29uU2l6ZURhdGEgPSBbXG4gICAgICAgICAgICAgICAgU0laRV9QQUNLX0ZBQ1RPUiAqIHNpemVzLmNvbXBvc2l0ZUljb25TaXplc1swXS5ldmFsdWF0ZShmZWF0dXJlLCB7fSksXG4gICAgICAgICAgICAgICAgU0laRV9QQUNLX0ZBQ1RPUiAqIHNpemVzLmNvbXBvc2l0ZUljb25TaXplc1sxXS5ldmFsdWF0ZShmZWF0dXJlLCB7fSlcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBpZiAoaWNvblNpemVEYXRhWzBdID4gTUFYX1BBQ0tFRF9TSVpFIHx8IGljb25TaXplRGF0YVsxXSA+IE1BWF9QQUNLRURfU0laRSkge1xuICAgICAgICAgICAgICAgIHdhcm5PbmNlKGAke2J1Y2tldC5sYXllcklkc1swXX06IFZhbHVlIGZvciBcImljb24tc2l6ZVwiIGlzID49IDI1Ni4gUmVkdWNlIHlvdXIgXCJpY29uLXNpemVcIi5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGJ1Y2tldC5hZGRTeW1ib2xzKFxuICAgICAgICAgICAgYnVja2V0Lmljb24sXG4gICAgICAgICAgICBpY29uUXVhZHMsXG4gICAgICAgICAgICBpY29uU2l6ZURhdGEsXG4gICAgICAgICAgICBpY29uT2Zmc2V0LFxuICAgICAgICAgICAgaWNvbkFsb25nTGluZSxcbiAgICAgICAgICAgIGZlYXR1cmUsXG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgIGFuY2hvcixcbiAgICAgICAgICAgIGxpbmVBcnJheS5saW5lU3RhcnRJbmRleCxcbiAgICAgICAgICAgIGxpbmVBcnJheS5saW5lTGVuZ3RoKTtcbiAgICB9XG5cbiAgICBjb25zdCBpY29uQm94U3RhcnRJbmRleCA9IGljb25Db2xsaXNpb25GZWF0dXJlID8gaWNvbkNvbGxpc2lvbkZlYXR1cmUuYm94U3RhcnRJbmRleCA6IGJ1Y2tldC5jb2xsaXNpb25Cb3hBcnJheS5sZW5ndGg7XG4gICAgY29uc3QgaWNvbkJveEVuZEluZGV4ID0gaWNvbkNvbGxpc2lvbkZlYXR1cmUgPyBpY29uQ29sbGlzaW9uRmVhdHVyZS5ib3hFbmRJbmRleCA6IGJ1Y2tldC5jb2xsaXNpb25Cb3hBcnJheS5sZW5ndGg7XG5cbiAgICBpZiAoYnVja2V0LmdseXBoT2Zmc2V0QXJyYXkubGVuZ3RoID49IFN5bWJvbEJ1Y2tldC5NQVhfR0xZUEhTKSB3YXJuT25jZShcbiAgICAgICAgXCJUb28gbWFueSBnbHlwaHMgYmVpbmcgcmVuZGVyZWQgaW4gYSB0aWxlLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL21hcGJveC9tYXBib3gtZ2wtanMvaXNzdWVzLzI5MDdcIlxuICAgICk7XG5cbiAgICBidWNrZXQuc3ltYm9sSW5zdGFuY2VzLmVtcGxhY2VCYWNrKFxuICAgICAgICBhbmNob3IueCxcbiAgICAgICAgYW5jaG9yLnksXG4gICAgICAgIHBsYWNlZFRleHRTeW1ib2xJbmRpY2VzLnJpZ2h0ID49IDAgPyBwbGFjZWRUZXh0U3ltYm9sSW5kaWNlcy5yaWdodCA6IC0xLFxuICAgICAgICBwbGFjZWRUZXh0U3ltYm9sSW5kaWNlcy5jZW50ZXIgPj0gMCA/IHBsYWNlZFRleHRTeW1ib2xJbmRpY2VzLmNlbnRlciA6IC0xLFxuICAgICAgICBwbGFjZWRUZXh0U3ltYm9sSW5kaWNlcy5sZWZ0ID49IDAgPyBwbGFjZWRUZXh0U3ltYm9sSW5kaWNlcy5sZWZ0IDogLTEsXG4gICAgICAgIHBsYWNlZFRleHRTeW1ib2xJbmRpY2VzLnZlcnRpY2FsIHx8IC0xLFxuICAgICAgICBrZXksXG4gICAgICAgIHRleHRCb3hTdGFydEluZGV4LFxuICAgICAgICB0ZXh0Qm94RW5kSW5kZXgsXG4gICAgICAgIGljb25Cb3hTdGFydEluZGV4LFxuICAgICAgICBpY29uQm94RW5kSW5kZXgsXG4gICAgICAgIGZlYXR1cmVJbmRleCxcbiAgICAgICAgbnVtSG9yaXpvbnRhbEdseXBoVmVydGljZXMsXG4gICAgICAgIG51bVZlcnRpY2FsR2x5cGhWZXJ0aWNlcyxcbiAgICAgICAgbnVtSWNvblZlcnRpY2VzLFxuICAgICAgICAwLFxuICAgICAgICB0ZXh0Qm94U2NhbGUsXG4gICAgICAgIHJhZGlhbFRleHRPZmZzZXQpO1xufVxuXG5mdW5jdGlvbiBhbmNob3JJc1Rvb0Nsb3NlKGJ1Y2tldDogYW55LCB0ZXh0OiBzdHJpbmcsIHJlcGVhdERpc3RhbmNlOiBudW1iZXIsIGFuY2hvcjogUG9pbnQpIHtcbiAgICBjb25zdCBjb21wYXJlVGV4dCA9IGJ1Y2tldC5jb21wYXJlVGV4dDtcbiAgICBpZiAoISh0ZXh0IGluIGNvbXBhcmVUZXh0KSkge1xuICAgICAgICBjb21wYXJlVGV4dFt0ZXh0XSA9IFtdO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IG90aGVyQW5jaG9ycyA9IGNvbXBhcmVUZXh0W3RleHRdO1xuICAgICAgICBmb3IgKGxldCBrID0gb3RoZXJBbmNob3JzLmxlbmd0aCAtIDE7IGsgPj0gMDsgay0tKSB7XG4gICAgICAgICAgICBpZiAoYW5jaG9yLmRpc3Qob3RoZXJBbmNob3JzW2tdKSA8IHJlcGVhdERpc3RhbmNlKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgaXQncyB3aXRoaW4gcmVwZWF0RGlzdGFuY2Ugb2Ygb25lIGFuY2hvciwgc3RvcCBsb29raW5nXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gSWYgYW5jaG9yIGlzIG5vdCB3aXRoaW4gcmVwZWF0RGlzdGFuY2Ugb2YgYW55IG90aGVyIGFuY2hvciwgYWRkIHRvIGFycmF5XG4gICAgY29tcGFyZVRleHRbdGV4dF0ucHVzaChhbmNob3IpO1xuICAgIHJldHVybiBmYWxzZTtcbn1cbiIsIlxuaW1wb3J0IHJlZlByb3BlcnRpZXMgZnJvbSAnLi91dGlsL3JlZl9wcm9wZXJ0aWVzJztcblxuZnVuY3Rpb24gc3RyaW5naWZ5KG9iaikge1xuICAgIGNvbnN0IHR5cGUgPSB0eXBlb2Ygb2JqO1xuICAgIGlmICh0eXBlID09PSAnbnVtYmVyJyB8fCB0eXBlID09PSAnYm9vbGVhbicgfHwgdHlwZSA9PT0gJ3N0cmluZycgfHwgb2JqID09PSB1bmRlZmluZWQgfHwgb2JqID09PSBudWxsKVxuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkob2JqKTtcblxuICAgIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICAgICAgbGV0IHN0ciA9ICdbJztcbiAgICAgICAgZm9yIChjb25zdCB2YWwgb2Ygb2JqKSB7XG4gICAgICAgICAgICBzdHIgKz0gYCR7c3RyaW5naWZ5KHZhbCl9LGA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGAke3N0cn1dYDtcbiAgICB9XG5cbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMob2JqKS5zb3J0KCk7XG5cbiAgICBsZXQgc3RyID0gJ3snO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBzdHIgKz0gYCR7SlNPTi5zdHJpbmdpZnkoa2V5c1tpXSl9OiR7c3RyaW5naWZ5KG9ialtrZXlzW2ldXSl9LGA7XG4gICAgfVxuICAgIHJldHVybiBgJHtzdHJ9fWA7XG59XG5cbmZ1bmN0aW9uIGdldEtleShsYXllcikge1xuICAgIGxldCBrZXkgPSAnJztcbiAgICBmb3IgKGNvbnN0IGsgb2YgcmVmUHJvcGVydGllcykge1xuICAgICAgICBrZXkgKz0gYC8ke3N0cmluZ2lmeShsYXllcltrXSl9YDtcbiAgICB9XG4gICAgcmV0dXJuIGtleTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZ3JvdXBCeUxheW91dDtcblxuLyoqXG4gKiBHaXZlbiBhbiBhcnJheSBvZiBsYXllcnMsIHJldHVybiBhbiBhcnJheSBvZiBhcnJheXMgb2YgbGF5ZXJzIHdoZXJlIGFsbFxuICogbGF5ZXJzIGluIGVhY2ggZ3JvdXAgaGF2ZSBpZGVudGljYWwgbGF5b3V0LWFmZmVjdGluZyBwcm9wZXJ0aWVzLiBUaGVzZVxuICogYXJlIHRoZSBwcm9wZXJ0aWVzIHRoYXQgd2VyZSBmb3JtZXJseSB1c2VkIGJ5IGV4cGxpY2l0IGByZWZgIG1lY2hhbmlzbVxuICogZm9yIGxheWVyczogJ3R5cGUnLCAnc291cmNlJywgJ3NvdXJjZS1sYXllcicsICdtaW56b29tJywgJ21heHpvb20nLFxuICogJ2ZpbHRlcicsIGFuZCAnbGF5b3V0Jy5cbiAqXG4gKiBUaGUgaW5wdXQgaXMgbm90IG1vZGlmaWVkLiBUaGUgb3V0cHV0IGxheWVycyBhcmUgcmVmZXJlbmNlcyB0byB0aGVcbiAqIGlucHV0IGxheWVycy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheTxMYXllcj59IGxheWVyc1xuICogQHJldHVybnMge0FycmF5PEFycmF5PExheWVyPj59XG4gKi9cbmZ1bmN0aW9uIGdyb3VwQnlMYXlvdXQobGF5ZXJzKSB7XG4gICAgY29uc3QgZ3JvdXBzID0ge307XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxheWVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBrID0gZ2V0S2V5KGxheWVyc1tpXSk7XG4gICAgICAgIGxldCBncm91cCA9IGdyb3Vwc1trXTtcbiAgICAgICAgaWYgKCFncm91cCkge1xuICAgICAgICAgICAgZ3JvdXAgPSBncm91cHNba10gPSBbXTtcbiAgICAgICAgfVxuICAgICAgICBncm91cC5wdXNoKGxheWVyc1tpXSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gW107XG5cbiAgICBmb3IgKGNvbnN0IGsgaW4gZ3JvdXBzKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKGdyb3Vwc1trXSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCBTdHlsZUxheWVyIGZyb20gJy4vc3R5bGVfbGF5ZXInO1xuaW1wb3J0IGNyZWF0ZVN0eWxlTGF5ZXIgZnJvbSAnLi9jcmVhdGVfc3R5bGVfbGF5ZXInO1xuXG5pbXBvcnQgeyB2YWx1ZXMgfSBmcm9tICcuLi91dGlsL3V0aWwnO1xuaW1wb3J0IGZlYXR1cmVGaWx0ZXIgZnJvbSAnLi4vc3R5bGUtc3BlYy9mZWF0dXJlX2ZpbHRlcic7XG5pbXBvcnQgZ3JvdXBCeUxheW91dCBmcm9tICcuLi9zdHlsZS1zcGVjL2dyb3VwX2J5X2xheW91dCc7XG5cbmltcG9ydCB0eXBlIHtUeXBlZFN0eWxlTGF5ZXJ9IGZyb20gJy4vc3R5bGVfbGF5ZXIvdHlwZWRfc3R5bGVfbGF5ZXInO1xuaW1wb3J0IHR5cGUge0xheWVyU3BlY2lmaWNhdGlvbn0gZnJvbSAnLi4vc3R5bGUtc3BlYy90eXBlcyc7XG5cbmV4cG9ydCB0eXBlIExheWVyQ29uZmlncyA9IHsgW3N0cmluZ106IExheWVyU3BlY2lmaWNhdGlvbiB9O1xuZXhwb3J0IHR5cGUgRmFtaWx5PExheWVyOiBUeXBlZFN0eWxlTGF5ZXI+ID0gQXJyYXk8TGF5ZXI+O1xuXG5jbGFzcyBTdHlsZUxheWVySW5kZXgge1xuICAgIGZhbWlsaWVzQnlTb3VyY2U6IHsgW3NvdXJjZTogc3RyaW5nXTogeyBbc291cmNlTGF5ZXI6IHN0cmluZ106IEFycmF5PEZhbWlseTwqPj4gfSB9O1xuXG4gICAgX2xheWVyQ29uZmlnczogTGF5ZXJDb25maWdzO1xuICAgIF9sYXllcnM6IHsgW3N0cmluZ106IFN0eWxlTGF5ZXIgfTtcblxuICAgIGNvbnN0cnVjdG9yKGxheWVyQ29uZmlnczogP0FycmF5PExheWVyU3BlY2lmaWNhdGlvbj4pIHtcbiAgICAgICAgaWYgKGxheWVyQ29uZmlncykge1xuICAgICAgICAgICAgdGhpcy5yZXBsYWNlKGxheWVyQ29uZmlncyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXBsYWNlKGxheWVyQ29uZmlnczogQXJyYXk8TGF5ZXJTcGVjaWZpY2F0aW9uPikge1xuICAgICAgICB0aGlzLl9sYXllckNvbmZpZ3MgPSB7fTtcbiAgICAgICAgdGhpcy5fbGF5ZXJzID0ge307XG4gICAgICAgIHRoaXMudXBkYXRlKGxheWVyQ29uZmlncywgW10pO1xuICAgIH1cblxuICAgIHVwZGF0ZShsYXllckNvbmZpZ3M6IEFycmF5PExheWVyU3BlY2lmaWNhdGlvbj4sIHJlbW92ZWRJZHM6IEFycmF5PHN0cmluZz4pIHtcbiAgICAgICAgZm9yIChjb25zdCBsYXllckNvbmZpZyBvZiBsYXllckNvbmZpZ3MpIHtcbiAgICAgICAgICAgIHRoaXMuX2xheWVyQ29uZmlnc1tsYXllckNvbmZpZy5pZF0gPSBsYXllckNvbmZpZztcblxuICAgICAgICAgICAgY29uc3QgbGF5ZXIgPSB0aGlzLl9sYXllcnNbbGF5ZXJDb25maWcuaWRdID0gY3JlYXRlU3R5bGVMYXllcihsYXllckNvbmZpZyk7XG4gICAgICAgICAgICBsYXllci5fZmVhdHVyZUZpbHRlciA9IGZlYXR1cmVGaWx0ZXIobGF5ZXIuZmlsdGVyKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IGlkIG9mIHJlbW92ZWRJZHMpIHtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9sYXllckNvbmZpZ3NbaWRdO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuX2xheWVyc1tpZF07XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZhbWlsaWVzQnlTb3VyY2UgPSB7fTtcblxuICAgICAgICBjb25zdCBncm91cHMgPSBncm91cEJ5TGF5b3V0KHZhbHVlcyh0aGlzLl9sYXllckNvbmZpZ3MpKTtcblxuICAgICAgICBmb3IgKGNvbnN0IGxheWVyQ29uZmlncyBvZiBncm91cHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGxheWVycyA9IGxheWVyQ29uZmlncy5tYXAoKGxheWVyQ29uZmlnKSA9PiB0aGlzLl9sYXllcnNbbGF5ZXJDb25maWcuaWRdKTtcblxuICAgICAgICAgICAgY29uc3QgbGF5ZXIgPSBsYXllcnNbMF07XG4gICAgICAgICAgICBpZiAobGF5ZXIudmlzaWJpbGl0eSA9PT0gJ25vbmUnKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZUlkID0gbGF5ZXIuc291cmNlIHx8ICcnO1xuICAgICAgICAgICAgbGV0IHNvdXJjZUdyb3VwID0gdGhpcy5mYW1pbGllc0J5U291cmNlW3NvdXJjZUlkXTtcbiAgICAgICAgICAgIGlmICghc291cmNlR3JvdXApIHtcbiAgICAgICAgICAgICAgICBzb3VyY2VHcm91cCA9IHRoaXMuZmFtaWxpZXNCeVNvdXJjZVtzb3VyY2VJZF0gPSB7fTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3Qgc291cmNlTGF5ZXJJZCA9IGxheWVyLnNvdXJjZUxheWVyIHx8ICdfZ2VvanNvblRpbGVMYXllcic7XG4gICAgICAgICAgICBsZXQgc291cmNlTGF5ZXJGYW1pbGllcyA9IHNvdXJjZUdyb3VwW3NvdXJjZUxheWVySWRdO1xuICAgICAgICAgICAgaWYgKCFzb3VyY2VMYXllckZhbWlsaWVzKSB7XG4gICAgICAgICAgICAgICAgc291cmNlTGF5ZXJGYW1pbGllcyA9IHNvdXJjZUdyb3VwW3NvdXJjZUxheWVySWRdID0gW107XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHNvdXJjZUxheWVyRmFtaWxpZXMucHVzaChsYXllcnMpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBTdHlsZUxheWVySW5kZXg7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgeyBBbHBoYUltYWdlIH0gZnJvbSAnLi4vdXRpbC9pbWFnZSc7XG5pbXBvcnQgeyByZWdpc3RlciB9IGZyb20gJy4uL3V0aWwvd2ViX3dvcmtlcl90cmFuc2Zlcic7XG5pbXBvcnQgcG90cGFjayBmcm9tICdwb3RwYWNrJztcblxuaW1wb3J0IHR5cGUge0dseXBoTWV0cmljcywgU3R5bGVHbHlwaH0gZnJvbSAnLi4vc3R5bGUvc3R5bGVfZ2x5cGgnO1xuXG5jb25zdCBwYWRkaW5nID0gMTtcblxudHlwZSBSZWN0ID0ge1xuICAgIHg6IG51bWJlcixcbiAgICB5OiBudW1iZXIsXG4gICAgdzogbnVtYmVyLFxuICAgIGg6IG51bWJlclxufTtcblxuZXhwb3J0IHR5cGUgR2x5cGhQb3NpdGlvbiA9IHtcbiAgICByZWN0OiBSZWN0LFxuICAgIG1ldHJpY3M6IEdseXBoTWV0cmljc1xufTtcblxuZXhwb3J0IHR5cGUgR2x5cGhQb3NpdGlvbnMgPSB7IFtzdHJpbmddOiB7IFtudW1iZXJdOiBHbHlwaFBvc2l0aW9uIH0gfVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBHbHlwaEF0bGFzIHtcbiAgICBpbWFnZTogQWxwaGFJbWFnZTtcbiAgICBwb3NpdGlvbnM6IEdseXBoUG9zaXRpb25zO1xuXG4gICAgY29uc3RydWN0b3Ioc3RhY2tzOiB7IFtzdHJpbmddOiB7IFtudW1iZXJdOiA/U3R5bGVHbHlwaCB9IH0pIHtcbiAgICAgICAgY29uc3QgcG9zaXRpb25zID0ge307XG4gICAgICAgIGNvbnN0IGJpbnMgPSBbXTtcblxuICAgICAgICBmb3IgKGNvbnN0IHN0YWNrIGluIHN0YWNrcykge1xuICAgICAgICAgICAgY29uc3QgZ2x5cGhzID0gc3RhY2tzW3N0YWNrXTtcbiAgICAgICAgICAgIGNvbnN0IHN0YWNrUG9zaXRpb25zID0gcG9zaXRpb25zW3N0YWNrXSA9IHt9O1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGlkIGluIGdseXBocykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNyYyA9IGdseXBoc1sraWRdO1xuICAgICAgICAgICAgICAgIGlmICghc3JjIHx8IHNyYy5iaXRtYXAud2lkdGggPT09IDAgfHwgc3JjLmJpdG1hcC5oZWlnaHQgPT09IDApIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgYmluID0ge1xuICAgICAgICAgICAgICAgICAgICB4OiAwLFxuICAgICAgICAgICAgICAgICAgICB5OiAwLFxuICAgICAgICAgICAgICAgICAgICB3OiBzcmMuYml0bWFwLndpZHRoICsgMiAqIHBhZGRpbmcsXG4gICAgICAgICAgICAgICAgICAgIGg6IHNyYy5iaXRtYXAuaGVpZ2h0ICsgMiAqIHBhZGRpbmdcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGJpbnMucHVzaChiaW4pO1xuICAgICAgICAgICAgICAgIHN0YWNrUG9zaXRpb25zW2lkXSA9IHtyZWN0OiBiaW4sIG1ldHJpY3M6IHNyYy5tZXRyaWNzfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHt3LCBofSA9IHBvdHBhY2soYmlucyk7XG4gICAgICAgIGNvbnN0IGltYWdlID0gbmV3IEFscGhhSW1hZ2Uoe3dpZHRoOiB3IHx8IDEsIGhlaWdodDogaCB8fCAxfSk7XG5cbiAgICAgICAgZm9yIChjb25zdCBzdGFjayBpbiBzdGFja3MpIHtcbiAgICAgICAgICAgIGNvbnN0IGdseXBocyA9IHN0YWNrc1tzdGFja107XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgaWQgaW4gZ2x5cGhzKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3JjID0gZ2x5cGhzWytpZF07XG4gICAgICAgICAgICAgICAgaWYgKCFzcmMgfHwgc3JjLmJpdG1hcC53aWR0aCA9PT0gMCB8fCBzcmMuYml0bWFwLmhlaWdodCA9PT0gMCkgY29udGludWU7XG4gICAgICAgICAgICAgICAgY29uc3QgYmluID0gcG9zaXRpb25zW3N0YWNrXVtpZF0ucmVjdDtcbiAgICAgICAgICAgICAgICBBbHBoYUltYWdlLmNvcHkoc3JjLmJpdG1hcCwgaW1hZ2UsIHt4OiAwLCB5OiAwfSwge3g6IGJpbi54ICsgcGFkZGluZywgeTogYmluLnkgKyBwYWRkaW5nfSwgc3JjLmJpdG1hcCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmltYWdlID0gaW1hZ2U7XG4gICAgICAgIHRoaXMucG9zaXRpb25zID0gcG9zaXRpb25zO1xuICAgIH1cbn1cblxucmVnaXN0ZXIoJ0dseXBoQXRsYXMnLCBHbHlwaEF0bGFzKTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCBGZWF0dXJlSW5kZXggZnJvbSAnLi4vZGF0YS9mZWF0dXJlX2luZGV4JztcblxuaW1wb3J0IHsgcGVyZm9ybVN5bWJvbExheW91dCB9IGZyb20gJy4uL3N5bWJvbC9zeW1ib2xfbGF5b3V0JztcbmltcG9ydCB7IENvbGxpc2lvbkJveEFycmF5IH0gZnJvbSAnLi4vZGF0YS9hcnJheV90eXBlcyc7XG5pbXBvcnQgRGljdGlvbmFyeUNvZGVyIGZyb20gJy4uL3V0aWwvZGljdGlvbmFyeV9jb2Rlcic7XG5pbXBvcnQgU3ltYm9sQnVja2V0IGZyb20gJy4uL2RhdGEvYnVja2V0L3N5bWJvbF9idWNrZXQnO1xuaW1wb3J0IExpbmVCdWNrZXQgZnJvbSAnLi4vZGF0YS9idWNrZXQvbGluZV9idWNrZXQnO1xuaW1wb3J0IEZpbGxCdWNrZXQgZnJvbSAnLi4vZGF0YS9idWNrZXQvZmlsbF9idWNrZXQnO1xuaW1wb3J0IEZpbGxFeHRydXNpb25CdWNrZXQgZnJvbSAnLi4vZGF0YS9idWNrZXQvZmlsbF9leHRydXNpb25fYnVja2V0JztcbmltcG9ydCB7IHdhcm5PbmNlLCBtYXBPYmplY3QsIHZhbHVlcyB9IGZyb20gJy4uL3V0aWwvdXRpbCc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgSW1hZ2VBdGxhcyBmcm9tICcuLi9yZW5kZXIvaW1hZ2VfYXRsYXMnO1xuaW1wb3J0IEdseXBoQXRsYXMgZnJvbSAnLi4vcmVuZGVyL2dseXBoX2F0bGFzJztcbmltcG9ydCBFdmFsdWF0aW9uUGFyYW1ldGVycyBmcm9tICcuLi9zdHlsZS9ldmFsdWF0aW9uX3BhcmFtZXRlcnMnO1xuaW1wb3J0IHsgT3ZlcnNjYWxlZFRpbGVJRCB9IGZyb20gJy4vdGlsZV9pZCc7XG5cbmltcG9ydCB0eXBlIHtCdWNrZXR9IGZyb20gJy4uL2RhdGEvYnVja2V0JztcbmltcG9ydCB0eXBlIEFjdG9yIGZyb20gJy4uL3V0aWwvYWN0b3InO1xuaW1wb3J0IHR5cGUgU3R5bGVMYXllciBmcm9tICcuLi9zdHlsZS9zdHlsZV9sYXllcic7XG5pbXBvcnQgdHlwZSBTdHlsZUxheWVySW5kZXggZnJvbSAnLi4vc3R5bGUvc3R5bGVfbGF5ZXJfaW5kZXgnO1xuaW1wb3J0IHR5cGUge1N0eWxlSW1hZ2V9IGZyb20gJy4uL3N0eWxlL3N0eWxlX2ltYWdlJztcbmltcG9ydCB0eXBlIHtTdHlsZUdseXBofSBmcm9tICcuLi9zdHlsZS9zdHlsZV9nbHlwaCc7XG5pbXBvcnQgdHlwZSB7XG4gICAgV29ya2VyVGlsZVBhcmFtZXRlcnMsXG4gICAgV29ya2VyVGlsZUNhbGxiYWNrLFxufSBmcm9tICcuLi9zb3VyY2Uvd29ya2VyX3NvdXJjZSc7XG5cbmNsYXNzIFdvcmtlclRpbGUge1xuICAgIHRpbGVJRDogT3ZlcnNjYWxlZFRpbGVJRDtcbiAgICB1aWQ6IHN0cmluZztcbiAgICB6b29tOiBudW1iZXI7XG4gICAgcGl4ZWxSYXRpbzogbnVtYmVyO1xuICAgIHRpbGVTaXplOiBudW1iZXI7XG4gICAgc291cmNlOiBzdHJpbmc7XG4gICAgb3ZlcnNjYWxpbmc6IG51bWJlcjtcbiAgICBzaG93Q29sbGlzaW9uQm94ZXM6IGJvb2xlYW47XG4gICAgY29sbGVjdFJlc291cmNlVGltaW5nOiBib29sZWFuO1xuICAgIHJldHVybkRlcGVuZGVuY2llczogYm9vbGVhbjtcblxuICAgIHN0YXR1czogJ3BhcnNpbmcnIHwgJ2RvbmUnO1xuICAgIGRhdGE6IFZlY3RvclRpbGU7XG4gICAgY29sbGlzaW9uQm94QXJyYXk6IENvbGxpc2lvbkJveEFycmF5O1xuXG4gICAgYWJvcnQ6ID8oKSA9PiB2b2lkO1xuICAgIHJlbG9hZENhbGxiYWNrOiBXb3JrZXJUaWxlQ2FsbGJhY2s7XG4gICAgdmVjdG9yVGlsZTogVmVjdG9yVGlsZTtcblxuICAgIGNvbnN0cnVjdG9yKHBhcmFtczogV29ya2VyVGlsZVBhcmFtZXRlcnMpIHtcbiAgICAgICAgdGhpcy50aWxlSUQgPSBuZXcgT3ZlcnNjYWxlZFRpbGVJRChwYXJhbXMudGlsZUlELm92ZXJzY2FsZWRaLCBwYXJhbXMudGlsZUlELndyYXAsIHBhcmFtcy50aWxlSUQuY2Fub25pY2FsLnosIHBhcmFtcy50aWxlSUQuY2Fub25pY2FsLngsIHBhcmFtcy50aWxlSUQuY2Fub25pY2FsLnkpO1xuICAgICAgICB0aGlzLnVpZCA9IHBhcmFtcy51aWQ7XG4gICAgICAgIHRoaXMuem9vbSA9IHBhcmFtcy56b29tO1xuICAgICAgICB0aGlzLnBpeGVsUmF0aW8gPSBwYXJhbXMucGl4ZWxSYXRpbztcbiAgICAgICAgdGhpcy50aWxlU2l6ZSA9IHBhcmFtcy50aWxlU2l6ZTtcbiAgICAgICAgdGhpcy5zb3VyY2UgPSBwYXJhbXMuc291cmNlO1xuICAgICAgICB0aGlzLm92ZXJzY2FsaW5nID0gdGhpcy50aWxlSUQub3ZlcnNjYWxlRmFjdG9yKCk7XG4gICAgICAgIHRoaXMuc2hvd0NvbGxpc2lvbkJveGVzID0gcGFyYW1zLnNob3dDb2xsaXNpb25Cb3hlcztcbiAgICAgICAgdGhpcy5jb2xsZWN0UmVzb3VyY2VUaW1pbmcgPSAhIXBhcmFtcy5jb2xsZWN0UmVzb3VyY2VUaW1pbmc7XG4gICAgICAgIHRoaXMucmV0dXJuRGVwZW5kZW5jaWVzID0gISFwYXJhbXMucmV0dXJuRGVwZW5kZW5jaWVzO1xuICAgIH1cblxuICAgIHBhcnNlKGRhdGE6IFZlY3RvclRpbGUsIGxheWVySW5kZXg6IFN0eWxlTGF5ZXJJbmRleCwgYWN0b3I6IEFjdG9yLCBjYWxsYmFjazogV29ya2VyVGlsZUNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMuc3RhdHVzID0gJ3BhcnNpbmcnO1xuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xuXG4gICAgICAgIHRoaXMuY29sbGlzaW9uQm94QXJyYXkgPSBuZXcgQ29sbGlzaW9uQm94QXJyYXkoKTtcbiAgICAgICAgY29uc3Qgc291cmNlTGF5ZXJDb2RlciA9IG5ldyBEaWN0aW9uYXJ5Q29kZXIoT2JqZWN0LmtleXMoZGF0YS5sYXllcnMpLnNvcnQoKSk7XG5cbiAgICAgICAgY29uc3QgZmVhdHVyZUluZGV4ID0gbmV3IEZlYXR1cmVJbmRleCh0aGlzLnRpbGVJRCk7XG4gICAgICAgIGZlYXR1cmVJbmRleC5idWNrZXRMYXllcklEcyA9IFtdO1xuXG4gICAgICAgIGNvbnN0IGJ1Y2tldHM6IHtbc3RyaW5nXTogQnVja2V0fSA9IHt9O1xuXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBmZWF0dXJlSW5kZXgsXG4gICAgICAgICAgICBpY29uRGVwZW5kZW5jaWVzOiB7fSxcbiAgICAgICAgICAgIHBhdHRlcm5EZXBlbmRlbmNpZXM6IHt9LFxuICAgICAgICAgICAgZ2x5cGhEZXBlbmRlbmNpZXM6IHt9XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgbGF5ZXJGYW1pbGllcyA9IGxheWVySW5kZXguZmFtaWxpZXNCeVNvdXJjZVt0aGlzLnNvdXJjZV07XG4gICAgICAgIGZvciAoY29uc3Qgc291cmNlTGF5ZXJJZCBpbiBsYXllckZhbWlsaWVzKSB7XG4gICAgICAgICAgICBjb25zdCBzb3VyY2VMYXllciA9IGRhdGEubGF5ZXJzW3NvdXJjZUxheWVySWRdO1xuICAgICAgICAgICAgaWYgKCFzb3VyY2VMYXllcikge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoc291cmNlTGF5ZXIudmVyc2lvbiA9PT0gMSkge1xuICAgICAgICAgICAgICAgIHdhcm5PbmNlKGBWZWN0b3IgdGlsZSBzb3VyY2UgXCIke3RoaXMuc291cmNlfVwiIGxheWVyIFwiJHtzb3VyY2VMYXllcklkfVwiIGAgK1xuICAgICAgICAgICAgICAgICAgICBgZG9lcyBub3QgdXNlIHZlY3RvciB0aWxlIHNwZWMgdjIgYW5kIHRoZXJlZm9yZSBtYXkgaGF2ZSBzb21lIHJlbmRlcmluZyBlcnJvcnMuYCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZUxheWVySW5kZXggPSBzb3VyY2VMYXllckNvZGVyLmVuY29kZShzb3VyY2VMYXllcklkKTtcbiAgICAgICAgICAgIGNvbnN0IGZlYXR1cmVzID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgc291cmNlTGF5ZXIubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmVhdHVyZSA9IHNvdXJjZUxheWVyLmZlYXR1cmUoaW5kZXgpO1xuICAgICAgICAgICAgICAgIGZlYXR1cmVzLnB1c2goeyBmZWF0dXJlLCBpbmRleCwgc291cmNlTGF5ZXJJbmRleCB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yIChjb25zdCBmYW1pbHkgb2YgbGF5ZXJGYW1pbGllc1tzb3VyY2VMYXllcklkXSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxheWVyID0gZmFtaWx5WzBdO1xuXG4gICAgICAgICAgICAgICAgYXNzZXJ0KGxheWVyLnNvdXJjZSA9PT0gdGhpcy5zb3VyY2UpO1xuICAgICAgICAgICAgICAgIGlmIChsYXllci5taW56b29tICYmIHRoaXMuem9vbSA8IE1hdGguZmxvb3IobGF5ZXIubWluem9vbSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGlmIChsYXllci5tYXh6b29tICYmIHRoaXMuem9vbSA+PSBsYXllci5tYXh6b29tKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBpZiAobGF5ZXIudmlzaWJpbGl0eSA9PT0gJ25vbmUnKSBjb250aW51ZTtcblxuICAgICAgICAgICAgICAgIHJlY2FsY3VsYXRlTGF5ZXJzKGZhbWlseSwgdGhpcy56b29tKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGJ1Y2tldCA9IGJ1Y2tldHNbbGF5ZXIuaWRdID0gbGF5ZXIuY3JlYXRlQnVja2V0KHtcbiAgICAgICAgICAgICAgICAgICAgaW5kZXg6IGZlYXR1cmVJbmRleC5idWNrZXRMYXllcklEcy5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgIGxheWVyczogZmFtaWx5LFxuICAgICAgICAgICAgICAgICAgICB6b29tOiB0aGlzLnpvb20sXG4gICAgICAgICAgICAgICAgICAgIHBpeGVsUmF0aW86IHRoaXMucGl4ZWxSYXRpbyxcbiAgICAgICAgICAgICAgICAgICAgb3ZlcnNjYWxpbmc6IHRoaXMub3ZlcnNjYWxpbmcsXG4gICAgICAgICAgICAgICAgICAgIGNvbGxpc2lvbkJveEFycmF5OiB0aGlzLmNvbGxpc2lvbkJveEFycmF5LFxuICAgICAgICAgICAgICAgICAgICBzb3VyY2VMYXllckluZGV4LFxuICAgICAgICAgICAgICAgICAgICBzb3VyY2VJRDogdGhpcy5zb3VyY2VcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGJ1Y2tldC5wb3B1bGF0ZShmZWF0dXJlcywgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgZmVhdHVyZUluZGV4LmJ1Y2tldExheWVySURzLnB1c2goZmFtaWx5Lm1hcCgobCkgPT4gbC5pZCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGVycm9yOiA/RXJyb3I7XG4gICAgICAgIGxldCBnbHlwaE1hcDogP3tbc3RyaW5nXToge1tudW1iZXJdOiA/U3R5bGVHbHlwaH19O1xuICAgICAgICBsZXQgaWNvbk1hcDogP3tbc3RyaW5nXTogU3R5bGVJbWFnZX07XG4gICAgICAgIGxldCBwYXR0ZXJuTWFwOiA/e1tzdHJpbmddOiBTdHlsZUltYWdlfTtcblxuICAgICAgICBjb25zdCBzdGFja3MgPSBtYXBPYmplY3Qob3B0aW9ucy5nbHlwaERlcGVuZGVuY2llcywgKGdseXBocykgPT4gT2JqZWN0LmtleXMoZ2x5cGhzKS5tYXAoTnVtYmVyKSk7XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhzdGFja3MpLmxlbmd0aCkge1xuICAgICAgICAgICAgYWN0b3Iuc2VuZCgnZ2V0R2x5cGhzJywge3VpZDogdGhpcy51aWQsIHN0YWNrc30sIChlcnIsIHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBlcnI7XG4gICAgICAgICAgICAgICAgICAgIGdseXBoTWFwID0gcmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICBtYXliZVByZXBhcmUuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGdseXBoTWFwID0ge307XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpY29ucyA9IE9iamVjdC5rZXlzKG9wdGlvbnMuaWNvbkRlcGVuZGVuY2llcyk7XG4gICAgICAgIGlmIChpY29ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGFjdG9yLnNlbmQoJ2dldEltYWdlcycsIHtpY29uc30sIChlcnIsIHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBlcnI7XG4gICAgICAgICAgICAgICAgICAgIGljb25NYXAgPSByZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgIG1heWJlUHJlcGFyZS5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWNvbk1hcCA9IHt9O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGF0dGVybnMgPSBPYmplY3Qua2V5cyhvcHRpb25zLnBhdHRlcm5EZXBlbmRlbmNpZXMpO1xuICAgICAgICBpZiAocGF0dGVybnMubGVuZ3RoKSB7XG4gICAgICAgICAgICBhY3Rvci5zZW5kKCdnZXRJbWFnZXMnLCB7aWNvbnM6IHBhdHRlcm5zfSwgKGVyciwgcmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBlcnJvciA9IGVycjtcbiAgICAgICAgICAgICAgICAgICAgcGF0dGVybk1hcCA9IHJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgbWF5YmVQcmVwYXJlLmNhbGwodGhpcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYXR0ZXJuTWFwID0ge307XG4gICAgICAgIH1cblxuXG4gICAgICAgIG1heWJlUHJlcGFyZS5jYWxsKHRoaXMpO1xuXG4gICAgICAgIGZ1bmN0aW9uIG1heWJlUHJlcGFyZSgpIHtcbiAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnJvcik7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGdseXBoTWFwICYmIGljb25NYXAgJiYgcGF0dGVybk1hcCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGdseXBoQXRsYXMgPSBuZXcgR2x5cGhBdGxhcyhnbHlwaE1hcCk7XG4gICAgICAgICAgICAgICAgY29uc3QgaW1hZ2VBdGxhcyA9IG5ldyBJbWFnZUF0bGFzKGljb25NYXAsIHBhdHRlcm5NYXApO1xuXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gYnVja2V0cykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBidWNrZXQgPSBidWNrZXRzW2tleV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChidWNrZXQgaW5zdGFuY2VvZiBTeW1ib2xCdWNrZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlY2FsY3VsYXRlTGF5ZXJzKGJ1Y2tldC5sYXllcnMsIHRoaXMuem9vbSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtU3ltYm9sTGF5b3V0KGJ1Y2tldCwgZ2x5cGhNYXAsIGdseXBoQXRsYXMucG9zaXRpb25zLCBpY29uTWFwLCBpbWFnZUF0bGFzLmljb25Qb3NpdGlvbnMsIHRoaXMuc2hvd0NvbGxpc2lvbkJveGVzKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChidWNrZXQuaGFzUGF0dGVybiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgKGJ1Y2tldCBpbnN0YW5jZW9mIExpbmVCdWNrZXQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICBidWNrZXQgaW5zdGFuY2VvZiBGaWxsQnVja2V0IHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgYnVja2V0IGluc3RhbmNlb2YgRmlsbEV4dHJ1c2lvbkJ1Y2tldCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlY2FsY3VsYXRlTGF5ZXJzKGJ1Y2tldC5sYXllcnMsIHRoaXMuem9vbSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBidWNrZXQuYWRkRmVhdHVyZXMob3B0aW9ucywgaW1hZ2VBdGxhcy5wYXR0ZXJuUG9zaXRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuc3RhdHVzID0gJ2RvbmUnO1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHtcbiAgICAgICAgICAgICAgICAgICAgYnVja2V0czogdmFsdWVzKGJ1Y2tldHMpLmZpbHRlcihiID0+ICFiLmlzRW1wdHkoKSksXG4gICAgICAgICAgICAgICAgICAgIGZlYXR1cmVJbmRleCxcbiAgICAgICAgICAgICAgICAgICAgY29sbGlzaW9uQm94QXJyYXk6IHRoaXMuY29sbGlzaW9uQm94QXJyYXksXG4gICAgICAgICAgICAgICAgICAgIGdseXBoQXRsYXNJbWFnZTogZ2x5cGhBdGxhcy5pbWFnZSxcbiAgICAgICAgICAgICAgICAgICAgaW1hZ2VBdGxhcyxcbiAgICAgICAgICAgICAgICAgICAgLy8gT25seSB1c2VkIGZvciBiZW5jaG1hcmtpbmc6XG4gICAgICAgICAgICAgICAgICAgIGdseXBoTWFwOiB0aGlzLnJldHVybkRlcGVuZGVuY2llcyA/IGdseXBoTWFwIDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgaWNvbk1hcDogdGhpcy5yZXR1cm5EZXBlbmRlbmNpZXMgPyBpY29uTWFwIDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgZ2x5cGhQb3NpdGlvbnM6IHRoaXMucmV0dXJuRGVwZW5kZW5jaWVzID8gZ2x5cGhBdGxhcy5wb3NpdGlvbnMgOiBudWxsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmZ1bmN0aW9uIHJlY2FsY3VsYXRlTGF5ZXJzKGxheWVyczogJFJlYWRPbmx5QXJyYXk8U3R5bGVMYXllcj4sIHpvb206IG51bWJlcikge1xuICAgIC8vIExheWVycyBhcmUgc2hhcmVkIGFuZCBtYXkgaGF2ZSBiZWVuIHVzZWQgYnkgYSBXb3JrZXJUaWxlIHdpdGggYSBkaWZmZXJlbnQgem9vbS5cbiAgICBjb25zdCBwYXJhbWV0ZXJzID0gbmV3IEV2YWx1YXRpb25QYXJhbWV0ZXJzKHpvb20pO1xuICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgbGF5ZXJzKSB7XG4gICAgICAgIGxheWVyLnJlY2FsY3VsYXRlKHBhcmFtZXRlcnMpO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgV29ya2VyVGlsZTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB0eXBlIHtSZXF1ZXN0UGFyYW1ldGVyc30gZnJvbSAnLi4vdXRpbC9hamF4JztcblxuLy8gV3JhcHMgcGVyZm9ybWFuY2UgdG8gZmFjaWxpdGF0ZSB0ZXN0aW5nXG4vLyBOb3QgaW5jb3Jwb3JhdGVkIGludG8gYnJvd3Nlci5qcyBiZWNhdXNlIHRoZSBsYXR0ZXIgaXMgcG9pc29ub3VzIHdoZW4gdXNlZCBvdXRzaWRlIHRoZSBtYWluIHRocmVhZFxuY29uc3QgcGVyZm9ybWFuY2VFeGlzdHMgPSB0eXBlb2YgcGVyZm9ybWFuY2UgIT09ICd1bmRlZmluZWQnO1xuY29uc3Qgd3JhcHBlciA9IHt9O1xuXG53cmFwcGVyLmdldEVudHJpZXNCeU5hbWUgPSAodXJsOiBzdHJpbmcpID0+IHtcbiAgICBpZiAocGVyZm9ybWFuY2VFeGlzdHMgJiYgcGVyZm9ybWFuY2UgJiYgcGVyZm9ybWFuY2UuZ2V0RW50cmllc0J5TmFtZSlcbiAgICAgICAgcmV0dXJuIHBlcmZvcm1hbmNlLmdldEVudHJpZXNCeU5hbWUodXJsKTtcbiAgICBlbHNlXG4gICAgICAgIHJldHVybiBmYWxzZTtcbn07XG5cbndyYXBwZXIubWFyayA9IChuYW1lOiBzdHJpbmcpID0+IHtcbiAgICBpZiAocGVyZm9ybWFuY2VFeGlzdHMgJiYgcGVyZm9ybWFuY2UgJiYgcGVyZm9ybWFuY2UubWFyaylcbiAgICAgICAgcmV0dXJuIHBlcmZvcm1hbmNlLm1hcmsobmFtZSk7XG4gICAgZWxzZVxuICAgICAgICByZXR1cm4gZmFsc2U7XG59O1xuXG53cmFwcGVyLm1lYXN1cmUgPSAobmFtZTogc3RyaW5nLCBzdGFydE1hcms6IHN0cmluZywgZW5kTWFyazogc3RyaW5nKSA9PiB7XG4gICAgaWYgKHBlcmZvcm1hbmNlRXhpc3RzICYmIHBlcmZvcm1hbmNlICYmIHBlcmZvcm1hbmNlLm1lYXN1cmUpXG4gICAgICAgIHJldHVybiBwZXJmb3JtYW5jZS5tZWFzdXJlKG5hbWUsIHN0YXJ0TWFyaywgZW5kTWFyayk7XG4gICAgZWxzZVxuICAgICAgICByZXR1cm4gZmFsc2U7XG59O1xuXG53cmFwcGVyLmNsZWFyTWFya3MgPSAobmFtZTogc3RyaW5nKSA9PiB7XG4gICAgaWYgKHBlcmZvcm1hbmNlRXhpc3RzICYmIHBlcmZvcm1hbmNlICYmIHBlcmZvcm1hbmNlLmNsZWFyTWFya3MpXG4gICAgICAgIHJldHVybiBwZXJmb3JtYW5jZS5jbGVhck1hcmtzKG5hbWUpO1xuICAgIGVsc2VcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xufTtcblxud3JhcHBlci5jbGVhck1lYXN1cmVzID0gKG5hbWU6IHN0cmluZykgPT4ge1xuICAgIGlmIChwZXJmb3JtYW5jZUV4aXN0cyAmJiBwZXJmb3JtYW5jZSAmJiBwZXJmb3JtYW5jZS5jbGVhck1lYXN1cmVzKVxuICAgICAgICByZXR1cm4gcGVyZm9ybWFuY2UuY2xlYXJNZWFzdXJlcyhuYW1lKTtcbiAgICBlbHNlXG4gICAgICAgIHJldHVybiBmYWxzZTtcbn07XG5cbi8qKlxuICogU2FmZSB3cmFwcGVyIGZvciB0aGUgcGVyZm9ybWFuY2UgcmVzb3VyY2UgdGltaW5nIEFQSSBpbiB3ZWIgd29ya2VycyB3aXRoIGdyYWNlZnVsIGRlZ3JhZGF0aW9uXG4gKlxuICogQHBhcmFtIHtSZXF1ZXN0UGFyYW1ldGVyc30gcmVxdWVzdFxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgUGVyZm9ybWFuY2Uge1xuICAgIF9tYXJrczoge3N0YXJ0OiBzdHJpbmcsIGVuZDogc3RyaW5nLCBtZWFzdXJlOiBzdHJpbmd9O1xuXG4gICAgY29uc3RydWN0b3IgKHJlcXVlc3Q6IFJlcXVlc3RQYXJhbWV0ZXJzKSB7XG4gICAgICAgIHRoaXMuX21hcmtzID0ge1xuICAgICAgICAgICAgc3RhcnQ6IFtyZXF1ZXN0LnVybCwgJ3N0YXJ0J10uam9pbignIycpLFxuICAgICAgICAgICAgZW5kOiBbcmVxdWVzdC51cmwsICdlbmQnXS5qb2luKCcjJyksXG4gICAgICAgICAgICBtZWFzdXJlOiByZXF1ZXN0LnVybC50b1N0cmluZygpXG4gICAgICAgIH07XG5cbiAgICAgICAgd3JhcHBlci5tYXJrKHRoaXMuX21hcmtzLnN0YXJ0KTtcbiAgICB9XG5cbiAgICBmaW5pc2goKSB7XG4gICAgICAgIHdyYXBwZXIubWFyayh0aGlzLl9tYXJrcy5lbmQpO1xuICAgICAgICBsZXQgcmVzb3VyY2VUaW1pbmdEYXRhID0gd3JhcHBlci5nZXRFbnRyaWVzQnlOYW1lKHRoaXMuX21hcmtzLm1lYXN1cmUpO1xuXG4gICAgICAgIC8vIGZhbGxiYWNrIGlmIHdlYiB3b3JrZXIgaW1wbGVtZW50YXRpb24gb2YgcGVyZi5nZXRFbnRyaWVzQnlOYW1lIHJldHVybnMgZW1wdHlcbiAgICAgICAgaWYgKHJlc291cmNlVGltaW5nRGF0YS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHdyYXBwZXIubWVhc3VyZSh0aGlzLl9tYXJrcy5tZWFzdXJlLCB0aGlzLl9tYXJrcy5zdGFydCwgdGhpcy5fbWFya3MuZW5kKTtcbiAgICAgICAgICAgIHJlc291cmNlVGltaW5nRGF0YSA9IHdyYXBwZXIuZ2V0RW50cmllc0J5TmFtZSh0aGlzLl9tYXJrcy5tZWFzdXJlKTtcblxuICAgICAgICAgICAgLy8gY2xlYW51cFxuICAgICAgICAgICAgd3JhcHBlci5jbGVhck1hcmtzKHRoaXMuX21hcmtzLnN0YXJ0KTtcbiAgICAgICAgICAgIHdyYXBwZXIuY2xlYXJNYXJrcyh0aGlzLl9tYXJrcy5lbmQpO1xuICAgICAgICAgICAgd3JhcHBlci5jbGVhck1lYXN1cmVzKHRoaXMuX21hcmtzLm1lYXN1cmUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc291cmNlVGltaW5nRGF0YTtcbiAgICB9XG59XG5cbndyYXBwZXIuUGVyZm9ybWFuY2UgPSBQZXJmb3JtYW5jZTtcblxuZXhwb3J0IGRlZmF1bHQgd3JhcHBlcjtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7IGdldEFycmF5QnVmZmVyIH0gZnJvbSAnLi4vdXRpbC9hamF4JztcblxuaW1wb3J0IHZ0IGZyb20gJ0BtYXBib3gvdmVjdG9yLXRpbGUnO1xuaW1wb3J0IFByb3RvYnVmIGZyb20gJ3BiZic7XG5pbXBvcnQgV29ya2VyVGlsZSBmcm9tICcuL3dvcmtlcl90aWxlJztcbmltcG9ydCB7IGV4dGVuZCB9IGZyb20gJy4uL3V0aWwvdXRpbCc7XG5pbXBvcnQgcGVyZm9ybWFuY2UgZnJvbSAnLi4vdXRpbC9wZXJmb3JtYW5jZSc7XG5cbmltcG9ydCB0eXBlIHtcbiAgICBXb3JrZXJTb3VyY2UsXG4gICAgV29ya2VyVGlsZVBhcmFtZXRlcnMsXG4gICAgV29ya2VyVGlsZUNhbGxiYWNrLFxuICAgIFRpbGVQYXJhbWV0ZXJzXG59IGZyb20gJy4uL3NvdXJjZS93b3JrZXJfc291cmNlJztcblxuaW1wb3J0IHR5cGUge1BlcmZvcm1hbmNlUmVzb3VyY2VUaW1pbmd9IGZyb20gJy4uL3R5cGVzL3BlcmZvcm1hbmNlX3Jlc291cmNlX3RpbWluZyc7XG5pbXBvcnQgdHlwZSBBY3RvciBmcm9tICcuLi91dGlsL2FjdG9yJztcbmltcG9ydCB0eXBlIFN0eWxlTGF5ZXJJbmRleCBmcm9tICcuLi9zdHlsZS9zdHlsZV9sYXllcl9pbmRleCc7XG5pbXBvcnQgdHlwZSB7Q2FsbGJhY2t9IGZyb20gJy4uL3R5cGVzL2NhbGxiYWNrJztcblxuZXhwb3J0IHR5cGUgTG9hZFZlY3RvclRpbGVSZXN1bHQgPSB7XG4gICAgdmVjdG9yVGlsZTogVmVjdG9yVGlsZTtcbiAgICByYXdEYXRhOiBBcnJheUJ1ZmZlcjtcbiAgICBleHBpcmVzPzogYW55O1xuICAgIGNhY2hlQ29udHJvbD86IGFueTtcbiAgICByZXNvdXJjZVRpbWluZz86IEFycmF5PFBlcmZvcm1hbmNlUmVzb3VyY2VUaW1pbmc+O1xufTtcblxuLyoqXG4gKiBAY2FsbGJhY2sgTG9hZFZlY3RvckRhdGFDYWxsYmFja1xuICogQHBhcmFtIGVycm9yXG4gKiBAcGFyYW0gdmVjdG9yVGlsZVxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IHR5cGUgTG9hZFZlY3RvckRhdGFDYWxsYmFjayA9IENhbGxiYWNrPD9Mb2FkVmVjdG9yVGlsZVJlc3VsdD47XG5cbmV4cG9ydCB0eXBlIEFib3J0VmVjdG9yRGF0YSA9ICgpID0+IHZvaWQ7XG5leHBvcnQgdHlwZSBMb2FkVmVjdG9yRGF0YSA9IChwYXJhbXM6IFdvcmtlclRpbGVQYXJhbWV0ZXJzLCBjYWxsYmFjazogTG9hZFZlY3RvckRhdGFDYWxsYmFjaykgPT4gP0Fib3J0VmVjdG9yRGF0YTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBsb2FkVmVjdG9yVGlsZShwYXJhbXM6IFdvcmtlclRpbGVQYXJhbWV0ZXJzLCBjYWxsYmFjazogTG9hZFZlY3RvckRhdGFDYWxsYmFjaykge1xuICAgIGNvbnN0IHJlcXVlc3QgPSBnZXRBcnJheUJ1ZmZlcihwYXJhbXMucmVxdWVzdCwgKGVycjogP0Vycm9yLCBkYXRhOiA/QXJyYXlCdWZmZXIsIGNhY2hlQ29udHJvbDogP3N0cmluZywgZXhwaXJlczogP3N0cmluZykgPT4ge1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgICB9IGVsc2UgaWYgKGRhdGEpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHtcbiAgICAgICAgICAgICAgICB2ZWN0b3JUaWxlOiBuZXcgdnQuVmVjdG9yVGlsZShuZXcgUHJvdG9idWYoZGF0YSkpLFxuICAgICAgICAgICAgICAgIHJhd0RhdGE6IGRhdGEsXG4gICAgICAgICAgICAgICAgY2FjaGVDb250cm9sLFxuICAgICAgICAgICAgICAgIGV4cGlyZXNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgcmVxdWVzdC5jYW5jZWwoKTtcbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICB9O1xufVxuXG4vKipcbiAqIFRoZSB7QGxpbmsgV29ya2VyU291cmNlfSBpbXBsZW1lbnRhdGlvbiB0aGF0IHN1cHBvcnRzIHtAbGluayBWZWN0b3JUaWxlU291cmNlfS5cbiAqIFRoaXMgY2xhc3MgaXMgZGVzaWduZWQgdG8gYmUgZWFzaWx5IHJldXNlZCB0byBzdXBwb3J0IGN1c3RvbSBzb3VyY2UgdHlwZXNcbiAqIGZvciBkYXRhIGZvcm1hdHMgdGhhdCBjYW4gYmUgcGFyc2VkL2NvbnZlcnRlZCBpbnRvIGFuIGluLW1lbW9yeSBWZWN0b3JUaWxlXG4gKiByZXByZXNlbnRhdGlvbi4gIFRvIGRvIHNvLCBjcmVhdGUgaXQgd2l0aFxuICogYG5ldyBWZWN0b3JUaWxlV29ya2VyU291cmNlKGFjdG9yLCBzdHlsZUxheWVycywgY3VzdG9tTG9hZFZlY3RvckRhdGFGdW5jdGlvbilgLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIFZlY3RvclRpbGVXb3JrZXJTb3VyY2UgaW1wbGVtZW50cyBXb3JrZXJTb3VyY2Uge1xuICAgIGFjdG9yOiBBY3RvcjtcbiAgICBsYXllckluZGV4OiBTdHlsZUxheWVySW5kZXg7XG4gICAgbG9hZFZlY3RvckRhdGE6IExvYWRWZWN0b3JEYXRhO1xuICAgIGxvYWRpbmc6IHsgW3N0cmluZ106IFdvcmtlclRpbGUgfTtcbiAgICBsb2FkZWQ6IHsgW3N0cmluZ106IFdvcmtlclRpbGUgfTtcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBbbG9hZFZlY3RvckRhdGFdIE9wdGlvbmFsIG1ldGhvZCBmb3IgY3VzdG9tIGxvYWRpbmcgb2YgYSBWZWN0b3JUaWxlXG4gICAgICogb2JqZWN0IGJhc2VkIG9uIHBhcmFtZXRlcnMgcGFzc2VkIGZyb20gdGhlIG1haW4tdGhyZWFkIFNvdXJjZS4gU2VlXG4gICAgICoge0BsaW5rIFZlY3RvclRpbGVXb3JrZXJTb3VyY2UjbG9hZFRpbGV9LiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBzaW1wbHlcbiAgICAgKiBsb2FkcyB0aGUgcGJmIGF0IGBwYXJhbXMudXJsYC5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihhY3RvcjogQWN0b3IsIGxheWVySW5kZXg6IFN0eWxlTGF5ZXJJbmRleCwgbG9hZFZlY3RvckRhdGE6ID9Mb2FkVmVjdG9yRGF0YSkge1xuICAgICAgICB0aGlzLmFjdG9yID0gYWN0b3I7XG4gICAgICAgIHRoaXMubGF5ZXJJbmRleCA9IGxheWVySW5kZXg7XG4gICAgICAgIHRoaXMubG9hZFZlY3RvckRhdGEgPSBsb2FkVmVjdG9yRGF0YSB8fCBsb2FkVmVjdG9yVGlsZTtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0ge307XG4gICAgICAgIHRoaXMubG9hZGVkID0ge307XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW1wbGVtZW50cyB7QGxpbmsgV29ya2VyU291cmNlI2xvYWRUaWxlfS4gRGVsZWdhdGVzIHRvXG4gICAgICoge0BsaW5rIFZlY3RvclRpbGVXb3JrZXJTb3VyY2UjbG9hZFZlY3RvckRhdGF9ICh3aGljaCBieSBkZWZhdWx0IGV4cGVjdHNcbiAgICAgKiBhIGBwYXJhbXMudXJsYCBwcm9wZXJ0eSkgZm9yIGZldGNoaW5nIGFuZCBwcm9kdWNpbmcgYSBWZWN0b3JUaWxlIG9iamVjdC5cbiAgICAgKi9cbiAgICBsb2FkVGlsZShwYXJhbXM6IFdvcmtlclRpbGVQYXJhbWV0ZXJzLCBjYWxsYmFjazogV29ya2VyVGlsZUNhbGxiYWNrKSB7XG4gICAgICAgIGNvbnN0IHVpZCA9IHBhcmFtcy51aWQ7XG5cbiAgICAgICAgaWYgKCF0aGlzLmxvYWRpbmcpXG4gICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSB7fTtcblxuICAgICAgICBjb25zdCBwZXJmID0gKHBhcmFtcyAmJiBwYXJhbXMucmVxdWVzdCAmJiBwYXJhbXMucmVxdWVzdC5jb2xsZWN0UmVzb3VyY2VUaW1pbmcpID9cbiAgICAgICAgICAgIG5ldyBwZXJmb3JtYW5jZS5QZXJmb3JtYW5jZShwYXJhbXMucmVxdWVzdCkgOiBmYWxzZTtcblxuICAgICAgICBjb25zdCB3b3JrZXJUaWxlID0gdGhpcy5sb2FkaW5nW3VpZF0gPSBuZXcgV29ya2VyVGlsZShwYXJhbXMpO1xuICAgICAgICB3b3JrZXJUaWxlLmFib3J0ID0gdGhpcy5sb2FkVmVjdG9yRGF0YShwYXJhbXMsIChlcnIsIHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5sb2FkaW5nW3VpZF07XG5cbiAgICAgICAgICAgIGlmIChlcnIgfHwgIXJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgd29ya2VyVGlsZS5zdGF0dXMgPSAnZG9uZSc7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkZWRbdWlkXSA9IHdvcmtlclRpbGU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHJhd1RpbGVEYXRhID0gcmVzcG9uc2UucmF3RGF0YTtcbiAgICAgICAgICAgIGNvbnN0IGNhY2hlQ29udHJvbCA9IHt9O1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmV4cGlyZXMpIGNhY2hlQ29udHJvbC5leHBpcmVzID0gcmVzcG9uc2UuZXhwaXJlcztcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5jYWNoZUNvbnRyb2wpIGNhY2hlQ29udHJvbC5jYWNoZUNvbnRyb2wgPSByZXNwb25zZS5jYWNoZUNvbnRyb2w7XG5cbiAgICAgICAgICAgIGNvbnN0IHJlc291cmNlVGltaW5nID0ge307XG4gICAgICAgICAgICBpZiAocGVyZikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc291cmNlVGltaW5nRGF0YSA9IHBlcmYuZmluaXNoKCk7XG4gICAgICAgICAgICAgICAgLy8gaXQncyBuZWNlc3NhcnkgdG8gZXZhbCB0aGUgcmVzdWx0IG9mIGdldEVudHJpZXNCeU5hbWUoKSBoZXJlIHZpYSBwYXJzZS9zdHJpbmdpZnlcbiAgICAgICAgICAgICAgICAvLyBsYXRlIGV2YWx1YXRpb24gaW4gdGhlIG1haW4gdGhyZWFkIGNhdXNlcyBUeXBlRXJyb3I6IGlsbGVnYWwgaW52b2NhdGlvblxuICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZVRpbWluZ0RhdGEpXG4gICAgICAgICAgICAgICAgICAgIHJlc291cmNlVGltaW5nLnJlc291cmNlVGltaW5nID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShyZXNvdXJjZVRpbWluZ0RhdGEpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgd29ya2VyVGlsZS52ZWN0b3JUaWxlID0gcmVzcG9uc2UudmVjdG9yVGlsZTtcbiAgICAgICAgICAgIHdvcmtlclRpbGUucGFyc2UocmVzcG9uc2UudmVjdG9yVGlsZSwgdGhpcy5sYXllckluZGV4LCB0aGlzLmFjdG9yLCAoZXJyLCByZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyIHx8ICFyZXN1bHQpIHJldHVybiBjYWxsYmFjayhlcnIpO1xuXG4gICAgICAgICAgICAgICAgLy8gVHJhbnNmZXJyaW5nIGEgY29weSBvZiByYXdUaWxlRGF0YSBiZWNhdXNlIHRoZSB3b3JrZXIgbmVlZHMgdG8gcmV0YWluIGl0cyBjb3B5LlxuICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIGV4dGVuZCh7cmF3VGlsZURhdGE6IHJhd1RpbGVEYXRhLnNsaWNlKDApfSwgcmVzdWx0LCBjYWNoZUNvbnRyb2wsIHJlc291cmNlVGltaW5nKSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdGhpcy5sb2FkZWQgPSB0aGlzLmxvYWRlZCB8fCB7fTtcbiAgICAgICAgICAgIHRoaXMubG9hZGVkW3VpZF0gPSB3b3JrZXJUaWxlO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbXBsZW1lbnRzIHtAbGluayBXb3JrZXJTb3VyY2UjcmVsb2FkVGlsZX0uXG4gICAgICovXG4gICAgcmVsb2FkVGlsZShwYXJhbXM6IFdvcmtlclRpbGVQYXJhbWV0ZXJzLCBjYWxsYmFjazogV29ya2VyVGlsZUNhbGxiYWNrKSB7XG4gICAgICAgIGNvbnN0IGxvYWRlZCA9IHRoaXMubG9hZGVkLFxuICAgICAgICAgICAgdWlkID0gcGFyYW1zLnVpZCxcbiAgICAgICAgICAgIHZ0U291cmNlID0gdGhpcztcbiAgICAgICAgaWYgKGxvYWRlZCAmJiBsb2FkZWRbdWlkXSkge1xuICAgICAgICAgICAgY29uc3Qgd29ya2VyVGlsZSA9IGxvYWRlZFt1aWRdO1xuICAgICAgICAgICAgd29ya2VyVGlsZS5zaG93Q29sbGlzaW9uQm94ZXMgPSBwYXJhbXMuc2hvd0NvbGxpc2lvbkJveGVzO1xuXG4gICAgICAgICAgICBjb25zdCBkb25lID0gKGVyciwgZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlbG9hZENhbGxiYWNrID0gd29ya2VyVGlsZS5yZWxvYWRDYWxsYmFjaztcbiAgICAgICAgICAgICAgICBpZiAocmVsb2FkQ2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHdvcmtlclRpbGUucmVsb2FkQ2FsbGJhY2s7XG4gICAgICAgICAgICAgICAgICAgIHdvcmtlclRpbGUucGFyc2Uod29ya2VyVGlsZS52ZWN0b3JUaWxlLCB2dFNvdXJjZS5sYXllckluZGV4LCB2dFNvdXJjZS5hY3RvciwgcmVsb2FkQ2FsbGJhY2spO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIsIGRhdGEpO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaWYgKHdvcmtlclRpbGUuc3RhdHVzID09PSAncGFyc2luZycpIHtcbiAgICAgICAgICAgICAgICB3b3JrZXJUaWxlLnJlbG9hZENhbGxiYWNrID0gZG9uZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAod29ya2VyVGlsZS5zdGF0dXMgPT09ICdkb25lJykge1xuICAgICAgICAgICAgICAgIC8vIGlmIHRoZXJlIHdhcyBubyB2ZWN0b3IgdGlsZSBkYXRhIG9uIHRoZSBpbml0aWFsIGxvYWQsIGRvbid0IHRyeSBhbmQgcmUtcGFyc2UgdGlsZVxuICAgICAgICAgICAgICAgIGlmICh3b3JrZXJUaWxlLnZlY3RvclRpbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgd29ya2VyVGlsZS5wYXJzZSh3b3JrZXJUaWxlLnZlY3RvclRpbGUsIHRoaXMubGF5ZXJJbmRleCwgdGhpcy5hY3RvciwgZG9uZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEltcGxlbWVudHMge0BsaW5rIFdvcmtlclNvdXJjZSNhYm9ydFRpbGV9LlxuICAgICAqXG4gICAgICogQHBhcmFtIHBhcmFtc1xuICAgICAqIEBwYXJhbSBwYXJhbXMudWlkIFRoZSBVSUQgZm9yIHRoaXMgdGlsZS5cbiAgICAgKi9cbiAgICBhYm9ydFRpbGUocGFyYW1zOiBUaWxlUGFyYW1ldGVycywgY2FsbGJhY2s6IFdvcmtlclRpbGVDYWxsYmFjaykge1xuICAgICAgICBjb25zdCBsb2FkaW5nID0gdGhpcy5sb2FkaW5nLFxuICAgICAgICAgICAgdWlkID0gcGFyYW1zLnVpZDtcbiAgICAgICAgaWYgKGxvYWRpbmcgJiYgbG9hZGluZ1t1aWRdICYmIGxvYWRpbmdbdWlkXS5hYm9ydCkge1xuICAgICAgICAgICAgbG9hZGluZ1t1aWRdLmFib3J0KCk7XG4gICAgICAgICAgICBkZWxldGUgbG9hZGluZ1t1aWRdO1xuICAgICAgICB9XG4gICAgICAgIGNhbGxiYWNrKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW1wbGVtZW50cyB7QGxpbmsgV29ya2VyU291cmNlI3JlbW92ZVRpbGV9LlxuICAgICAqXG4gICAgICogQHBhcmFtIHBhcmFtc1xuICAgICAqIEBwYXJhbSBwYXJhbXMudWlkIFRoZSBVSUQgZm9yIHRoaXMgdGlsZS5cbiAgICAgKi9cbiAgICByZW1vdmVUaWxlKHBhcmFtczogVGlsZVBhcmFtZXRlcnMsIGNhbGxiYWNrOiBXb3JrZXJUaWxlQ2FsbGJhY2spIHtcbiAgICAgICAgY29uc3QgbG9hZGVkID0gdGhpcy5sb2FkZWQsXG4gICAgICAgICAgICB1aWQgPSBwYXJhbXMudWlkO1xuICAgICAgICBpZiAobG9hZGVkICYmIGxvYWRlZFt1aWRdKSB7XG4gICAgICAgICAgICBkZWxldGUgbG9hZGVkW3VpZF07XG4gICAgICAgIH1cbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFZlY3RvclRpbGVXb3JrZXJTb3VyY2U7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgREVNRGF0YSBmcm9tICcuLi9kYXRhL2RlbV9kYXRhJztcblxuaW1wb3J0IHR5cGUgQWN0b3IgZnJvbSAnLi4vdXRpbC9hY3Rvcic7XG5pbXBvcnQgdHlwZSB7XG4gICAgV29ya2VyREVNVGlsZVBhcmFtZXRlcnMsXG4gICAgV29ya2VyREVNVGlsZUNhbGxiYWNrLFxuICAgIFRpbGVQYXJhbWV0ZXJzXG59IGZyb20gJy4vd29ya2VyX3NvdXJjZSc7XG5cblxuY2xhc3MgUmFzdGVyREVNVGlsZVdvcmtlclNvdXJjZSB7XG4gICAgYWN0b3I6IEFjdG9yO1xuICAgIGxvYWRlZDoge1tzdHJpbmddOiBERU1EYXRhfTtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmxvYWRlZCA9IHt9O1xuICAgIH1cblxuICAgIGxvYWRUaWxlKHBhcmFtczogV29ya2VyREVNVGlsZVBhcmFtZXRlcnMsIGNhbGxiYWNrOiBXb3JrZXJERU1UaWxlQ2FsbGJhY2spIHtcbiAgICAgICAgY29uc3Qge3VpZCwgZW5jb2RpbmcsIHJhd0ltYWdlRGF0YX0gPSBwYXJhbXM7XG4gICAgICAgIGNvbnN0IGRlbSA9IG5ldyBERU1EYXRhKHVpZCwgcmF3SW1hZ2VEYXRhLCBlbmNvZGluZyk7XG5cbiAgICAgICAgdGhpcy5sb2FkZWQgPSB0aGlzLmxvYWRlZCB8fCB7fTtcbiAgICAgICAgdGhpcy5sb2FkZWRbdWlkXSA9IGRlbTtcbiAgICAgICAgY2FsbGJhY2sobnVsbCwgZGVtKTtcbiAgICB9XG5cbiAgICByZW1vdmVUaWxlKHBhcmFtczogVGlsZVBhcmFtZXRlcnMpIHtcbiAgICAgICAgY29uc3QgbG9hZGVkID0gdGhpcy5sb2FkZWQsXG4gICAgICAgICAgICB1aWQgPSBwYXJhbXMudWlkO1xuICAgICAgICBpZiAobG9hZGVkICYmIGxvYWRlZFt1aWRdKSB7XG4gICAgICAgICAgICBkZWxldGUgbG9hZGVkW3VpZF07XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFJhc3RlckRFTVRpbGVXb3JrZXJTb3VyY2U7XG4iLCJtb2R1bGUuZXhwb3J0cy5SQURJVVMgPSA2Mzc4MTM3O1xubW9kdWxlLmV4cG9ydHMuRkxBVFRFTklORyA9IDEvMjk4LjI1NzIyMzU2Mztcbm1vZHVsZS5leHBvcnRzLlBPTEFSX1JBRElVUyA9IDYzNTY3NTIuMzE0MjtcbiIsInZhciB3Z3M4NCA9IHJlcXVpcmUoJ3dnczg0Jyk7XG5cbm1vZHVsZS5leHBvcnRzLmdlb21ldHJ5ID0gZ2VvbWV0cnk7XG5tb2R1bGUuZXhwb3J0cy5yaW5nID0gcmluZ0FyZWE7XG5cbmZ1bmN0aW9uIGdlb21ldHJ5KF8pIHtcbiAgICB2YXIgYXJlYSA9IDAsIGk7XG4gICAgc3dpdGNoIChfLnR5cGUpIHtcbiAgICAgICAgY2FzZSAnUG9seWdvbic6XG4gICAgICAgICAgICByZXR1cm4gcG9seWdvbkFyZWEoXy5jb29yZGluYXRlcyk7XG4gICAgICAgIGNhc2UgJ011bHRpUG9seWdvbic6XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgXy5jb29yZGluYXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGFyZWEgKz0gcG9seWdvbkFyZWEoXy5jb29yZGluYXRlc1tpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYXJlYTtcbiAgICAgICAgY2FzZSAnUG9pbnQnOlxuICAgICAgICBjYXNlICdNdWx0aVBvaW50JzpcbiAgICAgICAgY2FzZSAnTGluZVN0cmluZyc6XG4gICAgICAgIGNhc2UgJ011bHRpTGluZVN0cmluZyc6XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgY2FzZSAnR2VvbWV0cnlDb2xsZWN0aW9uJzpcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBfLmdlb21ldHJpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBhcmVhICs9IGdlb21ldHJ5KF8uZ2VvbWV0cmllc1tpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYXJlYTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHBvbHlnb25BcmVhKGNvb3Jkcykge1xuICAgIHZhciBhcmVhID0gMDtcbiAgICBpZiAoY29vcmRzICYmIGNvb3Jkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGFyZWEgKz0gTWF0aC5hYnMocmluZ0FyZWEoY29vcmRzWzBdKSk7XG4gICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgY29vcmRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBhcmVhIC09IE1hdGguYWJzKHJpbmdBcmVhKGNvb3Jkc1tpXSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhcmVhO1xufVxuXG4vKipcbiAqIENhbGN1bGF0ZSB0aGUgYXBwcm94aW1hdGUgYXJlYSBvZiB0aGUgcG9seWdvbiB3ZXJlIGl0IHByb2plY3RlZCBvbnRvXG4gKiAgICAgdGhlIGVhcnRoLiAgTm90ZSB0aGF0IHRoaXMgYXJlYSB3aWxsIGJlIHBvc2l0aXZlIGlmIHJpbmcgaXMgb3JpZW50ZWRcbiAqICAgICBjbG9ja3dpc2UsIG90aGVyd2lzZSBpdCB3aWxsIGJlIG5lZ2F0aXZlLlxuICpcbiAqIFJlZmVyZW5jZTpcbiAqIFJvYmVydC4gRy4gQ2hhbWJlcmxhaW4gYW5kIFdpbGxpYW0gSC4gRHVxdWV0dGUsIFwiU29tZSBBbGdvcml0aG1zIGZvclxuICogICAgIFBvbHlnb25zIG9uIGEgU3BoZXJlXCIsIEpQTCBQdWJsaWNhdGlvbiAwNy0wMywgSmV0IFByb3B1bHNpb25cbiAqICAgICBMYWJvcmF0b3J5LCBQYXNhZGVuYSwgQ0EsIEp1bmUgMjAwNyBodHRwOi8vdHJzLW5ldy5qcGwubmFzYS5nb3YvZHNwYWNlL2hhbmRsZS8yMDE0LzQwNDA5XG4gKlxuICogUmV0dXJuczpcbiAqIHtmbG9hdH0gVGhlIGFwcHJveGltYXRlIHNpZ25lZCBnZW9kZXNpYyBhcmVhIG9mIHRoZSBwb2x5Z29uIGluIHNxdWFyZVxuICogICAgIG1ldGVycy5cbiAqL1xuXG5mdW5jdGlvbiByaW5nQXJlYShjb29yZHMpIHtcbiAgICB2YXIgcDEsIHAyLCBwMywgbG93ZXJJbmRleCwgbWlkZGxlSW5kZXgsIHVwcGVySW5kZXgsIGksXG4gICAgYXJlYSA9IDAsXG4gICAgY29vcmRzTGVuZ3RoID0gY29vcmRzLmxlbmd0aDtcblxuICAgIGlmIChjb29yZHNMZW5ndGggPiAyKSB7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb29yZHNMZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGkgPT09IGNvb3Jkc0xlbmd0aCAtIDIpIHsvLyBpID0gTi0yXG4gICAgICAgICAgICAgICAgbG93ZXJJbmRleCA9IGNvb3Jkc0xlbmd0aCAtIDI7XG4gICAgICAgICAgICAgICAgbWlkZGxlSW5kZXggPSBjb29yZHNMZW5ndGggLTE7XG4gICAgICAgICAgICAgICAgdXBwZXJJbmRleCA9IDA7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGkgPT09IGNvb3Jkc0xlbmd0aCAtIDEpIHsvLyBpID0gTi0xXG4gICAgICAgICAgICAgICAgbG93ZXJJbmRleCA9IGNvb3Jkc0xlbmd0aCAtIDE7XG4gICAgICAgICAgICAgICAgbWlkZGxlSW5kZXggPSAwO1xuICAgICAgICAgICAgICAgIHVwcGVySW5kZXggPSAxO1xuICAgICAgICAgICAgfSBlbHNlIHsgLy8gaSA9IDAgdG8gTi0zXG4gICAgICAgICAgICAgICAgbG93ZXJJbmRleCA9IGk7XG4gICAgICAgICAgICAgICAgbWlkZGxlSW5kZXggPSBpKzE7XG4gICAgICAgICAgICAgICAgdXBwZXJJbmRleCA9IGkrMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHAxID0gY29vcmRzW2xvd2VySW5kZXhdO1xuICAgICAgICAgICAgcDIgPSBjb29yZHNbbWlkZGxlSW5kZXhdO1xuICAgICAgICAgICAgcDMgPSBjb29yZHNbdXBwZXJJbmRleF07XG4gICAgICAgICAgICBhcmVhICs9ICggcmFkKHAzWzBdKSAtIHJhZChwMVswXSkgKSAqIE1hdGguc2luKCByYWQocDJbMV0pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGFyZWEgPSBhcmVhICogd2dzODQuUkFESVVTICogd2dzODQuUkFESVVTIC8gMjtcbiAgICB9XG5cbiAgICByZXR1cm4gYXJlYTtcbn1cblxuZnVuY3Rpb24gcmFkKF8pIHtcbiAgICByZXR1cm4gXyAqIE1hdGguUEkgLyAxODA7XG59IiwidmFyIGdlb2pzb25BcmVhID0gcmVxdWlyZSgnQG1hcGJveC9nZW9qc29uLWFyZWEnKTtcblxubW9kdWxlLmV4cG9ydHMgPSByZXdpbmQ7XG5cbmZ1bmN0aW9uIHJld2luZChnaiwgb3V0ZXIpIHtcbiAgICBzd2l0Y2ggKChnaiAmJiBnai50eXBlKSB8fCBudWxsKSB7XG4gICAgICAgIGNhc2UgJ0ZlYXR1cmVDb2xsZWN0aW9uJzpcbiAgICAgICAgICAgIGdqLmZlYXR1cmVzID0gZ2ouZmVhdHVyZXMubWFwKGN1cnJ5T3V0ZXIocmV3aW5kLCBvdXRlcikpO1xuICAgICAgICAgICAgcmV0dXJuIGdqO1xuICAgICAgICBjYXNlICdHZW9tZXRyeUNvbGxlY3Rpb24nOlxuICAgICAgICAgICAgZ2ouZ2VvbWV0cmllcyA9IGdqLmdlb21ldHJpZXMubWFwKGN1cnJ5T3V0ZXIocmV3aW5kLCBvdXRlcikpO1xuICAgICAgICAgICAgcmV0dXJuIGdqO1xuICAgICAgICBjYXNlICdGZWF0dXJlJzpcbiAgICAgICAgICAgIGdqLmdlb21ldHJ5ID0gcmV3aW5kKGdqLmdlb21ldHJ5LCBvdXRlcik7XG4gICAgICAgICAgICByZXR1cm4gZ2o7XG4gICAgICAgIGNhc2UgJ1BvbHlnb24nOlxuICAgICAgICBjYXNlICdNdWx0aVBvbHlnb24nOlxuICAgICAgICAgICAgcmV0dXJuIGNvcnJlY3QoZ2osIG91dGVyKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBnajtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGN1cnJ5T3V0ZXIoYSwgYikge1xuICAgIHJldHVybiBmdW5jdGlvbihfKSB7IHJldHVybiBhKF8sIGIpOyB9O1xufVxuXG5mdW5jdGlvbiBjb3JyZWN0KF8sIG91dGVyKSB7XG4gICAgaWYgKF8udHlwZSA9PT0gJ1BvbHlnb24nKSB7XG4gICAgICAgIF8uY29vcmRpbmF0ZXMgPSBjb3JyZWN0UmluZ3MoXy5jb29yZGluYXRlcywgb3V0ZXIpO1xuICAgIH0gZWxzZSBpZiAoXy50eXBlID09PSAnTXVsdGlQb2x5Z29uJykge1xuICAgICAgICBfLmNvb3JkaW5hdGVzID0gXy5jb29yZGluYXRlcy5tYXAoY3VycnlPdXRlcihjb3JyZWN0UmluZ3MsIG91dGVyKSk7XG4gICAgfVxuICAgIHJldHVybiBfO1xufVxuXG5mdW5jdGlvbiBjb3JyZWN0UmluZ3MoXywgb3V0ZXIpIHtcbiAgICBvdXRlciA9ICEhb3V0ZXI7XG4gICAgX1swXSA9IHdpbmQoX1swXSwgb3V0ZXIpO1xuICAgIGZvciAodmFyIGkgPSAxOyBpIDwgXy5sZW5ndGg7IGkrKykge1xuICAgICAgICBfW2ldID0gd2luZChfW2ldLCAhb3V0ZXIpO1xuICAgIH1cbiAgICByZXR1cm4gXztcbn1cblxuZnVuY3Rpb24gd2luZChfLCBkaXIpIHtcbiAgICByZXR1cm4gY3coXykgPT09IGRpciA/IF8gOiBfLnJldmVyc2UoKTtcbn1cblxuZnVuY3Rpb24gY3coXykge1xuICAgIHJldHVybiBnZW9qc29uQXJlYS5yaW5nKF8pID49IDA7XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgUG9pbnQgZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XG5cbmltcG9ydCBtdnQgZnJvbSAnQG1hcGJveC92ZWN0b3ItdGlsZSc7XG5jb25zdCB0b0dlb0pTT04gPSBtdnQuVmVjdG9yVGlsZUZlYXR1cmUucHJvdG90eXBlLnRvR2VvSlNPTjtcbmltcG9ydCBFWFRFTlQgZnJvbSAnLi4vZGF0YS9leHRlbnQnO1xuXG4vLyBUaGUgZmVhdHVyZSB0eXBlIHVzZWQgYnkgZ2VvanNvbi12dCBhbmQgc3VwZXJjbHVzdGVyLiBTaG91bGQgYmUgZXh0cmFjdGVkIHRvXG4vLyBnbG9iYWwgdHlwZSBhbmQgdXNlZCBpbiBtb2R1bGUgZGVmaW5pdGlvbnMgZm9yIHRob3NlIHR3byBtb2R1bGVzLlxudHlwZSBGZWF0dXJlID0ge1xuICAgIHR5cGU6IDEsXG4gICAgaWQ6IG1peGVkLFxuICAgIHRhZ3M6IHtbc3RyaW5nXTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbn0sXG4gICAgZ2VvbWV0cnk6IEFycmF5PFtudW1iZXIsIG51bWJlcl0+LFxufSB8IHtcbiAgICB0eXBlOiAyIHwgMyxcbiAgICBpZDogbWl4ZWQsXG4gICAgdGFnczoge1tzdHJpbmddOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFufSxcbiAgICBnZW9tZXRyeTogQXJyYXk8QXJyYXk8W251bWJlciwgbnVtYmVyXT4+LFxufVxuXG5jbGFzcyBGZWF0dXJlV3JhcHBlciBpbXBsZW1lbnRzIFZlY3RvclRpbGVGZWF0dXJlIHtcbiAgICBfZmVhdHVyZTogRmVhdHVyZTtcblxuICAgIGV4dGVudDogbnVtYmVyO1xuICAgIHR5cGU6IDEgfCAyIHwgMztcbiAgICBpZDogbnVtYmVyO1xuICAgIHByb3BlcnRpZXM6IHtbc3RyaW5nXTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbn07XG5cbiAgICBjb25zdHJ1Y3RvcihmZWF0dXJlOiBGZWF0dXJlKSB7XG4gICAgICAgIHRoaXMuX2ZlYXR1cmUgPSBmZWF0dXJlO1xuXG4gICAgICAgIHRoaXMuZXh0ZW50ID0gRVhURU5UO1xuICAgICAgICB0aGlzLnR5cGUgPSBmZWF0dXJlLnR5cGU7XG4gICAgICAgIHRoaXMucHJvcGVydGllcyA9IGZlYXR1cmUudGFncztcblxuICAgICAgICAvLyBJZiB0aGUgZmVhdHVyZSBoYXMgYSB0b3AtbGV2ZWwgYGlkYCBwcm9wZXJ0eSwgY29weSBpdCBvdmVyLCBidXQgb25seVxuICAgICAgICAvLyBpZiBpdCBjYW4gYmUgY29lcmNlZCB0byBhbiBpbnRlZ2VyLCBiZWNhdXNlIHRoaXMgd3JhcHBlciBpcyB1c2VkIGZvclxuICAgICAgICAvLyBzZXJpYWxpemluZyBnZW9qc29uIGZlYXR1cmUgZGF0YSBpbnRvIHZlY3RvciB0aWxlIFBCRiBkYXRhLCBhbmQgdGhlXG4gICAgICAgIC8vIHZlY3RvciB0aWxlIHNwZWMgb25seSBzdXBwb3J0cyBpbnRlZ2VyIHZhbHVlcyBmb3IgZmVhdHVyZSBpZHMgLS1cbiAgICAgICAgLy8gYWxsb3dpbmcgbm9uLWludGVnZXIgdmFsdWVzIGhlcmUgcmVzdWx0cyBpbiBhIG5vbi1jb21wbGlhbnQgUEJGXG4gICAgICAgIC8vIHRoYXQgY2F1c2VzIGFuIGV4Y2VwdGlvbiB3aGVuIGl0IGlzIHBhcnNlZCB3aXRoIHZlY3Rvci10aWxlLWpzXG4gICAgICAgIGlmICgnaWQnIGluIGZlYXR1cmUgJiYgIWlzTmFOKGZlYXR1cmUuaWQpKSB7XG4gICAgICAgICAgICB0aGlzLmlkID0gcGFyc2VJbnQoZmVhdHVyZS5pZCwgMTApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbG9hZEdlb21ldHJ5KCkge1xuICAgICAgICBpZiAodGhpcy5fZmVhdHVyZS50eXBlID09PSAxKSB7XG4gICAgICAgICAgICBjb25zdCBnZW9tZXRyeSA9IFtdO1xuICAgICAgICAgICAgZm9yIChjb25zdCBwb2ludCBvZiB0aGlzLl9mZWF0dXJlLmdlb21ldHJ5KSB7XG4gICAgICAgICAgICAgICAgZ2VvbWV0cnkucHVzaChbbmV3IFBvaW50KHBvaW50WzBdLCBwb2ludFsxXSldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBnZW9tZXRyeTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGdlb21ldHJ5ID0gW107XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHJpbmcgb2YgdGhpcy5fZmVhdHVyZS5nZW9tZXRyeSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5ld1JpbmcgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHBvaW50IG9mIHJpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3UmluZy5wdXNoKG5ldyBQb2ludChwb2ludFswXSwgcG9pbnRbMV0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZ2VvbWV0cnkucHVzaChuZXdSaW5nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBnZW9tZXRyeTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHRvR2VvSlNPTih4OiBudW1iZXIsIHk6IG51bWJlciwgejogbnVtYmVyKSB7XG4gICAgICAgIHJldHVybiB0b0dlb0pTT04uY2FsbCh0aGlzLCB4LCB5LCB6KTtcbiAgICB9XG59XG5cbmNsYXNzIEdlb0pTT05XcmFwcGVyIGltcGxlbWVudHMgVmVjdG9yVGlsZSwgVmVjdG9yVGlsZUxheWVyIHtcbiAgICBsYXllcnM6IHtbc3RyaW5nXTogVmVjdG9yVGlsZUxheWVyfTtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgZXh0ZW50OiBudW1iZXI7XG4gICAgbGVuZ3RoOiBudW1iZXI7XG4gICAgX2ZlYXR1cmVzOiBBcnJheTxGZWF0dXJlPjtcblxuICAgIGNvbnN0cnVjdG9yKGZlYXR1cmVzOiBBcnJheTxGZWF0dXJlPikge1xuICAgICAgICB0aGlzLmxheWVycyA9IHsgJ19nZW9qc29uVGlsZUxheWVyJzogdGhpcyB9O1xuICAgICAgICB0aGlzLm5hbWUgPSAnX2dlb2pzb25UaWxlTGF5ZXInO1xuICAgICAgICB0aGlzLmV4dGVudCA9IEVYVEVOVDtcbiAgICAgICAgdGhpcy5sZW5ndGggPSBmZWF0dXJlcy5sZW5ndGg7XG4gICAgICAgIHRoaXMuX2ZlYXR1cmVzID0gZmVhdHVyZXM7XG4gICAgfVxuXG4gICAgZmVhdHVyZShpOiBudW1iZXIpOiBWZWN0b3JUaWxlRmVhdHVyZSB7XG4gICAgICAgIHJldHVybiBuZXcgRmVhdHVyZVdyYXBwZXIodGhpcy5fZmVhdHVyZXNbaV0pO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgR2VvSlNPTldyYXBwZXI7XG4iLCIndXNlIHN0cmljdCdcblxudmFyIFBvaW50ID0gcmVxdWlyZSgnQG1hcGJveC9wb2ludC1nZW9tZXRyeScpXG52YXIgVmVjdG9yVGlsZUZlYXR1cmUgPSByZXF1aXJlKCdAbWFwYm94L3ZlY3Rvci10aWxlJykuVmVjdG9yVGlsZUZlYXR1cmVcblxubW9kdWxlLmV4cG9ydHMgPSBHZW9KU09OV3JhcHBlclxuXG4vLyBjb25mb3JtIHRvIHZlY3RvcnRpbGUgYXBpXG5mdW5jdGlvbiBHZW9KU09OV3JhcHBlciAoZmVhdHVyZXMsIG9wdGlvbnMpIHtcbiAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7fVxuICB0aGlzLmZlYXR1cmVzID0gZmVhdHVyZXNcbiAgdGhpcy5sZW5ndGggPSBmZWF0dXJlcy5sZW5ndGhcbn1cblxuR2VvSlNPTldyYXBwZXIucHJvdG90eXBlLmZlYXR1cmUgPSBmdW5jdGlvbiAoaSkge1xuICByZXR1cm4gbmV3IEZlYXR1cmVXcmFwcGVyKHRoaXMuZmVhdHVyZXNbaV0sIHRoaXMub3B0aW9ucy5leHRlbnQpXG59XG5cbmZ1bmN0aW9uIEZlYXR1cmVXcmFwcGVyIChmZWF0dXJlLCBleHRlbnQpIHtcbiAgdGhpcy5pZCA9IHR5cGVvZiBmZWF0dXJlLmlkID09PSAnbnVtYmVyJyA/IGZlYXR1cmUuaWQgOiB1bmRlZmluZWRcbiAgdGhpcy50eXBlID0gZmVhdHVyZS50eXBlXG4gIHRoaXMucmF3R2VvbWV0cnkgPSBmZWF0dXJlLnR5cGUgPT09IDEgPyBbZmVhdHVyZS5nZW9tZXRyeV0gOiBmZWF0dXJlLmdlb21ldHJ5XG4gIHRoaXMucHJvcGVydGllcyA9IGZlYXR1cmUudGFnc1xuICB0aGlzLmV4dGVudCA9IGV4dGVudCB8fCA0MDk2XG59XG5cbkZlYXR1cmVXcmFwcGVyLnByb3RvdHlwZS5sb2FkR2VvbWV0cnkgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciByaW5ncyA9IHRoaXMucmF3R2VvbWV0cnlcbiAgdGhpcy5nZW9tZXRyeSA9IFtdXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCByaW5ncy5sZW5ndGg7IGkrKykge1xuICAgIHZhciByaW5nID0gcmluZ3NbaV1cbiAgICB2YXIgbmV3UmluZyA9IFtdXG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCByaW5nLmxlbmd0aDsgaisrKSB7XG4gICAgICBuZXdSaW5nLnB1c2gobmV3IFBvaW50KHJpbmdbal1bMF0sIHJpbmdbal1bMV0pKVxuICAgIH1cbiAgICB0aGlzLmdlb21ldHJ5LnB1c2gobmV3UmluZylcbiAgfVxuICByZXR1cm4gdGhpcy5nZW9tZXRyeVxufVxuXG5GZWF0dXJlV3JhcHBlci5wcm90b3R5cGUuYmJveCA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKCF0aGlzLmdlb21ldHJ5KSB0aGlzLmxvYWRHZW9tZXRyeSgpXG5cbiAgdmFyIHJpbmdzID0gdGhpcy5nZW9tZXRyeVxuICB2YXIgeDEgPSBJbmZpbml0eVxuICB2YXIgeDIgPSAtSW5maW5pdHlcbiAgdmFyIHkxID0gSW5maW5pdHlcbiAgdmFyIHkyID0gLUluZmluaXR5XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCByaW5ncy5sZW5ndGg7IGkrKykge1xuICAgIHZhciByaW5nID0gcmluZ3NbaV1cblxuICAgIGZvciAodmFyIGogPSAwOyBqIDwgcmluZy5sZW5ndGg7IGorKykge1xuICAgICAgdmFyIGNvb3JkID0gcmluZ1tqXVxuXG4gICAgICB4MSA9IE1hdGgubWluKHgxLCBjb29yZC54KVxuICAgICAgeDIgPSBNYXRoLm1heCh4MiwgY29vcmQueClcbiAgICAgIHkxID0gTWF0aC5taW4oeTEsIGNvb3JkLnkpXG4gICAgICB5MiA9IE1hdGgubWF4KHkyLCBjb29yZC55KVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBbeDEsIHkxLCB4MiwgeTJdXG59XG5cbkZlYXR1cmVXcmFwcGVyLnByb3RvdHlwZS50b0dlb0pTT04gPSBWZWN0b3JUaWxlRmVhdHVyZS5wcm90b3R5cGUudG9HZW9KU09OXG4iLCJ2YXIgUGJmID0gcmVxdWlyZSgncGJmJylcbnZhciBHZW9KU09OV3JhcHBlciA9IHJlcXVpcmUoJy4vbGliL2dlb2pzb25fd3JhcHBlcicpXG5cbm1vZHVsZS5leHBvcnRzID0gZnJvbVZlY3RvclRpbGVKc1xubW9kdWxlLmV4cG9ydHMuZnJvbVZlY3RvclRpbGVKcyA9IGZyb21WZWN0b3JUaWxlSnNcbm1vZHVsZS5leHBvcnRzLmZyb21HZW9qc29uVnQgPSBmcm9tR2VvanNvblZ0XG5tb2R1bGUuZXhwb3J0cy5HZW9KU09OV3JhcHBlciA9IEdlb0pTT05XcmFwcGVyXG5cbi8qKlxuICogU2VyaWFsaXplIGEgdmVjdG9yLXRpbGUtanMtY3JlYXRlZCB0aWxlIHRvIHBiZlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB0aWxlXG4gKiBAcmV0dXJuIHtCdWZmZXJ9IHVuY29tcHJlc3NlZCwgcGJmLXNlcmlhbGl6ZWQgdGlsZSBkYXRhXG4gKi9cbmZ1bmN0aW9uIGZyb21WZWN0b3JUaWxlSnMgKHRpbGUpIHtcbiAgdmFyIG91dCA9IG5ldyBQYmYoKVxuICB3cml0ZVRpbGUodGlsZSwgb3V0KVxuICByZXR1cm4gb3V0LmZpbmlzaCgpXG59XG5cbi8qKlxuICogU2VyaWFsaXplZCBhIGdlb2pzb24tdnQtY3JlYXRlZCB0aWxlIHRvIHBiZi5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gbGF5ZXJzIC0gQW4gb2JqZWN0IG1hcHBpbmcgbGF5ZXIgbmFtZXMgdG8gZ2VvanNvbi12dC1jcmVhdGVkIHZlY3RvciB0aWxlIG9iamVjdHNcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gLSBBbiBvYmplY3Qgc3BlY2lmeWluZyB0aGUgdmVjdG9yLXRpbGUgc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGFuZCBleHRlbnQgdGhhdCB3ZXJlIHVzZWQgdG8gY3JlYXRlIGBsYXllcnNgLlxuICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLnZlcnNpb249MV0gLSBWZXJzaW9uIG9mIHZlY3Rvci10aWxlIHNwZWMgdXNlZFxuICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmV4dGVudD00MDk2XSAtIEV4dGVudCBvZiB0aGUgdmVjdG9yIHRpbGVcbiAqIEByZXR1cm4ge0J1ZmZlcn0gdW5jb21wcmVzc2VkLCBwYmYtc2VyaWFsaXplZCB0aWxlIGRhdGFcbiAqL1xuZnVuY3Rpb24gZnJvbUdlb2pzb25WdCAobGF5ZXJzLCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9XG4gIHZhciBsID0ge31cbiAgZm9yICh2YXIgayBpbiBsYXllcnMpIHtcbiAgICBsW2tdID0gbmV3IEdlb0pTT05XcmFwcGVyKGxheWVyc1trXS5mZWF0dXJlcywgb3B0aW9ucylcbiAgICBsW2tdLm5hbWUgPSBrXG4gICAgbFtrXS52ZXJzaW9uID0gb3B0aW9ucy52ZXJzaW9uXG4gICAgbFtrXS5leHRlbnQgPSBvcHRpb25zLmV4dGVudFxuICB9XG4gIHJldHVybiBmcm9tVmVjdG9yVGlsZUpzKHtsYXllcnM6IGx9KVxufVxuXG5mdW5jdGlvbiB3cml0ZVRpbGUgKHRpbGUsIHBiZikge1xuICBmb3IgKHZhciBrZXkgaW4gdGlsZS5sYXllcnMpIHtcbiAgICBwYmYud3JpdGVNZXNzYWdlKDMsIHdyaXRlTGF5ZXIsIHRpbGUubGF5ZXJzW2tleV0pXG4gIH1cbn1cblxuZnVuY3Rpb24gd3JpdGVMYXllciAobGF5ZXIsIHBiZikge1xuICBwYmYud3JpdGVWYXJpbnRGaWVsZCgxNSwgbGF5ZXIudmVyc2lvbiB8fCAxKVxuICBwYmYud3JpdGVTdHJpbmdGaWVsZCgxLCBsYXllci5uYW1lIHx8ICcnKVxuICBwYmYud3JpdGVWYXJpbnRGaWVsZCg1LCBsYXllci5leHRlbnQgfHwgNDA5NilcblxuICB2YXIgaVxuICB2YXIgY29udGV4dCA9IHtcbiAgICBrZXlzOiBbXSxcbiAgICB2YWx1ZXM6IFtdLFxuICAgIGtleWNhY2hlOiB7fSxcbiAgICB2YWx1ZWNhY2hlOiB7fVxuICB9XG5cbiAgZm9yIChpID0gMDsgaSA8IGxheWVyLmxlbmd0aDsgaSsrKSB7XG4gICAgY29udGV4dC5mZWF0dXJlID0gbGF5ZXIuZmVhdHVyZShpKVxuICAgIHBiZi53cml0ZU1lc3NhZ2UoMiwgd3JpdGVGZWF0dXJlLCBjb250ZXh0KVxuICB9XG5cbiAgdmFyIGtleXMgPSBjb250ZXh0LmtleXNcbiAgZm9yIChpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICBwYmYud3JpdGVTdHJpbmdGaWVsZCgzLCBrZXlzW2ldKVxuICB9XG5cbiAgdmFyIHZhbHVlcyA9IGNvbnRleHQudmFsdWVzXG4gIGZvciAoaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICBwYmYud3JpdGVNZXNzYWdlKDQsIHdyaXRlVmFsdWUsIHZhbHVlc1tpXSlcbiAgfVxufVxuXG5mdW5jdGlvbiB3cml0ZUZlYXR1cmUgKGNvbnRleHQsIHBiZikge1xuICB2YXIgZmVhdHVyZSA9IGNvbnRleHQuZmVhdHVyZVxuXG4gIGlmIChmZWF0dXJlLmlkICE9PSB1bmRlZmluZWQpIHtcbiAgICBwYmYud3JpdGVWYXJpbnRGaWVsZCgxLCBmZWF0dXJlLmlkKVxuICB9XG5cbiAgcGJmLndyaXRlTWVzc2FnZSgyLCB3cml0ZVByb3BlcnRpZXMsIGNvbnRleHQpXG4gIHBiZi53cml0ZVZhcmludEZpZWxkKDMsIGZlYXR1cmUudHlwZSlcbiAgcGJmLndyaXRlTWVzc2FnZSg0LCB3cml0ZUdlb21ldHJ5LCBmZWF0dXJlKVxufVxuXG5mdW5jdGlvbiB3cml0ZVByb3BlcnRpZXMgKGNvbnRleHQsIHBiZikge1xuICB2YXIgZmVhdHVyZSA9IGNvbnRleHQuZmVhdHVyZVxuICB2YXIga2V5cyA9IGNvbnRleHQua2V5c1xuICB2YXIgdmFsdWVzID0gY29udGV4dC52YWx1ZXNcbiAgdmFyIGtleWNhY2hlID0gY29udGV4dC5rZXljYWNoZVxuICB2YXIgdmFsdWVjYWNoZSA9IGNvbnRleHQudmFsdWVjYWNoZVxuXG4gIGZvciAodmFyIGtleSBpbiBmZWF0dXJlLnByb3BlcnRpZXMpIHtcbiAgICB2YXIga2V5SW5kZXggPSBrZXljYWNoZVtrZXldXG4gICAgaWYgKHR5cGVvZiBrZXlJbmRleCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGtleXMucHVzaChrZXkpXG4gICAgICBrZXlJbmRleCA9IGtleXMubGVuZ3RoIC0gMVxuICAgICAga2V5Y2FjaGVba2V5XSA9IGtleUluZGV4XG4gICAgfVxuICAgIHBiZi53cml0ZVZhcmludChrZXlJbmRleClcblxuICAgIHZhciB2YWx1ZSA9IGZlYXR1cmUucHJvcGVydGllc1trZXldXG4gICAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWVcbiAgICBpZiAodHlwZSAhPT0gJ3N0cmluZycgJiYgdHlwZSAhPT0gJ2Jvb2xlYW4nICYmIHR5cGUgIT09ICdudW1iZXInKSB7XG4gICAgICB2YWx1ZSA9IEpTT04uc3RyaW5naWZ5KHZhbHVlKVxuICAgIH1cbiAgICB2YXIgdmFsdWVLZXkgPSB0eXBlICsgJzonICsgdmFsdWVcbiAgICB2YXIgdmFsdWVJbmRleCA9IHZhbHVlY2FjaGVbdmFsdWVLZXldXG4gICAgaWYgKHR5cGVvZiB2YWx1ZUluZGV4ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdmFsdWVzLnB1c2godmFsdWUpXG4gICAgICB2YWx1ZUluZGV4ID0gdmFsdWVzLmxlbmd0aCAtIDFcbiAgICAgIHZhbHVlY2FjaGVbdmFsdWVLZXldID0gdmFsdWVJbmRleFxuICAgIH1cbiAgICBwYmYud3JpdGVWYXJpbnQodmFsdWVJbmRleClcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21tYW5kIChjbWQsIGxlbmd0aCkge1xuICByZXR1cm4gKGxlbmd0aCA8PCAzKSArIChjbWQgJiAweDcpXG59XG5cbmZ1bmN0aW9uIHppZ3phZyAobnVtKSB7XG4gIHJldHVybiAobnVtIDw8IDEpIF4gKG51bSA+PiAzMSlcbn1cblxuZnVuY3Rpb24gd3JpdGVHZW9tZXRyeSAoZmVhdHVyZSwgcGJmKSB7XG4gIHZhciBnZW9tZXRyeSA9IGZlYXR1cmUubG9hZEdlb21ldHJ5KClcbiAgdmFyIHR5cGUgPSBmZWF0dXJlLnR5cGVcbiAgdmFyIHggPSAwXG4gIHZhciB5ID0gMFxuICB2YXIgcmluZ3MgPSBnZW9tZXRyeS5sZW5ndGhcbiAgZm9yICh2YXIgciA9IDA7IHIgPCByaW5nczsgcisrKSB7XG4gICAgdmFyIHJpbmcgPSBnZW9tZXRyeVtyXVxuICAgIHZhciBjb3VudCA9IDFcbiAgICBpZiAodHlwZSA9PT0gMSkge1xuICAgICAgY291bnQgPSByaW5nLmxlbmd0aFxuICAgIH1cbiAgICBwYmYud3JpdGVWYXJpbnQoY29tbWFuZCgxLCBjb3VudCkpIC8vIG1vdmV0b1xuICAgIC8vIGRvIG5vdCB3cml0ZSBwb2x5Z29uIGNsb3NpbmcgcGF0aCBhcyBsaW5ldG9cbiAgICB2YXIgbGluZUNvdW50ID0gdHlwZSA9PT0gMyA/IHJpbmcubGVuZ3RoIC0gMSA6IHJpbmcubGVuZ3RoXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaW5lQ291bnQ7IGkrKykge1xuICAgICAgaWYgKGkgPT09IDEgJiYgdHlwZSAhPT0gMSkge1xuICAgICAgICBwYmYud3JpdGVWYXJpbnQoY29tbWFuZCgyLCBsaW5lQ291bnQgLSAxKSkgLy8gbGluZXRvXG4gICAgICB9XG4gICAgICB2YXIgZHggPSByaW5nW2ldLnggLSB4XG4gICAgICB2YXIgZHkgPSByaW5nW2ldLnkgLSB5XG4gICAgICBwYmYud3JpdGVWYXJpbnQoemlnemFnKGR4KSlcbiAgICAgIHBiZi53cml0ZVZhcmludCh6aWd6YWcoZHkpKVxuICAgICAgeCArPSBkeFxuICAgICAgeSArPSBkeVxuICAgIH1cbiAgICBpZiAodHlwZSA9PT0gMykge1xuICAgICAgcGJmLndyaXRlVmFyaW50KGNvbW1hbmQoNywgMSkpIC8vIGNsb3NlcGF0aFxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB3cml0ZVZhbHVlICh2YWx1ZSwgcGJmKSB7XG4gIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlXG4gIGlmICh0eXBlID09PSAnc3RyaW5nJykge1xuICAgIHBiZi53cml0ZVN0cmluZ0ZpZWxkKDEsIHZhbHVlKVxuICB9IGVsc2UgaWYgKHR5cGUgPT09ICdib29sZWFuJykge1xuICAgIHBiZi53cml0ZUJvb2xlYW5GaWVsZCg3LCB2YWx1ZSlcbiAgfSBlbHNlIGlmICh0eXBlID09PSAnbnVtYmVyJykge1xuICAgIGlmICh2YWx1ZSAlIDEgIT09IDApIHtcbiAgICAgIHBiZi53cml0ZURvdWJsZUZpZWxkKDMsIHZhbHVlKVxuICAgIH0gZWxzZSBpZiAodmFsdWUgPCAwKSB7XG4gICAgICBwYmYud3JpdGVTVmFyaW50RmllbGQoNiwgdmFsdWUpXG4gICAgfSBlbHNlIHtcbiAgICAgIHBiZi53cml0ZVZhcmludEZpZWxkKDUsIHZhbHVlKVxuICAgIH1cbiAgfVxufVxuIiwiXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzb3J0S0QoaWRzLCBjb29yZHMsIG5vZGVTaXplLCBsZWZ0LCByaWdodCwgZGVwdGgpIHtcbiAgICBpZiAocmlnaHQgLSBsZWZ0IDw9IG5vZGVTaXplKSByZXR1cm47XG5cbiAgICBjb25zdCBtID0gKGxlZnQgKyByaWdodCkgPj4gMTtcblxuICAgIHNlbGVjdChpZHMsIGNvb3JkcywgbSwgbGVmdCwgcmlnaHQsIGRlcHRoICUgMik7XG5cbiAgICBzb3J0S0QoaWRzLCBjb29yZHMsIG5vZGVTaXplLCBsZWZ0LCBtIC0gMSwgZGVwdGggKyAxKTtcbiAgICBzb3J0S0QoaWRzLCBjb29yZHMsIG5vZGVTaXplLCBtICsgMSwgcmlnaHQsIGRlcHRoICsgMSk7XG59XG5cbmZ1bmN0aW9uIHNlbGVjdChpZHMsIGNvb3JkcywgaywgbGVmdCwgcmlnaHQsIGluYykge1xuXG4gICAgd2hpbGUgKHJpZ2h0ID4gbGVmdCkge1xuICAgICAgICBpZiAocmlnaHQgLSBsZWZ0ID4gNjAwKSB7XG4gICAgICAgICAgICBjb25zdCBuID0gcmlnaHQgLSBsZWZ0ICsgMTtcbiAgICAgICAgICAgIGNvbnN0IG0gPSBrIC0gbGVmdCArIDE7XG4gICAgICAgICAgICBjb25zdCB6ID0gTWF0aC5sb2cobik7XG4gICAgICAgICAgICBjb25zdCBzID0gMC41ICogTWF0aC5leHAoMiAqIHogLyAzKTtcbiAgICAgICAgICAgIGNvbnN0IHNkID0gMC41ICogTWF0aC5zcXJ0KHogKiBzICogKG4gLSBzKSAvIG4pICogKG0gLSBuIC8gMiA8IDAgPyAtMSA6IDEpO1xuICAgICAgICAgICAgY29uc3QgbmV3TGVmdCA9IE1hdGgubWF4KGxlZnQsIE1hdGguZmxvb3IoayAtIG0gKiBzIC8gbiArIHNkKSk7XG4gICAgICAgICAgICBjb25zdCBuZXdSaWdodCA9IE1hdGgubWluKHJpZ2h0LCBNYXRoLmZsb29yKGsgKyAobiAtIG0pICogcyAvIG4gKyBzZCkpO1xuICAgICAgICAgICAgc2VsZWN0KGlkcywgY29vcmRzLCBrLCBuZXdMZWZ0LCBuZXdSaWdodCwgaW5jKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHQgPSBjb29yZHNbMiAqIGsgKyBpbmNdO1xuICAgICAgICBsZXQgaSA9IGxlZnQ7XG4gICAgICAgIGxldCBqID0gcmlnaHQ7XG5cbiAgICAgICAgc3dhcEl0ZW0oaWRzLCBjb29yZHMsIGxlZnQsIGspO1xuICAgICAgICBpZiAoY29vcmRzWzIgKiByaWdodCArIGluY10gPiB0KSBzd2FwSXRlbShpZHMsIGNvb3JkcywgbGVmdCwgcmlnaHQpO1xuXG4gICAgICAgIHdoaWxlIChpIDwgaikge1xuICAgICAgICAgICAgc3dhcEl0ZW0oaWRzLCBjb29yZHMsIGksIGopO1xuICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgai0tO1xuICAgICAgICAgICAgd2hpbGUgKGNvb3Jkc1syICogaSArIGluY10gPCB0KSBpKys7XG4gICAgICAgICAgICB3aGlsZSAoY29vcmRzWzIgKiBqICsgaW5jXSA+IHQpIGotLTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb29yZHNbMiAqIGxlZnQgKyBpbmNdID09PSB0KSBzd2FwSXRlbShpZHMsIGNvb3JkcywgbGVmdCwgaik7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaisrO1xuICAgICAgICAgICAgc3dhcEl0ZW0oaWRzLCBjb29yZHMsIGosIHJpZ2h0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChqIDw9IGspIGxlZnQgPSBqICsgMTtcbiAgICAgICAgaWYgKGsgPD0gaikgcmlnaHQgPSBqIC0gMTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHN3YXBJdGVtKGlkcywgY29vcmRzLCBpLCBqKSB7XG4gICAgc3dhcChpZHMsIGksIGopO1xuICAgIHN3YXAoY29vcmRzLCAyICogaSwgMiAqIGopO1xuICAgIHN3YXAoY29vcmRzLCAyICogaSArIDEsIDIgKiBqICsgMSk7XG59XG5cbmZ1bmN0aW9uIHN3YXAoYXJyLCBpLCBqKSB7XG4gICAgY29uc3QgdG1wID0gYXJyW2ldO1xuICAgIGFycltpXSA9IGFycltqXTtcbiAgICBhcnJbal0gPSB0bXA7XG59XG4iLCJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJhbmdlKGlkcywgY29vcmRzLCBtaW5YLCBtaW5ZLCBtYXhYLCBtYXhZLCBub2RlU2l6ZSkge1xuICAgIGNvbnN0IHN0YWNrID0gWzAsIGlkcy5sZW5ndGggLSAxLCAwXTtcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICBsZXQgeCwgeTtcblxuICAgIHdoaWxlIChzdGFjay5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgYXhpcyA9IHN0YWNrLnBvcCgpO1xuICAgICAgICBjb25zdCByaWdodCA9IHN0YWNrLnBvcCgpO1xuICAgICAgICBjb25zdCBsZWZ0ID0gc3RhY2sucG9wKCk7XG5cbiAgICAgICAgaWYgKHJpZ2h0IC0gbGVmdCA8PSBub2RlU2l6ZSkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IGxlZnQ7IGkgPD0gcmlnaHQ7IGkrKykge1xuICAgICAgICAgICAgICAgIHggPSBjb29yZHNbMiAqIGldO1xuICAgICAgICAgICAgICAgIHkgPSBjb29yZHNbMiAqIGkgKyAxXTtcbiAgICAgICAgICAgICAgICBpZiAoeCA+PSBtaW5YICYmIHggPD0gbWF4WCAmJiB5ID49IG1pblkgJiYgeSA8PSBtYXhZKSByZXN1bHQucHVzaChpZHNbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtID0gTWF0aC5mbG9vcigobGVmdCArIHJpZ2h0KSAvIDIpO1xuXG4gICAgICAgIHggPSBjb29yZHNbMiAqIG1dO1xuICAgICAgICB5ID0gY29vcmRzWzIgKiBtICsgMV07XG5cbiAgICAgICAgaWYgKHggPj0gbWluWCAmJiB4IDw9IG1heFggJiYgeSA+PSBtaW5ZICYmIHkgPD0gbWF4WSkgcmVzdWx0LnB1c2goaWRzW21dKTtcblxuICAgICAgICBjb25zdCBuZXh0QXhpcyA9IChheGlzICsgMSkgJSAyO1xuXG4gICAgICAgIGlmIChheGlzID09PSAwID8gbWluWCA8PSB4IDogbWluWSA8PSB5KSB7XG4gICAgICAgICAgICBzdGFjay5wdXNoKGxlZnQpO1xuICAgICAgICAgICAgc3RhY2sucHVzaChtIC0gMSk7XG4gICAgICAgICAgICBzdGFjay5wdXNoKG5leHRBeGlzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYXhpcyA9PT0gMCA/IG1heFggPj0geCA6IG1heFkgPj0geSkge1xuICAgICAgICAgICAgc3RhY2sucHVzaChtICsgMSk7XG4gICAgICAgICAgICBzdGFjay5wdXNoKHJpZ2h0KTtcbiAgICAgICAgICAgIHN0YWNrLnB1c2gobmV4dEF4aXMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbiIsIlxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gd2l0aGluKGlkcywgY29vcmRzLCBxeCwgcXksIHIsIG5vZGVTaXplKSB7XG4gICAgY29uc3Qgc3RhY2sgPSBbMCwgaWRzLmxlbmd0aCAtIDEsIDBdO1xuICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgIGNvbnN0IHIyID0gciAqIHI7XG5cbiAgICB3aGlsZSAoc3RhY2subGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGF4aXMgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgY29uc3QgcmlnaHQgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgY29uc3QgbGVmdCA9IHN0YWNrLnBvcCgpO1xuXG4gICAgICAgIGlmIChyaWdodCAtIGxlZnQgPD0gbm9kZVNpemUpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBsZWZ0OyBpIDw9IHJpZ2h0OyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoc3FEaXN0KGNvb3Jkc1syICogaV0sIGNvb3Jkc1syICogaSArIDFdLCBxeCwgcXkpIDw9IHIyKSByZXN1bHQucHVzaChpZHNbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtID0gTWF0aC5mbG9vcigobGVmdCArIHJpZ2h0KSAvIDIpO1xuXG4gICAgICAgIGNvbnN0IHggPSBjb29yZHNbMiAqIG1dO1xuICAgICAgICBjb25zdCB5ID0gY29vcmRzWzIgKiBtICsgMV07XG5cbiAgICAgICAgaWYgKHNxRGlzdCh4LCB5LCBxeCwgcXkpIDw9IHIyKSByZXN1bHQucHVzaChpZHNbbV0pO1xuXG4gICAgICAgIGNvbnN0IG5leHRBeGlzID0gKGF4aXMgKyAxKSAlIDI7XG5cbiAgICAgICAgaWYgKGF4aXMgPT09IDAgPyBxeCAtIHIgPD0geCA6IHF5IC0gciA8PSB5KSB7XG4gICAgICAgICAgICBzdGFjay5wdXNoKGxlZnQpO1xuICAgICAgICAgICAgc3RhY2sucHVzaChtIC0gMSk7XG4gICAgICAgICAgICBzdGFjay5wdXNoKG5leHRBeGlzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYXhpcyA9PT0gMCA/IHF4ICsgciA+PSB4IDogcXkgKyByID49IHkpIHtcbiAgICAgICAgICAgIHN0YWNrLnB1c2gobSArIDEpO1xuICAgICAgICAgICAgc3RhY2sucHVzaChyaWdodCk7XG4gICAgICAgICAgICBzdGFjay5wdXNoKG5leHRBeGlzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIHNxRGlzdChheCwgYXksIGJ4LCBieSkge1xuICAgIGNvbnN0IGR4ID0gYXggLSBieDtcbiAgICBjb25zdCBkeSA9IGF5IC0gYnk7XG4gICAgcmV0dXJuIGR4ICogZHggKyBkeSAqIGR5O1xufVxuIiwiXG5pbXBvcnQgc29ydCBmcm9tICcuL3NvcnQnO1xuaW1wb3J0IHJhbmdlIGZyb20gJy4vcmFuZ2UnO1xuaW1wb3J0IHdpdGhpbiBmcm9tICcuL3dpdGhpbic7XG5cbmNvbnN0IGRlZmF1bHRHZXRYID0gcCA9PiBwWzBdO1xuY29uc3QgZGVmYXVsdEdldFkgPSBwID0+IHBbMV07XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEtEQnVzaCB7XG4gICAgY29uc3RydWN0b3IocG9pbnRzLCBnZXRYID0gZGVmYXVsdEdldFgsIGdldFkgPSBkZWZhdWx0R2V0WSwgbm9kZVNpemUgPSA2NCwgQXJyYXlUeXBlID0gRmxvYXQ2NEFycmF5KSB7XG4gICAgICAgIHRoaXMubm9kZVNpemUgPSBub2RlU2l6ZTtcbiAgICAgICAgdGhpcy5wb2ludHMgPSBwb2ludHM7XG5cbiAgICAgICAgY29uc3QgSW5kZXhBcnJheVR5cGUgPSBwb2ludHMubGVuZ3RoIDwgNjU1MzYgPyBVaW50MTZBcnJheSA6IFVpbnQzMkFycmF5O1xuXG4gICAgICAgIGNvbnN0IGlkcyA9IHRoaXMuaWRzID0gbmV3IEluZGV4QXJyYXlUeXBlKHBvaW50cy5sZW5ndGgpO1xuICAgICAgICBjb25zdCBjb29yZHMgPSB0aGlzLmNvb3JkcyA9IG5ldyBBcnJheVR5cGUocG9pbnRzLmxlbmd0aCAqIDIpO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9pbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZHNbaV0gPSBpO1xuICAgICAgICAgICAgY29vcmRzWzIgKiBpXSA9IGdldFgocG9pbnRzW2ldKTtcbiAgICAgICAgICAgIGNvb3Jkc1syICogaSArIDFdID0gZ2V0WShwb2ludHNbaV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgc29ydChpZHMsIGNvb3Jkcywgbm9kZVNpemUsIDAsIGlkcy5sZW5ndGggLSAxLCAwKTtcbiAgICB9XG5cbiAgICByYW5nZShtaW5YLCBtaW5ZLCBtYXhYLCBtYXhZKSB7XG4gICAgICAgIHJldHVybiByYW5nZSh0aGlzLmlkcywgdGhpcy5jb29yZHMsIG1pblgsIG1pblksIG1heFgsIG1heFksIHRoaXMubm9kZVNpemUpO1xuICAgIH1cblxuICAgIHdpdGhpbih4LCB5LCByKSB7XG4gICAgICAgIHJldHVybiB3aXRoaW4odGhpcy5pZHMsIHRoaXMuY29vcmRzLCB4LCB5LCByLCB0aGlzLm5vZGVTaXplKTtcbiAgICB9XG59XG4iLCJcbmltcG9ydCBLREJ1c2ggZnJvbSAna2RidXNoJztcblxuY29uc3QgZGVmYXVsdE9wdGlvbnMgPSB7XG4gICAgbWluWm9vbTogMCwgICAvLyBtaW4gem9vbSB0byBnZW5lcmF0ZSBjbHVzdGVycyBvblxuICAgIG1heFpvb206IDE2LCAgLy8gbWF4IHpvb20gbGV2ZWwgdG8gY2x1c3RlciB0aGUgcG9pbnRzIG9uXG4gICAgcmFkaXVzOiA0MCwgICAvLyBjbHVzdGVyIHJhZGl1cyBpbiBwaXhlbHNcbiAgICBleHRlbnQ6IDUxMiwgIC8vIHRpbGUgZXh0ZW50IChyYWRpdXMgaXMgY2FsY3VsYXRlZCByZWxhdGl2ZSB0byBpdClcbiAgICBub2RlU2l6ZTogNjQsIC8vIHNpemUgb2YgdGhlIEtELXRyZWUgbGVhZiBub2RlLCBhZmZlY3RzIHBlcmZvcm1hbmNlXG4gICAgbG9nOiBmYWxzZSwgICAvLyB3aGV0aGVyIHRvIGxvZyB0aW1pbmcgaW5mb1xuXG4gICAgLy8gYSByZWR1Y2UgZnVuY3Rpb24gZm9yIGNhbGN1bGF0aW5nIGN1c3RvbSBjbHVzdGVyIHByb3BlcnRpZXNcbiAgICByZWR1Y2U6IG51bGwsIC8vIChhY2N1bXVsYXRlZCwgcHJvcHMpID0+IHsgYWNjdW11bGF0ZWQuc3VtICs9IHByb3BzLnN1bTsgfVxuXG4gICAgLy8gcHJvcGVydGllcyB0byB1c2UgZm9yIGluZGl2aWR1YWwgcG9pbnRzIHdoZW4gcnVubmluZyB0aGUgcmVkdWNlclxuICAgIG1hcDogcHJvcHMgPT4gcHJvcHMgLy8gcHJvcHMgPT4gKHtzdW06IHByb3BzLm15X3ZhbHVlfSlcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN1cGVyY2x1c3RlciB7XG4gICAgY29uc3RydWN0b3Iob3B0aW9ucykge1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBleHRlbmQoT2JqZWN0LmNyZWF0ZShkZWZhdWx0T3B0aW9ucyksIG9wdGlvbnMpO1xuICAgICAgICB0aGlzLnRyZWVzID0gbmV3IEFycmF5KHRoaXMub3B0aW9ucy5tYXhab29tICsgMSk7XG4gICAgfVxuXG4gICAgbG9hZChwb2ludHMpIHtcbiAgICAgICAgY29uc3Qge2xvZywgbWluWm9vbSwgbWF4Wm9vbSwgbm9kZVNpemV9ID0gdGhpcy5vcHRpb25zO1xuXG4gICAgICAgIGlmIChsb2cpIGNvbnNvbGUudGltZSgndG90YWwgdGltZScpO1xuXG4gICAgICAgIGNvbnN0IHRpbWVySWQgPSBgcHJlcGFyZSAkeyAgcG9pbnRzLmxlbmd0aCAgfSBwb2ludHNgO1xuICAgICAgICBpZiAobG9nKSBjb25zb2xlLnRpbWUodGltZXJJZCk7XG5cbiAgICAgICAgdGhpcy5wb2ludHMgPSBwb2ludHM7XG5cbiAgICAgICAgLy8gZ2VuZXJhdGUgYSBjbHVzdGVyIG9iamVjdCBmb3IgZWFjaCBwb2ludCBhbmQgaW5kZXggaW5wdXQgcG9pbnRzIGludG8gYSBLRC10cmVlXG4gICAgICAgIGxldCBjbHVzdGVycyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvaW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKCFwb2ludHNbaV0uZ2VvbWV0cnkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgY2x1c3RlcnMucHVzaChjcmVhdGVQb2ludENsdXN0ZXIocG9pbnRzW2ldLCBpKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50cmVlc1ttYXhab29tICsgMV0gPSBuZXcgS0RCdXNoKGNsdXN0ZXJzLCBnZXRYLCBnZXRZLCBub2RlU2l6ZSwgRmxvYXQzMkFycmF5KTtcblxuICAgICAgICBpZiAobG9nKSBjb25zb2xlLnRpbWVFbmQodGltZXJJZCk7XG5cbiAgICAgICAgLy8gY2x1c3RlciBwb2ludHMgb24gbWF4IHpvb20sIHRoZW4gY2x1c3RlciB0aGUgcmVzdWx0cyBvbiBwcmV2aW91cyB6b29tLCBldGMuO1xuICAgICAgICAvLyByZXN1bHRzIGluIGEgY2x1c3RlciBoaWVyYXJjaHkgYWNyb3NzIHpvb20gbGV2ZWxzXG4gICAgICAgIGZvciAobGV0IHogPSBtYXhab29tOyB6ID49IG1pblpvb207IHotLSkge1xuICAgICAgICAgICAgY29uc3Qgbm93ID0gK0RhdGUubm93KCk7XG5cbiAgICAgICAgICAgIC8vIGNyZWF0ZSBhIG5ldyBzZXQgb2YgY2x1c3RlcnMgZm9yIHRoZSB6b29tIGFuZCBpbmRleCB0aGVtIHdpdGggYSBLRC10cmVlXG4gICAgICAgICAgICBjbHVzdGVycyA9IHRoaXMuX2NsdXN0ZXIoY2x1c3RlcnMsIHopO1xuICAgICAgICAgICAgdGhpcy50cmVlc1t6XSA9IG5ldyBLREJ1c2goY2x1c3RlcnMsIGdldFgsIGdldFksIG5vZGVTaXplLCBGbG9hdDMyQXJyYXkpO1xuXG4gICAgICAgICAgICBpZiAobG9nKSBjb25zb2xlLmxvZygneiVkOiAlZCBjbHVzdGVycyBpbiAlZG1zJywgeiwgY2x1c3RlcnMubGVuZ3RoLCArRGF0ZS5ub3coKSAtIG5vdyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobG9nKSBjb25zb2xlLnRpbWVFbmQoJ3RvdGFsIHRpbWUnKTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBnZXRDbHVzdGVycyhiYm94LCB6b29tKSB7XG4gICAgICAgIGxldCBtaW5MbmcgPSAoKGJib3hbMF0gKyAxODApICUgMzYwICsgMzYwKSAlIDM2MCAtIDE4MDtcbiAgICAgICAgY29uc3QgbWluTGF0ID0gTWF0aC5tYXgoLTkwLCBNYXRoLm1pbig5MCwgYmJveFsxXSkpO1xuICAgICAgICBsZXQgbWF4TG5nID0gYmJveFsyXSA9PT0gMTgwID8gMTgwIDogKChiYm94WzJdICsgMTgwKSAlIDM2MCArIDM2MCkgJSAzNjAgLSAxODA7XG4gICAgICAgIGNvbnN0IG1heExhdCA9IE1hdGgubWF4KC05MCwgTWF0aC5taW4oOTAsIGJib3hbM10pKTtcblxuICAgICAgICBpZiAoYmJveFsyXSAtIGJib3hbMF0gPj0gMzYwKSB7XG4gICAgICAgICAgICBtaW5MbmcgPSAtMTgwO1xuICAgICAgICAgICAgbWF4TG5nID0gMTgwO1xuICAgICAgICB9IGVsc2UgaWYgKG1pbkxuZyA+IG1heExuZykge1xuICAgICAgICAgICAgY29uc3QgZWFzdGVybkhlbSA9IHRoaXMuZ2V0Q2x1c3RlcnMoW21pbkxuZywgbWluTGF0LCAxODAsIG1heExhdF0sIHpvb20pO1xuICAgICAgICAgICAgY29uc3Qgd2VzdGVybkhlbSA9IHRoaXMuZ2V0Q2x1c3RlcnMoWy0xODAsIG1pbkxhdCwgbWF4TG5nLCBtYXhMYXRdLCB6b29tKTtcbiAgICAgICAgICAgIHJldHVybiBlYXN0ZXJuSGVtLmNvbmNhdCh3ZXN0ZXJuSGVtKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRyZWUgPSB0aGlzLnRyZWVzW3RoaXMuX2xpbWl0Wm9vbSh6b29tKV07XG4gICAgICAgIGNvbnN0IGlkcyA9IHRyZWUucmFuZ2UobG5nWChtaW5MbmcpLCBsYXRZKG1heExhdCksIGxuZ1gobWF4TG5nKSwgbGF0WShtaW5MYXQpKTtcbiAgICAgICAgY29uc3QgY2x1c3RlcnMgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBpZCBvZiBpZHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGMgPSB0cmVlLnBvaW50c1tpZF07XG4gICAgICAgICAgICBjbHVzdGVycy5wdXNoKGMubnVtUG9pbnRzID8gZ2V0Q2x1c3RlckpTT04oYykgOiB0aGlzLnBvaW50c1tjLmluZGV4XSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNsdXN0ZXJzO1xuICAgIH1cblxuICAgIGdldENoaWxkcmVuKGNsdXN0ZXJJZCkge1xuICAgICAgICBjb25zdCBvcmlnaW5JZCA9IGNsdXN0ZXJJZCA+PiA1O1xuICAgICAgICBjb25zdCBvcmlnaW5ab29tID0gY2x1c3RlcklkICUgMzI7XG4gICAgICAgIGNvbnN0IGVycm9yTXNnID0gJ05vIGNsdXN0ZXIgd2l0aCB0aGUgc3BlY2lmaWVkIGlkLic7XG5cbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLnRyZWVzW29yaWdpblpvb21dO1xuICAgICAgICBpZiAoIWluZGV4KSB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNc2cpO1xuXG4gICAgICAgIGNvbnN0IG9yaWdpbiA9IGluZGV4LnBvaW50c1tvcmlnaW5JZF07XG4gICAgICAgIGlmICghb3JpZ2luKSB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNc2cpO1xuXG4gICAgICAgIGNvbnN0IHIgPSB0aGlzLm9wdGlvbnMucmFkaXVzIC8gKHRoaXMub3B0aW9ucy5leHRlbnQgKiBNYXRoLnBvdygyLCBvcmlnaW5ab29tIC0gMSkpO1xuICAgICAgICBjb25zdCBpZHMgPSBpbmRleC53aXRoaW4ob3JpZ2luLngsIG9yaWdpbi55LCByKTtcbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBpZCBvZiBpZHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGMgPSBpbmRleC5wb2ludHNbaWRdO1xuICAgICAgICAgICAgaWYgKGMucGFyZW50SWQgPT09IGNsdXN0ZXJJZCkge1xuICAgICAgICAgICAgICAgIGNoaWxkcmVuLnB1c2goYy5udW1Qb2ludHMgPyBnZXRDbHVzdGVySlNPTihjKSA6IHRoaXMucG9pbnRzW2MuaW5kZXhdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjaGlsZHJlbi5sZW5ndGggPT09IDApIHRocm93IG5ldyBFcnJvcihlcnJvck1zZyk7XG5cbiAgICAgICAgcmV0dXJuIGNoaWxkcmVuO1xuICAgIH1cblxuICAgIGdldExlYXZlcyhjbHVzdGVySWQsIGxpbWl0LCBvZmZzZXQpIHtcbiAgICAgICAgbGltaXQgPSBsaW1pdCB8fCAxMDtcbiAgICAgICAgb2Zmc2V0ID0gb2Zmc2V0IHx8IDA7XG5cbiAgICAgICAgY29uc3QgbGVhdmVzID0gW107XG4gICAgICAgIHRoaXMuX2FwcGVuZExlYXZlcyhsZWF2ZXMsIGNsdXN0ZXJJZCwgbGltaXQsIG9mZnNldCwgMCk7XG5cbiAgICAgICAgcmV0dXJuIGxlYXZlcztcbiAgICB9XG5cbiAgICBnZXRUaWxlKHosIHgsIHkpIHtcbiAgICAgICAgY29uc3QgdHJlZSA9IHRoaXMudHJlZXNbdGhpcy5fbGltaXRab29tKHopXTtcbiAgICAgICAgY29uc3QgejIgPSBNYXRoLnBvdygyLCB6KTtcbiAgICAgICAgY29uc3Qge2V4dGVudCwgcmFkaXVzfSA9IHRoaXMub3B0aW9ucztcbiAgICAgICAgY29uc3QgcCA9IHJhZGl1cyAvIGV4dGVudDtcbiAgICAgICAgY29uc3QgdG9wID0gKHkgLSBwKSAvIHoyO1xuICAgICAgICBjb25zdCBib3R0b20gPSAoeSArIDEgKyBwKSAvIHoyO1xuXG4gICAgICAgIGNvbnN0IHRpbGUgPSB7XG4gICAgICAgICAgICBmZWF0dXJlczogW11cbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLl9hZGRUaWxlRmVhdHVyZXMoXG4gICAgICAgICAgICB0cmVlLnJhbmdlKCh4IC0gcCkgLyB6MiwgdG9wLCAoeCArIDEgKyBwKSAvIHoyLCBib3R0b20pLFxuICAgICAgICAgICAgdHJlZS5wb2ludHMsIHgsIHksIHoyLCB0aWxlKTtcblxuICAgICAgICBpZiAoeCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5fYWRkVGlsZUZlYXR1cmVzKFxuICAgICAgICAgICAgICAgIHRyZWUucmFuZ2UoMSAtIHAgLyB6MiwgdG9wLCAxLCBib3R0b20pLFxuICAgICAgICAgICAgICAgIHRyZWUucG9pbnRzLCB6MiwgeSwgejIsIHRpbGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh4ID09PSB6MiAtIDEpIHtcbiAgICAgICAgICAgIHRoaXMuX2FkZFRpbGVGZWF0dXJlcyhcbiAgICAgICAgICAgICAgICB0cmVlLnJhbmdlKDAsIHRvcCwgcCAvIHoyLCBib3R0b20pLFxuICAgICAgICAgICAgICAgIHRyZWUucG9pbnRzLCAtMSwgeSwgejIsIHRpbGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRpbGUuZmVhdHVyZXMubGVuZ3RoID8gdGlsZSA6IG51bGw7XG4gICAgfVxuXG4gICAgZ2V0Q2x1c3RlckV4cGFuc2lvblpvb20oY2x1c3RlcklkKSB7XG4gICAgICAgIGxldCBjbHVzdGVyWm9vbSA9IChjbHVzdGVySWQgJSAzMikgLSAxO1xuICAgICAgICB3aGlsZSAoY2x1c3Rlclpvb20gPD0gdGhpcy5vcHRpb25zLm1heFpvb20pIHtcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5nZXRDaGlsZHJlbihjbHVzdGVySWQpO1xuICAgICAgICAgICAgY2x1c3Rlclpvb20rKztcbiAgICAgICAgICAgIGlmIChjaGlsZHJlbi5sZW5ndGggIT09IDEpIGJyZWFrO1xuICAgICAgICAgICAgY2x1c3RlcklkID0gY2hpbGRyZW5bMF0ucHJvcGVydGllcy5jbHVzdGVyX2lkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjbHVzdGVyWm9vbTtcbiAgICB9XG5cbiAgICBfYXBwZW5kTGVhdmVzKHJlc3VsdCwgY2x1c3RlcklkLCBsaW1pdCwgb2Zmc2V0LCBza2lwcGVkKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5nZXRDaGlsZHJlbihjbHVzdGVySWQpO1xuXG4gICAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgY2hpbGRyZW4pIHtcbiAgICAgICAgICAgIGNvbnN0IHByb3BzID0gY2hpbGQucHJvcGVydGllcztcblxuICAgICAgICAgICAgaWYgKHByb3BzICYmIHByb3BzLmNsdXN0ZXIpIHtcbiAgICAgICAgICAgICAgICBpZiAoc2tpcHBlZCArIHByb3BzLnBvaW50X2NvdW50IDw9IG9mZnNldCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBza2lwIHRoZSB3aG9sZSBjbHVzdGVyXG4gICAgICAgICAgICAgICAgICAgIHNraXBwZWQgKz0gcHJvcHMucG9pbnRfY291bnQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZW50ZXIgdGhlIGNsdXN0ZXJcbiAgICAgICAgICAgICAgICAgICAgc2tpcHBlZCA9IHRoaXMuX2FwcGVuZExlYXZlcyhyZXN1bHQsIHByb3BzLmNsdXN0ZXJfaWQsIGxpbWl0LCBvZmZzZXQsIHNraXBwZWQpO1xuICAgICAgICAgICAgICAgICAgICAvLyBleGl0IHRoZSBjbHVzdGVyXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChza2lwcGVkIDwgb2Zmc2V0KSB7XG4gICAgICAgICAgICAgICAgLy8gc2tpcCBhIHNpbmdsZSBwb2ludFxuICAgICAgICAgICAgICAgIHNraXBwZWQrKztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gYWRkIGEgc2luZ2xlIHBvaW50XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goY2hpbGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggPT09IGxpbWl0KSBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBza2lwcGVkO1xuICAgIH1cblxuICAgIF9hZGRUaWxlRmVhdHVyZXMoaWRzLCBwb2ludHMsIHgsIHksIHoyLCB0aWxlKSB7XG4gICAgICAgIGZvciAoY29uc3QgaSBvZiBpZHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGMgPSBwb2ludHNbaV07XG4gICAgICAgICAgICBjb25zdCBmID0ge1xuICAgICAgICAgICAgICAgIHR5cGU6IDEsXG4gICAgICAgICAgICAgICAgZ2VvbWV0cnk6IFtbXG4gICAgICAgICAgICAgICAgICAgIE1hdGgucm91bmQodGhpcy5vcHRpb25zLmV4dGVudCAqIChjLnggKiB6MiAtIHgpKSxcbiAgICAgICAgICAgICAgICAgICAgTWF0aC5yb3VuZCh0aGlzLm9wdGlvbnMuZXh0ZW50ICogKGMueSAqIHoyIC0geSkpXG4gICAgICAgICAgICAgICAgXV0sXG4gICAgICAgICAgICAgICAgdGFnczogYy5udW1Qb2ludHMgPyBnZXRDbHVzdGVyUHJvcGVydGllcyhjKSA6IHRoaXMucG9pbnRzW2MuaW5kZXhdLnByb3BlcnRpZXNcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb25zdCBpZCA9IGMubnVtUG9pbnRzID8gYy5pZCA6IHRoaXMucG9pbnRzW2MuaW5kZXhdLmlkO1xuICAgICAgICAgICAgaWYgKGlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBmLmlkID0gaWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aWxlLmZlYXR1cmVzLnB1c2goZik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfbGltaXRab29tKHopIHtcbiAgICAgICAgcmV0dXJuIE1hdGgubWF4KHRoaXMub3B0aW9ucy5taW5ab29tLCBNYXRoLm1pbih6LCB0aGlzLm9wdGlvbnMubWF4Wm9vbSArIDEpKTtcbiAgICB9XG5cbiAgICBfY2x1c3Rlcihwb2ludHMsIHpvb20pIHtcbiAgICAgICAgY29uc3QgY2x1c3RlcnMgPSBbXTtcbiAgICAgICAgY29uc3Qge3JhZGl1cywgZXh0ZW50LCByZWR1Y2V9ID0gdGhpcy5vcHRpb25zO1xuICAgICAgICBjb25zdCByID0gcmFkaXVzIC8gKGV4dGVudCAqIE1hdGgucG93KDIsIHpvb20pKTtcblxuICAgICAgICAvLyBsb29wIHRocm91Z2ggZWFjaCBwb2ludFxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvaW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgcCA9IHBvaW50c1tpXTtcbiAgICAgICAgICAgIC8vIGlmIHdlJ3ZlIGFscmVhZHkgdmlzaXRlZCB0aGUgcG9pbnQgYXQgdGhpcyB6b29tIGxldmVsLCBza2lwIGl0XG4gICAgICAgICAgICBpZiAocC56b29tIDw9IHpvb20pIGNvbnRpbnVlO1xuICAgICAgICAgICAgcC56b29tID0gem9vbTtcblxuICAgICAgICAgICAgLy8gZmluZCBhbGwgbmVhcmJ5IHBvaW50c1xuICAgICAgICAgICAgY29uc3QgdHJlZSA9IHRoaXMudHJlZXNbem9vbSArIDFdO1xuICAgICAgICAgICAgY29uc3QgbmVpZ2hib3JJZHMgPSB0cmVlLndpdGhpbihwLngsIHAueSwgcik7XG5cbiAgICAgICAgICAgIGxldCBudW1Qb2ludHMgPSBwLm51bVBvaW50cyB8fCAxO1xuICAgICAgICAgICAgbGV0IHd4ID0gcC54ICogbnVtUG9pbnRzO1xuICAgICAgICAgICAgbGV0IHd5ID0gcC55ICogbnVtUG9pbnRzO1xuXG4gICAgICAgICAgICBjb25zdCBjbHVzdGVyUHJvcGVydGllcyA9IHJlZHVjZSA/IHRoaXMuX21hcChwLCB0cnVlKSA6IG51bGw7XG5cbiAgICAgICAgICAgIC8vIGVuY29kZSBib3RoIHpvb20gYW5kIHBvaW50IGluZGV4IG9uIHdoaWNoIHRoZSBjbHVzdGVyIG9yaWdpbmF0ZWRcbiAgICAgICAgICAgIGNvbnN0IGlkID0gKGkgPDwgNSkgKyAoem9vbSArIDEpO1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IG5laWdoYm9ySWQgb2YgbmVpZ2hib3JJZHMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBiID0gdHJlZS5wb2ludHNbbmVpZ2hib3JJZF07XG4gICAgICAgICAgICAgICAgLy8gZmlsdGVyIG91dCBuZWlnaGJvcnMgdGhhdCBhcmUgYWxyZWFkeSBwcm9jZXNzZWRcbiAgICAgICAgICAgICAgICBpZiAoYi56b29tIDw9IHpvb20pIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGIuem9vbSA9IHpvb207IC8vIHNhdmUgdGhlIHpvb20gKHNvIGl0IGRvZXNuJ3QgZ2V0IHByb2Nlc3NlZCB0d2ljZSlcblxuICAgICAgICAgICAgICAgIGNvbnN0IG51bVBvaW50czIgPSBiLm51bVBvaW50cyB8fCAxO1xuICAgICAgICAgICAgICAgIHd4ICs9IGIueCAqIG51bVBvaW50czI7IC8vIGFjY3VtdWxhdGUgY29vcmRpbmF0ZXMgZm9yIGNhbGN1bGF0aW5nIHdlaWdodGVkIGNlbnRlclxuICAgICAgICAgICAgICAgIHd5ICs9IGIueSAqIG51bVBvaW50czI7XG5cbiAgICAgICAgICAgICAgICBudW1Qb2ludHMgKz0gbnVtUG9pbnRzMjtcbiAgICAgICAgICAgICAgICBiLnBhcmVudElkID0gaWQ7XG5cbiAgICAgICAgICAgICAgICBpZiAocmVkdWNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlZHVjZShjbHVzdGVyUHJvcGVydGllcywgdGhpcy5fbWFwKGIpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChudW1Qb2ludHMgPT09IDEpIHtcbiAgICAgICAgICAgICAgICBjbHVzdGVycy5wdXNoKHApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwLnBhcmVudElkID0gaWQ7XG4gICAgICAgICAgICAgICAgY2x1c3RlcnMucHVzaChjcmVhdGVDbHVzdGVyKHd4IC8gbnVtUG9pbnRzLCB3eSAvIG51bVBvaW50cywgaWQsIG51bVBvaW50cywgY2x1c3RlclByb3BlcnRpZXMpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjbHVzdGVycztcbiAgICB9XG5cbiAgICBfbWFwKHBvaW50LCBjbG9uZSkge1xuICAgICAgICBpZiAocG9pbnQubnVtUG9pbnRzKSB7XG4gICAgICAgICAgICByZXR1cm4gY2xvbmUgPyBleHRlbmQoe30sIHBvaW50LnByb3BlcnRpZXMpIDogcG9pbnQucHJvcGVydGllcztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvcmlnaW5hbCA9IHRoaXMucG9pbnRzW3BvaW50LmluZGV4XS5wcm9wZXJ0aWVzO1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLm9wdGlvbnMubWFwKG9yaWdpbmFsKTtcbiAgICAgICAgcmV0dXJuIGNsb25lICYmIHJlc3VsdCA9PT0gb3JpZ2luYWwgPyBleHRlbmQoe30sIHJlc3VsdCkgOiByZXN1bHQ7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVDbHVzdGVyKHgsIHksIGlkLCBudW1Qb2ludHMsIHByb3BlcnRpZXMpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICB4LCAvLyB3ZWlnaHRlZCBjbHVzdGVyIGNlbnRlclxuICAgICAgICB5LFxuICAgICAgICB6b29tOiBJbmZpbml0eSwgLy8gdGhlIGxhc3Qgem9vbSB0aGUgY2x1c3RlciB3YXMgcHJvY2Vzc2VkIGF0XG4gICAgICAgIGlkLCAvLyBlbmNvZGVzIGluZGV4IG9mIHRoZSBmaXJzdCBjaGlsZCBvZiB0aGUgY2x1c3RlciBhbmQgaXRzIHpvb20gbGV2ZWxcbiAgICAgICAgcGFyZW50SWQ6IC0xLCAvLyBwYXJlbnQgY2x1c3RlciBpZFxuICAgICAgICBudW1Qb2ludHMsXG4gICAgICAgIHByb3BlcnRpZXNcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBjcmVhdGVQb2ludENsdXN0ZXIocCwgaWQpIHtcbiAgICBjb25zdCBbeCwgeV0gPSBwLmdlb21ldHJ5LmNvb3JkaW5hdGVzO1xuICAgIHJldHVybiB7XG4gICAgICAgIHg6IGxuZ1goeCksIC8vIHByb2plY3RlZCBwb2ludCBjb29yZGluYXRlc1xuICAgICAgICB5OiBsYXRZKHkpLFxuICAgICAgICB6b29tOiBJbmZpbml0eSwgLy8gdGhlIGxhc3Qgem9vbSB0aGUgcG9pbnQgd2FzIHByb2Nlc3NlZCBhdFxuICAgICAgICBpbmRleDogaWQsIC8vIGluZGV4IG9mIHRoZSBzb3VyY2UgZmVhdHVyZSBpbiB0aGUgb3JpZ2luYWwgaW5wdXQgYXJyYXksXG4gICAgICAgIHBhcmVudElkOiAtMSAvLyBwYXJlbnQgY2x1c3RlciBpZFxuICAgIH07XG59XG5cbmZ1bmN0aW9uIGdldENsdXN0ZXJKU09OKGNsdXN0ZXIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiAnRmVhdHVyZScsXG4gICAgICAgIGlkOiBjbHVzdGVyLmlkLFxuICAgICAgICBwcm9wZXJ0aWVzOiBnZXRDbHVzdGVyUHJvcGVydGllcyhjbHVzdGVyKSxcbiAgICAgICAgZ2VvbWV0cnk6IHtcbiAgICAgICAgICAgIHR5cGU6ICdQb2ludCcsXG4gICAgICAgICAgICBjb29yZGluYXRlczogW3hMbmcoY2x1c3Rlci54KSwgeUxhdChjbHVzdGVyLnkpXVxuICAgICAgICB9XG4gICAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0Q2x1c3RlclByb3BlcnRpZXMoY2x1c3Rlcikge1xuICAgIGNvbnN0IGNvdW50ID0gY2x1c3Rlci5udW1Qb2ludHM7XG4gICAgY29uc3QgYWJicmV2ID1cbiAgICAgICAgY291bnQgPj0gMTAwMDAgPyBgJHtNYXRoLnJvdW5kKGNvdW50IC8gMTAwMCkgIH1rYCA6XG4gICAgICAgIGNvdW50ID49IDEwMDAgPyBgJHtNYXRoLnJvdW5kKGNvdW50IC8gMTAwKSAvIDEwICB9a2AgOiBjb3VudDtcbiAgICByZXR1cm4gZXh0ZW5kKGV4dGVuZCh7fSwgY2x1c3Rlci5wcm9wZXJ0aWVzKSwge1xuICAgICAgICBjbHVzdGVyOiB0cnVlLFxuICAgICAgICBjbHVzdGVyX2lkOiBjbHVzdGVyLmlkLFxuICAgICAgICBwb2ludF9jb3VudDogY291bnQsXG4gICAgICAgIHBvaW50X2NvdW50X2FiYnJldmlhdGVkOiBhYmJyZXZcbiAgICB9KTtcbn1cblxuLy8gbG9uZ2l0dWRlL2xhdGl0dWRlIHRvIHNwaGVyaWNhbCBtZXJjYXRvciBpbiBbMC4uMV0gcmFuZ2VcbmZ1bmN0aW9uIGxuZ1gobG5nKSB7XG4gICAgcmV0dXJuIGxuZyAvIDM2MCArIDAuNTtcbn1cbmZ1bmN0aW9uIGxhdFkobGF0KSB7XG4gICAgY29uc3Qgc2luID0gTWF0aC5zaW4obGF0ICogTWF0aC5QSSAvIDE4MCk7XG4gICAgY29uc3QgeSA9ICgwLjUgLSAwLjI1ICogTWF0aC5sb2coKDEgKyBzaW4pIC8gKDEgLSBzaW4pKSAvIE1hdGguUEkpO1xuICAgIHJldHVybiB5IDwgMCA/IDAgOiB5ID4gMSA/IDEgOiB5O1xufVxuXG4vLyBzcGhlcmljYWwgbWVyY2F0b3IgdG8gbG9uZ2l0dWRlL2xhdGl0dWRlXG5mdW5jdGlvbiB4TG5nKHgpIHtcbiAgICByZXR1cm4gKHggLSAwLjUpICogMzYwO1xufVxuZnVuY3Rpb24geUxhdCh5KSB7XG4gICAgY29uc3QgeTIgPSAoMTgwIC0geSAqIDM2MCkgKiBNYXRoLlBJIC8gMTgwO1xuICAgIHJldHVybiAzNjAgKiBNYXRoLmF0YW4oTWF0aC5leHAoeTIpKSAvIE1hdGguUEkgLSA5MDtcbn1cblxuZnVuY3Rpb24gZXh0ZW5kKGRlc3QsIHNyYykge1xuICAgIGZvciAoY29uc3QgaWQgaW4gc3JjKSBkZXN0W2lkXSA9IHNyY1tpZF07XG4gICAgcmV0dXJuIGRlc3Q7XG59XG5cbmZ1bmN0aW9uIGdldFgocCkge1xuICAgIHJldHVybiBwLng7XG59XG5mdW5jdGlvbiBnZXRZKHApIHtcbiAgICByZXR1cm4gcC55O1xufVxuIiwiXG4vLyBjYWxjdWxhdGUgc2ltcGxpZmljYXRpb24gZGF0YSB1c2luZyBvcHRpbWl6ZWQgRG91Z2xhcy1QZXVja2VyIGFsZ29yaXRobVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzaW1wbGlmeShjb29yZHMsIGZpcnN0LCBsYXN0LCBzcVRvbGVyYW5jZSkge1xuICAgIHZhciBtYXhTcURpc3QgPSBzcVRvbGVyYW5jZTtcbiAgICB2YXIgbWlkID0gKGxhc3QgLSBmaXJzdCkgPj4gMTtcbiAgICB2YXIgbWluUG9zVG9NaWQgPSBsYXN0IC0gZmlyc3Q7XG4gICAgdmFyIGluZGV4O1xuXG4gICAgdmFyIGF4ID0gY29vcmRzW2ZpcnN0XTtcbiAgICB2YXIgYXkgPSBjb29yZHNbZmlyc3QgKyAxXTtcbiAgICB2YXIgYnggPSBjb29yZHNbbGFzdF07XG4gICAgdmFyIGJ5ID0gY29vcmRzW2xhc3QgKyAxXTtcblxuICAgIGZvciAodmFyIGkgPSBmaXJzdCArIDM7IGkgPCBsYXN0OyBpICs9IDMpIHtcbiAgICAgICAgdmFyIGQgPSBnZXRTcVNlZ0Rpc3QoY29vcmRzW2ldLCBjb29yZHNbaSArIDFdLCBheCwgYXksIGJ4LCBieSk7XG5cbiAgICAgICAgaWYgKGQgPiBtYXhTcURpc3QpIHtcbiAgICAgICAgICAgIGluZGV4ID0gaTtcbiAgICAgICAgICAgIG1heFNxRGlzdCA9IGQ7XG5cbiAgICAgICAgfSBlbHNlIGlmIChkID09PSBtYXhTcURpc3QpIHtcbiAgICAgICAgICAgIC8vIGEgd29ya2Fyb3VuZCB0byBlbnN1cmUgd2UgY2hvb3NlIGEgcGl2b3QgY2xvc2UgdG8gdGhlIG1pZGRsZSBvZiB0aGUgbGlzdCxcbiAgICAgICAgICAgIC8vIHJlZHVjaW5nIHJlY3Vyc2lvbiBkZXB0aCwgZm9yIGNlcnRhaW4gZGVnZW5lcmF0ZSBpbnB1dHNcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvZ2VvanNvbi12dC9pc3N1ZXMvMTA0XG4gICAgICAgICAgICB2YXIgcG9zVG9NaWQgPSBNYXRoLmFicyhpIC0gbWlkKTtcbiAgICAgICAgICAgIGlmIChwb3NUb01pZCA8IG1pblBvc1RvTWlkKSB7XG4gICAgICAgICAgICAgICAgaW5kZXggPSBpO1xuICAgICAgICAgICAgICAgIG1pblBvc1RvTWlkID0gcG9zVG9NaWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobWF4U3FEaXN0ID4gc3FUb2xlcmFuY2UpIHtcbiAgICAgICAgaWYgKGluZGV4IC0gZmlyc3QgPiAzKSBzaW1wbGlmeShjb29yZHMsIGZpcnN0LCBpbmRleCwgc3FUb2xlcmFuY2UpO1xuICAgICAgICBjb29yZHNbaW5kZXggKyAyXSA9IG1heFNxRGlzdDtcbiAgICAgICAgaWYgKGxhc3QgLSBpbmRleCA+IDMpIHNpbXBsaWZ5KGNvb3JkcywgaW5kZXgsIGxhc3QsIHNxVG9sZXJhbmNlKTtcbiAgICB9XG59XG5cbi8vIHNxdWFyZSBkaXN0YW5jZSBmcm9tIGEgcG9pbnQgdG8gYSBzZWdtZW50XG5mdW5jdGlvbiBnZXRTcVNlZ0Rpc3QocHgsIHB5LCB4LCB5LCBieCwgYnkpIHtcblxuICAgIHZhciBkeCA9IGJ4IC0geDtcbiAgICB2YXIgZHkgPSBieSAtIHk7XG5cbiAgICBpZiAoZHggIT09IDAgfHwgZHkgIT09IDApIHtcblxuICAgICAgICB2YXIgdCA9ICgocHggLSB4KSAqIGR4ICsgKHB5IC0geSkgKiBkeSkgLyAoZHggKiBkeCArIGR5ICogZHkpO1xuXG4gICAgICAgIGlmICh0ID4gMSkge1xuICAgICAgICAgICAgeCA9IGJ4O1xuICAgICAgICAgICAgeSA9IGJ5O1xuXG4gICAgICAgIH0gZWxzZSBpZiAodCA+IDApIHtcbiAgICAgICAgICAgIHggKz0gZHggKiB0O1xuICAgICAgICAgICAgeSArPSBkeSAqIHQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBkeCA9IHB4IC0geDtcbiAgICBkeSA9IHB5IC0geTtcblxuICAgIHJldHVybiBkeCAqIGR4ICsgZHkgKiBkeTtcbn1cbiIsIlxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY3JlYXRlRmVhdHVyZShpZCwgdHlwZSwgZ2VvbSwgdGFncykge1xuICAgIHZhciBmZWF0dXJlID0ge1xuICAgICAgICBpZDogdHlwZW9mIGlkID09PSAndW5kZWZpbmVkJyA/IG51bGwgOiBpZCxcbiAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgZ2VvbWV0cnk6IGdlb20sXG4gICAgICAgIHRhZ3M6IHRhZ3MsXG4gICAgICAgIG1pblg6IEluZmluaXR5LFxuICAgICAgICBtaW5ZOiBJbmZpbml0eSxcbiAgICAgICAgbWF4WDogLUluZmluaXR5LFxuICAgICAgICBtYXhZOiAtSW5maW5pdHlcbiAgICB9O1xuICAgIGNhbGNCQm94KGZlYXR1cmUpO1xuICAgIHJldHVybiBmZWF0dXJlO1xufVxuXG5mdW5jdGlvbiBjYWxjQkJveChmZWF0dXJlKSB7XG4gICAgdmFyIGdlb20gPSBmZWF0dXJlLmdlb21ldHJ5O1xuICAgIHZhciB0eXBlID0gZmVhdHVyZS50eXBlO1xuXG4gICAgaWYgKHR5cGUgPT09ICdQb2ludCcgfHwgdHlwZSA9PT0gJ011bHRpUG9pbnQnIHx8IHR5cGUgPT09ICdMaW5lU3RyaW5nJykge1xuICAgICAgICBjYWxjTGluZUJCb3goZmVhdHVyZSwgZ2VvbSk7XG5cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdQb2x5Z29uJyB8fCB0eXBlID09PSAnTXVsdGlMaW5lU3RyaW5nJykge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGdlb20ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNhbGNMaW5lQkJveChmZWF0dXJlLCBnZW9tW2ldKTtcbiAgICAgICAgfVxuXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnTXVsdGlQb2x5Z29uJykge1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZ2VvbS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBnZW9tW2ldLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgY2FsY0xpbmVCQm94KGZlYXR1cmUsIGdlb21baV1bal0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG5mdW5jdGlvbiBjYWxjTGluZUJCb3goZmVhdHVyZSwgZ2VvbSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZ2VvbS5sZW5ndGg7IGkgKz0gMykge1xuICAgICAgICBmZWF0dXJlLm1pblggPSBNYXRoLm1pbihmZWF0dXJlLm1pblgsIGdlb21baV0pO1xuICAgICAgICBmZWF0dXJlLm1pblkgPSBNYXRoLm1pbihmZWF0dXJlLm1pblksIGdlb21baSArIDFdKTtcbiAgICAgICAgZmVhdHVyZS5tYXhYID0gTWF0aC5tYXgoZmVhdHVyZS5tYXhYLCBnZW9tW2ldKTtcbiAgICAgICAgZmVhdHVyZS5tYXhZID0gTWF0aC5tYXgoZmVhdHVyZS5tYXhZLCBnZW9tW2kgKyAxXSk7XG4gICAgfVxufVxuIiwiXG5pbXBvcnQgc2ltcGxpZnkgZnJvbSAnLi9zaW1wbGlmeSc7XG5pbXBvcnQgY3JlYXRlRmVhdHVyZSBmcm9tICcuL2ZlYXR1cmUnO1xuXG4vLyBjb252ZXJ0cyBHZW9KU09OIGZlYXR1cmUgaW50byBhbiBpbnRlcm1lZGlhdGUgcHJvamVjdGVkIEpTT04gdmVjdG9yIGZvcm1hdCB3aXRoIHNpbXBsaWZpY2F0aW9uIGRhdGFcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY29udmVydChkYXRhLCBvcHRpb25zKSB7XG4gICAgdmFyIGZlYXR1cmVzID0gW107XG4gICAgaWYgKGRhdGEudHlwZSA9PT0gJ0ZlYXR1cmVDb2xsZWN0aW9uJykge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRhdGEuZmVhdHVyZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnZlcnRGZWF0dXJlKGZlYXR1cmVzLCBkYXRhLmZlYXR1cmVzW2ldLCBvcHRpb25zLCBpKTtcbiAgICAgICAgfVxuXG4gICAgfSBlbHNlIGlmIChkYXRhLnR5cGUgPT09ICdGZWF0dXJlJykge1xuICAgICAgICBjb252ZXJ0RmVhdHVyZShmZWF0dXJlcywgZGF0YSwgb3B0aW9ucyk7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyBzaW5nbGUgZ2VvbWV0cnkgb3IgYSBnZW9tZXRyeSBjb2xsZWN0aW9uXG4gICAgICAgIGNvbnZlcnRGZWF0dXJlKGZlYXR1cmVzLCB7Z2VvbWV0cnk6IGRhdGF9LCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmVhdHVyZXM7XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRGZWF0dXJlKGZlYXR1cmVzLCBnZW9qc29uLCBvcHRpb25zLCBpbmRleCkge1xuICAgIGlmICghZ2VvanNvbi5nZW9tZXRyeSkgcmV0dXJuO1xuXG4gICAgdmFyIGNvb3JkcyA9IGdlb2pzb24uZ2VvbWV0cnkuY29vcmRpbmF0ZXM7XG4gICAgdmFyIHR5cGUgPSBnZW9qc29uLmdlb21ldHJ5LnR5cGU7XG4gICAgdmFyIHRvbGVyYW5jZSA9IE1hdGgucG93KG9wdGlvbnMudG9sZXJhbmNlIC8gKCgxIDw8IG9wdGlvbnMubWF4Wm9vbSkgKiBvcHRpb25zLmV4dGVudCksIDIpO1xuICAgIHZhciBnZW9tZXRyeSA9IFtdO1xuICAgIHZhciBpZCA9IGdlb2pzb24uaWQ7XG4gICAgaWYgKG9wdGlvbnMucHJvbW90ZUlkKSB7XG4gICAgICAgIGlkID0gZ2VvanNvbi5wcm9wZXJ0aWVzW29wdGlvbnMucHJvbW90ZUlkXTtcbiAgICB9IGVsc2UgaWYgKG9wdGlvbnMuZ2VuZXJhdGVJZCkge1xuICAgICAgICBpZCA9IGluZGV4IHx8IDA7XG4gICAgfVxuICAgIGlmICh0eXBlID09PSAnUG9pbnQnKSB7XG4gICAgICAgIGNvbnZlcnRQb2ludChjb29yZHMsIGdlb21ldHJ5KTtcblxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ011bHRpUG9pbnQnKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29vcmRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb252ZXJ0UG9pbnQoY29vcmRzW2ldLCBnZW9tZXRyeSk7XG4gICAgICAgIH1cblxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ0xpbmVTdHJpbmcnKSB7XG4gICAgICAgIGNvbnZlcnRMaW5lKGNvb3JkcywgZ2VvbWV0cnksIHRvbGVyYW5jZSwgZmFsc2UpO1xuXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnTXVsdGlMaW5lU3RyaW5nJykge1xuICAgICAgICBpZiAob3B0aW9ucy5saW5lTWV0cmljcykge1xuICAgICAgICAgICAgLy8gZXhwbG9kZSBpbnRvIGxpbmVzdHJpbmdzIHRvIGJlIGFibGUgdG8gdHJhY2sgbWV0cmljc1xuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvb3Jkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGdlb21ldHJ5ID0gW107XG4gICAgICAgICAgICAgICAgY29udmVydExpbmUoY29vcmRzW2ldLCBnZW9tZXRyeSwgdG9sZXJhbmNlLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgZmVhdHVyZXMucHVzaChjcmVhdGVGZWF0dXJlKGlkLCAnTGluZVN0cmluZycsIGdlb21ldHJ5LCBnZW9qc29uLnByb3BlcnRpZXMpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnZlcnRMaW5lcyhjb29yZHMsIGdlb21ldHJ5LCB0b2xlcmFuY2UsIGZhbHNlKTtcbiAgICAgICAgfVxuXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnUG9seWdvbicpIHtcbiAgICAgICAgY29udmVydExpbmVzKGNvb3JkcywgZ2VvbWV0cnksIHRvbGVyYW5jZSwgdHJ1ZSk7XG5cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdNdWx0aVBvbHlnb24nKSB7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb29yZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBwb2x5Z29uID0gW107XG4gICAgICAgICAgICBjb252ZXJ0TGluZXMoY29vcmRzW2ldLCBwb2x5Z29uLCB0b2xlcmFuY2UsIHRydWUpO1xuICAgICAgICAgICAgZ2VvbWV0cnkucHVzaChwb2x5Z29uKTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ0dlb21ldHJ5Q29sbGVjdGlvbicpIHtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGdlb2pzb24uZ2VvbWV0cnkuZ2VvbWV0cmllcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29udmVydEZlYXR1cmUoZmVhdHVyZXMsIHtcbiAgICAgICAgICAgICAgICBpZDogaWQsXG4gICAgICAgICAgICAgICAgZ2VvbWV0cnk6IGdlb2pzb24uZ2VvbWV0cnkuZ2VvbWV0cmllc1tpXSxcbiAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzOiBnZW9qc29uLnByb3BlcnRpZXNcbiAgICAgICAgICAgIH0sIG9wdGlvbnMsIGluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnB1dCBkYXRhIGlzIG5vdCBhIHZhbGlkIEdlb0pTT04gb2JqZWN0LicpO1xuICAgIH1cblxuICAgIGZlYXR1cmVzLnB1c2goY3JlYXRlRmVhdHVyZShpZCwgdHlwZSwgZ2VvbWV0cnksIGdlb2pzb24ucHJvcGVydGllcykpO1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0UG9pbnQoY29vcmRzLCBvdXQpIHtcbiAgICBvdXQucHVzaChwcm9qZWN0WChjb29yZHNbMF0pKTtcbiAgICBvdXQucHVzaChwcm9qZWN0WShjb29yZHNbMV0pKTtcbiAgICBvdXQucHVzaCgwKTtcbn1cblxuZnVuY3Rpb24gY29udmVydExpbmUocmluZywgb3V0LCB0b2xlcmFuY2UsIGlzUG9seWdvbikge1xuICAgIHZhciB4MCwgeTA7XG4gICAgdmFyIHNpemUgPSAwO1xuXG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCByaW5nLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHZhciB4ID0gcHJvamVjdFgocmluZ1tqXVswXSk7XG4gICAgICAgIHZhciB5ID0gcHJvamVjdFkocmluZ1tqXVsxXSk7XG5cbiAgICAgICAgb3V0LnB1c2goeCk7XG4gICAgICAgIG91dC5wdXNoKHkpO1xuICAgICAgICBvdXQucHVzaCgwKTtcblxuICAgICAgICBpZiAoaiA+IDApIHtcbiAgICAgICAgICAgIGlmIChpc1BvbHlnb24pIHtcbiAgICAgICAgICAgICAgICBzaXplICs9ICh4MCAqIHkgLSB4ICogeTApIC8gMjsgLy8gYXJlYVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzaXplICs9IE1hdGguc3FydChNYXRoLnBvdyh4IC0geDAsIDIpICsgTWF0aC5wb3coeSAtIHkwLCAyKSk7IC8vIGxlbmd0aFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHgwID0geDtcbiAgICAgICAgeTAgPSB5O1xuICAgIH1cblxuICAgIHZhciBsYXN0ID0gb3V0Lmxlbmd0aCAtIDM7XG4gICAgb3V0WzJdID0gMTtcbiAgICBzaW1wbGlmeShvdXQsIDAsIGxhc3QsIHRvbGVyYW5jZSk7XG4gICAgb3V0W2xhc3QgKyAyXSA9IDE7XG5cbiAgICBvdXQuc2l6ZSA9IE1hdGguYWJzKHNpemUpO1xuICAgIG91dC5zdGFydCA9IDA7XG4gICAgb3V0LmVuZCA9IG91dC5zaXplO1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0TGluZXMocmluZ3MsIG91dCwgdG9sZXJhbmNlLCBpc1BvbHlnb24pIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJpbmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBnZW9tID0gW107XG4gICAgICAgIGNvbnZlcnRMaW5lKHJpbmdzW2ldLCBnZW9tLCB0b2xlcmFuY2UsIGlzUG9seWdvbik7XG4gICAgICAgIG91dC5wdXNoKGdlb20pO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gcHJvamVjdFgoeCkge1xuICAgIHJldHVybiB4IC8gMzYwICsgMC41O1xufVxuXG5mdW5jdGlvbiBwcm9qZWN0WSh5KSB7XG4gICAgdmFyIHNpbiA9IE1hdGguc2luKHkgKiBNYXRoLlBJIC8gMTgwKTtcbiAgICB2YXIgeTIgPSAwLjUgLSAwLjI1ICogTWF0aC5sb2coKDEgKyBzaW4pIC8gKDEgLSBzaW4pKSAvIE1hdGguUEk7XG4gICAgcmV0dXJuIHkyIDwgMCA/IDAgOiB5MiA+IDEgPyAxIDogeTI7XG59XG4iLCJcbmltcG9ydCBjcmVhdGVGZWF0dXJlIGZyb20gJy4vZmVhdHVyZSc7XG5cbi8qIGNsaXAgZmVhdHVyZXMgYmV0d2VlbiB0d28gYXhpcy1wYXJhbGxlbCBsaW5lczpcbiAqICAgICB8ICAgICAgICB8XG4gKiAgX19ffF9fXyAgICAgfCAgICAgL1xuICogLyAgIHwgICBcXF9fX198X19fXy9cbiAqICAgICB8ICAgICAgICB8XG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY2xpcChmZWF0dXJlcywgc2NhbGUsIGsxLCBrMiwgYXhpcywgbWluQWxsLCBtYXhBbGwsIG9wdGlvbnMpIHtcblxuICAgIGsxIC89IHNjYWxlO1xuICAgIGsyIC89IHNjYWxlO1xuXG4gICAgaWYgKG1pbkFsbCA+PSBrMSAmJiBtYXhBbGwgPCBrMikgcmV0dXJuIGZlYXR1cmVzOyAvLyB0cml2aWFsIGFjY2VwdFxuICAgIGVsc2UgaWYgKG1heEFsbCA8IGsxIHx8IG1pbkFsbCA+PSBrMikgcmV0dXJuIG51bGw7IC8vIHRyaXZpYWwgcmVqZWN0XG5cbiAgICB2YXIgY2xpcHBlZCA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmZWF0dXJlcy5sZW5ndGg7IGkrKykge1xuXG4gICAgICAgIHZhciBmZWF0dXJlID0gZmVhdHVyZXNbaV07XG4gICAgICAgIHZhciBnZW9tZXRyeSA9IGZlYXR1cmUuZ2VvbWV0cnk7XG4gICAgICAgIHZhciB0eXBlID0gZmVhdHVyZS50eXBlO1xuXG4gICAgICAgIHZhciBtaW4gPSBheGlzID09PSAwID8gZmVhdHVyZS5taW5YIDogZmVhdHVyZS5taW5ZO1xuICAgICAgICB2YXIgbWF4ID0gYXhpcyA9PT0gMCA/IGZlYXR1cmUubWF4WCA6IGZlYXR1cmUubWF4WTtcblxuICAgICAgICBpZiAobWluID49IGsxICYmIG1heCA8IGsyKSB7IC8vIHRyaXZpYWwgYWNjZXB0XG4gICAgICAgICAgICBjbGlwcGVkLnB1c2goZmVhdHVyZSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfSBlbHNlIGlmIChtYXggPCBrMSB8fCBtaW4gPj0gazIpIHsgLy8gdHJpdmlhbCByZWplY3RcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIG5ld0dlb21ldHJ5ID0gW107XG5cbiAgICAgICAgaWYgKHR5cGUgPT09ICdQb2ludCcgfHwgdHlwZSA9PT0gJ011bHRpUG9pbnQnKSB7XG4gICAgICAgICAgICBjbGlwUG9pbnRzKGdlb21ldHJ5LCBuZXdHZW9tZXRyeSwgazEsIGsyLCBheGlzKTtcblxuICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdMaW5lU3RyaW5nJykge1xuICAgICAgICAgICAgY2xpcExpbmUoZ2VvbWV0cnksIG5ld0dlb21ldHJ5LCBrMSwgazIsIGF4aXMsIGZhbHNlLCBvcHRpb25zLmxpbmVNZXRyaWNzKTtcblxuICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdNdWx0aUxpbmVTdHJpbmcnKSB7XG4gICAgICAgICAgICBjbGlwTGluZXMoZ2VvbWV0cnksIG5ld0dlb21ldHJ5LCBrMSwgazIsIGF4aXMsIGZhbHNlKTtcblxuICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdQb2x5Z29uJykge1xuICAgICAgICAgICAgY2xpcExpbmVzKGdlb21ldHJ5LCBuZXdHZW9tZXRyeSwgazEsIGsyLCBheGlzLCB0cnVlKTtcblxuICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdNdWx0aVBvbHlnb24nKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGdlb21ldHJ5Lmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgdmFyIHBvbHlnb24gPSBbXTtcbiAgICAgICAgICAgICAgICBjbGlwTGluZXMoZ2VvbWV0cnlbal0sIHBvbHlnb24sIGsxLCBrMiwgYXhpcywgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKHBvbHlnb24ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIG5ld0dlb21ldHJ5LnB1c2gocG9seWdvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG5ld0dlb21ldHJ5Lmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMubGluZU1ldHJpY3MgJiYgdHlwZSA9PT0gJ0xpbmVTdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IG5ld0dlb21ldHJ5Lmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNsaXBwZWQucHVzaChjcmVhdGVGZWF0dXJlKGZlYXR1cmUuaWQsIHR5cGUsIG5ld0dlb21ldHJ5W2pdLCBmZWF0dXJlLnRhZ3MpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0eXBlID09PSAnTGluZVN0cmluZycgfHwgdHlwZSA9PT0gJ011bHRpTGluZVN0cmluZycpIHtcbiAgICAgICAgICAgICAgICBpZiAobmV3R2VvbWV0cnkubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGUgPSAnTGluZVN0cmluZyc7XG4gICAgICAgICAgICAgICAgICAgIG5ld0dlb21ldHJ5ID0gbmV3R2VvbWV0cnlbMF07XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICdNdWx0aUxpbmVTdHJpbmcnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlID09PSAnUG9pbnQnIHx8IHR5cGUgPT09ICdNdWx0aVBvaW50Jykge1xuICAgICAgICAgICAgICAgIHR5cGUgPSBuZXdHZW9tZXRyeS5sZW5ndGggPT09IDMgPyAnUG9pbnQnIDogJ011bHRpUG9pbnQnO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjbGlwcGVkLnB1c2goY3JlYXRlRmVhdHVyZShmZWF0dXJlLmlkLCB0eXBlLCBuZXdHZW9tZXRyeSwgZmVhdHVyZS50YWdzKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY2xpcHBlZC5sZW5ndGggPyBjbGlwcGVkIDogbnVsbDtcbn1cblxuZnVuY3Rpb24gY2xpcFBvaW50cyhnZW9tLCBuZXdHZW9tLCBrMSwgazIsIGF4aXMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGdlb20ubGVuZ3RoOyBpICs9IDMpIHtcbiAgICAgICAgdmFyIGEgPSBnZW9tW2kgKyBheGlzXTtcblxuICAgICAgICBpZiAoYSA+PSBrMSAmJiBhIDw9IGsyKSB7XG4gICAgICAgICAgICBuZXdHZW9tLnB1c2goZ2VvbVtpXSk7XG4gICAgICAgICAgICBuZXdHZW9tLnB1c2goZ2VvbVtpICsgMV0pO1xuICAgICAgICAgICAgbmV3R2VvbS5wdXNoKGdlb21baSArIDJdKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gY2xpcExpbmUoZ2VvbSwgbmV3R2VvbSwgazEsIGsyLCBheGlzLCBpc1BvbHlnb24sIHRyYWNrTWV0cmljcykge1xuXG4gICAgdmFyIHNsaWNlID0gbmV3U2xpY2UoZ2VvbSk7XG4gICAgdmFyIGludGVyc2VjdCA9IGF4aXMgPT09IDAgPyBpbnRlcnNlY3RYIDogaW50ZXJzZWN0WTtcbiAgICB2YXIgbGVuID0gZ2VvbS5zdGFydDtcbiAgICB2YXIgc2VnTGVuLCB0O1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBnZW9tLmxlbmd0aCAtIDM7IGkgKz0gMykge1xuICAgICAgICB2YXIgYXggPSBnZW9tW2ldO1xuICAgICAgICB2YXIgYXkgPSBnZW9tW2kgKyAxXTtcbiAgICAgICAgdmFyIGF6ID0gZ2VvbVtpICsgMl07XG4gICAgICAgIHZhciBieCA9IGdlb21baSArIDNdO1xuICAgICAgICB2YXIgYnkgPSBnZW9tW2kgKyA0XTtcbiAgICAgICAgdmFyIGEgPSBheGlzID09PSAwID8gYXggOiBheTtcbiAgICAgICAgdmFyIGIgPSBheGlzID09PSAwID8gYnggOiBieTtcbiAgICAgICAgdmFyIGV4aXRlZCA9IGZhbHNlO1xuXG4gICAgICAgIGlmICh0cmFja01ldHJpY3MpIHNlZ0xlbiA9IE1hdGguc3FydChNYXRoLnBvdyhheCAtIGJ4LCAyKSArIE1hdGgucG93KGF5IC0gYnksIDIpKTtcblxuICAgICAgICBpZiAoYSA8IGsxKSB7XG4gICAgICAgICAgICAvLyAtLS18LS0+ICB8IChsaW5lIGVudGVycyB0aGUgY2xpcCByZWdpb24gZnJvbSB0aGUgbGVmdClcbiAgICAgICAgICAgIGlmIChiID4gazEpIHtcbiAgICAgICAgICAgICAgICB0ID0gaW50ZXJzZWN0KHNsaWNlLCBheCwgYXksIGJ4LCBieSwgazEpO1xuICAgICAgICAgICAgICAgIGlmICh0cmFja01ldHJpY3MpIHNsaWNlLnN0YXJ0ID0gbGVuICsgc2VnTGVuICogdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChhID4gazIpIHtcbiAgICAgICAgICAgIC8vIHwgIDwtLXwtLS0gKGxpbmUgZW50ZXJzIHRoZSBjbGlwIHJlZ2lvbiBmcm9tIHRoZSByaWdodClcbiAgICAgICAgICAgIGlmIChiIDwgazIpIHtcbiAgICAgICAgICAgICAgICB0ID0gaW50ZXJzZWN0KHNsaWNlLCBheCwgYXksIGJ4LCBieSwgazIpO1xuICAgICAgICAgICAgICAgIGlmICh0cmFja01ldHJpY3MpIHNsaWNlLnN0YXJ0ID0gbGVuICsgc2VnTGVuICogdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFkZFBvaW50KHNsaWNlLCBheCwgYXksIGF6KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYiA8IGsxICYmIGEgPj0gazEpIHtcbiAgICAgICAgICAgIC8vIDwtLXwtLS0gIHwgb3IgPC0tfC0tLS0tfC0tLSAobGluZSBleGl0cyB0aGUgY2xpcCByZWdpb24gb24gdGhlIGxlZnQpXG4gICAgICAgICAgICB0ID0gaW50ZXJzZWN0KHNsaWNlLCBheCwgYXksIGJ4LCBieSwgazEpO1xuICAgICAgICAgICAgZXhpdGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYiA+IGsyICYmIGEgPD0gazIpIHtcbiAgICAgICAgICAgIC8vIHwgIC0tLXwtLT4gb3IgLS0tfC0tLS0tfC0tPiAobGluZSBleGl0cyB0aGUgY2xpcCByZWdpb24gb24gdGhlIHJpZ2h0KVxuICAgICAgICAgICAgdCA9IGludGVyc2VjdChzbGljZSwgYXgsIGF5LCBieCwgYnksIGsyKTtcbiAgICAgICAgICAgIGV4aXRlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWlzUG9seWdvbiAmJiBleGl0ZWQpIHtcbiAgICAgICAgICAgIGlmICh0cmFja01ldHJpY3MpIHNsaWNlLmVuZCA9IGxlbiArIHNlZ0xlbiAqIHQ7XG4gICAgICAgICAgICBuZXdHZW9tLnB1c2goc2xpY2UpO1xuICAgICAgICAgICAgc2xpY2UgPSBuZXdTbGljZShnZW9tKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0cmFja01ldHJpY3MpIGxlbiArPSBzZWdMZW47XG4gICAgfVxuXG4gICAgLy8gYWRkIHRoZSBsYXN0IHBvaW50XG4gICAgdmFyIGxhc3QgPSBnZW9tLmxlbmd0aCAtIDM7XG4gICAgYXggPSBnZW9tW2xhc3RdO1xuICAgIGF5ID0gZ2VvbVtsYXN0ICsgMV07XG4gICAgYXogPSBnZW9tW2xhc3QgKyAyXTtcbiAgICBhID0gYXhpcyA9PT0gMCA/IGF4IDogYXk7XG4gICAgaWYgKGEgPj0gazEgJiYgYSA8PSBrMikgYWRkUG9pbnQoc2xpY2UsIGF4LCBheSwgYXopO1xuXG4gICAgLy8gY2xvc2UgdGhlIHBvbHlnb24gaWYgaXRzIGVuZHBvaW50cyBhcmUgbm90IHRoZSBzYW1lIGFmdGVyIGNsaXBwaW5nXG4gICAgbGFzdCA9IHNsaWNlLmxlbmd0aCAtIDM7XG4gICAgaWYgKGlzUG9seWdvbiAmJiBsYXN0ID49IDMgJiYgKHNsaWNlW2xhc3RdICE9PSBzbGljZVswXSB8fCBzbGljZVtsYXN0ICsgMV0gIT09IHNsaWNlWzFdKSkge1xuICAgICAgICBhZGRQb2ludChzbGljZSwgc2xpY2VbMF0sIHNsaWNlWzFdLCBzbGljZVsyXSk7XG4gICAgfVxuXG4gICAgLy8gYWRkIHRoZSBmaW5hbCBzbGljZVxuICAgIGlmIChzbGljZS5sZW5ndGgpIHtcbiAgICAgICAgbmV3R2VvbS5wdXNoKHNsaWNlKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIG5ld1NsaWNlKGxpbmUpIHtcbiAgICB2YXIgc2xpY2UgPSBbXTtcbiAgICBzbGljZS5zaXplID0gbGluZS5zaXplO1xuICAgIHNsaWNlLnN0YXJ0ID0gbGluZS5zdGFydDtcbiAgICBzbGljZS5lbmQgPSBsaW5lLmVuZDtcbiAgICByZXR1cm4gc2xpY2U7XG59XG5cbmZ1bmN0aW9uIGNsaXBMaW5lcyhnZW9tLCBuZXdHZW9tLCBrMSwgazIsIGF4aXMsIGlzUG9seWdvbikge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZ2VvbS5sZW5ndGg7IGkrKykge1xuICAgICAgICBjbGlwTGluZShnZW9tW2ldLCBuZXdHZW9tLCBrMSwgazIsIGF4aXMsIGlzUG9seWdvbiwgZmFsc2UpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gYWRkUG9pbnQob3V0LCB4LCB5LCB6KSB7XG4gICAgb3V0LnB1c2goeCk7XG4gICAgb3V0LnB1c2goeSk7XG4gICAgb3V0LnB1c2goeik7XG59XG5cbmZ1bmN0aW9uIGludGVyc2VjdFgob3V0LCBheCwgYXksIGJ4LCBieSwgeCkge1xuICAgIHZhciB0ID0gKHggLSBheCkgLyAoYnggLSBheCk7XG4gICAgb3V0LnB1c2goeCk7XG4gICAgb3V0LnB1c2goYXkgKyAoYnkgLSBheSkgKiB0KTtcbiAgICBvdXQucHVzaCgxKTtcbiAgICByZXR1cm4gdDtcbn1cblxuZnVuY3Rpb24gaW50ZXJzZWN0WShvdXQsIGF4LCBheSwgYngsIGJ5LCB5KSB7XG4gICAgdmFyIHQgPSAoeSAtIGF5KSAvIChieSAtIGF5KTtcbiAgICBvdXQucHVzaChheCArIChieCAtIGF4KSAqIHQpO1xuICAgIG91dC5wdXNoKHkpO1xuICAgIG91dC5wdXNoKDEpO1xuICAgIHJldHVybiB0O1xufVxuIiwiXG5pbXBvcnQgY2xpcCBmcm9tICcuL2NsaXAnO1xuaW1wb3J0IGNyZWF0ZUZlYXR1cmUgZnJvbSAnLi9mZWF0dXJlJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gd3JhcChmZWF0dXJlcywgb3B0aW9ucykge1xuICAgIHZhciBidWZmZXIgPSBvcHRpb25zLmJ1ZmZlciAvIG9wdGlvbnMuZXh0ZW50O1xuICAgIHZhciBtZXJnZWQgPSBmZWF0dXJlcztcbiAgICB2YXIgbGVmdCAgPSBjbGlwKGZlYXR1cmVzLCAxLCAtMSAtIGJ1ZmZlciwgYnVmZmVyLCAgICAgMCwgLTEsIDIsIG9wdGlvbnMpOyAvLyBsZWZ0IHdvcmxkIGNvcHlcbiAgICB2YXIgcmlnaHQgPSBjbGlwKGZlYXR1cmVzLCAxLCAgMSAtIGJ1ZmZlciwgMiArIGJ1ZmZlciwgMCwgLTEsIDIsIG9wdGlvbnMpOyAvLyByaWdodCB3b3JsZCBjb3B5XG5cbiAgICBpZiAobGVmdCB8fCByaWdodCkge1xuICAgICAgICBtZXJnZWQgPSBjbGlwKGZlYXR1cmVzLCAxLCAtYnVmZmVyLCAxICsgYnVmZmVyLCAwLCAtMSwgMiwgb3B0aW9ucykgfHwgW107IC8vIGNlbnRlciB3b3JsZCBjb3B5XG5cbiAgICAgICAgaWYgKGxlZnQpIG1lcmdlZCA9IHNoaWZ0RmVhdHVyZUNvb3JkcyhsZWZ0LCAxKS5jb25jYXQobWVyZ2VkKTsgLy8gbWVyZ2UgbGVmdCBpbnRvIGNlbnRlclxuICAgICAgICBpZiAocmlnaHQpIG1lcmdlZCA9IG1lcmdlZC5jb25jYXQoc2hpZnRGZWF0dXJlQ29vcmRzKHJpZ2h0LCAtMSkpOyAvLyBtZXJnZSByaWdodCBpbnRvIGNlbnRlclxuICAgIH1cblxuICAgIHJldHVybiBtZXJnZWQ7XG59XG5cbmZ1bmN0aW9uIHNoaWZ0RmVhdHVyZUNvb3JkcyhmZWF0dXJlcywgb2Zmc2V0KSB7XG4gICAgdmFyIG5ld0ZlYXR1cmVzID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBmZWF0dXJlID0gZmVhdHVyZXNbaV0sXG4gICAgICAgICAgICB0eXBlID0gZmVhdHVyZS50eXBlO1xuXG4gICAgICAgIHZhciBuZXdHZW9tZXRyeTtcblxuICAgICAgICBpZiAodHlwZSA9PT0gJ1BvaW50JyB8fCB0eXBlID09PSAnTXVsdGlQb2ludCcgfHwgdHlwZSA9PT0gJ0xpbmVTdHJpbmcnKSB7XG4gICAgICAgICAgICBuZXdHZW9tZXRyeSA9IHNoaWZ0Q29vcmRzKGZlYXR1cmUuZ2VvbWV0cnksIG9mZnNldCk7XG5cbiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnTXVsdGlMaW5lU3RyaW5nJyB8fCB0eXBlID09PSAnUG9seWdvbicpIHtcbiAgICAgICAgICAgIG5ld0dlb21ldHJ5ID0gW107XG4gICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGZlYXR1cmUuZ2VvbWV0cnkubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICBuZXdHZW9tZXRyeS5wdXNoKHNoaWZ0Q29vcmRzKGZlYXR1cmUuZ2VvbWV0cnlbal0sIG9mZnNldCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdNdWx0aVBvbHlnb24nKSB7XG4gICAgICAgICAgICBuZXdHZW9tZXRyeSA9IFtdO1xuICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGZlYXR1cmUuZ2VvbWV0cnkubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgbmV3UG9seWdvbiA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgZmVhdHVyZS5nZW9tZXRyeVtqXS5sZW5ndGg7IGsrKykge1xuICAgICAgICAgICAgICAgICAgICBuZXdQb2x5Z29uLnB1c2goc2hpZnRDb29yZHMoZmVhdHVyZS5nZW9tZXRyeVtqXVtrXSwgb2Zmc2V0KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG5ld0dlb21ldHJ5LnB1c2gobmV3UG9seWdvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBuZXdGZWF0dXJlcy5wdXNoKGNyZWF0ZUZlYXR1cmUoZmVhdHVyZS5pZCwgdHlwZSwgbmV3R2VvbWV0cnksIGZlYXR1cmUudGFncykpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXdGZWF0dXJlcztcbn1cblxuZnVuY3Rpb24gc2hpZnRDb29yZHMocG9pbnRzLCBvZmZzZXQpIHtcbiAgICB2YXIgbmV3UG9pbnRzID0gW107XG4gICAgbmV3UG9pbnRzLnNpemUgPSBwb2ludHMuc2l6ZTtcblxuICAgIGlmIChwb2ludHMuc3RhcnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBuZXdQb2ludHMuc3RhcnQgPSBwb2ludHMuc3RhcnQ7XG4gICAgICAgIG5ld1BvaW50cy5lbmQgPSBwb2ludHMuZW5kO1xuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcG9pbnRzLmxlbmd0aDsgaSArPSAzKSB7XG4gICAgICAgIG5ld1BvaW50cy5wdXNoKHBvaW50c1tpXSArIG9mZnNldCwgcG9pbnRzW2kgKyAxXSwgcG9pbnRzW2kgKyAyXSk7XG4gICAgfVxuICAgIHJldHVybiBuZXdQb2ludHM7XG59XG4iLCJcbi8vIFRyYW5zZm9ybXMgdGhlIGNvb3JkaW5hdGVzIG9mIGVhY2ggZmVhdHVyZSBpbiB0aGUgZ2l2ZW4gdGlsZSBmcm9tXG4vLyBtZXJjYXRvci1wcm9qZWN0ZWQgc3BhY2UgaW50byAoZXh0ZW50IHggZXh0ZW50KSB0aWxlIHNwYWNlLlxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdHJhbnNmb3JtVGlsZSh0aWxlLCBleHRlbnQpIHtcbiAgICBpZiAodGlsZS50cmFuc2Zvcm1lZCkgcmV0dXJuIHRpbGU7XG5cbiAgICB2YXIgejIgPSAxIDw8IHRpbGUueixcbiAgICAgICAgdHggPSB0aWxlLngsXG4gICAgICAgIHR5ID0gdGlsZS55LFxuICAgICAgICBpLCBqLCBrO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IHRpbGUuZmVhdHVyZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGZlYXR1cmUgPSB0aWxlLmZlYXR1cmVzW2ldLFxuICAgICAgICAgICAgZ2VvbSA9IGZlYXR1cmUuZ2VvbWV0cnksXG4gICAgICAgICAgICB0eXBlID0gZmVhdHVyZS50eXBlO1xuXG4gICAgICAgIGZlYXR1cmUuZ2VvbWV0cnkgPSBbXTtcblxuICAgICAgICBpZiAodHlwZSA9PT0gMSkge1xuICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGdlb20ubGVuZ3RoOyBqICs9IDIpIHtcbiAgICAgICAgICAgICAgICBmZWF0dXJlLmdlb21ldHJ5LnB1c2godHJhbnNmb3JtUG9pbnQoZ2VvbVtqXSwgZ2VvbVtqICsgMV0sIGV4dGVudCwgejIsIHR4LCB0eSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGdlb20ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgcmluZyA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBnZW9tW2pdLmxlbmd0aDsgayArPSAyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJpbmcucHVzaCh0cmFuc2Zvcm1Qb2ludChnZW9tW2pdW2tdLCBnZW9tW2pdW2sgKyAxXSwgZXh0ZW50LCB6MiwgdHgsIHR5KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZlYXR1cmUuZ2VvbWV0cnkucHVzaChyaW5nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHRpbGUudHJhbnNmb3JtZWQgPSB0cnVlO1xuXG4gICAgcmV0dXJuIHRpbGU7XG59XG5cbmZ1bmN0aW9uIHRyYW5zZm9ybVBvaW50KHgsIHksIGV4dGVudCwgejIsIHR4LCB0eSkge1xuICAgIHJldHVybiBbXG4gICAgICAgIE1hdGgucm91bmQoZXh0ZW50ICogKHggKiB6MiAtIHR4KSksXG4gICAgICAgIE1hdGgucm91bmQoZXh0ZW50ICogKHkgKiB6MiAtIHR5KSldO1xufVxuIiwiXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjcmVhdGVUaWxlKGZlYXR1cmVzLCB6LCB0eCwgdHksIG9wdGlvbnMpIHtcbiAgICB2YXIgdG9sZXJhbmNlID0geiA9PT0gb3B0aW9ucy5tYXhab29tID8gMCA6IG9wdGlvbnMudG9sZXJhbmNlIC8gKCgxIDw8IHopICogb3B0aW9ucy5leHRlbnQpO1xuICAgIHZhciB0aWxlID0ge1xuICAgICAgICBmZWF0dXJlczogW10sXG4gICAgICAgIG51bVBvaW50czogMCxcbiAgICAgICAgbnVtU2ltcGxpZmllZDogMCxcbiAgICAgICAgbnVtRmVhdHVyZXM6IDAsXG4gICAgICAgIHNvdXJjZTogbnVsbCxcbiAgICAgICAgeDogdHgsXG4gICAgICAgIHk6IHR5LFxuICAgICAgICB6OiB6LFxuICAgICAgICB0cmFuc2Zvcm1lZDogZmFsc2UsXG4gICAgICAgIG1pblg6IDIsXG4gICAgICAgIG1pblk6IDEsXG4gICAgICAgIG1heFg6IC0xLFxuICAgICAgICBtYXhZOiAwXG4gICAgfTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRpbGUubnVtRmVhdHVyZXMrKztcbiAgICAgICAgYWRkRmVhdHVyZSh0aWxlLCBmZWF0dXJlc1tpXSwgdG9sZXJhbmNlLCBvcHRpb25zKTtcblxuICAgICAgICB2YXIgbWluWCA9IGZlYXR1cmVzW2ldLm1pblg7XG4gICAgICAgIHZhciBtaW5ZID0gZmVhdHVyZXNbaV0ubWluWTtcbiAgICAgICAgdmFyIG1heFggPSBmZWF0dXJlc1tpXS5tYXhYO1xuICAgICAgICB2YXIgbWF4WSA9IGZlYXR1cmVzW2ldLm1heFk7XG5cbiAgICAgICAgaWYgKG1pblggPCB0aWxlLm1pblgpIHRpbGUubWluWCA9IG1pblg7XG4gICAgICAgIGlmIChtaW5ZIDwgdGlsZS5taW5ZKSB0aWxlLm1pblkgPSBtaW5ZO1xuICAgICAgICBpZiAobWF4WCA+IHRpbGUubWF4WCkgdGlsZS5tYXhYID0gbWF4WDtcbiAgICAgICAgaWYgKG1heFkgPiB0aWxlLm1heFkpIHRpbGUubWF4WSA9IG1heFk7XG4gICAgfVxuICAgIHJldHVybiB0aWxlO1xufVxuXG5mdW5jdGlvbiBhZGRGZWF0dXJlKHRpbGUsIGZlYXR1cmUsIHRvbGVyYW5jZSwgb3B0aW9ucykge1xuXG4gICAgdmFyIGdlb20gPSBmZWF0dXJlLmdlb21ldHJ5LFxuICAgICAgICB0eXBlID0gZmVhdHVyZS50eXBlLFxuICAgICAgICBzaW1wbGlmaWVkID0gW107XG5cbiAgICBpZiAodHlwZSA9PT0gJ1BvaW50JyB8fCB0eXBlID09PSAnTXVsdGlQb2ludCcpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBnZW9tLmxlbmd0aDsgaSArPSAzKSB7XG4gICAgICAgICAgICBzaW1wbGlmaWVkLnB1c2goZ2VvbVtpXSk7XG4gICAgICAgICAgICBzaW1wbGlmaWVkLnB1c2goZ2VvbVtpICsgMV0pO1xuICAgICAgICAgICAgdGlsZS5udW1Qb2ludHMrKztcbiAgICAgICAgICAgIHRpbGUubnVtU2ltcGxpZmllZCsrO1xuICAgICAgICB9XG5cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdMaW5lU3RyaW5nJykge1xuICAgICAgICBhZGRMaW5lKHNpbXBsaWZpZWQsIGdlb20sIHRpbGUsIHRvbGVyYW5jZSwgZmFsc2UsIGZhbHNlKTtcblxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ011bHRpTGluZVN0cmluZycgfHwgdHlwZSA9PT0gJ1BvbHlnb24nKSB7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBnZW9tLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBhZGRMaW5lKHNpbXBsaWZpZWQsIGdlb21baV0sIHRpbGUsIHRvbGVyYW5jZSwgdHlwZSA9PT0gJ1BvbHlnb24nLCBpID09PSAwKTtcbiAgICAgICAgfVxuXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnTXVsdGlQb2x5Z29uJykge1xuXG4gICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgZ2VvbS5sZW5ndGg7IGsrKykge1xuICAgICAgICAgICAgdmFyIHBvbHlnb24gPSBnZW9tW2tdO1xuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBvbHlnb24ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBhZGRMaW5lKHNpbXBsaWZpZWQsIHBvbHlnb25baV0sIHRpbGUsIHRvbGVyYW5jZSwgdHJ1ZSwgaSA9PT0gMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc2ltcGxpZmllZC5sZW5ndGgpIHtcbiAgICAgICAgdmFyIHRhZ3MgPSBmZWF0dXJlLnRhZ3MgfHwgbnVsbDtcbiAgICAgICAgaWYgKHR5cGUgPT09ICdMaW5lU3RyaW5nJyAmJiBvcHRpb25zLmxpbmVNZXRyaWNzKSB7XG4gICAgICAgICAgICB0YWdzID0ge307XG4gICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gZmVhdHVyZS50YWdzKSB0YWdzW2tleV0gPSBmZWF0dXJlLnRhZ3Nba2V5XTtcbiAgICAgICAgICAgIHRhZ3NbJ21hcGJveF9jbGlwX3N0YXJ0J10gPSBnZW9tLnN0YXJ0IC8gZ2VvbS5zaXplO1xuICAgICAgICAgICAgdGFnc1snbWFwYm94X2NsaXBfZW5kJ10gPSBnZW9tLmVuZCAvIGdlb20uc2l6ZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdGlsZUZlYXR1cmUgPSB7XG4gICAgICAgICAgICBnZW9tZXRyeTogc2ltcGxpZmllZCxcbiAgICAgICAgICAgIHR5cGU6IHR5cGUgPT09ICdQb2x5Z29uJyB8fCB0eXBlID09PSAnTXVsdGlQb2x5Z29uJyA/IDMgOlxuICAgICAgICAgICAgICAgIHR5cGUgPT09ICdMaW5lU3RyaW5nJyB8fCB0eXBlID09PSAnTXVsdGlMaW5lU3RyaW5nJyA/IDIgOiAxLFxuICAgICAgICAgICAgdGFnczogdGFnc1xuICAgICAgICB9O1xuICAgICAgICBpZiAoZmVhdHVyZS5pZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdGlsZUZlYXR1cmUuaWQgPSBmZWF0dXJlLmlkO1xuICAgICAgICB9XG4gICAgICAgIHRpbGUuZmVhdHVyZXMucHVzaCh0aWxlRmVhdHVyZSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBhZGRMaW5lKHJlc3VsdCwgZ2VvbSwgdGlsZSwgdG9sZXJhbmNlLCBpc1BvbHlnb24sIGlzT3V0ZXIpIHtcbiAgICB2YXIgc3FUb2xlcmFuY2UgPSB0b2xlcmFuY2UgKiB0b2xlcmFuY2U7XG5cbiAgICBpZiAodG9sZXJhbmNlID4gMCAmJiAoZ2VvbS5zaXplIDwgKGlzUG9seWdvbiA/IHNxVG9sZXJhbmNlIDogdG9sZXJhbmNlKSkpIHtcbiAgICAgICAgdGlsZS5udW1Qb2ludHMgKz0gZ2VvbS5sZW5ndGggLyAzO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHJpbmcgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZ2VvbS5sZW5ndGg7IGkgKz0gMykge1xuICAgICAgICBpZiAodG9sZXJhbmNlID09PSAwIHx8IGdlb21baSArIDJdID4gc3FUb2xlcmFuY2UpIHtcbiAgICAgICAgICAgIHRpbGUubnVtU2ltcGxpZmllZCsrO1xuICAgICAgICAgICAgcmluZy5wdXNoKGdlb21baV0pO1xuICAgICAgICAgICAgcmluZy5wdXNoKGdlb21baSArIDFdKTtcbiAgICAgICAgfVxuICAgICAgICB0aWxlLm51bVBvaW50cysrO1xuICAgIH1cblxuICAgIGlmIChpc1BvbHlnb24pIHJld2luZChyaW5nLCBpc091dGVyKTtcblxuICAgIHJlc3VsdC5wdXNoKHJpbmcpO1xufVxuXG5mdW5jdGlvbiByZXdpbmQocmluZywgY2xvY2t3aXNlKSB7XG4gICAgdmFyIGFyZWEgPSAwO1xuICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSByaW5nLmxlbmd0aCwgaiA9IGxlbiAtIDI7IGkgPCBsZW47IGogPSBpLCBpICs9IDIpIHtcbiAgICAgICAgYXJlYSArPSAocmluZ1tpXSAtIHJpbmdbal0pICogKHJpbmdbaSArIDFdICsgcmluZ1tqICsgMV0pO1xuICAgIH1cbiAgICBpZiAoYXJlYSA+IDAgPT09IGNsb2Nrd2lzZSkge1xuICAgICAgICBmb3IgKGkgPSAwLCBsZW4gPSByaW5nLmxlbmd0aDsgaSA8IGxlbiAvIDI7IGkgKz0gMikge1xuICAgICAgICAgICAgdmFyIHggPSByaW5nW2ldO1xuICAgICAgICAgICAgdmFyIHkgPSByaW5nW2kgKyAxXTtcbiAgICAgICAgICAgIHJpbmdbaV0gPSByaW5nW2xlbiAtIDIgLSBpXTtcbiAgICAgICAgICAgIHJpbmdbaSArIDFdID0gcmluZ1tsZW4gLSAxIC0gaV07XG4gICAgICAgICAgICByaW5nW2xlbiAtIDIgLSBpXSA9IHg7XG4gICAgICAgICAgICByaW5nW2xlbiAtIDEgLSBpXSA9IHk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJcbmltcG9ydCBjb252ZXJ0IGZyb20gJy4vY29udmVydCc7ICAgICAvLyBHZW9KU09OIGNvbnZlcnNpb24gYW5kIHByZXByb2Nlc3NpbmdcbmltcG9ydCBjbGlwIGZyb20gJy4vY2xpcCc7ICAgICAgICAgICAvLyBzdHJpcGUgY2xpcHBpbmcgYWxnb3JpdGhtXG5pbXBvcnQgd3JhcCBmcm9tICcuL3dyYXAnOyAgICAgICAgICAgLy8gZGF0ZSBsaW5lIHByb2Nlc3NpbmdcbmltcG9ydCB0cmFuc2Zvcm0gZnJvbSAnLi90cmFuc2Zvcm0nOyAvLyBjb29yZGluYXRlIHRyYW5zZm9ybWF0aW9uXG5pbXBvcnQgY3JlYXRlVGlsZSBmcm9tICcuL3RpbGUnOyAgICAgLy8gZmluYWwgc2ltcGxpZmllZCB0aWxlIGdlbmVyYXRpb25cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2VvanNvbnZ0KGRhdGEsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gbmV3IEdlb0pTT05WVChkYXRhLCBvcHRpb25zKTtcbn1cblxuZnVuY3Rpb24gR2VvSlNPTlZUKGRhdGEsIG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gdGhpcy5vcHRpb25zID0gZXh0ZW5kKE9iamVjdC5jcmVhdGUodGhpcy5vcHRpb25zKSwgb3B0aW9ucyk7XG5cbiAgICB2YXIgZGVidWcgPSBvcHRpb25zLmRlYnVnO1xuXG4gICAgaWYgKGRlYnVnKSBjb25zb2xlLnRpbWUoJ3ByZXByb2Nlc3MgZGF0YScpO1xuXG4gICAgaWYgKG9wdGlvbnMubWF4Wm9vbSA8IDAgfHwgb3B0aW9ucy5tYXhab29tID4gMjQpIHRocm93IG5ldyBFcnJvcignbWF4Wm9vbSBzaG91bGQgYmUgaW4gdGhlIDAtMjQgcmFuZ2UnKTtcbiAgICBpZiAob3B0aW9ucy5wcm9tb3RlSWQgJiYgb3B0aW9ucy5nZW5lcmF0ZUlkKSB0aHJvdyBuZXcgRXJyb3IoJ3Byb21vdGVJZCBhbmQgZ2VuZXJhdGVJZCBjYW5ub3QgYmUgdXNlZCB0b2dldGhlci4nKTtcblxuICAgIHZhciBmZWF0dXJlcyA9IGNvbnZlcnQoZGF0YSwgb3B0aW9ucyk7XG5cbiAgICB0aGlzLnRpbGVzID0ge307XG4gICAgdGhpcy50aWxlQ29vcmRzID0gW107XG5cbiAgICBpZiAoZGVidWcpIHtcbiAgICAgICAgY29uc29sZS50aW1lRW5kKCdwcmVwcm9jZXNzIGRhdGEnKTtcbiAgICAgICAgY29uc29sZS5sb2coJ2luZGV4OiBtYXhab29tOiAlZCwgbWF4UG9pbnRzOiAlZCcsIG9wdGlvbnMuaW5kZXhNYXhab29tLCBvcHRpb25zLmluZGV4TWF4UG9pbnRzKTtcbiAgICAgICAgY29uc29sZS50aW1lKCdnZW5lcmF0ZSB0aWxlcycpO1xuICAgICAgICB0aGlzLnN0YXRzID0ge307XG4gICAgICAgIHRoaXMudG90YWwgPSAwO1xuICAgIH1cblxuICAgIGZlYXR1cmVzID0gd3JhcChmZWF0dXJlcywgb3B0aW9ucyk7XG5cbiAgICAvLyBzdGFydCBzbGljaW5nIGZyb20gdGhlIHRvcCB0aWxlIGRvd25cbiAgICBpZiAoZmVhdHVyZXMubGVuZ3RoKSB0aGlzLnNwbGl0VGlsZShmZWF0dXJlcywgMCwgMCwgMCk7XG5cbiAgICBpZiAoZGVidWcpIHtcbiAgICAgICAgaWYgKGZlYXR1cmVzLmxlbmd0aCkgY29uc29sZS5sb2coJ2ZlYXR1cmVzOiAlZCwgcG9pbnRzOiAlZCcsIHRoaXMudGlsZXNbMF0ubnVtRmVhdHVyZXMsIHRoaXMudGlsZXNbMF0ubnVtUG9pbnRzKTtcbiAgICAgICAgY29uc29sZS50aW1lRW5kKCdnZW5lcmF0ZSB0aWxlcycpO1xuICAgICAgICBjb25zb2xlLmxvZygndGlsZXMgZ2VuZXJhdGVkOicsIHRoaXMudG90YWwsIEpTT04uc3RyaW5naWZ5KHRoaXMuc3RhdHMpKTtcbiAgICB9XG59XG5cbkdlb0pTT05WVC5wcm90b3R5cGUub3B0aW9ucyA9IHtcbiAgICBtYXhab29tOiAxNCwgICAgICAgICAgICAvLyBtYXggem9vbSB0byBwcmVzZXJ2ZSBkZXRhaWwgb25cbiAgICBpbmRleE1heFpvb206IDUsICAgICAgICAvLyBtYXggem9vbSBpbiB0aGUgdGlsZSBpbmRleFxuICAgIGluZGV4TWF4UG9pbnRzOiAxMDAwMDAsIC8vIG1heCBudW1iZXIgb2YgcG9pbnRzIHBlciB0aWxlIGluIHRoZSB0aWxlIGluZGV4XG4gICAgdG9sZXJhbmNlOiAzLCAgICAgICAgICAgLy8gc2ltcGxpZmljYXRpb24gdG9sZXJhbmNlIChoaWdoZXIgbWVhbnMgc2ltcGxlcilcbiAgICBleHRlbnQ6IDQwOTYsICAgICAgICAgICAvLyB0aWxlIGV4dGVudFxuICAgIGJ1ZmZlcjogNjQsICAgICAgICAgICAgIC8vIHRpbGUgYnVmZmVyIG9uIGVhY2ggc2lkZVxuICAgIGxpbmVNZXRyaWNzOiBmYWxzZSwgICAgIC8vIHdoZXRoZXIgdG8gY2FsY3VsYXRlIGxpbmUgbWV0cmljc1xuICAgIHByb21vdGVJZDogbnVsbCwgICAgICAgIC8vIG5hbWUgb2YgYSBmZWF0dXJlIHByb3BlcnR5IHRvIGJlIHByb21vdGVkIHRvIGZlYXR1cmUuaWRcbiAgICBnZW5lcmF0ZUlkOiBmYWxzZSwgICAgICAvLyB3aGV0aGVyIHRvIGdlbmVyYXRlIGZlYXR1cmUgaWRzLiBDYW5ub3QgYmUgdXNlZCB3aXRoIHByb21vdGVJZFxuICAgIGRlYnVnOiAwICAgICAgICAgICAgICAgIC8vIGxvZ2dpbmcgbGV2ZWwgKDAsIDEgb3IgMilcbn07XG5cbkdlb0pTT05WVC5wcm90b3R5cGUuc3BsaXRUaWxlID0gZnVuY3Rpb24gKGZlYXR1cmVzLCB6LCB4LCB5LCBjeiwgY3gsIGN5KSB7XG5cbiAgICB2YXIgc3RhY2sgPSBbZmVhdHVyZXMsIHosIHgsIHldLFxuICAgICAgICBvcHRpb25zID0gdGhpcy5vcHRpb25zLFxuICAgICAgICBkZWJ1ZyA9IG9wdGlvbnMuZGVidWc7XG5cbiAgICAvLyBhdm9pZCByZWN1cnNpb24gYnkgdXNpbmcgYSBwcm9jZXNzaW5nIHF1ZXVlXG4gICAgd2hpbGUgKHN0YWNrLmxlbmd0aCkge1xuICAgICAgICB5ID0gc3RhY2sucG9wKCk7XG4gICAgICAgIHggPSBzdGFjay5wb3AoKTtcbiAgICAgICAgeiA9IHN0YWNrLnBvcCgpO1xuICAgICAgICBmZWF0dXJlcyA9IHN0YWNrLnBvcCgpO1xuXG4gICAgICAgIHZhciB6MiA9IDEgPDwgeixcbiAgICAgICAgICAgIGlkID0gdG9JRCh6LCB4LCB5KSxcbiAgICAgICAgICAgIHRpbGUgPSB0aGlzLnRpbGVzW2lkXTtcblxuICAgICAgICBpZiAoIXRpbGUpIHtcbiAgICAgICAgICAgIGlmIChkZWJ1ZyA+IDEpIGNvbnNvbGUudGltZSgnY3JlYXRpb24nKTtcblxuICAgICAgICAgICAgdGlsZSA9IHRoaXMudGlsZXNbaWRdID0gY3JlYXRlVGlsZShmZWF0dXJlcywgeiwgeCwgeSwgb3B0aW9ucyk7XG4gICAgICAgICAgICB0aGlzLnRpbGVDb29yZHMucHVzaCh7ejogeiwgeDogeCwgeTogeX0pO1xuXG4gICAgICAgICAgICBpZiAoZGVidWcpIHtcbiAgICAgICAgICAgICAgICBpZiAoZGVidWcgPiAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCd0aWxlIHolZC0lZC0lZCAoZmVhdHVyZXM6ICVkLCBwb2ludHM6ICVkLCBzaW1wbGlmaWVkOiAlZCknLFxuICAgICAgICAgICAgICAgICAgICAgICAgeiwgeCwgeSwgdGlsZS5udW1GZWF0dXJlcywgdGlsZS5udW1Qb2ludHMsIHRpbGUubnVtU2ltcGxpZmllZCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUudGltZUVuZCgnY3JlYXRpb24nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGtleSA9ICd6JyArIHo7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0c1trZXldID0gKHRoaXMuc3RhdHNba2V5XSB8fCAwKSArIDE7XG4gICAgICAgICAgICAgICAgdGhpcy50b3RhbCsrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gc2F2ZSByZWZlcmVuY2UgdG8gb3JpZ2luYWwgZ2VvbWV0cnkgaW4gdGlsZSBzbyB0aGF0IHdlIGNhbiBkcmlsbCBkb3duIGxhdGVyIGlmIHdlIHN0b3Agbm93XG4gICAgICAgIHRpbGUuc291cmNlID0gZmVhdHVyZXM7XG5cbiAgICAgICAgLy8gaWYgaXQncyB0aGUgZmlyc3QtcGFzcyB0aWxpbmdcbiAgICAgICAgaWYgKCFjeikge1xuICAgICAgICAgICAgLy8gc3RvcCB0aWxpbmcgaWYgd2UgcmVhY2hlZCBtYXggem9vbSwgb3IgaWYgdGhlIHRpbGUgaXMgdG9vIHNpbXBsZVxuICAgICAgICAgICAgaWYgKHogPT09IG9wdGlvbnMuaW5kZXhNYXhab29tIHx8IHRpbGUubnVtUG9pbnRzIDw9IG9wdGlvbnMuaW5kZXhNYXhQb2ludHMpIGNvbnRpbnVlO1xuXG4gICAgICAgIC8vIGlmIGEgZHJpbGxkb3duIHRvIGEgc3BlY2lmaWMgdGlsZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gc3RvcCB0aWxpbmcgaWYgd2UgcmVhY2hlZCBiYXNlIHpvb20gb3Igb3VyIHRhcmdldCB0aWxlIHpvb21cbiAgICAgICAgICAgIGlmICh6ID09PSBvcHRpb25zLm1heFpvb20gfHwgeiA9PT0gY3opIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAvLyBzdG9wIHRpbGluZyBpZiBpdCdzIG5vdCBhbiBhbmNlc3RvciBvZiB0aGUgdGFyZ2V0IHRpbGVcbiAgICAgICAgICAgIHZhciBtID0gMSA8PCAoY3ogLSB6KTtcbiAgICAgICAgICAgIGlmICh4ICE9PSBNYXRoLmZsb29yKGN4IC8gbSkgfHwgeSAhPT0gTWF0aC5mbG9vcihjeSAvIG0pKSBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGlmIHdlIHNsaWNlIGZ1cnRoZXIgZG93biwgbm8gbmVlZCB0byBrZWVwIHNvdXJjZSBnZW9tZXRyeVxuICAgICAgICB0aWxlLnNvdXJjZSA9IG51bGw7XG5cbiAgICAgICAgaWYgKGZlYXR1cmVzLmxlbmd0aCA9PT0gMCkgY29udGludWU7XG5cbiAgICAgICAgaWYgKGRlYnVnID4gMSkgY29uc29sZS50aW1lKCdjbGlwcGluZycpO1xuXG4gICAgICAgIC8vIHZhbHVlcyB3ZSdsbCB1c2UgZm9yIGNsaXBwaW5nXG4gICAgICAgIHZhciBrMSA9IDAuNSAqIG9wdGlvbnMuYnVmZmVyIC8gb3B0aW9ucy5leHRlbnQsXG4gICAgICAgICAgICBrMiA9IDAuNSAtIGsxLFxuICAgICAgICAgICAgazMgPSAwLjUgKyBrMSxcbiAgICAgICAgICAgIGs0ID0gMSArIGsxLFxuICAgICAgICAgICAgdGwsIGJsLCB0ciwgYnIsIGxlZnQsIHJpZ2h0O1xuXG4gICAgICAgIHRsID0gYmwgPSB0ciA9IGJyID0gbnVsbDtcblxuICAgICAgICBsZWZ0ICA9IGNsaXAoZmVhdHVyZXMsIHoyLCB4IC0gazEsIHggKyBrMywgMCwgdGlsZS5taW5YLCB0aWxlLm1heFgsIG9wdGlvbnMpO1xuICAgICAgICByaWdodCA9IGNsaXAoZmVhdHVyZXMsIHoyLCB4ICsgazIsIHggKyBrNCwgMCwgdGlsZS5taW5YLCB0aWxlLm1heFgsIG9wdGlvbnMpO1xuICAgICAgICBmZWF0dXJlcyA9IG51bGw7XG5cbiAgICAgICAgaWYgKGxlZnQpIHtcbiAgICAgICAgICAgIHRsID0gY2xpcChsZWZ0LCB6MiwgeSAtIGsxLCB5ICsgazMsIDEsIHRpbGUubWluWSwgdGlsZS5tYXhZLCBvcHRpb25zKTtcbiAgICAgICAgICAgIGJsID0gY2xpcChsZWZ0LCB6MiwgeSArIGsyLCB5ICsgazQsIDEsIHRpbGUubWluWSwgdGlsZS5tYXhZLCBvcHRpb25zKTtcbiAgICAgICAgICAgIGxlZnQgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJpZ2h0KSB7XG4gICAgICAgICAgICB0ciA9IGNsaXAocmlnaHQsIHoyLCB5IC0gazEsIHkgKyBrMywgMSwgdGlsZS5taW5ZLCB0aWxlLm1heFksIG9wdGlvbnMpO1xuICAgICAgICAgICAgYnIgPSBjbGlwKHJpZ2h0LCB6MiwgeSArIGsyLCB5ICsgazQsIDEsIHRpbGUubWluWSwgdGlsZS5tYXhZLCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJpZ2h0ID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkZWJ1ZyA+IDEpIGNvbnNvbGUudGltZUVuZCgnY2xpcHBpbmcnKTtcblxuICAgICAgICBzdGFjay5wdXNoKHRsIHx8IFtdLCB6ICsgMSwgeCAqIDIsICAgICB5ICogMik7XG4gICAgICAgIHN0YWNrLnB1c2goYmwgfHwgW10sIHogKyAxLCB4ICogMiwgICAgIHkgKiAyICsgMSk7XG4gICAgICAgIHN0YWNrLnB1c2godHIgfHwgW10sIHogKyAxLCB4ICogMiArIDEsIHkgKiAyKTtcbiAgICAgICAgc3RhY2sucHVzaChiciB8fCBbXSwgeiArIDEsIHggKiAyICsgMSwgeSAqIDIgKyAxKTtcbiAgICB9XG59O1xuXG5HZW9KU09OVlQucHJvdG90eXBlLmdldFRpbGUgPSBmdW5jdGlvbiAoeiwgeCwgeSkge1xuICAgIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zLFxuICAgICAgICBleHRlbnQgPSBvcHRpb25zLmV4dGVudCxcbiAgICAgICAgZGVidWcgPSBvcHRpb25zLmRlYnVnO1xuXG4gICAgaWYgKHogPCAwIHx8IHogPiAyNCkgcmV0dXJuIG51bGw7XG5cbiAgICB2YXIgejIgPSAxIDw8IHo7XG4gICAgeCA9ICgoeCAlIHoyKSArIHoyKSAlIHoyOyAvLyB3cmFwIHRpbGUgeCBjb29yZGluYXRlXG5cbiAgICB2YXIgaWQgPSB0b0lEKHosIHgsIHkpO1xuICAgIGlmICh0aGlzLnRpbGVzW2lkXSkgcmV0dXJuIHRyYW5zZm9ybSh0aGlzLnRpbGVzW2lkXSwgZXh0ZW50KTtcblxuICAgIGlmIChkZWJ1ZyA+IDEpIGNvbnNvbGUubG9nKCdkcmlsbGluZyBkb3duIHRvIHolZC0lZC0lZCcsIHosIHgsIHkpO1xuXG4gICAgdmFyIHowID0geixcbiAgICAgICAgeDAgPSB4LFxuICAgICAgICB5MCA9IHksXG4gICAgICAgIHBhcmVudDtcblxuICAgIHdoaWxlICghcGFyZW50ICYmIHowID4gMCkge1xuICAgICAgICB6MC0tO1xuICAgICAgICB4MCA9IE1hdGguZmxvb3IoeDAgLyAyKTtcbiAgICAgICAgeTAgPSBNYXRoLmZsb29yKHkwIC8gMik7XG4gICAgICAgIHBhcmVudCA9IHRoaXMudGlsZXNbdG9JRCh6MCwgeDAsIHkwKV07XG4gICAgfVxuXG4gICAgaWYgKCFwYXJlbnQgfHwgIXBhcmVudC5zb3VyY2UpIHJldHVybiBudWxsO1xuXG4gICAgLy8gaWYgd2UgZm91bmQgYSBwYXJlbnQgdGlsZSBjb250YWluaW5nIHRoZSBvcmlnaW5hbCBnZW9tZXRyeSwgd2UgY2FuIGRyaWxsIGRvd24gZnJvbSBpdFxuICAgIGlmIChkZWJ1ZyA+IDEpIGNvbnNvbGUubG9nKCdmb3VuZCBwYXJlbnQgdGlsZSB6JWQtJWQtJWQnLCB6MCwgeDAsIHkwKTtcblxuICAgIGlmIChkZWJ1ZyA+IDEpIGNvbnNvbGUudGltZSgnZHJpbGxpbmcgZG93bicpO1xuICAgIHRoaXMuc3BsaXRUaWxlKHBhcmVudC5zb3VyY2UsIHowLCB4MCwgeTAsIHosIHgsIHkpO1xuICAgIGlmIChkZWJ1ZyA+IDEpIGNvbnNvbGUudGltZUVuZCgnZHJpbGxpbmcgZG93bicpO1xuXG4gICAgcmV0dXJuIHRoaXMudGlsZXNbaWRdID8gdHJhbnNmb3JtKHRoaXMudGlsZXNbaWRdLCBleHRlbnQpIDogbnVsbDtcbn07XG5cbmZ1bmN0aW9uIHRvSUQoeiwgeCwgeSkge1xuICAgIHJldHVybiAoKCgxIDw8IHopICogeSArIHgpICogMzIpICsgejtcbn1cblxuZnVuY3Rpb24gZXh0ZW5kKGRlc3QsIHNyYykge1xuICAgIGZvciAodmFyIGkgaW4gc3JjKSBkZXN0W2ldID0gc3JjW2ldO1xuICAgIHJldHVybiBkZXN0O1xufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHsgZ2V0SlNPTiB9IGZyb20gJy4uL3V0aWwvYWpheCc7XG5cbmltcG9ydCBwZXJmb3JtYW5jZSBmcm9tICcuLi91dGlsL3BlcmZvcm1hbmNlJztcbmltcG9ydCByZXdpbmQgZnJvbSAnQG1hcGJveC9nZW9qc29uLXJld2luZCc7XG5pbXBvcnQgR2VvSlNPTldyYXBwZXIgZnJvbSAnLi9nZW9qc29uX3dyYXBwZXInO1xuaW1wb3J0IHZ0cGJmIGZyb20gJ3Z0LXBiZic7XG5pbXBvcnQgU3VwZXJjbHVzdGVyIGZyb20gJ3N1cGVyY2x1c3Rlcic7XG5pbXBvcnQgZ2VvanNvbnZ0IGZyb20gJ2dlb2pzb24tdnQnO1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IFZlY3RvclRpbGVXb3JrZXJTb3VyY2UgZnJvbSAnLi92ZWN0b3JfdGlsZV93b3JrZXJfc291cmNlJztcbmltcG9ydCB7IGNyZWF0ZUV4cHJlc3Npb24gfSBmcm9tICcuLi9zdHlsZS1zcGVjL2V4cHJlc3Npb24nO1xuXG5pbXBvcnQgdHlwZSB7XG4gICAgV29ya2VyVGlsZVBhcmFtZXRlcnMsXG4gICAgV29ya2VyVGlsZUNhbGxiYWNrLFxufSBmcm9tICcuLi9zb3VyY2Uvd29ya2VyX3NvdXJjZSc7XG5cbmltcG9ydCB0eXBlIEFjdG9yIGZyb20gJy4uL3V0aWwvYWN0b3InO1xuaW1wb3J0IHR5cGUgU3R5bGVMYXllckluZGV4IGZyb20gJy4uL3N0eWxlL3N0eWxlX2xheWVyX2luZGV4JztcblxuaW1wb3J0IHR5cGUge0xvYWRWZWN0b3JEYXRhQ2FsbGJhY2t9IGZyb20gJy4vdmVjdG9yX3RpbGVfd29ya2VyX3NvdXJjZSc7XG5pbXBvcnQgdHlwZSB7IFJlcXVlc3RQYXJhbWV0ZXJzLCBSZXNwb25zZUNhbGxiYWNrIH0gZnJvbSAnLi4vdXRpbC9hamF4JztcbmltcG9ydCB0eXBlIHsgQ2FsbGJhY2sgfSBmcm9tICcuLi90eXBlcy9jYWxsYmFjayc7XG5pbXBvcnQgdHlwZSB7R2VvSlNPTkZlYXR1cmV9IGZyb20gJ0BtYXBib3gvZ2VvanNvbi10eXBlcyc7XG5cbmV4cG9ydCB0eXBlIExvYWRHZW9KU09OUGFyYW1ldGVycyA9IHtcbiAgICByZXF1ZXN0PzogUmVxdWVzdFBhcmFtZXRlcnMsXG4gICAgZGF0YT86IHN0cmluZyxcbiAgICBzb3VyY2U6IHN0cmluZyxcbiAgICBjbHVzdGVyOiBib29sZWFuLFxuICAgIHN1cGVyY2x1c3Rlck9wdGlvbnM/OiBPYmplY3QsXG4gICAgZ2VvanNvblZ0T3B0aW9ucz86IE9iamVjdCxcbiAgICBjbHVzdGVyUHJvcGVydGllcz86IE9iamVjdFxufTtcblxuZXhwb3J0IHR5cGUgTG9hZEdlb0pTT04gPSAocGFyYW1zOiBMb2FkR2VvSlNPTlBhcmFtZXRlcnMsIGNhbGxiYWNrOiBSZXNwb25zZUNhbGxiYWNrPE9iamVjdD4pID0+IHZvaWQ7XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2VvSlNPTkluZGV4IHtcbiAgICBnZXRUaWxlKHo6IG51bWJlciwgeDogbnVtYmVyLCB5OiBudW1iZXIpOiBPYmplY3Q7XG5cbiAgICAvLyBzdXBlcmNsdXN0ZXIgbWV0aG9kc1xuICAgIGdldENsdXN0ZXJFeHBhbnNpb25ab29tKGNsdXN0ZXJJZDogbnVtYmVyKTogbnVtYmVyO1xuICAgIGdldENoaWxkcmVuKGNsdXN0ZXJJZDogbnVtYmVyKTogQXJyYXk8R2VvSlNPTkZlYXR1cmU+O1xuICAgIGdldExlYXZlcyhjbHVzdGVySWQ6IG51bWJlciwgbGltaXQ6IG51bWJlciwgb2Zmc2V0OiBudW1iZXIpOiBBcnJheTxHZW9KU09ORmVhdHVyZT47XG59XG5cbmZ1bmN0aW9uIGxvYWRHZW9KU09OVGlsZShwYXJhbXM6IFdvcmtlclRpbGVQYXJhbWV0ZXJzLCBjYWxsYmFjazogTG9hZFZlY3RvckRhdGFDYWxsYmFjaykge1xuICAgIGNvbnN0IGNhbm9uaWNhbCA9IHBhcmFtcy50aWxlSUQuY2Fub25pY2FsO1xuXG4gICAgaWYgKCF0aGlzLl9nZW9KU09OSW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwsIG51bGwpOyAgLy8gd2UgY291bGRuJ3QgbG9hZCB0aGUgZmlsZVxuICAgIH1cblxuICAgIGNvbnN0IGdlb0pTT05UaWxlID0gdGhpcy5fZ2VvSlNPTkluZGV4LmdldFRpbGUoY2Fub25pY2FsLnosIGNhbm9uaWNhbC54LCBjYW5vbmljYWwueSk7XG4gICAgaWYgKCFnZW9KU09OVGlsZSkge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2sobnVsbCwgbnVsbCk7IC8vIG5vdGhpbmcgaW4gdGhlIGdpdmVuIHRpbGVcbiAgICB9XG5cbiAgICBjb25zdCBnZW9qc29uV3JhcHBlciA9IG5ldyBHZW9KU09OV3JhcHBlcihnZW9KU09OVGlsZS5mZWF0dXJlcyk7XG5cbiAgICAvLyBFbmNvZGUgdGhlIGdlb2pzb24tdnQgdGlsZSBpbnRvIGJpbmFyeSB2ZWN0b3IgdGlsZSBmb3JtLiAgVGhpc1xuICAgIC8vIGlzIGEgY29udmVuaWVuY2UgdGhhdCBhbGxvd3MgYEZlYXR1cmVJbmRleGAgdG8gb3BlcmF0ZSB0aGUgc2FtZSB3YXlcbiAgICAvLyBhY3Jvc3MgYFZlY3RvclRpbGVTb3VyY2VgIGFuZCBgR2VvSlNPTlNvdXJjZWAgZGF0YS5cbiAgICBsZXQgcGJmID0gdnRwYmYoZ2VvanNvbldyYXBwZXIpO1xuICAgIGlmIChwYmYuYnl0ZU9mZnNldCAhPT0gMCB8fCBwYmYuYnl0ZUxlbmd0aCAhPT0gcGJmLmJ1ZmZlci5ieXRlTGVuZ3RoKSB7XG4gICAgICAgIC8vIENvbXBhdGliaWxpdHkgd2l0aCBub2RlIEJ1ZmZlciAoaHR0cHM6Ly9naXRodWIuY29tL21hcGJveC9wYmYvaXNzdWVzLzM1KVxuICAgICAgICBwYmYgPSBuZXcgVWludDhBcnJheShwYmYpO1xuICAgIH1cblxuICAgIGNhbGxiYWNrKG51bGwsIHtcbiAgICAgICAgdmVjdG9yVGlsZTogZ2VvanNvbldyYXBwZXIsXG4gICAgICAgIHJhd0RhdGE6IHBiZi5idWZmZXJcbiAgICB9KTtcbn1cblxuZXhwb3J0IHR5cGUgU291cmNlU3RhdGUgPVxuICAgIHwgJ0lkbGUnICAgICAgICAgICAgLy8gU291cmNlIGVtcHR5IG9yIGRhdGEgbG9hZGVkXG4gICAgfCAnQ29hbGVzY2luZycgICAgICAvLyBEYXRhIGZpbmlzaGVkIGxvYWRpbmcsIGJ1dCBkaXNjYXJkICdsb2FkRGF0YScgbWVzc2FnZXMgdW50aWwgcmVjZWl2aW5nICdjb2FsZXNjZWQnXG4gICAgfCAnTmVlZHNMb2FkRGF0YSc7ICAvLyAnbG9hZERhdGEnIHJlY2VpdmVkIHdoaWxlIGNvYWxlc2NpbmcsIHRyaWdnZXIgb25lIG1vcmUgJ2xvYWREYXRhJyBvbiByZWNlaXZpbmcgJ2NvYWxlc2NlZCdcblxuLyoqXG4gKiBUaGUge0BsaW5rIFdvcmtlclNvdXJjZX0gaW1wbGVtZW50YXRpb24gdGhhdCBzdXBwb3J0cyB7QGxpbmsgR2VvSlNPTlNvdXJjZX0uXG4gKiBUaGlzIGNsYXNzIGlzIGRlc2lnbmVkIHRvIGJlIGVhc2lseSByZXVzZWQgdG8gc3VwcG9ydCBjdXN0b20gc291cmNlIHR5cGVzXG4gKiBmb3IgZGF0YSBmb3JtYXRzIHRoYXQgY2FuIGJlIHBhcnNlZC9jb252ZXJ0ZWQgaW50byBhbiBpbi1tZW1vcnkgR2VvSlNPTlxuICogcmVwcmVzZW50YXRpb24uICBUbyBkbyBzbywgY3JlYXRlIGl0IHdpdGhcbiAqIGBuZXcgR2VvSlNPTldvcmtlclNvdXJjZShhY3RvciwgbGF5ZXJJbmRleCwgY3VzdG9tTG9hZEdlb0pTT05GdW5jdGlvbilgLlxuICogRm9yIGEgZnVsbCBleGFtcGxlLCBzZWUgW21hcGJveC1nbC10b3BvanNvbl0oaHR0cHM6Ly9naXRodWIuY29tL2RldmVsb3BtZW50c2VlZC9tYXBib3gtZ2wtdG9wb2pzb24pLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIEdlb0pTT05Xb3JrZXJTb3VyY2UgZXh0ZW5kcyBWZWN0b3JUaWxlV29ya2VyU291cmNlIHtcbiAgICBsb2FkR2VvSlNPTjogTG9hZEdlb0pTT047XG4gICAgX3N0YXRlOiBTb3VyY2VTdGF0ZTtcbiAgICBfcGVuZGluZ0NhbGxiYWNrOiBDYWxsYmFjazx7XG4gICAgICAgIHJlc291cmNlVGltaW5nPzoge1tzdHJpbmddOiBBcnJheTxQZXJmb3JtYW5jZVJlc291cmNlVGltaW5nPn0sXG4gICAgICAgIGFiYW5kb25lZD86IGJvb2xlYW4gfT47XG4gICAgX3BlbmRpbmdMb2FkRGF0YVBhcmFtczogTG9hZEdlb0pTT05QYXJhbWV0ZXJzO1xuICAgIF9nZW9KU09OSW5kZXg6IEdlb0pTT05JbmRleFxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIFtsb2FkR2VvSlNPTl0gT3B0aW9uYWwgbWV0aG9kIGZvciBjdXN0b20gbG9hZGluZy9wYXJzaW5nIG9mXG4gICAgICogR2VvSlNPTiBiYXNlZCBvbiBwYXJhbWV0ZXJzIHBhc3NlZCBmcm9tIHRoZSBtYWluLXRocmVhZCBTb3VyY2UuXG4gICAgICogU2VlIHtAbGluayBHZW9KU09OV29ya2VyU291cmNlI2xvYWRHZW9KU09OfS5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihhY3RvcjogQWN0b3IsIGxheWVySW5kZXg6IFN0eWxlTGF5ZXJJbmRleCwgbG9hZEdlb0pTT046ID9Mb2FkR2VvSlNPTikge1xuICAgICAgICBzdXBlcihhY3RvciwgbGF5ZXJJbmRleCwgbG9hZEdlb0pTT05UaWxlKTtcbiAgICAgICAgaWYgKGxvYWRHZW9KU09OKSB7XG4gICAgICAgICAgICB0aGlzLmxvYWRHZW9KU09OID0gbG9hZEdlb0pTT047XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGZXRjaGVzIChpZiBhcHByb3ByaWF0ZSksIHBhcnNlcywgYW5kIGluZGV4IGdlb2pzb24gZGF0YSBpbnRvIHRpbGVzLiBUaGlzXG4gICAgICogcHJlcGFyYXRvcnkgbWV0aG9kIG11c3QgYmUgY2FsbGVkIGJlZm9yZSB7QGxpbmsgR2VvSlNPTldvcmtlclNvdXJjZSNsb2FkVGlsZX1cbiAgICAgKiBjYW4gY29ycmVjdGx5IHNlcnZlIHVwIHRpbGVzLlxuICAgICAqXG4gICAgICogRGVmZXJzIHRvIHtAbGluayBHZW9KU09OV29ya2VyU291cmNlI2xvYWRHZW9KU09OfSBmb3IgdGhlIGZldGNoaW5nL3BhcnNpbmcsXG4gICAgICogZXhwZWN0aW5nIGBjYWxsYmFjayhlcnJvciwgZGF0YSlgIHRvIGJlIGNhbGxlZCB3aXRoIGVpdGhlciBhbiBlcnJvciBvciBhXG4gICAgICogcGFyc2VkIEdlb0pTT04gb2JqZWN0LlxuICAgICAqXG4gICAgICogV2hlbiBgbG9hZERhdGFgIHJlcXVlc3RzIGNvbWUgaW4gZmFzdGVyIHRoYW4gdGhleSBjYW4gYmUgcHJvY2Vzc2VkLFxuICAgICAqIHRoZXkgYXJlIGNvYWxlc2NlZCBpbnRvIGEgc2luZ2xlIHJlcXVlc3QgdXNpbmcgdGhlIGxhdGVzdCBkYXRhLlxuICAgICAqIFNlZSB7QGxpbmsgR2VvSlNPTldvcmtlclNvdXJjZSNjb2FsZXNjZX1cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwYXJhbXNcbiAgICAgKiBAcGFyYW0gY2FsbGJhY2tcbiAgICAgKi9cbiAgICBsb2FkRGF0YShwYXJhbXM6IExvYWRHZW9KU09OUGFyYW1ldGVycywgY2FsbGJhY2s6IENhbGxiYWNrPHtcbiAgICAgICAgcmVzb3VyY2VUaW1pbmc/OiB7W3N0cmluZ106IEFycmF5PFBlcmZvcm1hbmNlUmVzb3VyY2VUaW1pbmc+fSxcbiAgICAgICAgYWJhbmRvbmVkPzogYm9vbGVhbiB9Pikge1xuICAgICAgICBpZiAodGhpcy5fcGVuZGluZ0NhbGxiYWNrKSB7XG4gICAgICAgICAgICAvLyBUZWxsIHRoZSBmb3JlZ3JvdW5kIHRoZSBwcmV2aW91cyBjYWxsIGhhcyBiZWVuIGFiYW5kb25lZFxuICAgICAgICAgICAgdGhpcy5fcGVuZGluZ0NhbGxiYWNrKG51bGwsIHsgYWJhbmRvbmVkOiB0cnVlIH0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3BlbmRpbmdDYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgICAgICB0aGlzLl9wZW5kaW5nTG9hZERhdGFQYXJhbXMgPSBwYXJhbXM7XG5cbiAgICAgICAgaWYgKHRoaXMuX3N0YXRlICYmXG4gICAgICAgICAgICB0aGlzLl9zdGF0ZSAhPT0gJ0lkbGUnKSB7XG4gICAgICAgICAgICB0aGlzLl9zdGF0ZSA9ICdOZWVkc0xvYWREYXRhJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3N0YXRlID0gJ0NvYWxlc2NpbmcnO1xuICAgICAgICAgICAgdGhpcy5fbG9hZERhdGEoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEludGVybmFsIGltcGxlbWVudGF0aW9uOiBjYWxsZWQgZGlyZWN0bHkgYnkgYGxvYWREYXRhYFxuICAgICAqIG9yIGJ5IGBjb2FsZXNjZWAgdXNpbmcgc3RvcmVkIHBhcmFtZXRlcnMuXG4gICAgICovXG4gICAgX2xvYWREYXRhKCkge1xuICAgICAgICBpZiAoIXRoaXMuX3BlbmRpbmdDYWxsYmFjayB8fCAhdGhpcy5fcGVuZGluZ0xvYWREYXRhUGFyYW1zKSB7XG4gICAgICAgICAgICBhc3NlcnQoZmFsc2UpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNhbGxiYWNrID0gdGhpcy5fcGVuZGluZ0NhbGxiYWNrO1xuICAgICAgICBjb25zdCBwYXJhbXMgPSB0aGlzLl9wZW5kaW5nTG9hZERhdGFQYXJhbXM7XG4gICAgICAgIGRlbGV0ZSB0aGlzLl9wZW5kaW5nQ2FsbGJhY2s7XG4gICAgICAgIGRlbGV0ZSB0aGlzLl9wZW5kaW5nTG9hZERhdGFQYXJhbXM7XG5cbiAgICAgICAgY29uc3QgcGVyZiA9IChwYXJhbXMgJiYgcGFyYW1zLnJlcXVlc3QgJiYgcGFyYW1zLnJlcXVlc3QuY29sbGVjdFJlc291cmNlVGltaW5nKSA/XG4gICAgICAgICAgICBuZXcgcGVyZm9ybWFuY2UuUGVyZm9ybWFuY2UocGFyYW1zLnJlcXVlc3QpIDogZmFsc2U7XG5cbiAgICAgICAgdGhpcy5sb2FkR2VvSlNPTihwYXJhbXMsIChlcnI6ID9FcnJvciwgZGF0YTogP09iamVjdCkgPT4ge1xuICAgICAgICAgICAgaWYgKGVyciB8fCAhZGF0YSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZGF0YSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobmV3IEVycm9yKFwiSW5wdXQgZGF0YSBpcyBub3QgYSB2YWxpZCBHZW9KU09OIG9iamVjdC5cIikpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXdpbmQoZGF0YSwgdHJ1ZSk7XG5cbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9nZW9KU09OSW5kZXggPSBwYXJhbXMuY2x1c3RlciA/XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3VwZXJjbHVzdGVyKGdldFN1cGVyY2x1c3Rlck9wdGlvbnMocGFyYW1zKSkubG9hZChkYXRhLmZlYXR1cmVzKSA6XG4gICAgICAgICAgICAgICAgICAgICAgICBnZW9qc29udnQoZGF0YSwgcGFyYW1zLmdlb2pzb25WdE9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRlZCA9IHt9O1xuXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgICAgICAgICAgICAgaWYgKHBlcmYpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzb3VyY2VUaW1pbmdEYXRhID0gcGVyZi5maW5pc2goKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gaXQncyBuZWNlc3NhcnkgdG8gZXZhbCB0aGUgcmVzdWx0IG9mIGdldEVudHJpZXNCeU5hbWUoKSBoZXJlIHZpYSBwYXJzZS9zdHJpbmdpZnlcbiAgICAgICAgICAgICAgICAgICAgLy8gbGF0ZSBldmFsdWF0aW9uIGluIHRoZSBtYWluIHRocmVhZCBjYXVzZXMgVHlwZUVycm9yOiBpbGxlZ2FsIGludm9jYXRpb25cbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc291cmNlVGltaW5nRGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnJlc291cmNlVGltaW5nID0ge307XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucmVzb3VyY2VUaW1pbmdbcGFyYW1zLnNvdXJjZV0gPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHJlc291cmNlVGltaW5nRGF0YSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHJlc3VsdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdoaWxlIHByb2Nlc3NpbmcgYGxvYWREYXRhYCwgd2UgY29hbGVzY2UgYWxsIGZ1cnRoZXJcbiAgICAgKiBgbG9hZERhdGFgIG1lc3NhZ2VzIGludG8gYSBzaW5nbGUgY2FsbCB0byBfbG9hZERhdGFcbiAgICAgKiB0aGF0IHdpbGwgaGFwcGVuIG9uY2Ugd2UndmUgZmluaXNoZWQgcHJvY2Vzc2luZyB0aGVcbiAgICAgKiBmaXJzdCBtZXNzYWdlLiB7QGxpbmsgR2VvSlNPTlNvdXJjZSNfdXBkYXRlV29ya2VyRGF0YX1cbiAgICAgKiBpcyByZXNwb25zaWJsZSBmb3Igc2VuZGluZyB1cyB0aGUgYGNvYWxlc2NlYCBtZXNzYWdlXG4gICAgICogYXQgdGhlIHRpbWUgaXQgcmVjZWl2ZXMgYSByZXNwb25zZSBmcm9tIGBsb2FkRGF0YWBcbiAgICAgKlxuICAgICAqICAgICAgICAgIFN0YXRlOiBJZGxlXG4gICAgICogICAgICAgICAgw6LChsKRICAgICAgICAgIHxcbiAgICAgKiAgICAgJ2NvYWxlc2NlJyAgICdsb2FkRGF0YSdcbiAgICAgKiAgICAgICAgICB8ICAgICAodHJpZ2dlcnMgbG9hZClcbiAgICAgKiAgICAgICAgICB8ICAgICAgICAgIMOiwobCk1xuICAgICAqICAgICAgICBTdGF0ZTogQ29hbGVzY2luZ1xuICAgICAqICAgICAgICAgIMOiwobCkSAgICAgICAgICB8XG4gICAgICogICAodHJpZ2dlcnMgbG9hZCkgICB8XG4gICAgICogICAgICdjb2FsZXNjZScgICAnbG9hZERhdGEnXG4gICAgICogICAgICAgICAgfCAgICAgICAgICDDosKGwpNcbiAgICAgKiAgICAgICAgU3RhdGU6IE5lZWRzTG9hZERhdGFcbiAgICAgKi9cbiAgICBjb2FsZXNjZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3N0YXRlID09PSAnQ29hbGVzY2luZycpIHtcbiAgICAgICAgICAgIHRoaXMuX3N0YXRlID0gJ0lkbGUnO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX3N0YXRlID09PSAnTmVlZHNMb2FkRGF0YScpIHtcbiAgICAgICAgICAgIHRoaXMuX3N0YXRlID0gJ0NvYWxlc2NpbmcnO1xuICAgICAgICAgICAgdGhpcy5fbG9hZERhdGEoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICogSW1wbGVtZW50cyB7QGxpbmsgV29ya2VyU291cmNlI3JlbG9hZFRpbGV9LlxuICAgICpcbiAgICAqIElmIHRoZSB0aWxlIGlzIGxvYWRlZCwgdXNlcyB0aGUgaW1wbGVtZW50YXRpb24gaW4gVmVjdG9yVGlsZVdvcmtlclNvdXJjZS5cbiAgICAqIE90aGVyd2lzZSwgc3VjaCBhcyBhZnRlciBhIHNldERhdGEoKSBjYWxsLCB3ZSBsb2FkIHRoZSB0aWxlIGZyZXNoLlxuICAgICpcbiAgICAqIEBwYXJhbSBwYXJhbXNcbiAgICAqIEBwYXJhbSBwYXJhbXMudWlkIFRoZSBVSUQgZm9yIHRoaXMgdGlsZS5cbiAgICAqL1xuICAgIHJlbG9hZFRpbGUocGFyYW1zOiBXb3JrZXJUaWxlUGFyYW1ldGVycywgY2FsbGJhY2s6IFdvcmtlclRpbGVDYWxsYmFjaykge1xuICAgICAgICBjb25zdCBsb2FkZWQgPSB0aGlzLmxvYWRlZCxcbiAgICAgICAgICAgIHVpZCA9IHBhcmFtcy51aWQ7XG5cbiAgICAgICAgaWYgKGxvYWRlZCAmJiBsb2FkZWRbdWlkXSkge1xuICAgICAgICAgICAgcmV0dXJuIHN1cGVyLnJlbG9hZFRpbGUocGFyYW1zLCBjYWxsYmFjayk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sb2FkVGlsZShwYXJhbXMsIGNhbGxiYWNrKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZldGNoIGFuZCBwYXJzZSBHZW9KU09OIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4gcGFyYW1zLiAgQ2FsbHMgYGNhbGxiYWNrYFxuICAgICAqIHdpdGggYChlcnIsIGRhdGEpYCwgd2hlcmUgYGRhdGFgIGlzIGEgcGFyc2VkIEdlb0pTT04gb2JqZWN0LlxuICAgICAqXG4gICAgICogR2VvSlNPTiBpcyBsb2FkZWQgYW5kIHBhcnNlZCBmcm9tIGBwYXJhbXMudXJsYCBpZiBpdCBleGlzdHMsIG9yIGVsc2VcbiAgICAgKiBleHBlY3RlZCBhcyBhIGxpdGVyYWwgKHN0cmluZyBvciBvYmplY3QpIGBwYXJhbXMuZGF0YWAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcGFyYW1zXG4gICAgICogQHBhcmFtIFtwYXJhbXMudXJsXSBBIFVSTCB0byB0aGUgcmVtb3RlIEdlb0pTT04gZGF0YS5cbiAgICAgKiBAcGFyYW0gW3BhcmFtcy5kYXRhXSBMaXRlcmFsIEdlb0pTT04gZGF0YS4gTXVzdCBiZSBwcm92aWRlZCBpZiBgcGFyYW1zLnVybGAgaXMgbm90LlxuICAgICAqL1xuICAgIGxvYWRHZW9KU09OKHBhcmFtczogTG9hZEdlb0pTT05QYXJhbWV0ZXJzLCBjYWxsYmFjazogUmVzcG9uc2VDYWxsYmFjazxPYmplY3Q+KSB7XG4gICAgICAgIC8vIEJlY2F1c2Ugb2Ygc2FtZSBvcmlnaW4gaXNzdWVzLCB1cmxzIG11c3QgZWl0aGVyIGluY2x1ZGUgYW4gZXhwbGljaXRcbiAgICAgICAgLy8gb3JpZ2luIG9yIGFic29sdXRlIHBhdGguXG4gICAgICAgIC8vIGllOiAvZm9vL2Jhci5qc29uIG9yIGh0dHA6Ly9leGFtcGxlLmNvbS9iYXIuanNvblxuICAgICAgICAvLyBidXQgbm90IC4uL2Zvby9iYXIuanNvblxuICAgICAgICBpZiAocGFyYW1zLnJlcXVlc3QpIHtcbiAgICAgICAgICAgIGdldEpTT04ocGFyYW1zLnJlcXVlc3QsIGNhbGxiYWNrKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgcGFyYW1zLmRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhudWxsLCBKU09OLnBhcnNlKHBhcmFtcy5kYXRhKSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG5ldyBFcnJvcihcIklucHV0IGRhdGEgaXMgbm90IGEgdmFsaWQgR2VvSlNPTiBvYmplY3QuXCIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhuZXcgRXJyb3IoXCJJbnB1dCBkYXRhIGlzIG5vdCBhIHZhbGlkIEdlb0pTT04gb2JqZWN0LlwiKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZW1vdmVTb3VyY2UocGFyYW1zOiB7c291cmNlOiBzdHJpbmd9LCBjYWxsYmFjazogQ2FsbGJhY2s8bWl4ZWQ+KSB7XG4gICAgICAgIGlmICh0aGlzLl9wZW5kaW5nQ2FsbGJhY2spIHtcbiAgICAgICAgICAgIC8vIERvbid0IGxlYWsgY2FsbGJhY2tzXG4gICAgICAgICAgICB0aGlzLl9wZW5kaW5nQ2FsbGJhY2sobnVsbCwgeyBhYmFuZG9uZWQ6IHRydWUgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICB9XG5cbiAgICBnZXRDbHVzdGVyRXhwYW5zaW9uWm9vbShwYXJhbXM6IHtjbHVzdGVySWQ6IG51bWJlcn0sIGNhbGxiYWNrOiBDYWxsYmFjazxudW1iZXI+KSB7XG4gICAgICAgIGNhbGxiYWNrKG51bGwsIHRoaXMuX2dlb0pTT05JbmRleC5nZXRDbHVzdGVyRXhwYW5zaW9uWm9vbShwYXJhbXMuY2x1c3RlcklkKSk7XG4gICAgfVxuXG4gICAgZ2V0Q2x1c3RlckNoaWxkcmVuKHBhcmFtczoge2NsdXN0ZXJJZDogbnVtYmVyfSwgY2FsbGJhY2s6IENhbGxiYWNrPEFycmF5PEdlb0pTT05GZWF0dXJlPj4pIHtcbiAgICAgICAgY2FsbGJhY2sobnVsbCwgdGhpcy5fZ2VvSlNPTkluZGV4LmdldENoaWxkcmVuKHBhcmFtcy5jbHVzdGVySWQpKTtcbiAgICB9XG5cbiAgICBnZXRDbHVzdGVyTGVhdmVzKHBhcmFtczoge2NsdXN0ZXJJZDogbnVtYmVyLCBsaW1pdDogbnVtYmVyLCBvZmZzZXQ6IG51bWJlcn0sIGNhbGxiYWNrOiBDYWxsYmFjazxBcnJheTxHZW9KU09ORmVhdHVyZT4+KSB7XG4gICAgICAgIGNhbGxiYWNrKG51bGwsIHRoaXMuX2dlb0pTT05JbmRleC5nZXRMZWF2ZXMocGFyYW1zLmNsdXN0ZXJJZCwgcGFyYW1zLmxpbWl0LCBwYXJhbXMub2Zmc2V0KSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBnZXRTdXBlcmNsdXN0ZXJPcHRpb25zKHtzdXBlcmNsdXN0ZXJPcHRpb25zLCBjbHVzdGVyUHJvcGVydGllc30pIHtcbiAgICBpZiAoIWNsdXN0ZXJQcm9wZXJ0aWVzIHx8ICFzdXBlcmNsdXN0ZXJPcHRpb25zKSByZXR1cm4gc3VwZXJjbHVzdGVyT3B0aW9ucztcblxuICAgIGNvbnN0IG1hcEV4cHJlc3Npb25zID0ge307XG4gICAgY29uc3QgcmVkdWNlRXhwcmVzc2lvbnMgPSB7fTtcbiAgICBjb25zdCBnbG9iYWxzID0ge2FjY3VtdWxhdGVkOiBudWxsLCB6b29tOiAwfTtcbiAgICBjb25zdCBmZWF0dXJlID0ge3Byb3BlcnRpZXM6IG51bGx9O1xuICAgIGNvbnN0IHByb3BlcnR5TmFtZXMgPSBPYmplY3Qua2V5cyhjbHVzdGVyUHJvcGVydGllcyk7XG5cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBwcm9wZXJ0eU5hbWVzKSB7XG4gICAgICAgIGNvbnN0IFtvcGVyYXRvciwgbWFwRXhwcmVzc2lvbl0gPSBjbHVzdGVyUHJvcGVydGllc1trZXldO1xuXG4gICAgICAgIGNvbnN0IG1hcEV4cHJlc3Npb25QYXJzZWQgPSBjcmVhdGVFeHByZXNzaW9uKG1hcEV4cHJlc3Npb24pO1xuICAgICAgICBjb25zdCByZWR1Y2VFeHByZXNzaW9uUGFyc2VkID0gY3JlYXRlRXhwcmVzc2lvbihcbiAgICAgICAgICAgIHR5cGVvZiBvcGVyYXRvciA9PT0gJ3N0cmluZycgPyBbb3BlcmF0b3IsIFsnYWNjdW11bGF0ZWQnXSwgWydnZXQnLCBrZXldXSA6IG9wZXJhdG9yKTtcblxuICAgICAgICBhc3NlcnQobWFwRXhwcmVzc2lvblBhcnNlZC5yZXN1bHQgPT09ICdzdWNjZXNzJyk7XG4gICAgICAgIGFzc2VydChyZWR1Y2VFeHByZXNzaW9uUGFyc2VkLnJlc3VsdCA9PT0gJ3N1Y2Nlc3MnKTtcblxuICAgICAgICBtYXBFeHByZXNzaW9uc1trZXldID0gbWFwRXhwcmVzc2lvblBhcnNlZC52YWx1ZTtcbiAgICAgICAgcmVkdWNlRXhwcmVzc2lvbnNba2V5XSA9IHJlZHVjZUV4cHJlc3Npb25QYXJzZWQudmFsdWU7XG4gICAgfVxuXG4gICAgc3VwZXJjbHVzdGVyT3B0aW9ucy5tYXAgPSAocG9pbnRQcm9wZXJ0aWVzKSA9PiB7XG4gICAgICAgIGZlYXR1cmUucHJvcGVydGllcyA9IHBvaW50UHJvcGVydGllcztcbiAgICAgICAgY29uc3QgcHJvcGVydGllcyA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBwcm9wZXJ0eU5hbWVzKSB7XG4gICAgICAgICAgICBwcm9wZXJ0aWVzW2tleV0gPSBtYXBFeHByZXNzaW9uc1trZXldLmV2YWx1YXRlKGdsb2JhbHMsIGZlYXR1cmUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm9wZXJ0aWVzO1xuICAgIH07XG4gICAgc3VwZXJjbHVzdGVyT3B0aW9ucy5yZWR1Y2UgPSAoYWNjdW11bGF0ZWQsIGNsdXN0ZXJQcm9wZXJ0aWVzKSA9PiB7XG4gICAgICAgIGZlYXR1cmUucHJvcGVydGllcyA9IGNsdXN0ZXJQcm9wZXJ0aWVzO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBwcm9wZXJ0eU5hbWVzKSB7XG4gICAgICAgICAgICBnbG9iYWxzLmFjY3VtdWxhdGVkID0gYWNjdW11bGF0ZWRba2V5XTtcbiAgICAgICAgICAgIGFjY3VtdWxhdGVkW2tleV0gPSByZWR1Y2VFeHByZXNzaW9uc1trZXldLmV2YWx1YXRlKGdsb2JhbHMsIGZlYXR1cmUpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiBzdXBlcmNsdXN0ZXJPcHRpb25zO1xufVxuXG5leHBvcnQgZGVmYXVsdCBHZW9KU09OV29ya2VyU291cmNlO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IEFjdG9yIGZyb20gJy4uL3V0aWwvYWN0b3InO1xuXG5pbXBvcnQgU3R5bGVMYXllckluZGV4IGZyb20gJy4uL3N0eWxlL3N0eWxlX2xheWVyX2luZGV4JztcbmltcG9ydCBWZWN0b3JUaWxlV29ya2VyU291cmNlIGZyb20gJy4vdmVjdG9yX3RpbGVfd29ya2VyX3NvdXJjZSc7XG5pbXBvcnQgUmFzdGVyREVNVGlsZVdvcmtlclNvdXJjZSBmcm9tICcuL3Jhc3Rlcl9kZW1fdGlsZV93b3JrZXJfc291cmNlJztcbmltcG9ydCBHZW9KU09OV29ya2VyU291cmNlIGZyb20gJy4vZ2VvanNvbl93b3JrZXJfc291cmNlJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7IHBsdWdpbiBhcyBnbG9iYWxSVExUZXh0UGx1Z2luIH0gZnJvbSAnLi9ydGxfdGV4dF9wbHVnaW4nO1xuXG5pbXBvcnQgdHlwZSB7XG4gICAgV29ya2VyU291cmNlLFxuICAgIFdvcmtlclRpbGVQYXJhbWV0ZXJzLFxuICAgIFdvcmtlckRFTVRpbGVQYXJhbWV0ZXJzLFxuICAgIFdvcmtlclRpbGVDYWxsYmFjayxcbiAgICBXb3JrZXJERU1UaWxlQ2FsbGJhY2ssXG4gICAgVGlsZVBhcmFtZXRlcnNcbn0gZnJvbSAnLi4vc291cmNlL3dvcmtlcl9zb3VyY2UnO1xuXG5pbXBvcnQgdHlwZSB7V29ya2VyR2xvYmFsU2NvcGVJbnRlcmZhY2V9IGZyb20gJy4uL3V0aWwvd2ViX3dvcmtlcic7XG5pbXBvcnQgdHlwZSB7Q2FsbGJhY2t9IGZyb20gJy4uL3R5cGVzL2NhbGxiYWNrJztcbmltcG9ydCB0eXBlIHtMYXllclNwZWNpZmljYXRpb259IGZyb20gJy4uL3N0eWxlLXNwZWMvdHlwZXMnO1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFdvcmtlciB7XG4gICAgc2VsZjogV29ya2VyR2xvYmFsU2NvcGVJbnRlcmZhY2U7XG4gICAgYWN0b3I6IEFjdG9yO1xuICAgIGxheWVySW5kZXhlczogeyBbc3RyaW5nXTogU3R5bGVMYXllckluZGV4IH07XG4gICAgd29ya2VyU291cmNlVHlwZXM6IHsgW3N0cmluZ106IENsYXNzPFdvcmtlclNvdXJjZT4gfTtcbiAgICB3b3JrZXJTb3VyY2VzOiB7IFtzdHJpbmddOiB7IFtzdHJpbmddOiB7IFtzdHJpbmddOiBXb3JrZXJTb3VyY2UgfSB9IH07XG4gICAgZGVtV29ya2VyU291cmNlczogeyBbc3RyaW5nXTogeyBbc3RyaW5nXTogUmFzdGVyREVNVGlsZVdvcmtlclNvdXJjZSB9IH07XG4gICAgcmVmZXJyZXI6ID9zdHJpbmc7XG5cbiAgICBjb25zdHJ1Y3RvcihzZWxmOiBXb3JrZXJHbG9iYWxTY29wZUludGVyZmFjZSkge1xuICAgICAgICB0aGlzLnNlbGYgPSBzZWxmO1xuICAgICAgICB0aGlzLmFjdG9yID0gbmV3IEFjdG9yKHNlbGYsIHRoaXMpO1xuXG4gICAgICAgIHRoaXMubGF5ZXJJbmRleGVzID0ge307XG5cbiAgICAgICAgdGhpcy53b3JrZXJTb3VyY2VUeXBlcyA9IHtcbiAgICAgICAgICAgIHZlY3RvcjogVmVjdG9yVGlsZVdvcmtlclNvdXJjZSxcbiAgICAgICAgICAgIGdlb2pzb246IEdlb0pTT05Xb3JrZXJTb3VyY2VcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBbbWFwSWRdW3NvdXJjZVR5cGVdW3NvdXJjZU5hbWVdID0+IHdvcmtlciBzb3VyY2UgaW5zdGFuY2VcbiAgICAgICAgdGhpcy53b3JrZXJTb3VyY2VzID0ge307XG4gICAgICAgIHRoaXMuZGVtV29ya2VyU291cmNlcyA9IHt9O1xuXG4gICAgICAgIHRoaXMuc2VsZi5yZWdpc3RlcldvcmtlclNvdXJjZSA9IChuYW1lOiBzdHJpbmcsIFdvcmtlclNvdXJjZTogQ2xhc3M8V29ya2VyU291cmNlPikgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMud29ya2VyU291cmNlVHlwZXNbbmFtZV0pIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFdvcmtlciBzb3VyY2Ugd2l0aCBuYW1lIFwiJHtuYW1lfVwiIGFscmVhZHkgcmVnaXN0ZXJlZC5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMud29ya2VyU291cmNlVHlwZXNbbmFtZV0gPSBXb3JrZXJTb3VyY2U7XG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5zZWxmLnJlZ2lzdGVyUlRMVGV4dFBsdWdpbiA9IChydGxUZXh0UGx1Z2luOiB7YXBwbHlBcmFiaWNTaGFwaW5nOiBGdW5jdGlvbiwgcHJvY2Vzc0JpZGlyZWN0aW9uYWxUZXh0OiBGdW5jdGlvbiwgcHJvY2Vzc1N0eWxlZEJpZGlyZWN0aW9uYWxUZXh0PzogRnVuY3Rpb259KSA9PiB7XG4gICAgICAgICAgICBpZiAoZ2xvYmFsUlRMVGV4dFBsdWdpbi5pc0xvYWRlZCgpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSVEwgdGV4dCBwbHVnaW4gYWxyZWFkeSByZWdpc3RlcmVkLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZ2xvYmFsUlRMVGV4dFBsdWdpblsnYXBwbHlBcmFiaWNTaGFwaW5nJ10gPSBydGxUZXh0UGx1Z2luLmFwcGx5QXJhYmljU2hhcGluZztcbiAgICAgICAgICAgIGdsb2JhbFJUTFRleHRQbHVnaW5bJ3Byb2Nlc3NCaWRpcmVjdGlvbmFsVGV4dCddID0gcnRsVGV4dFBsdWdpbi5wcm9jZXNzQmlkaXJlY3Rpb25hbFRleHQ7XG4gICAgICAgICAgICBnbG9iYWxSVExUZXh0UGx1Z2luWydwcm9jZXNzU3R5bGVkQmlkaXJlY3Rpb25hbFRleHQnXSA9IHJ0bFRleHRQbHVnaW4ucHJvY2Vzc1N0eWxlZEJpZGlyZWN0aW9uYWxUZXh0O1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHNldFJlZmVycmVyKG1hcElEOiBzdHJpbmcsIHJlZmVycmVyOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5yZWZlcnJlciA9IHJlZmVycmVyO1xuICAgIH1cblxuICAgIHNldExheWVycyhtYXBJZDogc3RyaW5nLCBsYXllcnM6IEFycmF5PExheWVyU3BlY2lmaWNhdGlvbj4sIGNhbGxiYWNrOiBXb3JrZXJUaWxlQ2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5nZXRMYXllckluZGV4KG1hcElkKS5yZXBsYWNlKGxheWVycyk7XG4gICAgICAgIGNhbGxiYWNrKCk7XG4gICAgfVxuXG4gICAgdXBkYXRlTGF5ZXJzKG1hcElkOiBzdHJpbmcsIHBhcmFtczoge2xheWVyczogQXJyYXk8TGF5ZXJTcGVjaWZpY2F0aW9uPiwgcmVtb3ZlZElkczogQXJyYXk8c3RyaW5nPn0sIGNhbGxiYWNrOiBXb3JrZXJUaWxlQ2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5nZXRMYXllckluZGV4KG1hcElkKS51cGRhdGUocGFyYW1zLmxheWVycywgcGFyYW1zLnJlbW92ZWRJZHMpO1xuICAgICAgICBjYWxsYmFjaygpO1xuICAgIH1cblxuICAgIGxvYWRUaWxlKG1hcElkOiBzdHJpbmcsIHBhcmFtczogV29ya2VyVGlsZVBhcmFtZXRlcnMgJiB7dHlwZTogc3RyaW5nfSwgY2FsbGJhY2s6IFdvcmtlclRpbGVDYWxsYmFjaykge1xuICAgICAgICBhc3NlcnQocGFyYW1zLnR5cGUpO1xuICAgICAgICB0aGlzLmdldFdvcmtlclNvdXJjZShtYXBJZCwgcGFyYW1zLnR5cGUsIHBhcmFtcy5zb3VyY2UpLmxvYWRUaWxlKHBhcmFtcywgY2FsbGJhY2spO1xuICAgIH1cblxuICAgIGxvYWRERU1UaWxlKG1hcElkOiBzdHJpbmcsIHBhcmFtczogV29ya2VyREVNVGlsZVBhcmFtZXRlcnMsIGNhbGxiYWNrOiBXb3JrZXJERU1UaWxlQ2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5nZXRERU1Xb3JrZXJTb3VyY2UobWFwSWQsIHBhcmFtcy5zb3VyY2UpLmxvYWRUaWxlKHBhcmFtcywgY2FsbGJhY2spO1xuICAgIH1cblxuICAgIHJlbG9hZFRpbGUobWFwSWQ6IHN0cmluZywgcGFyYW1zOiBXb3JrZXJUaWxlUGFyYW1ldGVycyAmIHt0eXBlOiBzdHJpbmd9LCBjYWxsYmFjazogV29ya2VyVGlsZUNhbGxiYWNrKSB7XG4gICAgICAgIGFzc2VydChwYXJhbXMudHlwZSk7XG4gICAgICAgIHRoaXMuZ2V0V29ya2VyU291cmNlKG1hcElkLCBwYXJhbXMudHlwZSwgcGFyYW1zLnNvdXJjZSkucmVsb2FkVGlsZShwYXJhbXMsIGNhbGxiYWNrKTtcbiAgICB9XG5cbiAgICBhYm9ydFRpbGUobWFwSWQ6IHN0cmluZywgcGFyYW1zOiBUaWxlUGFyYW1ldGVycyAmIHt0eXBlOiBzdHJpbmd9LCBjYWxsYmFjazogV29ya2VyVGlsZUNhbGxiYWNrKSB7XG4gICAgICAgIGFzc2VydChwYXJhbXMudHlwZSk7XG4gICAgICAgIHRoaXMuZ2V0V29ya2VyU291cmNlKG1hcElkLCBwYXJhbXMudHlwZSwgcGFyYW1zLnNvdXJjZSkuYWJvcnRUaWxlKHBhcmFtcywgY2FsbGJhY2spO1xuICAgIH1cblxuICAgIHJlbW92ZVRpbGUobWFwSWQ6IHN0cmluZywgcGFyYW1zOiBUaWxlUGFyYW1ldGVycyAmIHt0eXBlOiBzdHJpbmd9LCBjYWxsYmFjazogV29ya2VyVGlsZUNhbGxiYWNrKSB7XG4gICAgICAgIGFzc2VydChwYXJhbXMudHlwZSk7XG4gICAgICAgIHRoaXMuZ2V0V29ya2VyU291cmNlKG1hcElkLCBwYXJhbXMudHlwZSwgcGFyYW1zLnNvdXJjZSkucmVtb3ZlVGlsZShwYXJhbXMsIGNhbGxiYWNrKTtcbiAgICB9XG5cbiAgICByZW1vdmVERU1UaWxlKG1hcElkOiBzdHJpbmcsIHBhcmFtczogVGlsZVBhcmFtZXRlcnMpIHtcbiAgICAgICAgdGhpcy5nZXRERU1Xb3JrZXJTb3VyY2UobWFwSWQsIHBhcmFtcy5zb3VyY2UpLnJlbW92ZVRpbGUocGFyYW1zKTtcbiAgICB9XG5cbiAgICByZW1vdmVTb3VyY2UobWFwSWQ6IHN0cmluZywgcGFyYW1zOiB7c291cmNlOiBzdHJpbmd9ICYge3R5cGU6IHN0cmluZ30sIGNhbGxiYWNrOiBXb3JrZXJUaWxlQ2FsbGJhY2spIHtcbiAgICAgICAgYXNzZXJ0KHBhcmFtcy50eXBlKTtcbiAgICAgICAgYXNzZXJ0KHBhcmFtcy5zb3VyY2UpO1xuXG4gICAgICAgIGlmICghdGhpcy53b3JrZXJTb3VyY2VzW21hcElkXSB8fFxuICAgICAgICAgICAgIXRoaXMud29ya2VyU291cmNlc1ttYXBJZF1bcGFyYW1zLnR5cGVdIHx8XG4gICAgICAgICAgICAhdGhpcy53b3JrZXJTb3VyY2VzW21hcElkXVtwYXJhbXMudHlwZV1bcGFyYW1zLnNvdXJjZV0pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHdvcmtlciA9IHRoaXMud29ya2VyU291cmNlc1ttYXBJZF1bcGFyYW1zLnR5cGVdW3BhcmFtcy5zb3VyY2VdO1xuICAgICAgICBkZWxldGUgdGhpcy53b3JrZXJTb3VyY2VzW21hcElkXVtwYXJhbXMudHlwZV1bcGFyYW1zLnNvdXJjZV07XG5cbiAgICAgICAgaWYgKHdvcmtlci5yZW1vdmVTb3VyY2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgd29ya2VyLnJlbW92ZVNvdXJjZShwYXJhbXMsIGNhbGxiYWNrKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2FkIGEge0BsaW5rIFdvcmtlclNvdXJjZX0gc2NyaXB0IGF0IHBhcmFtcy51cmwuICBUaGUgc2NyaXB0IGlzIHJ1blxuICAgICAqICh1c2luZyBpbXBvcnRTY3JpcHRzKSB3aXRoIGByZWdpc3RlcldvcmtlclNvdXJjZWAgaW4gc2NvcGUsIHdoaWNoIGlzIGFcbiAgICAgKiBmdW5jdGlvbiB0YWtpbmcgYChuYW1lLCB3b3JrZXJTb3VyY2VPYmplY3QpYC5cbiAgICAgKiAgQHByaXZhdGVcbiAgICAgKi9cbiAgICBsb2FkV29ya2VyU291cmNlKG1hcDogc3RyaW5nLCBwYXJhbXM6IHsgdXJsOiBzdHJpbmcgfSwgY2FsbGJhY2s6IENhbGxiYWNrPHZvaWQ+KSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnNlbGYuaW1wb3J0U2NyaXB0cyhwYXJhbXMudXJsKTtcbiAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKGUudG9TdHJpbmcoKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBsb2FkUlRMVGV4dFBsdWdpbihtYXA6IHN0cmluZywgcGx1Z2luVVJMOiBzdHJpbmcsIGNhbGxiYWNrOiBDYWxsYmFjazx2b2lkPikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKCFnbG9iYWxSVExUZXh0UGx1Z2luLmlzTG9hZGVkKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGYuaW1wb3J0U2NyaXB0cyhwbHVnaW5VUkwpO1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKGdsb2JhbFJUTFRleHRQbHVnaW4uaXNMb2FkZWQoKSA/XG4gICAgICAgICAgICAgICAgICAgIG51bGwgOlxuICAgICAgICAgICAgICAgICAgICBuZXcgRXJyb3IoYFJUTCBUZXh0IFBsdWdpbiBmYWlsZWQgdG8gaW1wb3J0IHNjcmlwdHMgZnJvbSAke3BsdWdpblVSTH1gKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKGUudG9TdHJpbmcoKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRMYXllckluZGV4KG1hcElkOiBzdHJpbmcpIHtcbiAgICAgICAgbGV0IGxheWVySW5kZXhlcyA9IHRoaXMubGF5ZXJJbmRleGVzW21hcElkXTtcbiAgICAgICAgaWYgKCFsYXllckluZGV4ZXMpIHtcbiAgICAgICAgICAgIGxheWVySW5kZXhlcyA9IHRoaXMubGF5ZXJJbmRleGVzW21hcElkXSA9IG5ldyBTdHlsZUxheWVySW5kZXgoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbGF5ZXJJbmRleGVzO1xuICAgIH1cblxuICAgIGdldFdvcmtlclNvdXJjZShtYXBJZDogc3RyaW5nLCB0eXBlOiBzdHJpbmcsIHNvdXJjZTogc3RyaW5nKSB7XG4gICAgICAgIGlmICghdGhpcy53b3JrZXJTb3VyY2VzW21hcElkXSlcbiAgICAgICAgICAgIHRoaXMud29ya2VyU291cmNlc1ttYXBJZF0gPSB7fTtcbiAgICAgICAgaWYgKCF0aGlzLndvcmtlclNvdXJjZXNbbWFwSWRdW3R5cGVdKVxuICAgICAgICAgICAgdGhpcy53b3JrZXJTb3VyY2VzW21hcElkXVt0eXBlXSA9IHt9O1xuXG4gICAgICAgIGlmICghdGhpcy53b3JrZXJTb3VyY2VzW21hcElkXVt0eXBlXVtzb3VyY2VdKSB7XG4gICAgICAgICAgICAvLyB1c2UgYSB3cmFwcGVkIGFjdG9yIHNvIHRoYXQgd2UgY2FuIGF0dGFjaCBhIHRhcmdldCBtYXBJZCBwYXJhbVxuICAgICAgICAgICAgLy8gdG8gYW55IG1lc3NhZ2VzIGludm9rZWQgYnkgdGhlIFdvcmtlclNvdXJjZVxuICAgICAgICAgICAgY29uc3QgYWN0b3IgPSB7XG4gICAgICAgICAgICAgICAgc2VuZDogKHR5cGUsIGRhdGEsIGNhbGxiYWNrKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0b3Iuc2VuZCh0eXBlLCBkYXRhLCBjYWxsYmFjaywgbWFwSWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHRoaXMud29ya2VyU291cmNlc1ttYXBJZF1bdHlwZV1bc291cmNlXSA9IG5ldyAodGhpcy53b3JrZXJTb3VyY2VUeXBlc1t0eXBlXTogYW55KSgoYWN0b3I6IGFueSksIHRoaXMuZ2V0TGF5ZXJJbmRleChtYXBJZCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMud29ya2VyU291cmNlc1ttYXBJZF1bdHlwZV1bc291cmNlXTtcbiAgICB9XG5cbiAgICBnZXRERU1Xb3JrZXJTb3VyY2UobWFwSWQ6IHN0cmluZywgc291cmNlOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKCF0aGlzLmRlbVdvcmtlclNvdXJjZXNbbWFwSWRdKVxuICAgICAgICAgICAgdGhpcy5kZW1Xb3JrZXJTb3VyY2VzW21hcElkXSA9IHt9O1xuXG4gICAgICAgIGlmICghdGhpcy5kZW1Xb3JrZXJTb3VyY2VzW21hcElkXVtzb3VyY2VdKSB7XG4gICAgICAgICAgICB0aGlzLmRlbVdvcmtlclNvdXJjZXNbbWFwSWRdW3NvdXJjZV0gPSBuZXcgUmFzdGVyREVNVGlsZVdvcmtlclNvdXJjZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZGVtV29ya2VyU291cmNlc1ttYXBJZF1bc291cmNlXTtcbiAgICB9XG59XG5cbi8qIGdsb2JhbCBzZWxmLCBXb3JrZXJHbG9iYWxTY29wZSAqL1xuaWYgKHR5cGVvZiBXb3JrZXJHbG9iYWxTY29wZSAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICB0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICBzZWxmIGluc3RhbmNlb2YgV29ya2VyR2xvYmFsU2NvcGUpIHtcbiAgICBzZWxmLndvcmtlciA9IG5ldyBXb3JrZXIoc2VsZik7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmlmICh0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyAmJiBtb2R1bGUuZXhwb3J0cykge1xuICAgIG1vZHVsZS5leHBvcnRzID0gaXNTdXBwb3J0ZWQ7XG59IGVsc2UgaWYgKHdpbmRvdykge1xuICAgIHdpbmRvdy5tYXBib3hnbCA9IHdpbmRvdy5tYXBib3hnbCB8fCB7fTtcbiAgICB3aW5kb3cubWFwYm94Z2wuc3VwcG9ydGVkID0gaXNTdXBwb3J0ZWQ7XG59XG5cbi8qKlxuICogVGVzdCB3aGV0aGVyIHRoZSBjdXJyZW50IGJyb3dzZXIgc3VwcG9ydHMgTWFwYm94IEdMIEpTXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5mYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0PWZhbHNlXSBSZXR1cm4gYGZhbHNlYFxuICogICBpZiB0aGUgcGVyZm9ybWFuY2Ugb2YgTWFwYm94IEdMIEpTIHdvdWxkIGJlIGRyYW1hdGljYWxseSB3b3JzZSB0aGFuXG4gKiAgIGV4cGVjdGVkIChpLmUuIGEgc29mdHdhcmUgcmVuZGVyZXIgaXMgd291bGQgYmUgdXNlZClcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGlzU3VwcG9ydGVkKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gISEoXG4gICAgICAgIGlzQnJvd3NlcigpICYmXG4gICAgICAgIGlzQXJyYXlTdXBwb3J0ZWQoKSAmJlxuICAgICAgICBpc0Z1bmN0aW9uU3VwcG9ydGVkKCkgJiZcbiAgICAgICAgaXNPYmplY3RTdXBwb3J0ZWQoKSAmJlxuICAgICAgICBpc0pTT05TdXBwb3J0ZWQoKSAmJlxuICAgICAgICBpc1dvcmtlclN1cHBvcnRlZCgpICYmXG4gICAgICAgIGlzVWludDhDbGFtcGVkQXJyYXlTdXBwb3J0ZWQoKSAmJlxuICAgICAgICBpc0FycmF5QnVmZmVyU3VwcG9ydGVkKCkgJiZcbiAgICAgICAgaXNXZWJHTFN1cHBvcnRlZENhY2hlZChvcHRpb25zICYmIG9wdGlvbnMuZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdClcbiAgICApO1xufVxuXG5mdW5jdGlvbiBpc0Jyb3dzZXIoKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCc7XG59XG5cbmZ1bmN0aW9uIGlzQXJyYXlTdXBwb3J0ZWQoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgICAgQXJyYXkucHJvdG90eXBlICYmXG4gICAgICAgIEFycmF5LnByb3RvdHlwZS5ldmVyeSAmJlxuICAgICAgICBBcnJheS5wcm90b3R5cGUuZmlsdGVyICYmXG4gICAgICAgIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoICYmXG4gICAgICAgIEFycmF5LnByb3RvdHlwZS5pbmRleE9mICYmXG4gICAgICAgIEFycmF5LnByb3RvdHlwZS5sYXN0SW5kZXhPZiAmJlxuICAgICAgICBBcnJheS5wcm90b3R5cGUubWFwICYmXG4gICAgICAgIEFycmF5LnByb3RvdHlwZS5zb21lICYmXG4gICAgICAgIEFycmF5LnByb3RvdHlwZS5yZWR1Y2UgJiZcbiAgICAgICAgQXJyYXkucHJvdG90eXBlLnJlZHVjZVJpZ2h0ICYmXG4gICAgICAgIEFycmF5LmlzQXJyYXlcbiAgICApO1xufVxuXG5mdW5jdGlvbiBpc0Z1bmN0aW9uU3VwcG9ydGVkKCkge1xuICAgIHJldHVybiBGdW5jdGlvbi5wcm90b3R5cGUgJiYgRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQ7XG59XG5cbmZ1bmN0aW9uIGlzT2JqZWN0U3VwcG9ydGVkKCkge1xuICAgIHJldHVybiAoXG4gICAgICAgIE9iamVjdC5rZXlzICYmXG4gICAgICAgIE9iamVjdC5jcmVhdGUgJiZcbiAgICAgICAgT2JqZWN0LmdldFByb3RvdHlwZU9mICYmXG4gICAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzICYmXG4gICAgICAgIE9iamVjdC5pc1NlYWxlZCAmJlxuICAgICAgICBPYmplY3QuaXNGcm96ZW4gJiZcbiAgICAgICAgT2JqZWN0LmlzRXh0ZW5zaWJsZSAmJlxuICAgICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yICYmXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSAmJlxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyAmJlxuICAgICAgICBPYmplY3Quc2VhbCAmJlxuICAgICAgICBPYmplY3QuZnJlZXplICYmXG4gICAgICAgIE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9uc1xuICAgICk7XG59XG5cbmZ1bmN0aW9uIGlzSlNPTlN1cHBvcnRlZCgpIHtcbiAgICByZXR1cm4gJ0pTT04nIGluIHdpbmRvdyAmJiAncGFyc2UnIGluIEpTT04gJiYgJ3N0cmluZ2lmeScgaW4gSlNPTjtcbn1cblxuZnVuY3Rpb24gaXNXb3JrZXJTdXBwb3J0ZWQoKSB7XG4gICAgaWYgKCEoJ1dvcmtlcicgaW4gd2luZG93ICYmICdCbG9iJyBpbiB3aW5kb3cgJiYgJ1VSTCcgaW4gd2luZG93KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdmFyIGJsb2IgPSBuZXcgQmxvYihbJyddLCB7IHR5cGU6ICd0ZXh0L2phdmFzY3JpcHQnIH0pO1xuICAgIHZhciB3b3JrZXJVUkwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuICAgIHZhciBzdXBwb3J0ZWQ7XG4gICAgdmFyIHdvcmtlcjtcblxuICAgIHRyeSB7XG4gICAgICAgIHdvcmtlciA9IG5ldyBXb3JrZXIod29ya2VyVVJMKTtcbiAgICAgICAgc3VwcG9ydGVkID0gdHJ1ZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHN1cHBvcnRlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlmICh3b3JrZXIpIHtcbiAgICAgICAgd29ya2VyLnRlcm1pbmF0ZSgpO1xuICAgIH1cbiAgICBVUkwucmV2b2tlT2JqZWN0VVJMKHdvcmtlclVSTCk7XG5cbiAgICByZXR1cm4gc3VwcG9ydGVkO1xufVxuXG4vLyBJRTExIG9ubHkgc3VwcG9ydHMgYFVpbnQ4Q2xhbXBlZEFycmF5YCBhcyBvZiB2ZXJzaW9uXG4vLyBbS0IyOTI5NDM3XShodHRwczovL3N1cHBvcnQubWljcm9zb2Z0LmNvbS9lbi11cy9rYi8yOTI5NDM3KVxuZnVuY3Rpb24gaXNVaW50OENsYW1wZWRBcnJheVN1cHBvcnRlZCgpIHtcbiAgICByZXR1cm4gJ1VpbnQ4Q2xhbXBlZEFycmF5JyBpbiB3aW5kb3c7XG59XG5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvbWFwYm94LWdsLXN1cHBvcnRlZC9pc3N1ZXMvMTlcbmZ1bmN0aW9uIGlzQXJyYXlCdWZmZXJTdXBwb3J0ZWQoKSB7XG4gICAgcmV0dXJuIEFycmF5QnVmZmVyLmlzVmlldztcbn1cblxudmFyIGlzV2ViR0xTdXBwb3J0ZWRDYWNoZSA9IHt9O1xuZnVuY3Rpb24gaXNXZWJHTFN1cHBvcnRlZENhY2hlZChmYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0KSB7XG5cbiAgICBpZiAoaXNXZWJHTFN1cHBvcnRlZENhY2hlW2ZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXRdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaXNXZWJHTFN1cHBvcnRlZENhY2hlW2ZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXRdID0gaXNXZWJHTFN1cHBvcnRlZChmYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gaXNXZWJHTFN1cHBvcnRlZENhY2hlW2ZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXRdO1xufVxuXG5pc1N1cHBvcnRlZC53ZWJHTENvbnRleHRBdHRyaWJ1dGVzID0ge1xuICAgIGFudGlhbGlhczogZmFsc2UsXG4gICAgYWxwaGE6IHRydWUsXG4gICAgc3RlbmNpbDogdHJ1ZSxcbiAgICBkZXB0aDogdHJ1ZVxufTtcblxuZnVuY3Rpb24gaXNXZWJHTFN1cHBvcnRlZChmYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0KSB7XG5cbiAgICB2YXIgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG5cbiAgICB2YXIgYXR0cmlidXRlcyA9IE9iamVjdC5jcmVhdGUoaXNTdXBwb3J0ZWQud2ViR0xDb250ZXh0QXR0cmlidXRlcyk7XG4gICAgYXR0cmlidXRlcy5mYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0ID0gZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdDtcblxuICAgIGlmIChjYW52YXMucHJvYmFibHlTdXBwb3J0c0NvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIGNhbnZhcy5wcm9iYWJseVN1cHBvcnRzQ29udGV4dCgnd2ViZ2wnLCBhdHRyaWJ1dGVzKSB8fFxuICAgICAgICAgICAgY2FudmFzLnByb2JhYmx5U3VwcG9ydHNDb250ZXh0KCdleHBlcmltZW50YWwtd2ViZ2wnLCBhdHRyaWJ1dGVzKVxuICAgICAgICApO1xuXG4gICAgfSBlbHNlIGlmIChjYW52YXMuc3VwcG9ydHNDb250ZXh0KSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBjYW52YXMuc3VwcG9ydHNDb250ZXh0KCd3ZWJnbCcsIGF0dHJpYnV0ZXMpIHx8XG4gICAgICAgICAgICBjYW52YXMuc3VwcG9ydHNDb250ZXh0KCdleHBlcmltZW50YWwtd2ViZ2wnLCBhdHRyaWJ1dGVzKVxuICAgICAgICApO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIGNhbnZhcy5nZXRDb250ZXh0KCd3ZWJnbCcsIGF0dHJpYnV0ZXMpIHx8XG4gICAgICAgICAgICBjYW52YXMuZ2V0Q29udGV4dCgnZXhwZXJpbWVudGFsLXdlYmdsJywgYXR0cmlidXRlcylcbiAgICAgICAgKTtcbiAgICB9XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgUG9pbnQgZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XG5cbmltcG9ydCB3aW5kb3cgZnJvbSAnLi93aW5kb3cnO1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5jb25zdCBET00gPSB7fTtcbmV4cG9ydCBkZWZhdWx0IERPTTtcblxuRE9NLmNyZWF0ZSA9IGZ1bmN0aW9uICh0YWdOYW1lOiAqLCBjbGFzc05hbWU/OiBzdHJpbmcsIGNvbnRhaW5lcj86IEhUTUxFbGVtZW50KSB7XG4gICAgY29uc3QgZWwgPSB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWdOYW1lKTtcbiAgICBpZiAoY2xhc3NOYW1lKSBlbC5jbGFzc05hbWUgPSBjbGFzc05hbWU7XG4gICAgaWYgKGNvbnRhaW5lcikgY29udGFpbmVyLmFwcGVuZENoaWxkKGVsKTtcbiAgICByZXR1cm4gZWw7XG59O1xuXG5ET00uY3JlYXRlTlMgPSBmdW5jdGlvbiAobmFtZXNwYWNlVVJJOiBzdHJpbmcsIHRhZ05hbWU6IHN0cmluZykge1xuICAgIGNvbnN0IGVsID0gd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhuYW1lc3BhY2VVUkksIHRhZ05hbWUpO1xuICAgIHJldHVybiBlbDtcbn07XG5cbmNvbnN0IGRvY1N0eWxlID0gd2luZG93LmRvY3VtZW50ID9cbiAgICAod2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudDogYW55KS5zdHlsZSA6XG4gICAgbnVsbDtcblxuZnVuY3Rpb24gdGVzdFByb3AocHJvcHMpIHtcbiAgICBpZiAoIWRvY1N0eWxlKSByZXR1cm4gbnVsbDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChwcm9wc1tpXSBpbiBkb2NTdHlsZSkge1xuICAgICAgICAgICAgcmV0dXJuIHByb3BzW2ldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwcm9wc1swXTtcbn1cblxuY29uc3Qgc2VsZWN0UHJvcCA9IHRlc3RQcm9wKFsndXNlclNlbGVjdCcsICdNb3pVc2VyU2VsZWN0JywgJ1dlYmtpdFVzZXJTZWxlY3QnLCAnbXNVc2VyU2VsZWN0J10pO1xubGV0IHVzZXJTZWxlY3Q7XG5cbkRPTS5kaXNhYmxlRHJhZyA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoZG9jU3R5bGUgJiYgc2VsZWN0UHJvcCkge1xuICAgICAgICB1c2VyU2VsZWN0ID0gZG9jU3R5bGVbc2VsZWN0UHJvcF07XG4gICAgICAgIGRvY1N0eWxlW3NlbGVjdFByb3BdID0gJ25vbmUnO1xuICAgIH1cbn07XG5cbkRPTS5lbmFibGVEcmFnID0gZnVuY3Rpb24gKCkge1xuICAgIGlmIChkb2NTdHlsZSAmJiBzZWxlY3RQcm9wKSB7XG4gICAgICAgIGRvY1N0eWxlW3NlbGVjdFByb3BdID0gdXNlclNlbGVjdDtcbiAgICB9XG59O1xuXG5jb25zdCB0cmFuc2Zvcm1Qcm9wID0gdGVzdFByb3AoWyd0cmFuc2Zvcm0nLCAnV2Via2l0VHJhbnNmb3JtJ10pO1xuXG5ET00uc2V0VHJhbnNmb3JtID0gZnVuY3Rpb24oZWw6IEhUTUxFbGVtZW50LCB2YWx1ZTogc3RyaW5nKSB7XG4gICAgKGVsLnN0eWxlOiBhbnkpW3RyYW5zZm9ybVByb3BdID0gdmFsdWU7XG59O1xuXG4vLyBGZWF0dXJlIGRldGVjdGlvbiBmb3Ige3Bhc3NpdmU6IGZhbHNlfSBzdXBwb3J0IGluIGFkZC9yZW1vdmVFdmVudExpc3RlbmVyLlxubGV0IHBhc3NpdmVTdXBwb3J0ZWQgPSBmYWxzZTtcblxudHJ5IHtcbiAgICBjb25zdCBvcHRpb25zID0gKE9iamVjdC5kZWZpbmVQcm9wZXJ0eTogYW55KSh7fSwgXCJwYXNzaXZlXCIsIHtcbiAgICAgICAgZ2V0KCkge1xuICAgICAgICAgICAgcGFzc2l2ZVN1cHBvcnRlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICAod2luZG93LmFkZEV2ZW50TGlzdGVuZXI6IGFueSkoXCJ0ZXN0XCIsIG9wdGlvbnMsIG9wdGlvbnMpO1xuICAgICh3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcjogYW55KShcInRlc3RcIiwgb3B0aW9ucywgb3B0aW9ucyk7XG59IGNhdGNoIChlcnIpIHtcbiAgICBwYXNzaXZlU3VwcG9ydGVkID0gZmFsc2U7XG59XG5cbkRPTS5hZGRFdmVudExpc3RlbmVyID0gZnVuY3Rpb24odGFyZ2V0OiAqLCB0eXBlOiAqLCBjYWxsYmFjazogKiwgb3B0aW9uczoge3Bhc3NpdmU/OiBib29sZWFuLCBjYXB0dXJlPzogYm9vbGVhbn0gPSB7fSkge1xuICAgIGlmICgncGFzc2l2ZScgaW4gb3B0aW9ucyAmJiBwYXNzaXZlU3VwcG9ydGVkKSB7XG4gICAgICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGNhbGxiYWNrLCAob3B0aW9uczogYW55KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgY2FsbGJhY2ssIG9wdGlvbnMuY2FwdHVyZSk7XG4gICAgfVxufTtcblxuRE9NLnJlbW92ZUV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbih0YXJnZXQ6ICosIHR5cGU6ICosIGNhbGxiYWNrOiAqLCBvcHRpb25zOiB7cGFzc2l2ZT86IGJvb2xlYW4sIGNhcHR1cmU/OiBib29sZWFufSA9IHt9KSB7XG4gICAgaWYgKCdwYXNzaXZlJyBpbiBvcHRpb25zICYmIHBhc3NpdmVTdXBwb3J0ZWQpIHtcbiAgICAgICAgdGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgY2FsbGJhY2ssIChvcHRpb25zOiBhbnkpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICB0YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBjYWxsYmFjaywgb3B0aW9ucy5jYXB0dXJlKTtcbiAgICB9XG59O1xuXG4vLyBTdXBwcmVzcyB0aGUgbmV4dCBjbGljaywgYnV0IG9ubHkgaWYgaXQncyBpbW1lZGlhdGUuXG5jb25zdCBzdXBwcmVzc0NsaWNrOiBNb3VzZUV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbiAoZSkge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHN1cHByZXNzQ2xpY2ssIHRydWUpO1xufTtcblxuRE9NLnN1cHByZXNzQ2xpY2sgPSBmdW5jdGlvbigpIHtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBzdXBwcmVzc0NsaWNrLCB0cnVlKTtcbiAgICB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHN1cHByZXNzQ2xpY2ssIHRydWUpO1xuICAgIH0sIDApO1xufTtcblxuRE9NLm1vdXNlUG9zID0gZnVuY3Rpb24gKGVsOiBIVE1MRWxlbWVudCwgZTogYW55KSB7XG4gICAgY29uc3QgcmVjdCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGUgPSBlLnRvdWNoZXMgPyBlLnRvdWNoZXNbMF0gOiBlO1xuICAgIHJldHVybiBuZXcgUG9pbnQoXG4gICAgICAgIGUuY2xpZW50WCAtIHJlY3QubGVmdCAtIGVsLmNsaWVudExlZnQsXG4gICAgICAgIGUuY2xpZW50WSAtIHJlY3QudG9wIC0gZWwuY2xpZW50VG9wXG4gICAgKTtcbn07XG5cbkRPTS50b3VjaFBvcyA9IGZ1bmN0aW9uIChlbDogSFRNTEVsZW1lbnQsIGU6IGFueSkge1xuICAgIGNvbnN0IHJlY3QgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxcbiAgICAgICAgcG9pbnRzID0gW107XG4gICAgY29uc3QgdG91Y2hlcyA9IChlLnR5cGUgPT09ICd0b3VjaGVuZCcpID8gZS5jaGFuZ2VkVG91Y2hlcyA6IGUudG91Y2hlcztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRvdWNoZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcG9pbnRzLnB1c2gobmV3IFBvaW50KFxuICAgICAgICAgICAgdG91Y2hlc1tpXS5jbGllbnRYIC0gcmVjdC5sZWZ0IC0gZWwuY2xpZW50TGVmdCxcbiAgICAgICAgICAgIHRvdWNoZXNbaV0uY2xpZW50WSAtIHJlY3QudG9wIC0gZWwuY2xpZW50VG9wXG4gICAgICAgICkpO1xuICAgIH1cbiAgICByZXR1cm4gcG9pbnRzO1xufTtcblxuRE9NLm1vdXNlQnV0dG9uID0gZnVuY3Rpb24gKGU6IE1vdXNlRXZlbnQpIHtcbiAgICBhc3NlcnQoZS50eXBlID09PSAnbW91c2Vkb3duJyB8fCBlLnR5cGUgPT09ICdtb3VzZXVwJyk7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cuSW5zdGFsbFRyaWdnZXIgIT09ICd1bmRlZmluZWQnICYmIGUuYnV0dG9uID09PSAyICYmIGUuY3RybEtleSAmJlxuICAgICAgICB3aW5kb3cubmF2aWdhdG9yLnBsYXRmb3JtLnRvVXBwZXJDYXNlKCkuaW5kZXhPZignTUFDJykgPj0gMCkge1xuICAgICAgICAvLyBGaXggZm9yIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvbWFwYm94LWdsLWpzL2lzc3Vlcy8zMTMxOlxuICAgICAgICAvLyBGaXJlZm94IChkZXRlY3RlZCBieSBJbnN0YWxsVHJpZ2dlcikgb24gTWFjIGRldGVybWluZXMgZS5idXR0b24gPSAyIHdoZW5cbiAgICAgICAgLy8gdXNpbmcgQ29udHJvbCArIGxlZnQgY2xpY2tcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIHJldHVybiBlLmJ1dHRvbjtcbn07XG5cbkRPTS5yZW1vdmUgPSBmdW5jdGlvbihub2RlOiBIVE1MRWxlbWVudCkge1xuICAgIGlmIChub2RlLnBhcmVudE5vZGUpIHtcbiAgICAgICAgbm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG5vZGUpO1xuICAgIH1cbn07XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgeyBnZXRKU09OLCBnZXRJbWFnZSwgUmVzb3VyY2VUeXBlIH0gZnJvbSAnLi4vdXRpbC9hamF4JztcblxuaW1wb3J0IGJyb3dzZXIgZnJvbSAnLi4vdXRpbC9icm93c2VyJztcbmltcG9ydCB7IFJHQkFJbWFnZSB9IGZyb20gJy4uL3V0aWwvaW1hZ2UnO1xuXG5pbXBvcnQgdHlwZSB7U3R5bGVJbWFnZX0gZnJvbSAnLi9zdHlsZV9pbWFnZSc7XG5pbXBvcnQgdHlwZSB7UmVxdWVzdE1hbmFnZXJ9IGZyb20gJy4uL3V0aWwvbWFwYm94JztcbmltcG9ydCB0eXBlIHtDYWxsYmFja30gZnJvbSAnLi4vdHlwZXMvY2FsbGJhY2snO1xuaW1wb3J0IHR5cGUge0NhbmNlbGFibGV9IGZyb20gJy4uL3R5cGVzL2NhbmNlbGFibGUnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihiYXNlVVJMOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RNYW5hZ2VyOiBSZXF1ZXN0TWFuYWdlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2s6IENhbGxiYWNrPHtbc3RyaW5nXTogU3R5bGVJbWFnZX0+KTogQ2FuY2VsYWJsZSB7XG4gICAgbGV0IGpzb246IGFueSwgaW1hZ2UsIGVycm9yO1xuICAgIGNvbnN0IGZvcm1hdCA9IGJyb3dzZXIuZGV2aWNlUGl4ZWxSYXRpbyA+IDEgPyAnQDJ4JyA6ICcnO1xuXG4gICAgbGV0IGpzb25SZXF1ZXN0ID0gZ2V0SlNPTihyZXF1ZXN0TWFuYWdlci50cmFuc2Zvcm1SZXF1ZXN0KHJlcXVlc3RNYW5hZ2VyLm5vcm1hbGl6ZVNwcml0ZVVSTChiYXNlVVJMLCBmb3JtYXQsICcuanNvbicpLCBSZXNvdXJjZVR5cGUuU3ByaXRlSlNPTiksIChlcnI6ID9FcnJvciwgZGF0YTogP09iamVjdCkgPT4ge1xuICAgICAgICBqc29uUmVxdWVzdCA9IG51bGw7XG4gICAgICAgIGlmICghZXJyb3IpIHtcbiAgICAgICAgICAgIGVycm9yID0gZXJyO1xuICAgICAgICAgICAganNvbiA9IGRhdGE7XG4gICAgICAgICAgICBtYXliZUNvbXBsZXRlKCk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIGxldCBpbWFnZVJlcXVlc3QgPSBnZXRJbWFnZShyZXF1ZXN0TWFuYWdlci50cmFuc2Zvcm1SZXF1ZXN0KHJlcXVlc3RNYW5hZ2VyLm5vcm1hbGl6ZVNwcml0ZVVSTChiYXNlVVJMLCBmb3JtYXQsICcucG5nJyksIFJlc291cmNlVHlwZS5TcHJpdGVJbWFnZSksIChlcnIsIGltZykgPT4ge1xuICAgICAgICBpbWFnZVJlcXVlc3QgPSBudWxsO1xuICAgICAgICBpZiAoIWVycm9yKSB7XG4gICAgICAgICAgICBlcnJvciA9IGVycjtcbiAgICAgICAgICAgIGltYWdlID0gaW1nO1xuICAgICAgICAgICAgbWF5YmVDb21wbGV0ZSgpO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBmdW5jdGlvbiBtYXliZUNvbXBsZXRlKCkge1xuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKGVycm9yKTtcbiAgICAgICAgfSBlbHNlIGlmIChqc29uICYmIGltYWdlKSB7XG4gICAgICAgICAgICBjb25zdCBpbWFnZURhdGEgPSBicm93c2VyLmdldEltYWdlRGF0YShpbWFnZSk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSB7fTtcblxuICAgICAgICAgICAgZm9yIChjb25zdCBpZCBpbiBqc29uKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qge3dpZHRoLCBoZWlnaHQsIHgsIHksIHNkZiwgcGl4ZWxSYXRpb30gPSBqc29uW2lkXTtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gbmV3IFJHQkFJbWFnZSh7d2lkdGgsIGhlaWdodH0pO1xuICAgICAgICAgICAgICAgIFJHQkFJbWFnZS5jb3B5KGltYWdlRGF0YSwgZGF0YSwge3gsIHl9LCB7eDogMCwgeTogMH0sIHt3aWR0aCwgaGVpZ2h0fSk7XG4gICAgICAgICAgICAgICAgcmVzdWx0W2lkXSA9IHtkYXRhLCBwaXhlbFJhdGlvLCBzZGZ9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjYWxsYmFjayhudWxsLCByZXN1bHQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgY2FuY2VsKCkge1xuICAgICAgICAgICAgaWYgKGpzb25SZXF1ZXN0KSB7XG4gICAgICAgICAgICAgICAganNvblJlcXVlc3QuY2FuY2VsKCk7XG4gICAgICAgICAgICAgICAganNvblJlcXVlc3QgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGltYWdlUmVxdWVzdCkge1xuICAgICAgICAgICAgICAgIGltYWdlUmVxdWVzdC5jYW5jZWwoKTtcbiAgICAgICAgICAgICAgICBpbWFnZVJlcXVlc3QgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7UkdCQUltYWdlfSBmcm9tICcuLi91dGlsL2ltYWdlJztcblxuaW1wb3J0IHR5cGUgTWFwIGZyb20gJy4uL3VpL21hcCc7XG5cbmV4cG9ydCB0eXBlIFN0eWxlSW1hZ2UgPSB7XG4gICAgZGF0YTogUkdCQUltYWdlLFxuICAgIHBpeGVsUmF0aW86IG51bWJlcixcbiAgICBzZGY6IGJvb2xlYW4sXG4gICAgdmVyc2lvbjogbnVtYmVyLFxuICAgIGhhc1JlbmRlckNhbGxiYWNrPzogYm9vbGVhbixcbiAgICB1c2VySW1hZ2U/OiBTdHlsZUltYWdlSW50ZXJmYWNlXG59O1xuXG5leHBvcnQgdHlwZSBTdHlsZUltYWdlSW50ZXJmYWNlID0ge1xuICAgIHdpZHRoOiBudW1iZXIsXG4gICAgaGVpZ2h0OiBudW1iZXIsXG4gICAgZGF0YTogVWludDhBcnJheSB8IFVpbnQ4Q2xhbXBlZEFycmF5LFxuICAgIHJlbmRlcj86ICgpID0+IHZvaWQsXG4gICAgb25BZGQ/OiAobWFwOiBNYXAsIGlkOiBzdHJpbmcpID0+IHZvaWQsXG4gICAgb25SZW1vdmU/OiAoKSA9PiB2b2lkXG59O1xuXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyU3R5bGVJbWFnZShpbWFnZTogU3R5bGVJbWFnZSkge1xuICAgIGNvbnN0IHt1c2VySW1hZ2V9ID0gaW1hZ2U7XG4gICAgaWYgKHVzZXJJbWFnZSAmJiB1c2VySW1hZ2UucmVuZGVyKSB7XG4gICAgICAgIGNvbnN0IHVwZGF0ZWQgPSB1c2VySW1hZ2UucmVuZGVyKCk7XG4gICAgICAgIGlmICh1cGRhdGVkKSB7XG4gICAgICAgICAgICBpbWFnZS5kYXRhLnJlcGxhY2UobmV3IFVpbnQ4QXJyYXkodXNlckltYWdlLmRhdGEuYnVmZmVyKSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogSW50ZXJmYWNlIGZvciBkeW5hbWljYWxseSBnZW5lcmF0ZWQgc3R5bGUgaW1hZ2VzLiBUaGlzIGlzIGEgc3BlY2lmaWNhdGlvbiBmb3JcbiAqIGltcGxlbWVudGVycyB0byBtb2RlbDogaXQgaXMgbm90IGFuIGV4cG9ydGVkIG1ldGhvZCBvciBjbGFzcy5cbiAqXG4gKiBJbWFnZXMgaW1wbGVtZW50aW5nIHRoaXMgaW50ZXJmYWNlIGNhbiBiZSByZWRyYXduIGZvciBldmVyeSBmcmFtZS4gVGhleSBjYW4gYmUgdXNlZCB0byBhbmltYXRlXG4gKiBpY29ucyBhbmQgcGF0dGVybnMgb3IgbWFrZSB0aGVtIHJlc3BvbmQgdG8gdXNlciBpbnB1dC4gU3R5bGUgaW1hZ2VzIGNhbiBpbXBsZW1lbnQgYVxuICoge0BsaW5rIFN0eWxlSW1hZ2VJbnRlcmZhY2UjcmVuZGVyfSBtZXRob2QuIFRoZSBtZXRob2QgaXMgY2FsbGVkIGV2ZXJ5IGZyYW1lIGFuZFxuICogY2FuIGJlIHVzZWQgdG8gdXBkYXRlIHRoZSBpbWFnZS5cbiAqXG4gKiBAaW50ZXJmYWNlIFN0eWxlSW1hZ2VJbnRlcmZhY2VcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB3aWR0aFxuICogQHByb3BlcnR5IHtudW1iZXJ9IGhlaWdodFxuICogQHByb3BlcnR5IHtVaW50OEFycmF5IHwgVWludDhDbGFtcGVkQXJyYXl9IGRhdGFcbiAqXG4gKiBAc2VlIFtBZGQgYW4gYW5pbWF0ZWQgaWNvbiB0byB0aGUgbWFwLl0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvYWRkLWltYWdlLWFuaW1hdGVkLylcbiAqXG4gKiBAZXhhbXBsZVxuICogdmFyIGZsYXNoaW5nU3F1YXJlID0ge1xuICogICAgIHdpZHRoOiA2NCxcbiAqICAgICBoZWlnaHQ6IDY0LFxuICogICAgIGRhdGE6IG5ldyBVaW50OEFycmF5KDY0ICogNjQgKiA0KSxcbiAqXG4gKiAgICAgb25BZGQ6IGZ1bmN0aW9uKG1hcCkge1xuICogICAgICAgICB0aGlzLm1hcCA9IG1hcDtcbiAqICAgICB9LFxuICpcbiAqICAgICByZW5kZXI6IGZ1bmN0aW9uKCkge1xuICogICAgICAgICAvLyBrZWVwIHJlcGFpbnRpbmcgd2hpbGUgdGhlIGljb24gaXMgb24gdGhlIG1hcFxuICogICAgICAgICB0aGlzLm1hcC50cmlnZ2VyUmVwYWludCgpO1xuICpcbiAqICAgICAgICAgLy8gYWx0ZXJuYXRlIGJldHdlZW4gYmxhY2sgYW5kIHdoaXRlIGJhc2VkIG9uIHRoZSB0aW1lXG4gKiAgICAgICAgIHZhciB2YWx1ZSA9IE1hdGgucm91bmQoRGF0ZS5ub3coKSAvIDEwMDApICUgMiA9PT0gMCAgPyAyNTUgOiAwO1xuICpcbiAqICAgICAgICAgLy8gY2hlY2sgaWYgaW1hZ2UgbmVlZHMgdG8gYmUgY2hhbmdlZFxuICogICAgICAgICBpZiAodmFsdWUgIT09IHRoaXMucHJldmlvdXNWYWx1ZSkge1xuICogICAgICAgICAgICAgdGhpcy5wcmV2aW91c1ZhbHVlID0gdmFsdWU7XG4gKlxuICogICAgICAgICAgICAgdmFyIGJ5dGVzUGVyUGl4ZWwgPSA0O1xuICogICAgICAgICAgICAgZm9yICh2YXIgeCA9IDA7IHggPCB0aGlzLndpZHRoOyB4KyspIHtcbiAqICAgICAgICAgICAgICAgICBmb3IgKHZhciB5ID0gMDsgeSA8IHRoaXMuaGVpZ2h0OyB5KyspIHtcbiAqICAgICAgICAgICAgICAgICAgICAgdmFyIG9mZnNldCA9ICh5ICogdGhpcy53aWR0aCArIHgpICogYnl0ZXNQZXJQaXhlbDtcbiAqICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhW29mZnNldCArIDBdID0gdmFsdWU7XG4gKiAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YVtvZmZzZXQgKyAxXSA9IHZhbHVlO1xuICogICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGFbb2Zmc2V0ICsgMl0gPSB2YWx1ZTtcbiAqICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhW29mZnNldCArIDNdID0gMjU1O1xuICogICAgICAgICAgICAgICAgIH1cbiAqICAgICAgICAgICAgIH1cbiAqXG4gKiAgICAgICAgICAgICAvLyByZXR1cm4gdHJ1ZSB0byBpbmRpY2F0ZSB0aGF0IHRoZSBpbWFnZSBjaGFuZ2VkXG4gKiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAqICAgICAgICAgfVxuICogICAgIH1cbiAqICB9XG4gKlxuICogIG1hcC5hZGRJbWFnZSgnZmxhc2hpbmdfc3F1YXJlJywgZmxhc2hpbmdTcXVhcmUpO1xuICovXG5cbi8qKlxuICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIG9uY2UgYmVmb3JlIGV2ZXJ5IGZyYW1lIHdoZXJlIHRoZSBpY29uIHdpbGwgYmUgdXNlZC5cbiAqIFRoZSBtZXRob2QgY2FuIG9wdGlvbmFsbHkgdXBkYXRlIHRoZSBpbWFnZSdzIGBkYXRhYCBtZW1iZXIgd2l0aCBhIG5ldyBpbWFnZS5cbiAqXG4gKiBJZiB0aGUgbWV0aG9kIHVwZGF0ZXMgdGhlIGltYWdlIGl0IG11c3QgcmV0dXJuIGB0cnVlYCB0byBjb21taXQgdGhlIGNoYW5nZS5cbiAqIElmIHRoZSBtZXRob2QgcmV0dXJucyBgZmFsc2VgIG9yIG5vdGhpbmcgdGhlIGltYWdlIGlzIGFzc3VtZWQgdG8gbm90IGhhdmUgY2hhbmdlZC5cbiAqXG4gKiBJZiB1cGRhdGVzIGFyZSBpbmZyZXF1ZW50IGl0IG1heWJlIGVhc2llciB0byB1c2Uge0BsaW5rIE1hcCN1cGRhdGVJbWFnZX0gdG8gdXBkYXRlXG4gKiB0aGUgaW1hZ2UgaW5zdGVhZCBvZiBpbXBsZW1lbnRpbmcgdGhpcyBtZXRob2QuXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAbWVtYmVyb2YgU3R5bGVJbWFnZUludGVyZmFjZVxuICogQGluc3RhbmNlXG4gKiBAbmFtZSByZW5kZXJcbiAqIEByZXR1cm4ge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGlzIG1ldGhvZCB1cGRhdGVkIHRoZSBpbWFnZS4gYGZhbHNlYCBpZiB0aGUgaW1hZ2Ugd2FzIG5vdCBjaGFuZ2VkLlxuICovXG5cbi8qKlxuICogT3B0aW9uYWwgbWV0aG9kIGNhbGxlZCB3aGVuIHRoZSBsYXllciBoYXMgYmVlbiBhZGRlZCB0byB0aGUgTWFwIHdpdGgge0BsaW5rIE1hcCNhZGRJbWFnZX0uXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAbWVtYmVyb2YgU3R5bGVJbWFnZUludGVyZmFjZVxuICogQGluc3RhbmNlXG4gKiBAbmFtZSBvbkFkZFxuICogQHBhcmFtIHtNYXB9IG1hcCBUaGUgTWFwIHRoaXMgY3VzdG9tIGxheWVyIHdhcyBqdXN0IGFkZGVkIHRvLlxuICovXG5cbi8qKlxuICogT3B0aW9uYWwgbWV0aG9kIGNhbGxlZCB3aGVuIHRoZSBpY29uIGlzIHJlbW92ZWQgZnJvbSB0aGUgbWFwIHdpdGgge0BsaW5rIE1hcCNyZW1vdmVJbWFnZX0uXG4gKiBUaGlzIGdpdmVzIHRoZSBpbWFnZSBhIGNoYW5jZSB0byBjbGVhbiB1cCByZXNvdXJjZXMgYW5kIGV2ZW50IGxpc3RlbmVycy5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBtZW1iZXJvZiBTdHlsZUltYWdlSW50ZXJmYWNlXG4gKiBAaW5zdGFuY2VcbiAqIEBuYW1lIG9uUmVtb3ZlXG4gKi9cbiIsIi8vIEBmbG93XG5cbmltcG9ydCBwb3RwYWNrIGZyb20gJ3BvdHBhY2snO1xuXG5pbXBvcnQgeyBFdmVudCwgRXZlbnRlZCB9IGZyb20gJy4uL3V0aWwvZXZlbnRlZCc7XG5pbXBvcnQgeyBSR0JBSW1hZ2UgfSBmcm9tICcuLi91dGlsL2ltYWdlJztcbmltcG9ydCB7IEltYWdlUG9zaXRpb24gfSBmcm9tICcuL2ltYWdlX2F0bGFzJztcbmltcG9ydCBUZXh0dXJlIGZyb20gJy4vdGV4dHVyZSc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQge3JlbmRlclN0eWxlSW1hZ2V9IGZyb20gJy4uL3N0eWxlL3N0eWxlX2ltYWdlJztcbmltcG9ydCB7IHdhcm5PbmNlIH0gZnJvbSAnLi4vdXRpbC91dGlsJztcblxuaW1wb3J0IHR5cGUge1N0eWxlSW1hZ2V9IGZyb20gJy4uL3N0eWxlL3N0eWxlX2ltYWdlJztcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSAnLi4vZ2wvY29udGV4dCc7XG5pbXBvcnQgdHlwZSB7QmlufSBmcm9tICdwb3RwYWNrJztcbmltcG9ydCB0eXBlIHtDYWxsYmFja30gZnJvbSAnLi4vdHlwZXMvY2FsbGJhY2snO1xuXG50eXBlIFBhdHRlcm4gPSB7XG4gICAgYmluOiBCaW4sXG4gICAgcG9zaXRpb246IEltYWdlUG9zaXRpb25cbn07XG5cbi8vIFdoZW4gY29waWVkIGludG8gdGhlIGF0bGFzIHRleHR1cmUsIGltYWdlIGRhdGEgaXMgcGFkZGVkIGJ5IG9uZSBwaXhlbCBvbiBlYWNoIHNpZGUuIEljb25cbi8vIGltYWdlcyBhcmUgcGFkZGVkIHdpdGggZnVsbHkgdHJhbnNwYXJlbnQgcGl4ZWxzLCB3aGlsZSBwYXR0ZXJuIGltYWdlcyBhcmUgcGFkZGVkIHdpdGggYVxuLy8gY29weSBvZiB0aGUgaW1hZ2UgZGF0YSB3cmFwcGVkIGZyb20gdGhlIG9wcG9zaXRlIHNpZGUuIEluIGJvdGggY2FzZXMsIHRoaXMgZW5zdXJlcyB0aGVcbi8vIGNvcnJlY3QgYmVoYXZpb3Igb2YgR0xfTElORUFSIHRleHR1cmUgc2FtcGxpbmcgbW9kZS5cbmNvbnN0IHBhZGRpbmcgPSAxO1xuXG4vKlxuICAgIEltYWdlTWFuYWdlciBkb2VzIHRocmVlIHRoaW5nczpcblxuICAgICAgICAxLiBUcmFja3MgcmVxdWVzdHMgZm9yIGljb24gaW1hZ2VzIGZyb20gdGlsZSB3b3JrZXJzIGFuZCBzZW5kcyByZXNwb25zZXMgd2hlbiB0aGUgcmVxdWVzdHMgYXJlIGZ1bGZpbGxlZC5cbiAgICAgICAgMi4gQnVpbGRzIGEgdGV4dHVyZSBhdGxhcyBmb3IgcGF0dGVybiBpbWFnZXMuXG4gICAgICAgIDMuIFJlcmVuZGVycyByZW5kZXJhYmxlIGltYWdlcyBvbmNlIHBlciBmcmFtZVxuXG4gICAgVGhlc2UgYXJlIGRpc3BhcmF0ZSByZXNwb25zaWJpbGl0aWVzIGFuZCBzaG91bGQgZXZlbnR1YWxseSBiZSBoYW5kbGVkIGJ5IGRpZmZlcmVudCBjbGFzc2VzLiBXaGVuIHdlIGltcGxlbWVudFxuICAgIGRhdGEtZHJpdmVuIHN1cHBvcnQgZm9yIGAqLXBhdHRlcm5gLCB3ZSdsbCBsaWtlbHkgdXNlIHBlci1idWNrZXQgcGF0dGVybiBhdGxhc2VzLCBhbmQgdGhhdCB3b3VsZCBiZSBhIGdvb2QgdGltZVxuICAgIHRvIHJlZmFjdG9yIHRoaXMuXG4qL1xuY2xhc3MgSW1hZ2VNYW5hZ2VyIGV4dGVuZHMgRXZlbnRlZCB7XG4gICAgaW1hZ2VzOiB7W3N0cmluZ106IFN0eWxlSW1hZ2V9O1xuICAgIHVwZGF0ZWRJbWFnZXM6IHtbc3RyaW5nXTogYm9vbGVhbn07XG4gICAgY2FsbGJhY2tEaXNwYXRjaGVkVGhpc0ZyYW1lOiB7W3N0cmluZ106IGJvb2xlYW59O1xuICAgIGxvYWRlZDogYm9vbGVhbjtcbiAgICByZXF1ZXN0b3JzOiBBcnJheTx7aWRzOiBBcnJheTxzdHJpbmc+LCBjYWxsYmFjazogQ2FsbGJhY2s8e1tzdHJpbmddOiBTdHlsZUltYWdlfT59PjtcblxuICAgIHBhdHRlcm5zOiB7W3N0cmluZ106IFBhdHRlcm59O1xuICAgIGF0bGFzSW1hZ2U6IFJHQkFJbWFnZTtcbiAgICBhdGxhc1RleHR1cmU6ID9UZXh0dXJlO1xuICAgIGRpcnR5OiBib29sZWFuO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuaW1hZ2VzID0ge307XG4gICAgICAgIHRoaXMudXBkYXRlZEltYWdlcyA9IHt9O1xuICAgICAgICB0aGlzLmNhbGxiYWNrRGlzcGF0Y2hlZFRoaXNGcmFtZSA9IHt9O1xuICAgICAgICB0aGlzLmxvYWRlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnJlcXVlc3RvcnMgPSBbXTtcblxuICAgICAgICB0aGlzLnBhdHRlcm5zID0ge307XG4gICAgICAgIHRoaXMuYXRsYXNJbWFnZSA9IG5ldyBSR0JBSW1hZ2Uoe3dpZHRoOiAxLCBoZWlnaHQ6IDF9KTtcbiAgICAgICAgdGhpcy5kaXJ0eSA9IHRydWU7XG4gICAgfVxuXG4gICAgaXNMb2FkZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvYWRlZDtcbiAgICB9XG5cbiAgICBzZXRMb2FkZWQobG9hZGVkOiBib29sZWFuKSB7XG4gICAgICAgIGlmICh0aGlzLmxvYWRlZCA9PT0gbG9hZGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxvYWRlZCA9IGxvYWRlZDtcblxuICAgICAgICBpZiAobG9hZGVkKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHtpZHMsIGNhbGxiYWNrfSBvZiB0aGlzLnJlcXVlc3RvcnMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9ub3RpZnkoaWRzLCBjYWxsYmFjayk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnJlcXVlc3RvcnMgPSBbXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldEltYWdlKGlkOiBzdHJpbmcpOiA/U3R5bGVJbWFnZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmltYWdlc1tpZF07XG4gICAgfVxuXG4gICAgYWRkSW1hZ2UoaWQ6IHN0cmluZywgaW1hZ2U6IFN0eWxlSW1hZ2UpIHtcbiAgICAgICAgYXNzZXJ0KCF0aGlzLmltYWdlc1tpZF0pO1xuICAgICAgICB0aGlzLmltYWdlc1tpZF0gPSBpbWFnZTtcbiAgICB9XG5cbiAgICB1cGRhdGVJbWFnZShpZDogc3RyaW5nLCBpbWFnZTogU3R5bGVJbWFnZSkge1xuICAgICAgICBjb25zdCBvbGRJbWFnZSA9IHRoaXMuaW1hZ2VzW2lkXTtcbiAgICAgICAgYXNzZXJ0KG9sZEltYWdlKTtcbiAgICAgICAgYXNzZXJ0KG9sZEltYWdlLmRhdGEud2lkdGggPT09IGltYWdlLmRhdGEud2lkdGgpO1xuICAgICAgICBhc3NlcnQob2xkSW1hZ2UuZGF0YS5oZWlnaHQgPT09IGltYWdlLmRhdGEuaGVpZ2h0KTtcbiAgICAgICAgaW1hZ2UudmVyc2lvbiA9IG9sZEltYWdlLnZlcnNpb24gKyAxO1xuICAgICAgICB0aGlzLmltYWdlc1tpZF0gPSBpbWFnZTtcbiAgICAgICAgdGhpcy51cGRhdGVkSW1hZ2VzW2lkXSA9IHRydWU7XG4gICAgfVxuXG4gICAgcmVtb3ZlSW1hZ2UoaWQ6IHN0cmluZykge1xuICAgICAgICBhc3NlcnQodGhpcy5pbWFnZXNbaWRdKTtcbiAgICAgICAgY29uc3QgaW1hZ2UgPSB0aGlzLmltYWdlc1tpZF07XG4gICAgICAgIGRlbGV0ZSB0aGlzLmltYWdlc1tpZF07XG4gICAgICAgIGRlbGV0ZSB0aGlzLnBhdHRlcm5zW2lkXTtcblxuICAgICAgICBpZiAoaW1hZ2UudXNlckltYWdlICYmIGltYWdlLnVzZXJJbWFnZS5vblJlbW92ZSkge1xuICAgICAgICAgICAgaW1hZ2UudXNlckltYWdlLm9uUmVtb3ZlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBsaXN0SW1hZ2VzKCk6IEFycmF5PHN0cmluZz4ge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5pbWFnZXMpO1xuICAgIH1cblxuICAgIGdldEltYWdlcyhpZHM6IEFycmF5PHN0cmluZz4sIGNhbGxiYWNrOiBDYWxsYmFjazx7W3N0cmluZ106IFN0eWxlSW1hZ2V9Pikge1xuICAgICAgICAvLyBJZiB0aGUgc3ByaXRlIGhhcyBiZWVuIGxvYWRlZCwgb3IgaWYgYWxsIHRoZSBpY29uIGRlcGVuZGVuY2llcyBhcmUgYWxyZWFkeSBwcmVzZW50XG4gICAgICAgIC8vIChpLmUuIGlmIHRoZXkndmUgYmVlbiBhZGRlZGVkIHZpYSBydW50aW1lIHN0eWxpbmcpLCB0aGVuIG5vdGlmeSB0aGUgcmVxdWVzdG9yIGltbWVkaWF0ZWx5LlxuICAgICAgICAvLyBPdGhlcndpc2UsIGRlbGF5IG5vdGlmaWNhdGlvbiB1bnRpbCB0aGUgc3ByaXRlIGlzIGxvYWRlZC4gQXQgdGhhdCBwb2ludCwgaWYgYW55IG9mIHRoZVxuICAgICAgICAvLyBkZXBlbmRlbmNpZXMgYXJlIHN0aWxsIHVuYXZhaWxhYmxlLCB3ZSdsbCBqdXN0IGFzc3VtZSB0aGV5IGFyZSBwZXJtYW5lbnRseSBtaXNzaW5nLlxuICAgICAgICBsZXQgaGFzQWxsRGVwZW5kZW5jaWVzID0gdHJ1ZTtcbiAgICAgICAgaWYgKCF0aGlzLmlzTG9hZGVkKCkpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaWQgb2YgaWRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmltYWdlc1tpZF0pIHtcbiAgICAgICAgICAgICAgICAgICAgaGFzQWxsRGVwZW5kZW5jaWVzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmlzTG9hZGVkKCkgfHwgaGFzQWxsRGVwZW5kZW5jaWVzKSB7XG4gICAgICAgICAgICB0aGlzLl9ub3RpZnkoaWRzLCBjYWxsYmFjayk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJlcXVlc3RvcnMucHVzaCh7aWRzLCBjYWxsYmFja30pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX25vdGlmeShpZHM6IEFycmF5PHN0cmluZz4sIGNhbGxiYWNrOiBDYWxsYmFjazx7W3N0cmluZ106IFN0eWxlSW1hZ2V9Pikge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IHt9O1xuXG4gICAgICAgIGZvciAoY29uc3QgaWQgb2YgaWRzKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaW1hZ2VzW2lkXSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ3N0eWxlaW1hZ2VtaXNzaW5nJywgeyBpZCB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBpbWFnZSA9IHRoaXMuaW1hZ2VzW2lkXTtcbiAgICAgICAgICAgIGlmIChpbWFnZSkge1xuICAgICAgICAgICAgICAgIC8vIENsb25lIHRoZSBpbWFnZSBzbyB0aGF0IG91ciBvd24gY29weSBvZiBpdHMgQXJyYXlCdWZmZXIgZG9lc24ndCBnZXQgdHJhbnNmZXJyZWQuXG4gICAgICAgICAgICAgICAgcmVzcG9uc2VbaWRdID0ge1xuICAgICAgICAgICAgICAgICAgICBkYXRhOiBpbWFnZS5kYXRhLmNsb25lKCksXG4gICAgICAgICAgICAgICAgICAgIHBpeGVsUmF0aW86IGltYWdlLnBpeGVsUmF0aW8sXG4gICAgICAgICAgICAgICAgICAgIHNkZjogaW1hZ2Uuc2RmLFxuICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uOiBpbWFnZS52ZXJzaW9uLFxuICAgICAgICAgICAgICAgICAgICBoYXNSZW5kZXJDYWxsYmFjazogQm9vbGVhbihpbWFnZS51c2VySW1hZ2UgJiYgaW1hZ2UudXNlckltYWdlLnJlbmRlcilcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB3YXJuT25jZShgSW1hZ2UgXCIke2lkfVwiIGNvdWxkIG5vdCBiZSBsb2FkZWQuIFBsZWFzZSBtYWtlIHN1cmUgeW91IGhhdmUgYWRkZWQgdGhlIGltYWdlIHdpdGggbWFwLmFkZEltYWdlKCkgb3IgYSBcInNwcml0ZVwiIHByb3BlcnR5IGluIHlvdXIgc3R5bGUuIFlvdSBjYW4gcHJvdmlkZSBtaXNzaW5nIGltYWdlcyBieSBsaXN0ZW5pbmcgZm9yIHRoZSBcInN0eWxlaW1hZ2VtaXNzaW5nXCIgbWFwIGV2ZW50LmApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY2FsbGJhY2sobnVsbCwgcmVzcG9uc2UpO1xuICAgIH1cblxuICAgIC8vIFBhdHRlcm4gc3R1ZmZcblxuICAgIGdldFBpeGVsU2l6ZSgpIHtcbiAgICAgICAgY29uc3Qge3dpZHRoLCBoZWlnaHR9ID0gdGhpcy5hdGxhc0ltYWdlO1xuICAgICAgICByZXR1cm4ge3dpZHRoLCBoZWlnaHR9O1xuICAgIH1cblxuICAgIGdldFBhdHRlcm4oaWQ6IHN0cmluZyk6ID9JbWFnZVBvc2l0aW9uIHtcbiAgICAgICAgY29uc3QgcGF0dGVybiA9IHRoaXMucGF0dGVybnNbaWRdO1xuXG4gICAgICAgIGNvbnN0IGltYWdlID0gdGhpcy5nZXRJbWFnZShpZCk7XG4gICAgICAgIGlmICghaW1hZ2UpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhdHRlcm4gJiYgcGF0dGVybi5wb3NpdGlvbi52ZXJzaW9uID09PSBpbWFnZS52ZXJzaW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gcGF0dGVybi5wb3NpdGlvbjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghcGF0dGVybikge1xuICAgICAgICAgICAgY29uc3QgdyA9IGltYWdlLmRhdGEud2lkdGggKyBwYWRkaW5nICogMjtcbiAgICAgICAgICAgIGNvbnN0IGggPSBpbWFnZS5kYXRhLmhlaWdodCArIHBhZGRpbmcgKiAyO1xuICAgICAgICAgICAgY29uc3QgYmluID0ge3csIGgsIHg6IDAsIHk6IDB9O1xuICAgICAgICAgICAgY29uc3QgcG9zaXRpb24gPSBuZXcgSW1hZ2VQb3NpdGlvbihiaW4sIGltYWdlKTtcbiAgICAgICAgICAgIHRoaXMucGF0dGVybnNbaWRdID0ge2JpbiwgcG9zaXRpb259O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGF0dGVybi5wb3NpdGlvbi52ZXJzaW9uID0gaW1hZ2UudmVyc2lvbjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3VwZGF0ZVBhdHRlcm5BdGxhcygpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLnBhdHRlcm5zW2lkXS5wb3NpdGlvbjtcbiAgICB9XG5cbiAgICBiaW5kKGNvbnRleHQ6IENvbnRleHQpIHtcbiAgICAgICAgY29uc3QgZ2wgPSBjb250ZXh0LmdsO1xuICAgICAgICBpZiAoIXRoaXMuYXRsYXNUZXh0dXJlKSB7XG4gICAgICAgICAgICB0aGlzLmF0bGFzVGV4dHVyZSA9IG5ldyBUZXh0dXJlKGNvbnRleHQsIHRoaXMuYXRsYXNJbWFnZSwgZ2wuUkdCQSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5kaXJ0eSkge1xuICAgICAgICAgICAgdGhpcy5hdGxhc1RleHR1cmUudXBkYXRlKHRoaXMuYXRsYXNJbWFnZSk7XG4gICAgICAgICAgICB0aGlzLmRpcnR5ID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmF0bGFzVGV4dHVyZS5iaW5kKGdsLkxJTkVBUiwgZ2wuQ0xBTVBfVE9fRURHRSk7XG4gICAgfVxuXG4gICAgX3VwZGF0ZVBhdHRlcm5BdGxhcygpIHtcbiAgICAgICAgY29uc3QgYmlucyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGlkIGluIHRoaXMucGF0dGVybnMpIHtcbiAgICAgICAgICAgIGJpbnMucHVzaCh0aGlzLnBhdHRlcm5zW2lkXS5iaW4pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qge3csIGh9ID0gcG90cGFjayhiaW5zKTtcblxuICAgICAgICBjb25zdCBkc3QgPSB0aGlzLmF0bGFzSW1hZ2U7XG4gICAgICAgIGRzdC5yZXNpemUoe3dpZHRoOiB3IHx8IDEsIGhlaWdodDogaCB8fCAxfSk7XG5cbiAgICAgICAgZm9yIChjb25zdCBpZCBpbiB0aGlzLnBhdHRlcm5zKSB7XG4gICAgICAgICAgICBjb25zdCB7YmlufSA9IHRoaXMucGF0dGVybnNbaWRdO1xuICAgICAgICAgICAgY29uc3QgeCA9IGJpbi54ICsgcGFkZGluZztcbiAgICAgICAgICAgIGNvbnN0IHkgPSBiaW4ueSArIHBhZGRpbmc7XG4gICAgICAgICAgICBjb25zdCBzcmMgPSB0aGlzLmltYWdlc1tpZF0uZGF0YTtcbiAgICAgICAgICAgIGNvbnN0IHcgPSBzcmMud2lkdGg7XG4gICAgICAgICAgICBjb25zdCBoID0gc3JjLmhlaWdodDtcblxuICAgICAgICAgICAgUkdCQUltYWdlLmNvcHkoc3JjLCBkc3QsIHsgeDogMCwgeTogMCB9LCB7IHgsIHkgfSwgeyB3aWR0aDogdywgaGVpZ2h0OiBoIH0pO1xuXG4gICAgICAgICAgICAvLyBBZGQgMSBwaXhlbCB3cmFwcGVkIHBhZGRpbmcgb24gZWFjaCBzaWRlIG9mIHRoZSBpbWFnZS5cbiAgICAgICAgICAgIFJHQkFJbWFnZS5jb3B5KHNyYywgZHN0LCB7IHg6IDAsIHk6IGggLSAxIH0sIHsgeCwgeTogeSAtIDEgfSwgeyB3aWR0aDogdywgaGVpZ2h0OiAxIH0pOyAvLyBUXG4gICAgICAgICAgICBSR0JBSW1hZ2UuY29weShzcmMsIGRzdCwgeyB4OiAwLCB5OiAgICAgMCB9LCB7IHgsIHk6IHkgKyBoIH0sIHsgd2lkdGg6IHcsIGhlaWdodDogMSB9KTsgLy8gQlxuICAgICAgICAgICAgUkdCQUltYWdlLmNvcHkoc3JjLCBkc3QsIHsgeDogdyAtIDEsIHk6IDAgfSwgeyB4OiB4IC0gMSwgeSB9LCB7IHdpZHRoOiAxLCBoZWlnaHQ6IGggfSk7IC8vIExcbiAgICAgICAgICAgIFJHQkFJbWFnZS5jb3B5KHNyYywgZHN0LCB7IHg6IDAsICAgICB5OiAwIH0sIHsgeDogeCArIHcsIHkgfSwgeyB3aWR0aDogMSwgaGVpZ2h0OiBoIH0pOyAvLyBSXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmRpcnR5ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBiZWdpbkZyYW1lKCkge1xuICAgICAgICB0aGlzLmNhbGxiYWNrRGlzcGF0Y2hlZFRoaXNGcmFtZSA9IHt9O1xuICAgIH1cblxuICAgIGRpc3BhdGNoUmVuZGVyQ2FsbGJhY2tzKGlkczogQXJyYXk8c3RyaW5nPikge1xuICAgICAgICBmb3IgKGNvbnN0IGlkIG9mIGlkcykge1xuXG4gICAgICAgICAgICAvLyB0aGUgY2FsbGJhY2sgZm9yIHRoZSBpbWFnZSB3YXMgYWxyZWFkeSBkaXNwYXRjaGVkIGZvciBhIGRpZmZlcmVudCBmcmFtZVxuICAgICAgICAgICAgaWYgKHRoaXMuY2FsbGJhY2tEaXNwYXRjaGVkVGhpc0ZyYW1lW2lkXSkgY29udGludWU7XG4gICAgICAgICAgICB0aGlzLmNhbGxiYWNrRGlzcGF0Y2hlZFRoaXNGcmFtZVtpZF0gPSB0cnVlO1xuXG4gICAgICAgICAgICBjb25zdCBpbWFnZSA9IHRoaXMuaW1hZ2VzW2lkXTtcbiAgICAgICAgICAgIGFzc2VydChpbWFnZSk7XG5cbiAgICAgICAgICAgIGNvbnN0IHVwZGF0ZWQgPSByZW5kZXJTdHlsZUltYWdlKGltYWdlKTtcbiAgICAgICAgICAgIGlmICh1cGRhdGVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVJbWFnZShpZCwgaW1hZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBJbWFnZU1hbmFnZXI7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgeyBnZXRBcnJheUJ1ZmZlciwgUmVzb3VyY2VUeXBlIH0gZnJvbSAnLi4vdXRpbC9hamF4JztcblxuaW1wb3J0IHBhcnNlR2x5cGhQQkYgZnJvbSAnLi9wYXJzZV9nbHlwaF9wYmYnO1xuXG5pbXBvcnQgdHlwZSB7U3R5bGVHbHlwaH0gZnJvbSAnLi9zdHlsZV9nbHlwaCc7XG5pbXBvcnQgdHlwZSB7UmVxdWVzdE1hbmFnZXJ9IGZyb20gJy4uL3V0aWwvbWFwYm94JztcbmltcG9ydCB0eXBlIHtDYWxsYmFja30gZnJvbSAnLi4vdHlwZXMvY2FsbGJhY2snO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAoZm9udHN0YWNrOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZTogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsVGVtcGxhdGU6IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RNYW5hZ2VyOiBSZXF1ZXN0TWFuYWdlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrOiBDYWxsYmFjazx7W251bWJlcl06IFN0eWxlR2x5cGggfCBudWxsfT4pIHtcbiAgICBjb25zdCBiZWdpbiA9IHJhbmdlICogMjU2O1xuICAgIGNvbnN0IGVuZCA9IGJlZ2luICsgMjU1O1xuXG4gICAgY29uc3QgcmVxdWVzdCA9IHJlcXVlc3RNYW5hZ2VyLnRyYW5zZm9ybVJlcXVlc3QoXG4gICAgICAgIHJlcXVlc3RNYW5hZ2VyLm5vcm1hbGl6ZUdseXBoc1VSTCh1cmxUZW1wbGF0ZSlcbiAgICAgICAgICAgIC5yZXBsYWNlKCd7Zm9udHN0YWNrfScsIGZvbnRzdGFjaylcbiAgICAgICAgICAgIC5yZXBsYWNlKCd7cmFuZ2V9JywgYCR7YmVnaW59LSR7ZW5kfWApLFxuICAgICAgICBSZXNvdXJjZVR5cGUuR2x5cGhzKTtcblxuICAgIGdldEFycmF5QnVmZmVyKHJlcXVlc3QsIChlcnI6ID9FcnJvciwgZGF0YTogP0FycmF5QnVmZmVyKSA9PiB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YSkge1xuICAgICAgICAgICAgY29uc3QgZ2x5cGhzID0ge307XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgZ2x5cGggb2YgcGFyc2VHbHlwaFBCRihkYXRhKSkge1xuICAgICAgICAgICAgICAgIGdseXBoc1tnbHlwaC5pZF0gPSBnbHlwaDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgZ2x5cGhzKTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFRpbnlTREY7XG5cbnZhciBJTkYgPSAxZTIwO1xuXG5mdW5jdGlvbiBUaW55U0RGKGZvbnRTaXplLCBidWZmZXIsIHJhZGl1cywgY3V0b2ZmLCBmb250RmFtaWx5LCBmb250V2VpZ2h0KSB7XG4gICAgdGhpcy5mb250U2l6ZSA9IGZvbnRTaXplIHx8IDI0O1xuICAgIHRoaXMuYnVmZmVyID0gYnVmZmVyID09PSB1bmRlZmluZWQgPyAzIDogYnVmZmVyO1xuICAgIHRoaXMuY3V0b2ZmID0gY3V0b2ZmIHx8IDAuMjU7XG4gICAgdGhpcy5mb250RmFtaWx5ID0gZm9udEZhbWlseSB8fCAnc2Fucy1zZXJpZic7XG4gICAgdGhpcy5mb250V2VpZ2h0ID0gZm9udFdlaWdodCB8fCAnbm9ybWFsJztcbiAgICB0aGlzLnJhZGl1cyA9IHJhZGl1cyB8fCA4O1xuICAgIHZhciBzaXplID0gdGhpcy5zaXplID0gdGhpcy5mb250U2l6ZSArIHRoaXMuYnVmZmVyICogMjtcblxuICAgIHRoaXMuY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgdGhpcy5jYW52YXMud2lkdGggPSB0aGlzLmNhbnZhcy5oZWlnaHQgPSBzaXplO1xuXG4gICAgdGhpcy5jdHggPSB0aGlzLmNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgIHRoaXMuY3R4LmZvbnQgPSB0aGlzLmZvbnRXZWlnaHQgKyAnICcgKyB0aGlzLmZvbnRTaXplICsgJ3B4ICcgKyB0aGlzLmZvbnRGYW1pbHk7XG4gICAgdGhpcy5jdHgudGV4dEJhc2VsaW5lID0gJ21pZGRsZSc7XG4gICAgdGhpcy5jdHguZmlsbFN0eWxlID0gJ2JsYWNrJztcblxuICAgIC8vIHRlbXBvcmFyeSBhcnJheXMgZm9yIHRoZSBkaXN0YW5jZSB0cmFuc2Zvcm1cbiAgICB0aGlzLmdyaWRPdXRlciA9IG5ldyBGbG9hdDY0QXJyYXkoc2l6ZSAqIHNpemUpO1xuICAgIHRoaXMuZ3JpZElubmVyID0gbmV3IEZsb2F0NjRBcnJheShzaXplICogc2l6ZSk7XG4gICAgdGhpcy5mID0gbmV3IEZsb2F0NjRBcnJheShzaXplKTtcbiAgICB0aGlzLmQgPSBuZXcgRmxvYXQ2NEFycmF5KHNpemUpO1xuICAgIHRoaXMueiA9IG5ldyBGbG9hdDY0QXJyYXkoc2l6ZSArIDEpO1xuICAgIHRoaXMudiA9IG5ldyBJbnQxNkFycmF5KHNpemUpO1xuXG4gICAgLy8gaGFjayBhcm91bmQgaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM3ODUyXG4gICAgdGhpcy5taWRkbGUgPSBNYXRoLnJvdW5kKChzaXplIC8gMikgKiAobmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdHZWNrby8nKSA+PSAwID8gMS4yIDogMSkpO1xufVxuXG5UaW55U0RGLnByb3RvdHlwZS5kcmF3ID0gZnVuY3Rpb24gKGNoYXIpIHtcbiAgICB0aGlzLmN0eC5jbGVhclJlY3QoMCwgMCwgdGhpcy5zaXplLCB0aGlzLnNpemUpO1xuICAgIHRoaXMuY3R4LmZpbGxUZXh0KGNoYXIsIHRoaXMuYnVmZmVyLCB0aGlzLm1pZGRsZSk7XG5cbiAgICB2YXIgaW1nRGF0YSA9IHRoaXMuY3R4LmdldEltYWdlRGF0YSgwLCAwLCB0aGlzLnNpemUsIHRoaXMuc2l6ZSk7XG4gICAgdmFyIGFscGhhQ2hhbm5lbCA9IG5ldyBVaW50OENsYW1wZWRBcnJheSh0aGlzLnNpemUgKiB0aGlzLnNpemUpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnNpemUgKiB0aGlzLnNpemU7IGkrKykge1xuICAgICAgICB2YXIgYSA9IGltZ0RhdGEuZGF0YVtpICogNCArIDNdIC8gMjU1OyAvLyBhbHBoYSB2YWx1ZVxuICAgICAgICB0aGlzLmdyaWRPdXRlcltpXSA9IGEgPT09IDEgPyAwIDogYSA9PT0gMCA/IElORiA6IE1hdGgucG93KE1hdGgubWF4KDAsIDAuNSAtIGEpLCAyKTtcbiAgICAgICAgdGhpcy5ncmlkSW5uZXJbaV0gPSBhID09PSAxID8gSU5GIDogYSA9PT0gMCA/IDAgOiBNYXRoLnBvdyhNYXRoLm1heCgwLCBhIC0gMC41KSwgMik7XG4gICAgfVxuXG4gICAgZWR0KHRoaXMuZ3JpZE91dGVyLCB0aGlzLnNpemUsIHRoaXMuc2l6ZSwgdGhpcy5mLCB0aGlzLmQsIHRoaXMudiwgdGhpcy56KTtcbiAgICBlZHQodGhpcy5ncmlkSW5uZXIsIHRoaXMuc2l6ZSwgdGhpcy5zaXplLCB0aGlzLmYsIHRoaXMuZCwgdGhpcy52LCB0aGlzLnopO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IHRoaXMuc2l6ZSAqIHRoaXMuc2l6ZTsgaSsrKSB7XG4gICAgICAgIHZhciBkID0gdGhpcy5ncmlkT3V0ZXJbaV0gLSB0aGlzLmdyaWRJbm5lcltpXTtcbiAgICAgICAgYWxwaGFDaGFubmVsW2ldID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMjU1LCBNYXRoLnJvdW5kKDI1NSAtIDI1NSAqIChkIC8gdGhpcy5yYWRpdXMgKyB0aGlzLmN1dG9mZikpKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFscGhhQ2hhbm5lbDtcbn07XG5cbi8vIDJEIEV1Y2xpZGVhbiBkaXN0YW5jZSB0cmFuc2Zvcm0gYnkgRmVsemVuc3p3YWxiICYgSHV0dGVubG9jaGVyIGh0dHBzOi8vY3MuYnJvd24uZWR1L35wZmYvZHQvXG5mdW5jdGlvbiBlZHQoZGF0YSwgd2lkdGgsIGhlaWdodCwgZiwgZCwgdiwgeikge1xuICAgIGZvciAodmFyIHggPSAwOyB4IDwgd2lkdGg7IHgrKykge1xuICAgICAgICBmb3IgKHZhciB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7XG4gICAgICAgICAgICBmW3ldID0gZGF0YVt5ICogd2lkdGggKyB4XTtcbiAgICAgICAgfVxuICAgICAgICBlZHQxZChmLCBkLCB2LCB6LCBoZWlnaHQpO1xuICAgICAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHtcbiAgICAgICAgICAgIGRhdGFbeSAqIHdpZHRoICsgeF0gPSBkW3ldO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykge1xuICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykge1xuICAgICAgICAgICAgZlt4XSA9IGRhdGFbeSAqIHdpZHRoICsgeF07XG4gICAgICAgIH1cbiAgICAgICAgZWR0MWQoZiwgZCwgdiwgeiwgd2lkdGgpO1xuICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykge1xuICAgICAgICAgICAgZGF0YVt5ICogd2lkdGggKyB4XSA9IE1hdGguc3FydChkW3hdKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLy8gMUQgc3F1YXJlZCBkaXN0YW5jZSB0cmFuc2Zvcm1cbmZ1bmN0aW9uIGVkdDFkKGYsIGQsIHYsIHosIG4pIHtcbiAgICB2WzBdID0gMDtcbiAgICB6WzBdID0gLUlORjtcbiAgICB6WzFdID0gK0lORjtcblxuICAgIGZvciAodmFyIHEgPSAxLCBrID0gMDsgcSA8IG47IHErKykge1xuICAgICAgICB2YXIgcyA9ICgoZltxXSArIHEgKiBxKSAtIChmW3Zba11dICsgdltrXSAqIHZba10pKSAvICgyICogcSAtIDIgKiB2W2tdKTtcbiAgICAgICAgd2hpbGUgKHMgPD0geltrXSkge1xuICAgICAgICAgICAgay0tO1xuICAgICAgICAgICAgcyA9ICgoZltxXSArIHEgKiBxKSAtIChmW3Zba11dICsgdltrXSAqIHZba10pKSAvICgyICogcSAtIDIgKiB2W2tdKTtcbiAgICAgICAgfVxuICAgICAgICBrKys7XG4gICAgICAgIHZba10gPSBxO1xuICAgICAgICB6W2tdID0gcztcbiAgICAgICAgeltrICsgMV0gPSArSU5GO1xuICAgIH1cblxuICAgIGZvciAocSA9IDAsIGsgPSAwOyBxIDwgbjsgcSsrKSB7XG4gICAgICAgIHdoaWxlICh6W2sgKyAxXSA8IHEpIGsrKztcbiAgICAgICAgZFtxXSA9IChxIC0gdltrXSkgKiAocSAtIHZba10pICsgZlt2W2tdXTtcbiAgICB9XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgbG9hZEdseXBoUmFuZ2UgZnJvbSAnLi4vc3R5bGUvbG9hZF9nbHlwaF9yYW5nZSc7XG5cbmltcG9ydCBUaW55U0RGIGZyb20gJ0BtYXBib3gvdGlueS1zZGYnO1xuaW1wb3J0IGlzQ2hhciBmcm9tICcuLi91dGlsL2lzX2NoYXJfaW5fdW5pY29kZV9ibG9jayc7XG5pbXBvcnQgeyBhc3luY0FsbCB9IGZyb20gJy4uL3V0aWwvdXRpbCc7XG5pbXBvcnQgeyBBbHBoYUltYWdlIH0gZnJvbSAnLi4vdXRpbC9pbWFnZSc7XG5cbmltcG9ydCB0eXBlIHtTdHlsZUdseXBofSBmcm9tICcuLi9zdHlsZS9zdHlsZV9nbHlwaCc7XG5pbXBvcnQgdHlwZSB7UmVxdWVzdE1hbmFnZXJ9IGZyb20gJy4uL3V0aWwvbWFwYm94JztcbmltcG9ydCB0eXBlIHtDYWxsYmFja30gZnJvbSAnLi4vdHlwZXMvY2FsbGJhY2snO1xuXG50eXBlIEVudHJ5ID0ge1xuICAgIC8vIG51bGwgbWVhbnMgd2UndmUgcmVxdWVzdGVkIHRoZSByYW5nZSwgYnV0IHRoZSBnbHlwaCB3YXNuJ3QgaW5jbHVkZWQgaW4gdGhlIHJlc3VsdC5cbiAgICBnbHlwaHM6IHtbaWQ6IG51bWJlcl06IFN0eWxlR2x5cGggfCBudWxsfSxcbiAgICByZXF1ZXN0czoge1tyYW5nZTogbnVtYmVyXTogQXJyYXk8Q2FsbGJhY2s8e1tudW1iZXJdOiBTdHlsZUdseXBoIHwgbnVsbH0+Pn0sXG4gICAgdGlueVNERj86IFRpbnlTREZcbn07XG5cbmNsYXNzIEdseXBoTWFuYWdlciB7XG4gICAgcmVxdWVzdE1hbmFnZXI6IFJlcXVlc3RNYW5hZ2VyO1xuICAgIGxvY2FsSWRlb2dyYXBoRm9udEZhbWlseTogP3N0cmluZztcbiAgICBlbnRyaWVzOiB7W3N0cmluZ106IEVudHJ5fTtcbiAgICB1cmw6ID9zdHJpbmc7XG5cbiAgICAvLyBleHBvc2VkIGFzIHN0YXRpY3MgdG8gZW5hYmxlIHN0dWJiaW5nIGluIHVuaXQgdGVzdHNcbiAgICBzdGF0aWMgbG9hZEdseXBoUmFuZ2U6IHR5cGVvZiBsb2FkR2x5cGhSYW5nZTtcbiAgICBzdGF0aWMgVGlueVNERjogQ2xhc3M8VGlueVNERj47XG5cbiAgICBjb25zdHJ1Y3RvcihyZXF1ZXN0TWFuYWdlcjogUmVxdWVzdE1hbmFnZXIsIGxvY2FsSWRlb2dyYXBoRm9udEZhbWlseTogP3N0cmluZykge1xuICAgICAgICB0aGlzLnJlcXVlc3RNYW5hZ2VyID0gcmVxdWVzdE1hbmFnZXI7XG4gICAgICAgIHRoaXMubG9jYWxJZGVvZ3JhcGhGb250RmFtaWx5ID0gbG9jYWxJZGVvZ3JhcGhGb250RmFtaWx5O1xuICAgICAgICB0aGlzLmVudHJpZXMgPSB7fTtcbiAgICB9XG5cbiAgICBzZXRVUkwodXJsOiA/c3RyaW5nKSB7XG4gICAgICAgIHRoaXMudXJsID0gdXJsO1xuICAgIH1cblxuICAgIGdldEdseXBocyhnbHlwaHM6IHtbc3RhY2s6IHN0cmluZ106IEFycmF5PG51bWJlcj59LCBjYWxsYmFjazogQ2FsbGJhY2s8e1tzdGFjazogc3RyaW5nXToge1tpZDogbnVtYmVyXTogP1N0eWxlR2x5cGh9fT4pIHtcbiAgICAgICAgY29uc3QgYWxsID0gW107XG5cbiAgICAgICAgZm9yIChjb25zdCBzdGFjayBpbiBnbHlwaHMpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaWQgb2YgZ2x5cGhzW3N0YWNrXSkge1xuICAgICAgICAgICAgICAgIGFsbC5wdXNoKHtzdGFjaywgaWR9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGFzeW5jQWxsKGFsbCwgKHtzdGFjaywgaWR9LCBjYWxsYmFjazogQ2FsbGJhY2s8e3N0YWNrOiBzdHJpbmcsIGlkOiBudW1iZXIsIGdseXBoOiA/U3R5bGVHbHlwaH0+KSA9PiB7XG4gICAgICAgICAgICBsZXQgZW50cnkgPSB0aGlzLmVudHJpZXNbc3RhY2tdO1xuICAgICAgICAgICAgaWYgKCFlbnRyeSkge1xuICAgICAgICAgICAgICAgIGVudHJ5ID0gdGhpcy5lbnRyaWVzW3N0YWNrXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgZ2x5cGhzOiB7fSxcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdHM6IHt9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IGdseXBoID0gZW50cnkuZ2x5cGhzW2lkXTtcbiAgICAgICAgICAgIGlmIChnbHlwaCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwge3N0YWNrLCBpZCwgZ2x5cGh9KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGdseXBoID0gdGhpcy5fdGlueVNERihlbnRyeSwgc3RhY2ssIGlkKTtcbiAgICAgICAgICAgIGlmIChnbHlwaCkge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHtzdGFjaywgaWQsIGdseXBofSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCByYW5nZSA9IE1hdGguZmxvb3IoaWQgLyAyNTYpO1xuICAgICAgICAgICAgaWYgKHJhbmdlICogMjU2ID4gNjU1MzUpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhuZXcgRXJyb3IoJ2dseXBocyA+IDY1NTM1IG5vdCBzdXBwb3J0ZWQnKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgcmVxdWVzdHMgPSBlbnRyeS5yZXF1ZXN0c1tyYW5nZV07XG4gICAgICAgICAgICBpZiAoIXJlcXVlc3RzKSB7XG4gICAgICAgICAgICAgICAgcmVxdWVzdHMgPSBlbnRyeS5yZXF1ZXN0c1tyYW5nZV0gPSBbXTtcbiAgICAgICAgICAgICAgICBHbHlwaE1hbmFnZXIubG9hZEdseXBoUmFuZ2Uoc3RhY2ssIHJhbmdlLCAodGhpcy51cmw6IGFueSksIHRoaXMucmVxdWVzdE1hbmFnZXIsXG4gICAgICAgICAgICAgICAgICAgIChlcnIsIHJlc3BvbnNlOiA/e1tudW1iZXJdOiBTdHlsZUdseXBoIHwgbnVsbH0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaWQgaW4gcmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuZ2x5cGhzWytpZF0gPSByZXNwb25zZVsraWRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgY2Igb2YgcmVxdWVzdHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYihlcnIsIHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBlbnRyeS5yZXF1ZXN0c1tyYW5nZV07XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXF1ZXN0cy5wdXNoKChlcnIsIHJlc3VsdDogP3tbbnVtYmVyXTogU3R5bGVHbHlwaCB8IG51bGx9KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHtzdGFjaywgaWQsIGdseXBoOiByZXN1bHRbaWRdIHx8IG51bGx9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSwgKGVyciwgZ2x5cGhzOiA/QXJyYXk8e3N0YWNrOiBzdHJpbmcsIGlkOiBudW1iZXIsIGdseXBoOiA/U3R5bGVHbHlwaH0+KSA9PiB7XG4gICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZ2x5cGhzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0ge307XG5cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHtzdGFjaywgaWQsIGdseXBofSBvZiBnbHlwaHMpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ2xvbmUgdGhlIGdseXBoIHNvIHRoYXQgb3VyIG93biBjb3B5IG9mIGl0cyBBcnJheUJ1ZmZlciBkb2Vzbid0IGdldCB0cmFuc2ZlcnJlZC5cbiAgICAgICAgICAgICAgICAgICAgKHJlc3VsdFtzdGFja10gfHwgKHJlc3VsdFtzdGFja10gPSB7fSkpW2lkXSA9IGdseXBoICYmIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBnbHlwaC5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJpdG1hcDogZ2x5cGguYml0bWFwLmNsb25lKCksXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRyaWNzOiBnbHlwaC5tZXRyaWNzXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgcmVzdWx0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgX3RpbnlTREYoZW50cnk6IEVudHJ5LCBzdGFjazogc3RyaW5nLCBpZDogbnVtYmVyKTogP1N0eWxlR2x5cGgge1xuICAgICAgICBjb25zdCBmYW1pbHkgPSB0aGlzLmxvY2FsSWRlb2dyYXBoRm9udEZhbWlseTtcbiAgICAgICAgaWYgKCFmYW1pbHkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaXNDaGFyWydDSksgVW5pZmllZCBJZGVvZ3JhcGhzJ10oaWQpICYmICFpc0NoYXJbJ0hhbmd1bCBTeWxsYWJsZXMnXShpZCkpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuZXctY2FwXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgdGlueVNERiA9IGVudHJ5LnRpbnlTREY7XG4gICAgICAgIGlmICghdGlueVNERikge1xuICAgICAgICAgICAgbGV0IGZvbnRXZWlnaHQgPSAnNDAwJztcbiAgICAgICAgICAgIGlmICgvYm9sZC9pLnRlc3Qoc3RhY2spKSB7XG4gICAgICAgICAgICAgICAgZm9udFdlaWdodCA9ICc5MDAnO1xuICAgICAgICAgICAgfSBlbHNlIGlmICgvbWVkaXVtL2kudGVzdChzdGFjaykpIHtcbiAgICAgICAgICAgICAgICBmb250V2VpZ2h0ID0gJzUwMCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKC9saWdodC9pLnRlc3Qoc3RhY2spKSB7XG4gICAgICAgICAgICAgICAgZm9udFdlaWdodCA9ICcyMDAnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGlueVNERiA9IGVudHJ5LnRpbnlTREYgPSBuZXcgR2x5cGhNYW5hZ2VyLlRpbnlTREYoMjQsIDMsIDgsIC4yNSwgZmFtaWx5LCBmb250V2VpZ2h0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpZCxcbiAgICAgICAgICAgIGJpdG1hcDogbmV3IEFscGhhSW1hZ2Uoe3dpZHRoOiAzMCwgaGVpZ2h0OiAzMH0sIHRpbnlTREYuZHJhdyhTdHJpbmcuZnJvbUNoYXJDb2RlKGlkKSkpLFxuICAgICAgICAgICAgbWV0cmljczoge1xuICAgICAgICAgICAgICAgIHdpZHRoOiAyNCxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IDI0LFxuICAgICAgICAgICAgICAgIGxlZnQ6IDAsXG4gICAgICAgICAgICAgICAgdG9wOiAtOCxcbiAgICAgICAgICAgICAgICBhZHZhbmNlOiAyNFxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cbn1cblxuR2x5cGhNYW5hZ2VyLmxvYWRHbHlwaFJhbmdlID0gbG9hZEdseXBoUmFuZ2U7XG5HbHlwaE1hbmFnZXIuVGlueVNERiA9IFRpbnlTREY7XG5cbmV4cG9ydCBkZWZhdWx0IEdseXBoTWFuYWdlcjtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCBzdHlsZVNwZWMgZnJvbSAnLi4vc3R5bGUtc3BlYy9yZWZlcmVuY2UvbGF0ZXN0JztcblxuaW1wb3J0IHsgZW5kc1dpdGgsIGV4dGVuZCwgc3BoZXJpY2FsVG9DYXJ0ZXNpYW4gfSBmcm9tICcuLi91dGlsL3V0aWwnO1xuaW1wb3J0IHsgRXZlbnRlZCB9IGZyb20gJy4uL3V0aWwvZXZlbnRlZCc7XG5pbXBvcnQge1xuICAgIHZhbGlkYXRlU3R5bGUsXG4gICAgdmFsaWRhdGVMaWdodCxcbiAgICBlbWl0VmFsaWRhdGlvbkVycm9yc1xufSBmcm9tICcuL3ZhbGlkYXRlX3N0eWxlJztcbmltcG9ydCBDb2xvciBmcm9tICcuLi9zdHlsZS1zcGVjL3V0aWwvY29sb3InO1xuaW1wb3J0IHsgbnVtYmVyIGFzIGludGVycG9sYXRlIH0gZnJvbSAnLi4vc3R5bGUtc3BlYy91dGlsL2ludGVycG9sYXRlJztcblxuaW1wb3J0IHR5cGUge1N0eWxlUHJvcGVydHlTcGVjaWZpY2F0aW9ufSBmcm9tICcuLi9zdHlsZS1zcGVjL3N0eWxlLXNwZWMnO1xuaW1wb3J0IHR5cGUgRXZhbHVhdGlvblBhcmFtZXRlcnMgZnJvbSAnLi9ldmFsdWF0aW9uX3BhcmFtZXRlcnMnO1xuaW1wb3J0IHR5cGUge1N0eWxlU2V0dGVyT3B0aW9uc30gZnJvbSAnLi4vc3R5bGUvc3R5bGUnO1xuaW1wb3J0IHsgUHJvcGVydGllcywgVHJhbnNpdGlvbmFibGUsIFRyYW5zaXRpb25pbmcsIFBvc3NpYmx5RXZhbHVhdGVkLCBEYXRhQ29uc3RhbnRQcm9wZXJ0eSB9IGZyb20gJy4vcHJvcGVydGllcyc7XG5cbmltcG9ydCB0eXBlIHtcbiAgICBQcm9wZXJ0eSxcbiAgICBQcm9wZXJ0eVZhbHVlLFxuICAgIFRyYW5zaXRpb25QYXJhbWV0ZXJzXG59IGZyb20gJy4vcHJvcGVydGllcyc7XG5cbmltcG9ydCB0eXBlIHtMaWdodFNwZWNpZmljYXRpb259IGZyb20gJy4uL3N0eWxlLXNwZWMvdHlwZXMnO1xuXG50eXBlIExpZ2h0UG9zaXRpb24gPSB7XG4gICAgeDogbnVtYmVyLFxuICAgIHk6IG51bWJlcixcbiAgICB6OiBudW1iZXJcbn07XG5cbmNsYXNzIExpZ2h0UG9zaXRpb25Qcm9wZXJ0eSBpbXBsZW1lbnRzIFByb3BlcnR5PFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSwgTGlnaHRQb3NpdGlvbj4ge1xuICAgIHNwZWNpZmljYXRpb246IFN0eWxlUHJvcGVydHlTcGVjaWZpY2F0aW9uO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuc3BlY2lmaWNhdGlvbiA9IHN0eWxlU3BlYy5saWdodC5wb3NpdGlvbjtcbiAgICB9XG5cbiAgICBwb3NzaWJseUV2YWx1YXRlKHZhbHVlOiBQcm9wZXJ0eVZhbHVlPFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSwgTGlnaHRQb3NpdGlvbj4sIHBhcmFtZXRlcnM6IEV2YWx1YXRpb25QYXJhbWV0ZXJzKTogTGlnaHRQb3NpdGlvbiB7XG4gICAgICAgIHJldHVybiBzcGhlcmljYWxUb0NhcnRlc2lhbih2YWx1ZS5leHByZXNzaW9uLmV2YWx1YXRlKHBhcmFtZXRlcnMpKTtcbiAgICB9XG5cbiAgICBpbnRlcnBvbGF0ZShhOiBMaWdodFBvc2l0aW9uLCBiOiBMaWdodFBvc2l0aW9uLCB0OiBudW1iZXIpOiBMaWdodFBvc2l0aW9uIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHg6IGludGVycG9sYXRlKGEueCwgYi54LCB0KSxcbiAgICAgICAgICAgIHk6IGludGVycG9sYXRlKGEueSwgYi55LCB0KSxcbiAgICAgICAgICAgIHo6IGludGVycG9sYXRlKGEueiwgYi56LCB0KSxcbiAgICAgICAgfTtcbiAgICB9XG59XG5cbnR5cGUgUHJvcHMgPSB7fFxuICAgIFwiYW5jaG9yXCI6IERhdGFDb25zdGFudFByb3BlcnR5PFwibWFwXCIgfCBcInZpZXdwb3J0XCI+LFxuICAgIFwicG9zaXRpb25cIjogTGlnaHRQb3NpdGlvblByb3BlcnR5LFxuICAgIFwiY29sb3JcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8Q29sb3I+LFxuICAgIFwiaW50ZW5zaXR5XCI6IERhdGFDb25zdGFudFByb3BlcnR5PG51bWJlcj4sXG58fTtcblxuY29uc3QgcHJvcGVydGllczogUHJvcGVydGllczxQcm9wcz4gPSBuZXcgUHJvcGVydGllcyh7XG4gICAgXCJhbmNob3JcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlYy5saWdodC5hbmNob3IpLFxuICAgIFwicG9zaXRpb25cIjogbmV3IExpZ2h0UG9zaXRpb25Qcm9wZXJ0eSgpLFxuICAgIFwiY29sb3JcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlYy5saWdodC5jb2xvciksXG4gICAgXCJpbnRlbnNpdHlcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlYy5saWdodC5pbnRlbnNpdHkpLFxufSk7XG5cbmNvbnN0IFRSQU5TSVRJT05fU1VGRklYID0gJy10cmFuc2l0aW9uJztcblxuLypcbiAqIFJlcHJlc2VudHMgdGhlIGxpZ2h0IHVzZWQgdG8gbGlnaHQgZXh0cnVkZWQgZmVhdHVyZXMuXG4gKi9cbmNsYXNzIExpZ2h0IGV4dGVuZHMgRXZlbnRlZCB7XG4gICAgX3RyYW5zaXRpb25hYmxlOiBUcmFuc2l0aW9uYWJsZTxQcm9wcz47XG4gICAgX3RyYW5zaXRpb25pbmc6IFRyYW5zaXRpb25pbmc8UHJvcHM+O1xuICAgIHByb3BlcnRpZXM6IFBvc3NpYmx5RXZhbHVhdGVkPFByb3BzPjtcblxuICAgIGNvbnN0cnVjdG9yKGxpZ2h0T3B0aW9ucz86IExpZ2h0U3BlY2lmaWNhdGlvbikge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLl90cmFuc2l0aW9uYWJsZSA9IG5ldyBUcmFuc2l0aW9uYWJsZShwcm9wZXJ0aWVzKTtcbiAgICAgICAgdGhpcy5zZXRMaWdodChsaWdodE9wdGlvbnMpO1xuICAgICAgICB0aGlzLl90cmFuc2l0aW9uaW5nID0gdGhpcy5fdHJhbnNpdGlvbmFibGUudW50cmFuc2l0aW9uZWQoKTtcbiAgICB9XG5cbiAgICBnZXRMaWdodCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zaXRpb25hYmxlLnNlcmlhbGl6ZSgpO1xuICAgIH1cblxuICAgIHNldExpZ2h0KGxpZ2h0PzogTGlnaHRTcGVjaWZpY2F0aW9uLCBvcHRpb25zOiBTdHlsZVNldHRlck9wdGlvbnMgPSB7fSkge1xuICAgICAgICBpZiAodGhpcy5fdmFsaWRhdGUodmFsaWRhdGVMaWdodCwgbGlnaHQsIG9wdGlvbnMpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IG5hbWUgaW4gbGlnaHQpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gbGlnaHRbbmFtZV07XG4gICAgICAgICAgICBpZiAoZW5kc1dpdGgobmFtZSwgVFJBTlNJVElPTl9TVUZGSVgpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNpdGlvbmFibGUuc2V0VHJhbnNpdGlvbihuYW1lLnNsaWNlKDAsIC1UUkFOU0lUSU9OX1NVRkZJWC5sZW5ndGgpLCB2YWx1ZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zaXRpb25hYmxlLnNldFZhbHVlKG5hbWUsIHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHVwZGF0ZVRyYW5zaXRpb25zKHBhcmFtZXRlcnM6IFRyYW5zaXRpb25QYXJhbWV0ZXJzKSB7XG4gICAgICAgIHRoaXMuX3RyYW5zaXRpb25pbmcgPSB0aGlzLl90cmFuc2l0aW9uYWJsZS50cmFuc2l0aW9uZWQocGFyYW1ldGVycywgdGhpcy5fdHJhbnNpdGlvbmluZyk7XG4gICAgfVxuXG4gICAgaGFzVHJhbnNpdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zaXRpb25pbmcuaGFzVHJhbnNpdGlvbigpO1xuICAgIH1cblxuICAgIHJlY2FsY3VsYXRlKHBhcmFtZXRlcnM6IEV2YWx1YXRpb25QYXJhbWV0ZXJzKSB7XG4gICAgICAgIHRoaXMucHJvcGVydGllcyA9IHRoaXMuX3RyYW5zaXRpb25pbmcucG9zc2libHlFdmFsdWF0ZShwYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICBfdmFsaWRhdGUodmFsaWRhdGU6IEZ1bmN0aW9uLCB2YWx1ZTogbWl4ZWQsIG9wdGlvbnM/OiB7dmFsaWRhdGU/OiBib29sZWFufSkge1xuICAgICAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLnZhbGlkYXRlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGVtaXRWYWxpZGF0aW9uRXJyb3JzKHRoaXMsIHZhbGlkYXRlLmNhbGwodmFsaWRhdGVTdHlsZSwgZXh0ZW5kKHtcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgLy8gV29ya2Fyb3VuZCBmb3IgaHR0cHM6Ly9naXRodWIuY29tL21hcGJveC9tYXBib3gtZ2wtanMvaXNzdWVzLzI0MDdcbiAgICAgICAgICAgIHN0eWxlOiB7Z2x5cGhzOiB0cnVlLCBzcHJpdGU6IHRydWV9LFxuICAgICAgICAgICAgc3R5bGVTcGVjXG4gICAgICAgIH0pKSk7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBMaWdodDtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7IHdhcm5PbmNlIH0gZnJvbSAnLi4vdXRpbC91dGlsJztcblxuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tICcuLi9nbC9jb250ZXh0JztcblxuLyoqXG4gKiBBIExpbmVBdGxhcyBsZXRzIHVzIHJldXNlIHJlbmRlcmVkIGRhc2hlZCBsaW5lc1xuICogYnkgd3JpdGluZyBtYW55IG9mIHRoZW0gdG8gYSB0ZXh0dXJlIGFuZCB0aGVuIGZldGNoaW5nIHRoZWlyIHBvc2l0aW9uc1xuICogdXNpbmcgLmdldERhc2guXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IHdpZHRoXG4gKiBAcGFyYW0ge251bWJlcn0gaGVpZ2h0XG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBMaW5lQXRsYXMge1xuICAgIHdpZHRoOiBudW1iZXI7XG4gICAgaGVpZ2h0OiBudW1iZXI7XG4gICAgbmV4dFJvdzogbnVtYmVyO1xuICAgIGJ5dGVzOiBudW1iZXI7XG4gICAgZGF0YTogVWludDhBcnJheTtcbiAgICBwb3NpdGlvbnM6IHtbc3RyaW5nXTogYW55fTtcbiAgICBkaXJ0eTogYm9vbGVhbjtcbiAgICB0ZXh0dXJlOiBXZWJHTFRleHR1cmU7XG5cbiAgICBjb25zdHJ1Y3Rvcih3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcikge1xuICAgICAgICB0aGlzLndpZHRoID0gd2lkdGg7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgICB0aGlzLm5leHRSb3cgPSAwO1xuXG4gICAgICAgIHRoaXMuYnl0ZXMgPSA0O1xuICAgICAgICB0aGlzLmRhdGEgPSBuZXcgVWludDhBcnJheSh0aGlzLndpZHRoICogdGhpcy5oZWlnaHQgKiB0aGlzLmJ5dGVzKTtcblxuICAgICAgICB0aGlzLnBvc2l0aW9ucyA9IHt9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBvciBjcmVhdGUgYSBkYXNoIGxpbmUgcGF0dGVybi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gZGFzaGFycmF5XG4gICAgICogQHBhcmFtIHtib29sZWFufSByb3VuZCB3aGV0aGVyIHRvIGFkZCBjaXJjbGUgY2FwcyBpbiBiZXR3ZWVuIGRhc2ggc2VnbWVudHNcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBwb3NpdGlvbiBvZiBkYXNoIHRleHR1cmUgaW4geyB5LCBoZWlnaHQsIHdpZHRoIH1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGdldERhc2goZGFzaGFycmF5OiBBcnJheTxudW1iZXI+LCByb3VuZDogYm9vbGVhbikge1xuICAgICAgICBjb25zdCBrZXkgPSBkYXNoYXJyYXkuam9pbihcIixcIikgKyBTdHJpbmcocm91bmQpO1xuXG4gICAgICAgIGlmICghdGhpcy5wb3NpdGlvbnNba2V5XSkge1xuICAgICAgICAgICAgdGhpcy5wb3NpdGlvbnNba2V5XSA9IHRoaXMuYWRkRGFzaChkYXNoYXJyYXksIHJvdW5kKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5wb3NpdGlvbnNba2V5XTtcbiAgICB9XG5cbiAgICBhZGREYXNoKGRhc2hhcnJheTogQXJyYXk8bnVtYmVyPiwgcm91bmQ6IGJvb2xlYW4pIHtcblxuICAgICAgICBjb25zdCBuID0gcm91bmQgPyA3IDogMDtcbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gMiAqIG4gKyAxO1xuICAgICAgICBjb25zdCBvZmZzZXQgPSAxMjg7XG5cbiAgICAgICAgaWYgKHRoaXMubmV4dFJvdyArIGhlaWdodCA+IHRoaXMuaGVpZ2h0KSB7XG4gICAgICAgICAgICB3YXJuT25jZSgnTGluZUF0bGFzIG91dCBvZiBzcGFjZScpO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbGVuZ3RoID0gMDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXNoYXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxlbmd0aCArPSBkYXNoYXJyYXlbaV07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzdHJldGNoID0gdGhpcy53aWR0aCAvIGxlbmd0aDtcbiAgICAgICAgY29uc3QgaGFsZldpZHRoID0gc3RyZXRjaCAvIDI7XG5cbiAgICAgICAgLy8gSWYgZGFzaGFycmF5IGhhcyBhbiBvZGQgbGVuZ3RoLCBib3RoIHRoZSBmaXJzdCBhbmQgbGFzdCBwYXJ0c1xuICAgICAgICAvLyBhcmUgZGFzaGVzIGFuZCBzaG91bGQgYmUgam9pbmVkIHNlYW1sZXNzbHkuXG4gICAgICAgIGNvbnN0IG9kZExlbmd0aCA9IGRhc2hhcnJheS5sZW5ndGggJSAyID09PSAxO1xuXG4gICAgICAgIGZvciAobGV0IHkgPSAtbjsgeSA8PSBuOyB5KyspIHtcbiAgICAgICAgICAgIGNvbnN0IHJvdyA9IHRoaXMubmV4dFJvdyArIG4gKyB5O1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLndpZHRoICogcm93O1xuXG4gICAgICAgICAgICBsZXQgbGVmdCA9IG9kZExlbmd0aCA/IC1kYXNoYXJyYXlbZGFzaGFycmF5Lmxlbmd0aCAtIDFdIDogMDtcbiAgICAgICAgICAgIGxldCByaWdodCA9IGRhc2hhcnJheVswXTtcbiAgICAgICAgICAgIGxldCBwYXJ0SW5kZXggPSAxO1xuXG4gICAgICAgICAgICBmb3IgKGxldCB4ID0gMDsgeCA8IHRoaXMud2lkdGg7IHgrKykge1xuXG4gICAgICAgICAgICAgICAgd2hpbGUgKHJpZ2h0IDwgeCAvIHN0cmV0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgbGVmdCA9IHJpZ2h0O1xuICAgICAgICAgICAgICAgICAgICByaWdodCA9IHJpZ2h0ICsgZGFzaGFycmF5W3BhcnRJbmRleF07XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKG9kZExlbmd0aCAmJiBwYXJ0SW5kZXggPT09IGRhc2hhcnJheS5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByaWdodCArPSBkYXNoYXJyYXlbMF07XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBwYXJ0SW5kZXgrKztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBkaXN0TGVmdCA9IE1hdGguYWJzKHggLSBsZWZ0ICogc3RyZXRjaCk7XG4gICAgICAgICAgICAgICAgY29uc3QgZGlzdFJpZ2h0ID0gTWF0aC5hYnMoeCAtIHJpZ2h0ICogc3RyZXRjaCk7XG4gICAgICAgICAgICAgICAgY29uc3QgZGlzdCA9IE1hdGgubWluKGRpc3RMZWZ0LCBkaXN0UmlnaHQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGluc2lkZSA9IChwYXJ0SW5kZXggJSAyKSA9PT0gMTtcbiAgICAgICAgICAgICAgICBsZXQgc2lnbmVkRGlzdGFuY2U7XG5cbiAgICAgICAgICAgICAgICBpZiAocm91bmQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQWRkIGNpcmNsZSBjYXBzXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRpc3RNaWRkbGUgPSBuID8geSAvIG4gKiAoaGFsZldpZHRoICsgMSkgOiAwO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5zaWRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkaXN0RWRnZSA9IGhhbGZXaWR0aCAtIE1hdGguYWJzKGRpc3RNaWRkbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmVkRGlzdGFuY2UgPSBNYXRoLnNxcnQoZGlzdCAqIGRpc3QgKyBkaXN0RWRnZSAqIGRpc3RFZGdlKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25lZERpc3RhbmNlID0gaGFsZldpZHRoIC0gTWF0aC5zcXJ0KGRpc3QgKiBkaXN0ICsgZGlzdE1pZGRsZSAqIGRpc3RNaWRkbGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc2lnbmVkRGlzdGFuY2UgPSAoaW5zaWRlID8gMSA6IC0xKSAqIGRpc3Q7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhWzMgKyAoaW5kZXggKyB4KSAqIDRdID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMjU1LCBzaWduZWREaXN0YW5jZSArIG9mZnNldCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcG9zID0ge1xuICAgICAgICAgICAgeTogKHRoaXMubmV4dFJvdyArIG4gKyAwLjUpIC8gdGhpcy5oZWlnaHQsXG4gICAgICAgICAgICBoZWlnaHQ6IDIgKiBuIC8gdGhpcy5oZWlnaHQsXG4gICAgICAgICAgICB3aWR0aDogbGVuZ3RoXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5uZXh0Um93ICs9IGhlaWdodDtcbiAgICAgICAgdGhpcy5kaXJ0eSA9IHRydWU7XG5cbiAgICAgICAgcmV0dXJuIHBvcztcbiAgICB9XG5cbiAgICBiaW5kKGNvbnRleHQ6IENvbnRleHQpIHtcbiAgICAgICAgY29uc3QgZ2wgPSBjb250ZXh0LmdsO1xuICAgICAgICBpZiAoIXRoaXMudGV4dHVyZSkge1xuICAgICAgICAgICAgdGhpcy50ZXh0dXJlID0gZ2wuY3JlYXRlVGV4dHVyZSgpO1xuICAgICAgICAgICAgZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgdGhpcy50ZXh0dXJlKTtcbiAgICAgICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9XUkFQX1MsIGdsLlJFUEVBVCk7XG4gICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9ULCBnbC5SRVBFQVQpO1xuICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01JTl9GSUxURVIsIGdsLkxJTkVBUik7XG4gICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUFHX0ZJTFRFUiwgZ2wuTElORUFSKTtcbiAgICAgICAgICAgIGdsLnRleEltYWdlMkQoZ2wuVEVYVFVSRV8yRCwgMCwgZ2wuUkdCQSwgdGhpcy53aWR0aCwgdGhpcy5oZWlnaHQsIDAsIGdsLlJHQkEsIGdsLlVOU0lHTkVEX0JZVEUsIHRoaXMuZGF0YSk7XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIHRoaXMudGV4dHVyZSk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmRpcnR5KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kaXJ0eSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGdsLnRleFN1YkltYWdlMkQoZ2wuVEVYVFVSRV8yRCwgMCwgMCwgMCwgdGhpcy53aWR0aCwgdGhpcy5oZWlnaHQsIGdsLlJHQkEsIGdsLlVOU0lHTkVEX0JZVEUsIHRoaXMuZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IExpbmVBdGxhcztcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7IHVuaXF1ZUlkLCBhc3luY0FsbCB9IGZyb20gJy4vdXRpbCc7XG5pbXBvcnQgQWN0b3IgZnJvbSAnLi9hY3Rvcic7XG5cbmltcG9ydCB0eXBlIFdvcmtlclBvb2wgZnJvbSAnLi93b3JrZXJfcG9vbCc7XG5cbi8qKlxuICogUmVzcG9uc2libGUgZm9yIHNlbmRpbmcgbWVzc2FnZXMgZnJvbSBhIHtAbGluayBTb3VyY2V9IHRvIGFuIGFzc29jaWF0ZWRcbiAqIHtAbGluayBXb3JrZXJTb3VyY2V9LlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIERpc3BhdGNoZXIge1xuICAgIHdvcmtlclBvb2w6IFdvcmtlclBvb2w7XG4gICAgYWN0b3JzOiBBcnJheTxBY3Rvcj47XG4gICAgY3VycmVudEFjdG9yOiBudW1iZXI7XG4gICAgaWQ6IG51bWJlcjtcblxuICAgIC8vIGV4cG9zZWQgdG8gYWxsb3cgc3R1YmJpbmcgaW4gdW5pdCB0ZXN0c1xuICAgIHN0YXRpYyBBY3RvcjogQ2xhc3M8QWN0b3I+O1xuXG4gICAgY29uc3RydWN0b3Iod29ya2VyUG9vbDogV29ya2VyUG9vbCwgcGFyZW50OiBhbnkpIHtcbiAgICAgICAgdGhpcy53b3JrZXJQb29sID0gd29ya2VyUG9vbDtcbiAgICAgICAgdGhpcy5hY3RvcnMgPSBbXTtcbiAgICAgICAgdGhpcy5jdXJyZW50QWN0b3IgPSAwO1xuICAgICAgICB0aGlzLmlkID0gdW5pcXVlSWQoKTtcbiAgICAgICAgY29uc3Qgd29ya2VycyA9IHRoaXMud29ya2VyUG9vbC5hY3F1aXJlKHRoaXMuaWQpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHdvcmtlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHdvcmtlciA9IHdvcmtlcnNbaV07XG4gICAgICAgICAgICBjb25zdCBhY3RvciA9IG5ldyBEaXNwYXRjaGVyLkFjdG9yKHdvcmtlciwgcGFyZW50LCB0aGlzLmlkKTtcbiAgICAgICAgICAgIGFjdG9yLm5hbWUgPSBgV29ya2VyICR7aX1gO1xuICAgICAgICAgICAgdGhpcy5hY3RvcnMucHVzaChhY3Rvcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBCcm9hZGNhc3QgYSBtZXNzYWdlIHRvIGFsbCBXb3JrZXJzLlxuICAgICAqL1xuICAgIGJyb2FkY2FzdCh0eXBlOiBzdHJpbmcsIGRhdGE6IG1peGVkLCBjYj86IEZ1bmN0aW9uKSB7XG4gICAgICAgIGNiID0gY2IgfHwgZnVuY3Rpb24gKCkge307XG4gICAgICAgIGFzeW5jQWxsKHRoaXMuYWN0b3JzLCAoYWN0b3IsIGRvbmUpID0+IHtcbiAgICAgICAgICAgIGFjdG9yLnNlbmQodHlwZSwgZGF0YSwgZG9uZSk7XG4gICAgICAgIH0sIGNiKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZW5kIGEgbWVzc2FnZSB0byBhIFdvcmtlci5cbiAgICAgKiBAcGFyYW0gdGFyZ2V0SUQgVGhlIElEIG9mIHRoZSBXb3JrZXIgdG8gd2hpY2ggdG8gc2VuZCB0aGlzIG1lc3NhZ2UuIE9taXQgdG8gYWxsb3cgdGhlIGRpc3BhdGNoZXIgdG8gY2hvb3NlLlxuICAgICAqIEByZXR1cm5zIFRoZSBJRCBvZiB0aGUgd29ya2VyIHRvIHdoaWNoIHRoZSBtZXNzYWdlIHdhcyBzZW50LlxuICAgICAqL1xuICAgIHNlbmQodHlwZTogc3RyaW5nLCBkYXRhOiBtaXhlZCwgY2FsbGJhY2s/OiA/RnVuY3Rpb24sIHRhcmdldElEPzogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0YXJnZXRJRCAhPT0gJ251bWJlcicgfHwgaXNOYU4odGFyZ2V0SUQpKSB7XG4gICAgICAgICAgICAvLyBVc2Ugcm91bmQgcm9iaW4gdG8gc2VuZCByZXF1ZXN0cyB0byB3ZWIgd29ya2Vycy5cbiAgICAgICAgICAgIHRhcmdldElEID0gdGhpcy5jdXJyZW50QWN0b3IgPSAodGhpcy5jdXJyZW50QWN0b3IgKyAxKSAlIHRoaXMuYWN0b3JzLmxlbmd0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuYWN0b3JzW3RhcmdldElEXS5zZW5kKHR5cGUsIGRhdGEsIGNhbGxiYWNrKTtcbiAgICAgICAgcmV0dXJuIHRhcmdldElEO1xuICAgIH1cblxuICAgIHJlbW92ZSgpIHtcbiAgICAgICAgdGhpcy5hY3RvcnMuZm9yRWFjaCgoYWN0b3IpID0+IHsgYWN0b3IucmVtb3ZlKCk7IH0pO1xuICAgICAgICB0aGlzLmFjdG9ycyA9IFtdO1xuICAgICAgICB0aGlzLndvcmtlclBvb2wucmVsZWFzZSh0aGlzLmlkKTtcbiAgICB9XG59XG5cbkRpc3BhdGNoZXIuQWN0b3IgPSBBY3RvcjtcblxuZXhwb3J0IGRlZmF1bHQgRGlzcGF0Y2hlcjtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7IHBpY2sgfSBmcm9tICcuLi91dGlsL3V0aWwnO1xuXG5pbXBvcnQgeyBnZXRKU09OLCBSZXNvdXJjZVR5cGUgfSBmcm9tICcuLi91dGlsL2FqYXgnO1xuaW1wb3J0IGJyb3dzZXIgZnJvbSAnLi4vdXRpbC9icm93c2VyJztcblxuaW1wb3J0IHR5cGUge1JlcXVlc3RNYW5hZ2VyfSBmcm9tICcuLi91dGlsL21hcGJveCc7XG5pbXBvcnQgdHlwZSB7Q2FsbGJhY2t9IGZyb20gJy4uL3R5cGVzL2NhbGxiYWNrJztcbmltcG9ydCB0eXBlIHtUaWxlSlNPTn0gZnJvbSAnLi4vdHlwZXMvdGlsZWpzb24nO1xuaW1wb3J0IHR5cGUge0NhbmNlbGFibGV9IGZyb20gJy4uL3R5cGVzL2NhbmNlbGFibGUnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihvcHRpb25zOiBhbnksIHJlcXVlc3RNYW5hZ2VyOiBSZXF1ZXN0TWFuYWdlciwgY2FsbGJhY2s6IENhbGxiYWNrPFRpbGVKU09OPik6IENhbmNlbGFibGUge1xuICAgIGNvbnN0IGxvYWRlZCA9IGZ1bmN0aW9uKGVycjogP0Vycm9yLCB0aWxlSlNPTjogP09iamVjdCkge1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aWxlSlNPTikge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBhbnkgPSBwaWNrKFxuICAgICAgICAgICAgICAgIHRpbGVKU09OLFxuICAgICAgICAgICAgICAgIFsndGlsZXMnLCAnbWluem9vbScsICdtYXh6b29tJywgJ2F0dHJpYnV0aW9uJywgJ21hcGJveF9sb2dvJywgJ2JvdW5kcyddXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBpZiAodGlsZUpTT04udmVjdG9yX2xheWVycykge1xuICAgICAgICAgICAgICAgIHJlc3VsdC52ZWN0b3JMYXllcnMgPSB0aWxlSlNPTi52ZWN0b3JfbGF5ZXJzO1xuICAgICAgICAgICAgICAgIHJlc3VsdC52ZWN0b3JMYXllcklkcyA9IHJlc3VsdC52ZWN0b3JMYXllcnMubWFwKChsYXllcikgPT4geyByZXR1cm4gbGF5ZXIuaWQ7IH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBvbmx5IGNhbm9uaWNhbGl6ZSB0aWxlIHRpbGVzZXQgaWYgc291cmNlIGlzIGRlY2xhcmVkIHVzaW5nIGEgdGlsZWpzb24gdXJsXG4gICAgICAgICAgICBpZiAob3B0aW9ucy51cmwpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQudGlsZXMgPSByZXF1ZXN0TWFuYWdlci5jYW5vbmljYWxpemVUaWxlc2V0KHJlc3VsdCwgb3B0aW9ucy51cmwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgcmVzdWx0KTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBpZiAob3B0aW9ucy51cmwpIHtcbiAgICAgICAgcmV0dXJuIGdldEpTT04ocmVxdWVzdE1hbmFnZXIudHJhbnNmb3JtUmVxdWVzdChyZXF1ZXN0TWFuYWdlci5ub3JtYWxpemVTb3VyY2VVUkwob3B0aW9ucy51cmwpLCBSZXNvdXJjZVR5cGUuU291cmNlKSwgbG9hZGVkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gYnJvd3Nlci5mcmFtZSgoKSA9PiBsb2FkZWQobnVsbCwgb3B0aW9ucykpO1xuICAgIH1cbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCBMbmdMYXRCb3VuZHMgZnJvbSAnLi4vZ2VvL2xuZ19sYXRfYm91bmRzJztcbmltcG9ydCB7bWVyY2F0b3JYZnJvbUxuZywgbWVyY2F0b3JZZnJvbUxhdH0gZnJvbSAnLi4vZ2VvL21lcmNhdG9yX2Nvb3JkaW5hdGUnO1xuXG5pbXBvcnQgdHlwZSB7Q2Fub25pY2FsVGlsZUlEfSBmcm9tICcuL3RpbGVfaWQnO1xuXG5jbGFzcyBUaWxlQm91bmRzIHtcbiAgICBib3VuZHM6IExuZ0xhdEJvdW5kcztcbiAgICBtaW56b29tOiBudW1iZXI7XG4gICAgbWF4em9vbTogbnVtYmVyO1xuXG4gICAgY29uc3RydWN0b3IoYm91bmRzOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSwgbWluem9vbTogP251bWJlciwgbWF4em9vbTogP251bWJlcikge1xuICAgICAgICB0aGlzLmJvdW5kcyA9IExuZ0xhdEJvdW5kcy5jb252ZXJ0KHRoaXMudmFsaWRhdGVCb3VuZHMoYm91bmRzKSk7XG4gICAgICAgIHRoaXMubWluem9vbSA9IG1pbnpvb20gfHwgMDtcbiAgICAgICAgdGhpcy5tYXh6b29tID0gbWF4em9vbSB8fCAyNDtcbiAgICB9XG5cbiAgICB2YWxpZGF0ZUJvdW5kcyhib3VuZHM6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdKSB7XG4gICAgICAgIC8vIG1ha2Ugc3VyZSB0aGUgYm91bmRzIHByb3BlcnR5IGNvbnRhaW5zIHZhbGlkIGxvbmdpdHVkZSBhbmQgbGF0aXR1ZGVzXG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShib3VuZHMpIHx8IGJvdW5kcy5sZW5ndGggIT09IDQpIHJldHVybiBbLTE4MCwgLTkwLCAxODAsIDkwXTtcbiAgICAgICAgcmV0dXJuIFtNYXRoLm1heCgtMTgwLCBib3VuZHNbMF0pLCBNYXRoLm1heCgtOTAsIGJvdW5kc1sxXSksIE1hdGgubWluKDE4MCwgYm91bmRzWzJdKSwgTWF0aC5taW4oOTAsIGJvdW5kc1szXSldO1xuICAgIH1cblxuICAgIGNvbnRhaW5zKHRpbGVJRDogQ2Fub25pY2FsVGlsZUlEKSB7XG4gICAgICAgIGNvbnN0IHdvcmxkU2l6ZSA9IE1hdGgucG93KDIsIHRpbGVJRC56KTtcbiAgICAgICAgY29uc3QgbGV2ZWwgPSB7XG4gICAgICAgICAgICBtaW5YOiBNYXRoLmZsb29yKG1lcmNhdG9yWGZyb21MbmcodGhpcy5ib3VuZHMuZ2V0V2VzdCgpKSAqIHdvcmxkU2l6ZSksXG4gICAgICAgICAgICBtaW5ZOiBNYXRoLmZsb29yKG1lcmNhdG9yWWZyb21MYXQodGhpcy5ib3VuZHMuZ2V0Tm9ydGgoKSkgKiB3b3JsZFNpemUpLFxuICAgICAgICAgICAgbWF4WDogTWF0aC5jZWlsKG1lcmNhdG9yWGZyb21MbmcodGhpcy5ib3VuZHMuZ2V0RWFzdCgpKSAqIHdvcmxkU2l6ZSksXG4gICAgICAgICAgICBtYXhZOiBNYXRoLmNlaWwobWVyY2F0b3JZZnJvbUxhdCh0aGlzLmJvdW5kcy5nZXRTb3V0aCgpKSAqIHdvcmxkU2l6ZSlcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgaGl0ID0gdGlsZUlELnggPj0gbGV2ZWwubWluWCAmJiB0aWxlSUQueCA8IGxldmVsLm1heFggJiYgdGlsZUlELnkgPj0gbGV2ZWwubWluWSAmJiB0aWxlSUQueSA8IGxldmVsLm1heFk7XG4gICAgICAgIHJldHVybiBoaXQ7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBUaWxlQm91bmRzO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHsgRXZlbnQsIEVycm9yRXZlbnQsIEV2ZW50ZWQgfSBmcm9tICcuLi91dGlsL2V2ZW50ZWQnO1xuXG5pbXBvcnQgeyBleHRlbmQsIHBpY2sgfSBmcm9tICcuLi91dGlsL3V0aWwnO1xuaW1wb3J0IGxvYWRUaWxlSlNPTiBmcm9tICcuL2xvYWRfdGlsZWpzb24nO1xuaW1wb3J0IHsgcG9zdFR1cm5zdGlsZUV2ZW50LCBwb3N0TWFwTG9hZEV2ZW50IH0gZnJvbSAnLi4vdXRpbC9tYXBib3gnO1xuaW1wb3J0IFRpbGVCb3VuZHMgZnJvbSAnLi90aWxlX2JvdW5kcyc7XG5pbXBvcnQgeyBSZXNvdXJjZVR5cGUgfSBmcm9tICcuLi91dGlsL2FqYXgnO1xuaW1wb3J0IGJyb3dzZXIgZnJvbSAnLi4vdXRpbC9icm93c2VyJztcblxuaW1wb3J0IHR5cGUge1NvdXJjZX0gZnJvbSAnLi9zb3VyY2UnO1xuaW1wb3J0IHR5cGUge092ZXJzY2FsZWRUaWxlSUR9IGZyb20gJy4vdGlsZV9pZCc7XG5pbXBvcnQgdHlwZSBNYXAgZnJvbSAnLi4vdWkvbWFwJztcbmltcG9ydCB0eXBlIERpc3BhdGNoZXIgZnJvbSAnLi4vdXRpbC9kaXNwYXRjaGVyJztcbmltcG9ydCB0eXBlIFRpbGUgZnJvbSAnLi90aWxlJztcbmltcG9ydCB0eXBlIHtDYWxsYmFja30gZnJvbSAnLi4vdHlwZXMvY2FsbGJhY2snO1xuaW1wb3J0IHR5cGUge0NhbmNlbGFibGV9IGZyb20gJy4uL3R5cGVzL2NhbmNlbGFibGUnO1xuaW1wb3J0IHR5cGUge1ZlY3RvclNvdXJjZVNwZWNpZmljYXRpb259IGZyb20gJy4uL3N0eWxlLXNwZWMvdHlwZXMnO1xuXG5jbGFzcyBWZWN0b3JUaWxlU291cmNlIGV4dGVuZHMgRXZlbnRlZCBpbXBsZW1lbnRzIFNvdXJjZSB7XG4gICAgdHlwZTogJ3ZlY3Rvcic7XG4gICAgaWQ6IHN0cmluZztcbiAgICBtaW56b29tOiBudW1iZXI7XG4gICAgbWF4em9vbTogbnVtYmVyO1xuICAgIHVybDogc3RyaW5nO1xuICAgIHNjaGVtZTogc3RyaW5nO1xuICAgIHRpbGVTaXplOiBudW1iZXI7XG5cbiAgICBfb3B0aW9uczogVmVjdG9yU291cmNlU3BlY2lmaWNhdGlvbjtcbiAgICBfY29sbGVjdFJlc291cmNlVGltaW5nOiBib29sZWFuO1xuICAgIGRpc3BhdGNoZXI6IERpc3BhdGNoZXI7XG4gICAgbWFwOiBNYXA7XG4gICAgYm91bmRzOiA/W251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl07XG4gICAgdGlsZXM6IEFycmF5PHN0cmluZz47XG4gICAgdGlsZUJvdW5kczogVGlsZUJvdW5kcztcbiAgICByZXBhcnNlT3ZlcnNjYWxlZDogYm9vbGVhbjtcbiAgICBpc1RpbGVDbGlwcGVkOiBib29sZWFuO1xuICAgIF90aWxlSlNPTlJlcXVlc3Q6ID9DYW5jZWxhYmxlO1xuXG4gICAgY29uc3RydWN0b3IoaWQ6IHN0cmluZywgb3B0aW9uczogVmVjdG9yU291cmNlU3BlY2lmaWNhdGlvbiAmIHtjb2xsZWN0UmVzb3VyY2VUaW1pbmc6IGJvb2xlYW59LCBkaXNwYXRjaGVyOiBEaXNwYXRjaGVyLCBldmVudGVkUGFyZW50OiBFdmVudGVkKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuaWQgPSBpZDtcbiAgICAgICAgdGhpcy5kaXNwYXRjaGVyID0gZGlzcGF0Y2hlcjtcblxuICAgICAgICB0aGlzLnR5cGUgPSAndmVjdG9yJztcbiAgICAgICAgdGhpcy5taW56b29tID0gMDtcbiAgICAgICAgdGhpcy5tYXh6b29tID0gMjI7XG4gICAgICAgIHRoaXMuc2NoZW1lID0gJ3h5eic7XG4gICAgICAgIHRoaXMudGlsZVNpemUgPSA1MTI7XG4gICAgICAgIHRoaXMucmVwYXJzZU92ZXJzY2FsZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLmlzVGlsZUNsaXBwZWQgPSB0cnVlO1xuXG4gICAgICAgIGV4dGVuZCh0aGlzLCBwaWNrKG9wdGlvbnMsIFsndXJsJywgJ3NjaGVtZScsICd0aWxlU2l6ZSddKSk7XG4gICAgICAgIHRoaXMuX29wdGlvbnMgPSBleHRlbmQoeyB0eXBlOiAndmVjdG9yJyB9LCBvcHRpb25zKTtcblxuICAgICAgICB0aGlzLl9jb2xsZWN0UmVzb3VyY2VUaW1pbmcgPSBvcHRpb25zLmNvbGxlY3RSZXNvdXJjZVRpbWluZztcblxuICAgICAgICBpZiAodGhpcy50aWxlU2l6ZSAhPT0gNTEyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3ZlY3RvciB0aWxlIHNvdXJjZXMgbXVzdCBoYXZlIGEgdGlsZVNpemUgb2YgNTEyJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNldEV2ZW50ZWRQYXJlbnQoZXZlbnRlZFBhcmVudCk7XG4gICAgfVxuXG4gICAgbG9hZCgpIHtcbiAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgnZGF0YWxvYWRpbmcnLCB7ZGF0YVR5cGU6ICdzb3VyY2UnfSkpO1xuICAgICAgICB0aGlzLl90aWxlSlNPTlJlcXVlc3QgPSBsb2FkVGlsZUpTT04odGhpcy5fb3B0aW9ucywgdGhpcy5tYXAuX3JlcXVlc3RNYW5hZ2VyLCAoZXJyLCB0aWxlSlNPTikgPT4ge1xuICAgICAgICAgICAgdGhpcy5fdGlsZUpTT05SZXF1ZXN0ID0gbnVsbDtcbiAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpcmUobmV3IEVycm9yRXZlbnQoZXJyKSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRpbGVKU09OKSB7XG4gICAgICAgICAgICAgICAgZXh0ZW5kKHRoaXMsIHRpbGVKU09OKTtcbiAgICAgICAgICAgICAgICBpZiAodGlsZUpTT04uYm91bmRzKSB0aGlzLnRpbGVCb3VuZHMgPSBuZXcgVGlsZUJvdW5kcyh0aWxlSlNPTi5ib3VuZHMsIHRoaXMubWluem9vbSwgdGhpcy5tYXh6b29tKTtcblxuICAgICAgICAgICAgICAgIHBvc3RUdXJuc3RpbGVFdmVudCh0aWxlSlNPTi50aWxlcyk7XG4gICAgICAgICAgICAgICAgcG9zdE1hcExvYWRFdmVudCh0aWxlSlNPTi50aWxlcywgdGhpcy5tYXAuX2dldE1hcElkKCksIHRoaXMubWFwLl9yZXF1ZXN0TWFuYWdlci5fc2t1VG9rZW4pO1xuXG4gICAgICAgICAgICAgICAgLy8gYGNvbnRlbnRgIGlzIGluY2x1ZGVkIGhlcmUgdG8gcHJldmVudCBhIHJhY2UgY29uZGl0aW9uIHdoZXJlIGBTdHlsZSNfdXBkYXRlU291cmNlc2AgaXMgY2FsbGVkXG4gICAgICAgICAgICAgICAgLy8gYmVmb3JlIHRoZSBUaWxlSlNPTiBhcnJpdmVzLiB0aGlzIG1ha2VzIHN1cmUgdGhlIHRpbGVzIG5lZWRlZCBhcmUgbG9hZGVkIG9uY2UgVGlsZUpTT04gYXJyaXZlc1xuICAgICAgICAgICAgICAgIC8vIHJlZjogaHR0cHM6Ly9naXRodWIuY29tL21hcGJveC9tYXBib3gtZ2wtanMvcHVsbC80MzQ3I2Rpc2N1c3Npb25fcjEwNDQxODA4OFxuICAgICAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ2RhdGEnLCB7ZGF0YVR5cGU6ICdzb3VyY2UnLCBzb3VyY2VEYXRhVHlwZTogJ21ldGFkYXRhJ30pKTtcbiAgICAgICAgICAgICAgICB0aGlzLmZpcmUobmV3IEV2ZW50KCdkYXRhJywge2RhdGFUeXBlOiAnc291cmNlJywgc291cmNlRGF0YVR5cGU6ICdjb250ZW50J30pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgaGFzVGlsZSh0aWxlSUQ6IE92ZXJzY2FsZWRUaWxlSUQpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLnRpbGVCb3VuZHMgfHwgdGhpcy50aWxlQm91bmRzLmNvbnRhaW5zKHRpbGVJRC5jYW5vbmljYWwpO1xuICAgIH1cblxuICAgIG9uQWRkKG1hcDogTWFwKSB7XG4gICAgICAgIHRoaXMubWFwID0gbWFwO1xuICAgICAgICB0aGlzLmxvYWQoKTtcbiAgICB9XG5cbiAgICBvblJlbW92ZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3RpbGVKU09OUmVxdWVzdCkge1xuICAgICAgICAgICAgdGhpcy5fdGlsZUpTT05SZXF1ZXN0LmNhbmNlbCgpO1xuICAgICAgICAgICAgdGhpcy5fdGlsZUpTT05SZXF1ZXN0ID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNlcmlhbGl6ZSgpIHtcbiAgICAgICAgcmV0dXJuIGV4dGVuZCh7fSwgdGhpcy5fb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgbG9hZFRpbGUodGlsZTogVGlsZSwgY2FsbGJhY2s6IENhbGxiYWNrPHZvaWQ+KSB7XG4gICAgICAgIGNvbnN0IHVybCA9IHRoaXMubWFwLl9yZXF1ZXN0TWFuYWdlci5ub3JtYWxpemVUaWxlVVJMKHRpbGUudGlsZUlELmNhbm9uaWNhbC51cmwodGhpcy50aWxlcywgdGhpcy5zY2hlbWUpLCB0aGlzLnVybCwgbnVsbCk7XG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgICAgICAgIHJlcXVlc3Q6IHRoaXMubWFwLl9yZXF1ZXN0TWFuYWdlci50cmFuc2Zvcm1SZXF1ZXN0KHVybCwgUmVzb3VyY2VUeXBlLlRpbGUpLFxuICAgICAgICAgICAgdWlkOiB0aWxlLnVpZCxcbiAgICAgICAgICAgIHRpbGVJRDogdGlsZS50aWxlSUQsXG4gICAgICAgICAgICB6b29tOiB0aWxlLnRpbGVJRC5vdmVyc2NhbGVkWixcbiAgICAgICAgICAgIHRpbGVTaXplOiB0aGlzLnRpbGVTaXplICogdGlsZS50aWxlSUQub3ZlcnNjYWxlRmFjdG9yKCksXG4gICAgICAgICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICAgICAgICBzb3VyY2U6IHRoaXMuaWQsXG4gICAgICAgICAgICBwaXhlbFJhdGlvOiBicm93c2VyLmRldmljZVBpeGVsUmF0aW8sXG4gICAgICAgICAgICBzaG93Q29sbGlzaW9uQm94ZXM6IHRoaXMubWFwLnNob3dDb2xsaXNpb25Cb3hlcyxcbiAgICAgICAgfTtcbiAgICAgICAgcGFyYW1zLnJlcXVlc3QuY29sbGVjdFJlc291cmNlVGltaW5nID0gdGhpcy5fY29sbGVjdFJlc291cmNlVGltaW5nO1xuXG4gICAgICAgIGlmICh0aWxlLndvcmtlcklEID09PSB1bmRlZmluZWQgfHwgdGlsZS5zdGF0ZSA9PT0gJ2V4cGlyZWQnKSB7XG4gICAgICAgICAgICB0aWxlLndvcmtlcklEID0gdGhpcy5kaXNwYXRjaGVyLnNlbmQoJ2xvYWRUaWxlJywgcGFyYW1zLCBkb25lLmJpbmQodGhpcykpO1xuICAgICAgICB9IGVsc2UgaWYgKHRpbGUuc3RhdGUgPT09ICdsb2FkaW5nJykge1xuICAgICAgICAgICAgLy8gc2NoZWR1bGUgdGlsZSByZWxvYWRpbmcgYWZ0ZXIgaXQgaGFzIGJlZW4gbG9hZGVkXG4gICAgICAgICAgICB0aWxlLnJlbG9hZENhbGxiYWNrID0gY2FsbGJhY2s7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmRpc3BhdGNoZXIuc2VuZCgncmVsb2FkVGlsZScsIHBhcmFtcywgZG9uZS5iaW5kKHRoaXMpLCB0aWxlLndvcmtlcklEKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIGRvbmUoZXJyLCBkYXRhKSB7XG4gICAgICAgICAgICBpZiAodGlsZS5hYm9ydGVkKVxuICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhudWxsKTtcblxuICAgICAgICAgICAgaWYgKGVyciAmJiBlcnIuc3RhdHVzICE9PSA0MDQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGRhdGEgJiYgZGF0YS5yZXNvdXJjZVRpbWluZylcbiAgICAgICAgICAgICAgICB0aWxlLnJlc291cmNlVGltaW5nID0gZGF0YS5yZXNvdXJjZVRpbWluZztcblxuICAgICAgICAgICAgaWYgKHRoaXMubWFwLl9yZWZyZXNoRXhwaXJlZFRpbGVzICYmIGRhdGEpIHRpbGUuc2V0RXhwaXJ5RGF0YShkYXRhKTtcbiAgICAgICAgICAgIHRpbGUubG9hZFZlY3RvckRhdGEoZGF0YSwgdGhpcy5tYXAucGFpbnRlcik7XG5cbiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwpO1xuXG4gICAgICAgICAgICBpZiAodGlsZS5yZWxvYWRDYWxsYmFjaykge1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZFRpbGUodGlsZSwgdGlsZS5yZWxvYWRDYWxsYmFjayk7XG4gICAgICAgICAgICAgICAgdGlsZS5yZWxvYWRDYWxsYmFjayA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhYm9ydFRpbGUodGlsZTogVGlsZSkge1xuICAgICAgICB0aGlzLmRpc3BhdGNoZXIuc2VuZCgnYWJvcnRUaWxlJywgeyB1aWQ6IHRpbGUudWlkLCB0eXBlOiB0aGlzLnR5cGUsIHNvdXJjZTogdGhpcy5pZCB9LCB1bmRlZmluZWQsIHRpbGUud29ya2VySUQpO1xuICAgIH1cblxuICAgIHVubG9hZFRpbGUodGlsZTogVGlsZSkge1xuICAgICAgICB0aWxlLnVubG9hZFZlY3RvckRhdGEoKTtcbiAgICAgICAgdGhpcy5kaXNwYXRjaGVyLnNlbmQoJ3JlbW92ZVRpbGUnLCB7IHVpZDogdGlsZS51aWQsIHR5cGU6IHRoaXMudHlwZSwgc291cmNlOiB0aGlzLmlkIH0sIHVuZGVmaW5lZCwgdGlsZS53b3JrZXJJRCk7XG4gICAgfVxuXG4gICAgaGFzVHJhbnNpdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgVmVjdG9yVGlsZVNvdXJjZTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7IGV4dGVuZCwgcGljayB9IGZyb20gJy4uL3V0aWwvdXRpbCc7XG5cbmltcG9ydCB7IGdldEltYWdlLCBSZXNvdXJjZVR5cGUgfSBmcm9tICcuLi91dGlsL2FqYXgnO1xuaW1wb3J0IHsgRXZlbnQsIEVycm9yRXZlbnQsIEV2ZW50ZWQgfSBmcm9tICcuLi91dGlsL2V2ZW50ZWQnO1xuaW1wb3J0IGxvYWRUaWxlSlNPTiBmcm9tICcuL2xvYWRfdGlsZWpzb24nO1xuaW1wb3J0IHsgcG9zdFR1cm5zdGlsZUV2ZW50LCBwb3N0TWFwTG9hZEV2ZW50IH0gZnJvbSAnLi4vdXRpbC9tYXBib3gnO1xuaW1wb3J0IFRpbGVCb3VuZHMgZnJvbSAnLi90aWxlX2JvdW5kcyc7XG5pbXBvcnQgVGV4dHVyZSBmcm9tICcuLi9yZW5kZXIvdGV4dHVyZSc7XG5cbmltcG9ydCB0eXBlIHtTb3VyY2V9IGZyb20gJy4vc291cmNlJztcbmltcG9ydCB0eXBlIHtPdmVyc2NhbGVkVGlsZUlEfSBmcm9tICcuL3RpbGVfaWQnO1xuaW1wb3J0IHR5cGUgTWFwIGZyb20gJy4uL3VpL21hcCc7XG5pbXBvcnQgdHlwZSBEaXNwYXRjaGVyIGZyb20gJy4uL3V0aWwvZGlzcGF0Y2hlcic7XG5pbXBvcnQgdHlwZSBUaWxlIGZyb20gJy4vdGlsZSc7XG5pbXBvcnQgdHlwZSB7Q2FsbGJhY2t9IGZyb20gJy4uL3R5cGVzL2NhbGxiYWNrJztcbmltcG9ydCB0eXBlIHtDYW5jZWxhYmxlfSBmcm9tICcuLi90eXBlcy9jYW5jZWxhYmxlJztcbmltcG9ydCB0eXBlIHtcbiAgICBSYXN0ZXJTb3VyY2VTcGVjaWZpY2F0aW9uLFxuICAgIFJhc3RlckRFTVNvdXJjZVNwZWNpZmljYXRpb25cbn0gZnJvbSAnLi4vc3R5bGUtc3BlYy90eXBlcyc7XG5cbmNsYXNzIFJhc3RlclRpbGVTb3VyY2UgZXh0ZW5kcyBFdmVudGVkIGltcGxlbWVudHMgU291cmNlIHtcbiAgICB0eXBlOiAncmFzdGVyJyB8ICdyYXN0ZXItZGVtJztcbiAgICBpZDogc3RyaW5nO1xuICAgIG1pbnpvb206IG51bWJlcjtcbiAgICBtYXh6b29tOiBudW1iZXI7XG4gICAgdXJsOiBzdHJpbmc7XG4gICAgc2NoZW1lOiBzdHJpbmc7XG4gICAgdGlsZVNpemU6IG51bWJlcjtcblxuICAgIGJvdW5kczogP1tudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdO1xuICAgIHRpbGVCb3VuZHM6IFRpbGVCb3VuZHM7XG4gICAgcm91bmRab29tOiBib29sZWFuO1xuICAgIGRpc3BhdGNoZXI6IERpc3BhdGNoZXI7XG4gICAgbWFwOiBNYXA7XG4gICAgdGlsZXM6IEFycmF5PHN0cmluZz47XG5cbiAgICBfbG9hZGVkOiBib29sZWFuO1xuICAgIF9vcHRpb25zOiBSYXN0ZXJTb3VyY2VTcGVjaWZpY2F0aW9uIHwgUmFzdGVyREVNU291cmNlU3BlY2lmaWNhdGlvbjtcbiAgICBfdGlsZUpTT05SZXF1ZXN0OiA/Q2FuY2VsYWJsZTtcblxuICAgIGNvbnN0cnVjdG9yKGlkOiBzdHJpbmcsIG9wdGlvbnM6IFJhc3RlclNvdXJjZVNwZWNpZmljYXRpb24gfCBSYXN0ZXJERU1Tb3VyY2VTcGVjaWZpY2F0aW9uLCBkaXNwYXRjaGVyOiBEaXNwYXRjaGVyLCBldmVudGVkUGFyZW50OiBFdmVudGVkKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuaWQgPSBpZDtcbiAgICAgICAgdGhpcy5kaXNwYXRjaGVyID0gZGlzcGF0Y2hlcjtcbiAgICAgICAgdGhpcy5zZXRFdmVudGVkUGFyZW50KGV2ZW50ZWRQYXJlbnQpO1xuXG4gICAgICAgIHRoaXMudHlwZSA9ICdyYXN0ZXInO1xuICAgICAgICB0aGlzLm1pbnpvb20gPSAwO1xuICAgICAgICB0aGlzLm1heHpvb20gPSAyMjtcbiAgICAgICAgdGhpcy5yb3VuZFpvb20gPSB0cnVlO1xuICAgICAgICB0aGlzLnNjaGVtZSA9ICd4eXonO1xuICAgICAgICB0aGlzLnRpbGVTaXplID0gNTEyO1xuICAgICAgICB0aGlzLl9sb2FkZWQgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLl9vcHRpb25zID0gZXh0ZW5kKHt9LCBvcHRpb25zKTtcbiAgICAgICAgZXh0ZW5kKHRoaXMsIHBpY2sob3B0aW9ucywgWyd1cmwnLCAnc2NoZW1lJywgJ3RpbGVTaXplJ10pKTtcbiAgICB9XG5cbiAgICBsb2FkKCkge1xuICAgICAgICB0aGlzLmZpcmUobmV3IEV2ZW50KCdkYXRhbG9hZGluZycsIHtkYXRhVHlwZTogJ3NvdXJjZSd9KSk7XG4gICAgICAgIHRoaXMuX3RpbGVKU09OUmVxdWVzdCA9IGxvYWRUaWxlSlNPTih0aGlzLl9vcHRpb25zLCB0aGlzLm1hcC5fcmVxdWVzdE1hbmFnZXIsIChlcnIsIHRpbGVKU09OKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl90aWxlSlNPTlJlcXVlc3QgPSBudWxsO1xuICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXJyb3JFdmVudChlcnIpKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGlsZUpTT04pIHtcbiAgICAgICAgICAgICAgICBleHRlbmQodGhpcywgdGlsZUpTT04pO1xuICAgICAgICAgICAgICAgIGlmICh0aWxlSlNPTi5ib3VuZHMpIHRoaXMudGlsZUJvdW5kcyA9IG5ldyBUaWxlQm91bmRzKHRpbGVKU09OLmJvdW5kcywgdGhpcy5taW56b29tLCB0aGlzLm1heHpvb20pO1xuXG4gICAgICAgICAgICAgICAgcG9zdFR1cm5zdGlsZUV2ZW50KHRpbGVKU09OLnRpbGVzKTtcbiAgICAgICAgICAgICAgICBwb3N0TWFwTG9hZEV2ZW50KHRpbGVKU09OLnRpbGVzLCB0aGlzLm1hcC5fZ2V0TWFwSWQoKSwgdGhpcy5tYXAuX3JlcXVlc3RNYW5hZ2VyLl9za3VUb2tlbik7XG5cbiAgICAgICAgICAgICAgICAvLyBgY29udGVudGAgaXMgaW5jbHVkZWQgaGVyZSB0byBwcmV2ZW50IGEgcmFjZSBjb25kaXRpb24gd2hlcmUgYFN0eWxlI191cGRhdGVTb3VyY2VzYCBpcyBjYWxsZWRcbiAgICAgICAgICAgICAgICAvLyBiZWZvcmUgdGhlIFRpbGVKU09OIGFycml2ZXMuIHRoaXMgbWFrZXMgc3VyZSB0aGUgdGlsZXMgbmVlZGVkIGFyZSBsb2FkZWQgb25jZSBUaWxlSlNPTiBhcnJpdmVzXG4gICAgICAgICAgICAgICAgLy8gcmVmOiBodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L21hcGJveC1nbC1qcy9wdWxsLzQzNDcjZGlzY3Vzc2lvbl9yMTA0NDE4MDg4XG4gICAgICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgnZGF0YScsIHtkYXRhVHlwZTogJ3NvdXJjZScsIHNvdXJjZURhdGFUeXBlOiAnbWV0YWRhdGEnfSkpO1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ2RhdGEnLCB7ZGF0YVR5cGU6ICdzb3VyY2UnLCBzb3VyY2VEYXRhVHlwZTogJ2NvbnRlbnQnfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBvbkFkZChtYXA6IE1hcCkge1xuICAgICAgICB0aGlzLm1hcCA9IG1hcDtcbiAgICAgICAgdGhpcy5sb2FkKCk7XG4gICAgfVxuXG4gICAgb25SZW1vdmUoKSB7XG4gICAgICAgIGlmICh0aGlzLl90aWxlSlNPTlJlcXVlc3QpIHtcbiAgICAgICAgICAgIHRoaXMuX3RpbGVKU09OUmVxdWVzdC5jYW5jZWwoKTtcbiAgICAgICAgICAgIHRoaXMuX3RpbGVKU09OUmVxdWVzdCA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXJpYWxpemUoKSB7XG4gICAgICAgIHJldHVybiBleHRlbmQoe30sIHRoaXMuX29wdGlvbnMpO1xuICAgIH1cblxuICAgIGhhc1RpbGUodGlsZUlEOiBPdmVyc2NhbGVkVGlsZUlEKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy50aWxlQm91bmRzIHx8IHRoaXMudGlsZUJvdW5kcy5jb250YWlucyh0aWxlSUQuY2Fub25pY2FsKTtcbiAgICB9XG5cbiAgICBsb2FkVGlsZSh0aWxlOiBUaWxlLCBjYWxsYmFjazogQ2FsbGJhY2s8dm9pZD4pIHtcbiAgICAgICAgY29uc3QgdXJsID0gdGhpcy5tYXAuX3JlcXVlc3RNYW5hZ2VyLm5vcm1hbGl6ZVRpbGVVUkwodGlsZS50aWxlSUQuY2Fub25pY2FsLnVybCh0aGlzLnRpbGVzLCB0aGlzLnNjaGVtZSksIHRoaXMudXJsLCB0aGlzLnRpbGVTaXplKTtcbiAgICAgICAgdGlsZS5yZXF1ZXN0ID0gZ2V0SW1hZ2UodGhpcy5tYXAuX3JlcXVlc3RNYW5hZ2VyLnRyYW5zZm9ybVJlcXVlc3QodXJsLCBSZXNvdXJjZVR5cGUuVGlsZSksIChlcnIsIGltZykgPT4ge1xuICAgICAgICAgICAgZGVsZXRlIHRpbGUucmVxdWVzdDtcblxuICAgICAgICAgICAgaWYgKHRpbGUuYWJvcnRlZCkge1xuICAgICAgICAgICAgICAgIHRpbGUuc3RhdGUgPSAndW5sb2FkZWQnO1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICB0aWxlLnN0YXRlID0gJ2Vycm9yZWQnO1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGltZykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm1hcC5fcmVmcmVzaEV4cGlyZWRUaWxlcykgdGlsZS5zZXRFeHBpcnlEYXRhKGltZyk7XG4gICAgICAgICAgICAgICAgZGVsZXRlIChpbWc6IGFueSkuY2FjaGVDb250cm9sO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSAoaW1nOiBhbnkpLmV4cGlyZXM7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5tYXAucGFpbnRlci5jb250ZXh0O1xuICAgICAgICAgICAgICAgIGNvbnN0IGdsID0gY29udGV4dC5nbDtcbiAgICAgICAgICAgICAgICB0aWxlLnRleHR1cmUgPSB0aGlzLm1hcC5wYWludGVyLmdldFRpbGVUZXh0dXJlKGltZy53aWR0aCk7XG4gICAgICAgICAgICAgICAgaWYgKHRpbGUudGV4dHVyZSkge1xuICAgICAgICAgICAgICAgICAgICB0aWxlLnRleHR1cmUudXBkYXRlKGltZywgeyB1c2VNaXBtYXA6IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGlsZS50ZXh0dXJlID0gbmV3IFRleHR1cmUoY29udGV4dCwgaW1nLCBnbC5SR0JBLCB7IHVzZU1pcG1hcDogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgdGlsZS50ZXh0dXJlLmJpbmQoZ2wuTElORUFSLCBnbC5DTEFNUF9UT19FREdFLCBnbC5MSU5FQVJfTUlQTUFQX05FQVJFU1QpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChjb250ZXh0LmV4dFRleHR1cmVGaWx0ZXJBbmlzb3Ryb3BpYykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyZihnbC5URVhUVVJFXzJELCBjb250ZXh0LmV4dFRleHR1cmVGaWx0ZXJBbmlzb3Ryb3BpYy5URVhUVVJFX01BWF9BTklTT1RST1BZX0VYVCwgY29udGV4dC5leHRUZXh0dXJlRmlsdGVyQW5pc290cm9waWNNYXgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGlsZS5zdGF0ZSA9ICdsb2FkZWQnO1xuXG4gICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGFib3J0VGlsZSh0aWxlOiBUaWxlLCBjYWxsYmFjazogQ2FsbGJhY2s8dm9pZD4pIHtcbiAgICAgICAgaWYgKHRpbGUucmVxdWVzdCkge1xuICAgICAgICAgICAgdGlsZS5yZXF1ZXN0LmNhbmNlbCgpO1xuICAgICAgICAgICAgZGVsZXRlIHRpbGUucmVxdWVzdDtcbiAgICAgICAgfVxuICAgICAgICBjYWxsYmFjaygpO1xuICAgIH1cblxuICAgIHVubG9hZFRpbGUodGlsZTogVGlsZSwgY2FsbGJhY2s6IENhbGxiYWNrPHZvaWQ+KSB7XG4gICAgICAgIGlmICh0aWxlLnRleHR1cmUpIHRoaXMubWFwLnBhaW50ZXIuc2F2ZVRpbGVUZXh0dXJlKHRpbGUudGV4dHVyZSk7XG4gICAgICAgIGNhbGxiYWNrKCk7XG4gICAgfVxuXG4gICAgaGFzVHJhbnNpdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgUmFzdGVyVGlsZVNvdXJjZTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7IGdldEltYWdlLCBSZXNvdXJjZVR5cGUgfSBmcm9tICcuLi91dGlsL2FqYXgnO1xuaW1wb3J0IHsgZXh0ZW5kIH0gZnJvbSAnLi4vdXRpbC91dGlsJztcbmltcG9ydCB7IEV2ZW50ZWQgfSBmcm9tICcuLi91dGlsL2V2ZW50ZWQnO1xuaW1wb3J0IGJyb3dzZXIgZnJvbSAnLi4vdXRpbC9icm93c2VyJztcbmltcG9ydCB7IE92ZXJzY2FsZWRUaWxlSUQgfSBmcm9tICcuL3RpbGVfaWQnO1xuaW1wb3J0IFJhc3RlclRpbGVTb3VyY2UgZnJvbSAnLi9yYXN0ZXJfdGlsZV9zb3VyY2UnO1xuLy8gZW5zdXJlIERFTURhdGEgaXMgcmVnaXN0ZXJlZCBmb3Igd29ya2VyIHRyYW5zZmVyIG9uIG1haW4gdGhyZWFkOlxuaW1wb3J0ICcuLi9kYXRhL2RlbV9kYXRhJztcblxuaW1wb3J0IHR5cGUge1NvdXJjZX0gZnJvbSAnLi9zb3VyY2UnO1xuaW1wb3J0IHR5cGUgRGlzcGF0Y2hlciBmcm9tICcuLi91dGlsL2Rpc3BhdGNoZXInO1xuaW1wb3J0IHR5cGUgVGlsZSBmcm9tICcuL3RpbGUnO1xuaW1wb3J0IHR5cGUge0NhbGxiYWNrfSBmcm9tICcuLi90eXBlcy9jYWxsYmFjayc7XG5pbXBvcnQgdHlwZSB7UmFzdGVyREVNU291cmNlU3BlY2lmaWNhdGlvbn0gZnJvbSAnLi4vc3R5bGUtc3BlYy90eXBlcyc7XG5cblxuY2xhc3MgUmFzdGVyREVNVGlsZVNvdXJjZSBleHRlbmRzIFJhc3RlclRpbGVTb3VyY2UgaW1wbGVtZW50cyBTb3VyY2Uge1xuICAgIGVuY29kaW5nOiBcIm1hcGJveFwiIHwgXCJ0ZXJyYXJpdW1cIjtcblxuICAgIGNvbnN0cnVjdG9yKGlkOiBzdHJpbmcsIG9wdGlvbnM6IFJhc3RlckRFTVNvdXJjZVNwZWNpZmljYXRpb24sIGRpc3BhdGNoZXI6IERpc3BhdGNoZXIsIGV2ZW50ZWRQYXJlbnQ6IEV2ZW50ZWQpIHtcbiAgICAgICAgc3VwZXIoaWQsIG9wdGlvbnMsIGRpc3BhdGNoZXIsIGV2ZW50ZWRQYXJlbnQpO1xuICAgICAgICB0aGlzLnR5cGUgPSAncmFzdGVyLWRlbSc7XG4gICAgICAgIHRoaXMubWF4em9vbSA9IDIyO1xuICAgICAgICB0aGlzLl9vcHRpb25zID0gZXh0ZW5kKHt9LCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy5lbmNvZGluZyA9IG9wdGlvbnMuZW5jb2RpbmcgfHwgXCJtYXBib3hcIjtcbiAgICB9XG5cbiAgICBzZXJpYWxpemUoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiAncmFzdGVyLWRlbScsXG4gICAgICAgICAgICB1cmw6IHRoaXMudXJsLFxuICAgICAgICAgICAgdGlsZVNpemU6IHRoaXMudGlsZVNpemUsXG4gICAgICAgICAgICB0aWxlczogdGhpcy50aWxlcyxcbiAgICAgICAgICAgIGJvdW5kczogdGhpcy5ib3VuZHMsXG4gICAgICAgICAgICBlbmNvZGluZzogdGhpcy5lbmNvZGluZ1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGxvYWRUaWxlKHRpbGU6IFRpbGUsIGNhbGxiYWNrOiBDYWxsYmFjazx2b2lkPikge1xuICAgICAgICBjb25zdCB1cmwgPSB0aGlzLm1hcC5fcmVxdWVzdE1hbmFnZXIubm9ybWFsaXplVGlsZVVSTCh0aWxlLnRpbGVJRC5jYW5vbmljYWwudXJsKHRoaXMudGlsZXMsIHRoaXMuc2NoZW1lKSwgdGhpcy51cmwsIHRoaXMudGlsZVNpemUpO1xuICAgICAgICB0aWxlLnJlcXVlc3QgPSBnZXRJbWFnZSh0aGlzLm1hcC5fcmVxdWVzdE1hbmFnZXIudHJhbnNmb3JtUmVxdWVzdCh1cmwsIFJlc291cmNlVHlwZS5UaWxlKSwgaW1hZ2VMb2FkZWQuYmluZCh0aGlzKSk7XG5cbiAgICAgICAgdGlsZS5uZWlnaGJvcmluZ1RpbGVzID0gdGhpcy5fZ2V0TmVpZ2hib3JpbmdUaWxlcyh0aWxlLnRpbGVJRCk7XG4gICAgICAgIGZ1bmN0aW9uIGltYWdlTG9hZGVkKGVyciwgaW1nKSB7XG4gICAgICAgICAgICBkZWxldGUgdGlsZS5yZXF1ZXN0O1xuICAgICAgICAgICAgaWYgKHRpbGUuYWJvcnRlZCkge1xuICAgICAgICAgICAgICAgIHRpbGUuc3RhdGUgPSAndW5sb2FkZWQnO1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICB0aWxlLnN0YXRlID0gJ2Vycm9yZWQnO1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGltZykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm1hcC5fcmVmcmVzaEV4cGlyZWRUaWxlcykgdGlsZS5zZXRFeHBpcnlEYXRhKGltZyk7XG4gICAgICAgICAgICAgICAgZGVsZXRlIChpbWc6IGFueSkuY2FjaGVDb250cm9sO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSAoaW1nOiBhbnkpLmV4cGlyZXM7XG5cbiAgICAgICAgICAgICAgICBjb25zdCByYXdJbWFnZURhdGEgPSBicm93c2VyLmdldEltYWdlRGF0YShpbWcpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgICAgICAgICAgICAgICAgdWlkOiB0aWxlLnVpZCxcbiAgICAgICAgICAgICAgICAgICAgY29vcmQ6IHRpbGUudGlsZUlELFxuICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IHRoaXMuaWQsXG4gICAgICAgICAgICAgICAgICAgIHJhd0ltYWdlRGF0YSxcbiAgICAgICAgICAgICAgICAgICAgZW5jb2Rpbmc6IHRoaXMuZW5jb2RpbmdcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgaWYgKCF0aWxlLndvcmtlcklEIHx8IHRpbGUuc3RhdGUgPT09ICdleHBpcmVkJykge1xuICAgICAgICAgICAgICAgICAgICB0aWxlLndvcmtlcklEID0gdGhpcy5kaXNwYXRjaGVyLnNlbmQoJ2xvYWRERU1UaWxlJywgcGFyYW1zLCBkb25lLmJpbmQodGhpcykpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIGRvbmUoZXJyLCBkZW0pIHtcbiAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICB0aWxlLnN0YXRlID0gJ2Vycm9yZWQnO1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChkZW0pIHtcbiAgICAgICAgICAgICAgICB0aWxlLmRlbSA9IGRlbTtcbiAgICAgICAgICAgICAgICB0aWxlLm5lZWRzSGlsbHNoYWRlUHJlcGFyZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGlsZS5zdGF0ZSA9ICdsb2FkZWQnO1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG5cbiAgICBfZ2V0TmVpZ2hib3JpbmdUaWxlcyh0aWxlSUQ6IE92ZXJzY2FsZWRUaWxlSUQpIHtcbiAgICAgICAgY29uc3QgY2Fub25pY2FsID0gdGlsZUlELmNhbm9uaWNhbDtcbiAgICAgICAgY29uc3QgZGltID0gTWF0aC5wb3coMiwgY2Fub25pY2FsLnopO1xuXG4gICAgICAgIGNvbnN0IHB4ID0gKGNhbm9uaWNhbC54IC0gMSArIGRpbSkgJSBkaW07XG4gICAgICAgIGNvbnN0IHB4dyA9IGNhbm9uaWNhbC54ID09PSAwID8gdGlsZUlELndyYXAgLSAxIDogdGlsZUlELndyYXA7XG4gICAgICAgIGNvbnN0IG54ID0gKGNhbm9uaWNhbC54ICsgMSArIGRpbSkgJSBkaW07XG4gICAgICAgIGNvbnN0IG54dyA9IGNhbm9uaWNhbC54ICsgMSA9PT0gZGltID8gdGlsZUlELndyYXAgKyAxIDogdGlsZUlELndyYXA7XG5cbiAgICAgICAgY29uc3QgbmVpZ2hib3JpbmdUaWxlcyA9IHt9O1xuICAgICAgICAvLyBhZGQgYWRqYWNlbnQgdGlsZXNcbiAgICAgICAgbmVpZ2hib3JpbmdUaWxlc1tuZXcgT3ZlcnNjYWxlZFRpbGVJRCh0aWxlSUQub3ZlcnNjYWxlZFosIHB4dywgY2Fub25pY2FsLnosIHB4LCBjYW5vbmljYWwueSkua2V5XSA9IHtiYWNrZmlsbGVkOiBmYWxzZX07XG4gICAgICAgIG5laWdoYm9yaW5nVGlsZXNbbmV3IE92ZXJzY2FsZWRUaWxlSUQodGlsZUlELm92ZXJzY2FsZWRaLCBueHcsIGNhbm9uaWNhbC56LCBueCwgY2Fub25pY2FsLnkpLmtleV0gPSB7YmFja2ZpbGxlZDogZmFsc2V9O1xuXG4gICAgICAgIC8vIEFkZCB1cHBlciBuZWlnaGJvcmluZ1RpbGVzXG4gICAgICAgIGlmIChjYW5vbmljYWwueSA+IDApIHtcbiAgICAgICAgICAgIG5laWdoYm9yaW5nVGlsZXNbbmV3IE92ZXJzY2FsZWRUaWxlSUQodGlsZUlELm92ZXJzY2FsZWRaLCBweHcsIGNhbm9uaWNhbC56LCBweCwgY2Fub25pY2FsLnkgLSAxKS5rZXldID0ge2JhY2tmaWxsZWQ6IGZhbHNlfTtcbiAgICAgICAgICAgIG5laWdoYm9yaW5nVGlsZXNbbmV3IE92ZXJzY2FsZWRUaWxlSUQodGlsZUlELm92ZXJzY2FsZWRaLCB0aWxlSUQud3JhcCwgY2Fub25pY2FsLnosIGNhbm9uaWNhbC54LCBjYW5vbmljYWwueSAtIDEpLmtleV0gPSB7YmFja2ZpbGxlZDogZmFsc2V9O1xuICAgICAgICAgICAgbmVpZ2hib3JpbmdUaWxlc1tuZXcgT3ZlcnNjYWxlZFRpbGVJRCh0aWxlSUQub3ZlcnNjYWxlZFosIG54dywgY2Fub25pY2FsLnosIG54LCBjYW5vbmljYWwueSAtIDEpLmtleV0gPSB7YmFja2ZpbGxlZDogZmFsc2V9O1xuICAgICAgICB9XG4gICAgICAgIC8vIEFkZCBsb3dlciBuZWlnaGJvcmluZ1RpbGVzXG4gICAgICAgIGlmIChjYW5vbmljYWwueSArIDEgPCBkaW0pIHtcbiAgICAgICAgICAgIG5laWdoYm9yaW5nVGlsZXNbbmV3IE92ZXJzY2FsZWRUaWxlSUQodGlsZUlELm92ZXJzY2FsZWRaLCBweHcsIGNhbm9uaWNhbC56LCBweCwgY2Fub25pY2FsLnkgKyAxKS5rZXldID0ge2JhY2tmaWxsZWQ6IGZhbHNlfTtcbiAgICAgICAgICAgIG5laWdoYm9yaW5nVGlsZXNbbmV3IE92ZXJzY2FsZWRUaWxlSUQodGlsZUlELm92ZXJzY2FsZWRaLCB0aWxlSUQud3JhcCwgY2Fub25pY2FsLnosIGNhbm9uaWNhbC54LCBjYW5vbmljYWwueSArIDEpLmtleV0gPSB7YmFja2ZpbGxlZDogZmFsc2V9O1xuICAgICAgICAgICAgbmVpZ2hib3JpbmdUaWxlc1tuZXcgT3ZlcnNjYWxlZFRpbGVJRCh0aWxlSUQub3ZlcnNjYWxlZFosIG54dywgY2Fub25pY2FsLnosIG54LCBjYW5vbmljYWwueSArIDEpLmtleV0gPSB7YmFja2ZpbGxlZDogZmFsc2V9O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5laWdoYm9yaW5nVGlsZXM7XG4gICAgfVxuXG5cbiAgICB1bmxvYWRUaWxlKHRpbGU6IFRpbGUpIHtcbiAgICAgICAgaWYgKHRpbGUuZGVtVGV4dHVyZSkgdGhpcy5tYXAucGFpbnRlci5zYXZlVGlsZVRleHR1cmUodGlsZS5kZW1UZXh0dXJlKTtcbiAgICAgICAgaWYgKHRpbGUuZmJvKSB7XG4gICAgICAgICAgICB0aWxlLmZiby5kZXN0cm95KCk7XG4gICAgICAgICAgICBkZWxldGUgdGlsZS5mYm87XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRpbGUuZGVtKSBkZWxldGUgdGlsZS5kZW07XG4gICAgICAgIGRlbGV0ZSB0aWxlLm5laWdoYm9yaW5nVGlsZXM7XG5cbiAgICAgICAgdGlsZS5zdGF0ZSA9ICd1bmxvYWRlZCc7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hlci5zZW5kKCdyZW1vdmVERU1UaWxlJywgeyB1aWQ6IHRpbGUudWlkLCBzb3VyY2U6IHRoaXMuaWQgfSwgdW5kZWZpbmVkLCB0aWxlLndvcmtlcklEKTtcbiAgICB9XG5cbn1cblxuZXhwb3J0IGRlZmF1bHQgUmFzdGVyREVNVGlsZVNvdXJjZTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7IEV2ZW50LCBFcnJvckV2ZW50LCBFdmVudGVkIH0gZnJvbSAnLi4vdXRpbC9ldmVudGVkJztcblxuaW1wb3J0IHsgZXh0ZW5kIH0gZnJvbSAnLi4vdXRpbC91dGlsJztcbmltcG9ydCBFWFRFTlQgZnJvbSAnLi4vZGF0YS9leHRlbnQnO1xuaW1wb3J0IHsgUmVzb3VyY2VUeXBlIH0gZnJvbSAnLi4vdXRpbC9hamF4JztcbmltcG9ydCBicm93c2VyIGZyb20gJy4uL3V0aWwvYnJvd3Nlcic7XG5cbmltcG9ydCB0eXBlIHtTb3VyY2V9IGZyb20gJy4vc291cmNlJztcbmltcG9ydCB0eXBlIE1hcCBmcm9tICcuLi91aS9tYXAnO1xuaW1wb3J0IHR5cGUgRGlzcGF0Y2hlciBmcm9tICcuLi91dGlsL2Rpc3BhdGNoZXInO1xuaW1wb3J0IHR5cGUgVGlsZSBmcm9tICcuL3RpbGUnO1xuaW1wb3J0IHR5cGUge0NhbGxiYWNrfSBmcm9tICcuLi90eXBlcy9jYWxsYmFjayc7XG5pbXBvcnQgdHlwZSB7UGVyZm9ybWFuY2VSZXNvdXJjZVRpbWluZ30gZnJvbSAnLi4vdHlwZXMvcGVyZm9ybWFuY2VfcmVzb3VyY2VfdGltaW5nJztcbmltcG9ydCB0eXBlIHtHZW9KU09OLCBHZW9KU09ORmVhdHVyZX0gZnJvbSAnQG1hcGJveC9nZW9qc29uLXR5cGVzJztcbmltcG9ydCB0eXBlIHtHZW9KU09OU291cmNlU3BlY2lmaWNhdGlvbn0gZnJvbSAnLi4vc3R5bGUtc3BlYy90eXBlcyc7XG5cbi8qKlxuICogQSBzb3VyY2UgY29udGFpbmluZyBHZW9KU09OLlxuICogKFNlZSB0aGUgW1N0eWxlIFNwZWNpZmljYXRpb25dKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLXN0eWxlLXNwZWMvI3NvdXJjZXMtZ2VvanNvbikgZm9yIGRldGFpbGVkIGRvY3VtZW50YXRpb24gb2Ygb3B0aW9ucy4pXG4gKlxuICogQGV4YW1wbGVcbiAqIG1hcC5hZGRTb3VyY2UoJ3NvbWUgaWQnLCB7XG4gKiAgICAgdHlwZTogJ2dlb2pzb24nLFxuICogICAgIGRhdGE6ICdodHRwczovL2QyYWQ2YjR1cjd5dnBxLmNsb3VkZnJvbnQubmV0L25hdHVyYWxlYXJ0aC0zLjMuMC9uZV8xMG1fcG9ydHMuZ2VvanNvbidcbiAqIH0pO1xuICpcbiAqIEBleGFtcGxlXG4gKiBtYXAuYWRkU291cmNlKCdzb21lIGlkJywge1xuICogICAgdHlwZTogJ2dlb2pzb24nLFxuICogICAgZGF0YToge1xuICogICAgICAgIFwidHlwZVwiOiBcIkZlYXR1cmVDb2xsZWN0aW9uXCIsXG4gKiAgICAgICAgXCJmZWF0dXJlc1wiOiBbe1xuICogICAgICAgICAgICBcInR5cGVcIjogXCJGZWF0dXJlXCIsXG4gKiAgICAgICAgICAgIFwicHJvcGVydGllc1wiOiB7fSxcbiAqICAgICAgICAgICAgXCJnZW9tZXRyeVwiOiB7XG4gKiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJQb2ludFwiLFxuICogICAgICAgICAgICAgICAgXCJjb29yZGluYXRlc1wiOiBbXG4gKiAgICAgICAgICAgICAgICAgICAgLTc2LjUzMDYzMjk3MjcxNzI5LFxuICogICAgICAgICAgICAgICAgICAgIDM5LjE4MTc0MDc3OTk0MTA4XG4gKiAgICAgICAgICAgICAgICBdXG4gKiAgICAgICAgICAgIH1cbiAqICAgICAgICB9XVxuICogICAgfVxuICogfSk7XG4gKlxuICogQGV4YW1wbGVcbiAqIG1hcC5nZXRTb3VyY2UoJ3NvbWUgaWQnKS5zZXREYXRhKHtcbiAqICAgXCJ0eXBlXCI6IFwiRmVhdHVyZUNvbGxlY3Rpb25cIixcbiAqICAgXCJmZWF0dXJlc1wiOiBbe1xuICogICAgICAgXCJ0eXBlXCI6IFwiRmVhdHVyZVwiLFxuICogICAgICAgXCJwcm9wZXJ0aWVzXCI6IHsgXCJuYW1lXCI6IFwiTnVsbCBJc2xhbmRcIiB9LFxuICogICAgICAgXCJnZW9tZXRyeVwiOiB7XG4gKiAgICAgICAgICAgXCJ0eXBlXCI6IFwiUG9pbnRcIixcbiAqICAgICAgICAgICBcImNvb3JkaW5hdGVzXCI6IFsgMCwgMCBdXG4gKiAgICAgICB9XG4gKiAgIH1dXG4gKiB9KTtcbiAqIEBzZWUgW0RyYXcgR2VvSlNPTiBwb2ludHNdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvZ2VvanNvbi1tYXJrZXJzLylcbiAqIEBzZWUgW0FkZCBhIEdlb0pTT04gbGluZV0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9nZW9qc29uLWxpbmUvKVxuICogQHNlZSBbQ3JlYXRlIGEgaGVhdG1hcCBmcm9tIHBvaW50c10oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9oZWF0bWFwLylcbiAqIEBzZWUgW0NyZWF0ZSBhbmQgc3R5bGUgY2x1c3RlcnNdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvY2x1c3Rlci8pXG4gKi9cbmNsYXNzIEdlb0pTT05Tb3VyY2UgZXh0ZW5kcyBFdmVudGVkIGltcGxlbWVudHMgU291cmNlIHtcbiAgICB0eXBlOiAnZ2VvanNvbic7XG4gICAgaWQ6IHN0cmluZztcbiAgICBtaW56b29tOiBudW1iZXI7XG4gICAgbWF4em9vbTogbnVtYmVyO1xuICAgIHRpbGVTaXplOiBudW1iZXI7XG4gICAgYXR0cmlidXRpb246IHN0cmluZztcblxuICAgIGlzVGlsZUNsaXBwZWQ6IGJvb2xlYW47XG4gICAgcmVwYXJzZU92ZXJzY2FsZWQ6IGJvb2xlYW47XG4gICAgX2RhdGE6IEdlb0pTT04gfCBzdHJpbmc7XG4gICAgX29wdGlvbnM6IGFueTtcbiAgICB3b3JrZXJPcHRpb25zOiBhbnk7XG4gICAgZGlzcGF0Y2hlcjogRGlzcGF0Y2hlcjtcbiAgICBtYXA6IE1hcDtcbiAgICB3b3JrZXJJRDogbnVtYmVyO1xuICAgIF9sb2FkZWQ6IGJvb2xlYW47XG4gICAgX2NvbGxlY3RSZXNvdXJjZVRpbWluZzogYm9vbGVhbjtcbiAgICBfcmVzb3VyY2VUaW1pbmc6IEFycmF5PFBlcmZvcm1hbmNlUmVzb3VyY2VUaW1pbmc+O1xuICAgIF9yZW1vdmVkOiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihpZDogc3RyaW5nLCBvcHRpb25zOiBHZW9KU09OU291cmNlU3BlY2lmaWNhdGlvbiAmIHt3b3JrZXJPcHRpb25zPzogYW55LCBjb2xsZWN0UmVzb3VyY2VUaW1pbmc6IGJvb2xlYW59LCBkaXNwYXRjaGVyOiBEaXNwYXRjaGVyLCBldmVudGVkUGFyZW50OiBFdmVudGVkKSB7XG4gICAgICAgIHN1cGVyKCk7XG5cbiAgICAgICAgdGhpcy5pZCA9IGlkO1xuXG4gICAgICAgIC8vIGB0eXBlYCBpcyBhIHByb3BlcnR5IHJhdGhlciB0aGFuIGEgY29uc3RhbnQgdG8gbWFrZSBpdCBlYXN5IGZvciAzcmRcbiAgICAgICAgLy8gcGFydGllcyB0byB1c2UgR2VvSlNPTlNvdXJjZSB0byBidWlsZCB0aGVpciBvd24gc291cmNlIHR5cGVzLlxuICAgICAgICB0aGlzLnR5cGUgPSAnZ2VvanNvbic7XG5cbiAgICAgICAgdGhpcy5taW56b29tID0gMDtcbiAgICAgICAgdGhpcy5tYXh6b29tID0gMTg7XG4gICAgICAgIHRoaXMudGlsZVNpemUgPSA1MTI7XG4gICAgICAgIHRoaXMuaXNUaWxlQ2xpcHBlZCA9IHRydWU7XG4gICAgICAgIHRoaXMucmVwYXJzZU92ZXJzY2FsZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLl9yZW1vdmVkID0gZmFsc2U7XG5cbiAgICAgICAgdGhpcy5kaXNwYXRjaGVyID0gZGlzcGF0Y2hlcjtcbiAgICAgICAgdGhpcy5zZXRFdmVudGVkUGFyZW50KGV2ZW50ZWRQYXJlbnQpO1xuXG4gICAgICAgIHRoaXMuX2RhdGEgPSAob3B0aW9ucy5kYXRhOiBhbnkpO1xuICAgICAgICB0aGlzLl9vcHRpb25zID0gZXh0ZW5kKHt9LCBvcHRpb25zKTtcblxuICAgICAgICB0aGlzLl9jb2xsZWN0UmVzb3VyY2VUaW1pbmcgPSBvcHRpb25zLmNvbGxlY3RSZXNvdXJjZVRpbWluZztcbiAgICAgICAgdGhpcy5fcmVzb3VyY2VUaW1pbmcgPSBbXTtcblxuICAgICAgICBpZiAob3B0aW9ucy5tYXh6b29tICE9PSB1bmRlZmluZWQpIHRoaXMubWF4em9vbSA9IG9wdGlvbnMubWF4em9vbTtcbiAgICAgICAgaWYgKG9wdGlvbnMudHlwZSkgdGhpcy50eXBlID0gb3B0aW9ucy50eXBlO1xuICAgICAgICBpZiAob3B0aW9ucy5hdHRyaWJ1dGlvbikgdGhpcy5hdHRyaWJ1dGlvbiA9IG9wdGlvbnMuYXR0cmlidXRpb247XG5cbiAgICAgICAgY29uc3Qgc2NhbGUgPSBFWFRFTlQgLyB0aGlzLnRpbGVTaXplO1xuXG4gICAgICAgIC8vIHNlbnQgdG8gdGhlIHdvcmtlciwgYWxvbmcgd2l0aCBgdXJsOiAuLi5gIG9yIGBkYXRhOiBsaXRlcmFsIGdlb2pzb25gLFxuICAgICAgICAvLyBzbyB0aGF0IGl0IGNhbiBsb2FkL3BhcnNlL2luZGV4IHRoZSBnZW9qc29uIGRhdGFcbiAgICAgICAgLy8gZXh0ZW5kaW5nIHdpdGggYG9wdGlvbnMud29ya2VyT3B0aW9uc2AgaGVscHMgdG8gbWFrZSBpdCBlYXN5IGZvclxuICAgICAgICAvLyB0aGlyZC1wYXJ0eSBzb3VyY2VzIHRvIGhhY2svcmV1c2UgR2VvSlNPTlNvdXJjZS5cbiAgICAgICAgdGhpcy53b3JrZXJPcHRpb25zID0gZXh0ZW5kKHtcbiAgICAgICAgICAgIHNvdXJjZTogdGhpcy5pZCxcbiAgICAgICAgICAgIGNsdXN0ZXI6IG9wdGlvbnMuY2x1c3RlciB8fCBmYWxzZSxcbiAgICAgICAgICAgIGdlb2pzb25WdE9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgICBidWZmZXI6IChvcHRpb25zLmJ1ZmZlciAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5idWZmZXIgOiAxMjgpICogc2NhbGUsXG4gICAgICAgICAgICAgICAgdG9sZXJhbmNlOiAob3B0aW9ucy50b2xlcmFuY2UgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMudG9sZXJhbmNlIDogMC4zNzUpICogc2NhbGUsXG4gICAgICAgICAgICAgICAgZXh0ZW50OiBFWFRFTlQsXG4gICAgICAgICAgICAgICAgbWF4Wm9vbTogdGhpcy5tYXh6b29tLFxuICAgICAgICAgICAgICAgIGxpbmVNZXRyaWNzOiBvcHRpb25zLmxpbmVNZXRyaWNzIHx8IGZhbHNlLFxuICAgICAgICAgICAgICAgIGdlbmVyYXRlSWQ6IG9wdGlvbnMuZ2VuZXJhdGVJZCB8fCBmYWxzZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHN1cGVyY2x1c3Rlck9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgICBtYXhab29tOiBvcHRpb25zLmNsdXN0ZXJNYXhab29tICE9PSB1bmRlZmluZWQgP1xuICAgICAgICAgICAgICAgICAgICBNYXRoLm1pbihvcHRpb25zLmNsdXN0ZXJNYXhab29tLCB0aGlzLm1heHpvb20gLSAxKSA6XG4gICAgICAgICAgICAgICAgICAgICh0aGlzLm1heHpvb20gLSAxKSxcbiAgICAgICAgICAgICAgICBleHRlbnQ6IEVYVEVOVCxcbiAgICAgICAgICAgICAgICByYWRpdXM6IChvcHRpb25zLmNsdXN0ZXJSYWRpdXMgfHwgNTApICogc2NhbGUsXG4gICAgICAgICAgICAgICAgbG9nOiBmYWxzZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNsdXN0ZXJQcm9wZXJ0aWVzOiBvcHRpb25zLmNsdXN0ZXJQcm9wZXJ0aWVzXG4gICAgICAgIH0sIG9wdGlvbnMud29ya2VyT3B0aW9ucyk7XG4gICAgfVxuXG4gICAgbG9hZCgpIHtcbiAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgnZGF0YWxvYWRpbmcnLCB7ZGF0YVR5cGU6ICdzb3VyY2UnfSkpO1xuICAgICAgICB0aGlzLl91cGRhdGVXb3JrZXJEYXRhKChlcnIpID0+IHtcbiAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpcmUobmV3IEVycm9yRXZlbnQoZXJyKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBkYXRhOiBPYmplY3QgPSB7IGRhdGFUeXBlOiAnc291cmNlJywgc291cmNlRGF0YVR5cGU6ICdtZXRhZGF0YScgfTtcbiAgICAgICAgICAgIGlmICh0aGlzLl9jb2xsZWN0UmVzb3VyY2VUaW1pbmcgJiYgdGhpcy5fcmVzb3VyY2VUaW1pbmcgJiYgKHRoaXMuX3Jlc291cmNlVGltaW5nLmxlbmd0aCA+IDApKSB7XG4gICAgICAgICAgICAgICAgZGF0YS5yZXNvdXJjZVRpbWluZyA9IHRoaXMuX3Jlc291cmNlVGltaW5nO1xuICAgICAgICAgICAgICAgIHRoaXMuX3Jlc291cmNlVGltaW5nID0gW107XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGFsdGhvdWdoIEdlb0pTT04gc291cmNlcyBjb250YWluIG5vIG1ldGFkYXRhLCB3ZSBmaXJlIHRoaXMgZXZlbnQgdG8gbGV0IHRoZSBTb3VyY2VDYWNoZVxuICAgICAgICAgICAgLy8ga25vdyBpdHMgb2sgdG8gc3RhcnQgcmVxdWVzdGluZyB0aWxlcy5cbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ2RhdGEnLCBkYXRhKSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG9uQWRkKG1hcDogTWFwKSB7XG4gICAgICAgIHRoaXMubWFwID0gbWFwO1xuICAgICAgICB0aGlzLmxvYWQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBHZW9KU09OIGRhdGEgYW5kIHJlLXJlbmRlcnMgdGhlIG1hcC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fHN0cmluZ30gZGF0YSBBIEdlb0pTT04gZGF0YSBvYmplY3Qgb3IgYSBVUkwgdG8gb25lLiBUaGUgbGF0dGVyIGlzIHByZWZlcmFibGUgaW4gdGhlIGNhc2Ugb2YgbGFyZ2UgR2VvSlNPTiBmaWxlcy5cbiAgICAgKiBAcmV0dXJucyB7R2VvSlNPTlNvdXJjZX0gdGhpc1xuICAgICAqL1xuICAgIHNldERhdGEoZGF0YTogR2VvSlNPTiB8IHN0cmluZykge1xuICAgICAgICB0aGlzLl9kYXRhID0gZGF0YTtcbiAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgnZGF0YWxvYWRpbmcnLCB7ZGF0YVR5cGU6ICdzb3VyY2UnfSkpO1xuICAgICAgICB0aGlzLl91cGRhdGVXb3JrZXJEYXRhKChlcnIpID0+IHtcbiAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpcmUobmV3IEVycm9yRXZlbnQoZXJyKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBkYXRhOiBPYmplY3QgPSB7IGRhdGFUeXBlOiAnc291cmNlJywgc291cmNlRGF0YVR5cGU6ICdjb250ZW50JyB9O1xuICAgICAgICAgICAgaWYgKHRoaXMuX2NvbGxlY3RSZXNvdXJjZVRpbWluZyAmJiB0aGlzLl9yZXNvdXJjZVRpbWluZyAmJiAodGhpcy5fcmVzb3VyY2VUaW1pbmcubGVuZ3RoID4gMCkpIHtcbiAgICAgICAgICAgICAgICBkYXRhLnJlc291cmNlVGltaW5nID0gdGhpcy5fcmVzb3VyY2VUaW1pbmc7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVzb3VyY2VUaW1pbmcgPSBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ2RhdGEnLCBkYXRhKSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZvciBjbHVzdGVyZWQgc291cmNlcywgZmV0Y2hlcyB0aGUgem9vbSBhdCB3aGljaCB0aGUgZ2l2ZW4gY2x1c3RlciBleHBhbmRzLlxuICAgICAqXG4gICAgICogQHBhcmFtIGNsdXN0ZXJJZCBUaGUgdmFsdWUgb2YgdGhlIGNsdXN0ZXIncyBgY2x1c3Rlcl9pZGAgcHJvcGVydHkuXG4gICAgICogQHBhcmFtIGNhbGxiYWNrIEEgY2FsbGJhY2sgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIHpvb20gdmFsdWUgaXMgcmV0cmlldmVkIChgKGVycm9yLCB6b29tKSA9PiB7IC4uLiB9YCkuXG4gICAgICogQHJldHVybnMge0dlb0pTT05Tb3VyY2V9IHRoaXNcbiAgICAgKi9cbiAgICBnZXRDbHVzdGVyRXhwYW5zaW9uWm9vbShjbHVzdGVySWQ6IG51bWJlciwgY2FsbGJhY2s6IENhbGxiYWNrPG51bWJlcj4pIHtcbiAgICAgICAgdGhpcy5kaXNwYXRjaGVyLnNlbmQoJ2dlb2pzb24uZ2V0Q2x1c3RlckV4cGFuc2lvblpvb20nLCB7IGNsdXN0ZXJJZCwgc291cmNlOiB0aGlzLmlkIH0sIGNhbGxiYWNrLCB0aGlzLndvcmtlcklEKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRm9yIGNsdXN0ZXJlZCBzb3VyY2VzLCBmZXRjaGVzIHRoZSBjaGlsZHJlbiBvZiB0aGUgZ2l2ZW4gY2x1c3RlciBvbiB0aGUgbmV4dCB6b29tIGxldmVsIChhcyBhbiBhcnJheSBvZiBHZW9KU09OIGZlYXR1cmVzKS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBjbHVzdGVySWQgVGhlIHZhbHVlIG9mIHRoZSBjbHVzdGVyJ3MgYGNsdXN0ZXJfaWRgIHByb3BlcnR5LlxuICAgICAqIEBwYXJhbSBjYWxsYmFjayBBIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBmZWF0dXJlcyBhcmUgcmV0cmlldmVkIChgKGVycm9yLCBmZWF0dXJlcykgPT4geyAuLi4gfWApLlxuICAgICAqIEByZXR1cm5zIHtHZW9KU09OU291cmNlfSB0aGlzXG4gICAgICovXG4gICAgZ2V0Q2x1c3RlckNoaWxkcmVuKGNsdXN0ZXJJZDogbnVtYmVyLCBjYWxsYmFjazogQ2FsbGJhY2s8QXJyYXk8R2VvSlNPTkZlYXR1cmU+Pikge1xuICAgICAgICB0aGlzLmRpc3BhdGNoZXIuc2VuZCgnZ2VvanNvbi5nZXRDbHVzdGVyQ2hpbGRyZW4nLCB7IGNsdXN0ZXJJZCwgc291cmNlOiB0aGlzLmlkIH0sIGNhbGxiYWNrLCB0aGlzLndvcmtlcklEKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRm9yIGNsdXN0ZXJlZCBzb3VyY2VzLCBmZXRjaGVzIHRoZSBvcmlnaW5hbCBwb2ludHMgdGhhdCBiZWxvbmcgdG8gdGhlIGNsdXN0ZXIgKGFzIGFuIGFycmF5IG9mIEdlb0pTT04gZmVhdHVyZXMpLlxuICAgICAqXG4gICAgICogQHBhcmFtIGNsdXN0ZXJJZCBUaGUgdmFsdWUgb2YgdGhlIGNsdXN0ZXIncyBgY2x1c3Rlcl9pZGAgcHJvcGVydHkuXG4gICAgICogQHBhcmFtIGxpbWl0IFRoZSBtYXhpbXVtIG51bWJlciBvZiBmZWF0dXJlcyB0byByZXR1cm4uXG4gICAgICogQHBhcmFtIG9mZnNldCBUaGUgbnVtYmVyIG9mIGZlYXR1cmVzIHRvIHNraXAgKGUuZy4gZm9yIHBhZ2luYXRpb24pLlxuICAgICAqIEBwYXJhbSBjYWxsYmFjayBBIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBmZWF0dXJlcyBhcmUgcmV0cmlldmVkIChgKGVycm9yLCBmZWF0dXJlcykgPT4geyAuLi4gfWApLlxuICAgICAqIEByZXR1cm5zIHtHZW9KU09OU291cmNlfSB0aGlzXG4gICAgICovXG4gICAgZ2V0Q2x1c3RlckxlYXZlcyhjbHVzdGVySWQ6IG51bWJlciwgbGltaXQ6IG51bWJlciwgb2Zmc2V0OiBudW1iZXIsIGNhbGxiYWNrOiBDYWxsYmFjazxBcnJheTxHZW9KU09ORmVhdHVyZT4+KSB7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hlci5zZW5kKCdnZW9qc29uLmdldENsdXN0ZXJMZWF2ZXMnLCB7XG4gICAgICAgICAgICBzb3VyY2U6IHRoaXMuaWQsXG4gICAgICAgICAgICBjbHVzdGVySWQsXG4gICAgICAgICAgICBsaW1pdCxcbiAgICAgICAgICAgIG9mZnNldFxuICAgICAgICB9LCBjYWxsYmFjaywgdGhpcy53b3JrZXJJRCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qXG4gICAgICogUmVzcG9uc2libGUgZm9yIGludm9raW5nIFdvcmtlclNvdXJjZSdzIGdlb2pzb24ubG9hZERhdGEgdGFyZ2V0LCB3aGljaFxuICAgICAqIGhhbmRsZXMgbG9hZGluZyB0aGUgZ2VvanNvbiBkYXRhIGFuZCBwcmVwYXJpbmcgdG8gc2VydmUgaXQgdXAgYXMgdGlsZXMsXG4gICAgICogdXNpbmcgZ2VvanNvbi12dCBvciBzdXBlcmNsdXN0ZXIgYXMgYXBwcm9wcmlhdGUuXG4gICAgICovXG4gICAgX3VwZGF0ZVdvcmtlckRhdGEoY2FsbGJhY2s6IENhbGxiYWNrPHZvaWQ+KSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBleHRlbmQoe30sIHRoaXMud29ya2VyT3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLl9kYXRhO1xuICAgICAgICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBvcHRpb25zLnJlcXVlc3QgPSB0aGlzLm1hcC5fcmVxdWVzdE1hbmFnZXIudHJhbnNmb3JtUmVxdWVzdChicm93c2VyLnJlc29sdmVVUkwoZGF0YSksIFJlc291cmNlVHlwZS5Tb3VyY2UpO1xuICAgICAgICAgICAgb3B0aW9ucy5yZXF1ZXN0LmNvbGxlY3RSZXNvdXJjZVRpbWluZyA9IHRoaXMuX2NvbGxlY3RSZXNvdXJjZVRpbWluZztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG9wdGlvbnMuZGF0YSA9IEpTT04uc3RyaW5naWZ5KGRhdGEpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdGFyZ2V0IHt0aGlzLnR5cGV9LmxvYWREYXRhIHJhdGhlciB0aGFuIGxpdGVyYWxseSBnZW9qc29uLmxvYWREYXRhLFxuICAgICAgICAvLyBzbyB0aGF0IG90aGVyIGdlb2pzb24tbGlrZSBzb3VyY2UgdHlwZXMgY2FuIGVhc2lseSByZXVzZSB0aGlzXG4gICAgICAgIC8vIGltcGxlbWVudGF0aW9uXG4gICAgICAgIHRoaXMud29ya2VySUQgPSB0aGlzLmRpc3BhdGNoZXIuc2VuZChgJHt0aGlzLnR5cGV9LmxvYWREYXRhYCwgb3B0aW9ucywgKGVyciwgcmVzdWx0KSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5fcmVtb3ZlZCB8fCAocmVzdWx0ICYmIHJlc3VsdC5hYmFuZG9uZWQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLl9sb2FkZWQgPSB0cnVlO1xuXG4gICAgICAgICAgICBpZiAocmVzdWx0ICYmIHJlc3VsdC5yZXNvdXJjZVRpbWluZyAmJiByZXN1bHQucmVzb3VyY2VUaW1pbmdbdGhpcy5pZF0pXG4gICAgICAgICAgICAgICAgdGhpcy5fcmVzb3VyY2VUaW1pbmcgPSByZXN1bHQucmVzb3VyY2VUaW1pbmdbdGhpcy5pZF0uc2xpY2UoMCk7XG4gICAgICAgICAgICAvLyBBbnkgYGxvYWREYXRhYCBjYWxscyB0aGF0IHBpbGVkIHVwIHdoaWxlIHdlIHdlcmUgcHJvY2Vzc2luZ1xuICAgICAgICAgICAgLy8gdGhpcyBvbmUgd2lsbCBnZXQgY29hbGVzY2VkIGludG8gYSBzaW5nbGUgY2FsbCB3aGVuIHRoaXNcbiAgICAgICAgICAgIC8vICdjb2FsZXNjZScgbWVzc2FnZSBpcyBwcm9jZXNzZWQuXG4gICAgICAgICAgICAvLyBXZSB3b3VsZCBzZWxmLXNlbmQgZnJvbSB0aGUgd29ya2VyIGlmIHdlIGhhZCBhY2Nlc3MgdG8gaXRzXG4gICAgICAgICAgICAvLyBtZXNzYWdlIHF1ZXVlLiBXYWl0aW5nIGluc3RlYWQgZm9yIHRoZSAnY29hbGVzY2UnIHRvIHJvdW5kLXRyaXBcbiAgICAgICAgICAgIC8vIHRocm91Z2ggdGhlIGZvcmVncm91bmQganVzdCBtZWFucyB3ZSdyZSB0aHJvdHRsaW5nIHRoZSB3b3JrZXJcbiAgICAgICAgICAgIC8vIHRvIHJ1biBhdCBhIGxpdHRsZSBsZXNzIHRoYW4gZnVsbC10aHJvdHRsZS5cbiAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hlci5zZW5kKGAke3RoaXMudHlwZX0uY29hbGVzY2VgLCB7IHNvdXJjZTogb3B0aW9ucy5zb3VyY2UgfSwgbnVsbCwgdGhpcy53b3JrZXJJRCk7XG4gICAgICAgICAgICBjYWxsYmFjayhlcnIpO1xuXG4gICAgICAgIH0sIHRoaXMud29ya2VySUQpO1xuICAgIH1cblxuICAgIGxvYWRUaWxlKHRpbGU6IFRpbGUsIGNhbGxiYWNrOiBDYWxsYmFjazx2b2lkPikge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gdGlsZS53b3JrZXJJRCA9PT0gdW5kZWZpbmVkID8gJ2xvYWRUaWxlJyA6ICdyZWxvYWRUaWxlJztcbiAgICAgICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgICAgICAgdWlkOiB0aWxlLnVpZCxcbiAgICAgICAgICAgIHRpbGVJRDogdGlsZS50aWxlSUQsXG4gICAgICAgICAgICB6b29tOiB0aWxlLnRpbGVJRC5vdmVyc2NhbGVkWixcbiAgICAgICAgICAgIG1heFpvb206IHRoaXMubWF4em9vbSxcbiAgICAgICAgICAgIHRpbGVTaXplOiB0aGlzLnRpbGVTaXplLFxuICAgICAgICAgICAgc291cmNlOiB0aGlzLmlkLFxuICAgICAgICAgICAgcGl4ZWxSYXRpbzogYnJvd3Nlci5kZXZpY2VQaXhlbFJhdGlvLFxuICAgICAgICAgICAgc2hvd0NvbGxpc2lvbkJveGVzOiB0aGlzLm1hcC5zaG93Q29sbGlzaW9uQm94ZXNcbiAgICAgICAgfTtcblxuICAgICAgICB0aWxlLndvcmtlcklEID0gdGhpcy5kaXNwYXRjaGVyLnNlbmQobWVzc2FnZSwgcGFyYW1zLCAoZXJyLCBkYXRhKSA9PiB7XG4gICAgICAgICAgICB0aWxlLnVubG9hZFZlY3RvckRhdGEoKTtcblxuICAgICAgICAgICAgaWYgKHRpbGUuYWJvcnRlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhudWxsKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aWxlLmxvYWRWZWN0b3JEYXRhKGRhdGEsIHRoaXMubWFwLnBhaW50ZXIsIG1lc3NhZ2UgPT09ICdyZWxvYWRUaWxlJyk7XG5cbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhudWxsKTtcbiAgICAgICAgfSwgdGhpcy53b3JrZXJJRCk7XG4gICAgfVxuXG4gICAgYWJvcnRUaWxlKHRpbGU6IFRpbGUpIHtcbiAgICAgICAgdGlsZS5hYm9ydGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICB1bmxvYWRUaWxlKHRpbGU6IFRpbGUpIHtcbiAgICAgICAgdGlsZS51bmxvYWRWZWN0b3JEYXRhKCk7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hlci5zZW5kKCdyZW1vdmVUaWxlJywgeyB1aWQ6IHRpbGUudWlkLCB0eXBlOiB0aGlzLnR5cGUsIHNvdXJjZTogdGhpcy5pZCB9LCBudWxsLCB0aWxlLndvcmtlcklEKTtcbiAgICB9XG5cbiAgICBvblJlbW92ZSgpIHtcbiAgICAgICAgdGhpcy5fcmVtb3ZlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hlci5zZW5kKCdyZW1vdmVTb3VyY2UnLCB7IHR5cGU6IHRoaXMudHlwZSwgc291cmNlOiB0aGlzLmlkIH0sIG51bGwsIHRoaXMud29ya2VySUQpO1xuICAgIH1cblxuICAgIHNlcmlhbGl6ZSgpIHtcbiAgICAgICAgcmV0dXJuIGV4dGVuZCh7fSwgdGhpcy5fb3B0aW9ucywge1xuICAgICAgICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgICAgICAgZGF0YTogdGhpcy5fZGF0YVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBoYXNUcmFuc2l0aW9uKCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBHZW9KU09OU291cmNlO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHsgQ2Fub25pY2FsVGlsZUlEIH0gZnJvbSAnLi90aWxlX2lkJztcbmltcG9ydCB7IEV2ZW50LCBFcnJvckV2ZW50LCBFdmVudGVkIH0gZnJvbSAnLi4vdXRpbC9ldmVudGVkJztcbmltcG9ydCB7IGdldEltYWdlLCBSZXNvdXJjZVR5cGUgfSBmcm9tICcuLi91dGlsL2FqYXgnO1xuaW1wb3J0IEVYVEVOVCBmcm9tICcuLi9kYXRhL2V4dGVudCc7XG5pbXBvcnQgeyBSYXN0ZXJCb3VuZHNBcnJheSB9IGZyb20gJy4uL2RhdGEvYXJyYXlfdHlwZXMnO1xuaW1wb3J0IHJhc3RlckJvdW5kc0F0dHJpYnV0ZXMgZnJvbSAnLi4vZGF0YS9yYXN0ZXJfYm91bmRzX2F0dHJpYnV0ZXMnO1xuaW1wb3J0IFNlZ21lbnRWZWN0b3IgZnJvbSAnLi4vZGF0YS9zZWdtZW50JztcbmltcG9ydCBUZXh0dXJlIGZyb20gJy4uL3JlbmRlci90ZXh0dXJlJztcbmltcG9ydCBNZXJjYXRvckNvb3JkaW5hdGUgZnJvbSAnLi4vZ2VvL21lcmNhdG9yX2Nvb3JkaW5hdGUnO1xuXG5pbXBvcnQgdHlwZSB7U291cmNlfSBmcm9tICcuL3NvdXJjZSc7XG5pbXBvcnQgdHlwZSB7Q2FudmFzU291cmNlU3BlY2lmaWNhdGlvbn0gZnJvbSAnLi9jYW52YXNfc291cmNlJztcbmltcG9ydCB0eXBlIE1hcCBmcm9tICcuLi91aS9tYXAnO1xuaW1wb3J0IHR5cGUgRGlzcGF0Y2hlciBmcm9tICcuLi91dGlsL2Rpc3BhdGNoZXInO1xuaW1wb3J0IHR5cGUgVGlsZSBmcm9tICcuL3RpbGUnO1xuaW1wb3J0IHR5cGUge0NhbGxiYWNrfSBmcm9tICcuLi90eXBlcy9jYWxsYmFjayc7XG5pbXBvcnQgdHlwZSBWZXJ0ZXhCdWZmZXIgZnJvbSAnLi4vZ2wvdmVydGV4X2J1ZmZlcic7XG5pbXBvcnQgdHlwZSB7XG4gICAgSW1hZ2VTb3VyY2VTcGVjaWZpY2F0aW9uLFxuICAgIFZpZGVvU291cmNlU3BlY2lmaWNhdGlvblxufSBmcm9tICcuLi9zdHlsZS1zcGVjL3R5cGVzJztcblxudHlwZSBDb29yZGluYXRlcyA9IFtbbnVtYmVyLCBudW1iZXJdLCBbbnVtYmVyLCBudW1iZXJdLCBbbnVtYmVyLCBudW1iZXJdLCBbbnVtYmVyLCBudW1iZXJdXTtcblxuLyoqXG4gKiBBIGRhdGEgc291cmNlIGNvbnRhaW5pbmcgYW4gaW1hZ2UuXG4gKiAoU2VlIHRoZSBbU3R5bGUgU3BlY2lmaWNhdGlvbl0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtc3R5bGUtc3BlYy8jc291cmNlcy1pbWFnZSkgZm9yIGRldGFpbGVkIGRvY3VtZW50YXRpb24gb2Ygb3B0aW9ucy4pXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIGFkZCB0byBtYXBcbiAqIG1hcC5hZGRTb3VyY2UoJ3NvbWUgaWQnLCB7XG4gKiAgICB0eXBlOiAnaW1hZ2UnLFxuICogICAgdXJsOiAnaHR0cHM6Ly93d3cubWFwYm94LmNvbS9pbWFnZXMvZm9vLnBuZycsXG4gKiAgICBjb29yZGluYXRlczogW1xuICogICAgICAgIFstNzYuNTQsIDM5LjE4XSxcbiAqICAgICAgICBbLTc2LjUyLCAzOS4xOF0sXG4gKiAgICAgICAgWy03Ni41MiwgMzkuMTddLFxuICogICAgICAgIFstNzYuNTQsIDM5LjE3XVxuICogICAgXVxuICogfSk7XG4gKlxuICogLy8gdXBkYXRlIGNvb3JkaW5hdGVzXG4gKiB2YXIgbXlTb3VyY2UgPSBtYXAuZ2V0U291cmNlKCdzb21lIGlkJyk7XG4gKiBteVNvdXJjZS5zZXRDb29yZGluYXRlcyhbXG4gKiAgICAgWy03Ni41NDMzNTczNzIyODM5NCwgMzkuMTg1Nzk5MDcyMjk3NDhdLFxuICogICAgIFstNzYuNTI4MDM2NTk0MzkwODcsIDM5LjE4MzgzNjQ4NDc1ODddLFxuICogICAgIFstNzYuNTI5NTM4NjMxNDM5MiwgMzkuMTc2ODMzOTI1MDc2MDZdLFxuICogICAgIFstNzYuNTQ1MjAyNzMyMDg2MTgsIDM5LjE3ODc2MzQ0MTA2NjQyXVxuICogXSk7XG4gKlxuICogLy8gdXBkYXRlIHVybCBhbmQgY29vcmRpbmF0ZXMgc2ltdWx0YW5lb3VzbHlcbiAqIG15U291cmNlLnVwZGF0ZUltYWdlKHtcbiAqICAgIHVybDogJ2h0dHBzOi8vd3d3Lm1hcGJveC5jb20vaW1hZ2VzL2Jhci5wbmcnLFxuICogICAgY29vcmRpbmF0ZXM6IFtcbiAqICAgICAgICBbLTc2LjU0MzM1NzM3MjI4Mzk0LCAzOS4xODU3OTkwNzIyOTc0OF0sXG4gKiAgICAgICAgWy03Ni41MjgwMzY1OTQzOTA4NywgMzkuMTgzODM2NDg0NzU4N10sXG4gKiAgICAgICAgWy03Ni41Mjk1Mzg2MzE0MzkyLCAzOS4xNzY4MzM5MjUwNzYwNl0sXG4gKiAgICAgICAgWy03Ni41NDUyMDI3MzIwODYxOCwgMzkuMTc4NzYzNDQxMDY2NDJdXG4gKiAgICBdXG4gKiB9KVxuICpcbiAqIG1hcC5yZW1vdmVTb3VyY2UoJ3NvbWUgaWQnKTsgIC8vIHJlbW92ZVxuICogQHNlZSBbQWRkIGFuIGltYWdlXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2ltYWdlLW9uLWEtbWFwLylcbiAqL1xuY2xhc3MgSW1hZ2VTb3VyY2UgZXh0ZW5kcyBFdmVudGVkIGltcGxlbWVudHMgU291cmNlIHtcbiAgICB0eXBlOiBzdHJpbmc7XG4gICAgaWQ6IHN0cmluZztcbiAgICBtaW56b29tOiBudW1iZXI7XG4gICAgbWF4em9vbTogbnVtYmVyO1xuICAgIHRpbGVTaXplOiBudW1iZXI7XG4gICAgdXJsOiBzdHJpbmc7XG5cbiAgICBjb29yZGluYXRlczogQ29vcmRpbmF0ZXM7XG4gICAgdGlsZXM6IHtbc3RyaW5nXTogVGlsZX07XG4gICAgb3B0aW9uczogYW55O1xuICAgIGRpc3BhdGNoZXI6IERpc3BhdGNoZXI7XG4gICAgbWFwOiBNYXA7XG4gICAgdGV4dHVyZTogVGV4dHVyZSB8IG51bGw7XG4gICAgaW1hZ2U6IEhUTUxJbWFnZUVsZW1lbnQ7XG4gICAgdGlsZUlEOiBDYW5vbmljYWxUaWxlSUQ7XG4gICAgX2JvdW5kc0FycmF5OiBSYXN0ZXJCb3VuZHNBcnJheTtcbiAgICBib3VuZHNCdWZmZXI6IFZlcnRleEJ1ZmZlcjtcbiAgICBib3VuZHNTZWdtZW50czogU2VnbWVudFZlY3RvcjtcblxuICAgIC8qKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoaWQ6IHN0cmluZywgb3B0aW9uczogSW1hZ2VTb3VyY2VTcGVjaWZpY2F0aW9uIHwgVmlkZW9Tb3VyY2VTcGVjaWZpY2F0aW9uIHwgQ2FudmFzU291cmNlU3BlY2lmaWNhdGlvbiwgZGlzcGF0Y2hlcjogRGlzcGF0Y2hlciwgZXZlbnRlZFBhcmVudDogRXZlbnRlZCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmlkID0gaWQ7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hlciA9IGRpc3BhdGNoZXI7XG4gICAgICAgIHRoaXMuY29vcmRpbmF0ZXMgPSBvcHRpb25zLmNvb3JkaW5hdGVzO1xuXG4gICAgICAgIHRoaXMudHlwZSA9ICdpbWFnZSc7XG4gICAgICAgIHRoaXMubWluem9vbSA9IDA7XG4gICAgICAgIHRoaXMubWF4em9vbSA9IDIyO1xuICAgICAgICB0aGlzLnRpbGVTaXplID0gNTEyO1xuICAgICAgICB0aGlzLnRpbGVzID0ge307XG5cbiAgICAgICAgdGhpcy5zZXRFdmVudGVkUGFyZW50KGV2ZW50ZWRQYXJlbnQpO1xuXG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgfVxuXG4gICAgbG9hZChuZXdDb29yZGluYXRlcz86IENvb3JkaW5hdGVzLCBzdWNjZXNzQ2FsbGJhY2s/OiAoKSA9PiB2b2lkKSB7XG4gICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ2RhdGFsb2FkaW5nJywge2RhdGFUeXBlOiAnc291cmNlJ30pKTtcblxuICAgICAgICB0aGlzLnVybCA9IHRoaXMub3B0aW9ucy51cmw7XG5cbiAgICAgICAgZ2V0SW1hZ2UodGhpcy5tYXAuX3JlcXVlc3RNYW5hZ2VyLnRyYW5zZm9ybVJlcXVlc3QodGhpcy51cmwsIFJlc291cmNlVHlwZS5JbWFnZSksIChlcnIsIGltYWdlKSA9PiB7XG4gICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFcnJvckV2ZW50KGVycikpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpbWFnZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuaW1hZ2UgPSBpbWFnZTtcbiAgICAgICAgICAgICAgICBpZiAobmV3Q29vcmRpbmF0ZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb29yZGluYXRlcyA9IG5ld0Nvb3JkaW5hdGVzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoc3VjY2Vzc0NhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NDYWxsYmFjaygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLl9maW5pc2hMb2FkaW5nKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgdGhlIGltYWdlIFVSTCBhbmQsIG9wdGlvbmFsbHksIHRoZSBjb29yZGluYXRlcy4gVG8gYXZvaWQgaGF2aW5nIHRoZSBpbWFnZSBmbGFzaCBhZnRlciBjaGFuZ2luZyxcbiAgICAgKiBzZXQgdGhlIGByYXN0ZXItZmFkZS1kdXJhdGlvbmAgcGFpbnQgcHJvcGVydHkgb24gdGhlIHJhc3RlciBsYXllciB0byAwLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMudXJsXSBSZXF1aXJlZCBpbWFnZSBVUkwuXG4gICAgICogQHBhcmFtIHtBcnJheTxBcnJheTxudW1iZXI+Pn0gW29wdGlvbnMuY29vcmRpbmF0ZXNdIEZvdXIgZ2VvZ3JhcGhpY2FsIGNvb3JkaW5hdGVzLFxuICAgICAqICAgcmVwcmVzZW50ZWQgYXMgYXJyYXlzIG9mIGxvbmdpdHVkZSBhbmQgbGF0aXR1ZGUgbnVtYmVycywgd2hpY2ggZGVmaW5lIHRoZSBjb3JuZXJzIG9mIHRoZSBpbWFnZS5cbiAgICAgKiAgIFRoZSBjb29yZGluYXRlcyBzdGFydCBhdCB0aGUgdG9wIGxlZnQgY29ybmVyIG9mIHRoZSBpbWFnZSBhbmQgcHJvY2VlZCBpbiBjbG9ja3dpc2Ugb3JkZXIuXG4gICAgICogICBUaGV5IGRvIG5vdCBoYXZlIHRvIHJlcHJlc2VudCBhIHJlY3RhbmdsZS5cbiAgICAgKiBAcmV0dXJucyB7SW1hZ2VTb3VyY2V9IHRoaXNcbiAgICAgKi9cbiAgICB1cGRhdGVJbWFnZShvcHRpb25zOiB7dXJsOiBzdHJpbmcsIGNvb3JkaW5hdGVzPzogQ29vcmRpbmF0ZXN9KSB7XG4gICAgICAgIGlmICghdGhpcy5pbWFnZSB8fCAhb3B0aW9ucy51cmwpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub3B0aW9ucy51cmwgPSBvcHRpb25zLnVybDtcbiAgICAgICAgdGhpcy5sb2FkKG9wdGlvbnMuY29vcmRpbmF0ZXMsICgpID0+IHsgdGhpcy50ZXh0dXJlID0gbnVsbDsgfSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIF9maW5pc2hMb2FkaW5nKCkge1xuICAgICAgICBpZiAodGhpcy5tYXApIHtcbiAgICAgICAgICAgIHRoaXMuc2V0Q29vcmRpbmF0ZXModGhpcy5jb29yZGluYXRlcyk7XG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEV2ZW50KCdkYXRhJywge2RhdGFUeXBlOiAnc291cmNlJywgc291cmNlRGF0YVR5cGU6ICdtZXRhZGF0YSd9KSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbkFkZChtYXA6IE1hcCkge1xuICAgICAgICB0aGlzLm1hcCA9IG1hcDtcbiAgICAgICAgdGhpcy5sb2FkKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgaW1hZ2UncyBjb29yZGluYXRlcyBhbmQgcmUtcmVuZGVycyB0aGUgbWFwLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtBcnJheTxBcnJheTxudW1iZXI+Pn0gY29vcmRpbmF0ZXMgRm91ciBnZW9ncmFwaGljYWwgY29vcmRpbmF0ZXMsXG4gICAgICogICByZXByZXNlbnRlZCBhcyBhcnJheXMgb2YgbG9uZ2l0dWRlIGFuZCBsYXRpdHVkZSBudW1iZXJzLCB3aGljaCBkZWZpbmUgdGhlIGNvcm5lcnMgb2YgdGhlIGltYWdlLlxuICAgICAqICAgVGhlIGNvb3JkaW5hdGVzIHN0YXJ0IGF0IHRoZSB0b3AgbGVmdCBjb3JuZXIgb2YgdGhlIGltYWdlIGFuZCBwcm9jZWVkIGluIGNsb2Nrd2lzZSBvcmRlci5cbiAgICAgKiAgIFRoZXkgZG8gbm90IGhhdmUgdG8gcmVwcmVzZW50IGEgcmVjdGFuZ2xlLlxuICAgICAqIEByZXR1cm5zIHtJbWFnZVNvdXJjZX0gdGhpc1xuICAgICAqL1xuICAgIHNldENvb3JkaW5hdGVzKGNvb3JkaW5hdGVzOiBDb29yZGluYXRlcykge1xuICAgICAgICB0aGlzLmNvb3JkaW5hdGVzID0gY29vcmRpbmF0ZXM7XG5cbiAgICAgICAgLy8gQ2FsY3VsYXRlIHdoaWNoIG1lcmNhdG9yIHRpbGUgaXMgc3VpdGFibGUgZm9yIHJlbmRlcmluZyB0aGUgdmlkZW8gaW5cbiAgICAgICAgLy8gYW5kIGNyZWF0ZSBhIGJ1ZmZlciB3aXRoIHRoZSBjb3JuZXIgY29vcmRpbmF0ZXMuIFRoZXNlIGNvb3JkaW5hdGVzXG4gICAgICAgIC8vIG1heSBiZSBvdXRzaWRlIHRoZSB0aWxlLCBiZWNhdXNlIHJhc3RlciB0aWxlcyBhcmVuJ3QgY2xpcHBlZCB3aGVuIHJlbmRlcmluZy5cblxuICAgICAgICAvLyB0cmFuc2Zvcm0gdGhlIGdlbyBjb29yZGluYXRlcyBpbnRvICh6b29tIDApIHRpbGUgc3BhY2UgY29vcmRpbmF0ZXNcbiAgICAgICAgY29uc3QgY29ybmVyQ29vcmRzID0gY29vcmRpbmF0ZXMubWFwKE1lcmNhdG9yQ29vcmRpbmF0ZS5mcm9tTG5nTGF0KTtcblxuICAgICAgICAvLyBDb21wdXRlIHRoZSBjb29yZGluYXRlcyBvZiB0aGUgdGlsZSB3ZSdsbCB1c2UgdG8gaG9sZCB0aGlzIGltYWdlJ3NcbiAgICAgICAgLy8gcmVuZGVyIGRhdGFcbiAgICAgICAgdGhpcy50aWxlSUQgPSBnZXRDb29yZGluYXRlc0NlbnRlclRpbGVJRChjb3JuZXJDb29yZHMpO1xuXG4gICAgICAgIC8vIENvbnN0cmFpbiBtaW4vbWF4IHpvb20gdG8gb3VyIHRpbGUncyB6b29tIGxldmVsIGluIG9yZGVyIHRvIGZvcmNlXG4gICAgICAgIC8vIFNvdXJjZUNhY2hlIHRvIHJlcXVlc3QgdGhpcyB0aWxlIChubyBtYXR0ZXIgd2hhdCB0aGUgbWFwJ3Mgem9vbVxuICAgICAgICAvLyBsZXZlbClcbiAgICAgICAgdGhpcy5taW56b29tID0gdGhpcy5tYXh6b29tID0gdGhpcy50aWxlSUQuejtcblxuICAgICAgICAvLyBUcmFuc2Zvcm0gdGhlIGNvcm5lciBjb29yZGluYXRlcyBpbnRvIHRoZSBjb29yZGluYXRlIHNwYWNlIG9mIG91clxuICAgICAgICAvLyB0aWxlLlxuICAgICAgICBjb25zdCB0aWxlQ29vcmRzID0gY29ybmVyQ29vcmRzLm1hcCgoY29vcmQpID0+IHRoaXMudGlsZUlELmdldFRpbGVQb2ludChjb29yZCkuX3JvdW5kKCkpO1xuXG4gICAgICAgIHRoaXMuX2JvdW5kc0FycmF5ID0gbmV3IFJhc3RlckJvdW5kc0FycmF5KCk7XG4gICAgICAgIHRoaXMuX2JvdW5kc0FycmF5LmVtcGxhY2VCYWNrKHRpbGVDb29yZHNbMF0ueCwgdGlsZUNvb3Jkc1swXS55LCAwLCAwKTtcbiAgICAgICAgdGhpcy5fYm91bmRzQXJyYXkuZW1wbGFjZUJhY2sodGlsZUNvb3Jkc1sxXS54LCB0aWxlQ29vcmRzWzFdLnksIEVYVEVOVCwgMCk7XG4gICAgICAgIHRoaXMuX2JvdW5kc0FycmF5LmVtcGxhY2VCYWNrKHRpbGVDb29yZHNbM10ueCwgdGlsZUNvb3Jkc1szXS55LCAwLCBFWFRFTlQpO1xuICAgICAgICB0aGlzLl9ib3VuZHNBcnJheS5lbXBsYWNlQmFjayh0aWxlQ29vcmRzWzJdLngsIHRpbGVDb29yZHNbMl0ueSwgRVhURU5ULCBFWFRFTlQpO1xuXG4gICAgICAgIGlmICh0aGlzLmJvdW5kc0J1ZmZlcikge1xuICAgICAgICAgICAgdGhpcy5ib3VuZHNCdWZmZXIuZGVzdHJveSgpO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuYm91bmRzQnVmZmVyO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgnZGF0YScsIHtkYXRhVHlwZTonc291cmNlJywgc291cmNlRGF0YVR5cGU6ICdjb250ZW50J30pKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHJlcGFyZSgpIHtcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHRoaXMudGlsZXMpLmxlbmd0aCA9PT0gMCB8fCAhdGhpcy5pbWFnZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMubWFwLnBhaW50ZXIuY29udGV4dDtcbiAgICAgICAgY29uc3QgZ2wgPSBjb250ZXh0LmdsO1xuXG4gICAgICAgIGlmICghdGhpcy5ib3VuZHNCdWZmZXIpIHtcbiAgICAgICAgICAgIHRoaXMuYm91bmRzQnVmZmVyID0gY29udGV4dC5jcmVhdGVWZXJ0ZXhCdWZmZXIodGhpcy5fYm91bmRzQXJyYXksIHJhc3RlckJvdW5kc0F0dHJpYnV0ZXMubWVtYmVycyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuYm91bmRzU2VnbWVudHMpIHtcbiAgICAgICAgICAgIHRoaXMuYm91bmRzU2VnbWVudHMgPSBTZWdtZW50VmVjdG9yLnNpbXBsZVNlZ21lbnQoMCwgMCwgNCwgMik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMudGV4dHVyZSkge1xuICAgICAgICAgICAgdGhpcy50ZXh0dXJlID0gbmV3IFRleHR1cmUoY29udGV4dCwgdGhpcy5pbWFnZSwgZ2wuUkdCQSk7XG4gICAgICAgICAgICB0aGlzLnRleHR1cmUuYmluZChnbC5MSU5FQVIsIGdsLkNMQU1QX1RPX0VER0UpO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCB3IGluIHRoaXMudGlsZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHRpbGUgPSB0aGlzLnRpbGVzW3ddO1xuICAgICAgICAgICAgaWYgKHRpbGUuc3RhdGUgIT09ICdsb2FkZWQnKSB7XG4gICAgICAgICAgICAgICAgdGlsZS5zdGF0ZSA9ICdsb2FkZWQnO1xuICAgICAgICAgICAgICAgIHRpbGUudGV4dHVyZSA9IHRoaXMudGV4dHVyZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGxvYWRUaWxlKHRpbGU6IFRpbGUsIGNhbGxiYWNrOiBDYWxsYmFjazx2b2lkPikge1xuICAgICAgICAvLyBXZSBoYXZlIGEgc2luZ2xlIHRpbGUgLS0gd2hvb3NlIGNvb3JkaW5hdGVzIGFyZSB0aGlzLnRpbGVJRCAtLSB0aGF0XG4gICAgICAgIC8vIGNvdmVycyB0aGUgaW1hZ2Ugd2Ugd2FudCB0byByZW5kZXIuICBJZiB0aGF0J3MgdGhlIG9uZSBiZWluZ1xuICAgICAgICAvLyByZXF1ZXN0ZWQsIHNldCBpdCB1cCB3aXRoIHRoZSBpbWFnZTsgb3RoZXJ3aXNlLCBtYXJrIHRoZSB0aWxlIGFzXG4gICAgICAgIC8vIGBlcnJvcmVkYCB0byBpbmRpY2F0ZSB0aGF0IHdlIGhhdmUgbm8gZGF0YSBmb3IgaXQuXG4gICAgICAgIC8vIElmIHRoZSB3b3JsZCB3cmFwcywgd2UgbWF5IGhhdmUgbXVsdGlwbGUgXCJ3cmFwcGVkXCIgY29waWVzIG9mIHRoZVxuICAgICAgICAvLyBzaW5nbGUgdGlsZS5cbiAgICAgICAgaWYgKHRoaXMudGlsZUlEICYmIHRoaXMudGlsZUlELmVxdWFscyh0aWxlLnRpbGVJRC5jYW5vbmljYWwpKSB7XG4gICAgICAgICAgICB0aGlzLnRpbGVzW1N0cmluZyh0aWxlLnRpbGVJRC53cmFwKV0gPSB0aWxlO1xuICAgICAgICAgICAgdGlsZS5idWNrZXRzID0ge307XG4gICAgICAgICAgICBjYWxsYmFjayhudWxsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRpbGUuc3RhdGUgPSAnZXJyb3JlZCc7XG4gICAgICAgICAgICBjYWxsYmFjayhudWxsKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNlcmlhbGl6ZSgpOiBPYmplY3Qge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogJ2ltYWdlJyxcbiAgICAgICAgICAgIHVybDogdGhpcy5vcHRpb25zLnVybCxcbiAgICAgICAgICAgIGNvb3JkaW5hdGVzOiB0aGlzLmNvb3JkaW5hdGVzXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgaGFzVHJhbnNpdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cblxuLyoqXG4gKiBHaXZlbiBhIGxpc3Qgb2YgY29vcmRpbmF0ZXMsIGdldCB0aGVpciBjZW50ZXIgYXMgYSBjb29yZGluYXRlLlxuICpcbiAqIEByZXR1cm5zIGNlbnRlcnBvaW50XG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29vcmRpbmF0ZXNDZW50ZXJUaWxlSUQoY29vcmRzOiBBcnJheTxNZXJjYXRvckNvb3JkaW5hdGU+KSB7XG4gICAgbGV0IG1pblggPSBJbmZpbml0eTtcbiAgICBsZXQgbWluWSA9IEluZmluaXR5O1xuICAgIGxldCBtYXhYID0gLUluZmluaXR5O1xuICAgIGxldCBtYXhZID0gLUluZmluaXR5O1xuXG4gICAgZm9yIChjb25zdCBjb29yZCBvZiBjb29yZHMpIHtcbiAgICAgICAgbWluWCA9IE1hdGgubWluKG1pblgsIGNvb3JkLngpO1xuICAgICAgICBtaW5ZID0gTWF0aC5taW4obWluWSwgY29vcmQueSk7XG4gICAgICAgIG1heFggPSBNYXRoLm1heChtYXhYLCBjb29yZC54KTtcbiAgICAgICAgbWF4WSA9IE1hdGgubWF4KG1heFksIGNvb3JkLnkpO1xuICAgIH1cblxuICAgIGNvbnN0IGR4ID0gbWF4WCAtIG1pblg7XG4gICAgY29uc3QgZHkgPSBtYXhZIC0gbWluWTtcbiAgICBjb25zdCBkTWF4ID0gTWF0aC5tYXgoZHgsIGR5KTtcbiAgICBjb25zdCB6b29tID0gTWF0aC5tYXgoMCwgTWF0aC5mbG9vcigtTWF0aC5sb2coZE1heCkgLyBNYXRoLkxOMikpO1xuICAgIGNvbnN0IHRpbGVzQXRab29tID0gTWF0aC5wb3coMiwgem9vbSk7XG5cbiAgICByZXR1cm4gbmV3IENhbm9uaWNhbFRpbGVJRChcbiAgICAgICAgICAgIHpvb20sXG4gICAgICAgICAgICBNYXRoLmZsb29yKChtaW5YICsgbWF4WCkgLyAyICogdGlsZXNBdFpvb20pLFxuICAgICAgICAgICAgTWF0aC5mbG9vcigobWluWSArIG1heFkpIC8gMiAqIHRpbGVzQXRab29tKSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IEltYWdlU291cmNlO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHsgZ2V0VmlkZW8sIFJlc291cmNlVHlwZSB9IGZyb20gJy4uL3V0aWwvYWpheCc7XG5cbmltcG9ydCBJbWFnZVNvdXJjZSBmcm9tICcuL2ltYWdlX3NvdXJjZSc7XG5pbXBvcnQgcmFzdGVyQm91bmRzQXR0cmlidXRlcyBmcm9tICcuLi9kYXRhL3Jhc3Rlcl9ib3VuZHNfYXR0cmlidXRlcyc7XG5pbXBvcnQgU2VnbWVudFZlY3RvciBmcm9tICcuLi9kYXRhL3NlZ21lbnQnO1xuaW1wb3J0IFRleHR1cmUgZnJvbSAnLi4vcmVuZGVyL3RleHR1cmUnO1xuaW1wb3J0IHsgRXJyb3JFdmVudCB9IGZyb20gJy4uL3V0aWwvZXZlbnRlZCc7XG5cbmltcG9ydCB0eXBlIE1hcCBmcm9tICcuLi91aS9tYXAnO1xuaW1wb3J0IHR5cGUgRGlzcGF0Y2hlciBmcm9tICcuLi91dGlsL2Rpc3BhdGNoZXInO1xuaW1wb3J0IHR5cGUge0V2ZW50ZWR9IGZyb20gJy4uL3V0aWwvZXZlbnRlZCc7XG5pbXBvcnQgdHlwZSB7VmlkZW9Tb3VyY2VTcGVjaWZpY2F0aW9ufSBmcm9tICcuLi9zdHlsZS1zcGVjL3R5cGVzJztcblxuLyoqXG4gKiBBIGRhdGEgc291cmNlIGNvbnRhaW5pbmcgdmlkZW8uXG4gKiAoU2VlIHRoZSBbU3R5bGUgU3BlY2lmaWNhdGlvbl0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtc3R5bGUtc3BlYy8jc291cmNlcy12aWRlbykgZm9yIGRldGFpbGVkIGRvY3VtZW50YXRpb24gb2Ygb3B0aW9ucy4pXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIGFkZCB0byBtYXBcbiAqIG1hcC5hZGRTb3VyY2UoJ3NvbWUgaWQnLCB7XG4gKiAgICB0eXBlOiAndmlkZW8nLFxuICogICAgdXJsOiBbXG4gKiAgICAgICAgJ2h0dHBzOi8vd3d3Lm1hcGJveC5jb20vYmxvZy9hc3NldHMvYmFsdGltb3JlLXNtb2tlLm1wNCcsXG4gKiAgICAgICAgJ2h0dHBzOi8vd3d3Lm1hcGJveC5jb20vYmxvZy9hc3NldHMvYmFsdGltb3JlLXNtb2tlLndlYm0nXG4gKiAgICBdLFxuICogICAgY29vcmRpbmF0ZXM6IFtcbiAqICAgICAgICBbLTc2LjU0LCAzOS4xOF0sXG4gKiAgICAgICAgWy03Ni41MiwgMzkuMThdLFxuICogICAgICAgIFstNzYuNTIsIDM5LjE3XSxcbiAqICAgICAgICBbLTc2LjU0LCAzOS4xN11cbiAqICAgIF1cbiAqIH0pO1xuICpcbiAqIC8vIHVwZGF0ZVxuICogdmFyIG15U291cmNlID0gbWFwLmdldFNvdXJjZSgnc29tZSBpZCcpO1xuICogbXlTb3VyY2Uuc2V0Q29vcmRpbmF0ZXMoW1xuICogICAgIFstNzYuNTQzMzU3MzcyMjgzOTQsIDM5LjE4NTc5OTA3MjI5NzQ4XSxcbiAqICAgICBbLTc2LjUyODAzNjU5NDM5MDg3LCAzOS4xODM4MzY0ODQ3NTg3XSxcbiAqICAgICBbLTc2LjUyOTUzODYzMTQzOTIsIDM5LjE3NjgzMzkyNTA3NjA2XSxcbiAqICAgICBbLTc2LjU0NTIwMjczMjA4NjE4LCAzOS4xNzg3NjM0NDEwNjY0Ml1cbiAqIF0pO1xuICpcbiAqIG1hcC5yZW1vdmVTb3VyY2UoJ3NvbWUgaWQnKTsgIC8vIHJlbW92ZVxuICogQHNlZSBbQWRkIGEgdmlkZW9dKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvdmlkZW8tb24tYS1tYXAvKVxuICovXG5jbGFzcyBWaWRlb1NvdXJjZSBleHRlbmRzIEltYWdlU291cmNlIHtcbiAgICBvcHRpb25zOiBWaWRlb1NvdXJjZVNwZWNpZmljYXRpb247XG4gICAgdXJsczogQXJyYXk8c3RyaW5nPjtcbiAgICB2aWRlbzogSFRNTFZpZGVvRWxlbWVudDtcbiAgICByb3VuZFpvb206IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGlkOiBzdHJpbmcsIG9wdGlvbnM6IFZpZGVvU291cmNlU3BlY2lmaWNhdGlvbiwgZGlzcGF0Y2hlcjogRGlzcGF0Y2hlciwgZXZlbnRlZFBhcmVudDogRXZlbnRlZCkge1xuICAgICAgICBzdXBlcihpZCwgb3B0aW9ucywgZGlzcGF0Y2hlciwgZXZlbnRlZFBhcmVudCk7XG4gICAgICAgIHRoaXMucm91bmRab29tID0gdHJ1ZTtcbiAgICAgICAgdGhpcy50eXBlID0gJ3ZpZGVvJztcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICB9XG5cbiAgICBsb2FkKCkge1xuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuXG4gICAgICAgIHRoaXMudXJscyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHVybCBvZiBvcHRpb25zLnVybHMpIHtcbiAgICAgICAgICAgIHRoaXMudXJscy5wdXNoKHRoaXMubWFwLl9yZXF1ZXN0TWFuYWdlci50cmFuc2Zvcm1SZXF1ZXN0KHVybCwgUmVzb3VyY2VUeXBlLlNvdXJjZSkudXJsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGdldFZpZGVvKHRoaXMudXJscywgKGVyciwgdmlkZW8pID0+IHtcbiAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpcmUobmV3IEVycm9yRXZlbnQoZXJyKSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHZpZGVvKSB7XG4gICAgICAgICAgICAgICAgdGhpcy52aWRlbyA9IHZpZGVvO1xuICAgICAgICAgICAgICAgIHRoaXMudmlkZW8ubG9vcCA9IHRydWU7XG5cbiAgICAgICAgICAgICAgICAvLyBTdGFydCByZXBhaW50aW5nIHdoZW4gdmlkZW8gc3RhcnRzIHBsYXlpbmcuIGhhc1RyYW5zaXRpb24oKSB3aWxsIHRoZW4gcmV0dXJuXG4gICAgICAgICAgICAgICAgLy8gdHJ1ZSB0byB0cmlnZ2VyIGFkZGl0aW9uYWwgZnJhbWVzIGFzIGxvbmcgYXMgdGhlIHZpZGVvcyBjb250aW51ZXMgcGxheWluZy5cbiAgICAgICAgICAgICAgICB0aGlzLnZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoJ3BsYXlpbmcnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWFwLnRyaWdnZXJSZXBhaW50KCk7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5tYXApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52aWRlby5wbGF5KCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5fZmluaXNoTG9hZGluZygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBIVE1MIGB2aWRlb2AgZWxlbWVudC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtIVE1MVmlkZW9FbGVtZW50fSBUaGUgSFRNTCBgdmlkZW9gIGVsZW1lbnQuXG4gICAgICovXG4gICAgZ2V0VmlkZW8oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZpZGVvO1xuICAgIH1cblxuICAgIG9uQWRkKG1hcDogTWFwKSB7XG4gICAgICAgIGlmICh0aGlzLm1hcCkgcmV0dXJuO1xuICAgICAgICB0aGlzLm1hcCA9IG1hcDtcbiAgICAgICAgdGhpcy5sb2FkKCk7XG4gICAgICAgIGlmICh0aGlzLnZpZGVvKSB7XG4gICAgICAgICAgICB0aGlzLnZpZGVvLnBsYXkoKTtcbiAgICAgICAgICAgIHRoaXMuc2V0Q29vcmRpbmF0ZXModGhpcy5jb29yZGluYXRlcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSB2aWRlbydzIGNvb3JkaW5hdGVzIGFuZCByZS1yZW5kZXJzIHRoZSBtYXAuXG4gICAgICpcbiAgICAgKiBAbWV0aG9kIHNldENvb3JkaW5hdGVzXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQG1lbWJlcm9mIFZpZGVvU291cmNlXG4gICAgICogQHBhcmFtIHtBcnJheTxBcnJheTxudW1iZXI+Pn0gY29vcmRpbmF0ZXMgRm91ciBnZW9ncmFwaGljYWwgY29vcmRpbmF0ZXMsXG4gICAgICogICByZXByZXNlbnRlZCBhcyBhcnJheXMgb2YgbG9uZ2l0dWRlIGFuZCBsYXRpdHVkZSBudW1iZXJzLCB3aGljaCBkZWZpbmUgdGhlIGNvcm5lcnMgb2YgdGhlIHZpZGVvLlxuICAgICAqICAgVGhlIGNvb3JkaW5hdGVzIHN0YXJ0IGF0IHRoZSB0b3AgbGVmdCBjb3JuZXIgb2YgdGhlIHZpZGVvIGFuZCBwcm9jZWVkIGluIGNsb2Nrd2lzZSBvcmRlci5cbiAgICAgKiAgIFRoZXkgZG8gbm90IGhhdmUgdG8gcmVwcmVzZW50IGEgcmVjdGFuZ2xlLlxuICAgICAqIEByZXR1cm5zIHtWaWRlb1NvdXJjZX0gdGhpc1xuICAgICAqL1xuICAgIC8vIHNldENvb3JkaW5hdGVzIGluaGVyaXRlZCBmcm9tIEltYWdlU291cmNlXG5cbiAgICBwcmVwYXJlKCkge1xuICAgICAgICBpZiAoT2JqZWN0LmtleXModGhpcy50aWxlcykubGVuZ3RoID09PSAwIHx8IHRoaXMudmlkZW8ucmVhZHlTdGF0ZSA8IDIpIHtcbiAgICAgICAgICAgIHJldHVybjsgLy8gbm90IGVub3VnaCBkYXRhIGZvciBjdXJyZW50IHBvc2l0aW9uXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5tYXAucGFpbnRlci5jb250ZXh0O1xuICAgICAgICBjb25zdCBnbCA9IGNvbnRleHQuZ2w7XG5cbiAgICAgICAgaWYgKCF0aGlzLmJvdW5kc0J1ZmZlcikge1xuICAgICAgICAgICAgdGhpcy5ib3VuZHNCdWZmZXIgPSBjb250ZXh0LmNyZWF0ZVZlcnRleEJ1ZmZlcih0aGlzLl9ib3VuZHNBcnJheSwgcmFzdGVyQm91bmRzQXR0cmlidXRlcy5tZW1iZXJzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5ib3VuZHNTZWdtZW50cykge1xuICAgICAgICAgICAgdGhpcy5ib3VuZHNTZWdtZW50cyA9IFNlZ21lbnRWZWN0b3Iuc2ltcGxlU2VnbWVudCgwLCAwLCA0LCAyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy50ZXh0dXJlKSB7XG4gICAgICAgICAgICB0aGlzLnRleHR1cmUgPSBuZXcgVGV4dHVyZShjb250ZXh0LCB0aGlzLnZpZGVvLCBnbC5SR0JBKTtcbiAgICAgICAgICAgIHRoaXMudGV4dHVyZS5iaW5kKGdsLkxJTkVBUiwgZ2wuQ0xBTVBfVE9fRURHRSk7XG4gICAgICAgIH0gZWxzZSBpZiAoIXRoaXMudmlkZW8ucGF1c2VkKSB7XG4gICAgICAgICAgICB0aGlzLnRleHR1cmUuYmluZChnbC5MSU5FQVIsIGdsLkNMQU1QX1RPX0VER0UpO1xuICAgICAgICAgICAgZ2wudGV4U3ViSW1hZ2UyRChnbC5URVhUVVJFXzJELCAwLCAwLCAwLCBnbC5SR0JBLCBnbC5VTlNJR05FRF9CWVRFLCB0aGlzLnZpZGVvKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgdyBpbiB0aGlzLnRpbGVzKSB7XG4gICAgICAgICAgICBjb25zdCB0aWxlID0gdGhpcy50aWxlc1t3XTtcbiAgICAgICAgICAgIGlmICh0aWxlLnN0YXRlICE9PSAnbG9hZGVkJykge1xuICAgICAgICAgICAgICAgIHRpbGUuc3RhdGUgPSAnbG9hZGVkJztcbiAgICAgICAgICAgICAgICB0aWxlLnRleHR1cmUgPSB0aGlzLnRleHR1cmU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXJpYWxpemUoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiAndmlkZW8nLFxuICAgICAgICAgICAgdXJsczogdGhpcy51cmxzLFxuICAgICAgICAgICAgY29vcmRpbmF0ZXM6IHRoaXMuY29vcmRpbmF0ZXNcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBoYXNUcmFuc2l0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy52aWRlbyAmJiAhdGhpcy52aWRlby5wYXVzZWQ7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBWaWRlb1NvdXJjZTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCBJbWFnZVNvdXJjZSBmcm9tICcuL2ltYWdlX3NvdXJjZSc7XG5cbmltcG9ydCB3aW5kb3cgZnJvbSAnLi4vdXRpbC93aW5kb3cnO1xuaW1wb3J0IHJhc3RlckJvdW5kc0F0dHJpYnV0ZXMgZnJvbSAnLi4vZGF0YS9yYXN0ZXJfYm91bmRzX2F0dHJpYnV0ZXMnO1xuaW1wb3J0IFNlZ21lbnRWZWN0b3IgZnJvbSAnLi4vZGF0YS9zZWdtZW50JztcbmltcG9ydCBUZXh0dXJlIGZyb20gJy4uL3JlbmRlci90ZXh0dXJlJztcbmltcG9ydCB7IEVycm9yRXZlbnQgfSBmcm9tICcuLi91dGlsL2V2ZW50ZWQnO1xuaW1wb3J0IFZhbGlkYXRpb25FcnJvciBmcm9tICcuLi9zdHlsZS1zcGVjL2Vycm9yL3ZhbGlkYXRpb25fZXJyb3InO1xuXG5pbXBvcnQgdHlwZSBNYXAgZnJvbSAnLi4vdWkvbWFwJztcbmltcG9ydCB0eXBlIERpc3BhdGNoZXIgZnJvbSAnLi4vdXRpbC9kaXNwYXRjaGVyJztcbmltcG9ydCB0eXBlIHtFdmVudGVkfSBmcm9tICcuLi91dGlsL2V2ZW50ZWQnO1xuXG5leHBvcnQgdHlwZSBDYW52YXNTb3VyY2VTcGVjaWZpY2F0aW9uID0ge3xcbiAgICBcInR5cGVcIjogXCJjYW52YXNcIixcbiAgICBcImNvb3JkaW5hdGVzXCI6IFtbbnVtYmVyLCBudW1iZXJdLCBbbnVtYmVyLCBudW1iZXJdLCBbbnVtYmVyLCBudW1iZXJdLCBbbnVtYmVyLCBudW1iZXJdXSxcbiAgICBcImFuaW1hdGVcIj86IGJvb2xlYW4sXG4gICAgXCJjYW52YXNcIjogc3RyaW5nIHwgSFRNTENhbnZhc0VsZW1lbnRcbnx9O1xuXG4vKipcbiAqIE9wdGlvbnMgdG8gYWRkIGEgY2FudmFzIHNvdXJjZSB0eXBlIHRvIHRoZSBtYXAuXG4gKlxuICogQHR5cGVkZWYge09iamVjdH0gQ2FudmFzU291cmNlT3B0aW9uc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IHR5cGUgU291cmNlIHR5cGUuIE11c3QgYmUgYFwiY2FudmFzXCJgLlxuICogQHByb3BlcnR5IHtzdHJpbmd8SFRNTENhbnZhc0VsZW1lbnR9IGNhbnZhcyBDYW52YXMgc291cmNlIGZyb20gd2hpY2ggdG8gcmVhZCBwaXhlbHMuIENhbiBiZSBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIElEIG9mIHRoZSBjYW52YXMgZWxlbWVudCwgb3IgdGhlIGBIVE1MQ2FudmFzRWxlbWVudGAgaXRzZWxmLlxuICogQHByb3BlcnR5IHtBcnJheTxBcnJheTxudW1iZXI+Pn0gY29vcmRpbmF0ZXMgRm91ciBnZW9ncmFwaGljYWwgY29vcmRpbmF0ZXMgZGVub3Rpbmcgd2hlcmUgdG8gcGxhY2UgdGhlIGNvcm5lcnMgb2YgdGhlIGNhbnZhcywgc3BlY2lmaWVkIGluIGBbbG9uZ2l0dWRlLCBsYXRpdHVkZV1gIHBhaXJzLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbYW5pbWF0ZT10cnVlXSBXaGV0aGVyIHRoZSBjYW52YXMgc291cmNlIGlzIGFuaW1hdGVkLiBJZiB0aGUgY2FudmFzIGlzIHN0YXRpYyAoaS5lLiBwaXhlbHMgZG8gbm90IG5lZWQgdG8gYmUgcmUtcmVhZCBvbiBldmVyeSBmcmFtZSksIGBhbmltYXRlYCBzaG91bGQgYmUgc2V0IHRvIGBmYWxzZWAgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZS5cbiAqL1xuXG4vKipcbiAqIEEgZGF0YSBzb3VyY2UgY29udGFpbmluZyB0aGUgY29udGVudHMgb2YgYW4gSFRNTCBjYW52YXMuIFNlZSB7QGxpbmsgQ2FudmFzU291cmNlT3B0aW9uc30gZm9yIGRldGFpbGVkIGRvY3VtZW50YXRpb24gb2Ygb3B0aW9ucy5cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gYWRkIHRvIG1hcFxuICogbWFwLmFkZFNvdXJjZSgnc29tZSBpZCcsIHtcbiAqICAgIHR5cGU6ICdjYW52YXMnLFxuICogICAgY2FudmFzOiAnaWRPZk15SFRNTENhbnZhcycsXG4gKiAgICBhbmltYXRlOiB0cnVlLFxuICogICAgY29vcmRpbmF0ZXM6IFtcbiAqICAgICAgICBbLTc2LjU0LCAzOS4xOF0sXG4gKiAgICAgICAgWy03Ni41MiwgMzkuMThdLFxuICogICAgICAgIFstNzYuNTIsIDM5LjE3XSxcbiAqICAgICAgICBbLTc2LjU0LCAzOS4xN11cbiAqICAgIF1cbiAqIH0pO1xuICpcbiAqIC8vIHVwZGF0ZVxuICogdmFyIG15U291cmNlID0gbWFwLmdldFNvdXJjZSgnc29tZSBpZCcpO1xuICogbXlTb3VyY2Uuc2V0Q29vcmRpbmF0ZXMoW1xuICogICAgIFstNzYuNTQzMzU3MzcyMjgzOTQsIDM5LjE4NTc5OTA3MjI5NzQ4XSxcbiAqICAgICBbLTc2LjUyODAzNjU5NDM5MDg3LCAzOS4xODM4MzY0ODQ3NTg3XSxcbiAqICAgICBbLTc2LjUyOTUzODYzMTQzOTIsIDM5LjE3NjgzMzkyNTA3NjA2XSxcbiAqICAgICBbLTc2LjU0NTIwMjczMjA4NjE4LCAzOS4xNzg3NjM0NDEwNjY0Ml1cbiAqIF0pO1xuICpcbiAqIG1hcC5yZW1vdmVTb3VyY2UoJ3NvbWUgaWQnKTsgIC8vIHJlbW92ZVxuICovXG5jbGFzcyBDYW52YXNTb3VyY2UgZXh0ZW5kcyBJbWFnZVNvdXJjZSB7XG4gICAgb3B0aW9uczogQ2FudmFzU291cmNlU3BlY2lmaWNhdGlvbjtcbiAgICBhbmltYXRlOiBib29sZWFuO1xuICAgIGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQ7XG4gICAgd2lkdGg6IG51bWJlcjtcbiAgICBoZWlnaHQ6IG51bWJlcjtcbiAgICBwbGF5OiAoKSA9PiB2b2lkO1xuICAgIHBhdXNlOiAoKSA9PiB2b2lkO1xuICAgIF9wbGF5aW5nOiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihpZDogc3RyaW5nLCBvcHRpb25zOiBDYW52YXNTb3VyY2VTcGVjaWZpY2F0aW9uLCBkaXNwYXRjaGVyOiBEaXNwYXRjaGVyLCBldmVudGVkUGFyZW50OiBFdmVudGVkKSB7XG4gICAgICAgIHN1cGVyKGlkLCBvcHRpb25zLCBkaXNwYXRjaGVyLCBldmVudGVkUGFyZW50KTtcblxuICAgICAgICAvLyBXZSBidWlsZCBpbiBzb21lIHZhbGlkYXRpb24gaGVyZSwgc2luY2UgY2FudmFzIHNvdXJjZXMgYXJlbid0IGluY2x1ZGVkIGluIHRoZSBzdHlsZSBzcGVjOlxuICAgICAgICBpZiAoIW9wdGlvbnMuY29vcmRpbmF0ZXMpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXJyb3JFdmVudChuZXcgVmFsaWRhdGlvbkVycm9yKGBzb3VyY2VzLiR7aWR9YCwgbnVsbCwgJ21pc3NpbmcgcmVxdWlyZWQgcHJvcGVydHkgXCJjb29yZGluYXRlc1wiJykpKTtcbiAgICAgICAgfSBlbHNlIGlmICghQXJyYXkuaXNBcnJheShvcHRpb25zLmNvb3JkaW5hdGVzKSB8fCBvcHRpb25zLmNvb3JkaW5hdGVzLmxlbmd0aCAhPT0gNCB8fFxuICAgICAgICAgICAgICAgIG9wdGlvbnMuY29vcmRpbmF0ZXMuc29tZShjID0+ICFBcnJheS5pc0FycmF5KGMpIHx8IGMubGVuZ3RoICE9PSAyIHx8IGMuc29tZShsID0+IHR5cGVvZiBsICE9PSAnbnVtYmVyJykpKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEVycm9yRXZlbnQobmV3IFZhbGlkYXRpb25FcnJvcihgc291cmNlcy4ke2lkfWAsIG51bGwsICdcImNvb3JkaW5hdGVzXCIgcHJvcGVydHkgbXVzdCBiZSBhbiBhcnJheSBvZiA0IGxvbmdpdHVkZS9sYXRpdHVkZSBhcnJheSBwYWlycycpKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucy5hbmltYXRlICYmIHR5cGVvZiBvcHRpb25zLmFuaW1hdGUgIT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFcnJvckV2ZW50KG5ldyBWYWxpZGF0aW9uRXJyb3IoYHNvdXJjZXMuJHtpZH1gLCBudWxsLCAnb3B0aW9uYWwgXCJhbmltYXRlXCIgcHJvcGVydHkgbXVzdCBiZSBhIGJvb2xlYW4gdmFsdWUnKSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFvcHRpb25zLmNhbnZhcykge1xuICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFcnJvckV2ZW50KG5ldyBWYWxpZGF0aW9uRXJyb3IoYHNvdXJjZXMuJHtpZH1gLCBudWxsLCAnbWlzc2luZyByZXF1aXJlZCBwcm9wZXJ0eSBcImNhbnZhc1wiJykpKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygb3B0aW9ucy5jYW52YXMgIT09ICdzdHJpbmcnICYmICEob3B0aW9ucy5jYW52YXMgaW5zdGFuY2VvZiB3aW5kb3cuSFRNTENhbnZhc0VsZW1lbnQpKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEVycm9yRXZlbnQobmV3IFZhbGlkYXRpb25FcnJvcihgc291cmNlcy4ke2lkfWAsIG51bGwsICdcImNhbnZhc1wiIG11c3QgYmUgZWl0aGVyIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgSUQgb2YgdGhlIGNhbnZhcyBlbGVtZW50IGZyb20gd2hpY2ggdG8gcmVhZCwgb3IgYW4gSFRNTENhbnZhc0VsZW1lbnQgaW5zdGFuY2UnKSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICAgICAgdGhpcy5hbmltYXRlID0gb3B0aW9ucy5hbmltYXRlICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmFuaW1hdGUgOiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVuYWJsZXMgYW5pbWF0aW9uLiBUaGUgaW1hZ2Ugd2lsbCBiZSBjb3BpZWQgZnJvbSB0aGUgY2FudmFzIHRvIHRoZSBtYXAgb24gZWFjaCBmcmFtZS5cbiAgICAgKiBAbWV0aG9kIHBsYXlcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAbWVtYmVyb2YgQ2FudmFzU291cmNlXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBEaXNhYmxlcyBhbmltYXRpb24uIFRoZSBtYXAgd2lsbCBkaXNwbGF5IGEgc3RhdGljIGNvcHkgb2YgdGhlIGNhbnZhcyBpbWFnZS5cbiAgICAgKiBAbWV0aG9kIHBhdXNlXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQG1lbWJlcm9mIENhbnZhc1NvdXJjZVxuICAgICAqL1xuXG4gICAgbG9hZCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNhbnZhcykge1xuICAgICAgICAgICAgdGhpcy5jYW52YXMgPSAodGhpcy5vcHRpb25zLmNhbnZhcyBpbnN0YW5jZW9mIHdpbmRvdy5IVE1MQ2FudmFzRWxlbWVudCkgP1xuICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jYW52YXMgOlxuICAgICAgICAgICAgICAgIHdpbmRvdy5kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLm9wdGlvbnMuY2FudmFzKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLndpZHRoID0gdGhpcy5jYW52YXMud2lkdGg7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gdGhpcy5jYW52YXMuaGVpZ2h0O1xuXG4gICAgICAgIGlmICh0aGlzLl9oYXNJbnZhbGlkRGltZW5zaW9ucygpKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEVycm9yRXZlbnQobmV3IEVycm9yKCdDYW52YXMgZGltZW5zaW9ucyBjYW5ub3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHplcm8uJykpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucGxheSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdGhpcy5fcGxheWluZyA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLm1hcC50cmlnZ2VyUmVwYWludCgpO1xuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMucGF1c2UgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9wbGF5aW5nKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcmVwYXJlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fcGxheWluZyA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuX2ZpbmlzaExvYWRpbmcoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBIVE1MIGBjYW52YXNgIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7SFRNTENhbnZhc0VsZW1lbnR9IFRoZSBIVE1MIGBjYW52YXNgIGVsZW1lbnQuXG4gICAgICovXG4gICAgZ2V0Q2FudmFzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jYW52YXM7XG4gICAgfVxuXG4gICAgb25BZGQobWFwOiBNYXApIHtcbiAgICAgICAgdGhpcy5tYXAgPSBtYXA7XG4gICAgICAgIHRoaXMubG9hZCgpO1xuICAgICAgICBpZiAodGhpcy5jYW52YXMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmFuaW1hdGUpIHRoaXMucGxheSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25SZW1vdmUoKSB7XG4gICAgICAgIHRoaXMucGF1c2UoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBjYW52YXMncyBjb29yZGluYXRlcyBhbmQgcmUtcmVuZGVycyB0aGUgbWFwLlxuICAgICAqXG4gICAgICogQG1ldGhvZCBzZXRDb29yZGluYXRlc1xuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBtZW1iZXJvZiBDYW52YXNTb3VyY2VcbiAgICAgKiBAcGFyYW0ge0FycmF5PEFycmF5PG51bWJlcj4+fSBjb29yZGluYXRlcyBGb3VyIGdlb2dyYXBoaWNhbCBjb29yZGluYXRlcyxcbiAgICAgKiAgIHJlcHJlc2VudGVkIGFzIGFycmF5cyBvZiBsb25naXR1ZGUgYW5kIGxhdGl0dWRlIG51bWJlcnMsIHdoaWNoIGRlZmluZSB0aGUgY29ybmVycyBvZiB0aGUgY2FudmFzLlxuICAgICAqICAgVGhlIGNvb3JkaW5hdGVzIHN0YXJ0IGF0IHRoZSB0b3AgbGVmdCBjb3JuZXIgb2YgdGhlIGNhbnZhcyBhbmQgcHJvY2VlZCBpbiBjbG9ja3dpc2Ugb3JkZXIuXG4gICAgICogICBUaGV5IGRvIG5vdCBoYXZlIHRvIHJlcHJlc2VudCBhIHJlY3RhbmdsZS5cbiAgICAgKiBAcmV0dXJucyB7Q2FudmFzU291cmNlfSB0aGlzXG4gICAgICovXG4gICAgLy8gc2V0Q29vcmRpbmF0ZXMgaW5oZXJpdGVkIGZyb20gSW1hZ2VTb3VyY2VcblxuICAgIHByZXBhcmUoKSB7XG4gICAgICAgIGxldCByZXNpemUgPSBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMuY2FudmFzLndpZHRoICE9PSB0aGlzLndpZHRoKSB7XG4gICAgICAgICAgICB0aGlzLndpZHRoID0gdGhpcy5jYW52YXMud2lkdGg7XG4gICAgICAgICAgICByZXNpemUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmNhbnZhcy5oZWlnaHQgIT09IHRoaXMuaGVpZ2h0KSB7XG4gICAgICAgICAgICB0aGlzLmhlaWdodCA9IHRoaXMuY2FudmFzLmhlaWdodDtcbiAgICAgICAgICAgIHJlc2l6ZSA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5faGFzSW52YWxpZERpbWVuc2lvbnMoKSkgcmV0dXJuO1xuXG4gICAgICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLnRpbGVzKS5sZW5ndGggPT09IDApIHJldHVybjsgLy8gbm90IGVub3VnaCBkYXRhIGZvciBjdXJyZW50IHBvc2l0aW9uXG5cbiAgICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMubWFwLnBhaW50ZXIuY29udGV4dDtcbiAgICAgICAgY29uc3QgZ2wgPSBjb250ZXh0LmdsO1xuXG4gICAgICAgIGlmICghdGhpcy5ib3VuZHNCdWZmZXIpIHtcbiAgICAgICAgICAgIHRoaXMuYm91bmRzQnVmZmVyID0gY29udGV4dC5jcmVhdGVWZXJ0ZXhCdWZmZXIodGhpcy5fYm91bmRzQXJyYXksIHJhc3RlckJvdW5kc0F0dHJpYnV0ZXMubWVtYmVycyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuYm91bmRzU2VnbWVudHMpIHtcbiAgICAgICAgICAgIHRoaXMuYm91bmRzU2VnbWVudHMgPSBTZWdtZW50VmVjdG9yLnNpbXBsZVNlZ21lbnQoMCwgMCwgNCwgMik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMudGV4dHVyZSkge1xuICAgICAgICAgICAgdGhpcy50ZXh0dXJlID0gbmV3IFRleHR1cmUoY29udGV4dCwgdGhpcy5jYW52YXMsIGdsLlJHQkEsIHsgcHJlbXVsdGlwbHk6IHRydWUgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAocmVzaXplIHx8IHRoaXMuX3BsYXlpbmcpIHtcbiAgICAgICAgICAgIHRoaXMudGV4dHVyZS51cGRhdGUodGhpcy5jYW52YXMsIHsgcHJlbXVsdGlwbHk6IHRydWUgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IHcgaW4gdGhpcy50aWxlcykge1xuICAgICAgICAgICAgY29uc3QgdGlsZSA9IHRoaXMudGlsZXNbd107XG4gICAgICAgICAgICBpZiAodGlsZS5zdGF0ZSAhPT0gJ2xvYWRlZCcpIHtcbiAgICAgICAgICAgICAgICB0aWxlLnN0YXRlID0gJ2xvYWRlZCc7XG4gICAgICAgICAgICAgICAgdGlsZS50ZXh0dXJlID0gdGhpcy50ZXh0dXJlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2VyaWFsaXplKCk6IE9iamVjdCB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiAnY2FudmFzJyxcbiAgICAgICAgICAgIGNvb3JkaW5hdGVzOiB0aGlzLmNvb3JkaW5hdGVzXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgaGFzVHJhbnNpdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BsYXlpbmc7XG4gICAgfVxuXG4gICAgX2hhc0ludmFsaWREaW1lbnNpb25zKCkge1xuICAgICAgICBmb3IgKGNvbnN0IHggb2YgW3RoaXMuY2FudmFzLndpZHRoLCB0aGlzLmNhbnZhcy5oZWlnaHRdKSB7XG4gICAgICAgICAgICBpZiAoaXNOYU4oeCkgfHwgeCA8PSAwKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBDYW52YXNTb3VyY2U7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgeyBiaW5kQWxsIH0gZnJvbSAnLi4vdXRpbC91dGlsJztcblxuaW1wb3J0IHR5cGUgRGlzcGF0Y2hlciBmcm9tICcuLi91dGlsL2Rpc3BhdGNoZXInO1xuaW1wb3J0IHR5cGUge0V2ZW50LCBFdmVudGVkfSBmcm9tICcuLi91dGlsL2V2ZW50ZWQnO1xuaW1wb3J0IHR5cGUgTWFwIGZyb20gJy4uL3VpL21hcCc7XG5pbXBvcnQgdHlwZSBUaWxlIGZyb20gJy4vdGlsZSc7XG5pbXBvcnQgdHlwZSB7T3ZlcnNjYWxlZFRpbGVJRH0gZnJvbSAnLi90aWxlX2lkJztcbmltcG9ydCB0eXBlIHtDYWxsYmFja30gZnJvbSAnLi4vdHlwZXMvY2FsbGJhY2snO1xuaW1wb3J0IHtDYW5vbmljYWxUaWxlSUR9IGZyb20gJy4vdGlsZV9pZCc7XG5cbi8qKlxuICogVGhlIGBTb3VyY2VgIGludGVyZmFjZSBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IGVhY2ggc291cmNlIHR5cGUsIGluY2x1ZGluZyBcImNvcmVcIiB0eXBlcyAoYHZlY3RvcmAsIGByYXN0ZXJgLFxuICogYHZpZGVvYCwgZXRjLikgYW5kIGFsbCBjdXN0b20sIHRoaXJkLXBhcnR5IHR5cGVzLlxuICpcbiAqIEBwcml2YXRlXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGlkIFRoZSBpZCBmb3IgdGhlIHNvdXJjZS4gTXVzdCBub3QgYmUgdXNlZCBieSBhbnkgZXhpc3Rpbmcgc291cmNlLlxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgU291cmNlIG9wdGlvbnMsIHNwZWNpZmljIHRvIHRoZSBzb3VyY2UgdHlwZSAoZXhjZXB0IGZvciBgb3B0aW9ucy50eXBlYCwgd2hpY2ggaXMgYWx3YXlzXG4gKiByZXF1aXJlZCkuXG4gKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy50eXBlIFRoZSBzb3VyY2UgdHlwZSwgbWF0Y2hpbmcgdGhlIHZhbHVlIG9mIGBuYW1lYCB1c2VkIGluIHtAbGluayBTdHlsZSNhZGRTb3VyY2VUeXBlfS5cbiAqIEBwYXJhbSB7RGlzcGF0Y2hlcn0gZGlzcGF0Y2hlciBBIHtAbGluayBEaXNwYXRjaGVyfSBpbnN0YW5jZSwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gc2VuZCBtZXNzYWdlcyB0byB0aGUgd29ya2Vycy5cbiAqXG4gKiBAZmlyZXMgZGF0YSB3aXRoIGB7ZGF0YVR5cGU6ICdzb3VyY2UnLCBzb3VyY2VEYXRhVHlwZTogJ21ldGFkYXRhJ31gIHRvIGluZGljYXRlIHRoYXQgYW55IG5lY2Vzc2FyeSBtZXRhZGF0YVxuICogaGFzIGJlZW4gbG9hZGVkIHNvIHRoYXQgaXQncyBva2F5IHRvIGNhbGwgYGxvYWRUaWxlYDsgYW5kIHdpdGggYHtkYXRhVHlwZTogJ3NvdXJjZScsIHNvdXJjZURhdGFUeXBlOiAnY29udGVudCd9YFxuICogdG8gaW5kaWNhdGUgdGhhdCB0aGUgc291cmNlIGRhdGEgaGFzIGNoYW5nZWQsIHNvIHRoYXQgYW55IGN1cnJlbnQgY2FjaGVzIHNob3VsZCBiZSBmbHVzaGVkLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGlkIFRoZSBpZCBmb3IgdGhlIHNvdXJjZS4gIE11c3QgbWF0Y2ggdGhlIGlkIHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3IuXG4gKiBAcHJvcGVydHkge251bWJlcn0gbWluem9vbVxuICogQHByb3BlcnR5IHtudW1iZXJ9IG1heHpvb21cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gaXNUaWxlQ2xpcHBlZCBgZmFsc2VgIGlmIHRpbGVzIGNhbiBiZSBkcmF3biBvdXRzaWRlIHRoZWlyIGJvdW5kYXJpZXMsIGB0cnVlYCBpZiB0aGV5IGNhbm5vdC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gcmVwYXJzZU92ZXJzY2FsZWQgYHRydWVgIGlmIHRpbGVzIHNob3VsZCBiZSBzZW50IGJhY2sgdG8gdGhlIHdvcmtlciBmb3IgZWFjaCBvdmVyem9vbWVkIHpvb21cbiAqIGxldmVsLCBgZmFsc2VgIGlmIG5vdC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gcm91bmRab29tIGB0cnVlYCBpZiB6b29tIGxldmVscyBhcmUgcm91bmRlZCB0byB0aGUgbmVhcmVzdCBpbnRlZ2VyIGluIHRoZSBzb3VyY2UgZGF0YSwgYGZhbHNlYFxuICogaWYgdGhleSBhcmUgZmxvb3ItZWQgdG8gdGhlIG5lYXJlc3QgaW50ZWdlci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTb3VyY2Uge1xuICAgICt0eXBlOiBzdHJpbmc7XG4gICAgaWQ6IHN0cmluZztcbiAgICBtaW56b29tOiBudW1iZXIsXG4gICAgbWF4em9vbTogbnVtYmVyLFxuICAgIHRpbGVTaXplOiBudW1iZXIsXG4gICAgYXR0cmlidXRpb24/OiBzdHJpbmcsXG5cbiAgICByb3VuZFpvb20/OiBib29sZWFuLFxuICAgIGlzVGlsZUNsaXBwZWQ/OiBib29sZWFuLFxuICAgIG1hcGJveF9sb2dvPzogYm9vbGVhbixcbiAgICB0aWxlSUQ/OiBDYW5vbmljYWxUaWxlSUQ7XG4gICAgcmVwYXJzZU92ZXJzY2FsZWQ/OiBib29sZWFuLFxuICAgIHZlY3RvckxheWVySWRzPzogQXJyYXk8c3RyaW5nPixcblxuICAgIGhhc1RyYW5zaXRpb24oKTogYm9vbGVhbjtcblxuICAgIGZpcmUoZXZlbnQ6IEV2ZW50KTogbWl4ZWQ7XG5cbiAgICArb25BZGQ/OiAobWFwOiBNYXApID0+IHZvaWQ7XG4gICAgK29uUmVtb3ZlPzogKG1hcDogTWFwKSA9PiB2b2lkO1xuXG4gICAgbG9hZFRpbGUodGlsZTogVGlsZSwgY2FsbGJhY2s6IENhbGxiYWNrPHZvaWQ+KTogdm9pZDtcbiAgICAraGFzVGlsZT86ICh0aWxlSUQ6IE92ZXJzY2FsZWRUaWxlSUQpID0+IGJvb2xlYW47XG4gICAgK2Fib3J0VGlsZT86ICh0aWxlOiBUaWxlLCBjYWxsYmFjazogQ2FsbGJhY2s8dm9pZD4pID0+IHZvaWQ7XG4gICAgK3VubG9hZFRpbGU/OiAodGlsZTogVGlsZSwgY2FsbGJhY2s6IENhbGxiYWNrPHZvaWQ+KSA9PiB2b2lkO1xuXG4gICAgLyoqXG4gICAgICogQHJldHVybnMgQSBwbGFpbiAoc3RyaW5naWZpYWJsZSkgSlMgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgc291cmNlLlxuICAgICAqIENyZWF0aW5nIGEgc291cmNlIHVzaW5nIHRoZSByZXR1cm5lZCBvYmplY3QgYXMgdGhlIGBvcHRpb25zYCBzaG91bGQgcmVzdWx0IGluIGEgU291cmNlIHRoYXQgaXNcbiAgICAgKiBlcXVpdmFsZW50IHRvIHRoaXMgb25lLlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgc2VyaWFsaXplKCk6IE9iamVjdDtcblxuICAgICtwcmVwYXJlPzogKCkgPT4gdm9pZDtcbn1cblxudHlwZSBTb3VyY2VTdGF0aWNzID0ge1xuICAgIC8qKlxuICAgICAqIEFuIG9wdGlvbmFsIFVSTCB0byBhIHNjcmlwdCB3aGljaCwgd2hlbiBydW4gYnkgYSBXb3JrZXIsIHJlZ2lzdGVycyBhIHtAbGluayBXb3JrZXJTb3VyY2V9XG4gICAgICogaW1wbGVtZW50YXRpb24gZm9yIHRoaXMgU291cmNlIHR5cGUgYnkgY2FsbGluZyBgc2VsZi5yZWdpc3RlcldvcmtlclNvdXJjZSh3b3JrZXJTb3VyY2U6IFdvcmtlclNvdXJjZSlgLlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgd29ya2VyU291cmNlVVJMPzogVVJMO1xufTtcblxuZXhwb3J0IHR5cGUgU291cmNlQ2xhc3MgPSBDbGFzczxTb3VyY2U+ICYgU291cmNlU3RhdGljcztcblxuaW1wb3J0IHZlY3RvciBmcm9tICcuLi9zb3VyY2UvdmVjdG9yX3RpbGVfc291cmNlJztcbmltcG9ydCByYXN0ZXIgZnJvbSAnLi4vc291cmNlL3Jhc3Rlcl90aWxlX3NvdXJjZSc7XG5pbXBvcnQgcmFzdGVyRGVtIGZyb20gJy4uL3NvdXJjZS9yYXN0ZXJfZGVtX3RpbGVfc291cmNlJztcbmltcG9ydCBnZW9qc29uIGZyb20gJy4uL3NvdXJjZS9nZW9qc29uX3NvdXJjZSc7XG5pbXBvcnQgdmlkZW8gZnJvbSAnLi4vc291cmNlL3ZpZGVvX3NvdXJjZSc7XG5pbXBvcnQgaW1hZ2UgZnJvbSAnLi4vc291cmNlL2ltYWdlX3NvdXJjZSc7XG5pbXBvcnQgY2FudmFzIGZyb20gJy4uL3NvdXJjZS9jYW52YXNfc291cmNlJztcblxuaW1wb3J0IHR5cGUge1NvdXJjZVNwZWNpZmljYXRpb259IGZyb20gJy4uL3N0eWxlLXNwZWMvdHlwZXMnO1xuXG5jb25zdCBzb3VyY2VUeXBlcyA9IHtcbiAgICB2ZWN0b3IsXG4gICAgcmFzdGVyLFxuICAgICdyYXN0ZXItZGVtJzogcmFzdGVyRGVtLFxuICAgIGdlb2pzb24sXG4gICAgdmlkZW8sXG4gICAgaW1hZ2UsXG4gICAgY2FudmFzXG59O1xuXG4vKlxuICogQ3JlYXRlcyBhIHRpbGVkIGRhdGEgc291cmNlIGluc3RhbmNlIGdpdmVuIGFuIG9wdGlvbnMgb2JqZWN0LlxuICpcbiAqIEBwYXJhbSBpZFxuICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBBIHNvdXJjZSBkZWZpbml0aW9uIG9iamVjdCBjb21wbGlhbnQgd2l0aFxuICogW2BtYXBib3gtZ2wtc3R5bGUtc3BlY2BdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLXN0eWxlLXNwZWMvI3NvdXJjZXMpIG9yLCBmb3IgYSB0aGlyZC1wYXJ0eSBzb3VyY2UgdHlwZSxcbiAgKiB3aXRoIHRoYXQgdHlwZSdzIHJlcXVpcmVtZW50cy5cbiAqIEBwYXJhbSB7RGlzcGF0Y2hlcn0gZGlzcGF0Y2hlclxuICogQHJldHVybnMge1NvdXJjZX1cbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZSA9IGZ1bmN0aW9uKGlkOiBzdHJpbmcsIHNwZWNpZmljYXRpb246IFNvdXJjZVNwZWNpZmljYXRpb24sIGRpc3BhdGNoZXI6IERpc3BhdGNoZXIsIGV2ZW50ZWRQYXJlbnQ6IEV2ZW50ZWQpIHtcbiAgICBjb25zdCBzb3VyY2UgPSBuZXcgc291cmNlVHlwZXNbc3BlY2lmaWNhdGlvbi50eXBlXShpZCwgKHNwZWNpZmljYXRpb246IGFueSksIGRpc3BhdGNoZXIsIGV2ZW50ZWRQYXJlbnQpO1xuXG4gICAgaWYgKHNvdXJjZS5pZCAhPT0gaWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBTb3VyY2UgaWQgdG8gYmUgJHtpZH0gaW5zdGVhZCBvZiAke3NvdXJjZS5pZH1gKTtcbiAgICB9XG5cbiAgICBiaW5kQWxsKFsnbG9hZCcsICdhYm9ydCcsICd1bmxvYWQnLCAnc2VyaWFsaXplJywgJ3ByZXBhcmUnXSwgc291cmNlKTtcbiAgICByZXR1cm4gc291cmNlO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFR5cGUgPSBmdW5jdGlvbiAobmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHNvdXJjZVR5cGVzW25hbWVdO1xufTtcblxuZXhwb3J0IGNvbnN0IHNldFR5cGUgPSBmdW5jdGlvbiAobmFtZTogc3RyaW5nLCB0eXBlOiBDbGFzczxTb3VyY2U+KSB7XG4gICAgc291cmNlVHlwZXNbbmFtZV0gPSB0eXBlO1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBBY3RvciB7XG4gICAgc2VuZCh0eXBlOiBzdHJpbmcsIGRhdGE6IE9iamVjdCwgY2FsbGJhY2s6IENhbGxiYWNrPGFueT4pOiB2b2lkO1xufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHR5cGUgU291cmNlQ2FjaGUgZnJvbSAnLi9zb3VyY2VfY2FjaGUnO1xuaW1wb3J0IHR5cGUgU3R5bGVMYXllciBmcm9tICcuLi9zdHlsZS9zdHlsZV9sYXllcic7XG5pbXBvcnQgdHlwZSBDb2xsaXNpb25JbmRleCBmcm9tICcuLi9zeW1ib2wvY29sbGlzaW9uX2luZGV4JztcbmltcG9ydCB0eXBlIFRyYW5zZm9ybSBmcm9tICcuLi9nZW8vdHJhbnNmb3JtJztcbmltcG9ydCB0eXBlIHsgUmV0YWluZWRRdWVyeURhdGEgfSBmcm9tICcuLi9zeW1ib2wvcGxhY2VtZW50JztcbmltcG9ydCB0eXBlIHtGaWx0ZXJTcGVjaWZpY2F0aW9ufSBmcm9tICcuLi9zdHlsZS1zcGVjL3R5cGVzJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7IG1hdDQgfSBmcm9tICdnbC1tYXRyaXgnO1xuXG4vKlxuICogUmV0dXJucyBhIG1hdHJpeCB0aGF0IGNhbiBiZSB1c2VkIHRvIGNvbnZlcnQgZnJvbSB0aWxlIGNvb3JkaW5hdGVzIHRvIHZpZXdwb3J0IHBpeGVsIGNvb3JkaW5hdGVzLlxuICovXG5mdW5jdGlvbiBnZXRQaXhlbFBvc01hdHJpeCh0cmFuc2Zvcm0sIHRpbGVJRCkge1xuICAgIGNvbnN0IHQgPSBtYXQ0LmlkZW50aXR5KFtdKTtcbiAgICBtYXQ0LnRyYW5zbGF0ZSh0LCB0LCBbMSwgMSwgMF0pO1xuICAgIG1hdDQuc2NhbGUodCwgdCwgW3RyYW5zZm9ybS53aWR0aCAqIDAuNSwgdHJhbnNmb3JtLmhlaWdodCAqIDAuNSwgMV0pO1xuICAgIHJldHVybiBtYXQ0Lm11bHRpcGx5KHQsIHQsIHRyYW5zZm9ybS5jYWxjdWxhdGVQb3NNYXRyaXgodGlsZUlELnRvVW53cmFwcGVkKCkpKTtcbn1cblxuZnVuY3Rpb24gcXVlcnlJbmNsdWRlczNETGF5ZXIobGF5ZXJzPzogQXJyYXk8c3RyaW5nPiwgc3R5bGVMYXllcnM6IHtbc3RyaW5nXTogU3R5bGVMYXllcn0sIHNvdXJjZUlEOiBzdHJpbmcpIHtcbiAgICBpZiAobGF5ZXJzKSB7XG4gICAgICAgIGZvciAoY29uc3QgbGF5ZXJJRCBvZiBsYXllcnMpIHtcbiAgICAgICAgICAgIGNvbnN0IGxheWVyID0gc3R5bGVMYXllcnNbbGF5ZXJJRF07XG4gICAgICAgICAgICBpZiAobGF5ZXIgJiYgbGF5ZXIuc291cmNlID09PSBzb3VyY2VJRCAmJiBsYXllci50eXBlID09PSAnZmlsbC1leHRydXNpb24nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBzdHlsZUxheWVycykge1xuICAgICAgICAgICAgY29uc3QgbGF5ZXIgPSBzdHlsZUxheWVyc1trZXldO1xuICAgICAgICAgICAgaWYgKGxheWVyLnNvdXJjZSA9PT0gc291cmNlSUQgJiYgbGF5ZXIudHlwZSA9PT0gJ2ZpbGwtZXh0cnVzaW9uJykge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHF1ZXJ5UmVuZGVyZWRGZWF0dXJlcyhzb3VyY2VDYWNoZTogU291cmNlQ2FjaGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVMYXllcnM6IHtbc3RyaW5nXTogU3R5bGVMYXllcn0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlHZW9tZXRyeTogQXJyYXk8UG9pbnQ+LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtczogeyBmaWx0ZXI6IEZpbHRlclNwZWNpZmljYXRpb24sIGxheWVyczogQXJyYXk8c3RyaW5nPiB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogVHJhbnNmb3JtKSB7XG5cbiAgICBjb25zdCBoYXMzRExheWVyID0gcXVlcnlJbmNsdWRlczNETGF5ZXIocGFyYW1zICYmIHBhcmFtcy5sYXllcnMsIHN0eWxlTGF5ZXJzLCBzb3VyY2VDYWNoZS5pZCk7XG5cbiAgICBjb25zdCBtYXhQaXRjaFNjYWxlRmFjdG9yID0gdHJhbnNmb3JtLm1heFBpdGNoU2NhbGVGYWN0b3IoKTtcbiAgICBjb25zdCB0aWxlc0luID0gc291cmNlQ2FjaGUudGlsZXNJbihxdWVyeUdlb21ldHJ5LCBtYXhQaXRjaFNjYWxlRmFjdG9yLCBoYXMzRExheWVyKTtcblxuICAgIHRpbGVzSW4uc29ydChzb3J0VGlsZXNJbik7XG5cbiAgICBjb25zdCByZW5kZXJlZEZlYXR1cmVMYXllcnMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IHRpbGVJbiBvZiB0aWxlc0luKSB7XG4gICAgICAgIHJlbmRlcmVkRmVhdHVyZUxheWVycy5wdXNoKHtcbiAgICAgICAgICAgIHdyYXBwZWRUaWxlSUQ6IHRpbGVJbi50aWxlSUQud3JhcHBlZCgpLmtleSxcbiAgICAgICAgICAgIHF1ZXJ5UmVzdWx0czogdGlsZUluLnRpbGUucXVlcnlSZW5kZXJlZEZlYXR1cmVzKFxuICAgICAgICAgICAgICAgIHN0eWxlTGF5ZXJzLFxuICAgICAgICAgICAgICAgIHNvdXJjZUNhY2hlLl9zdGF0ZSxcbiAgICAgICAgICAgICAgICB0aWxlSW4ucXVlcnlHZW9tZXRyeSxcbiAgICAgICAgICAgICAgICB0aWxlSW4uY2FtZXJhUXVlcnlHZW9tZXRyeSxcbiAgICAgICAgICAgICAgICB0aWxlSW4uc2NhbGUsXG4gICAgICAgICAgICAgICAgcGFyYW1zLFxuICAgICAgICAgICAgICAgIHRyYW5zZm9ybSxcbiAgICAgICAgICAgICAgICBtYXhQaXRjaFNjYWxlRmFjdG9yLFxuICAgICAgICAgICAgICAgIGdldFBpeGVsUG9zTWF0cml4KHNvdXJjZUNhY2hlLnRyYW5zZm9ybSwgdGlsZUluLnRpbGVJRCkpXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IG1lcmdlUmVuZGVyZWRGZWF0dXJlTGF5ZXJzKHJlbmRlcmVkRmVhdHVyZUxheWVycyk7XG5cbiAgICAvLyBNZXJnZSBzdGF0ZSBmcm9tIFNvdXJjZUNhY2hlIGludG8gdGhlIHJlc3VsdHNcbiAgICBmb3IgKGNvbnN0IGxheWVySUQgaW4gcmVzdWx0KSB7XG4gICAgICAgIHJlc3VsdFtsYXllcklEXS5mb3JFYWNoKChmZWF0dXJlV3JhcHBlcikgPT4ge1xuICAgICAgICAgICAgY29uc3QgZmVhdHVyZSA9IGZlYXR1cmVXcmFwcGVyLmZlYXR1cmU7XG4gICAgICAgICAgICBjb25zdCBzdGF0ZSA9IHNvdXJjZUNhY2hlLmdldEZlYXR1cmVTdGF0ZShmZWF0dXJlLmxheWVyWydzb3VyY2UtbGF5ZXInXSwgZmVhdHVyZS5pZCk7XG4gICAgICAgICAgICBmZWF0dXJlLnNvdXJjZSA9IGZlYXR1cmUubGF5ZXIuc291cmNlO1xuICAgICAgICAgICAgaWYgKGZlYXR1cmUubGF5ZXJbJ3NvdXJjZS1sYXllciddKSB7XG4gICAgICAgICAgICAgICAgZmVhdHVyZS5zb3VyY2VMYXllciA9IGZlYXR1cmUubGF5ZXJbJ3NvdXJjZS1sYXllciddO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmVhdHVyZS5zdGF0ZSA9IHN0YXRlO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHF1ZXJ5UmVuZGVyZWRTeW1ib2xzKHN0eWxlTGF5ZXJzOiB7W3N0cmluZ106IFN0eWxlTGF5ZXJ9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZUNhY2hlczoge1tzdHJpbmddOiBTb3VyY2VDYWNoZX0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlHZW9tZXRyeTogQXJyYXk8UG9pbnQ+LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtczogeyBmaWx0ZXI6IEZpbHRlclNwZWNpZmljYXRpb24sIGxheWVyczogQXJyYXk8c3RyaW5nPiB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxpc2lvbkluZGV4OiBDb2xsaXNpb25JbmRleCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRhaW5lZFF1ZXJ5RGF0YToge1tudW1iZXJdOiBSZXRhaW5lZFF1ZXJ5RGF0YX0pIHtcbiAgICBjb25zdCByZXN1bHQgPSB7fTtcbiAgICBjb25zdCByZW5kZXJlZFN5bWJvbHMgPSBjb2xsaXNpb25JbmRleC5xdWVyeVJlbmRlcmVkU3ltYm9scyhxdWVyeUdlb21ldHJ5KTtcbiAgICBjb25zdCBidWNrZXRRdWVyeURhdGEgPSBbXTtcbiAgICBmb3IgKGNvbnN0IGJ1Y2tldEluc3RhbmNlSWQgb2YgT2JqZWN0LmtleXMocmVuZGVyZWRTeW1ib2xzKS5tYXAoTnVtYmVyKSkge1xuICAgICAgICBidWNrZXRRdWVyeURhdGEucHVzaChyZXRhaW5lZFF1ZXJ5RGF0YVtidWNrZXRJbnN0YW5jZUlkXSk7XG4gICAgfVxuICAgIGJ1Y2tldFF1ZXJ5RGF0YS5zb3J0KHNvcnRUaWxlc0luKTtcblxuICAgIGZvciAoY29uc3QgcXVlcnlEYXRhIG9mIGJ1Y2tldFF1ZXJ5RGF0YSkge1xuICAgICAgICBjb25zdCBidWNrZXRTeW1ib2xzID0gcXVlcnlEYXRhLmZlYXR1cmVJbmRleC5sb29rdXBTeW1ib2xGZWF0dXJlcyhcbiAgICAgICAgICAgICAgICByZW5kZXJlZFN5bWJvbHNbcXVlcnlEYXRhLmJ1Y2tldEluc3RhbmNlSWRdLFxuICAgICAgICAgICAgICAgIHF1ZXJ5RGF0YS5idWNrZXRJbmRleCxcbiAgICAgICAgICAgICAgICBxdWVyeURhdGEuc291cmNlTGF5ZXJJbmRleCxcbiAgICAgICAgICAgICAgICBwYXJhbXMuZmlsdGVyLFxuICAgICAgICAgICAgICAgIHBhcmFtcy5sYXllcnMsXG4gICAgICAgICAgICAgICAgc3R5bGVMYXllcnMpO1xuXG4gICAgICAgIGZvciAoY29uc3QgbGF5ZXJJRCBpbiBidWNrZXRTeW1ib2xzKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHRGZWF0dXJlcyA9IHJlc3VsdFtsYXllcklEXSA9IHJlc3VsdFtsYXllcklEXSB8fCBbXTtcbiAgICAgICAgICAgIGNvbnN0IGxheWVyU3ltYm9scyA9IGJ1Y2tldFN5bWJvbHNbbGF5ZXJJRF07XG4gICAgICAgICAgICBsYXllclN5bWJvbHMuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICAgICAgICAgIC8vIE1hdGNoIHRvcERvd25GZWF0dXJlQ29tcGFyYXRvciBmcm9tIEZlYXR1cmVJbmRleCwgYnV0IHVzaW5nXG4gICAgICAgICAgICAgICAgLy8gbW9zdCByZWNlbnQgc29ydGluZyBvZiBmZWF0dXJlcyBmcm9tIGJ1Y2tldC5zb3J0RmVhdHVyZXNcbiAgICAgICAgICAgICAgICBjb25zdCBmZWF0dXJlU29ydE9yZGVyID0gcXVlcnlEYXRhLmZlYXR1cmVTb3J0T3JkZXI7XG4gICAgICAgICAgICAgICAgaWYgKGZlYXR1cmVTb3J0T3JkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gcXVlcnlSZW5kZXJlZFN5bWJvbHMgZG9jdW1lbnRhdGlvbiBzYXlzIHdlJ2xsIHJldHVybiBmZWF0dXJlcyBpblxuICAgICAgICAgICAgICAgICAgICAvLyBcInRvcC10by1ib3R0b21cIiByZW5kZXJpbmcgb3JkZXIgKGFrYSBsYXN0LXRvLWZpcnN0KS5cbiAgICAgICAgICAgICAgICAgICAgLy8gQWN0dWFsbHkgdGhlcmUgY2FuIGJlIG11bHRpcGxlIHN5bWJvbCBpbnN0YW5jZXMgcGVyIGZlYXR1cmUsIHNvXG4gICAgICAgICAgICAgICAgICAgIC8vIHdlIHNvcnQgZWFjaCBmZWF0dXJlIGJhc2VkIG9uIHRoZSBmaXJzdCBtYXRjaGluZyBzeW1ib2wgaW5zdGFuY2UuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNvcnRlZEEgPSBmZWF0dXJlU29ydE9yZGVyLmluZGV4T2YoYS5mZWF0dXJlSW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzb3J0ZWRCID0gZmVhdHVyZVNvcnRPcmRlci5pbmRleE9mKGIuZmVhdHVyZUluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHNvcnRlZEEgPj0gMCk7XG4gICAgICAgICAgICAgICAgICAgIGFzc2VydChzb3J0ZWRCID49IDApO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc29ydGVkQiAtIHNvcnRlZEE7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQnVja2V0IGhhc24ndCBiZWVuIHJlLXNvcnRlZCBiYXNlZCBvbiBhbmdsZSwgc28gdXNlIHRoZVxuICAgICAgICAgICAgICAgICAgICAvLyByZXZlcnNlIG9mIHRoZSBvcmRlciB0aGUgZmVhdHVyZXMgYXBwZWFyZWQgaW4gdGhlIGRhdGEuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBiLmZlYXR1cmVJbmRleCAtIGEuZmVhdHVyZUluZGV4O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZm9yIChjb25zdCBzeW1ib2xGZWF0dXJlIG9mIGxheWVyU3ltYm9scykge1xuICAgICAgICAgICAgICAgIHJlc3VsdEZlYXR1cmVzLnB1c2goc3ltYm9sRmVhdHVyZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBNZXJnZSBzdGF0ZSBmcm9tIFNvdXJjZUNhY2hlIGludG8gdGhlIHJlc3VsdHNcbiAgICBmb3IgKGNvbnN0IGxheWVyTmFtZSBpbiByZXN1bHQpIHtcbiAgICAgICAgcmVzdWx0W2xheWVyTmFtZV0uZm9yRWFjaCgoZmVhdHVyZVdyYXBwZXIpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZlYXR1cmUgPSBmZWF0dXJlV3JhcHBlci5mZWF0dXJlO1xuICAgICAgICAgICAgY29uc3QgbGF5ZXIgPSBzdHlsZUxheWVyc1tsYXllck5hbWVdO1xuICAgICAgICAgICAgY29uc3Qgc291cmNlQ2FjaGUgPSBzb3VyY2VDYWNoZXNbbGF5ZXIuc291cmNlXTtcbiAgICAgICAgICAgIGNvbnN0IHN0YXRlID0gc291cmNlQ2FjaGUuZ2V0RmVhdHVyZVN0YXRlKGZlYXR1cmUubGF5ZXJbJ3NvdXJjZS1sYXllciddLCBmZWF0dXJlLmlkKTtcbiAgICAgICAgICAgIGZlYXR1cmUuc291cmNlID0gZmVhdHVyZS5sYXllci5zb3VyY2U7XG4gICAgICAgICAgICBpZiAoZmVhdHVyZS5sYXllclsnc291cmNlLWxheWVyJ10pIHtcbiAgICAgICAgICAgICAgICBmZWF0dXJlLnNvdXJjZUxheWVyID0gZmVhdHVyZS5sYXllclsnc291cmNlLWxheWVyJ107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmZWF0dXJlLnN0YXRlID0gc3RhdGU7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcXVlcnlTb3VyY2VGZWF0dXJlcyhzb3VyY2VDYWNoZTogU291cmNlQ2FjaGUsIHBhcmFtczogYW55KSB7XG4gICAgY29uc3QgdGlsZXMgPSBzb3VyY2VDYWNoZS5nZXRSZW5kZXJhYmxlSWRzKCkubWFwKChpZCkgPT4ge1xuICAgICAgICByZXR1cm4gc291cmNlQ2FjaGUuZ2V0VGlsZUJ5SUQoaWQpO1xuICAgIH0pO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gW107XG5cbiAgICBjb25zdCBkYXRhVGlsZXMgPSB7fTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRpbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHRpbGUgPSB0aWxlc1tpXTtcbiAgICAgICAgY29uc3QgZGF0YUlEID0gdGlsZS50aWxlSUQuY2Fub25pY2FsLmtleTtcbiAgICAgICAgaWYgKCFkYXRhVGlsZXNbZGF0YUlEXSkge1xuICAgICAgICAgICAgZGF0YVRpbGVzW2RhdGFJRF0gPSB0cnVlO1xuICAgICAgICAgICAgdGlsZS5xdWVyeVNvdXJjZUZlYXR1cmVzKHJlc3VsdCwgcGFyYW1zKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIHNvcnRUaWxlc0luKGEsIGIpIHtcbiAgICBjb25zdCBpZEEgPSBhLnRpbGVJRDtcbiAgICBjb25zdCBpZEIgPSBiLnRpbGVJRDtcbiAgICByZXR1cm4gKGlkQS5vdmVyc2NhbGVkWiAtIGlkQi5vdmVyc2NhbGVkWikgfHwgKGlkQS5jYW5vbmljYWwueSAtIGlkQi5jYW5vbmljYWwueSkgfHwgKGlkQS53cmFwIC0gaWRCLndyYXApIHx8IChpZEEuY2Fub25pY2FsLnggLSBpZEIuY2Fub25pY2FsLngpO1xufVxuXG5mdW5jdGlvbiBtZXJnZVJlbmRlcmVkRmVhdHVyZUxheWVycyh0aWxlcykge1xuICAgIC8vIE1lcmdlIHJlc3VsdHMgZnJvbSBhbGwgdGlsZXMsIGJ1dCBpZiB0d28gdGlsZXMgc2hhcmUgdGhlIHNhbWVcbiAgICAvLyB3cmFwcGVkIElELCBkb24ndCBkdXBsaWNhdGUgZmVhdHVyZXMgYmV0d2VlbiB0aGUgdHdvIHRpbGVzXG4gICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgY29uc3Qgd3JhcHBlZElETGF5ZXJNYXAgPSB7fTtcbiAgICBmb3IgKGNvbnN0IHRpbGUgb2YgdGlsZXMpIHtcbiAgICAgICAgY29uc3QgcXVlcnlSZXN1bHRzID0gdGlsZS5xdWVyeVJlc3VsdHM7XG4gICAgICAgIGNvbnN0IHdyYXBwZWRJRCA9IHRpbGUud3JhcHBlZFRpbGVJRDtcbiAgICAgICAgY29uc3Qgd3JhcHBlZElETGF5ZXJzID0gd3JhcHBlZElETGF5ZXJNYXBbd3JhcHBlZElEXSA9IHdyYXBwZWRJRExheWVyTWFwW3dyYXBwZWRJRF0gfHwge307XG4gICAgICAgIGZvciAoY29uc3QgbGF5ZXJJRCBpbiBxdWVyeVJlc3VsdHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHRpbGVGZWF0dXJlcyA9IHF1ZXJ5UmVzdWx0c1tsYXllcklEXTtcbiAgICAgICAgICAgIGNvbnN0IHdyYXBwZWRJREZlYXR1cmVzID0gd3JhcHBlZElETGF5ZXJzW2xheWVySURdID0gd3JhcHBlZElETGF5ZXJzW2xheWVySURdIHx8IHt9O1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0RmVhdHVyZXMgPSByZXN1bHRbbGF5ZXJJRF0gPSByZXN1bHRbbGF5ZXJJRF0gfHwgW107XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHRpbGVGZWF0dXJlIG9mIHRpbGVGZWF0dXJlcykge1xuICAgICAgICAgICAgICAgIGlmICghd3JhcHBlZElERmVhdHVyZXNbdGlsZUZlYXR1cmUuZmVhdHVyZUluZGV4XSkge1xuICAgICAgICAgICAgICAgICAgICB3cmFwcGVkSURGZWF0dXJlc1t0aWxlRmVhdHVyZS5mZWF0dXJlSW5kZXhdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0RmVhdHVyZXMucHVzaCh0aWxlRmVhdHVyZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgeyBPdmVyc2NhbGVkVGlsZUlEIH0gZnJvbSAnLi90aWxlX2lkJztcbmltcG9ydCB0eXBlIFRpbGUgZnJvbSAnLi90aWxlJztcblxuLyoqXG4gKiBBIFtsZWFzdC1yZWNlbnRseS11c2VkIGNhY2hlXShodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0NhY2hlX2FsZ29yaXRobXMpXG4gKiB3aXRoIGhhc2ggbG9va3VwIG1hZGUgcG9zc2libGUgYnkga2VlcGluZyBhIGxpc3Qgb2Yga2V5cyBpbiBwYXJhbGxlbCB0b1xuICogYW4gYXJyYXkgb2YgZGljdGlvbmFyeSBvZiB2YWx1ZXNcbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBUaWxlQ2FjaGUge1xuICAgIG1heDogbnVtYmVyO1xuICAgIGRhdGE6IHtba2V5OiBudW1iZXIgfCBzdHJpbmddOiBBcnJheTx7IHZhbHVlOiBUaWxlLCB0aW1lb3V0OiA/VGltZW91dElEfT59O1xuICAgIG9yZGVyOiBBcnJheTxudW1iZXI+O1xuICAgIG9uUmVtb3ZlOiAoZWxlbWVudDogVGlsZSkgPT4gdm9pZDtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbWF4IG51bWJlciBvZiBwZXJtaXR0ZWQgdmFsdWVzXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25SZW1vdmUgY2FsbGJhY2sgY2FsbGVkIHdpdGggaXRlbXMgd2hlbiB0aGV5IGV4cGlyZVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG1heDogbnVtYmVyLCBvblJlbW92ZTogKGVsZW1lbnQ6IFRpbGUpID0+IHZvaWQpIHtcbiAgICAgICAgdGhpcy5tYXggPSBtYXg7XG4gICAgICAgIHRoaXMub25SZW1vdmUgPSBvblJlbW92ZTtcbiAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsZWFyIHRoZSBjYWNoZVxuICAgICAqXG4gICAgICogQHJldHVybnMge1RpbGVDYWNoZX0gdGhpcyBjYWNoZVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcmVzZXQoKSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMuZGF0YSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCByZW1vdmVkRGF0YSBvZiB0aGlzLmRhdGFba2V5XSkge1xuICAgICAgICAgICAgICAgIGlmIChyZW1vdmVkRGF0YS50aW1lb3V0KSBjbGVhclRpbWVvdXQocmVtb3ZlZERhdGEudGltZW91dCk7XG4gICAgICAgICAgICAgICAgdGhpcy5vblJlbW92ZShyZW1vdmVkRGF0YS52YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmRhdGEgPSB7fTtcbiAgICAgICAgdGhpcy5vcmRlciA9IFtdO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZCBhIGtleSwgdmFsdWUgY29tYmluYXRpb24gdG8gdGhlIGNhY2hlLCB0cmltbWluZyBpdHMgc2l6ZSBpZiB0aGlzIHB1c2hlc1xuICAgICAqIGl0IG92ZXIgbWF4IGxlbmd0aC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T3ZlcnNjYWxlZFRpbGVJRH0gdGlsZUlEIGxvb2t1cCBrZXkgZm9yIHRoZSBpdGVtXG4gICAgICogQHBhcmFtIHsqfSBkYXRhIGFueSB2YWx1ZVxuICAgICAqXG4gICAgICogQHJldHVybnMge1RpbGVDYWNoZX0gdGhpcyBjYWNoZVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgYWRkKHRpbGVJRDogT3ZlcnNjYWxlZFRpbGVJRCwgZGF0YTogVGlsZSwgZXhwaXJ5VGltZW91dDogbnVtYmVyIHwgdm9pZCkge1xuICAgICAgICBjb25zdCBrZXkgPSB0aWxlSUQud3JhcHBlZCgpLmtleTtcbiAgICAgICAgaWYgKHRoaXMuZGF0YVtrZXldID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YVtrZXldID0gW107XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkYXRhV3JhcHBlciA9IHtcbiAgICAgICAgICAgIHZhbHVlOiBkYXRhLFxuICAgICAgICAgICAgdGltZW91dDogdW5kZWZpbmVkXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKGV4cGlyeVRpbWVvdXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZGF0YVdyYXBwZXIudGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlKHRpbGVJRCwgZGF0YVdyYXBwZXIpO1xuICAgICAgICAgICAgfSwgZXhwaXJ5VGltZW91dCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmRhdGFba2V5XS5wdXNoKGRhdGFXcmFwcGVyKTtcbiAgICAgICAgdGhpcy5vcmRlci5wdXNoKGtleSk7XG5cbiAgICAgICAgaWYgKHRoaXMub3JkZXIubGVuZ3RoID4gdGhpcy5tYXgpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlbW92ZWREYXRhID0gdGhpcy5fZ2V0QW5kUmVtb3ZlQnlLZXkodGhpcy5vcmRlclswXSk7XG4gICAgICAgICAgICBpZiAocmVtb3ZlZERhdGEpIHRoaXMub25SZW1vdmUocmVtb3ZlZERhdGEpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHZhbHVlIGF0dGFjaGVkIHRvIGBrZXlgIGlzIHByZXNlbnRcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T3ZlcnNjYWxlZFRpbGVJRH0gdGlsZUlEIHRoZSBrZXkgdG8gYmUgbG9va2VkLXVwXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IHdoZXRoZXIgdGhlIGNhY2hlIGhhcyB0aGlzIHZhbHVlXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBoYXModGlsZUlEOiBPdmVyc2NhbGVkVGlsZUlEKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aWxlSUQud3JhcHBlZCgpLmtleSBpbiB0aGlzLmRhdGE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSB2YWx1ZSBhdHRhY2hlZCB0byBhIHNwZWNpZmljIGtleSBhbmQgcmVtb3ZlIGRhdGEgZnJvbSBjYWNoZS5cbiAgICAgKiBJZiB0aGUga2V5IGlzIG5vdCBmb3VuZCwgcmV0dXJucyBgbnVsbGBcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T3ZlcnNjYWxlZFRpbGVJRH0gdGlsZUlEIHRoZSBrZXkgdG8gbG9vayB1cFxuICAgICAqIEByZXR1cm5zIHsqfSB0aGUgZGF0YSwgb3IgbnVsbCBpZiBpdCBpc24ndCBmb3VuZFxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgZ2V0QW5kUmVtb3ZlKHRpbGVJRDogT3ZlcnNjYWxlZFRpbGVJRCk6ID9UaWxlIHtcbiAgICAgICAgaWYgKCF0aGlzLmhhcyh0aWxlSUQpKSB7IHJldHVybiBudWxsOyB9XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRBbmRSZW1vdmVCeUtleSh0aWxlSUQud3JhcHBlZCgpLmtleSk7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBHZXQgYW5kIHJlbW92ZSB0aGUgdmFsdWUgd2l0aCB0aGUgc3BlY2lmaWVkIGtleS5cbiAgICAgKi9cbiAgICBfZ2V0QW5kUmVtb3ZlQnlLZXkoa2V5OiBudW1iZXIpOiA/VGlsZSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmRhdGFba2V5XS5zaGlmdCgpO1xuICAgICAgICBpZiAoZGF0YS50aW1lb3V0KSBjbGVhclRpbWVvdXQoZGF0YS50aW1lb3V0KTtcblxuICAgICAgICBpZiAodGhpcy5kYXRhW2tleV0ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5kYXRhW2tleV07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vcmRlci5zcGxpY2UodGhpcy5vcmRlci5pbmRleE9mKGtleSksIDEpO1xuXG4gICAgICAgIHJldHVybiBkYXRhLnZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgdmFsdWUgYXR0YWNoZWQgdG8gYSBzcGVjaWZpYyBrZXkgd2l0aG91dCByZW1vdmluZyBkYXRhXG4gICAgICogZnJvbSB0aGUgY2FjaGUuIElmIHRoZSBrZXkgaXMgbm90IGZvdW5kLCByZXR1cm5zIGBudWxsYFxuICAgICAqXG4gICAgICogQHBhcmFtIHtPdmVyc2NhbGVkVGlsZUlEfSB0aWxlSUQgdGhlIGtleSB0byBsb29rIHVwXG4gICAgICogQHJldHVybnMgeyp9IHRoZSBkYXRhLCBvciBudWxsIGlmIGl0IGlzbid0IGZvdW5kXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBnZXQodGlsZUlEOiBPdmVyc2NhbGVkVGlsZUlEKTogP1RpbGUge1xuICAgICAgICBpZiAoIXRoaXMuaGFzKHRpbGVJRCkpIHsgcmV0dXJuIG51bGw7IH1cblxuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5kYXRhW3RpbGVJRC53cmFwcGVkKCkua2V5XVswXTtcbiAgICAgICAgcmV0dXJuIGRhdGEudmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGEga2V5L3ZhbHVlIGNvbWJpbmF0aW9uIGZyb20gdGhlIGNhY2hlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPdmVyc2NhbGVkVGlsZUlEfSB0aWxlSUQgdGhlIGtleSBmb3IgdGhlIHBhaXIgdG8gZGVsZXRlXG4gICAgICogQHBhcmFtIHtUaWxlfSB2YWx1ZSBJZiBhIHZhbHVlIGlzIHByb3ZpZGVkLCByZW1vdmUgdGhhdCBleGFjdCB2ZXJzaW9uIG9mIHRoZSB2YWx1ZS5cbiAgICAgKiBAcmV0dXJucyB7VGlsZUNhY2hlfSB0aGlzIGNhY2hlXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICByZW1vdmUodGlsZUlEOiBPdmVyc2NhbGVkVGlsZUlELCB2YWx1ZTogP3sgdmFsdWU6IFRpbGUsIHRpbWVvdXQ6ID9UaW1lb3V0SUR9KSB7XG4gICAgICAgIGlmICghdGhpcy5oYXModGlsZUlEKSkgeyByZXR1cm4gdGhpczsgfVxuICAgICAgICBjb25zdCBrZXkgPSB0aWxlSUQud3JhcHBlZCgpLmtleTtcblxuICAgICAgICBjb25zdCBkYXRhSW5kZXggPSB2YWx1ZSA9PT0gdW5kZWZpbmVkID8gMCA6IHRoaXMuZGF0YVtrZXldLmluZGV4T2YodmFsdWUpO1xuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5kYXRhW2tleV1bZGF0YUluZGV4XTtcbiAgICAgICAgdGhpcy5kYXRhW2tleV0uc3BsaWNlKGRhdGFJbmRleCwgMSk7XG4gICAgICAgIGlmIChkYXRhLnRpbWVvdXQpIGNsZWFyVGltZW91dChkYXRhLnRpbWVvdXQpO1xuICAgICAgICBpZiAodGhpcy5kYXRhW2tleV0ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5kYXRhW2tleV07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vblJlbW92ZShkYXRhLnZhbHVlKTtcbiAgICAgICAgdGhpcy5vcmRlci5zcGxpY2UodGhpcy5vcmRlci5pbmRleE9mKGtleSksIDEpO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoYW5nZSB0aGUgbWF4IHNpemUgb2YgdGhlIGNhY2hlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG1heCB0aGUgbWF4IHNpemUgb2YgdGhlIGNhY2hlXG4gICAgICogQHJldHVybnMge1RpbGVDYWNoZX0gdGhpcyBjYWNoZVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgc2V0TWF4U2l6ZShtYXg6IG51bWJlcik6IFRpbGVDYWNoZSB7XG4gICAgICAgIHRoaXMubWF4ID0gbWF4O1xuXG4gICAgICAgIHdoaWxlICh0aGlzLm9yZGVyLmxlbmd0aCA+IHRoaXMubWF4KSB7XG4gICAgICAgICAgICBjb25zdCByZW1vdmVkRGF0YSA9IHRoaXMuX2dldEFuZFJlbW92ZUJ5S2V5KHRoaXMub3JkZXJbMF0pO1xuICAgICAgICAgICAgaWYgKHJlbW92ZWREYXRhKSB0aGlzLm9uUmVtb3ZlKHJlbW92ZWREYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgVGlsZUNhY2hlO1xuIiwiLy8gQGZsb3dcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcblxuaW1wb3J0IHR5cGUge1N0cnVjdEFycmF5fSBmcm9tICcuLi91dGlsL3N0cnVjdF9hcnJheSc7XG5pbXBvcnQgdHlwZSB7VHJpYW5nbGVJbmRleEFycmF5LCBMaW5lSW5kZXhBcnJheSwgTGluZVN0cmlwSW5kZXhBcnJheX0gZnJvbSAnLi4vZGF0YS9pbmRleF9hcnJheV90eXBlJztcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSAnLi4vZ2wvY29udGV4dCc7XG5cblxuY2xhc3MgSW5kZXhCdWZmZXIge1xuICAgIGNvbnRleHQ6IENvbnRleHQ7XG4gICAgYnVmZmVyOiBXZWJHTEJ1ZmZlcjtcbiAgICBkeW5hbWljRHJhdzogYm9vbGVhbjtcblxuICAgIGNvbnN0cnVjdG9yKGNvbnRleHQ6IENvbnRleHQsIGFycmF5OiBUcmlhbmdsZUluZGV4QXJyYXkgfCBMaW5lSW5kZXhBcnJheSB8IExpbmVTdHJpcEluZGV4QXJyYXksIGR5bmFtaWNEcmF3PzogYm9vbGVhbikge1xuICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICAgICAgICBjb25zdCBnbCA9IGNvbnRleHQuZ2w7XG4gICAgICAgIHRoaXMuYnVmZmVyID0gZ2wuY3JlYXRlQnVmZmVyKCk7XG4gICAgICAgIHRoaXMuZHluYW1pY0RyYXcgPSBCb29sZWFuKGR5bmFtaWNEcmF3KTtcblxuICAgICAgICAvLyBUaGUgYm91bmQgaW5kZXggYnVmZmVyIGlzIHBhcnQgb2YgdmVydGV4IGFycmF5IG9iamVjdCBzdGF0ZS4gV2UgZG9uJ3Qgd2FudCB0b1xuICAgICAgICAvLyBtb2RpZnkgd2hhdGV2ZXIgVkFPIGhhcHBlbnMgdG8gYmUgY3VycmVudGx5IGJvdW5kLCBzbyBtYWtlIHN1cmUgdGhlIGRlZmF1bHRcbiAgICAgICAgLy8gdmVydGV4IGFycmF5IHByb3ZpZGVkIGJ5IHRoZSBjb250ZXh0IGlzIGJvdW5kIGluc3RlYWQuXG4gICAgICAgIHRoaXMuY29udGV4dC51bmJpbmRWQU8oKTtcblxuICAgICAgICBjb250ZXh0LmJpbmRFbGVtZW50QnVmZmVyLnNldCh0aGlzLmJ1ZmZlcik7XG4gICAgICAgIGdsLmJ1ZmZlckRhdGEoZ2wuRUxFTUVOVF9BUlJBWV9CVUZGRVIsIGFycmF5LmFycmF5QnVmZmVyLCB0aGlzLmR5bmFtaWNEcmF3ID8gZ2wuRFlOQU1JQ19EUkFXIDogZ2wuU1RBVElDX0RSQVcpO1xuXG4gICAgICAgIGlmICghdGhpcy5keW5hbWljRHJhdykge1xuICAgICAgICAgICAgZGVsZXRlIGFycmF5LmFycmF5QnVmZmVyO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYmluZCgpIHtcbiAgICAgICAgdGhpcy5jb250ZXh0LmJpbmRFbGVtZW50QnVmZmVyLnNldCh0aGlzLmJ1ZmZlcik7XG4gICAgfVxuXG4gICAgdXBkYXRlRGF0YShhcnJheTogU3RydWN0QXJyYXkpIHtcbiAgICAgICAgY29uc3QgZ2wgPSB0aGlzLmNvbnRleHQuZ2w7XG4gICAgICAgIGFzc2VydCh0aGlzLmR5bmFtaWNEcmF3KTtcbiAgICAgICAgLy8gVGhlIHJpZ2h0IFZBTyB3aWxsIGdldCB0aGlzIGJ1ZmZlciByZS1ib3VuZCBsYXRlciBpbiBWZXJ0ZXhBcnJheU9iamVjdCNiaW5kXG4gICAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L21hcGJveC1nbC1qcy9pc3N1ZXMvNTYyMFxuICAgICAgICB0aGlzLmNvbnRleHQudW5iaW5kVkFPKCk7XG4gICAgICAgIHRoaXMuYmluZCgpO1xuICAgICAgICBnbC5idWZmZXJTdWJEYXRhKGdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSLCAwLCBhcnJheS5hcnJheUJ1ZmZlcik7XG4gICAgfVxuXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgY29uc3QgZ2wgPSB0aGlzLmNvbnRleHQuZ2w7XG4gICAgICAgIGlmICh0aGlzLmJ1ZmZlcikge1xuICAgICAgICAgICAgZ2wuZGVsZXRlQnVmZmVyKHRoaXMuYnVmZmVyKTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmJ1ZmZlcjtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgSW5kZXhCdWZmZXI7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5cbmltcG9ydCB0eXBlIHtcbiAgICBTdHJ1Y3RBcnJheSxcbiAgICBTdHJ1Y3RBcnJheU1lbWJlclxufSBmcm9tICcuLi91dGlsL3N0cnVjdF9hcnJheSc7XG5cbmltcG9ydCB0eXBlIFByb2dyYW0gZnJvbSAnLi4vcmVuZGVyL3Byb2dyYW0nO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tICcuLi9nbC9jb250ZXh0JztcblxuLyoqXG4gKiBAZW51bSB7c3RyaW5nfSBBdHRyaWJ1dGVUeXBlXG4gKiBAcHJpdmF0ZVxuICogQHJlYWRvbmx5XG4gKi9cbmNvbnN0IEF0dHJpYnV0ZVR5cGUgPSB7XG4gICAgSW50ODogICAnQllURScsXG4gICAgVWludDg6ICAnVU5TSUdORURfQllURScsXG4gICAgSW50MTY6ICAnU0hPUlQnLFxuICAgIFVpbnQxNjogJ1VOU0lHTkVEX1NIT1JUJyxcbiAgICBJbnQzMjogICdJTlQnLFxuICAgIFVpbnQzMjogJ1VOU0lHTkVEX0lOVCcsXG4gICAgRmxvYXQzMjogJ0ZMT0FUJ1xufTtcblxuLyoqXG4gKiBUaGUgYFZlcnRleEJ1ZmZlcmAgY2xhc3MgdHVybnMgYSBgU3RydWN0QXJyYXlgIGludG8gYSBXZWJHTCBidWZmZXIuIEVhY2ggbWVtYmVyIG9mIHRoZSBTdHJ1Y3RBcnJheSdzXG4gKiBTdHJ1Y3QgdHlwZSBpcyBjb252ZXJ0ZWQgdG8gYSBXZWJHTCBhdHJpYnV0ZS5cbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIFZlcnRleEJ1ZmZlciB7XG4gICAgbGVuZ3RoOiBudW1iZXI7XG4gICAgYXR0cmlidXRlczogJFJlYWRPbmx5QXJyYXk8U3RydWN0QXJyYXlNZW1iZXI+O1xuICAgIGl0ZW1TaXplOiBudW1iZXI7XG4gICAgZHluYW1pY0RyYXc6ID9ib29sZWFuO1xuICAgIGNvbnRleHQ6IENvbnRleHQ7XG4gICAgYnVmZmVyOiBXZWJHTEJ1ZmZlcjtcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBkeW5hbWljRHJhdyBXaGV0aGVyIHRoaXMgYnVmZmVyIHdpbGwgYmUgcmVwZWF0ZWRseSB1cGRhdGVkLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGNvbnRleHQ6IENvbnRleHQsIGFycmF5OiBTdHJ1Y3RBcnJheSwgYXR0cmlidXRlczogJFJlYWRPbmx5QXJyYXk8U3RydWN0QXJyYXlNZW1iZXI+LCBkeW5hbWljRHJhdz86IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5sZW5ndGggPSBhcnJheS5sZW5ndGg7XG4gICAgICAgIHRoaXMuYXR0cmlidXRlcyA9IGF0dHJpYnV0ZXM7XG4gICAgICAgIHRoaXMuaXRlbVNpemUgPSBhcnJheS5ieXRlc1BlckVsZW1lbnQ7XG4gICAgICAgIHRoaXMuZHluYW1pY0RyYXcgPSBkeW5hbWljRHJhdztcblxuICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICAgICAgICBjb25zdCBnbCA9IGNvbnRleHQuZ2w7XG4gICAgICAgIHRoaXMuYnVmZmVyID0gZ2wuY3JlYXRlQnVmZmVyKCk7XG4gICAgICAgIGNvbnRleHQuYmluZFZlcnRleEJ1ZmZlci5zZXQodGhpcy5idWZmZXIpO1xuICAgICAgICBnbC5idWZmZXJEYXRhKGdsLkFSUkFZX0JVRkZFUiwgYXJyYXkuYXJyYXlCdWZmZXIsIHRoaXMuZHluYW1pY0RyYXcgPyBnbC5EWU5BTUlDX0RSQVcgOiBnbC5TVEFUSUNfRFJBVyk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmR5bmFtaWNEcmF3KSB7XG4gICAgICAgICAgICBkZWxldGUgYXJyYXkuYXJyYXlCdWZmZXI7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBiaW5kKCkge1xuICAgICAgICB0aGlzLmNvbnRleHQuYmluZFZlcnRleEJ1ZmZlci5zZXQodGhpcy5idWZmZXIpO1xuICAgIH1cblxuICAgIHVwZGF0ZURhdGEoYXJyYXk6IFN0cnVjdEFycmF5KSB7XG4gICAgICAgIGFzc2VydChhcnJheS5sZW5ndGggPT09IHRoaXMubGVuZ3RoKTtcbiAgICAgICAgY29uc3QgZ2wgPSB0aGlzLmNvbnRleHQuZ2w7XG4gICAgICAgIHRoaXMuYmluZCgpO1xuICAgICAgICBnbC5idWZmZXJTdWJEYXRhKGdsLkFSUkFZX0JVRkZFUiwgMCwgYXJyYXkuYXJyYXlCdWZmZXIpO1xuICAgIH1cblxuICAgIGVuYWJsZUF0dHJpYnV0ZXMoZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCwgcHJvZ3JhbTogUHJvZ3JhbTwqPikge1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRoaXMuYXR0cmlidXRlcy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgY29uc3QgbWVtYmVyID0gdGhpcy5hdHRyaWJ1dGVzW2pdO1xuICAgICAgICAgICAgY29uc3QgYXR0cmliSW5kZXg6IG51bWJlciB8IHZvaWQgPSBwcm9ncmFtLmF0dHJpYnV0ZXNbbWVtYmVyLm5hbWVdO1xuICAgICAgICAgICAgaWYgKGF0dHJpYkluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBnbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShhdHRyaWJJbmRleCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIGF0dHJpYnV0ZSBwb2ludGVycyBpbiBhIFdlYkdMIGNvbnRleHRcbiAgICAgKiBAcGFyYW0gZ2wgVGhlIFdlYkdMIGNvbnRleHRcbiAgICAgKiBAcGFyYW0gcHJvZ3JhbSBUaGUgYWN0aXZlIFdlYkdMIHByb2dyYW1cbiAgICAgKiBAcGFyYW0gdmVydGV4T2Zmc2V0IEluZGV4IG9mIHRoZSBzdGFydGluZyB2ZXJ0ZXggb2YgdGhlIHNlZ21lbnRcbiAgICAgKi9cbiAgICBzZXRWZXJ0ZXhBdHRyaWJQb2ludGVycyhnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0LCBwcm9ncmFtOiBQcm9ncmFtPCo+LCB2ZXJ0ZXhPZmZzZXQ6ID9udW1iZXIpIHtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB0aGlzLmF0dHJpYnV0ZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGNvbnN0IG1lbWJlciA9IHRoaXMuYXR0cmlidXRlc1tqXTtcbiAgICAgICAgICAgIGNvbnN0IGF0dHJpYkluZGV4OiBudW1iZXIgfCB2b2lkID0gcHJvZ3JhbS5hdHRyaWJ1dGVzW21lbWJlci5uYW1lXTtcblxuICAgICAgICAgICAgaWYgKGF0dHJpYkluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKFxuICAgICAgICAgICAgICAgICAgICBhdHRyaWJJbmRleCxcbiAgICAgICAgICAgICAgICAgICAgbWVtYmVyLmNvbXBvbmVudHMsXG4gICAgICAgICAgICAgICAgICAgIChnbDogYW55KVtBdHRyaWJ1dGVUeXBlW21lbWJlci50eXBlXV0sXG4gICAgICAgICAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLml0ZW1TaXplLFxuICAgICAgICAgICAgICAgICAgICBtZW1iZXIub2Zmc2V0ICsgKHRoaXMuaXRlbVNpemUgKiAodmVydGV4T2Zmc2V0IHx8IDApKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXN0cm95IHRoZSBHTCBidWZmZXIgYm91bmQgdG8gdGhlIGdpdmVuIFdlYkdMIGNvbnRleHRcbiAgICAgKi9cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBjb25zdCBnbCA9IHRoaXMuY29udGV4dC5nbDtcbiAgICAgICAgaWYgKHRoaXMuYnVmZmVyKSB7XG4gICAgICAgICAgICBnbC5kZWxldGVCdWZmZXIodGhpcy5idWZmZXIpO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuYnVmZmVyO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBWZXJ0ZXhCdWZmZXI7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgQ29sb3IgZnJvbSAnLi4vc3R5bGUtc3BlYy91dGlsL2NvbG9yJztcblxuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tICcuL2NvbnRleHQnO1xuaW1wb3J0IHR5cGUge1xuICAgIEJsZW5kRnVuY1R5cGUsXG4gICAgQmxlbmRFcXVhdGlvblR5cGUsXG4gICAgQ29sb3JNYXNrVHlwZSxcbiAgICBEZXB0aFJhbmdlVHlwZSxcbiAgICBEZXB0aE1hc2tUeXBlLFxuICAgIFN0ZW5jaWxGdW5jVHlwZSxcbiAgICBTdGVuY2lsT3BUeXBlLFxuICAgIERlcHRoRnVuY1R5cGUsXG4gICAgVGV4dHVyZVVuaXRUeXBlLFxuICAgIFZpZXdwb3J0VHlwZSxcbiAgICBDdWxsRmFjZU1vZGVUeXBlLFxuICAgIEZyb250RmFjZVR5cGUsXG59IGZyb20gJy4vdHlwZXMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFZhbHVlPFQ+IHtcbiAgICBjdXJyZW50OiBUO1xuICAgIGRlZmF1bHQ6IFQ7XG4gICAgZGlydHk6IGJvb2xlYW47XG4gICAgZ2V0KCk6IFQ7XG4gICAgc2V0RGVmYXVsdCgpOiB2b2lkO1xuICAgIHNldCh2YWx1ZTogVCk6IHZvaWQ7XG59XG5cbmNsYXNzIEJhc2VWYWx1ZTxUPiBpbXBsZW1lbnRzIFZhbHVlPFQ+IHtcbiAgICBnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0O1xuICAgIGN1cnJlbnQ6IFQ7XG4gICAgZGVmYXVsdDogVDtcbiAgICBkaXJ0eTogYm9vbGVhbjtcblxuICAgIGNvbnN0cnVjdG9yKGNvbnRleHQ6IENvbnRleHQpIHtcbiAgICAgICAgdGhpcy5nbCA9IGNvbnRleHQuZ2w7XG4gICAgICAgIHRoaXMuZGVmYXVsdCA9IHRoaXMuZ2V0RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSB0aGlzLmRlZmF1bHQ7XG4gICAgICAgIHRoaXMuZGlydHkgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBnZXQoKTogVCB7XG4gICAgICAgIHJldHVybiB0aGlzLmN1cnJlbnQ7XG4gICAgfVxuICAgIHNldCh2YWx1ZTogVCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4gICAgICAgIC8vIG92ZXJyaWRkZW4gaW4gY2hpbGQgY2xhc3NlcztcbiAgICB9XG5cbiAgICBnZXREZWZhdWx0KCk6IFQge1xuICAgICAgICByZXR1cm4gdGhpcy5kZWZhdWx0OyAvLyBvdmVycmlkZW4gaW4gY2hpbGQgY2xhc3Nlc1xuICAgIH1cbiAgICBzZXREZWZhdWx0KCkge1xuICAgICAgICB0aGlzLnNldCh0aGlzLmRlZmF1bHQpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIENsZWFyQ29sb3IgZXh0ZW5kcyBCYXNlVmFsdWU8Q29sb3I+IHtcbiAgICBnZXREZWZhdWx0KCk6IENvbG9yIHtcbiAgICAgICAgcmV0dXJuIENvbG9yLnRyYW5zcGFyZW50O1xuICAgIH1cbiAgICBzZXQodjogQ29sb3IpIHtcbiAgICAgICAgY29uc3QgYyA9IHRoaXMuY3VycmVudDtcbiAgICAgICAgaWYgKHYuciA9PT0gYy5yICYmIHYuZyA9PT0gYy5nICYmIHYuYiA9PT0gYy5iICYmIHYuYSA9PT0gYy5hICYmICF0aGlzLmRpcnR5KSByZXR1cm47XG4gICAgICAgIHRoaXMuZ2wuY2xlYXJDb2xvcih2LnIsIHYuZywgdi5iLCB2LmEpO1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSB2O1xuICAgICAgICB0aGlzLmRpcnR5ID0gZmFsc2U7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ2xlYXJEZXB0aCBleHRlbmRzIEJhc2VWYWx1ZTxudW1iZXI+IHtcbiAgICBnZXREZWZhdWx0KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgICBzZXQodjogbnVtYmVyKSB7XG4gICAgICAgIGlmICh2ID09PSB0aGlzLmN1cnJlbnQgJiYgIXRoaXMuZGlydHkpIHJldHVybjtcbiAgICAgICAgdGhpcy5nbC5jbGVhckRlcHRoKHYpO1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSB2O1xuICAgICAgICB0aGlzLmRpcnR5ID0gZmFsc2U7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ2xlYXJTdGVuY2lsIGV4dGVuZHMgQmFzZVZhbHVlPG51bWJlcj4ge1xuICAgIGdldERlZmF1bHQoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIHNldCh2OiBudW1iZXIpIHtcbiAgICAgICAgaWYgKHYgPT09IHRoaXMuY3VycmVudCAmJiAhdGhpcy5kaXJ0eSkgcmV0dXJuO1xuICAgICAgICB0aGlzLmdsLmNsZWFyU3RlbmNpbCh2KTtcbiAgICAgICAgdGhpcy5jdXJyZW50ID0gdjtcbiAgICAgICAgdGhpcy5kaXJ0eSA9IGZhbHNlO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIENvbG9yTWFzayBleHRlbmRzIEJhc2VWYWx1ZTxDb2xvck1hc2tUeXBlPiB7XG4gICAgZ2V0RGVmYXVsdCgpOiBDb2xvck1hc2tUeXBlIHtcbiAgICAgICAgcmV0dXJuIFt0cnVlLCB0cnVlLCB0cnVlLCB0cnVlXTtcbiAgICB9XG4gICAgc2V0KHY6IENvbG9yTWFza1R5cGUpIHtcbiAgICAgICAgY29uc3QgYyA9IHRoaXMuY3VycmVudDtcbiAgICAgICAgaWYgKHZbMF0gPT09IGNbMF0gJiYgdlsxXSA9PT0gY1sxXSAmJiB2WzJdID09PSBjWzJdICYmIHZbM10gPT09IGNbM10gJiYgIXRoaXMuZGlydHkpIHJldHVybjtcbiAgICAgICAgdGhpcy5nbC5jb2xvck1hc2sodlswXSwgdlsxXSwgdlsyXSwgdlszXSk7XG4gICAgICAgIHRoaXMuY3VycmVudCA9IHY7XG4gICAgICAgIHRoaXMuZGlydHkgPSBmYWxzZTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBEZXB0aE1hc2sgZXh0ZW5kcyBCYXNlVmFsdWU8RGVwdGhNYXNrVHlwZT4ge1xuICAgIGdldERlZmF1bHQoKTogRGVwdGhNYXNrVHlwZSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBzZXQodjogRGVwdGhNYXNrVHlwZSk6IHZvaWQge1xuICAgICAgICBpZiAodiA9PT0gdGhpcy5jdXJyZW50ICYmICF0aGlzLmRpcnR5KSByZXR1cm47XG4gICAgICAgIHRoaXMuZ2wuZGVwdGhNYXNrKHYpO1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSB2O1xuICAgICAgICB0aGlzLmRpcnR5ID0gZmFsc2U7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgU3RlbmNpbE1hc2sgZXh0ZW5kcyBCYXNlVmFsdWU8bnVtYmVyPiB7XG4gICAgZ2V0RGVmYXVsdCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gMHhGRjtcbiAgICB9XG4gICAgc2V0KHY6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBpZiAodiA9PT0gdGhpcy5jdXJyZW50ICYmICF0aGlzLmRpcnR5KSByZXR1cm47XG4gICAgICAgIHRoaXMuZ2wuc3RlbmNpbE1hc2sodik7XG4gICAgICAgIHRoaXMuY3VycmVudCA9IHY7XG4gICAgICAgIHRoaXMuZGlydHkgPSBmYWxzZTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTdGVuY2lsRnVuYyBleHRlbmRzIEJhc2VWYWx1ZTxTdGVuY2lsRnVuY1R5cGU+IHtcbiAgICBnZXREZWZhdWx0KCk6IFN0ZW5jaWxGdW5jVHlwZSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBmdW5jOiB0aGlzLmdsLkFMV0FZUyxcbiAgICAgICAgICAgIHJlZjogMCxcbiAgICAgICAgICAgIG1hc2s6IDB4RkZcbiAgICAgICAgfTtcbiAgICB9XG4gICAgc2V0KHY6IFN0ZW5jaWxGdW5jVHlwZSk6IHZvaWQge1xuICAgICAgICBjb25zdCBjID0gdGhpcy5jdXJyZW50O1xuICAgICAgICBpZiAodi5mdW5jID09PSBjLmZ1bmMgJiYgdi5yZWYgPT09IGMucmVmICYmIHYubWFzayA9PT0gYy5tYXNrICYmICF0aGlzLmRpcnR5KSByZXR1cm47XG4gICAgICAgIHRoaXMuZ2wuc3RlbmNpbEZ1bmModi5mdW5jLCB2LnJlZiwgdi5tYXNrKTtcbiAgICAgICAgdGhpcy5jdXJyZW50ID0gdjtcbiAgICAgICAgdGhpcy5kaXJ0eSA9IGZhbHNlO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFN0ZW5jaWxPcCBleHRlbmRzIEJhc2VWYWx1ZTxTdGVuY2lsT3BUeXBlPiB7XG4gICAgZ2V0RGVmYXVsdCgpOiBTdGVuY2lsT3BUeXBlIHtcbiAgICAgICAgY29uc3QgZ2wgPSB0aGlzLmdsO1xuICAgICAgICByZXR1cm4gW2dsLktFRVAsIGdsLktFRVAsIGdsLktFRVBdO1xuICAgIH1cbiAgICBzZXQodjogU3RlbmNpbE9wVHlwZSkge1xuICAgICAgICBjb25zdCBjID0gdGhpcy5jdXJyZW50O1xuICAgICAgICBpZiAodlswXSA9PT0gY1swXSAmJiB2WzFdID09PSBjWzFdICYmIHZbMl0gPT09IGNbMl0gJiYgIXRoaXMuZGlydHkpIHJldHVybjtcbiAgICAgICAgdGhpcy5nbC5zdGVuY2lsT3AodlswXSwgdlsxXSwgdlsyXSk7XG4gICAgICAgIHRoaXMuY3VycmVudCA9IHY7XG4gICAgICAgIHRoaXMuZGlydHkgPSBmYWxzZTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTdGVuY2lsVGVzdCBleHRlbmRzIEJhc2VWYWx1ZTxib29sZWFuPiB7XG4gICAgZ2V0RGVmYXVsdCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBzZXQodjogYm9vbGVhbikge1xuICAgICAgICBpZiAodiA9PT0gdGhpcy5jdXJyZW50ICYmICF0aGlzLmRpcnR5KSByZXR1cm47XG4gICAgICAgIGNvbnN0IGdsID0gdGhpcy5nbDtcbiAgICAgICAgaWYgKHYpIHtcbiAgICAgICAgICAgIGdsLmVuYWJsZShnbC5TVEVOQ0lMX1RFU1QpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZ2wuZGlzYWJsZShnbC5TVEVOQ0lMX1RFU1QpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY3VycmVudCA9IHY7XG4gICAgICAgIHRoaXMuZGlydHkgPSBmYWxzZTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBEZXB0aFJhbmdlIGV4dGVuZHMgQmFzZVZhbHVlPERlcHRoUmFuZ2VUeXBlPiB7XG4gICAgZ2V0RGVmYXVsdCgpOiBEZXB0aFJhbmdlVHlwZSB7XG4gICAgICAgIHJldHVybiBbMCwgMV07XG4gICAgfVxuICAgIHNldCh2OiBEZXB0aFJhbmdlVHlwZSkge1xuICAgICAgICBjb25zdCBjID0gdGhpcy5jdXJyZW50O1xuICAgICAgICBpZiAodlswXSA9PT0gY1swXSAmJiB2WzFdID09PSBjWzFdICYmICF0aGlzLmRpcnR5KSByZXR1cm47XG4gICAgICAgIHRoaXMuZ2wuZGVwdGhSYW5nZSh2WzBdLCB2WzFdKTtcbiAgICAgICAgdGhpcy5jdXJyZW50ID0gdjtcbiAgICAgICAgdGhpcy5kaXJ0eSA9IGZhbHNlO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIERlcHRoVGVzdCBleHRlbmRzIEJhc2VWYWx1ZTxib29sZWFuPiB7XG4gICAgZ2V0RGVmYXVsdCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBzZXQodjogYm9vbGVhbikge1xuICAgICAgICBpZiAodiA9PT0gdGhpcy5jdXJyZW50ICYmICF0aGlzLmRpcnR5KSByZXR1cm47XG4gICAgICAgIGNvbnN0IGdsID0gdGhpcy5nbDtcbiAgICAgICAgaWYgKHYpIHtcbiAgICAgICAgICAgIGdsLmVuYWJsZShnbC5ERVBUSF9URVNUKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGdsLmRpc2FibGUoZ2wuREVQVEhfVEVTVCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jdXJyZW50ID0gdjtcbiAgICAgICAgdGhpcy5kaXJ0eSA9IGZhbHNlO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIERlcHRoRnVuYyBleHRlbmRzIEJhc2VWYWx1ZTxEZXB0aEZ1bmNUeXBlPiB7XG4gICAgZ2V0RGVmYXVsdCgpOiBEZXB0aEZ1bmNUeXBlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2wuTEVTUztcbiAgICB9XG4gICAgc2V0KHY6IERlcHRoRnVuY1R5cGUpIHtcbiAgICAgICAgaWYgKHYgPT09IHRoaXMuY3VycmVudCAmJiAhdGhpcy5kaXJ0eSkgcmV0dXJuO1xuICAgICAgICB0aGlzLmdsLmRlcHRoRnVuYyh2KTtcbiAgICAgICAgdGhpcy5jdXJyZW50ID0gdjtcbiAgICAgICAgdGhpcy5kaXJ0eSA9IGZhbHNlO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEJsZW5kIGV4dGVuZHMgQmFzZVZhbHVlPGJvb2xlYW4+IHtcbiAgICBnZXREZWZhdWx0KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHNldCh2OiBib29sZWFuKSB7XG4gICAgICAgIGlmICh2ID09PSB0aGlzLmN1cnJlbnQgJiYgIXRoaXMuZGlydHkpIHJldHVybjtcbiAgICAgICAgY29uc3QgZ2wgPSB0aGlzLmdsO1xuICAgICAgICBpZiAodikge1xuICAgICAgICAgICAgZ2wuZW5hYmxlKGdsLkJMRU5EKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGdsLmRpc2FibGUoZ2wuQkxFTkQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY3VycmVudCA9IHY7XG4gICAgICAgIHRoaXMuZGlydHkgPSBmYWxzZTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBCbGVuZEZ1bmMgZXh0ZW5kcyBCYXNlVmFsdWU8QmxlbmRGdW5jVHlwZT4ge1xuICAgIGdldERlZmF1bHQoKTogQmxlbmRGdW5jVHlwZSB7XG4gICAgICAgIGNvbnN0IGdsID0gdGhpcy5nbDtcbiAgICAgICAgcmV0dXJuIFtnbC5PTkUsIGdsLlpFUk9dO1xuICAgIH1cbiAgICBzZXQodjogQmxlbmRGdW5jVHlwZSkge1xuICAgICAgICBjb25zdCBjID0gdGhpcy5jdXJyZW50O1xuICAgICAgICBpZiAodlswXSA9PT0gY1swXSAmJiB2WzFdID09PSBjWzFdICYmICF0aGlzLmRpcnR5KSByZXR1cm47XG4gICAgICAgIHRoaXMuZ2wuYmxlbmRGdW5jKHZbMF0sIHZbMV0pO1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSB2O1xuICAgICAgICB0aGlzLmRpcnR5ID0gZmFsc2U7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQmxlbmRDb2xvciBleHRlbmRzIEJhc2VWYWx1ZTxDb2xvcj4ge1xuICAgIGdldERlZmF1bHQoKTogQ29sb3Ige1xuICAgICAgICByZXR1cm4gQ29sb3IudHJhbnNwYXJlbnQ7XG4gICAgfVxuICAgIHNldCh2OiBDb2xvcikge1xuICAgICAgICBjb25zdCBjID0gdGhpcy5jdXJyZW50O1xuICAgICAgICBpZiAodi5yID09PSBjLnIgJiYgdi5nID09PSBjLmcgJiYgdi5iID09PSBjLmIgJiYgdi5hID09PSBjLmEgJiYgIXRoaXMuZGlydHkpIHJldHVybjtcbiAgICAgICAgdGhpcy5nbC5ibGVuZENvbG9yKHYuciwgdi5nLCB2LmIsIHYuYSk7XG4gICAgICAgIHRoaXMuY3VycmVudCA9IHY7XG4gICAgICAgIHRoaXMuZGlydHkgPSBmYWxzZTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBCbGVuZEVxdWF0aW9uIGV4dGVuZHMgQmFzZVZhbHVlPEJsZW5kRXF1YXRpb25UeXBlPiB7XG4gICAgZ2V0RGVmYXVsdCgpOiBCbGVuZEVxdWF0aW9uVHlwZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdsLkZVTkNfQUREO1xuICAgIH1cbiAgICBzZXQodjogQmxlbmRFcXVhdGlvblR5cGUpIHtcbiAgICAgICAgaWYgKHYgPT09IHRoaXMuY3VycmVudCAmJiAhdGhpcy5kaXJ0eSkgcmV0dXJuO1xuICAgICAgICB0aGlzLmdsLmJsZW5kRXF1YXRpb24odik7XG4gICAgICAgIHRoaXMuY3VycmVudCA9IHY7XG4gICAgICAgIHRoaXMuZGlydHkgPSBmYWxzZTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDdWxsRmFjZSBleHRlbmRzIEJhc2VWYWx1ZTxib29sZWFuPiB7XG4gICAgZ2V0RGVmYXVsdCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBzZXQodjogYm9vbGVhbikge1xuICAgICAgICBpZiAodiA9PT0gdGhpcy5jdXJyZW50ICYmICF0aGlzLmRpcnR5KSByZXR1cm47XG4gICAgICAgIGNvbnN0IGdsID0gdGhpcy5nbDtcbiAgICAgICAgaWYgKHYpIHtcbiAgICAgICAgICAgIGdsLmVuYWJsZShnbC5DVUxMX0ZBQ0UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZ2wuZGlzYWJsZShnbC5DVUxMX0ZBQ0UpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY3VycmVudCA9IHY7XG4gICAgICAgIHRoaXMuZGlydHkgPSBmYWxzZTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDdWxsRmFjZVNpZGUgZXh0ZW5kcyBCYXNlVmFsdWU8Q3VsbEZhY2VNb2RlVHlwZT4ge1xuICAgIGdldERlZmF1bHQoKTogQ3VsbEZhY2VNb2RlVHlwZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdsLkJBQ0s7XG4gICAgfVxuICAgIHNldCh2OiBDdWxsRmFjZU1vZGVUeXBlKSB7XG4gICAgICAgIGlmICh2ID09PSB0aGlzLmN1cnJlbnQgJiYgIXRoaXMuZGlydHkpIHJldHVybjtcbiAgICAgICAgdGhpcy5nbC5jdWxsRmFjZSh2KTtcbiAgICAgICAgdGhpcy5jdXJyZW50ID0gdjtcbiAgICAgICAgdGhpcy5kaXJ0eSA9IGZhbHNlO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEZyb250RmFjZSBleHRlbmRzIEJhc2VWYWx1ZTxGcm9udEZhY2VUeXBlPiB7XG4gICAgZ2V0RGVmYXVsdCgpOiBGcm9udEZhY2VUeXBlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2wuQ0NXO1xuICAgIH1cbiAgICBzZXQodjogRnJvbnRGYWNlVHlwZSkge1xuICAgICAgICBpZiAodiA9PT0gdGhpcy5jdXJyZW50ICYmICF0aGlzLmRpcnR5KSByZXR1cm47XG4gICAgICAgIHRoaXMuZ2wuZnJvbnRGYWNlKHYpO1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSB2O1xuICAgICAgICB0aGlzLmRpcnR5ID0gZmFsc2U7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgUHJvZ3JhbSBleHRlbmRzIEJhc2VWYWx1ZTw/V2ViR0xQcm9ncmFtPiB7XG4gICAgZ2V0RGVmYXVsdCgpOiBXZWJHTFByb2dyYW0ge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgc2V0KHY6ID9XZWJHTFByb2dyYW0pIHtcbiAgICAgICAgaWYgKHYgPT09IHRoaXMuY3VycmVudCAmJiAhdGhpcy5kaXJ0eSkgcmV0dXJuO1xuICAgICAgICB0aGlzLmdsLnVzZVByb2dyYW0odik7XG4gICAgICAgIHRoaXMuY3VycmVudCA9IHY7XG4gICAgICAgIHRoaXMuZGlydHkgPSBmYWxzZTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBY3RpdmVUZXh0dXJlVW5pdCBleHRlbmRzIEJhc2VWYWx1ZTxUZXh0dXJlVW5pdFR5cGU+IHtcbiAgICBnZXREZWZhdWx0KCk6IFRleHR1cmVVbml0VHlwZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdsLlRFWFRVUkUwO1xuICAgIH1cbiAgICBzZXQodjogVGV4dHVyZVVuaXRUeXBlKSB7XG4gICAgICAgIGlmICh2ID09PSB0aGlzLmN1cnJlbnQgJiYgIXRoaXMuZGlydHkpIHJldHVybjtcbiAgICAgICAgdGhpcy5nbC5hY3RpdmVUZXh0dXJlKHYpO1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSB2O1xuICAgICAgICB0aGlzLmRpcnR5ID0gZmFsc2U7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgVmlld3BvcnQgZXh0ZW5kcyBCYXNlVmFsdWU8Vmlld3BvcnRUeXBlPiB7XG4gICAgZ2V0RGVmYXVsdCgpOiBWaWV3cG9ydFR5cGUge1xuICAgICAgICBjb25zdCBnbCA9IHRoaXMuZ2w7XG4gICAgICAgIHJldHVybiBbMCwgMCwgZ2wuZHJhd2luZ0J1ZmZlcldpZHRoLCBnbC5kcmF3aW5nQnVmZmVySGVpZ2h0XTtcbiAgICB9XG4gICAgc2V0KHY6IFZpZXdwb3J0VHlwZSkge1xuICAgICAgICBjb25zdCBjID0gdGhpcy5jdXJyZW50O1xuICAgICAgICBpZiAodlswXSA9PT0gY1swXSAmJiB2WzFdID09PSBjWzFdICYmIHZbMl0gPT09IGNbMl0gJiYgdlszXSA9PT0gY1szXSAmJiAhdGhpcy5kaXJ0eSkgcmV0dXJuO1xuICAgICAgICB0aGlzLmdsLnZpZXdwb3J0KHZbMF0sIHZbMV0sIHZbMl0sIHZbM10pO1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSB2O1xuICAgICAgICB0aGlzLmRpcnR5ID0gZmFsc2U7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQmluZEZyYW1lYnVmZmVyIGV4dGVuZHMgQmFzZVZhbHVlPD9XZWJHTEZyYW1lYnVmZmVyPiB7XG4gICAgZ2V0RGVmYXVsdCgpOiBXZWJHTEZyYW1lYnVmZmVyIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHNldCh2OiA/V2ViR0xGcmFtZWJ1ZmZlcikge1xuICAgICAgICBpZiAodiA9PT0gdGhpcy5jdXJyZW50ICYmICF0aGlzLmRpcnR5KSByZXR1cm47XG4gICAgICAgIGNvbnN0IGdsID0gdGhpcy5nbDtcbiAgICAgICAgZ2wuYmluZEZyYW1lYnVmZmVyKGdsLkZSQU1FQlVGRkVSLCB2KTtcbiAgICAgICAgdGhpcy5jdXJyZW50ID0gdjtcbiAgICAgICAgdGhpcy5kaXJ0eSA9IGZhbHNlO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEJpbmRSZW5kZXJidWZmZXIgZXh0ZW5kcyBCYXNlVmFsdWU8P1dlYkdMUmVuZGVyYnVmZmVyPiB7XG4gICAgZ2V0RGVmYXVsdCgpOiBXZWJHTFJlbmRlcmJ1ZmZlciB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBzZXQodjogP1dlYkdMUmVuZGVyYnVmZmVyKSB7XG4gICAgICAgIGlmICh2ID09PSB0aGlzLmN1cnJlbnQgJiYgIXRoaXMuZGlydHkpIHJldHVybjtcbiAgICAgICAgY29uc3QgZ2wgPSB0aGlzLmdsO1xuICAgICAgICBnbC5iaW5kUmVuZGVyYnVmZmVyKGdsLlJFTkRFUkJVRkZFUiwgdik7XG4gICAgICAgIHRoaXMuY3VycmVudCA9IHY7XG4gICAgICAgIHRoaXMuZGlydHkgPSBmYWxzZTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBCaW5kVGV4dHVyZSBleHRlbmRzIEJhc2VWYWx1ZTw/V2ViR0xUZXh0dXJlPiB7XG4gICAgZ2V0RGVmYXVsdCgpOiBXZWJHTFRleHR1cmUge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgc2V0KHY6ID9XZWJHTFRleHR1cmUpIHtcbiAgICAgICAgaWYgKHYgPT09IHRoaXMuY3VycmVudCAmJiAhdGhpcy5kaXJ0eSkgcmV0dXJuO1xuICAgICAgICBjb25zdCBnbCA9IHRoaXMuZ2w7XG4gICAgICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIHYpO1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSB2O1xuICAgICAgICB0aGlzLmRpcnR5ID0gZmFsc2U7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQmluZFZlcnRleEJ1ZmZlciBleHRlbmRzIEJhc2VWYWx1ZTw/V2ViR0xCdWZmZXI+IHtcbiAgICBnZXREZWZhdWx0KCk6IFdlYkdMQnVmZmVyIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHNldCh2OiA/V2ViR0xCdWZmZXIpIHtcbiAgICAgICAgaWYgKHYgPT09IHRoaXMuY3VycmVudCAmJiAhdGhpcy5kaXJ0eSkgcmV0dXJuO1xuICAgICAgICBjb25zdCBnbCA9IHRoaXMuZ2w7XG4gICAgICAgIGdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCB2KTtcbiAgICAgICAgdGhpcy5jdXJyZW50ID0gdjtcbiAgICAgICAgdGhpcy5kaXJ0eSA9IGZhbHNlO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEJpbmRFbGVtZW50QnVmZmVyIGV4dGVuZHMgQmFzZVZhbHVlPD9XZWJHTEJ1ZmZlcj4ge1xuICAgIGdldERlZmF1bHQoKTogV2ViR0xCdWZmZXIge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgc2V0KHY6ID9XZWJHTEJ1ZmZlcikge1xuICAgICAgICAvLyBBbHdheXMgcmViaW5kXG4gICAgICAgIGNvbnN0IGdsID0gdGhpcy5nbDtcbiAgICAgICAgZ2wuYmluZEJ1ZmZlcihnbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgdik7XG4gICAgICAgIHRoaXMuY3VycmVudCA9IHY7XG4gICAgICAgIHRoaXMuZGlydHkgPSBmYWxzZTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBCaW5kVmVydGV4QXJyYXlPRVMgZXh0ZW5kcyBCYXNlVmFsdWU8YW55PiB7XG4gICAgdmFvOiBhbnk7XG5cbiAgICBjb25zdHJ1Y3Rvcihjb250ZXh0OiBDb250ZXh0KSB7XG4gICAgICAgIHN1cGVyKGNvbnRleHQpO1xuICAgICAgICB0aGlzLnZhbyA9IGNvbnRleHQuZXh0VmVydGV4QXJyYXlPYmplY3Q7XG4gICAgfVxuICAgIGdldERlZmF1bHQoKTogYW55IHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHNldCh2OiBhbnkpIHtcbiAgICAgICAgaWYgKCF0aGlzLnZhbyB8fCB2ID09PSB0aGlzLmN1cnJlbnQgJiYgIXRoaXMuZGlydHkpIHJldHVybjtcbiAgICAgICAgdGhpcy52YW8uYmluZFZlcnRleEFycmF5T0VTKHYpO1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSB2O1xuICAgICAgICB0aGlzLmRpcnR5ID0gZmFsc2U7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgUGl4ZWxTdG9yZVVucGFjayBleHRlbmRzIEJhc2VWYWx1ZTxudW1iZXI+IHtcbiAgICBnZXREZWZhdWx0KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiA0O1xuICAgIH1cbiAgICBzZXQodjogbnVtYmVyKSB7XG4gICAgICAgIGlmICh2ID09PSB0aGlzLmN1cnJlbnQgJiYgIXRoaXMuZGlydHkpIHJldHVybjtcbiAgICAgICAgY29uc3QgZ2wgPSB0aGlzLmdsO1xuICAgICAgICBnbC5waXhlbFN0b3JlaShnbC5VTlBBQ0tfQUxJR05NRU5ULCB2KTtcbiAgICAgICAgdGhpcy5jdXJyZW50ID0gdjtcbiAgICAgICAgdGhpcy5kaXJ0eSA9IGZhbHNlO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFBpeGVsU3RvcmVVbnBhY2tQcmVtdWx0aXBseUFscGhhIGV4dGVuZHMgQmFzZVZhbHVlPGJvb2xlYW4+IHtcbiAgICBnZXREZWZhdWx0KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHNldCh2OiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIGlmICh2ID09PSB0aGlzLmN1cnJlbnQgJiYgIXRoaXMuZGlydHkpIHJldHVybjtcbiAgICAgICAgY29uc3QgZ2wgPSB0aGlzLmdsO1xuICAgICAgICBnbC5waXhlbFN0b3JlaShnbC5VTlBBQ0tfUFJFTVVMVElQTFlfQUxQSEFfV0VCR0wsICh2OiBhbnkpKTtcbiAgICAgICAgdGhpcy5jdXJyZW50ID0gdjtcbiAgICAgICAgdGhpcy5kaXJ0eSA9IGZhbHNlO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFBpeGVsU3RvcmVVbnBhY2tGbGlwWSBleHRlbmRzIEJhc2VWYWx1ZTxib29sZWFuPiB7XG4gICAgZ2V0RGVmYXVsdCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBzZXQodjogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICBpZiAodiA9PT0gdGhpcy5jdXJyZW50ICYmICF0aGlzLmRpcnR5KSByZXR1cm47XG4gICAgICAgIGNvbnN0IGdsID0gdGhpcy5nbDtcbiAgICAgICAgZ2wucGl4ZWxTdG9yZWkoZ2wuVU5QQUNLX0ZMSVBfWV9XRUJHTCwgKHY6IGFueSkpO1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSB2O1xuICAgICAgICB0aGlzLmRpcnR5ID0gZmFsc2U7XG4gICAgfVxufVxuXG5jbGFzcyBGcmFtZWJ1ZmZlckF0dGFjaG1lbnQ8VD4gZXh0ZW5kcyBCYXNlVmFsdWU8P1Q+IHtcbiAgICBwYXJlbnQ6IFdlYkdMRnJhbWVidWZmZXI7XG4gICAgY29udGV4dDogQ29udGV4dDtcblxuICAgIGNvbnN0cnVjdG9yKGNvbnRleHQ6IENvbnRleHQsIHBhcmVudDogV2ViR0xGcmFtZWJ1ZmZlcikge1xuICAgICAgICBzdXBlcihjb250ZXh0KTtcbiAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgfVxuICAgIGdldERlZmF1bHQoKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIENvbG9yQXR0YWNobWVudCBleHRlbmRzIEZyYW1lYnVmZmVyQXR0YWNobWVudDxXZWJHTFRleHR1cmU+IHtcbiAgICBzZXREaXJ0eSgpIHtcbiAgICAgICAgdGhpcy5kaXJ0eSA9IHRydWU7XG4gICAgfVxuICAgIHNldCh2OiA/V2ViR0xUZXh0dXJlKTogdm9pZCB7XG4gICAgICAgIGlmICh2ID09PSB0aGlzLmN1cnJlbnQgJiYgIXRoaXMuZGlydHkpIHJldHVybjtcbiAgICAgICAgdGhpcy5jb250ZXh0LmJpbmRGcmFtZWJ1ZmZlci5zZXQodGhpcy5wYXJlbnQpO1xuICAgICAgICAvLyBub3RlOiBpdCdzIHBvc3NpYmxlIHRvIGF0dGFjaCBhIHJlbmRlcmJ1ZmZlciB0byB0aGUgY29sb3JcbiAgICAgICAgLy8gYXR0YWNobWVudCBwb2ludCwgYnV0IHRodXMgZmFyIE1CR0wgb25seSB1c2VzIHRleHR1cmVzIGZvciBjb2xvclxuICAgICAgICBjb25zdCBnbCA9IHRoaXMuZ2w7XG4gICAgICAgIGdsLmZyYW1lYnVmZmVyVGV4dHVyZTJEKGdsLkZSQU1FQlVGRkVSLCBnbC5DT0xPUl9BVFRBQ0hNRU5UMCwgZ2wuVEVYVFVSRV8yRCwgdiwgMCk7XG4gICAgICAgIHRoaXMuY3VycmVudCA9IHY7XG4gICAgICAgIHRoaXMuZGlydHkgPSBmYWxzZTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBEZXB0aEF0dGFjaG1lbnQgZXh0ZW5kcyBGcmFtZWJ1ZmZlckF0dGFjaG1lbnQ8V2ViR0xSZW5kZXJidWZmZXI+IHtcbiAgICBzZXQodjogP1dlYkdMUmVuZGVyYnVmZmVyKTogdm9pZCB7XG4gICAgICAgIGlmICh2ID09PSB0aGlzLmN1cnJlbnQgJiYgIXRoaXMuZGlydHkpIHJldHVybjtcbiAgICAgICAgdGhpcy5jb250ZXh0LmJpbmRGcmFtZWJ1ZmZlci5zZXQodGhpcy5wYXJlbnQpO1xuICAgICAgICAvLyBub3RlOiBpdCdzIHBvc3NpYmxlIHRvIGF0dGFjaCBhIHRleHR1cmUgdG8gdGhlIGRlcHRoIGF0dGFjaG1lbnRcbiAgICAgICAgLy8gcG9pbnQsIGJ1dCB0aHVzIGZhciBNQkdMIG9ubHkgdXNlcyByZW5kZXJidWZmZXJzIGZvciBkZXB0aFxuICAgICAgICBjb25zdCBnbCA9IHRoaXMuZ2w7XG4gICAgICAgIGdsLmZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyKGdsLkZSQU1FQlVGRkVSLCBnbC5ERVBUSF9BVFRBQ0hNRU5ULCBnbC5SRU5ERVJCVUZGRVIsIHYpO1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSB2O1xuICAgICAgICB0aGlzLmRpcnR5ID0gZmFsc2U7XG4gICAgfVxufVxuIiwiLy8gQGZsb3dcbmltcG9ydCB7IENvbG9yQXR0YWNobWVudCwgRGVwdGhBdHRhY2htZW50IH0gZnJvbSAnLi92YWx1ZSc7XG5cbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSAnLi9jb250ZXh0JztcblxuY2xhc3MgRnJhbWVidWZmZXIge1xuICAgIGNvbnRleHQ6IENvbnRleHQ7XG4gICAgd2lkdGg6IG51bWJlcjtcbiAgICBoZWlnaHQ6IG51bWJlcjtcbiAgICBmcmFtZWJ1ZmZlcjogV2ViR0xGcmFtZWJ1ZmZlcjtcbiAgICBjb2xvckF0dGFjaG1lbnQ6IENvbG9yQXR0YWNobWVudDtcbiAgICBkZXB0aEF0dGFjaG1lbnQ6IERlcHRoQXR0YWNobWVudDtcblxuICAgIGNvbnN0cnVjdG9yKGNvbnRleHQ6IENvbnRleHQsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG4gICAgICAgIHRoaXMud2lkdGggPSB3aWR0aDtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgICAgIGNvbnN0IGdsID0gY29udGV4dC5nbDtcbiAgICAgICAgY29uc3QgZmJvID0gdGhpcy5mcmFtZWJ1ZmZlciA9IGdsLmNyZWF0ZUZyYW1lYnVmZmVyKCk7XG5cbiAgICAgICAgdGhpcy5jb2xvckF0dGFjaG1lbnQgPSBuZXcgQ29sb3JBdHRhY2htZW50KGNvbnRleHQsIGZibyk7XG4gICAgICAgIHRoaXMuZGVwdGhBdHRhY2htZW50ID0gbmV3IERlcHRoQXR0YWNobWVudChjb250ZXh0LCBmYm8pO1xuICAgIH1cblxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGNvbnN0IGdsID0gdGhpcy5jb250ZXh0LmdsO1xuXG4gICAgICAgIGNvbnN0IHRleHR1cmUgPSB0aGlzLmNvbG9yQXR0YWNobWVudC5nZXQoKTtcbiAgICAgICAgaWYgKHRleHR1cmUpIGdsLmRlbGV0ZVRleHR1cmUodGV4dHVyZSk7XG5cbiAgICAgICAgY29uc3QgcmVuZGVyYnVmZmVyID0gdGhpcy5kZXB0aEF0dGFjaG1lbnQuZ2V0KCk7XG4gICAgICAgIGlmIChyZW5kZXJidWZmZXIpIGdsLmRlbGV0ZVJlbmRlcmJ1ZmZlcihyZW5kZXJidWZmZXIpO1xuXG4gICAgICAgIGdsLmRlbGV0ZUZyYW1lYnVmZmVyKHRoaXMuZnJhbWVidWZmZXIpO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgRnJhbWVidWZmZXI7XG4iLCIvLyBAZmxvd1xuaW1wb3J0IHR5cGUgeyBEZXB0aEZ1bmNUeXBlLCBEZXB0aE1hc2tUeXBlLCBEZXB0aFJhbmdlVHlwZSB9IGZyb20gJy4vdHlwZXMnO1xuXG5jb25zdCBBTFdBWVMgPSAweDAyMDc7XG5cbmNsYXNzIERlcHRoTW9kZSB7XG4gICAgZnVuYzogRGVwdGhGdW5jVHlwZTtcbiAgICBtYXNrOiBEZXB0aE1hc2tUeXBlO1xuICAgIHJhbmdlOiBEZXB0aFJhbmdlVHlwZTtcblxuICAgIC8vIERlcHRoTWFzayBlbnVtc1xuICAgIHN0YXRpYyBSZWFkT25seTogYm9vbGVhbjtcbiAgICBzdGF0aWMgUmVhZFdyaXRlOiBib29sZWFuO1xuXG4gICAgY29uc3RydWN0b3IoZGVwdGhGdW5jOiBEZXB0aEZ1bmNUeXBlLCBkZXB0aE1hc2s6IERlcHRoTWFza1R5cGUsIGRlcHRoUmFuZ2U6IERlcHRoUmFuZ2VUeXBlKSB7XG4gICAgICAgIHRoaXMuZnVuYyA9IGRlcHRoRnVuYztcbiAgICAgICAgdGhpcy5tYXNrID0gZGVwdGhNYXNrO1xuICAgICAgICB0aGlzLnJhbmdlID0gZGVwdGhSYW5nZTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZGlzYWJsZWQ6ICRSZWFkT25seTxEZXB0aE1vZGU+O1xufVxuXG5EZXB0aE1vZGUuUmVhZE9ubHkgPSBmYWxzZTtcbkRlcHRoTW9kZS5SZWFkV3JpdGUgPSB0cnVlO1xuXG5EZXB0aE1vZGUuZGlzYWJsZWQgPSBuZXcgRGVwdGhNb2RlKEFMV0FZUywgRGVwdGhNb2RlLlJlYWRPbmx5LCBbMCwgMV0pO1xuXG5leHBvcnQgZGVmYXVsdCBEZXB0aE1vZGU7XG4iLCIvLyBAZmxvd1xuaW1wb3J0IHR5cGUgeyBTdGVuY2lsT3BDb25zdGFudCwgU3RlbmNpbFRlc3QgfSBmcm9tICcuL3R5cGVzJztcblxuY29uc3QgQUxXQVlTID0gMHgwMjA3O1xuY29uc3QgS0VFUCA9IDB4MUUwMDtcblxuY2xhc3MgU3RlbmNpbE1vZGUge1xuICAgIHRlc3Q6IFN0ZW5jaWxUZXN0O1xuICAgIHJlZjogbnVtYmVyO1xuICAgIG1hc2s6IG51bWJlcjtcbiAgICBmYWlsOiBTdGVuY2lsT3BDb25zdGFudDtcbiAgICBkZXB0aEZhaWw6IFN0ZW5jaWxPcENvbnN0YW50O1xuICAgIHBhc3M6IFN0ZW5jaWxPcENvbnN0YW50O1xuXG4gICAgY29uc3RydWN0b3IodGVzdDogU3RlbmNpbFRlc3QsIHJlZjogbnVtYmVyLCBtYXNrOiBudW1iZXIsIGZhaWw6IFN0ZW5jaWxPcENvbnN0YW50LFxuICAgICAgICBkZXB0aEZhaWw6IFN0ZW5jaWxPcENvbnN0YW50LCBwYXNzOiBTdGVuY2lsT3BDb25zdGFudCkge1xuICAgICAgICB0aGlzLnRlc3QgPSB0ZXN0O1xuICAgICAgICB0aGlzLnJlZiA9IHJlZjtcbiAgICAgICAgdGhpcy5tYXNrID0gbWFzaztcbiAgICAgICAgdGhpcy5mYWlsID0gZmFpbDtcbiAgICAgICAgdGhpcy5kZXB0aEZhaWwgPSBkZXB0aEZhaWw7XG4gICAgICAgIHRoaXMucGFzcyA9IHBhc3M7XG4gICAgfVxuXG4gICAgc3RhdGljIGRpc2FibGVkOiAkUmVhZE9ubHk8U3RlbmNpbE1vZGU+O1xufVxuXG5TdGVuY2lsTW9kZS5kaXNhYmxlZCA9IG5ldyBTdGVuY2lsTW9kZSh7IGZ1bmM6IEFMV0FZUywgbWFzazogMCB9LCAwLCAwLCBLRUVQLCBLRUVQLCBLRUVQKTtcblxuZXhwb3J0IGRlZmF1bHQgU3RlbmNpbE1vZGU7XG4iLCIvLyBAZmxvd1xuaW1wb3J0IENvbG9yIGZyb20gJy4uL3N0eWxlLXNwZWMvdXRpbC9jb2xvcic7XG5cbmltcG9ydCB0eXBlIHtCbGVuZEZ1bmNUeXBlLCBDb2xvck1hc2tUeXBlfSBmcm9tICcuL3R5cGVzJztcblxuY29uc3QgWkVSTyA9IDB4MDAwMDtcbmNvbnN0IE9ORSA9IDB4MDAwMTtcbmNvbnN0IE9ORV9NSU5VU19TUkNfQUxQSEEgPSAweDAzMDM7XG5cbmNsYXNzIENvbG9yTW9kZSB7XG4gICAgYmxlbmRGdW5jdGlvbjogQmxlbmRGdW5jVHlwZTtcbiAgICBibGVuZENvbG9yOiBDb2xvcjtcbiAgICBtYXNrOiBDb2xvck1hc2tUeXBlO1xuXG4gICAgY29uc3RydWN0b3IoYmxlbmRGdW5jdGlvbjogQmxlbmRGdW5jVHlwZSwgYmxlbmRDb2xvcjogQ29sb3IsIG1hc2s6IENvbG9yTWFza1R5cGUpIHtcbiAgICAgICAgdGhpcy5ibGVuZEZ1bmN0aW9uID0gYmxlbmRGdW5jdGlvbjtcbiAgICAgICAgdGhpcy5ibGVuZENvbG9yID0gYmxlbmRDb2xvcjtcbiAgICAgICAgdGhpcy5tYXNrID0gbWFzaztcbiAgICB9XG5cbiAgICBzdGF0aWMgUmVwbGFjZTogQmxlbmRGdW5jVHlwZTtcblxuICAgIHN0YXRpYyBkaXNhYmxlZDogJFJlYWRPbmx5PENvbG9yTW9kZT47XG4gICAgc3RhdGljIHVuYmxlbmRlZDogJFJlYWRPbmx5PENvbG9yTW9kZT47XG4gICAgc3RhdGljIGFscGhhQmxlbmRlZDogJFJlYWRPbmx5PENvbG9yTW9kZT47XG59XG5cbkNvbG9yTW9kZS5SZXBsYWNlID0gW09ORSwgWkVST107XG5cbkNvbG9yTW9kZS5kaXNhYmxlZCA9IG5ldyBDb2xvck1vZGUoQ29sb3JNb2RlLlJlcGxhY2UsIENvbG9yLnRyYW5zcGFyZW50LCBbZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2VdKTtcbkNvbG9yTW9kZS51bmJsZW5kZWQgPSBuZXcgQ29sb3JNb2RlKENvbG9yTW9kZS5SZXBsYWNlLCBDb2xvci50cmFuc3BhcmVudCwgW3RydWUsIHRydWUsIHRydWUsIHRydWVdKTtcbkNvbG9yTW9kZS5hbHBoYUJsZW5kZWQgPSBuZXcgQ29sb3JNb2RlKFtPTkUsIE9ORV9NSU5VU19TUkNfQUxQSEFdLCBDb2xvci50cmFuc3BhcmVudCwgW3RydWUsIHRydWUsIHRydWUsIHRydWVdKTtcblxuZXhwb3J0IGRlZmF1bHQgQ29sb3JNb2RlO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHR5cGUge0N1bGxGYWNlTW9kZVR5cGUsIEZyb250RmFjZVR5cGV9IGZyb20gJy4vdHlwZXMnO1xuXG5jb25zdCBCQUNLID0gMHgwNDA1O1xuY29uc3QgQ0NXID0gMHgwOTAxO1xuXG5jbGFzcyBDdWxsRmFjZU1vZGUge1xuICAgIGVuYWJsZTogYm9vbGVhbjtcbiAgICBtb2RlOiBDdWxsRmFjZU1vZGVUeXBlO1xuICAgIGZyb250RmFjZTogRnJvbnRGYWNlVHlwZTtcblxuICAgIGNvbnN0cnVjdG9yKGVuYWJsZTogYm9vbGVhbiwgbW9kZTogQ3VsbEZhY2VNb2RlVHlwZSwgZnJvbnRGYWNlOiBGcm9udEZhY2VUeXBlKSB7XG4gICAgICAgIHRoaXMuZW5hYmxlID0gZW5hYmxlO1xuICAgICAgICB0aGlzLm1vZGUgPSBtb2RlO1xuICAgICAgICB0aGlzLmZyb250RmFjZSA9IGZyb250RmFjZTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZGlzYWJsZWQ6ICRSZWFkT25seTxDdWxsRmFjZU1vZGU+O1xuICAgIHN0YXRpYyBiYWNrQ0NXOiAkUmVhZE9ubHk8Q3VsbEZhY2VNb2RlPjtcbn1cblxuQ3VsbEZhY2VNb2RlLmRpc2FibGVkID0gbmV3IEN1bGxGYWNlTW9kZShmYWxzZSwgQkFDSywgQ0NXKTtcbkN1bGxGYWNlTW9kZS5iYWNrQ0NXID0gbmV3IEN1bGxGYWNlTW9kZSh0cnVlLCBCQUNLLCBDQ1cpO1xuXG5leHBvcnQgZGVmYXVsdCBDdWxsRmFjZU1vZGU7XG4iLCIvLyBAZmxvd1xuaW1wb3J0IEluZGV4QnVmZmVyIGZyb20gJy4vaW5kZXhfYnVmZmVyJztcblxuaW1wb3J0IFZlcnRleEJ1ZmZlciBmcm9tICcuL3ZlcnRleF9idWZmZXInO1xuaW1wb3J0IEZyYW1lYnVmZmVyIGZyb20gJy4vZnJhbWVidWZmZXInO1xuaW1wb3J0IERlcHRoTW9kZSBmcm9tICcuL2RlcHRoX21vZGUnO1xuaW1wb3J0IFN0ZW5jaWxNb2RlIGZyb20gJy4vc3RlbmNpbF9tb2RlJztcbmltcG9ydCBDb2xvck1vZGUgZnJvbSAnLi9jb2xvcl9tb2RlJztcbmltcG9ydCBDdWxsRmFjZU1vZGUgZnJvbSAnLi9jdWxsX2ZhY2VfbW9kZSc7XG5pbXBvcnQgeyBkZWVwRXF1YWwgfSBmcm9tICcuLi91dGlsL3V0aWwnO1xuaW1wb3J0IHsgQ2xlYXJDb2xvciwgQ2xlYXJEZXB0aCwgQ2xlYXJTdGVuY2lsLCBDb2xvck1hc2ssIERlcHRoTWFzaywgU3RlbmNpbE1hc2ssIFN0ZW5jaWxGdW5jLCBTdGVuY2lsT3AsIFN0ZW5jaWxUZXN0LCBEZXB0aFJhbmdlLCBEZXB0aFRlc3QsIERlcHRoRnVuYywgQmxlbmQsIEJsZW5kRnVuYywgQmxlbmRDb2xvciwgQmxlbmRFcXVhdGlvbiwgQ3VsbEZhY2UsIEN1bGxGYWNlU2lkZSwgRnJvbnRGYWNlLCBQcm9ncmFtLCBBY3RpdmVUZXh0dXJlVW5pdCwgVmlld3BvcnQsIEJpbmRGcmFtZWJ1ZmZlciwgQmluZFJlbmRlcmJ1ZmZlciwgQmluZFRleHR1cmUsIEJpbmRWZXJ0ZXhCdWZmZXIsIEJpbmRFbGVtZW50QnVmZmVyLCBCaW5kVmVydGV4QXJyYXlPRVMsIFBpeGVsU3RvcmVVbnBhY2ssIFBpeGVsU3RvcmVVbnBhY2tQcmVtdWx0aXBseUFscGhhLCBQaXhlbFN0b3JlVW5wYWNrRmxpcFkgfSBmcm9tICcuL3ZhbHVlJztcblxuXG5pbXBvcnQgdHlwZSB7VHJpYW5nbGVJbmRleEFycmF5LCBMaW5lSW5kZXhBcnJheSwgTGluZVN0cmlwSW5kZXhBcnJheX0gZnJvbSAnLi4vZGF0YS9pbmRleF9hcnJheV90eXBlJztcbmltcG9ydCB0eXBlIHtcbiAgICBTdHJ1Y3RBcnJheSxcbiAgICBTdHJ1Y3RBcnJheU1lbWJlclxufSBmcm9tICcuLi91dGlsL3N0cnVjdF9hcnJheSc7XG5pbXBvcnQgdHlwZSBDb2xvciBmcm9tICcuLi9zdHlsZS1zcGVjL3V0aWwvY29sb3InO1xuXG50eXBlIENsZWFyQXJncyA9IHtcbiAgICBjb2xvcj86IENvbG9yLFxuICAgIGRlcHRoPzogbnVtYmVyLFxuICAgIHN0ZW5jaWw/OiBudW1iZXJcbn07XG5cblxuY2xhc3MgQ29udGV4dCB7XG4gICAgZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dDtcbiAgICBleHRWZXJ0ZXhBcnJheU9iamVjdDogYW55O1xuICAgIGN1cnJlbnROdW1BdHRyaWJ1dGVzOiA/bnVtYmVyO1xuXG4gICAgY2xlYXJDb2xvcjogQ2xlYXJDb2xvcjtcbiAgICBjbGVhckRlcHRoOiBDbGVhckRlcHRoO1xuICAgIGNsZWFyU3RlbmNpbDogQ2xlYXJTdGVuY2lsO1xuICAgIGNvbG9yTWFzazogQ29sb3JNYXNrO1xuICAgIGRlcHRoTWFzazogRGVwdGhNYXNrO1xuICAgIHN0ZW5jaWxNYXNrOiBTdGVuY2lsTWFzaztcbiAgICBzdGVuY2lsRnVuYzogU3RlbmNpbEZ1bmM7XG4gICAgc3RlbmNpbE9wOiBTdGVuY2lsT3A7XG4gICAgc3RlbmNpbFRlc3Q6IFN0ZW5jaWxUZXN0O1xuICAgIGRlcHRoUmFuZ2U6IERlcHRoUmFuZ2U7XG4gICAgZGVwdGhUZXN0OiBEZXB0aFRlc3Q7XG4gICAgZGVwdGhGdW5jOiBEZXB0aEZ1bmM7XG4gICAgYmxlbmQ6IEJsZW5kO1xuICAgIGJsZW5kRnVuYzogQmxlbmRGdW5jO1xuICAgIGJsZW5kQ29sb3I6IEJsZW5kQ29sb3I7XG4gICAgYmxlbmRFcXVhdGlvbjogQmxlbmRFcXVhdGlvbjtcbiAgICBjdWxsRmFjZTogQ3VsbEZhY2U7XG4gICAgY3VsbEZhY2VTaWRlOiBDdWxsRmFjZVNpZGU7XG4gICAgZnJvbnRGYWNlOiBGcm9udEZhY2U7XG4gICAgcHJvZ3JhbTogUHJvZ3JhbTtcbiAgICBhY3RpdmVUZXh0dXJlOiBBY3RpdmVUZXh0dXJlVW5pdDtcbiAgICB2aWV3cG9ydDogVmlld3BvcnQ7XG4gICAgYmluZEZyYW1lYnVmZmVyOiBCaW5kRnJhbWVidWZmZXI7XG4gICAgYmluZFJlbmRlcmJ1ZmZlcjogQmluZFJlbmRlcmJ1ZmZlcjtcbiAgICBiaW5kVGV4dHVyZTogQmluZFRleHR1cmU7XG4gICAgYmluZFZlcnRleEJ1ZmZlcjogQmluZFZlcnRleEJ1ZmZlcjtcbiAgICBiaW5kRWxlbWVudEJ1ZmZlcjogQmluZEVsZW1lbnRCdWZmZXI7XG4gICAgYmluZFZlcnRleEFycmF5T0VTOiBCaW5kVmVydGV4QXJyYXlPRVM7XG4gICAgcGl4ZWxTdG9yZVVucGFjazogUGl4ZWxTdG9yZVVucGFjaztcbiAgICBwaXhlbFN0b3JlVW5wYWNrUHJlbXVsdGlwbHlBbHBoYTogUGl4ZWxTdG9yZVVucGFja1ByZW11bHRpcGx5QWxwaGE7XG4gICAgcGl4ZWxTdG9yZVVucGFja0ZsaXBZOiBQaXhlbFN0b3JlVW5wYWNrRmxpcFk7XG5cbiAgICBleHRUZXh0dXJlRmlsdGVyQW5pc290cm9waWM6IGFueTtcbiAgICBleHRUZXh0dXJlRmlsdGVyQW5pc290cm9waWNNYXg6IGFueTtcbiAgICBleHRUZXh0dXJlSGFsZkZsb2F0OiBhbnk7XG5cbiAgICBjb25zdHJ1Y3RvcihnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0KSB7XG4gICAgICAgIHRoaXMuZ2wgPSBnbDtcbiAgICAgICAgdGhpcy5leHRWZXJ0ZXhBcnJheU9iamVjdCA9IHRoaXMuZ2wuZ2V0RXh0ZW5zaW9uKCdPRVNfdmVydGV4X2FycmF5X29iamVjdCcpO1xuXG4gICAgICAgIHRoaXMuY2xlYXJDb2xvciA9IG5ldyBDbGVhckNvbG9yKHRoaXMpO1xuICAgICAgICB0aGlzLmNsZWFyRGVwdGggPSBuZXcgQ2xlYXJEZXB0aCh0aGlzKTtcbiAgICAgICAgdGhpcy5jbGVhclN0ZW5jaWwgPSBuZXcgQ2xlYXJTdGVuY2lsKHRoaXMpO1xuICAgICAgICB0aGlzLmNvbG9yTWFzayA9IG5ldyBDb2xvck1hc2sodGhpcyk7XG4gICAgICAgIHRoaXMuZGVwdGhNYXNrID0gbmV3IERlcHRoTWFzayh0aGlzKTtcbiAgICAgICAgdGhpcy5zdGVuY2lsTWFzayA9IG5ldyBTdGVuY2lsTWFzayh0aGlzKTtcbiAgICAgICAgdGhpcy5zdGVuY2lsRnVuYyA9IG5ldyBTdGVuY2lsRnVuYyh0aGlzKTtcbiAgICAgICAgdGhpcy5zdGVuY2lsT3AgPSBuZXcgU3RlbmNpbE9wKHRoaXMpO1xuICAgICAgICB0aGlzLnN0ZW5jaWxUZXN0ID0gbmV3IFN0ZW5jaWxUZXN0KHRoaXMpO1xuICAgICAgICB0aGlzLmRlcHRoUmFuZ2UgPSBuZXcgRGVwdGhSYW5nZSh0aGlzKTtcbiAgICAgICAgdGhpcy5kZXB0aFRlc3QgPSBuZXcgRGVwdGhUZXN0KHRoaXMpO1xuICAgICAgICB0aGlzLmRlcHRoRnVuYyA9IG5ldyBEZXB0aEZ1bmModGhpcyk7XG4gICAgICAgIHRoaXMuYmxlbmQgPSBuZXcgQmxlbmQodGhpcyk7XG4gICAgICAgIHRoaXMuYmxlbmRGdW5jID0gbmV3IEJsZW5kRnVuYyh0aGlzKTtcbiAgICAgICAgdGhpcy5ibGVuZENvbG9yID0gbmV3IEJsZW5kQ29sb3IodGhpcyk7XG4gICAgICAgIHRoaXMuYmxlbmRFcXVhdGlvbiA9IG5ldyBCbGVuZEVxdWF0aW9uKHRoaXMpO1xuICAgICAgICB0aGlzLmN1bGxGYWNlID0gbmV3IEN1bGxGYWNlKHRoaXMpO1xuICAgICAgICB0aGlzLmN1bGxGYWNlU2lkZSA9IG5ldyBDdWxsRmFjZVNpZGUodGhpcyk7XG4gICAgICAgIHRoaXMuZnJvbnRGYWNlID0gbmV3IEZyb250RmFjZSh0aGlzKTtcbiAgICAgICAgdGhpcy5wcm9ncmFtID0gbmV3IFByb2dyYW0odGhpcyk7XG4gICAgICAgIHRoaXMuYWN0aXZlVGV4dHVyZSA9IG5ldyBBY3RpdmVUZXh0dXJlVW5pdCh0aGlzKTtcbiAgICAgICAgdGhpcy52aWV3cG9ydCA9IG5ldyBWaWV3cG9ydCh0aGlzKTtcbiAgICAgICAgdGhpcy5iaW5kRnJhbWVidWZmZXIgPSBuZXcgQmluZEZyYW1lYnVmZmVyKHRoaXMpO1xuICAgICAgICB0aGlzLmJpbmRSZW5kZXJidWZmZXIgPSBuZXcgQmluZFJlbmRlcmJ1ZmZlcih0aGlzKTtcbiAgICAgICAgdGhpcy5iaW5kVGV4dHVyZSA9IG5ldyBCaW5kVGV4dHVyZSh0aGlzKTtcbiAgICAgICAgdGhpcy5iaW5kVmVydGV4QnVmZmVyID0gbmV3IEJpbmRWZXJ0ZXhCdWZmZXIodGhpcyk7XG4gICAgICAgIHRoaXMuYmluZEVsZW1lbnRCdWZmZXIgPSBuZXcgQmluZEVsZW1lbnRCdWZmZXIodGhpcyk7XG4gICAgICAgIHRoaXMuYmluZFZlcnRleEFycmF5T0VTID0gdGhpcy5leHRWZXJ0ZXhBcnJheU9iamVjdCAmJiBuZXcgQmluZFZlcnRleEFycmF5T0VTKHRoaXMpO1xuICAgICAgICB0aGlzLnBpeGVsU3RvcmVVbnBhY2sgPSBuZXcgUGl4ZWxTdG9yZVVucGFjayh0aGlzKTtcbiAgICAgICAgdGhpcy5waXhlbFN0b3JlVW5wYWNrUHJlbXVsdGlwbHlBbHBoYSA9IG5ldyBQaXhlbFN0b3JlVW5wYWNrUHJlbXVsdGlwbHlBbHBoYSh0aGlzKTtcbiAgICAgICAgdGhpcy5waXhlbFN0b3JlVW5wYWNrRmxpcFkgPSBuZXcgUGl4ZWxTdG9yZVVucGFja0ZsaXBZKHRoaXMpO1xuXG4gICAgICAgIHRoaXMuZXh0VGV4dHVyZUZpbHRlckFuaXNvdHJvcGljID0gKFxuICAgICAgICAgICAgZ2wuZ2V0RXh0ZW5zaW9uKCdFWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMnKSB8fFxuICAgICAgICAgICAgZ2wuZ2V0RXh0ZW5zaW9uKCdNT1pfRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljJykgfHxcbiAgICAgICAgICAgIGdsLmdldEV4dGVuc2lvbignV0VCS0lUX0VYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYycpXG4gICAgICAgICk7XG4gICAgICAgIGlmICh0aGlzLmV4dFRleHR1cmVGaWx0ZXJBbmlzb3Ryb3BpYykge1xuICAgICAgICAgICAgdGhpcy5leHRUZXh0dXJlRmlsdGVyQW5pc290cm9waWNNYXggPSBnbC5nZXRQYXJhbWV0ZXIodGhpcy5leHRUZXh0dXJlRmlsdGVyQW5pc290cm9waWMuTUFYX1RFWFRVUkVfTUFYX0FOSVNPVFJPUFlfRVhUKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZXh0VGV4dHVyZUhhbGZGbG9hdCA9IGdsLmdldEV4dGVuc2lvbignT0VTX3RleHR1cmVfaGFsZl9mbG9hdCcpO1xuICAgICAgICBpZiAodGhpcy5leHRUZXh0dXJlSGFsZkZsb2F0KSB7XG4gICAgICAgICAgICBnbC5nZXRFeHRlbnNpb24oJ09FU190ZXh0dXJlX2hhbGZfZmxvYXRfbGluZWFyJyk7XG4gICAgICAgIH1cblxuICAgIH1cblxuICAgIHNldERpcnR5KCkge1xuICAgICAgICB0aGlzLmNsZWFyQ29sb3IuZGlydHkgPSB0cnVlO1xuICAgICAgICB0aGlzLmNsZWFyRGVwdGguZGlydHkgPSB0cnVlO1xuICAgICAgICB0aGlzLmNsZWFyU3RlbmNpbC5kaXJ0eSA9IHRydWU7XG4gICAgICAgIHRoaXMuY29sb3JNYXNrLmRpcnR5ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5kZXB0aE1hc2suZGlydHkgPSB0cnVlO1xuICAgICAgICB0aGlzLnN0ZW5jaWxNYXNrLmRpcnR5ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zdGVuY2lsRnVuYy5kaXJ0eSA9IHRydWU7XG4gICAgICAgIHRoaXMuc3RlbmNpbE9wLmRpcnR5ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zdGVuY2lsVGVzdC5kaXJ0eSA9IHRydWU7XG4gICAgICAgIHRoaXMuZGVwdGhSYW5nZS5kaXJ0eSA9IHRydWU7XG4gICAgICAgIHRoaXMuZGVwdGhUZXN0LmRpcnR5ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5kZXB0aEZ1bmMuZGlydHkgPSB0cnVlO1xuICAgICAgICB0aGlzLmJsZW5kLmRpcnR5ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5ibGVuZEZ1bmMuZGlydHkgPSB0cnVlO1xuICAgICAgICB0aGlzLmJsZW5kQ29sb3IuZGlydHkgPSB0cnVlO1xuICAgICAgICB0aGlzLmJsZW5kRXF1YXRpb24uZGlydHkgPSB0cnVlO1xuICAgICAgICB0aGlzLmN1bGxGYWNlLmRpcnR5ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5jdWxsRmFjZVNpZGUuZGlydHkgPSB0cnVlO1xuICAgICAgICB0aGlzLmZyb250RmFjZS5kaXJ0eSA9IHRydWU7XG4gICAgICAgIHRoaXMucHJvZ3JhbS5kaXJ0eSA9IHRydWU7XG4gICAgICAgIHRoaXMuYWN0aXZlVGV4dHVyZS5kaXJ0eSA9IHRydWU7XG4gICAgICAgIHRoaXMudmlld3BvcnQuZGlydHkgPSB0cnVlO1xuICAgICAgICB0aGlzLmJpbmRGcmFtZWJ1ZmZlci5kaXJ0eSA9IHRydWU7XG4gICAgICAgIHRoaXMuYmluZFJlbmRlcmJ1ZmZlci5kaXJ0eSA9IHRydWU7XG4gICAgICAgIHRoaXMuYmluZFRleHR1cmUuZGlydHkgPSB0cnVlO1xuICAgICAgICB0aGlzLmJpbmRWZXJ0ZXhCdWZmZXIuZGlydHkgPSB0cnVlO1xuICAgICAgICB0aGlzLmJpbmRFbGVtZW50QnVmZmVyLmRpcnR5ID0gdHJ1ZTtcbiAgICAgICAgaWYgKHRoaXMuZXh0VmVydGV4QXJyYXlPYmplY3QpIHtcbiAgICAgICAgICAgIHRoaXMuYmluZFZlcnRleEFycmF5T0VTLmRpcnR5ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBpeGVsU3RvcmVVbnBhY2suZGlydHkgPSB0cnVlO1xuICAgICAgICB0aGlzLnBpeGVsU3RvcmVVbnBhY2tQcmVtdWx0aXBseUFscGhhLmRpcnR5ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5waXhlbFN0b3JlVW5wYWNrRmxpcFkuZGlydHkgPSB0cnVlO1xuICAgIH1cblxuICAgIGNyZWF0ZUluZGV4QnVmZmVyKGFycmF5OiBUcmlhbmdsZUluZGV4QXJyYXkgfCBMaW5lSW5kZXhBcnJheSB8IExpbmVTdHJpcEluZGV4QXJyYXksIGR5bmFtaWNEcmF3PzogYm9vbGVhbikge1xuICAgICAgICByZXR1cm4gbmV3IEluZGV4QnVmZmVyKHRoaXMsIGFycmF5LCBkeW5hbWljRHJhdyk7XG4gICAgfVxuXG4gICAgY3JlYXRlVmVydGV4QnVmZmVyKGFycmF5OiBTdHJ1Y3RBcnJheSwgYXR0cmlidXRlczogJFJlYWRPbmx5QXJyYXk8U3RydWN0QXJyYXlNZW1iZXI+LCBkeW5hbWljRHJhdz86IGJvb2xlYW4pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBWZXJ0ZXhCdWZmZXIodGhpcywgYXJyYXksIGF0dHJpYnV0ZXMsIGR5bmFtaWNEcmF3KTtcbiAgICB9XG5cbiAgICBjcmVhdGVSZW5kZXJidWZmZXIoc3RvcmFnZUZvcm1hdDogbnVtYmVyLCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcikge1xuICAgICAgICBjb25zdCBnbCA9IHRoaXMuZ2w7XG5cbiAgICAgICAgY29uc3QgcmJvID0gZ2wuY3JlYXRlUmVuZGVyYnVmZmVyKCk7XG4gICAgICAgIHRoaXMuYmluZFJlbmRlcmJ1ZmZlci5zZXQocmJvKTtcbiAgICAgICAgZ2wucmVuZGVyYnVmZmVyU3RvcmFnZShnbC5SRU5ERVJCVUZGRVIsIHN0b3JhZ2VGb3JtYXQsIHdpZHRoLCBoZWlnaHQpO1xuICAgICAgICB0aGlzLmJpbmRSZW5kZXJidWZmZXIuc2V0KG51bGwpO1xuXG4gICAgICAgIHJldHVybiByYm87XG4gICAgfVxuXG4gICAgY3JlYXRlRnJhbWVidWZmZXIod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBGcmFtZWJ1ZmZlcih0aGlzLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICB9XG5cbiAgICBjbGVhcih7Y29sb3IsIGRlcHRofTogQ2xlYXJBcmdzKSB7XG4gICAgICAgIGNvbnN0IGdsID0gdGhpcy5nbDtcbiAgICAgICAgbGV0IG1hc2sgPSAwO1xuXG4gICAgICAgIGlmIChjb2xvcikge1xuICAgICAgICAgICAgbWFzayB8PSBnbC5DT0xPUl9CVUZGRVJfQklUO1xuICAgICAgICAgICAgdGhpcy5jbGVhckNvbG9yLnNldChjb2xvcik7XG4gICAgICAgICAgICB0aGlzLmNvbG9yTWFzay5zZXQoW3RydWUsIHRydWUsIHRydWUsIHRydWVdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgZGVwdGggIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBtYXNrIHw9IGdsLkRFUFRIX0JVRkZFUl9CSVQ7XG5cbiAgICAgICAgICAgIC8vIFdvcmthcm91bmQgZm9yIHBsYXRmb3JtcyB3aGVyZSBjbGVhckRlcHRoIGRvZXNuJ3Qgc2VlbSB0byB3b3JrXG4gICAgICAgICAgICAvLyB3aXRob3V0IHJlc2V0aW5nIHRoZSBkZXB0aFJhbmdlLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL21hcGJveC9tYXBib3gtZ2wtanMvaXNzdWVzLzM0MzdcbiAgICAgICAgICAgIHRoaXMuZGVwdGhSYW5nZS5zZXQoWzAsIDFdKTtcblxuICAgICAgICAgICAgdGhpcy5jbGVhckRlcHRoLnNldChkZXB0aCk7XG4gICAgICAgICAgICB0aGlzLmRlcHRoTWFzay5zZXQodHJ1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTZWUgbm90ZSBpbiBQYWludGVyI2NsZWFyU3RlbmNpbDogaW1wbGVtZW50IHRoaXMgdGhlIGVhc3kgd2F5IG9uY2UgR1BVIGJ1Zy93b3JrYXJvdW5kIGlzIGZpeGVkIHVwc3RyZWFtXG4gICAgICAgIC8vIGlmICh0eXBlb2Ygc3RlbmNpbCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgLy8gICAgIG1hc2sgfD0gZ2wuU1RFTkNJTF9CVUZGRVJfQklUO1xuICAgICAgICAvLyAgICAgdGhpcy5jbGVhclN0ZW5jaWwuc2V0KHN0ZW5jaWwpO1xuICAgICAgICAvLyAgICAgdGhpcy5zdGVuY2lsTWFzay5zZXQoMHhGRik7XG4gICAgICAgIC8vIH1cblxuICAgICAgICBnbC5jbGVhcihtYXNrKTtcbiAgICB9XG5cbiAgICBzZXRDdWxsRmFjZShjdWxsRmFjZU1vZGU6ICRSZWFkT25seTxDdWxsRmFjZU1vZGU+KSB7XG4gICAgICAgIGlmIChjdWxsRmFjZU1vZGUuZW5hYmxlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgdGhpcy5jdWxsRmFjZS5zZXQoZmFsc2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jdWxsRmFjZS5zZXQodHJ1ZSk7XG4gICAgICAgICAgICB0aGlzLmN1bGxGYWNlU2lkZS5zZXQoY3VsbEZhY2VNb2RlLm1vZGUpO1xuICAgICAgICAgICAgdGhpcy5mcm9udEZhY2Uuc2V0KGN1bGxGYWNlTW9kZS5mcm9udEZhY2UpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2V0RGVwdGhNb2RlKGRlcHRoTW9kZTogJFJlYWRPbmx5PERlcHRoTW9kZT4pIHtcbiAgICAgICAgaWYgKGRlcHRoTW9kZS5mdW5jID09PSB0aGlzLmdsLkFMV0FZUyAmJiAhZGVwdGhNb2RlLm1hc2spIHtcbiAgICAgICAgICAgIHRoaXMuZGVwdGhUZXN0LnNldChmYWxzZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmRlcHRoVGVzdC5zZXQodHJ1ZSk7XG4gICAgICAgICAgICB0aGlzLmRlcHRoRnVuYy5zZXQoZGVwdGhNb2RlLmZ1bmMpO1xuICAgICAgICAgICAgdGhpcy5kZXB0aE1hc2suc2V0KGRlcHRoTW9kZS5tYXNrKTtcbiAgICAgICAgICAgIHRoaXMuZGVwdGhSYW5nZS5zZXQoZGVwdGhNb2RlLnJhbmdlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNldFN0ZW5jaWxNb2RlKHN0ZW5jaWxNb2RlOiAkUmVhZE9ubHk8U3RlbmNpbE1vZGU+KSB7XG4gICAgICAgIGlmIChzdGVuY2lsTW9kZS50ZXN0LmZ1bmMgPT09IHRoaXMuZ2wuQUxXQVlTICYmICFzdGVuY2lsTW9kZS5tYXNrKSB7XG4gICAgICAgICAgICB0aGlzLnN0ZW5jaWxUZXN0LnNldChmYWxzZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnN0ZW5jaWxUZXN0LnNldCh0cnVlKTtcbiAgICAgICAgICAgIHRoaXMuc3RlbmNpbE1hc2suc2V0KHN0ZW5jaWxNb2RlLm1hc2spO1xuICAgICAgICAgICAgdGhpcy5zdGVuY2lsT3Auc2V0KFtzdGVuY2lsTW9kZS5mYWlsLCBzdGVuY2lsTW9kZS5kZXB0aEZhaWwsIHN0ZW5jaWxNb2RlLnBhc3NdKTtcbiAgICAgICAgICAgIHRoaXMuc3RlbmNpbEZ1bmMuc2V0KHtcbiAgICAgICAgICAgICAgICBmdW5jOiBzdGVuY2lsTW9kZS50ZXN0LmZ1bmMsXG4gICAgICAgICAgICAgICAgcmVmOiBzdGVuY2lsTW9kZS5yZWYsXG4gICAgICAgICAgICAgICAgbWFzazogc3RlbmNpbE1vZGUudGVzdC5tYXNrXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNldENvbG9yTW9kZShjb2xvck1vZGU6ICRSZWFkT25seTxDb2xvck1vZGU+KSB7XG4gICAgICAgIGlmIChkZWVwRXF1YWwoY29sb3JNb2RlLmJsZW5kRnVuY3Rpb24sIENvbG9yTW9kZS5SZXBsYWNlKSkge1xuICAgICAgICAgICAgdGhpcy5ibGVuZC5zZXQoZmFsc2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5ibGVuZC5zZXQodHJ1ZSk7XG4gICAgICAgICAgICB0aGlzLmJsZW5kRnVuYy5zZXQoY29sb3JNb2RlLmJsZW5kRnVuY3Rpb24pO1xuICAgICAgICAgICAgdGhpcy5ibGVuZENvbG9yLnNldChjb2xvck1vZGUuYmxlbmRDb2xvcik7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbG9yTWFzay5zZXQoY29sb3JNb2RlLm1hc2spO1xuICAgIH1cblxuICAgIHVuYmluZFZBTygpIHtcbiAgICAgICAgLy8gVW5iaW5kaW5nIHRoZSBWQU8gcHJldmVudHMgb3RoZXIgdGhpbmdzIChjdXN0b20gbGF5ZXJzLCBuZXcgYnVmZmVyIGNyZWF0aW9uKSBmcm9tXG4gICAgICAgIC8vIHVuaW50ZW50aW9uYWxseSBjaGFuZ2luZyB0aGUgc3RhdGUgb2YgdGhlIGxhc3QgVkFPIHVzZWQuXG4gICAgICAgIGlmICh0aGlzLmV4dFZlcnRleEFycmF5T2JqZWN0KSB7XG4gICAgICAgICAgICB0aGlzLmJpbmRWZXJ0ZXhBcnJheU9FUy5zZXQobnVsbCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IENvbnRleHQ7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgeyBjcmVhdGUgYXMgY3JlYXRlU291cmNlIH0gZnJvbSAnLi9zb3VyY2UnO1xuXG5pbXBvcnQgVGlsZSBmcm9tICcuL3RpbGUnO1xuaW1wb3J0IHsgRXZlbnQsIEVycm9yRXZlbnQsIEV2ZW50ZWQgfSBmcm9tICcuLi91dGlsL2V2ZW50ZWQnO1xuaW1wb3J0IFRpbGVDYWNoZSBmcm9tICcuL3RpbGVfY2FjaGUnO1xuaW1wb3J0IE1lcmNhdG9yQ29vcmRpbmF0ZSBmcm9tICcuLi9nZW8vbWVyY2F0b3JfY29vcmRpbmF0ZSc7XG5pbXBvcnQgeyBrZXlzRGlmZmVyZW5jZSB9IGZyb20gJy4uL3V0aWwvdXRpbCc7XG5pbXBvcnQgRVhURU5UIGZyb20gJy4uL2RhdGEvZXh0ZW50JztcbmltcG9ydCBDb250ZXh0IGZyb20gJy4uL2dsL2NvbnRleHQnO1xuaW1wb3J0IFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuaW1wb3J0IGJyb3dzZXIgZnJvbSAnLi4vdXRpbC9icm93c2VyJztcbmltcG9ydCB7IE92ZXJzY2FsZWRUaWxlSUQgfSBmcm9tICcuL3RpbGVfaWQnO1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IFNvdXJjZUZlYXR1cmVTdGF0ZSBmcm9tICcuL3NvdXJjZV9zdGF0ZSc7XG5cbmltcG9ydCB0eXBlIHtTb3VyY2V9IGZyb20gJy4vc291cmNlJztcbmltcG9ydCB0eXBlIE1hcCBmcm9tICcuLi91aS9tYXAnO1xuaW1wb3J0IHR5cGUgU3R5bGUgZnJvbSAnLi4vc3R5bGUvc3R5bGUnO1xuaW1wb3J0IHR5cGUgRGlzcGF0Y2hlciBmcm9tICcuLi91dGlsL2Rpc3BhdGNoZXInO1xuaW1wb3J0IHR5cGUgVHJhbnNmb3JtIGZyb20gJy4uL2dlby90cmFuc2Zvcm0nO1xuaW1wb3J0IHR5cGUge1RpbGVTdGF0ZX0gZnJvbSAnLi90aWxlJztcbmltcG9ydCB0eXBlIHtDYWxsYmFja30gZnJvbSAnLi4vdHlwZXMvY2FsbGJhY2snO1xuaW1wb3J0IHR5cGUge1NvdXJjZVNwZWNpZmljYXRpb259IGZyb20gJy4uL3N0eWxlLXNwZWMvdHlwZXMnO1xuXG4vKipcbiAqIGBTb3VyY2VDYWNoZWAgaXMgcmVzcG9uc2libGUgZm9yXG4gKlxuICogIC0gY3JlYXRpbmcgYW4gaW5zdGFuY2Ugb2YgYFNvdXJjZWBcbiAqICAtIGZvcndhcmRpbmcgZXZlbnRzIGZyb20gYFNvdXJjZWBcbiAqICAtIGNhY2hpbmcgdGlsZXMgbG9hZGVkIGZyb20gYW4gaW5zdGFuY2Ugb2YgYFNvdXJjZWBcbiAqICAtIGxvYWRpbmcgdGhlIHRpbGVzIG5lZWRlZCB0byByZW5kZXIgYSBnaXZlbiB2aWV3cG9ydFxuICogIC0gdW5sb2FkaW5nIHRoZSBjYWNoZWQgdGlsZXMgbm90IG5lZWRlZCB0byByZW5kZXIgYSBnaXZlbiB2aWV3cG9ydFxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIFNvdXJjZUNhY2hlIGV4dGVuZHMgRXZlbnRlZCB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBkaXNwYXRjaGVyOiBEaXNwYXRjaGVyO1xuICAgIG1hcDogTWFwO1xuICAgIHN0eWxlOiBTdHlsZTtcblxuICAgIF9zb3VyY2U6IFNvdXJjZTtcbiAgICBfc291cmNlTG9hZGVkOiBib29sZWFuO1xuICAgIF9zb3VyY2VFcnJvcmVkOiBib29sZWFuO1xuICAgIF90aWxlczoge1thbnldOiBUaWxlfTtcbiAgICBfcHJldkxuZzogbnVtYmVyIHwgdm9pZDtcbiAgICBfY2FjaGU6IFRpbGVDYWNoZTtcbiAgICBfdGltZXJzOiB7W2FueV06IFRpbWVvdXRJRH07XG4gICAgX2NhY2hlVGltZXJzOiB7W2FueV06IFRpbWVvdXRJRH07XG4gICAgX21heFRpbGVDYWNoZVNpemU6ID9udW1iZXI7XG4gICAgX3BhdXNlZDogYm9vbGVhbjtcbiAgICBfc2hvdWxkUmVsb2FkT25SZXN1bWU6IGJvb2xlYW47XG4gICAgX2NvdmVyZWRUaWxlczoge1thbnldOiBib29sZWFufTtcbiAgICB0cmFuc2Zvcm06IFRyYW5zZm9ybTtcbiAgICBfaXNJZFJlbmRlcmFibGU6IChpZDogbnVtYmVyLCBzeW1ib2xMYXllcj86IGJvb2xlYW4pID0+IGJvb2xlYW47XG4gICAgdXNlZDogYm9vbGVhbjtcbiAgICBfc3RhdGU6IFNvdXJjZUZlYXR1cmVTdGF0ZTtcblxuICAgIHN0YXRpYyBtYXhVbmRlcnpvb21pbmc6IG51bWJlcjtcbiAgICBzdGF0aWMgbWF4T3Zlcnpvb21pbmc6IG51bWJlcjtcblxuICAgIGNvbnN0cnVjdG9yKGlkOiBzdHJpbmcsIG9wdGlvbnM6IFNvdXJjZVNwZWNpZmljYXRpb24sIGRpc3BhdGNoZXI6IERpc3BhdGNoZXIpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5pZCA9IGlkO1xuICAgICAgICB0aGlzLmRpc3BhdGNoZXIgPSBkaXNwYXRjaGVyO1xuXG4gICAgICAgIHRoaXMub24oJ2RhdGEnLCAoZSkgPT4ge1xuICAgICAgICAgICAgLy8gdGhpcy5fc291cmNlTG9hZGVkIHNpZ25pZmllcyB0aGF0IHRoZSBUaWxlSlNPTiBpcyBsb2FkZWQgaWYgYXBwbGljYWJsZS5cbiAgICAgICAgICAgIC8vIGlmIHRoZSBzb3VyY2UgdHlwZSBkb2VzIG5vdCBjb21lIHdpdGggYSBUaWxlSlNPTiwgdGhlIGZsYWcgc2lnbmlmaWVzIHRoZVxuICAgICAgICAgICAgLy8gc291cmNlIGRhdGEgaGFzIGxvYWRlZCAoaS5lIGdlb2pzb24gaGFzIGJlZW4gdGlsZWQgb24gdGhlIHdvcmtlciBhbmQgaXMgcmVhZHkpXG4gICAgICAgICAgICBpZiAoZS5kYXRhVHlwZSA9PT0gJ3NvdXJjZScgJiYgZS5zb3VyY2VEYXRhVHlwZSA9PT0gJ21ldGFkYXRhJykgdGhpcy5fc291cmNlTG9hZGVkID0gdHJ1ZTtcblxuICAgICAgICAgICAgLy8gZm9yIHNvdXJjZXMgd2l0aCBtdXRhYmxlIGRhdGEsIHRoaXMgZXZlbnQgZmlyZXMgd2hlbiB0aGUgdW5kZXJseWluZyBkYXRhXG4gICAgICAgICAgICAvLyB0byBhIHNvdXJjZSBpcyBjaGFuZ2VkLiAoaS5lLiBHZW9KU09OU291cmNlI3NldERhdGEgYW5kIEltYWdlU291cmNlI3NlckNvb3JkaW5hdGVzKVxuICAgICAgICAgICAgaWYgKHRoaXMuX3NvdXJjZUxvYWRlZCAmJiAhdGhpcy5fcGF1c2VkICYmIGUuZGF0YVR5cGUgPT09IFwic291cmNlXCIgJiYgZS5zb3VyY2VEYXRhVHlwZSA9PT0gJ2NvbnRlbnQnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWxvYWQoKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy50cmFuc2Zvcm0pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGUodGhpcy50cmFuc2Zvcm0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5vbignZXJyb3InLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9zb3VyY2VFcnJvcmVkID0gdHJ1ZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5fc291cmNlID0gY3JlYXRlU291cmNlKGlkLCBvcHRpb25zLCBkaXNwYXRjaGVyLCB0aGlzKTtcblxuICAgICAgICB0aGlzLl90aWxlcyA9IHt9O1xuICAgICAgICB0aGlzLl9jYWNoZSA9IG5ldyBUaWxlQ2FjaGUoMCwgdGhpcy5fdW5sb2FkVGlsZS5iaW5kKHRoaXMpKTtcbiAgICAgICAgdGhpcy5fdGltZXJzID0ge307XG4gICAgICAgIHRoaXMuX2NhY2hlVGltZXJzID0ge307XG4gICAgICAgIHRoaXMuX21heFRpbGVDYWNoZVNpemUgPSBudWxsO1xuXG4gICAgICAgIHRoaXMuX2NvdmVyZWRUaWxlcyA9IHt9O1xuICAgICAgICB0aGlzLl9zdGF0ZSA9IG5ldyBTb3VyY2VGZWF0dXJlU3RhdGUoKTtcbiAgICB9XG5cbiAgICBvbkFkZChtYXA6IE1hcCkge1xuICAgICAgICB0aGlzLm1hcCA9IG1hcDtcbiAgICAgICAgdGhpcy5fbWF4VGlsZUNhY2hlU2l6ZSA9IG1hcCA/IG1hcC5fbWF4VGlsZUNhY2hlU2l6ZSA6IG51bGw7XG4gICAgICAgIGlmICh0aGlzLl9zb3VyY2UgJiYgdGhpcy5fc291cmNlLm9uQWRkKSB7XG4gICAgICAgICAgICB0aGlzLl9zb3VyY2Uub25BZGQobWFwKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uUmVtb3ZlKG1hcDogTWFwKSB7XG4gICAgICAgIGlmICh0aGlzLl9zb3VyY2UgJiYgdGhpcy5fc291cmNlLm9uUmVtb3ZlKSB7XG4gICAgICAgICAgICB0aGlzLl9zb3VyY2Uub25SZW1vdmUobWFwKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybiB0cnVlIGlmIG5vIHRpbGUgZGF0YSBpcyBwZW5kaW5nLCB0aWxlcyB3aWxsIG5vdCBjaGFuZ2UgdW5sZXNzXG4gICAgICogYW4gYWRkaXRpb25hbCBBUEkgY2FsbCBpcyByZWNlaXZlZC5cbiAgICAgKi9cbiAgICBsb2FkZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICh0aGlzLl9zb3VyY2VFcnJvcmVkKSB7IHJldHVybiB0cnVlOyB9XG4gICAgICAgIGlmICghdGhpcy5fc291cmNlTG9hZGVkKSB7IHJldHVybiBmYWxzZTsgfVxuICAgICAgICBmb3IgKGNvbnN0IHQgaW4gdGhpcy5fdGlsZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHRpbGUgPSB0aGlzLl90aWxlc1t0XTtcbiAgICAgICAgICAgIGlmICh0aWxlLnN0YXRlICE9PSAnbG9hZGVkJyAmJiB0aWxlLnN0YXRlICE9PSAnZXJyb3JlZCcpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGdldFNvdXJjZSgpOiBTb3VyY2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5fc291cmNlO1xuICAgIH1cblxuICAgIHBhdXNlKCkge1xuICAgICAgICB0aGlzLl9wYXVzZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIHJlc3VtZSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9wYXVzZWQpIHJldHVybjtcbiAgICAgICAgY29uc3Qgc2hvdWxkUmVsb2FkID0gdGhpcy5fc2hvdWxkUmVsb2FkT25SZXN1bWU7XG4gICAgICAgIHRoaXMuX3BhdXNlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9zaG91bGRSZWxvYWRPblJlc3VtZSA9IGZhbHNlO1xuICAgICAgICBpZiAoc2hvdWxkUmVsb2FkKSB0aGlzLnJlbG9hZCgpO1xuICAgICAgICBpZiAodGhpcy50cmFuc2Zvcm0pIHRoaXMudXBkYXRlKHRoaXMudHJhbnNmb3JtKTtcbiAgICB9XG5cbiAgICBfbG9hZFRpbGUodGlsZTogVGlsZSwgY2FsbGJhY2s6IENhbGxiYWNrPHZvaWQ+KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zb3VyY2UubG9hZFRpbGUodGlsZSwgY2FsbGJhY2spO1xuICAgIH1cblxuICAgIF91bmxvYWRUaWxlKHRpbGU6IFRpbGUpIHtcbiAgICAgICAgaWYgKHRoaXMuX3NvdXJjZS51bmxvYWRUaWxlKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3NvdXJjZS51bmxvYWRUaWxlKHRpbGUsICgpID0+IHt9KTtcbiAgICB9XG5cbiAgICBfYWJvcnRUaWxlKHRpbGU6IFRpbGUpIHtcbiAgICAgICAgaWYgKHRoaXMuX3NvdXJjZS5hYm9ydFRpbGUpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fc291cmNlLmFib3J0VGlsZSh0aWxlLCAoKSA9PiB7fSk7XG4gICAgfVxuXG4gICAgc2VyaWFsaXplKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc291cmNlLnNlcmlhbGl6ZSgpO1xuICAgIH1cblxuICAgIHByZXBhcmUoY29udGV4dDogQ29udGV4dCkge1xuICAgICAgICBpZiAgKHRoaXMuX3NvdXJjZS5wcmVwYXJlKSB7XG4gICAgICAgICAgICB0aGlzLl9zb3VyY2UucHJlcGFyZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fc3RhdGUuY29hbGVzY2VDaGFuZ2VzKHRoaXMuX3RpbGVzLCB0aGlzLm1hcCA/IHRoaXMubWFwLnBhaW50ZXIgOiBudWxsKTtcbiAgICAgICAgZm9yIChjb25zdCBpIGluIHRoaXMuX3RpbGVzKSB7XG4gICAgICAgICAgICBjb25zdCB0aWxlID0gdGhpcy5fdGlsZXNbaV07XG4gICAgICAgICAgICB0aWxlLnVwbG9hZChjb250ZXh0KTtcbiAgICAgICAgICAgIHRpbGUucHJlcGFyZSh0aGlzLm1hcC5zdHlsZS5pbWFnZU1hbmFnZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIGFsbCB0aWxlIGlkcyBvcmRlcmVkIHdpdGggei1vcmRlciwgYW5kIGNhc3QgdG8gbnVtYmVyc1xuICAgICAqL1xuICAgIGdldElkcygpOiBBcnJheTxudW1iZXI+IHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuX3RpbGVzKS5tYXAoTnVtYmVyKS5zb3J0KGNvbXBhcmVLZXlab29tKTtcbiAgICB9XG5cbiAgICBnZXRSZW5kZXJhYmxlSWRzKHN5bWJvbExheWVyPzogYm9vbGVhbik6IEFycmF5PG51bWJlcj4ge1xuICAgICAgICBjb25zdCBpZHMgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBpZCBpbiB0aGlzLl90aWxlcykge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2lzSWRSZW5kZXJhYmxlKCtpZCwgc3ltYm9sTGF5ZXIpKSBpZHMucHVzaCgraWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzeW1ib2xMYXllcikge1xuICAgICAgICAgICAgcmV0dXJuIGlkcy5zb3J0KChhXywgYl8pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBhID0gdGhpcy5fdGlsZXNbYV9dLnRpbGVJRDtcbiAgICAgICAgICAgICAgICBjb25zdCBiID0gdGhpcy5fdGlsZXNbYl9dLnRpbGVJRDtcbiAgICAgICAgICAgICAgICBjb25zdCByb3RhdGVkQSA9IChuZXcgUG9pbnQoYS5jYW5vbmljYWwueCwgYS5jYW5vbmljYWwueSkpLl9yb3RhdGUodGhpcy50cmFuc2Zvcm0uYW5nbGUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvdGF0ZWRCID0gKG5ldyBQb2ludChiLmNhbm9uaWNhbC54LCBiLmNhbm9uaWNhbC55KSkuX3JvdGF0ZSh0aGlzLnRyYW5zZm9ybS5hbmdsZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGEub3ZlcnNjYWxlZFogLSBiLm92ZXJzY2FsZWRaIHx8IHJvdGF0ZWRCLnkgLSByb3RhdGVkQS55IHx8IHJvdGF0ZWRCLnggLSByb3RhdGVkQS54O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlkcy5zb3J0KGNvbXBhcmVLZXlab29tKTtcbiAgICB9XG5cbiAgICBoYXNSZW5kZXJhYmxlUGFyZW50KHRpbGVJRDogT3ZlcnNjYWxlZFRpbGVJRCkge1xuICAgICAgICBjb25zdCBwYXJlbnRUaWxlID0gdGhpcy5maW5kTG9hZGVkUGFyZW50KHRpbGVJRCwgMCk7XG4gICAgICAgIGlmIChwYXJlbnRUaWxlKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5faXNJZFJlbmRlcmFibGUocGFyZW50VGlsZS50aWxlSUQua2V5KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgX2lzSWRSZW5kZXJhYmxlKGlkOiBudW1iZXIsIHN5bWJvbExheWVyPzogYm9vbGVhbikge1xuICAgICAgICByZXR1cm4gdGhpcy5fdGlsZXNbaWRdICYmIHRoaXMuX3RpbGVzW2lkXS5oYXNEYXRhKCkgJiZcbiAgICAgICAgICAgICF0aGlzLl9jb3ZlcmVkVGlsZXNbaWRdICYmIChzeW1ib2xMYXllciB8fCAhdGhpcy5fdGlsZXNbaWRdLmhvbGRpbmdGb3JGYWRlKCkpO1xuICAgIH1cblxuICAgIHJlbG9hZCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3BhdXNlZCkge1xuICAgICAgICAgICAgdGhpcy5fc2hvdWxkUmVsb2FkT25SZXN1bWUgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fY2FjaGUucmVzZXQoKTtcblxuICAgICAgICBmb3IgKGNvbnN0IGkgaW4gdGhpcy5fdGlsZXMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl90aWxlc1tpXS5zdGF0ZSAhPT0gXCJlcnJvcmVkXCIpIHRoaXMuX3JlbG9hZFRpbGUoaSwgJ3JlbG9hZGluZycpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX3JlbG9hZFRpbGUoaWQ6IHN0cmluZyB8IG51bWJlciwgc3RhdGU6IFRpbGVTdGF0ZSkge1xuICAgICAgICBjb25zdCB0aWxlID0gdGhpcy5fdGlsZXNbaWRdO1xuXG4gICAgICAgIC8vIHRoaXMgcG90ZW50aWFsbHkgZG9lcyBub3QgYWRkcmVzcyBhbGwgdW5kZXJseWluZ1xuICAgICAgICAvLyBpc3N1ZXMgaHR0cHM6Ly9naXRodWIuY29tL21hcGJveC9tYXBib3gtZ2wtanMvaXNzdWVzLzQyNTJcbiAgICAgICAgLy8gLSBoYXJkIHRvIHRlbGwgd2l0aG91dCByZXBybyBzdGVwc1xuICAgICAgICBpZiAoIXRpbGUpIHJldHVybjtcblxuICAgICAgICAvLyBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIFwibG9hZGluZ1wiIHRpbGVzIGFuZCBcInJlbG9hZGluZ1wiIG9yIFwiZXhwaXJlZFwiXG4gICAgICAgIC8vIHRpbGVzIGlzIHRoYXQgXCJyZWxvYWRpbmdcIi9cImV4cGlyZWRcIiB0aWxlcyBhcmUgXCJyZW5kZXJhYmxlXCIuXG4gICAgICAgIC8vIFRoZXJlZm9yZSwgYSBcImxvYWRpbmdcIiB0aWxlIGNhbm5vdCBiZWNvbWUgYSBcInJlbG9hZGluZ1wiIHRpbGUgd2l0aG91dFxuICAgICAgICAvLyBmaXJzdCBiZWNvbWluZyBhIFwibG9hZGVkXCIgdGlsZS5cbiAgICAgICAgaWYgKHRpbGUuc3RhdGUgIT09ICdsb2FkaW5nJykge1xuICAgICAgICAgICAgdGlsZS5zdGF0ZSA9IHN0YXRlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fbG9hZFRpbGUodGlsZSwgdGhpcy5fdGlsZUxvYWRlZC5iaW5kKHRoaXMsIHRpbGUsIGlkLCBzdGF0ZSkpO1xuICAgIH1cblxuICAgIF90aWxlTG9hZGVkKHRpbGU6IFRpbGUsIGlkOiBzdHJpbmcgfCBudW1iZXIsIHByZXZpb3VzU3RhdGU6IFRpbGVTdGF0ZSwgZXJyOiA/RXJyb3IpIHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgdGlsZS5zdGF0ZSA9ICdlcnJvcmVkJztcbiAgICAgICAgICAgIGlmICgoZXJyOiBhbnkpLnN0YXR1cyAhPT0gNDA0KSB0aGlzLl9zb3VyY2UuZmlyZShuZXcgRXJyb3JFdmVudChlcnIsIHt0aWxlfSkpO1xuICAgICAgICAgICAgLy8gY29udGludWUgdG8gdHJ5IGxvYWRpbmcgcGFyZW50L2NoaWxkcmVuIHRpbGVzIGlmIGEgdGlsZSBkb2Vzbid0IGV4aXN0ICg0MDQpXG4gICAgICAgICAgICBlbHNlIHRoaXMudXBkYXRlKHRoaXMudHJhbnNmb3JtKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRpbGUudGltZUFkZGVkID0gYnJvd3Nlci5ub3coKTtcbiAgICAgICAgaWYgKHByZXZpb3VzU3RhdGUgPT09ICdleHBpcmVkJykgdGlsZS5yZWZyZXNoZWRVcG9uRXhwaXJhdGlvbiA9IHRydWU7XG4gICAgICAgIHRoaXMuX3NldFRpbGVSZWxvYWRUaW1lcihpZCwgdGlsZSk7XG4gICAgICAgIGlmICh0aGlzLmdldFNvdXJjZSgpLnR5cGUgPT09ICdyYXN0ZXItZGVtJyAmJiB0aWxlLmRlbSkgdGhpcy5fYmFja2ZpbGxERU0odGlsZSk7XG4gICAgICAgIHRoaXMuX3N0YXRlLmluaXRpYWxpemVUaWxlU3RhdGUodGlsZSwgdGhpcy5tYXAgPyB0aGlzLm1hcC5wYWludGVyIDogbnVsbCk7XG5cbiAgICAgICAgdGhpcy5fc291cmNlLmZpcmUobmV3IEV2ZW50KCdkYXRhJywge2RhdGFUeXBlOiAnc291cmNlJywgdGlsZSwgY29vcmQ6IHRpbGUudGlsZUlEfSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogRm9yIHJhc3RlciB0ZXJyYWluIHNvdXJjZSwgYmFja2ZpbGwgREVNIHRvIGVsaW1pbmF0ZSB2aXNpYmxlIHRpbGUgYm91bmRhcmllc1xuICAgICogQHByaXZhdGVcbiAgICAqL1xuICAgIF9iYWNrZmlsbERFTSh0aWxlOiBUaWxlKSB7XG4gICAgICAgIGNvbnN0IHJlbmRlcmFibGVzID0gdGhpcy5nZXRSZW5kZXJhYmxlSWRzKCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVuZGVyYWJsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGJvcmRlcklkID0gcmVuZGVyYWJsZXNbaV07XG4gICAgICAgICAgICBpZiAodGlsZS5uZWlnaGJvcmluZ1RpbGVzICYmIHRpbGUubmVpZ2hib3JpbmdUaWxlc1tib3JkZXJJZF0pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBib3JkZXJUaWxlID0gdGhpcy5nZXRUaWxlQnlJRChib3JkZXJJZCk7XG4gICAgICAgICAgICAgICAgZmlsbEJvcmRlcih0aWxlLCBib3JkZXJUaWxlKTtcbiAgICAgICAgICAgICAgICBmaWxsQm9yZGVyKGJvcmRlclRpbGUsIHRpbGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gZmlsbEJvcmRlcih0aWxlLCBib3JkZXJUaWxlKSB7XG4gICAgICAgICAgICB0aWxlLm5lZWRzSGlsbHNoYWRlUHJlcGFyZSA9IHRydWU7XG4gICAgICAgICAgICBsZXQgZHggPSBib3JkZXJUaWxlLnRpbGVJRC5jYW5vbmljYWwueCAtIHRpbGUudGlsZUlELmNhbm9uaWNhbC54O1xuICAgICAgICAgICAgY29uc3QgZHkgPSBib3JkZXJUaWxlLnRpbGVJRC5jYW5vbmljYWwueSAtIHRpbGUudGlsZUlELmNhbm9uaWNhbC55O1xuICAgICAgICAgICAgY29uc3QgZGltID0gTWF0aC5wb3coMiwgdGlsZS50aWxlSUQuY2Fub25pY2FsLnopO1xuICAgICAgICAgICAgY29uc3QgYm9yZGVySWQgPSBib3JkZXJUaWxlLnRpbGVJRC5rZXk7XG4gICAgICAgICAgICBpZiAoZHggPT09IDAgJiYgZHkgPT09IDApIHJldHVybjtcblxuICAgICAgICAgICAgaWYgKE1hdGguYWJzKGR5KSA+IDEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoTWF0aC5hYnMoZHgpID4gMSkge1xuICAgICAgICAgICAgICAgIC8vIEFkanVzdCB0aGUgZGVsdGEgY29vcmRpbmF0ZSBmb3Igd29ybGQgd3JhcGFyb3VuZC5cbiAgICAgICAgICAgICAgICBpZiAoTWF0aC5hYnMoZHggKyBkaW0pID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGR4ICs9IGRpbTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKE1hdGguYWJzKGR4IC0gZGltKSA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICBkeCAtPSBkaW07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFib3JkZXJUaWxlLmRlbSB8fCAhdGlsZS5kZW0pIHJldHVybjtcbiAgICAgICAgICAgIHRpbGUuZGVtLmJhY2tmaWxsQm9yZGVyKGJvcmRlclRpbGUuZGVtLCBkeCwgZHkpO1xuICAgICAgICAgICAgaWYgKHRpbGUubmVpZ2hib3JpbmdUaWxlcyAmJiB0aWxlLm5laWdoYm9yaW5nVGlsZXNbYm9yZGVySWRdKVxuICAgICAgICAgICAgICAgIHRpbGUubmVpZ2hib3JpbmdUaWxlc1tib3JkZXJJZF0uYmFja2ZpbGxlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IGEgc3BlY2lmaWMgdGlsZSBieSBUaWxlSURcbiAgICAgKi9cbiAgICBnZXRUaWxlKHRpbGVJRDogT3ZlcnNjYWxlZFRpbGVJRCk6IFRpbGUge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRUaWxlQnlJRCh0aWxlSUQua2V5KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYSBzcGVjaWZpYyB0aWxlIGJ5IGlkXG4gICAgICovXG4gICAgZ2V0VGlsZUJ5SUQoaWQ6IHN0cmluZyB8IG51bWJlcik6IFRpbGUge1xuICAgICAgICByZXR1cm4gdGhpcy5fdGlsZXNbaWRdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGdldCB0aGUgem9vbSBsZXZlbCBhZGp1c3RlZCBmb3IgdGhlIGRpZmZlcmVuY2UgaW4gbWFwIGFuZCBzb3VyY2UgdGlsZXNpemVzXG4gICAgICovXG4gICAgZ2V0Wm9vbSh0cmFuc2Zvcm06IFRyYW5zZm9ybSk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0cmFuc2Zvcm0uem9vbSArIHRyYW5zZm9ybS5zY2FsZVpvb20odHJhbnNmb3JtLnRpbGVTaXplIC8gdGhpcy5fc291cmNlLnRpbGVTaXplKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGb3IgYSBnaXZlbiBzZXQgb2YgdGlsZXMsIHJldGFpbiBjaGlsZHJlbiB0aGF0IGFyZSBsb2FkZWQgYW5kIGhhdmUgYSB6b29tXG4gICAgICogYmV0d2VlbiBgem9vbWAgKGV4Y2x1c2l2ZSkgYW5kIGBtYXhDb3ZlcmluZ1pvb21gIChpbmNsdXNpdmUpXG4gICAgICovXG4gICAgX3JldGFpbkxvYWRlZENoaWxkcmVuKFxuICAgICAgICBpZGVhbFRpbGVzOiB7W2FueV06IE92ZXJzY2FsZWRUaWxlSUR9LFxuICAgICAgICB6b29tOiBudW1iZXIsXG4gICAgICAgIG1heENvdmVyaW5nWm9vbTogbnVtYmVyLFxuICAgICAgICByZXRhaW46IHtbYW55XTogT3ZlcnNjYWxlZFRpbGVJRH1cbiAgICApIHtcbiAgICAgICAgZm9yIChjb25zdCBpZCBpbiB0aGlzLl90aWxlcykge1xuICAgICAgICAgICAgbGV0IHRpbGUgPSB0aGlzLl90aWxlc1tpZF07XG5cbiAgICAgICAgICAgIC8vIG9ubHkgY29uc2lkZXIgcmVuZGVyYWJsZSB0aWxlcyB1cCB0byBtYXhDb3ZlcmluZ1pvb21cbiAgICAgICAgICAgIGlmIChyZXRhaW5baWRdIHx8XG4gICAgICAgICAgICAgICAgIXRpbGUuaGFzRGF0YSgpIHx8XG4gICAgICAgICAgICAgICAgdGlsZS50aWxlSUQub3ZlcnNjYWxlZFogPD0gem9vbSB8fFxuICAgICAgICAgICAgICAgIHRpbGUudGlsZUlELm92ZXJzY2FsZWRaID4gbWF4Q292ZXJpbmdab29tXG4gICAgICAgICAgICApIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAvLyBsb29wIHRocm91Z2ggcGFyZW50cyBhbmQgcmV0YWluIHRoZSB0b3Btb3N0IGxvYWRlZCBvbmUgaWYgZm91bmRcbiAgICAgICAgICAgIGxldCB0b3Btb3N0TG9hZGVkSUQgPSB0aWxlLnRpbGVJRDtcbiAgICAgICAgICAgIHdoaWxlICh0aWxlICYmIHRpbGUudGlsZUlELm92ZXJzY2FsZWRaID4gem9vbSArIDEpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRJRCA9IHRpbGUudGlsZUlELnNjYWxlZFRvKHRpbGUudGlsZUlELm92ZXJzY2FsZWRaIC0gMSk7XG5cbiAgICAgICAgICAgICAgICB0aWxlID0gdGhpcy5fdGlsZXNbcGFyZW50SUQua2V5XTtcblxuICAgICAgICAgICAgICAgIGlmICh0aWxlICYmIHRpbGUuaGFzRGF0YSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRvcG1vc3RMb2FkZWRJRCA9IHBhcmVudElEO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gbG9vcCB0aHJvdWdoIGFuY2VzdG9ycyBvZiB0aGUgdG9wbW9zdCBsb2FkZWQgY2hpbGQgdG8gc2VlIGlmIHRoZXJlJ3Mgb25lIHRoYXQgbmVlZGVkIGl0XG4gICAgICAgICAgICBsZXQgdGlsZUlEID0gdG9wbW9zdExvYWRlZElEO1xuICAgICAgICAgICAgd2hpbGUgKHRpbGVJRC5vdmVyc2NhbGVkWiA+IHpvb20pIHtcbiAgICAgICAgICAgICAgICB0aWxlSUQgPSB0aWxlSUQuc2NhbGVkVG8odGlsZUlELm92ZXJzY2FsZWRaIC0gMSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoaWRlYWxUaWxlc1t0aWxlSUQua2V5XSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBmb3VuZCBhIHBhcmVudCB0aGF0IG5lZWRlZCBhIGxvYWRlZCBjaGlsZDsgcmV0YWluIHRoYXQgY2hpbGRcbiAgICAgICAgICAgICAgICAgICAgcmV0YWluW3RvcG1vc3RMb2FkZWRJRC5rZXldID0gdG9wbW9zdExvYWRlZElEO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaW5kIGEgbG9hZGVkIHBhcmVudCBvZiB0aGUgZ2l2ZW4gdGlsZSAodXAgdG8gbWluQ292ZXJpbmdab29tKVxuICAgICAqL1xuICAgIGZpbmRMb2FkZWRQYXJlbnQodGlsZUlEOiBPdmVyc2NhbGVkVGlsZUlELCBtaW5Db3ZlcmluZ1pvb206IG51bWJlcik6ID9UaWxlIHtcbiAgICAgICAgZm9yIChsZXQgeiA9IHRpbGVJRC5vdmVyc2NhbGVkWiAtIDE7IHogPj0gbWluQ292ZXJpbmdab29tOyB6LS0pIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudCA9IHRpbGVJRC5zY2FsZWRUbyh6KTtcbiAgICAgICAgICAgIGlmICghcGFyZW50KSByZXR1cm47XG4gICAgICAgICAgICBjb25zdCBpZCA9IFN0cmluZyhwYXJlbnQua2V5KTtcbiAgICAgICAgICAgIGNvbnN0IHRpbGUgPSB0aGlzLl90aWxlc1tpZF07XG4gICAgICAgICAgICBpZiAodGlsZSAmJiB0aWxlLmhhc0RhdGEoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aWxlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuX2NhY2hlLmhhcyhwYXJlbnQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NhY2hlLmdldChwYXJlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzaXplcyB0aGUgdGlsZSBjYWNoZSBiYXNlZCBvbiB0aGUgY3VycmVudCB2aWV3cG9ydCdzIHNpemVcbiAgICAgKiBvciB0aGUgbWF4VGlsZUNhY2hlU2l6ZSBvcHRpb24gcGFzc2VkIGR1cmluZyBtYXAgY3JlYXRpb25cbiAgICAgKlxuICAgICAqIExhcmdlciB2aWV3cG9ydHMgdXNlIG1vcmUgdGlsZXMgYW5kIG5lZWQgbGFyZ2VyIGNhY2hlcy4gTGFyZ2VyIHZpZXdwb3J0c1xuICAgICAqIGFyZSBtb3JlIGxpa2VseSB0byBiZSBmb3VuZCBvbiBkZXZpY2VzIHdpdGggbW9yZSBtZW1vcnkgYW5kIG9uIHBhZ2VzIHdoZXJlXG4gICAgICogdGhlIG1hcCBpcyBtb3JlIGltcG9ydGFudC5cbiAgICAgKi9cbiAgICB1cGRhdGVDYWNoZVNpemUodHJhbnNmb3JtOiBUcmFuc2Zvcm0pIHtcbiAgICAgICAgY29uc3Qgd2lkdGhJblRpbGVzID0gTWF0aC5jZWlsKHRyYW5zZm9ybS53aWR0aCAvIHRoaXMuX3NvdXJjZS50aWxlU2l6ZSkgKyAxO1xuICAgICAgICBjb25zdCBoZWlnaHRJblRpbGVzID0gTWF0aC5jZWlsKHRyYW5zZm9ybS5oZWlnaHQgLyB0aGlzLl9zb3VyY2UudGlsZVNpemUpICsgMTtcbiAgICAgICAgY29uc3QgYXBwcm94VGlsZXNJblZpZXcgPSB3aWR0aEluVGlsZXMgKiBoZWlnaHRJblRpbGVzO1xuICAgICAgICBjb25zdCBjb21tb25ab29tUmFuZ2UgPSA1O1xuXG4gICAgICAgIGNvbnN0IHZpZXdEZXBlbmRlbnRNYXhTaXplID0gTWF0aC5mbG9vcihhcHByb3hUaWxlc0luVmlldyAqIGNvbW1vblpvb21SYW5nZSk7XG4gICAgICAgIGNvbnN0IG1heFNpemUgPSB0eXBlb2YgdGhpcy5fbWF4VGlsZUNhY2hlU2l6ZSA9PT0gJ251bWJlcicgPyBNYXRoLm1pbih0aGlzLl9tYXhUaWxlQ2FjaGVTaXplLCB2aWV3RGVwZW5kZW50TWF4U2l6ZSkgOiB2aWV3RGVwZW5kZW50TWF4U2l6ZTtcblxuICAgICAgICB0aGlzLl9jYWNoZS5zZXRNYXhTaXplKG1heFNpemUpO1xuICAgIH1cblxuICAgIGhhbmRsZVdyYXBKdW1wKGxuZzogbnVtYmVyKSB7XG4gICAgICAgIC8vIE9uIHRvcCBvZiB0aGUgcmVndWxhciB6L3gveSB2YWx1ZXMsIFRpbGVJRHMgaGF2ZSBhIGB3cmFwYCB2YWx1ZSB0aGF0IHNwZWNpZnlcbiAgICAgICAgLy8gd2hpY2ggY3BweSBvZiB0aGUgd29ybGQgdGhlIHRpbGUgYmVsb25ncyB0by4gRm9yIGV4YW1wbGUsIGF0IGBsbmc6IDEwYCB5b3VcbiAgICAgICAgLy8gbWlnaHQgcmVuZGVyIHoveC95LzAgd2hpbGUgYXQgYGxuZzogMzcwYCB5b3Ugd291bGQgcmVuZGVyIHoveC95LzEuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFdoZW4gbG5nIHZhbHVlcyBnZXQgd3JhcHBlZCAoZ29pbmcgZnJvbSBgbG5nOiAzNzBgIHRvIGBsb25nOiAxMGApIHlvdSBleHBlY3RcbiAgICAgICAgLy8gdG8gc2VlIHRoZSBzYW1lIHRoaW5nIG9uIHRoZSBzY3JlZW4gKDM3MCBkZWdyZWVzIGFuZCAxMCBkZWdyZWVzIGlzIHRoZSBzYW1lXG4gICAgICAgIC8vIHBsYWNlIGluIHRoZSB3b3JsZCkgYnV0IGFsbCB0aGUgVGlsZUlEcyB3aWxsIGhhdmUgZGlmZmVyZW50IHdyYXAgdmFsdWVzLlxuICAgICAgICAvL1xuICAgICAgICAvLyBJbiBvcmRlciB0byBtYWtlIHRoaXMgdHJhbnNpdGlvbiBzZWFtbGVzcywgd2UgY2FsY3VsYXRlIHRoZSByb3VuZGVkIGRpZmZlcmVuY2Ugb2ZcbiAgICAgICAgLy8gXCJ3b3JsZHNcIiBiZXR3ZWVuIHRoZSBsYXN0IGZyYW1lIGFuZCB0aGUgY3VycmVudCBmcmFtZS4gSWYgdGhlIG1hcCBwYW5uZWQgYnlcbiAgICAgICAgLy8gYSB3b3JsZCwgdGhlbiB3ZSBjYW4gYXNzaWduIGFsbCB0aGUgdGlsZXMgbmV3IFRpbGVJRHMgd2l0aCB1cGRhdGVkIHdyYXAgdmFsdWVzLlxuICAgICAgICAvLyBGb3IgZXhhbXBsZSwgYXNzaWduIHoveC95LzEgYSBuZXcgaWQ6IHoveC95LzAuIEl0IGlzIHRoZSBzYW1lIHRpbGUsIGp1c3QgcmVuZGVyZWRcbiAgICAgICAgLy8gaW4gYSBkaWZmZXJlbnQgcG9zaXRpb24uXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFRoaXMgZW5hYmxlcyB1cyB0byByZXVzZSB0aGUgdGlsZXMgYXQgbW9yZSBpZGVhbCBsb2NhdGlvbnMgYW5kIHByZXZlbnQgZmxpY2tlcmluZy5cbiAgICAgICAgY29uc3QgcHJldkxuZyA9IHRoaXMuX3ByZXZMbmcgPT09IHVuZGVmaW5lZCA/IGxuZyA6IHRoaXMuX3ByZXZMbmc7XG4gICAgICAgIGNvbnN0IGxuZ0RpZmZlcmVuY2UgPSBsbmcgLSBwcmV2TG5nO1xuICAgICAgICBjb25zdCB3b3JsZERpZmZlcmVuY2UgPSBsbmdEaWZmZXJlbmNlIC8gMzYwO1xuICAgICAgICBjb25zdCB3cmFwRGVsdGEgPSBNYXRoLnJvdW5kKHdvcmxkRGlmZmVyZW5jZSk7XG4gICAgICAgIHRoaXMuX3ByZXZMbmcgPSBsbmc7XG5cbiAgICAgICAgaWYgKHdyYXBEZWx0YSkge1xuICAgICAgICAgICAgY29uc3QgdGlsZXMgPSB7fTtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMuX3RpbGVzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGlsZSA9IHRoaXMuX3RpbGVzW2tleV07XG4gICAgICAgICAgICAgICAgdGlsZS50aWxlSUQgPSB0aWxlLnRpbGVJRC51bndyYXBUbyh0aWxlLnRpbGVJRC53cmFwICsgd3JhcERlbHRhKTtcbiAgICAgICAgICAgICAgICB0aWxlc1t0aWxlLnRpbGVJRC5rZXldID0gdGlsZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3RpbGVzID0gdGlsZXM7XG5cbiAgICAgICAgICAgIC8vIFJlc2V0IHRpbGUgcmVsb2FkIHRpbWVyc1xuICAgICAgICAgICAgZm9yIChjb25zdCBpZCBpbiB0aGlzLl90aW1lcnMpIHtcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fdGltZXJzW2lkXSk7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuX3RpbWVyc1tpZF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGlkIGluIHRoaXMuX3RpbGVzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGlsZSA9IHRoaXMuX3RpbGVzW2lkXTtcbiAgICAgICAgICAgICAgICB0aGlzLl9zZXRUaWxlUmVsb2FkVGltZXIoaWQsIHRpbGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyB0aWxlcyB0aGF0IGFyZSBvdXRzaWRlIHRoZSB2aWV3cG9ydCBhbmQgYWRkcyBuZXcgdGlsZXMgdGhhdFxuICAgICAqIGFyZSBpbnNpZGUgdGhlIHZpZXdwb3J0LlxuICAgICAqL1xuICAgIHVwZGF0ZSh0cmFuc2Zvcm06IFRyYW5zZm9ybSkge1xuICAgICAgICB0aGlzLnRyYW5zZm9ybSA9IHRyYW5zZm9ybTtcbiAgICAgICAgaWYgKCF0aGlzLl9zb3VyY2VMb2FkZWQgfHwgdGhpcy5fcGF1c2VkKSB7IHJldHVybjsgfVxuXG4gICAgICAgIHRoaXMudXBkYXRlQ2FjaGVTaXplKHRyYW5zZm9ybSk7XG4gICAgICAgIHRoaXMuaGFuZGxlV3JhcEp1bXAodGhpcy50cmFuc2Zvcm0uY2VudGVyLmxuZyk7XG5cbiAgICAgICAgLy8gQ292ZXJlZCBpcyBhIGxpc3Qgb2YgcmV0YWluZWQgdGlsZXMgd2hvJ3MgYXJlYXMgYXJlIGZ1bGx5IGNvdmVyZWQgYnkgb3RoZXIsXG4gICAgICAgIC8vIGJldHRlciwgcmV0YWluZWQgdGlsZXMuIFRoZXkgYXJlIG5vdCBkcmF3biBzZXBhcmF0ZWx5LlxuICAgICAgICB0aGlzLl9jb3ZlcmVkVGlsZXMgPSB7fTtcblxuICAgICAgICBsZXQgaWRlYWxUaWxlSURzO1xuICAgICAgICBpZiAoIXRoaXMudXNlZCkge1xuICAgICAgICAgICAgaWRlYWxUaWxlSURzID0gW107XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5fc291cmNlLnRpbGVJRCkge1xuICAgICAgICAgICAgaWRlYWxUaWxlSURzID0gdHJhbnNmb3JtLmdldFZpc2libGVVbndyYXBwZWRDb29yZGluYXRlcyh0aGlzLl9zb3VyY2UudGlsZUlEKVxuICAgICAgICAgICAgICAgIC5tYXAoKHVud3JhcHBlZCkgPT4gbmV3IE92ZXJzY2FsZWRUaWxlSUQodW53cmFwcGVkLmNhbm9uaWNhbC56LCB1bndyYXBwZWQud3JhcCwgdW53cmFwcGVkLmNhbm9uaWNhbC56LCB1bndyYXBwZWQuY2Fub25pY2FsLngsIHVud3JhcHBlZC5jYW5vbmljYWwueSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWRlYWxUaWxlSURzID0gdHJhbnNmb3JtLmNvdmVyaW5nVGlsZXMoe1xuICAgICAgICAgICAgICAgIHRpbGVTaXplOiB0aGlzLl9zb3VyY2UudGlsZVNpemUsXG4gICAgICAgICAgICAgICAgbWluem9vbTogdGhpcy5fc291cmNlLm1pbnpvb20sXG4gICAgICAgICAgICAgICAgbWF4em9vbTogdGhpcy5fc291cmNlLm1heHpvb20sXG4gICAgICAgICAgICAgICAgcm91bmRab29tOiB0aGlzLl9zb3VyY2Uucm91bmRab29tLFxuICAgICAgICAgICAgICAgIHJlcGFyc2VPdmVyc2NhbGVkOiB0aGlzLl9zb3VyY2UucmVwYXJzZU92ZXJzY2FsZWRcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5fc291cmNlLmhhc1RpbGUpIHtcbiAgICAgICAgICAgICAgICBpZGVhbFRpbGVJRHMgPSBpZGVhbFRpbGVJRHMuZmlsdGVyKChjb29yZCkgPT4gKHRoaXMuX3NvdXJjZS5oYXNUaWxlOiBhbnkpKGNvb3JkKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEZXRlcm1pbmUgdGhlIG92ZXJ6b29taW5nL3VuZGVyem9vbWluZyBhbW91bnRzLlxuICAgICAgICBjb25zdCB6b29tID0gKHRoaXMuX3NvdXJjZS5yb3VuZFpvb20gPyBNYXRoLnJvdW5kIDogTWF0aC5mbG9vcikodGhpcy5nZXRab29tKHRyYW5zZm9ybSkpO1xuICAgICAgICBjb25zdCBtaW5Db3ZlcmluZ1pvb20gPSBNYXRoLm1heCh6b29tIC0gU291cmNlQ2FjaGUubWF4T3Zlcnpvb21pbmcsIHRoaXMuX3NvdXJjZS5taW56b29tKTtcbiAgICAgICAgY29uc3QgbWF4Q292ZXJpbmdab29tID0gTWF0aC5tYXgoem9vbSArIFNvdXJjZUNhY2hlLm1heFVuZGVyem9vbWluZywgIHRoaXMuX3NvdXJjZS5taW56b29tKTtcblxuICAgICAgICAvLyBSZXRhaW4gaXMgYSBsaXN0IG9mIHRpbGVzIHRoYXQgd2Ugc2hvdWxkbid0IGRlbGV0ZSwgZXZlbiBpZiB0aGV5IGFyZSBub3RcbiAgICAgICAgLy8gdGhlIG1vc3QgaWRlYWwgdGlsZSBmb3IgdGhlIGN1cnJlbnQgdmlld3BvcnQuIFRoaXMgbWF5IGluY2x1ZGUgdGlsZXMgbGlrZVxuICAgICAgICAvLyBwYXJlbnQgb3IgY2hpbGQgdGlsZXMgdGhhdCBhcmUgKmFscmVhZHkqIGxvYWRlZC5cbiAgICAgICAgY29uc3QgcmV0YWluID0gdGhpcy5fdXBkYXRlUmV0YWluZWRUaWxlcyhpZGVhbFRpbGVJRHMsIHpvb20pO1xuXG4gICAgICAgIGlmIChpc1Jhc3RlclR5cGUodGhpcy5fc291cmNlLnR5cGUpKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJlbnRzRm9yRmFkaW5nID0ge307XG4gICAgICAgICAgICBjb25zdCBmYWRpbmdUaWxlcyA9IHt9O1xuICAgICAgICAgICAgY29uc3QgaWRzID0gT2JqZWN0LmtleXMocmV0YWluKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaWQgb2YgaWRzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGlsZUlEID0gcmV0YWluW2lkXTtcbiAgICAgICAgICAgICAgICBhc3NlcnQodGlsZUlELmtleSA9PT0gK2lkKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHRpbGUgPSB0aGlzLl90aWxlc1tpZF07XG4gICAgICAgICAgICAgICAgaWYgKCF0aWxlIHx8IHRpbGUuZmFkZUVuZFRpbWUgJiYgdGlsZS5mYWRlRW5kVGltZSA8PSBicm93c2VyLm5vdygpKSBjb250aW51ZTtcblxuICAgICAgICAgICAgICAgIC8vIGlmIHRoZSB0aWxlIGlzIGxvYWRlZCBidXQgc3RpbGwgZmFkaW5nIGluLCBmaW5kIHBhcmVudHMgdG8gY3Jvc3MtZmFkZSB3aXRoIGl0XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyZW50VGlsZSA9IHRoaXMuZmluZExvYWRlZFBhcmVudCh0aWxlSUQsIG1pbkNvdmVyaW5nWm9vbSk7XG4gICAgICAgICAgICAgICAgaWYgKHBhcmVudFRpbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fYWRkVGlsZShwYXJlbnRUaWxlLnRpbGVJRCk7XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudHNGb3JGYWRpbmdbcGFyZW50VGlsZS50aWxlSUQua2V5XSA9IHBhcmVudFRpbGUudGlsZUlEO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGZhZGluZ1RpbGVzW2lkXSA9IHRpbGVJRDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gZm9yIHRpbGVzIHRoYXQgYXJlIHN0aWxsIGZhZGluZyBpbiwgYWxzbyBmaW5kIGNoaWxkcmVuIHRvIGNyb3NzLWZhZGUgd2l0aFxuICAgICAgICAgICAgdGhpcy5fcmV0YWluTG9hZGVkQ2hpbGRyZW4oZmFkaW5nVGlsZXMsIHpvb20sIG1heENvdmVyaW5nWm9vbSwgcmV0YWluKTtcblxuICAgICAgICAgICAgZm9yIChjb25zdCBpZCBpbiBwYXJlbnRzRm9yRmFkaW5nKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXRhaW5baWRdKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIElmIGEgdGlsZSBpcyBvbmx5IG5lZWRlZCBmb3IgZmFkaW5nLCBtYXJrIGl0IGFzIGNvdmVyZWQgc28gdGhhdCBpdCBpc24ndCByZW5kZXJlZCBvbiBpdCdzIG93bi5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY292ZXJlZFRpbGVzW2lkXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHJldGFpbltpZF0gPSBwYXJlbnRzRm9yRmFkaW5nW2lkXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IHJldGFpbmVkSWQgaW4gcmV0YWluKSB7XG4gICAgICAgICAgICAvLyBNYWtlIHN1cmUgcmV0YWluZWQgdGlsZXMgYWx3YXlzIGNsZWFyIGFueSBleGlzdGluZyBmYWRlIGhvbGRzXG4gICAgICAgICAgICAvLyBzbyB0aGF0IGlmIHRoZXkncmUgcmVtb3ZlZCBhZ2FpbiB0aGVpciBmYWRlIHRpbWVyIHN0YXJ0cyBmcmVzaC5cbiAgICAgICAgICAgIHRoaXMuX3RpbGVzW3JldGFpbmVkSWRdLmNsZWFyRmFkZUhvbGQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlbW92ZSB0aGUgdGlsZXMgd2UgZG9uJ3QgbmVlZCBhbnltb3JlLlxuICAgICAgICBjb25zdCByZW1vdmUgPSBrZXlzRGlmZmVyZW5jZSh0aGlzLl90aWxlcywgcmV0YWluKTtcbiAgICAgICAgZm9yIChjb25zdCB0aWxlSUQgb2YgcmVtb3ZlKSB7XG4gICAgICAgICAgICBjb25zdCB0aWxlID0gdGhpcy5fdGlsZXNbdGlsZUlEXTtcbiAgICAgICAgICAgIGlmICh0aWxlLmhhc1N5bWJvbEJ1Y2tldHMgJiYgIXRpbGUuaG9sZGluZ0ZvckZhZGUoKSkge1xuICAgICAgICAgICAgICAgIHRpbGUuc2V0SG9sZER1cmF0aW9uKHRoaXMubWFwLl9mYWRlRHVyYXRpb24pO1xuICAgICAgICAgICAgfSBlbHNlIGlmICghdGlsZS5oYXNTeW1ib2xCdWNrZXRzIHx8IHRpbGUuc3ltYm9sRmFkZUZpbmlzaGVkKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZW1vdmVUaWxlKHRpbGVJRCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZWxlYXNlU3ltYm9sRmFkZVRpbGVzKCkge1xuICAgICAgICBmb3IgKGNvbnN0IGlkIGluIHRoaXMuX3RpbGVzKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fdGlsZXNbaWRdLmhvbGRpbmdGb3JGYWRlKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZW1vdmVUaWxlKGlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIF91cGRhdGVSZXRhaW5lZFRpbGVzKGlkZWFsVGlsZUlEczogQXJyYXk8T3ZlcnNjYWxlZFRpbGVJRD4sIHpvb206IG51bWJlcik6IHsgW3N0cmluZ106IE92ZXJzY2FsZWRUaWxlSUR9IHtcbiAgICAgICAgY29uc3QgcmV0YWluID0ge307XG4gICAgICAgIGNvbnN0IGNoZWNrZWQ6IHtbbnVtYmVyXTogYm9vbGVhbiB9ID0ge307XG4gICAgICAgIGNvbnN0IG1pbkNvdmVyaW5nWm9vbSA9IE1hdGgubWF4KHpvb20gLSBTb3VyY2VDYWNoZS5tYXhPdmVyem9vbWluZywgdGhpcy5fc291cmNlLm1pbnpvb20pO1xuICAgICAgICBjb25zdCBtYXhDb3ZlcmluZ1pvb20gPSBNYXRoLm1heCh6b29tICsgU291cmNlQ2FjaGUubWF4VW5kZXJ6b29taW5nLCAgdGhpcy5fc291cmNlLm1pbnpvb20pO1xuXG4gICAgICAgIGNvbnN0IG1pc3NpbmdUaWxlcyA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IHRpbGVJRCBvZiBpZGVhbFRpbGVJRHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHRpbGUgPSB0aGlzLl9hZGRUaWxlKHRpbGVJRCk7XG5cbiAgICAgICAgICAgIC8vIHJldGFpbiB0aGUgdGlsZSBldmVuIGlmIGl0J3Mgbm90IGxvYWRlZCBiZWNhdXNlIGl0J3MgYW4gaWRlYWwgdGlsZS5cbiAgICAgICAgICAgIHJldGFpblt0aWxlSUQua2V5XSA9IHRpbGVJRDtcblxuICAgICAgICAgICAgaWYgKHRpbGUuaGFzRGF0YSgpKSBjb250aW51ZTtcblxuICAgICAgICAgICAgaWYgKHpvb20gPCB0aGlzLl9zb3VyY2UubWF4em9vbSkge1xuICAgICAgICAgICAgICAgIC8vIHNhdmUgbWlzc2luZyB0aWxlcyB0aGF0IHBvdGVudGlhbGx5IGhhdmUgbG9hZGVkIGNoaWxkcmVuXG4gICAgICAgICAgICAgICAgbWlzc2luZ1RpbGVzW3RpbGVJRC5rZXldID0gdGlsZUlEO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gcmV0YWluIGFueSBsb2FkZWQgY2hpbGRyZW4gb2YgaWRlYWwgdGlsZXMgdXAgdG8gbWF4Q292ZXJpbmdab29tXG4gICAgICAgIHRoaXMuX3JldGFpbkxvYWRlZENoaWxkcmVuKG1pc3NpbmdUaWxlcywgem9vbSwgbWF4Q292ZXJpbmdab29tLCByZXRhaW4pO1xuXG4gICAgICAgIGZvciAoY29uc3QgdGlsZUlEIG9mIGlkZWFsVGlsZUlEcykge1xuICAgICAgICAgICAgbGV0IHRpbGUgPSB0aGlzLl90aWxlc1t0aWxlSUQua2V5XTtcblxuICAgICAgICAgICAgaWYgKHRpbGUuaGFzRGF0YSgpKSBjb250aW51ZTtcblxuICAgICAgICAgICAgLy8gVGhlIHRpbGUgd2UgcmVxdWlyZSBpcyBub3QgeWV0IGxvYWRlZCBvciBkb2VzIG5vdCBleGlzdDtcbiAgICAgICAgICAgIC8vIEF0dGVtcHQgdG8gZmluZCBjaGlsZHJlbiB0aGF0IGZ1bGx5IGNvdmVyIGl0LlxuXG4gICAgICAgICAgICBpZiAoem9vbSArIDEgPiB0aGlzLl9zb3VyY2UubWF4em9vbSkge1xuICAgICAgICAgICAgICAgIC8vIFdlJ3JlIGxvb2tpbmcgZm9yIGFuIG92ZXJ6b29tZWQgY2hpbGQgdGlsZS5cbiAgICAgICAgICAgICAgICBjb25zdCBjaGlsZENvb3JkID0gdGlsZUlELmNoaWxkcmVuKHRoaXMuX3NvdXJjZS5tYXh6b29tKVswXTtcbiAgICAgICAgICAgICAgICBjb25zdCBjaGlsZFRpbGUgPSB0aGlzLmdldFRpbGUoY2hpbGRDb29yZCk7XG4gICAgICAgICAgICAgICAgaWYgKCEhY2hpbGRUaWxlICYmIGNoaWxkVGlsZS5oYXNEYXRhKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0YWluW2NoaWxkQ29vcmQua2V5XSA9IGNoaWxkQ29vcmQ7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyB0aWxlIGlzIGNvdmVyZWQgYnkgb3Zlcnpvb21lZCBjaGlsZFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgYWxsIDQgaW1tZWRpYXRlIGNoaWxkcmVuIGFyZSBsb2FkZWQgKGkuZS4gdGhlIG1pc3NpbmcgaWRlYWwgdGlsZSBpcyBjb3ZlcmVkKVxuICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0gdGlsZUlELmNoaWxkcmVuKHRoaXMuX3NvdXJjZS5tYXh6b29tKTtcblxuICAgICAgICAgICAgICAgIGlmIChyZXRhaW5bY2hpbGRyZW5bMF0ua2V5XSAmJlxuICAgICAgICAgICAgICAgICAgICByZXRhaW5bY2hpbGRyZW5bMV0ua2V5XSAmJlxuICAgICAgICAgICAgICAgICAgICByZXRhaW5bY2hpbGRyZW5bMl0ua2V5XSAmJlxuICAgICAgICAgICAgICAgICAgICByZXRhaW5bY2hpbGRyZW5bM10ua2V5XSkgY29udGludWU7IC8vIHRpbGUgaXMgY292ZXJlZCBieSBjaGlsZHJlblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBXZSBjb3VsZG4ndCBmaW5kIGNoaWxkIHRpbGVzIHRoYXQgZW50aXJlbHkgY292ZXIgdGhlIGlkZWFsIHRpbGU7IGxvb2sgZm9yIHBhcmVudHMgbm93LlxuXG4gICAgICAgICAgICAvLyBBcyB3ZSBhc2NlbmQgdXAgdGhlIHRpbGUgcHlyYW1pZCBvZiB0aGUgaWRlYWwgdGlsZSwgd2UgY2hlY2sgd2hldGhlciB0aGUgcGFyZW50XG4gICAgICAgICAgICAvLyB0aWxlIGhhcyBiZWVuIHByZXZpb3VzbHkgcmVxdWVzdGVkIChhbmQgZXJyb3JlZCBiZWNhdXNlIHdlIG9ubHkgbG9vcCBvdmVyIHRpbGVzIHdpdGggbm8gZGF0YSlcbiAgICAgICAgICAgIC8vIGluIG9yZGVyIHRvIGRldGVybWluZSBpZiB3ZSBuZWVkIHRvIHJlcXVlc3QgaXRzIHBhcmVudC5cbiAgICAgICAgICAgIGxldCBwYXJlbnRXYXNSZXF1ZXN0ZWQgPSB0aWxlLndhc1JlcXVlc3RlZCgpO1xuXG4gICAgICAgICAgICBmb3IgKGxldCBvdmVyc2NhbGVkWiA9IHRpbGVJRC5vdmVyc2NhbGVkWiAtIDE7IG92ZXJzY2FsZWRaID49IG1pbkNvdmVyaW5nWm9vbTsgLS1vdmVyc2NhbGVkWikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudElkID0gdGlsZUlELnNjYWxlZFRvKG92ZXJzY2FsZWRaKTtcblxuICAgICAgICAgICAgICAgIC8vIEJyZWFrIHBhcmVudCB0aWxlIGFzY2VudCBpZiB0aGlzIHJvdXRlIGhhcyBiZWVuIHByZXZpb3VzbHkgY2hlY2tlZCBieSBhbm90aGVyIGNoaWxkLlxuICAgICAgICAgICAgICAgIGlmIChjaGVja2VkW3BhcmVudElkLmtleV0pIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNoZWNrZWRbcGFyZW50SWQua2V5XSA9IHRydWU7XG5cbiAgICAgICAgICAgICAgICB0aWxlID0gdGhpcy5nZXRUaWxlKHBhcmVudElkKTtcbiAgICAgICAgICAgICAgICBpZiAoIXRpbGUgJiYgcGFyZW50V2FzUmVxdWVzdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRpbGUgPSB0aGlzLl9hZGRUaWxlKHBhcmVudElkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHRpbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0YWluW3BhcmVudElkLmtleV0gPSBwYXJlbnRJZDtcbiAgICAgICAgICAgICAgICAgICAgLy8gU2F2ZSB0aGUgY3VycmVudCB2YWx1ZXMsIHNpbmNlIHRoZXkncmUgdGhlIHBhcmVudCBvZiB0aGUgbmV4dCBpdGVyYXRpb25cbiAgICAgICAgICAgICAgICAgICAgLy8gb2YgdGhlIHBhcmVudCB0aWxlIGFzY2VudCBsb29wLlxuICAgICAgICAgICAgICAgICAgICBwYXJlbnRXYXNSZXF1ZXN0ZWQgPSB0aWxlLndhc1JlcXVlc3RlZCgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGlsZS5oYXNEYXRhKCkpIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXRhaW47XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkIGEgdGlsZSwgZ2l2ZW4gaXRzIGNvb3JkaW5hdGUsIHRvIHRoZSBweXJhbWlkLlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX2FkZFRpbGUodGlsZUlEOiBPdmVyc2NhbGVkVGlsZUlEKTogVGlsZSB7XG4gICAgICAgIGxldCB0aWxlID0gdGhpcy5fdGlsZXNbdGlsZUlELmtleV07XG4gICAgICAgIGlmICh0aWxlKVxuICAgICAgICAgICAgcmV0dXJuIHRpbGU7XG5cblxuICAgICAgICB0aWxlID0gdGhpcy5fY2FjaGUuZ2V0QW5kUmVtb3ZlKHRpbGVJRCk7XG4gICAgICAgIGlmICh0aWxlKSB7XG4gICAgICAgICAgICB0aGlzLl9zZXRUaWxlUmVsb2FkVGltZXIodGlsZUlELmtleSwgdGlsZSk7XG4gICAgICAgICAgICAvLyBzZXQgdGhlIHRpbGVJRCBiZWNhdXNlIHRoZSBjYWNoZWQgdGlsZSBjb3VsZCBoYXZlIGhhZCBhIGRpZmZlcmVudCB3cmFwIHZhbHVlXG4gICAgICAgICAgICB0aWxlLnRpbGVJRCA9IHRpbGVJRDtcbiAgICAgICAgICAgIHRoaXMuX3N0YXRlLmluaXRpYWxpemVUaWxlU3RhdGUodGlsZSwgdGhpcy5tYXAgPyB0aGlzLm1hcC5wYWludGVyIDogbnVsbCk7XG4gICAgICAgICAgICBpZiAodGhpcy5fY2FjaGVUaW1lcnNbdGlsZUlELmtleV0pIHtcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fY2FjaGVUaW1lcnNbdGlsZUlELmtleV0pO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9jYWNoZVRpbWVyc1t0aWxlSUQua2V5XTtcbiAgICAgICAgICAgICAgICB0aGlzLl9zZXRUaWxlUmVsb2FkVGltZXIodGlsZUlELmtleSwgdGlsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjYWNoZWQgPSBCb29sZWFuKHRpbGUpO1xuICAgICAgICBpZiAoIWNhY2hlZCkge1xuICAgICAgICAgICAgdGlsZSA9IG5ldyBUaWxlKHRpbGVJRCwgdGhpcy5fc291cmNlLnRpbGVTaXplICogdGlsZUlELm92ZXJzY2FsZUZhY3RvcigpKTtcbiAgICAgICAgICAgIHRoaXMuX2xvYWRUaWxlKHRpbGUsIHRoaXMuX3RpbGVMb2FkZWQuYmluZCh0aGlzLCB0aWxlLCB0aWxlSUQua2V5LCB0aWxlLnN0YXRlKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJbXBvc3NpYmxlLCBidXQgc2lsZW5jZSBmbG93LlxuICAgICAgICBpZiAoIXRpbGUpIHJldHVybiAobnVsbDogYW55KTtcblxuICAgICAgICB0aWxlLnVzZXMrKztcbiAgICAgICAgdGhpcy5fdGlsZXNbdGlsZUlELmtleV0gPSB0aWxlO1xuICAgICAgICBpZiAoIWNhY2hlZCkgdGhpcy5fc291cmNlLmZpcmUobmV3IEV2ZW50KCdkYXRhbG9hZGluZycsIHt0aWxlLCBjb29yZDogdGlsZS50aWxlSUQsIGRhdGFUeXBlOiAnc291cmNlJ30pKTtcblxuICAgICAgICByZXR1cm4gdGlsZTtcbiAgICB9XG5cbiAgICBfc2V0VGlsZVJlbG9hZFRpbWVyKGlkOiBzdHJpbmcgfCBudW1iZXIsIHRpbGU6IFRpbGUpIHtcbiAgICAgICAgaWYgKGlkIGluIHRoaXMuX3RpbWVycykge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVyc1tpZF0pO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuX3RpbWVyc1tpZF07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBleHBpcnlUaW1lb3V0ID0gdGlsZS5nZXRFeHBpcnlUaW1lb3V0KCk7XG4gICAgICAgIGlmIChleHBpcnlUaW1lb3V0KSB7XG4gICAgICAgICAgICB0aGlzLl90aW1lcnNbaWRdID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVsb2FkVGlsZShpZCwgJ2V4cGlyZWQnKTtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5fdGltZXJzW2lkXTtcbiAgICAgICAgICAgIH0sIGV4cGlyeVRpbWVvdXQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGEgdGlsZSwgZ2l2ZW4gaXRzIGlkLCBmcm9tIHRoZSBweXJhbWlkXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfcmVtb3ZlVGlsZShpZDogc3RyaW5nIHwgbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IHRpbGUgPSB0aGlzLl90aWxlc1tpZF07XG4gICAgICAgIGlmICghdGlsZSlcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICB0aWxlLnVzZXMtLTtcbiAgICAgICAgZGVsZXRlIHRoaXMuX3RpbGVzW2lkXTtcbiAgICAgICAgaWYgKHRoaXMuX3RpbWVyc1tpZF0pIHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl90aW1lcnNbaWRdKTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl90aW1lcnNbaWRdO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRpbGUudXNlcyA+IDApXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgaWYgKHRpbGUuaGFzRGF0YSgpKSB7XG4gICAgICAgICAgICB0aGlzLl9jYWNoZS5hZGQodGlsZS50aWxlSUQsIHRpbGUsIHRpbGUuZ2V0RXhwaXJ5VGltZW91dCgpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRpbGUuYWJvcnRlZCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLl9hYm9ydFRpbGUodGlsZSk7XG4gICAgICAgICAgICB0aGlzLl91bmxvYWRUaWxlKHRpbGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGFsbCB0aWxlcyBmcm9tIHRoaXMgcHlyYW1pZFxuICAgICAqL1xuICAgIGNsZWFyVGlsZXMoKSB7XG4gICAgICAgIHRoaXMuX3Nob3VsZFJlbG9hZE9uUmVzdW1lID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX3BhdXNlZCA9IGZhbHNlO1xuXG4gICAgICAgIGZvciAoY29uc3QgaWQgaW4gdGhpcy5fdGlsZXMpXG4gICAgICAgICAgICB0aGlzLl9yZW1vdmVUaWxlKGlkKTtcblxuICAgICAgICB0aGlzLl9jYWNoZS5yZXNldCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlYXJjaCB0aHJvdWdoIG91ciBjdXJyZW50IHRpbGVzIGFuZCBhdHRlbXB0IHRvIGZpbmQgdGhlIHRpbGVzIHRoYXRcbiAgICAgKiBjb3ZlciB0aGUgZ2l2ZW4gYm91bmRzLlxuICAgICAqIEBwYXJhbSBwb2ludFF1ZXJ5R2VvbWV0cnkgY29vcmRpbmF0ZXMgb2YgdGhlIGNvcm5lcnMgb2YgYm91bmRpbmcgcmVjdGFuZ2xlXG4gICAgICogQHJldHVybnMge0FycmF5PE9iamVjdD59IHJlc3VsdCBpdGVtcyBoYXZlIHt0aWxlLCBtaW5YLCBtYXhYLCBtaW5ZLCBtYXhZfSwgd2hlcmUgbWluL21heCBib3VuZGluZyB2YWx1ZXMgYXJlIHRoZSBnaXZlbiBib3VuZHMgdHJhbnNmb3JtZWQgaW4gaW50byB0aGUgY29vcmRpbmF0ZSBzcGFjZSBvZiB0aGlzIHRpbGUuXG4gICAgICovXG4gICAgdGlsZXNJbihwb2ludFF1ZXJ5R2VvbWV0cnk6IEFycmF5PFBvaW50PiwgbWF4UGl0Y2hTY2FsZUZhY3RvcjogbnVtYmVyLCBoYXMzRExheWVyOiBib29sZWFuKSB7XG5cbiAgICAgICAgY29uc3QgdGlsZVJlc3VsdHMgPSBbXTtcblxuICAgICAgICBjb25zdCB0cmFuc2Zvcm0gPSB0aGlzLnRyYW5zZm9ybTtcbiAgICAgICAgaWYgKCF0cmFuc2Zvcm0pIHJldHVybiB0aWxlUmVzdWx0cztcblxuICAgICAgICBjb25zdCBjYW1lcmFQb2ludFF1ZXJ5R2VvbWV0cnkgPSBoYXMzRExheWVyID9cbiAgICAgICAgICAgIHRyYW5zZm9ybS5nZXRDYW1lcmFRdWVyeUdlb21ldHJ5KHBvaW50UXVlcnlHZW9tZXRyeSkgOlxuICAgICAgICAgICAgcG9pbnRRdWVyeUdlb21ldHJ5O1xuXG4gICAgICAgIGNvbnN0IHF1ZXJ5R2VvbWV0cnkgPSBwb2ludFF1ZXJ5R2VvbWV0cnkubWFwKChwKSA9PiB0cmFuc2Zvcm0ucG9pbnRDb29yZGluYXRlKHApKTtcbiAgICAgICAgY29uc3QgY2FtZXJhUXVlcnlHZW9tZXRyeSA9IGNhbWVyYVBvaW50UXVlcnlHZW9tZXRyeS5tYXAoKHApID0+IHRyYW5zZm9ybS5wb2ludENvb3JkaW5hdGUocCkpO1xuXG4gICAgICAgIGNvbnN0IGlkcyA9IHRoaXMuZ2V0SWRzKCk7XG5cbiAgICAgICAgbGV0IG1pblggPSBJbmZpbml0eTtcbiAgICAgICAgbGV0IG1pblkgPSBJbmZpbml0eTtcbiAgICAgICAgbGV0IG1heFggPSAtSW5maW5pdHk7XG4gICAgICAgIGxldCBtYXhZID0gLUluZmluaXR5O1xuXG4gICAgICAgIGZvciAoY29uc3QgcCBvZiBjYW1lcmFRdWVyeUdlb21ldHJ5KSB7XG4gICAgICAgICAgICBtaW5YID0gTWF0aC5taW4obWluWCwgcC54KTtcbiAgICAgICAgICAgIG1pblkgPSBNYXRoLm1pbihtaW5ZLCBwLnkpO1xuICAgICAgICAgICAgbWF4WCA9IE1hdGgubWF4KG1heFgsIHAueCk7XG4gICAgICAgICAgICBtYXhZID0gTWF0aC5tYXgobWF4WSwgcC55KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCB0aWxlID0gdGhpcy5fdGlsZXNbaWRzW2ldXTtcbiAgICAgICAgICAgIGlmICh0aWxlLmhvbGRpbmdGb3JGYWRlKCkpIHtcbiAgICAgICAgICAgICAgICAvLyBUaWxlcyBoZWxkIGZvciBmYWRpbmcgYXJlIGNvdmVyZWQgYnkgdGlsZXMgdGhhdCBhcmUgY2xvc2VyIHRvIGlkZWFsXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB0aWxlSUQgPSB0aWxlLnRpbGVJRDtcbiAgICAgICAgICAgIGNvbnN0IHNjYWxlID0gTWF0aC5wb3coMiwgdHJhbnNmb3JtLnpvb20gLSB0aWxlLnRpbGVJRC5vdmVyc2NhbGVkWik7XG4gICAgICAgICAgICBjb25zdCBxdWVyeVBhZGRpbmcgPSBtYXhQaXRjaFNjYWxlRmFjdG9yICogdGlsZS5xdWVyeVBhZGRpbmcgKiBFWFRFTlQgLyB0aWxlLnRpbGVTaXplIC8gc2NhbGU7XG5cbiAgICAgICAgICAgIGNvbnN0IHRpbGVTcGFjZUJvdW5kcyA9IFtcbiAgICAgICAgICAgICAgICB0aWxlSUQuZ2V0VGlsZVBvaW50KG5ldyBNZXJjYXRvckNvb3JkaW5hdGUobWluWCwgbWluWSkpLFxuICAgICAgICAgICAgICAgIHRpbGVJRC5nZXRUaWxlUG9pbnQobmV3IE1lcmNhdG9yQ29vcmRpbmF0ZShtYXhYLCBtYXhZKSlcbiAgICAgICAgICAgIF07XG5cbiAgICAgICAgICAgIGlmICh0aWxlU3BhY2VCb3VuZHNbMF0ueCAtIHF1ZXJ5UGFkZGluZyA8IEVYVEVOVCAmJiB0aWxlU3BhY2VCb3VuZHNbMF0ueSAtIHF1ZXJ5UGFkZGluZyA8IEVYVEVOVCAmJlxuICAgICAgICAgICAgICAgIHRpbGVTcGFjZUJvdW5kc1sxXS54ICsgcXVlcnlQYWRkaW5nID49IDAgJiYgdGlsZVNwYWNlQm91bmRzWzFdLnkgKyBxdWVyeVBhZGRpbmcgPj0gMCkge1xuXG4gICAgICAgICAgICAgICAgY29uc3QgdGlsZVNwYWNlUXVlcnlHZW9tZXRyeTogQXJyYXk8UG9pbnQ+ID0gcXVlcnlHZW9tZXRyeS5tYXAoKGMpID0+IHRpbGVJRC5nZXRUaWxlUG9pbnQoYykpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRpbGVTcGFjZUNhbWVyYVF1ZXJ5R2VvbWV0cnkgPSBjYW1lcmFRdWVyeUdlb21ldHJ5Lm1hcCgoYykgPT4gdGlsZUlELmdldFRpbGVQb2ludChjKSk7XG5cbiAgICAgICAgICAgICAgICB0aWxlUmVzdWx0cy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgdGlsZSxcbiAgICAgICAgICAgICAgICAgICAgdGlsZUlELFxuICAgICAgICAgICAgICAgICAgICBxdWVyeUdlb21ldHJ5OiB0aWxlU3BhY2VRdWVyeUdlb21ldHJ5LFxuICAgICAgICAgICAgICAgICAgICBjYW1lcmFRdWVyeUdlb21ldHJ5OiB0aWxlU3BhY2VDYW1lcmFRdWVyeUdlb21ldHJ5LFxuICAgICAgICAgICAgICAgICAgICBzY2FsZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRpbGVSZXN1bHRzO1xuICAgIH1cblxuICAgIGdldFZpc2libGVDb29yZGluYXRlcyhzeW1ib2xMYXllcj86IGJvb2xlYW4pOiBBcnJheTxPdmVyc2NhbGVkVGlsZUlEPiB7XG4gICAgICAgIGNvbnN0IGNvb3JkcyA9IHRoaXMuZ2V0UmVuZGVyYWJsZUlkcyhzeW1ib2xMYXllcikubWFwKChpZCkgPT4gdGhpcy5fdGlsZXNbaWRdLnRpbGVJRCk7XG4gICAgICAgIGZvciAoY29uc3QgY29vcmQgb2YgY29vcmRzKSB7XG4gICAgICAgICAgICBjb29yZC5wb3NNYXRyaXggPSB0aGlzLnRyYW5zZm9ybS5jYWxjdWxhdGVQb3NNYXRyaXgoY29vcmQudG9VbndyYXBwZWQoKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvb3JkcztcbiAgICB9XG5cbiAgICBoYXNUcmFuc2l0aW9uKCkge1xuICAgICAgICBpZiAodGhpcy5fc291cmNlLmhhc1RyYW5zaXRpb24oKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNSYXN0ZXJUeXBlKHRoaXMuX3NvdXJjZS50eXBlKSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBpZCBpbiB0aGlzLl90aWxlcykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRpbGUgPSB0aGlzLl90aWxlc1tpZF07XG4gICAgICAgICAgICAgICAgaWYgKHRpbGUuZmFkZUVuZFRpbWUgIT09IHVuZGVmaW5lZCAmJiB0aWxlLmZhZGVFbmRUaW1lID49IGJyb3dzZXIubm93KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgdmFsdWUgb2YgYSBwYXJ0aWN1bGFyIHN0YXRlIGZvciBhIGZlYXR1cmVcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHNldEZlYXR1cmVTdGF0ZShzb3VyY2VMYXllcj86IHN0cmluZywgZmVhdHVyZTogbnVtYmVyLCBzdGF0ZTogT2JqZWN0KSB7XG4gICAgICAgIHNvdXJjZUxheWVyID0gc291cmNlTGF5ZXIgfHwgJ19nZW9qc29uVGlsZUxheWVyJztcbiAgICAgICAgdGhpcy5fc3RhdGUudXBkYXRlU3RhdGUoc291cmNlTGF5ZXIsIGZlYXR1cmUsIHN0YXRlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNldHMgdGhlIHZhbHVlIG9mIGEgcGFydGljdWxhciBzdGF0ZSBrZXkgZm9yIGEgZmVhdHVyZVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcmVtb3ZlRmVhdHVyZVN0YXRlKHNvdXJjZUxheWVyPzogc3RyaW5nLCBmZWF0dXJlPzogbnVtYmVyLCBrZXk/OiBzdHJpbmcpIHtcbiAgICAgICAgc291cmNlTGF5ZXIgPSBzb3VyY2VMYXllciB8fCAnX2dlb2pzb25UaWxlTGF5ZXInO1xuICAgICAgICB0aGlzLl9zdGF0ZS5yZW1vdmVGZWF0dXJlU3RhdGUoc291cmNlTGF5ZXIsIGZlYXR1cmUsIGtleSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBlbnRpcmUgc3RhdGUgb2JqZWN0IGZvciBhIGZlYXR1cmVcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGdldEZlYXR1cmVTdGF0ZShzb3VyY2VMYXllcj86IHN0cmluZywgZmVhdHVyZTogbnVtYmVyKSB7XG4gICAgICAgIHNvdXJjZUxheWVyID0gc291cmNlTGF5ZXIgfHwgJ19nZW9qc29uVGlsZUxheWVyJztcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0YXRlLmdldFN0YXRlKHNvdXJjZUxheWVyLCBmZWF0dXJlKTtcbiAgICB9XG59XG5cblNvdXJjZUNhY2hlLm1heE92ZXJ6b29taW5nID0gMTA7XG5Tb3VyY2VDYWNoZS5tYXhVbmRlcnpvb21pbmcgPSAzO1xuXG5mdW5jdGlvbiBjb21wYXJlS2V5Wm9vbShhLCBiKSB7XG4gICAgcmV0dXJuICgoYSAlIDMyKSAtIChiICUgMzIpKSB8fCAoYiAtIGEpO1xufVxuXG5mdW5jdGlvbiBpc1Jhc3RlclR5cGUodHlwZSkge1xuICAgIHJldHVybiB0eXBlID09PSAncmFzdGVyJyB8fCB0eXBlID09PSAnaW1hZ2UnIHx8IHR5cGUgPT09ICd2aWRlbyc7XG59XG5cbmV4cG9ydCBkZWZhdWx0IFNvdXJjZUNhY2hlO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHdpbmRvdyBmcm9tICcuLi93aW5kb3cnO1xuaW1wb3J0IG1hcGJveGdsIGZyb20gJy4uLy4uLyc7XG5cbmltcG9ydCB0eXBlIHtXb3JrZXJJbnRlcmZhY2V9IGZyb20gJy4uL3dlYl93b3JrZXInO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAoKTogV29ya2VySW50ZXJmYWNlIHtcbiAgICByZXR1cm4gKG5ldyB3aW5kb3cuV29ya2VyKG1hcGJveGdsLndvcmtlclVybCk6IGFueSk7XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgV2ViV29ya2VyIGZyb20gJy4vd2ViX3dvcmtlcic7XG5pbXBvcnQgdHlwZSB7V29ya2VySW50ZXJmYWNlfSBmcm9tICcuL3dlYl93b3JrZXInO1xuaW1wb3J0IGJyb3dzZXIgZnJvbSAnLi9icm93c2VyJztcblxuLyoqXG4gKiBDb25zdHJ1Y3RzIGEgd29ya2VyIHBvb2wuXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBXb3JrZXJQb29sIHtcbiAgICBzdGF0aWMgd29ya2VyQ291bnQ6IG51bWJlcjtcblxuICAgIGFjdGl2ZToge1tudW1iZXJdOiBib29sZWFufTtcbiAgICB3b3JrZXJzOiBBcnJheTxXb3JrZXJJbnRlcmZhY2U+O1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuYWN0aXZlID0ge307XG4gICAgfVxuXG4gICAgYWNxdWlyZShtYXBJZDogbnVtYmVyKTogQXJyYXk8V29ya2VySW50ZXJmYWNlPiB7XG4gICAgICAgIGlmICghdGhpcy53b3JrZXJzKSB7XG4gICAgICAgICAgICAvLyBMYXppbHkgbG9vayB1cCB0aGUgdmFsdWUgb2YgbWFwYm94Z2wud29ya2VyQ291bnQgc28gdGhhdFxuICAgICAgICAgICAgLy8gY2xpZW50IGNvZGUgaGFzIGhhZCBhIGNoYW5jZSB0byBzZXQgaXQuXG4gICAgICAgICAgICB0aGlzLndvcmtlcnMgPSBbXTtcbiAgICAgICAgICAgIHdoaWxlICh0aGlzLndvcmtlcnMubGVuZ3RoIDwgV29ya2VyUG9vbC53b3JrZXJDb3VudCkge1xuICAgICAgICAgICAgICAgIHRoaXMud29ya2Vycy5wdXNoKG5ldyBXZWJXb3JrZXIoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmFjdGl2ZVttYXBJZF0gPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcy53b3JrZXJzLnNsaWNlKCk7XG4gICAgfVxuXG4gICAgcmVsZWFzZShtYXBJZDogbnVtYmVyKSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLmFjdGl2ZVttYXBJZF07XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLmFjdGl2ZSkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLndvcmtlcnMuZm9yRWFjaCgodykgPT4ge1xuICAgICAgICAgICAgICAgIHcudGVybWluYXRlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMud29ya2VycyA9IChudWxsOiBhbnkpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5jb25zdCBhdmFpbGFibGVMb2dpY2FsUHJvY2Vzc29ycyA9IE1hdGguZmxvb3IoYnJvd3Nlci5oYXJkd2FyZUNvbmN1cnJlbmN5IC8gMik7XG5Xb3JrZXJQb29sLndvcmtlckNvdW50ID0gTWF0aC5tYXgoTWF0aC5taW4oYXZhaWxhYmxlTG9naWNhbFByb2Nlc3NvcnMsIDYpLCAxKTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCBXb3JrZXJQb29sIGZyb20gJy4vd29ya2VyX3Bvb2wnO1xuXG5sZXQgZ2xvYmFsV29ya2VyUG9vbDtcblxuLyoqXG4gKiBDcmVhdGVzIChpZiBuZWNlc3NhcnkpIGFuZCByZXR1cm5zIHRoZSBzaW5nbGUsIGdsb2JhbCBXb3JrZXJQb29sIGluc3RhbmNlXG4gKiB0byBiZSBzaGFyZWQgYWNyb3NzIGVhY2ggTWFwXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRHbG9iYWxXb3JrZXJQb29sICgpIHtcbiAgICBpZiAoIWdsb2JhbFdvcmtlclBvb2wpIHtcbiAgICAgICAgZ2xvYmFsV29ya2VyUG9vbCA9IG5ldyBXb3JrZXJQb29sKCk7XG4gICAgfVxuICAgIHJldHVybiBnbG9iYWxXb3JrZXJQb29sO1xufVxuIiwiXG5pbXBvcnQgcmVmUHJvcGVydGllcyBmcm9tICcuL3V0aWwvcmVmX3Byb3BlcnRpZXMnO1xuXG5mdW5jdGlvbiBkZXJlZihsYXllciwgcGFyZW50KSB7XG4gICAgY29uc3QgcmVzdWx0ID0ge307XG5cbiAgICBmb3IgKGNvbnN0IGsgaW4gbGF5ZXIpIHtcbiAgICAgICAgaWYgKGsgIT09ICdyZWYnKSB7XG4gICAgICAgICAgICByZXN1bHRba10gPSBsYXllcltrXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlZlByb3BlcnRpZXMuZm9yRWFjaCgoaykgPT4ge1xuICAgICAgICBpZiAoayBpbiBwYXJlbnQpIHtcbiAgICAgICAgICAgIHJlc3VsdFtrXSA9IHBhcmVudFtrXTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZGVyZWZMYXllcnM7XG5cbi8qKlxuICogR2l2ZW4gYW4gYXJyYXkgb2YgbGF5ZXJzLCBzb21lIG9mIHdoaWNoIG1heSBjb250YWluIGByZWZgIHByb3BlcnRpZXNcbiAqIHdob3NlIHZhbHVlIGlzIHRoZSBgaWRgIG9mIGFub3RoZXIgcHJvcGVydHksIHJldHVybiBhIG5ldyBhcnJheSB3aGVyZVxuICogc3VjaCBsYXllcnMgaGF2ZSBiZWVuIGF1Z21lbnRlZCB3aXRoIHRoZSAndHlwZScsICdzb3VyY2UnLCBldGMuIHByb3BlcnRpZXNcbiAqIGZyb20gdGhlIHBhcmVudCBsYXllciwgYW5kIHRoZSBgcmVmYCBwcm9wZXJ0eSBoYXMgYmVlbiByZW1vdmVkLlxuICpcbiAqIFRoZSBpbnB1dCBpcyBub3QgbW9kaWZpZWQuIFRoZSBvdXRwdXQgbWF5IGNvbnRhaW4gcmVmZXJlbmNlcyB0byBwb3J0aW9uc1xuICogb2YgdGhlIGlucHV0LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5PExheWVyPn0gbGF5ZXJzXG4gKiBAcmV0dXJucyB7QXJyYXk8TGF5ZXI+fVxuICovXG5mdW5jdGlvbiBkZXJlZkxheWVycyhsYXllcnMpIHtcbiAgICBsYXllcnMgPSBsYXllcnMuc2xpY2UoKTtcblxuICAgIGNvbnN0IG1hcCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsYXllcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbWFwW2xheWVyc1tpXS5pZF0gPSBsYXllcnNbaV07XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsYXllcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKCdyZWYnIGluIGxheWVyc1tpXSkge1xuICAgICAgICAgICAgbGF5ZXJzW2ldID0gZGVyZWYobGF5ZXJzW2ldLCBtYXBbbGF5ZXJzW2ldLnJlZl0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGxheWVycztcbn1cbiIsIlxuaW1wb3J0IGlzRXF1YWwgZnJvbSAnLi91dGlsL2RlZXBfZXF1YWwnO1xuXG5jb25zdCBvcGVyYXRpb25zID0ge1xuXG4gICAgLypcbiAgICAgKiB7IGNvbW1hbmQ6ICdzZXRTdHlsZScsIGFyZ3M6IFtzdHlsZXNoZWV0XSB9XG4gICAgICovXG4gICAgc2V0U3R5bGU6ICdzZXRTdHlsZScsXG5cbiAgICAvKlxuICAgICAqIHsgY29tbWFuZDogJ2FkZExheWVyJywgYXJnczogW2xheWVyLCAnYmVmb3JlTGF5ZXJJZCddIH1cbiAgICAgKi9cbiAgICBhZGRMYXllcjogJ2FkZExheWVyJyxcblxuICAgIC8qXG4gICAgICogeyBjb21tYW5kOiAncmVtb3ZlTGF5ZXInLCBhcmdzOiBbJ2xheWVySWQnXSB9XG4gICAgICovXG4gICAgcmVtb3ZlTGF5ZXI6ICdyZW1vdmVMYXllcicsXG5cbiAgICAvKlxuICAgICAqIHsgY29tbWFuZDogJ3NldFBhaW50UHJvcGVydHknLCBhcmdzOiBbJ2xheWVySWQnLCAncHJvcCcsIHZhbHVlXSB9XG4gICAgICovXG4gICAgc2V0UGFpbnRQcm9wZXJ0eTogJ3NldFBhaW50UHJvcGVydHknLFxuXG4gICAgLypcbiAgICAgKiB7IGNvbW1hbmQ6ICdzZXRMYXlvdXRQcm9wZXJ0eScsIGFyZ3M6IFsnbGF5ZXJJZCcsICdwcm9wJywgdmFsdWVdIH1cbiAgICAgKi9cbiAgICBzZXRMYXlvdXRQcm9wZXJ0eTogJ3NldExheW91dFByb3BlcnR5JyxcblxuICAgIC8qXG4gICAgICogeyBjb21tYW5kOiAnc2V0RmlsdGVyJywgYXJnczogWydsYXllcklkJywgZmlsdGVyXSB9XG4gICAgICovXG4gICAgc2V0RmlsdGVyOiAnc2V0RmlsdGVyJyxcblxuICAgIC8qXG4gICAgICogeyBjb21tYW5kOiAnYWRkU291cmNlJywgYXJnczogWydzb3VyY2VJZCcsIHNvdXJjZV0gfVxuICAgICAqL1xuICAgIGFkZFNvdXJjZTogJ2FkZFNvdXJjZScsXG5cbiAgICAvKlxuICAgICAqIHsgY29tbWFuZDogJ3JlbW92ZVNvdXJjZScsIGFyZ3M6IFsnc291cmNlSWQnXSB9XG4gICAgICovXG4gICAgcmVtb3ZlU291cmNlOiAncmVtb3ZlU291cmNlJyxcblxuICAgIC8qXG4gICAgICogeyBjb21tYW5kOiAnc2V0R2VvSlNPTlNvdXJjZURhdGEnLCBhcmdzOiBbJ3NvdXJjZUlkJywgZGF0YV0gfVxuICAgICAqL1xuICAgIHNldEdlb0pTT05Tb3VyY2VEYXRhOiAnc2V0R2VvSlNPTlNvdXJjZURhdGEnLFxuXG4gICAgLypcbiAgICAgKiB7IGNvbW1hbmQ6ICdzZXRMYXllclpvb21SYW5nZScsIGFyZ3M6IFsnbGF5ZXJJZCcsIDAsIDIyXSB9XG4gICAgICovXG4gICAgc2V0TGF5ZXJab29tUmFuZ2U6ICdzZXRMYXllclpvb21SYW5nZScsXG5cbiAgICAvKlxuICAgICAqIHsgY29tbWFuZDogJ3NldExheWVyUHJvcGVydHknLCBhcmdzOiBbJ2xheWVySWQnLCAncHJvcCcsIHZhbHVlXSB9XG4gICAgICovXG4gICAgc2V0TGF5ZXJQcm9wZXJ0eTogJ3NldExheWVyUHJvcGVydHknLFxuXG4gICAgLypcbiAgICAgKiB7IGNvbW1hbmQ6ICdzZXRDZW50ZXInLCBhcmdzOiBbW2xvbiwgbGF0XV0gfVxuICAgICAqL1xuICAgIHNldENlbnRlcjogJ3NldENlbnRlcicsXG5cbiAgICAvKlxuICAgICAqIHsgY29tbWFuZDogJ3NldFpvb20nLCBhcmdzOiBbem9vbV0gfVxuICAgICAqL1xuICAgIHNldFpvb206ICdzZXRab29tJyxcblxuICAgIC8qXG4gICAgICogeyBjb21tYW5kOiAnc2V0QmVhcmluZycsIGFyZ3M6IFtiZWFyaW5nXSB9XG4gICAgICovXG4gICAgc2V0QmVhcmluZzogJ3NldEJlYXJpbmcnLFxuXG4gICAgLypcbiAgICAgKiB7IGNvbW1hbmQ6ICdzZXRQaXRjaCcsIGFyZ3M6IFtwaXRjaF0gfVxuICAgICAqL1xuICAgIHNldFBpdGNoOiAnc2V0UGl0Y2gnLFxuXG4gICAgLypcbiAgICAgKiB7IGNvbW1hbmQ6ICdzZXRTcHJpdGUnLCBhcmdzOiBbJ3Nwcml0ZVVybCddIH1cbiAgICAgKi9cbiAgICBzZXRTcHJpdGU6ICdzZXRTcHJpdGUnLFxuXG4gICAgLypcbiAgICAgKiB7IGNvbW1hbmQ6ICdzZXRHbHlwaHMnLCBhcmdzOiBbJ2dseXBoc1VybCddIH1cbiAgICAgKi9cbiAgICBzZXRHbHlwaHM6ICdzZXRHbHlwaHMnLFxuXG4gICAgLypcbiAgICAgKiB7IGNvbW1hbmQ6ICdzZXRUcmFuc2l0aW9uJywgYXJnczogW3RyYW5zaXRpb25dIH1cbiAgICAgKi9cbiAgICBzZXRUcmFuc2l0aW9uOiAnc2V0VHJhbnNpdGlvbicsXG5cbiAgICAvKlxuICAgICAqIHsgY29tbWFuZDogJ3NldExpZ2h0aW5nJywgYXJnczogW2xpZ2h0UHJvcGVydGllc10gfVxuICAgICAqL1xuICAgIHNldExpZ2h0OiAnc2V0TGlnaHQnXG5cbn07XG5cbmZ1bmN0aW9uIGFkZFNvdXJjZShzb3VyY2VJZCwgYWZ0ZXIsIGNvbW1hbmRzKSB7XG4gICAgY29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IG9wZXJhdGlvbnMuYWRkU291cmNlLCBhcmdzOiBbc291cmNlSWQsIGFmdGVyW3NvdXJjZUlkXV0gfSk7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZVNvdXJjZShzb3VyY2VJZCwgY29tbWFuZHMsIHNvdXJjZXNSZW1vdmVkKSB7XG4gICAgY29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IG9wZXJhdGlvbnMucmVtb3ZlU291cmNlLCBhcmdzOiBbc291cmNlSWRdIH0pO1xuICAgIHNvdXJjZXNSZW1vdmVkW3NvdXJjZUlkXSA9IHRydWU7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVNvdXJjZShzb3VyY2VJZCwgYWZ0ZXIsIGNvbW1hbmRzLCBzb3VyY2VzUmVtb3ZlZCkge1xuICAgIHJlbW92ZVNvdXJjZShzb3VyY2VJZCwgY29tbWFuZHMsIHNvdXJjZXNSZW1vdmVkKTtcbiAgICBhZGRTb3VyY2Uoc291cmNlSWQsIGFmdGVyLCBjb21tYW5kcyk7XG59XG5cbmZ1bmN0aW9uIGNhblVwZGF0ZUdlb0pTT04oYmVmb3JlLCBhZnRlciwgc291cmNlSWQpIHtcbiAgICBsZXQgcHJvcDtcbiAgICBmb3IgKHByb3AgaW4gYmVmb3JlW3NvdXJjZUlkXSkge1xuICAgICAgICBpZiAoIWJlZm9yZVtzb3VyY2VJZF0uaGFzT3duUHJvcGVydHkocHJvcCkpIGNvbnRpbnVlO1xuICAgICAgICBpZiAocHJvcCAhPT0gJ2RhdGEnICYmICFpc0VxdWFsKGJlZm9yZVtzb3VyY2VJZF1bcHJvcF0sIGFmdGVyW3NvdXJjZUlkXVtwcm9wXSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmb3IgKHByb3AgaW4gYWZ0ZXJbc291cmNlSWRdKSB7XG4gICAgICAgIGlmICghYWZ0ZXJbc291cmNlSWRdLmhhc093blByb3BlcnR5KHByb3ApKSBjb250aW51ZTtcbiAgICAgICAgaWYgKHByb3AgIT09ICdkYXRhJyAmJiAhaXNFcXVhbChiZWZvcmVbc291cmNlSWRdW3Byb3BdLCBhZnRlcltzb3VyY2VJZF1bcHJvcF0pKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGRpZmZTb3VyY2VzKGJlZm9yZSwgYWZ0ZXIsIGNvbW1hbmRzLCBzb3VyY2VzUmVtb3ZlZCkge1xuICAgIGJlZm9yZSA9IGJlZm9yZSB8fCB7fTtcbiAgICBhZnRlciA9IGFmdGVyIHx8IHt9O1xuXG4gICAgbGV0IHNvdXJjZUlkO1xuXG4gICAgLy8gbG9vayBmb3Igc291cmNlcyB0byByZW1vdmVcbiAgICBmb3IgKHNvdXJjZUlkIGluIGJlZm9yZSkge1xuICAgICAgICBpZiAoIWJlZm9yZS5oYXNPd25Qcm9wZXJ0eShzb3VyY2VJZCkpIGNvbnRpbnVlO1xuICAgICAgICBpZiAoIWFmdGVyLmhhc093blByb3BlcnR5KHNvdXJjZUlkKSkge1xuICAgICAgICAgICAgcmVtb3ZlU291cmNlKHNvdXJjZUlkLCBjb21tYW5kcywgc291cmNlc1JlbW92ZWQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gbG9vayBmb3Igc291cmNlcyB0byBhZGQvdXBkYXRlXG4gICAgZm9yIChzb3VyY2VJZCBpbiBhZnRlcikge1xuICAgICAgICBpZiAoIWFmdGVyLmhhc093blByb3BlcnR5KHNvdXJjZUlkKSkgY29udGludWU7XG4gICAgICAgIGlmICghYmVmb3JlLmhhc093blByb3BlcnR5KHNvdXJjZUlkKSkge1xuICAgICAgICAgICAgYWRkU291cmNlKHNvdXJjZUlkLCBhZnRlciwgY29tbWFuZHMpO1xuICAgICAgICB9IGVsc2UgaWYgKCFpc0VxdWFsKGJlZm9yZVtzb3VyY2VJZF0sIGFmdGVyW3NvdXJjZUlkXSkpIHtcbiAgICAgICAgICAgIGlmIChiZWZvcmVbc291cmNlSWRdLnR5cGUgPT09ICdnZW9qc29uJyAmJiBhZnRlcltzb3VyY2VJZF0udHlwZSA9PT0gJ2dlb2pzb24nICYmIGNhblVwZGF0ZUdlb0pTT04oYmVmb3JlLCBhZnRlciwgc291cmNlSWQpKSB7XG4gICAgICAgICAgICAgICAgY29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IG9wZXJhdGlvbnMuc2V0R2VvSlNPTlNvdXJjZURhdGEsIGFyZ3M6IFtzb3VyY2VJZCwgYWZ0ZXJbc291cmNlSWRdLmRhdGFdIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBubyB1cGRhdGUgY29tbWFuZCwgbXVzdCByZW1vdmUgdGhlbiBhZGRcbiAgICAgICAgICAgICAgICB1cGRhdGVTb3VyY2Uoc291cmNlSWQsIGFmdGVyLCBjb21tYW5kcywgc291cmNlc1JlbW92ZWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG5mdW5jdGlvbiBkaWZmTGF5ZXJQcm9wZXJ0eUNoYW5nZXMoYmVmb3JlLCBhZnRlciwgY29tbWFuZHMsIGxheWVySWQsIGtsYXNzLCBjb21tYW5kKSB7XG4gICAgYmVmb3JlID0gYmVmb3JlIHx8IHt9O1xuICAgIGFmdGVyID0gYWZ0ZXIgfHwge307XG5cbiAgICBsZXQgcHJvcDtcblxuICAgIGZvciAocHJvcCBpbiBiZWZvcmUpIHtcbiAgICAgICAgaWYgKCFiZWZvcmUuaGFzT3duUHJvcGVydHkocHJvcCkpIGNvbnRpbnVlO1xuICAgICAgICBpZiAoIWlzRXF1YWwoYmVmb3JlW3Byb3BdLCBhZnRlcltwcm9wXSkpIHtcbiAgICAgICAgICAgIGNvbW1hbmRzLnB1c2goeyBjb21tYW5kLCBhcmdzOiBbbGF5ZXJJZCwgcHJvcCwgYWZ0ZXJbcHJvcF0sIGtsYXNzXSB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmb3IgKHByb3AgaW4gYWZ0ZXIpIHtcbiAgICAgICAgaWYgKCFhZnRlci5oYXNPd25Qcm9wZXJ0eShwcm9wKSB8fCBiZWZvcmUuaGFzT3duUHJvcGVydHkocHJvcCkpIGNvbnRpbnVlO1xuICAgICAgICBpZiAoIWlzRXF1YWwoYmVmb3JlW3Byb3BdLCBhZnRlcltwcm9wXSkpIHtcbiAgICAgICAgICAgIGNvbW1hbmRzLnB1c2goeyBjb21tYW5kLCBhcmdzOiBbbGF5ZXJJZCwgcHJvcCwgYWZ0ZXJbcHJvcF0sIGtsYXNzXSB9KTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gcGx1Y2tJZChsYXllcikge1xuICAgIHJldHVybiBsYXllci5pZDtcbn1cbmZ1bmN0aW9uIGluZGV4QnlJZChncm91cCwgbGF5ZXIpIHtcbiAgICBncm91cFtsYXllci5pZF0gPSBsYXllcjtcbiAgICByZXR1cm4gZ3JvdXA7XG59XG5cbmZ1bmN0aW9uIGRpZmZMYXllcnMoYmVmb3JlLCBhZnRlciwgY29tbWFuZHMpIHtcbiAgICBiZWZvcmUgPSBiZWZvcmUgfHwgW107XG4gICAgYWZ0ZXIgPSBhZnRlciB8fCBbXTtcblxuICAgIC8vIG9yZGVyIG9mIGxheWVycyBieSBpZFxuICAgIGNvbnN0IGJlZm9yZU9yZGVyID0gYmVmb3JlLm1hcChwbHVja0lkKTtcbiAgICBjb25zdCBhZnRlck9yZGVyID0gYWZ0ZXIubWFwKHBsdWNrSWQpO1xuXG4gICAgLy8gaW5kZXggb2YgbGF5ZXIgYnkgaWRcbiAgICBjb25zdCBiZWZvcmVJbmRleCA9IGJlZm9yZS5yZWR1Y2UoaW5kZXhCeUlkLCB7fSk7XG4gICAgY29uc3QgYWZ0ZXJJbmRleCA9IGFmdGVyLnJlZHVjZShpbmRleEJ5SWQsIHt9KTtcblxuICAgIC8vIHRyYWNrIG9yZGVyIG9mIGxheWVycyBhcyBpZiB0aGV5IGhhdmUgYmVlbiBtdXRhdGVkXG4gICAgY29uc3QgdHJhY2tlciA9IGJlZm9yZU9yZGVyLnNsaWNlKCk7XG5cbiAgICAvLyBsYXllcnMgdGhhdCBoYXZlIGJlZW4gYWRkZWQgZG8gbm90IG5lZWQgdG8gYmUgZGlmZmVkXG4gICAgY29uc3QgY2xlYW4gPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG4gICAgbGV0IGksIGQsIGxheWVySWQsIGJlZm9yZUxheWVyLCBhZnRlckxheWVyLCBpbnNlcnRCZWZvcmVMYXllcklkLCBwcm9wO1xuXG4gICAgLy8gcmVtb3ZlIGxheWVyc1xuICAgIGZvciAoaSA9IDAsIGQgPSAwOyBpIDwgYmVmb3JlT3JkZXIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGF5ZXJJZCA9IGJlZm9yZU9yZGVyW2ldO1xuICAgICAgICBpZiAoIWFmdGVySW5kZXguaGFzT3duUHJvcGVydHkobGF5ZXJJZCkpIHtcbiAgICAgICAgICAgIGNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBvcGVyYXRpb25zLnJlbW92ZUxheWVyLCBhcmdzOiBbbGF5ZXJJZF0gfSk7XG4gICAgICAgICAgICB0cmFja2VyLnNwbGljZSh0cmFja2VyLmluZGV4T2YobGF5ZXJJZCwgZCksIDEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gbGltaXQgd2hlcmUgaW4gdHJhY2tlciB3ZSBuZWVkIHRvIGxvb2sgZm9yIGEgbWF0Y2hcbiAgICAgICAgICAgIGQrKztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGFkZC9yZW9yZGVyIGxheWVyc1xuICAgIGZvciAoaSA9IDAsIGQgPSAwOyBpIDwgYWZ0ZXJPcmRlci5sZW5ndGg7IGkrKykge1xuICAgICAgICAvLyB3b3JrIGJhY2t3YXJkcyBhcyBpbnNlcnQgaXMgYmVmb3JlIGFuIGV4aXN0aW5nIGxheWVyXG4gICAgICAgIGxheWVySWQgPSBhZnRlck9yZGVyW2FmdGVyT3JkZXIubGVuZ3RoIC0gMSAtIGldO1xuXG4gICAgICAgIGlmICh0cmFja2VyW3RyYWNrZXIubGVuZ3RoIC0gMSAtIGldID09PSBsYXllcklkKSBjb250aW51ZTtcblxuICAgICAgICBpZiAoYmVmb3JlSW5kZXguaGFzT3duUHJvcGVydHkobGF5ZXJJZCkpIHtcbiAgICAgICAgICAgIC8vIHJlbW92ZSB0aGUgbGF5ZXIgYmVmb3JlIHdlIGluc2VydCBhdCB0aGUgY29ycmVjdCBwb3NpdGlvblxuICAgICAgICAgICAgY29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IG9wZXJhdGlvbnMucmVtb3ZlTGF5ZXIsIGFyZ3M6IFtsYXllcklkXSB9KTtcbiAgICAgICAgICAgIHRyYWNrZXIuc3BsaWNlKHRyYWNrZXIubGFzdEluZGV4T2YobGF5ZXJJZCwgdHJhY2tlci5sZW5ndGggLSBkKSwgMSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBsaW1pdCB3aGVyZSBpbiB0cmFja2VyIHdlIG5lZWQgdG8gbG9vayBmb3IgYSBtYXRjaFxuICAgICAgICAgICAgZCsrO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gYWRkIGxheWVyIGF0IGNvcnJlY3QgcG9zaXRpb25cbiAgICAgICAgaW5zZXJ0QmVmb3JlTGF5ZXJJZCA9IHRyYWNrZXJbdHJhY2tlci5sZW5ndGggLSBpXTtcbiAgICAgICAgY29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IG9wZXJhdGlvbnMuYWRkTGF5ZXIsIGFyZ3M6IFthZnRlckluZGV4W2xheWVySWRdLCBpbnNlcnRCZWZvcmVMYXllcklkXSB9KTtcbiAgICAgICAgdHJhY2tlci5zcGxpY2UodHJhY2tlci5sZW5ndGggLSBpLCAwLCBsYXllcklkKTtcbiAgICAgICAgY2xlYW5bbGF5ZXJJZF0gPSB0cnVlO1xuICAgIH1cblxuICAgIC8vIHVwZGF0ZSBsYXllcnNcbiAgICBmb3IgKGkgPSAwOyBpIDwgYWZ0ZXJPcmRlci5sZW5ndGg7IGkrKykge1xuICAgICAgICBsYXllcklkID0gYWZ0ZXJPcmRlcltpXTtcbiAgICAgICAgYmVmb3JlTGF5ZXIgPSBiZWZvcmVJbmRleFtsYXllcklkXTtcbiAgICAgICAgYWZ0ZXJMYXllciA9IGFmdGVySW5kZXhbbGF5ZXJJZF07XG5cbiAgICAgICAgLy8gbm8gbmVlZCB0byB1cGRhdGUgaWYgcHJldmlvdXNseSBhZGRlZCAobmV3IG9yIG1vdmVkKVxuICAgICAgICBpZiAoY2xlYW5bbGF5ZXJJZF0gfHwgaXNFcXVhbChiZWZvcmVMYXllciwgYWZ0ZXJMYXllcikpIGNvbnRpbnVlO1xuXG4gICAgICAgIC8vIElmIHNvdXJjZSwgc291cmNlLWxheWVyLCBvciB0eXBlIGhhdmUgY2hhbmdlcywgdGhlbiByZW1vdmUgdGhlIGxheWVyXG4gICAgICAgIC8vIGFuZCBhZGQgaXQgYmFjayAnZnJvbSBzY3JhdGNoJy5cbiAgICAgICAgaWYgKCFpc0VxdWFsKGJlZm9yZUxheWVyLnNvdXJjZSwgYWZ0ZXJMYXllci5zb3VyY2UpIHx8ICFpc0VxdWFsKGJlZm9yZUxheWVyWydzb3VyY2UtbGF5ZXInXSwgYWZ0ZXJMYXllclsnc291cmNlLWxheWVyJ10pIHx8ICFpc0VxdWFsKGJlZm9yZUxheWVyLnR5cGUsIGFmdGVyTGF5ZXIudHlwZSkpIHtcbiAgICAgICAgICAgIGNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBvcGVyYXRpb25zLnJlbW92ZUxheWVyLCBhcmdzOiBbbGF5ZXJJZF0gfSk7XG4gICAgICAgICAgICAvLyB3ZSBhZGQgdGhlIGxheWVyIGJhY2sgYXQgdGhlIHNhbWUgcG9zaXRpb24gaXQgd2FzIGFscmVhZHkgaW4sIHNvXG4gICAgICAgICAgICAvLyB0aGVyZSdzIG5vIG5lZWQgdG8gdXBkYXRlIHRoZSBgdHJhY2tlcmBcbiAgICAgICAgICAgIGluc2VydEJlZm9yZUxheWVySWQgPSB0cmFja2VyW3RyYWNrZXIubGFzdEluZGV4T2YobGF5ZXJJZCkgKyAxXTtcbiAgICAgICAgICAgIGNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBvcGVyYXRpb25zLmFkZExheWVyLCBhcmdzOiBbYWZ0ZXJMYXllciwgaW5zZXJ0QmVmb3JlTGF5ZXJJZF0gfSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGxheW91dCwgcGFpbnQsIGZpbHRlciwgbWluem9vbSwgbWF4em9vbVxuICAgICAgICBkaWZmTGF5ZXJQcm9wZXJ0eUNoYW5nZXMoYmVmb3JlTGF5ZXIubGF5b3V0LCBhZnRlckxheWVyLmxheW91dCwgY29tbWFuZHMsIGxheWVySWQsIG51bGwsIG9wZXJhdGlvbnMuc2V0TGF5b3V0UHJvcGVydHkpO1xuICAgICAgICBkaWZmTGF5ZXJQcm9wZXJ0eUNoYW5nZXMoYmVmb3JlTGF5ZXIucGFpbnQsIGFmdGVyTGF5ZXIucGFpbnQsIGNvbW1hbmRzLCBsYXllcklkLCBudWxsLCBvcGVyYXRpb25zLnNldFBhaW50UHJvcGVydHkpO1xuICAgICAgICBpZiAoIWlzRXF1YWwoYmVmb3JlTGF5ZXIuZmlsdGVyLCBhZnRlckxheWVyLmZpbHRlcikpIHtcbiAgICAgICAgICAgIGNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBvcGVyYXRpb25zLnNldEZpbHRlciwgYXJnczogW2xheWVySWQsIGFmdGVyTGF5ZXIuZmlsdGVyXSB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzRXF1YWwoYmVmb3JlTGF5ZXIubWluem9vbSwgYWZ0ZXJMYXllci5taW56b29tKSB8fCAhaXNFcXVhbChiZWZvcmVMYXllci5tYXh6b29tLCBhZnRlckxheWVyLm1heHpvb20pKSB7XG4gICAgICAgICAgICBjb21tYW5kcy5wdXNoKHsgY29tbWFuZDogb3BlcmF0aW9ucy5zZXRMYXllclpvb21SYW5nZSwgYXJnczogW2xheWVySWQsIGFmdGVyTGF5ZXIubWluem9vbSwgYWZ0ZXJMYXllci5tYXh6b29tXSB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGhhbmRsZSBhbGwgb3RoZXIgbGF5ZXIgcHJvcHMsIGluY2x1ZGluZyBwYWludC4qXG4gICAgICAgIGZvciAocHJvcCBpbiBiZWZvcmVMYXllcikge1xuICAgICAgICAgICAgaWYgKCFiZWZvcmVMYXllci5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgY29udGludWU7XG4gICAgICAgICAgICBpZiAocHJvcCA9PT0gJ2xheW91dCcgfHwgcHJvcCA9PT0gJ3BhaW50JyB8fCBwcm9wID09PSAnZmlsdGVyJyB8fFxuICAgICAgICAgICAgICAgIHByb3AgPT09ICdtZXRhZGF0YScgfHwgcHJvcCA9PT0gJ21pbnpvb20nIHx8IHByb3AgPT09ICdtYXh6b29tJykgY29udGludWU7XG4gICAgICAgICAgICBpZiAocHJvcC5pbmRleE9mKCdwYWludC4nKSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGRpZmZMYXllclByb3BlcnR5Q2hhbmdlcyhiZWZvcmVMYXllcltwcm9wXSwgYWZ0ZXJMYXllcltwcm9wXSwgY29tbWFuZHMsIGxheWVySWQsIHByb3Auc2xpY2UoNiksIG9wZXJhdGlvbnMuc2V0UGFpbnRQcm9wZXJ0eSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCFpc0VxdWFsKGJlZm9yZUxheWVyW3Byb3BdLCBhZnRlckxheWVyW3Byb3BdKSkge1xuICAgICAgICAgICAgICAgIGNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBvcGVyYXRpb25zLnNldExheWVyUHJvcGVydHksIGFyZ3M6IFtsYXllcklkLCBwcm9wLCBhZnRlckxheWVyW3Byb3BdXSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKHByb3AgaW4gYWZ0ZXJMYXllcikge1xuICAgICAgICAgICAgaWYgKCFhZnRlckxheWVyLmhhc093blByb3BlcnR5KHByb3ApIHx8IGJlZm9yZUxheWVyLmhhc093blByb3BlcnR5KHByb3ApKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmIChwcm9wID09PSAnbGF5b3V0JyB8fCBwcm9wID09PSAncGFpbnQnIHx8IHByb3AgPT09ICdmaWx0ZXInIHx8XG4gICAgICAgICAgICAgICAgcHJvcCA9PT0gJ21ldGFkYXRhJyB8fCBwcm9wID09PSAnbWluem9vbScgfHwgcHJvcCA9PT0gJ21heHpvb20nKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmIChwcm9wLmluZGV4T2YoJ3BhaW50LicpID09PSAwKSB7XG4gICAgICAgICAgICAgICAgZGlmZkxheWVyUHJvcGVydHlDaGFuZ2VzKGJlZm9yZUxheWVyW3Byb3BdLCBhZnRlckxheWVyW3Byb3BdLCBjb21tYW5kcywgbGF5ZXJJZCwgcHJvcC5zbGljZSg2KSwgb3BlcmF0aW9ucy5zZXRQYWludFByb3BlcnR5KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIWlzRXF1YWwoYmVmb3JlTGF5ZXJbcHJvcF0sIGFmdGVyTGF5ZXJbcHJvcF0pKSB7XG4gICAgICAgICAgICAgICAgY29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IG9wZXJhdGlvbnMuc2V0TGF5ZXJQcm9wZXJ0eSwgYXJnczogW2xheWVySWQsIHByb3AsIGFmdGVyTGF5ZXJbcHJvcF1dIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG4vKipcbiAqIERpZmYgdHdvIHN0eWxlc2hlZXRcbiAqXG4gKiBDcmVhdGVzIHNlbWFudGljbHkgYXdhcmUgZGlmZnMgdGhhdCBjYW4gZWFzaWx5IGJlIGFwcGxpZWQgYXQgcnVudGltZS5cbiAqIE9wZXJhdGlvbnMgcHJvZHVjZWQgYnkgdGhlIGRpZmYgY2xvc2VseSByZXNlbWJsZSB0aGUgbWFwYm94LWdsLWpzIEFQSS4gQW55XG4gKiBlcnJvciBjcmVhdGluZyB0aGUgZGlmZiB3aWxsIGZhbGwgYmFjayB0byB0aGUgJ3NldFN0eWxlJyBvcGVyYXRpb24uXG4gKlxuICogRXhhbXBsZSBkaWZmOlxuICogW1xuICogICAgIHsgY29tbWFuZDogJ3NldENvbnN0YW50JywgYXJnczogWydAd2F0ZXInLCAnIzAwMDBGRiddIH0sXG4gKiAgICAgeyBjb21tYW5kOiAnc2V0UGFpbnRQcm9wZXJ0eScsIGFyZ3M6IFsnYmFja2dyb3VuZCcsICdiYWNrZ3JvdW5kLWNvbG9yJywgJ2JsYWNrJ10gfVxuICogXVxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IFtiZWZvcmVdIHN0eWxlc2hlZXQgdG8gY29tcGFyZSBmcm9tXG4gKiBAcGFyYW0geyp9IGFmdGVyIHN0eWxlc2hlZXQgdG8gY29tcGFyZSB0b1xuICogQHJldHVybnMgQXJyYXkgbGlzdCBvZiBjaGFuZ2VzXG4gKi9cbmZ1bmN0aW9uIGRpZmZTdHlsZXMoYmVmb3JlLCBhZnRlcikge1xuICAgIGlmICghYmVmb3JlKSByZXR1cm4gW3sgY29tbWFuZDogb3BlcmF0aW9ucy5zZXRTdHlsZSwgYXJnczogW2FmdGVyXSB9XTtcblxuICAgIGxldCBjb21tYW5kcyA9IFtdO1xuXG4gICAgdHJ5IHtcbiAgICAgICAgLy8gSGFuZGxlIGNoYW5nZXMgdG8gdG9wLWxldmVsIHByb3BlcnRpZXNcbiAgICAgICAgaWYgKCFpc0VxdWFsKGJlZm9yZS52ZXJzaW9uLCBhZnRlci52ZXJzaW9uKSkge1xuICAgICAgICAgICAgcmV0dXJuIFt7IGNvbW1hbmQ6IG9wZXJhdGlvbnMuc2V0U3R5bGUsIGFyZ3M6IFthZnRlcl0gfV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc0VxdWFsKGJlZm9yZS5jZW50ZXIsIGFmdGVyLmNlbnRlcikpIHtcbiAgICAgICAgICAgIGNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBvcGVyYXRpb25zLnNldENlbnRlciwgYXJnczogW2FmdGVyLmNlbnRlcl0gfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc0VxdWFsKGJlZm9yZS56b29tLCBhZnRlci56b29tKSkge1xuICAgICAgICAgICAgY29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IG9wZXJhdGlvbnMuc2V0Wm9vbSwgYXJnczogW2FmdGVyLnpvb21dIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNFcXVhbChiZWZvcmUuYmVhcmluZywgYWZ0ZXIuYmVhcmluZykpIHtcbiAgICAgICAgICAgIGNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBvcGVyYXRpb25zLnNldEJlYXJpbmcsIGFyZ3M6IFthZnRlci5iZWFyaW5nXSB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzRXF1YWwoYmVmb3JlLnBpdGNoLCBhZnRlci5waXRjaCkpIHtcbiAgICAgICAgICAgIGNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBvcGVyYXRpb25zLnNldFBpdGNoLCBhcmdzOiBbYWZ0ZXIucGl0Y2hdIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNFcXVhbChiZWZvcmUuc3ByaXRlLCBhZnRlci5zcHJpdGUpKSB7XG4gICAgICAgICAgICBjb21tYW5kcy5wdXNoKHsgY29tbWFuZDogb3BlcmF0aW9ucy5zZXRTcHJpdGUsIGFyZ3M6IFthZnRlci5zcHJpdGVdIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNFcXVhbChiZWZvcmUuZ2x5cGhzLCBhZnRlci5nbHlwaHMpKSB7XG4gICAgICAgICAgICBjb21tYW5kcy5wdXNoKHsgY29tbWFuZDogb3BlcmF0aW9ucy5zZXRHbHlwaHMsIGFyZ3M6IFthZnRlci5nbHlwaHNdIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNFcXVhbChiZWZvcmUudHJhbnNpdGlvbiwgYWZ0ZXIudHJhbnNpdGlvbikpIHtcbiAgICAgICAgICAgIGNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBvcGVyYXRpb25zLnNldFRyYW5zaXRpb24sIGFyZ3M6IFthZnRlci50cmFuc2l0aW9uXSB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzRXF1YWwoYmVmb3JlLmxpZ2h0LCBhZnRlci5saWdodCkpIHtcbiAgICAgICAgICAgIGNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBvcGVyYXRpb25zLnNldExpZ2h0LCBhcmdzOiBbYWZ0ZXIubGlnaHRdIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSGFuZGxlIGNoYW5nZXMgdG8gYHNvdXJjZXNgXG4gICAgICAgIC8vIElmIGEgc291cmNlIGlzIHRvIGJlIHJlbW92ZWQsIHdlIGFsc28tLWJlZm9yZSB0aGUgcmVtb3ZlU291cmNlXG4gICAgICAgIC8vIGNvbW1hbmQtLW5lZWQgdG8gcmVtb3ZlIGFsbCB0aGUgc3R5bGUgbGF5ZXJzIHRoYXQgZGVwZW5kIG9uIGl0LlxuICAgICAgICBjb25zdCBzb3VyY2VzUmVtb3ZlZCA9IHt9O1xuXG4gICAgICAgIC8vIEZpcnN0IGNvbGxlY3QgdGhlIHthZGQscmVtb3ZlfVNvdXJjZSBjb21tYW5kc1xuICAgICAgICBjb25zdCByZW1vdmVPckFkZFNvdXJjZUNvbW1hbmRzID0gW107XG4gICAgICAgIGRpZmZTb3VyY2VzKGJlZm9yZS5zb3VyY2VzLCBhZnRlci5zb3VyY2VzLCByZW1vdmVPckFkZFNvdXJjZUNvbW1hbmRzLCBzb3VyY2VzUmVtb3ZlZCk7XG5cbiAgICAgICAgLy8gUHVzaCBhIHJlbW92ZUxheWVyIGNvbW1hbmQgZm9yIGVhY2ggc3R5bGUgbGF5ZXIgdGhhdCBkZXBlbmRzIG9uIGFcbiAgICAgICAgLy8gc291cmNlIHRoYXQncyBiZWluZyByZW1vdmVkLlxuICAgICAgICAvLyBBbHNvLCBleGNsdWRlIGFueSBzdWNoIGxheWVycyB0aGVtIGZyb20gdGhlIGlucHV0IHRvIGBkaWZmTGF5ZXJzYFxuICAgICAgICAvLyBiZWxvdywgc28gdGhhdCBkaWZmTGF5ZXJzIHByb2R1Y2VzIHRoZSBhcHByb3ByaWF0ZSBgYWRkTGF5ZXJzYFxuICAgICAgICAvLyBjb21tYW5kXG4gICAgICAgIGNvbnN0IGJlZm9yZUxheWVycyA9IFtdO1xuICAgICAgICBpZiAoYmVmb3JlLmxheWVycykge1xuICAgICAgICAgICAgYmVmb3JlLmxheWVycy5mb3JFYWNoKChsYXllcikgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChzb3VyY2VzUmVtb3ZlZFtsYXllci5zb3VyY2VdKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBvcGVyYXRpb25zLnJlbW92ZUxheWVyLCBhcmdzOiBbbGF5ZXIuaWRdIH0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGJlZm9yZUxheWVycy5wdXNoKGxheWVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb21tYW5kcyA9IGNvbW1hbmRzLmNvbmNhdChyZW1vdmVPckFkZFNvdXJjZUNvbW1hbmRzKTtcblxuICAgICAgICAvLyBIYW5kbGUgY2hhbmdlcyB0byBgbGF5ZXJzYFxuICAgICAgICBkaWZmTGF5ZXJzKGJlZm9yZUxheWVycywgYWZ0ZXIubGF5ZXJzLCBjb21tYW5kcyk7XG5cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIGZhbGwgYmFjayB0byBzZXRTdHlsZVxuICAgICAgICBjb25zb2xlLndhcm4oJ1VuYWJsZSB0byBjb21wdXRlIHN0eWxlIGRpZmY6JywgZSk7XG4gICAgICAgIGNvbW1hbmRzID0gW3sgY29tbWFuZDogb3BlcmF0aW9ucy5zZXRTdHlsZSwgYXJnczogW2FmdGVyXSB9XTtcbiAgICB9XG5cbiAgICByZXR1cm4gY29tbWFuZHM7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGRpZmZTdHlsZXM7XG5leHBvcnQgeyBvcGVyYXRpb25zIH07XG4iLCIvLyBAZmxvd1xuXG4vKipcbiAqIEdyaWRJbmRleCBpcyBhIGRhdGEgc3RydWN0dXJlIGZvciB0ZXN0aW5nIHRoZSBpbnRlcnNlY3Rpb24gb2ZcbiAqIGNpcmNsZXMgYW5kIHJlY3RhbmdsZXMgaW4gYSAyZCBwbGFuZS5cbiAqIEl0IGlzIG9wdGltaXplZCBmb3IgcmFwaWQgaW5zZXJ0aW9uIGFuZCBxdWVyeWluZy5cbiAqIEdyaWRJbmRleCBzcGxpdHMgdGhlIHBsYW5lIGludG8gYSBzZXQgb2YgXCJjZWxsc1wiIGFuZCBrZWVwcyB0cmFja1xuICogb2Ygd2hpY2ggZ2VvbWV0cmllcyBpbnRlcnNlY3Qgd2l0aCBlYWNoIGNlbGwuIEF0IHF1ZXJ5IHRpbWUsXG4gKiBmdWxsIGdlb21ldHJ5IGNvbXBhcmlzb25zIGFyZSBvbmx5IGRvbmUgZm9yIGl0ZW1zIHRoYXQgc2hhcmVcbiAqIGF0IGxlYXN0IG9uZSBjZWxsLiBBcyBsb25nIGFzIHRoZSBnZW9tZXRyaWVzIGFyZSByZWxhdGl2ZWx5XG4gKiB1bmlmb3JtbHkgZGlzdHJpYnV0ZWQgYWNyb3NzIHRoZSBwbGFuZSwgdGhpcyBncmVhdGx5IHJlZHVjZXNcbiAqIHRoZSBudW1iZXIgb2YgY29tcGFyaXNvbnMgbmVjZXNzYXJ5LlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIEdyaWRJbmRleCB7XG4gICAgY2lyY2xlS2V5czogQXJyYXk8YW55PjtcbiAgICBib3hLZXlzOiBBcnJheTxhbnk+O1xuICAgIGJveENlbGxzOiBBcnJheTxBcnJheTxudW1iZXI+PjtcbiAgICBjaXJjbGVDZWxsczogQXJyYXk8QXJyYXk8bnVtYmVyPj47XG4gICAgYmJveGVzOiBBcnJheTxudW1iZXI+O1xuICAgIGNpcmNsZXM6IEFycmF5PG51bWJlcj47XG4gICAgeENlbGxDb3VudDogbnVtYmVyO1xuICAgIHlDZWxsQ291bnQ6IG51bWJlcjtcbiAgICB3aWR0aDogbnVtYmVyO1xuICAgIGhlaWdodDogbnVtYmVyO1xuICAgIHhTY2FsZTogbnVtYmVyO1xuICAgIHlTY2FsZTogbnVtYmVyO1xuICAgIGJveFVpZDogbnVtYmVyO1xuICAgIGNpcmNsZVVpZDogbnVtYmVyO1xuXG4gICAgY29uc3RydWN0b3IgKHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyLCBjZWxsU2l6ZTogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IGJveENlbGxzID0gdGhpcy5ib3hDZWxscyA9IFtdO1xuICAgICAgICBjb25zdCBjaXJjbGVDZWxscyA9IHRoaXMuY2lyY2xlQ2VsbHMgPSBbXTtcblxuICAgICAgICAvLyBNb3JlIGNlbGxzIC0+IGZld2VyIGdlb21ldHJpZXMgdG8gY2hlY2sgcGVyIGNlbGwsIGJ1dCBpdGVtcyB0ZW5kXG4gICAgICAgIC8vIHRvIGJlIHNwbGl0IGFjcm9zcyBtb3JlIGNlbGxzLlxuICAgICAgICAvLyBTd2VldCBzcG90IGFsbG93cyBtb3N0IHNtYWxsIGl0ZW1zIHRvIGZpdCBpbiBvbmUgY2VsbFxuICAgICAgICB0aGlzLnhDZWxsQ291bnQgPSBNYXRoLmNlaWwod2lkdGggLyBjZWxsU2l6ZSk7XG4gICAgICAgIHRoaXMueUNlbGxDb3VudCA9IE1hdGguY2VpbChoZWlnaHQgLyBjZWxsU2l6ZSk7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnhDZWxsQ291bnQgKiB0aGlzLnlDZWxsQ291bnQ7IGkrKykge1xuICAgICAgICAgICAgYm94Q2VsbHMucHVzaChbXSk7XG4gICAgICAgICAgICBjaXJjbGVDZWxscy5wdXNoKFtdKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNpcmNsZUtleXMgPSBbXTtcbiAgICAgICAgdGhpcy5ib3hLZXlzID0gW107XG4gICAgICAgIHRoaXMuYmJveGVzID0gW107XG4gICAgICAgIHRoaXMuY2lyY2xlcyA9IFtdO1xuXG4gICAgICAgIHRoaXMud2lkdGggPSB3aWR0aDtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgICAgIHRoaXMueFNjYWxlID0gdGhpcy54Q2VsbENvdW50IC8gd2lkdGg7XG4gICAgICAgIHRoaXMueVNjYWxlID0gdGhpcy55Q2VsbENvdW50IC8gaGVpZ2h0O1xuICAgICAgICB0aGlzLmJveFVpZCA9IDA7XG4gICAgICAgIHRoaXMuY2lyY2xlVWlkID0gMDtcbiAgICB9XG5cbiAgICBrZXlzTGVuZ3RoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ib3hLZXlzLmxlbmd0aCArIHRoaXMuY2lyY2xlS2V5cy5sZW5ndGg7XG4gICAgfVxuXG4gICAgaW5zZXJ0KGtleTogYW55LCB4MTogbnVtYmVyLCB5MTogbnVtYmVyLCB4MjogbnVtYmVyLCB5MjogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuX2ZvckVhY2hDZWxsKHgxLCB5MSwgeDIsIHkyLCB0aGlzLl9pbnNlcnRCb3hDZWxsLCB0aGlzLmJveFVpZCsrKTtcbiAgICAgICAgdGhpcy5ib3hLZXlzLnB1c2goa2V5KTtcbiAgICAgICAgdGhpcy5iYm94ZXMucHVzaCh4MSk7XG4gICAgICAgIHRoaXMuYmJveGVzLnB1c2goeTEpO1xuICAgICAgICB0aGlzLmJib3hlcy5wdXNoKHgyKTtcbiAgICAgICAgdGhpcy5iYm94ZXMucHVzaCh5Mik7XG4gICAgfVxuXG4gICAgaW5zZXJ0Q2lyY2xlKGtleTogYW55LCB4OiBudW1iZXIsIHk6IG51bWJlciwgcmFkaXVzOiBudW1iZXIpIHtcbiAgICAgICAgLy8gSW5zZXJ0IGNpcmNsZSBpbnRvIGdyaWQgZm9yIGFsbCBjZWxscyBpbiB0aGUgY2lyY3Vtc2NyaWJpbmcgc3F1YXJlXG4gICAgICAgIC8vIEl0J3MgbW9yZSB0aGFuIG5lY2Vzc2FyeSAoYnkgYSBmYWN0b3Igb2YgNC9QSSksIGJ1dCBmYXN0IHRvIGluc2VydFxuICAgICAgICB0aGlzLl9mb3JFYWNoQ2VsbCh4IC0gcmFkaXVzLCB5IC0gcmFkaXVzLCB4ICsgcmFkaXVzLCB5ICsgcmFkaXVzLCB0aGlzLl9pbnNlcnRDaXJjbGVDZWxsLCB0aGlzLmNpcmNsZVVpZCsrKTtcbiAgICAgICAgdGhpcy5jaXJjbGVLZXlzLnB1c2goa2V5KTtcbiAgICAgICAgdGhpcy5jaXJjbGVzLnB1c2goeCk7XG4gICAgICAgIHRoaXMuY2lyY2xlcy5wdXNoKHkpO1xuICAgICAgICB0aGlzLmNpcmNsZXMucHVzaChyYWRpdXMpO1xuICAgIH1cblxuICAgIF9pbnNlcnRCb3hDZWxsKHgxOiBudW1iZXIsIHkxOiBudW1iZXIsIHgyOiBudW1iZXIsIHkyOiBudW1iZXIsIGNlbGxJbmRleDogbnVtYmVyLCB1aWQ6IG51bWJlcikge1xuICAgICAgICB0aGlzLmJveENlbGxzW2NlbGxJbmRleF0ucHVzaCh1aWQpO1xuICAgIH1cblxuICAgIF9pbnNlcnRDaXJjbGVDZWxsKHgxOiBudW1iZXIsIHkxOiBudW1iZXIsIHgyOiBudW1iZXIsIHkyOiBudW1iZXIsIGNlbGxJbmRleDogbnVtYmVyLCB1aWQ6IG51bWJlcikgIHtcbiAgICAgICAgdGhpcy5jaXJjbGVDZWxsc1tjZWxsSW5kZXhdLnB1c2godWlkKTtcbiAgICB9XG5cbiAgICBfcXVlcnkoeDE6IG51bWJlciwgeTE6IG51bWJlciwgeDI6IG51bWJlciwgeTI6IG51bWJlciwgaGl0VGVzdDogYm9vbGVhbiwgcHJlZGljYXRlPzogYW55KSB7XG4gICAgICAgIGlmICh4MiA8IDAgfHwgeDEgPiB0aGlzLndpZHRoIHx8IHkyIDwgMCB8fCB5MSA+IHRoaXMuaGVpZ2h0KSB7XG4gICAgICAgICAgICByZXR1cm4gaGl0VGVzdCA/IGZhbHNlIDogW107XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgICAgIGlmICh4MSA8PSAwICYmIHkxIDw9IDAgJiYgdGhpcy53aWR0aCA8PSB4MiAmJiB0aGlzLmhlaWdodCA8PSB5Mikge1xuICAgICAgICAgICAgaWYgKGhpdFRlc3QpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAobGV0IGJveFVpZCA9IDA7IGJveFVpZCA8IHRoaXMuYm94S2V5cy5sZW5ndGg7IGJveFVpZCsrKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBrZXk6IHRoaXMuYm94S2V5c1tib3hVaWRdLFxuICAgICAgICAgICAgICAgICAgICB4MTogdGhpcy5iYm94ZXNbYm94VWlkICogNF0sXG4gICAgICAgICAgICAgICAgICAgIHkxOiB0aGlzLmJib3hlc1tib3hVaWQgKiA0ICsgMV0sXG4gICAgICAgICAgICAgICAgICAgIHgyOiB0aGlzLmJib3hlc1tib3hVaWQgKiA0ICsgMl0sXG4gICAgICAgICAgICAgICAgICAgIHkyOiB0aGlzLmJib3hlc1tib3hVaWQgKiA0ICsgM11cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAobGV0IGNpcmNsZVVpZCA9IDA7IGNpcmNsZVVpZCA8IHRoaXMuY2lyY2xlS2V5cy5sZW5ndGg7IGNpcmNsZVVpZCsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeCA9IHRoaXMuY2lyY2xlc1tjaXJjbGVVaWQgKiAzXTtcbiAgICAgICAgICAgICAgICBjb25zdCB5ID0gdGhpcy5jaXJjbGVzW2NpcmNsZVVpZCAqIDMgKyAxXTtcbiAgICAgICAgICAgICAgICBjb25zdCByYWRpdXMgPSB0aGlzLmNpcmNsZXNbY2lyY2xlVWlkICogMyArIDJdO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAga2V5OiB0aGlzLmNpcmNsZUtleXNbY2lyY2xlVWlkXSxcbiAgICAgICAgICAgICAgICAgICAgeDE6IHggLSByYWRpdXMsXG4gICAgICAgICAgICAgICAgICAgIHkxOiB5IC0gcmFkaXVzLFxuICAgICAgICAgICAgICAgICAgICB4MjogeCArIHJhZGl1cyxcbiAgICAgICAgICAgICAgICAgICAgeTI6IHkgKyByYWRpdXNcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBwcmVkaWNhdGUgPyByZXN1bHQuZmlsdGVyKHByZWRpY2F0ZSkgOiByZXN1bHQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBxdWVyeUFyZ3MgPSB7XG4gICAgICAgICAgICAgICAgaGl0VGVzdCxcbiAgICAgICAgICAgICAgICBzZWVuVWlkczogeyBib3g6IHt9LCBjaXJjbGU6IHt9IH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLl9mb3JFYWNoQ2VsbCh4MSwgeTEsIHgyLCB5MiwgdGhpcy5fcXVlcnlDZWxsLCByZXN1bHQsIHF1ZXJ5QXJncywgcHJlZGljYXRlKTtcbiAgICAgICAgICAgIHJldHVybiBoaXRUZXN0ID8gcmVzdWx0Lmxlbmd0aCA+IDAgOiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfcXVlcnlDaXJjbGUoeDogbnVtYmVyLCB5OiBudW1iZXIsIHJhZGl1czogbnVtYmVyLCBoaXRUZXN0OiBib29sZWFuLCBwcmVkaWNhdGU/OiBhbnkpIHtcbiAgICAgICAgLy8gSW5zZXJ0IGNpcmNsZSBpbnRvIGdyaWQgZm9yIGFsbCBjZWxscyBpbiB0aGUgY2lyY3Vtc2NyaWJpbmcgc3F1YXJlXG4gICAgICAgIC8vIEl0J3MgbW9yZSB0aGFuIG5lY2Vzc2FyeSAoYnkgYSBmYWN0b3Igb2YgNC9QSSksIGJ1dCBmYXN0IHRvIGluc2VydFxuICAgICAgICBjb25zdCB4MSA9IHggLSByYWRpdXM7XG4gICAgICAgIGNvbnN0IHgyID0geCArIHJhZGl1cztcbiAgICAgICAgY29uc3QgeTEgPSB5IC0gcmFkaXVzO1xuICAgICAgICBjb25zdCB5MiA9IHkgKyByYWRpdXM7XG4gICAgICAgIGlmICh4MiA8IDAgfHwgeDEgPiB0aGlzLndpZHRoIHx8IHkyIDwgMCB8fCB5MSA+IHRoaXMuaGVpZ2h0KSB7XG4gICAgICAgICAgICByZXR1cm4gaGl0VGVzdCA/IGZhbHNlIDogW107XG4gICAgICAgIH1cblxuICAgICAgICAvLyBCb3ggcXVlcnkgZWFybHkgZXhpdHMgaWYgdGhlIGJvdW5kaW5nIGJveCBpcyBsYXJnZXIgdGhhbiB0aGUgZ3JpZCwgYnV0IHdlIGRvbid0IGRvXG4gICAgICAgIC8vIHRoZSBlcXVpdmFsZW50IGNhbGN1bGF0aW9uIGZvciBjaXJjbGUgcXVlcmllcyBiZWNhdXNlIGVhcmx5IGV4aXQgaXMgbGVzcyBsaWtlbHlcbiAgICAgICAgLy8gYW5kIHRoZSBjYWxjdWxhdGlvbiBpcyBtb3JlIGV4cGVuc2l2ZVxuICAgICAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICAgICAgY29uc3QgcXVlcnlBcmdzID0ge1xuICAgICAgICAgICAgaGl0VGVzdCxcbiAgICAgICAgICAgIGNpcmNsZTogeyB4LCB5LCByYWRpdXMgfSxcbiAgICAgICAgICAgIHNlZW5VaWRzOiB7IGJveDoge30sIGNpcmNsZToge30gfVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLl9mb3JFYWNoQ2VsbCh4MSwgeTEsIHgyLCB5MiwgdGhpcy5fcXVlcnlDZWxsQ2lyY2xlLCByZXN1bHQsIHF1ZXJ5QXJncywgcHJlZGljYXRlKTtcbiAgICAgICAgcmV0dXJuIGhpdFRlc3QgPyByZXN1bHQubGVuZ3RoID4gMCA6IHJlc3VsdDtcbiAgICB9XG5cbiAgICBxdWVyeSh4MTogbnVtYmVyLCB5MTogbnVtYmVyLCB4MjogbnVtYmVyLCB5MjogbnVtYmVyLCBwcmVkaWNhdGU/OiBhbnkpOiBBcnJheTxhbnk+IHtcbiAgICAgICAgcmV0dXJuICh0aGlzLl9xdWVyeSh4MSwgeTEsIHgyLCB5MiwgZmFsc2UsIHByZWRpY2F0ZSk6IGFueSk7XG4gICAgfVxuXG4gICAgaGl0VGVzdCh4MTogbnVtYmVyLCB5MTogbnVtYmVyLCB4MjogbnVtYmVyLCB5MjogbnVtYmVyLCBwcmVkaWNhdGU/OiBhbnkpOiBib29sZWFuICB7XG4gICAgICAgIHJldHVybiAodGhpcy5fcXVlcnkoeDEsIHkxLCB4MiwgeTIsIHRydWUsIHByZWRpY2F0ZSk6IGFueSk7XG4gICAgfVxuXG4gICAgaGl0VGVzdENpcmNsZSh4OiBudW1iZXIsIHk6IG51bWJlciwgcmFkaXVzOiBudW1iZXIsIHByZWRpY2F0ZT86IGFueSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gKHRoaXMuX3F1ZXJ5Q2lyY2xlKHgsIHksIHJhZGl1cywgdHJ1ZSwgcHJlZGljYXRlKTogYW55KTtcbiAgICB9XG5cbiAgICBfcXVlcnlDZWxsKHgxOiBudW1iZXIsIHkxOiBudW1iZXIsIHgyOiBudW1iZXIsIHkyOiBudW1iZXIsIGNlbGxJbmRleDogbnVtYmVyLCByZXN1bHQ6IGFueSwgcXVlcnlBcmdzOiBhbnksIHByZWRpY2F0ZT86IGFueSkge1xuICAgICAgICBjb25zdCBzZWVuVWlkcyA9IHF1ZXJ5QXJncy5zZWVuVWlkcztcbiAgICAgICAgY29uc3QgYm94Q2VsbCA9IHRoaXMuYm94Q2VsbHNbY2VsbEluZGV4XTtcbiAgICAgICAgaWYgKGJveENlbGwgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IGJib3hlcyA9IHRoaXMuYmJveGVzO1xuICAgICAgICAgICAgZm9yIChjb25zdCBib3hVaWQgb2YgYm94Q2VsbCkge1xuICAgICAgICAgICAgICAgIGlmICghc2VlblVpZHMuYm94W2JveFVpZF0pIHtcbiAgICAgICAgICAgICAgICAgICAgc2VlblVpZHMuYm94W2JveFVpZF0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBvZmZzZXQgPSBib3hVaWQgKiA0O1xuICAgICAgICAgICAgICAgICAgICBpZiAoKHgxIDw9IGJib3hlc1tvZmZzZXQgKyAyXSkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICh5MSA8PSBiYm94ZXNbb2Zmc2V0ICsgM10pICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAoeDIgPj0gYmJveGVzW29mZnNldCArIDBdKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgKHkyID49IGJib3hlc1tvZmZzZXQgKyAxXSkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICghcHJlZGljYXRlIHx8IHByZWRpY2F0ZSh0aGlzLmJveEtleXNbYm94VWlkXSkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocXVlcnlBcmdzLmhpdFRlc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IHRoaXMuYm94S2V5c1tib3hVaWRdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4MTogYmJveGVzW29mZnNldF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkxOiBiYm94ZXNbb2Zmc2V0ICsgMV0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgyOiBiYm94ZXNbb2Zmc2V0ICsgMl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkyOiBiYm94ZXNbb2Zmc2V0ICsgM11cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjaXJjbGVDZWxsID0gdGhpcy5jaXJjbGVDZWxsc1tjZWxsSW5kZXhdO1xuICAgICAgICBpZiAoY2lyY2xlQ2VsbCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgY2lyY2xlcyA9IHRoaXMuY2lyY2xlcztcbiAgICAgICAgICAgIGZvciAoY29uc3QgY2lyY2xlVWlkIG9mIGNpcmNsZUNlbGwpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXNlZW5VaWRzLmNpcmNsZVtjaXJjbGVVaWRdKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlZW5VaWRzLmNpcmNsZVtjaXJjbGVVaWRdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gY2lyY2xlVWlkICogMztcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2NpcmNsZUFuZFJlY3RDb2xsaWRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgY2lyY2xlc1tvZmZzZXRdLFxuICAgICAgICAgICAgICAgICAgICAgICAgY2lyY2xlc1tvZmZzZXQgKyAxXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNpcmNsZXNbb2Zmc2V0ICsgMl0sXG4gICAgICAgICAgICAgICAgICAgICAgICB4MSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHkxLFxuICAgICAgICAgICAgICAgICAgICAgICAgeDIsXG4gICAgICAgICAgICAgICAgICAgICAgICB5MikgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICghcHJlZGljYXRlIHx8IHByZWRpY2F0ZSh0aGlzLmNpcmNsZUtleXNbY2lyY2xlVWlkXSkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocXVlcnlBcmdzLmhpdFRlc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeCA9IGNpcmNsZXNbb2Zmc2V0XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB5ID0gY2lyY2xlc1tvZmZzZXQgKyAxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByYWRpdXMgPSBjaXJjbGVzW29mZnNldCArIDJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiB0aGlzLmNpcmNsZUtleXNbY2lyY2xlVWlkXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeDE6IHggLSByYWRpdXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkxOiB5IC0gcmFkaXVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4MjogeCArIHJhZGl1cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeTI6IHkgKyByYWRpdXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9xdWVyeUNlbGxDaXJjbGUoeDE6IG51bWJlciwgeTE6IG51bWJlciwgeDI6IG51bWJlciwgeTI6IG51bWJlciwgY2VsbEluZGV4OiBudW1iZXIsIHJlc3VsdDogYW55LCBxdWVyeUFyZ3M6IGFueSwgcHJlZGljYXRlPzogYW55KSB7XG4gICAgICAgIGNvbnN0IGNpcmNsZSA9IHF1ZXJ5QXJncy5jaXJjbGU7XG4gICAgICAgIGNvbnN0IHNlZW5VaWRzID0gcXVlcnlBcmdzLnNlZW5VaWRzO1xuICAgICAgICBjb25zdCBib3hDZWxsID0gdGhpcy5ib3hDZWxsc1tjZWxsSW5kZXhdO1xuICAgICAgICBpZiAoYm94Q2VsbCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgYmJveGVzID0gdGhpcy5iYm94ZXM7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGJveFVpZCBvZiBib3hDZWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFzZWVuVWlkcy5ib3hbYm94VWlkXSkge1xuICAgICAgICAgICAgICAgICAgICBzZWVuVWlkcy5ib3hbYm94VWlkXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9IGJveFVpZCAqIDQ7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9jaXJjbGVBbmRSZWN0Q29sbGlkZShcbiAgICAgICAgICAgICAgICAgICAgICAgIGNpcmNsZS54LFxuICAgICAgICAgICAgICAgICAgICAgICAgY2lyY2xlLnksXG4gICAgICAgICAgICAgICAgICAgICAgICBjaXJjbGUucmFkaXVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgYmJveGVzW29mZnNldCArIDBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgYmJveGVzW29mZnNldCArIDFdLFxuICAgICAgICAgICAgICAgICAgICAgICAgYmJveGVzW29mZnNldCArIDJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgYmJveGVzW29mZnNldCArIDNdKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgKCFwcmVkaWNhdGUgfHwgcHJlZGljYXRlKHRoaXMuYm94S2V5c1tib3hVaWRdKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjaXJjbGVDZWxsID0gdGhpcy5jaXJjbGVDZWxsc1tjZWxsSW5kZXhdO1xuICAgICAgICBpZiAoY2lyY2xlQ2VsbCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgY2lyY2xlcyA9IHRoaXMuY2lyY2xlcztcbiAgICAgICAgICAgIGZvciAoY29uc3QgY2lyY2xlVWlkIG9mIGNpcmNsZUNlbGwpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXNlZW5VaWRzLmNpcmNsZVtjaXJjbGVVaWRdKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlZW5VaWRzLmNpcmNsZVtjaXJjbGVVaWRdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gY2lyY2xlVWlkICogMztcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2NpcmNsZXNDb2xsaWRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgY2lyY2xlc1tvZmZzZXRdLFxuICAgICAgICAgICAgICAgICAgICAgICAgY2lyY2xlc1tvZmZzZXQgKyAxXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNpcmNsZXNbb2Zmc2V0ICsgMl0sXG4gICAgICAgICAgICAgICAgICAgICAgICBjaXJjbGUueCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNpcmNsZS55LFxuICAgICAgICAgICAgICAgICAgICAgICAgY2lyY2xlLnJhZGl1cykgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICghcHJlZGljYXRlIHx8IHByZWRpY2F0ZSh0aGlzLmNpcmNsZUtleXNbY2lyY2xlVWlkXSkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgX2ZvckVhY2hDZWxsKHgxOiBudW1iZXIsIHkxOiBudW1iZXIsIHgyOiBudW1iZXIsIHkyOiBudW1iZXIsIGZuOiBhbnksIGFyZzE6IGFueSwgYXJnMj86IGFueSwgcHJlZGljYXRlPzogYW55KSB7XG4gICAgICAgIGNvbnN0IGN4MSA9IHRoaXMuX2NvbnZlcnRUb1hDZWxsQ29vcmQoeDEpO1xuICAgICAgICBjb25zdCBjeTEgPSB0aGlzLl9jb252ZXJ0VG9ZQ2VsbENvb3JkKHkxKTtcbiAgICAgICAgY29uc3QgY3gyID0gdGhpcy5fY29udmVydFRvWENlbGxDb29yZCh4Mik7XG4gICAgICAgIGNvbnN0IGN5MiA9IHRoaXMuX2NvbnZlcnRUb1lDZWxsQ29vcmQoeTIpO1xuXG4gICAgICAgIGZvciAobGV0IHggPSBjeDE7IHggPD0gY3gyOyB4KyspIHtcbiAgICAgICAgICAgIGZvciAobGV0IHkgPSBjeTE7IHkgPD0gY3kyOyB5KyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjZWxsSW5kZXggPSB0aGlzLnhDZWxsQ291bnQgKiB5ICsgeDtcbiAgICAgICAgICAgICAgICBpZiAoZm4uY2FsbCh0aGlzLCB4MSwgeTEsIHgyLCB5MiwgY2VsbEluZGV4LCBhcmcxLCBhcmcyLCBwcmVkaWNhdGUpKSByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfY29udmVydFRvWENlbGxDb29yZCh4OiBudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIE1hdGgubWF4KDAsIE1hdGgubWluKHRoaXMueENlbGxDb3VudCAtIDEsIE1hdGguZmxvb3IoeCAqIHRoaXMueFNjYWxlKSkpO1xuICAgIH1cblxuICAgIF9jb252ZXJ0VG9ZQ2VsbENvb3JkKHk6IG51bWJlcikge1xuICAgICAgICByZXR1cm4gTWF0aC5tYXgoMCwgTWF0aC5taW4odGhpcy55Q2VsbENvdW50IC0gMSwgTWF0aC5mbG9vcih5ICogdGhpcy55U2NhbGUpKSk7XG4gICAgfVxuXG4gICAgX2NpcmNsZXNDb2xsaWRlKHgxOiBudW1iZXIsIHkxOiBudW1iZXIsIHIxOiBudW1iZXIsIHgyOiBudW1iZXIsIHkyOiBudW1iZXIsIHIyOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgZHggPSB4MiAtIHgxO1xuICAgICAgICBjb25zdCBkeSA9IHkyIC0geTE7XG4gICAgICAgIGNvbnN0IGJvdGhSYWRpaSA9IHIxICsgcjI7XG4gICAgICAgIHJldHVybiAoYm90aFJhZGlpICogYm90aFJhZGlpKSA+IChkeCAqIGR4ICsgZHkgKiBkeSk7XG4gICAgfVxuXG4gICAgX2NpcmNsZUFuZFJlY3RDb2xsaWRlKGNpcmNsZVg6IG51bWJlciwgY2lyY2xlWTogbnVtYmVyLCByYWRpdXM6IG51bWJlciwgeDE6IG51bWJlciwgeTE6IG51bWJlciwgeDI6IG51bWJlciwgeTI6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBoYWxmUmVjdFdpZHRoID0gKHgyIC0geDEpIC8gMjtcbiAgICAgICAgY29uc3QgZGlzdFggPSBNYXRoLmFicyhjaXJjbGVYIC0gKHgxICsgaGFsZlJlY3RXaWR0aCkpO1xuICAgICAgICBpZiAoZGlzdFggPiAoaGFsZlJlY3RXaWR0aCArIHJhZGl1cykpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGhhbGZSZWN0SGVpZ2h0ID0gKHkyIC0geTEpIC8gMjtcbiAgICAgICAgY29uc3QgZGlzdFkgPSBNYXRoLmFicyhjaXJjbGVZIC0gKHkxICsgaGFsZlJlY3RIZWlnaHQpKTtcbiAgICAgICAgaWYgKGRpc3RZID4gKGhhbGZSZWN0SGVpZ2h0ICsgcmFkaXVzKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRpc3RYIDw9IGhhbGZSZWN0V2lkdGggfHwgZGlzdFkgPD0gaGFsZlJlY3RIZWlnaHQpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZHggPSBkaXN0WCAtIGhhbGZSZWN0V2lkdGg7XG4gICAgICAgIGNvbnN0IGR5ID0gZGlzdFkgLSBoYWxmUmVjdEhlaWdodDtcbiAgICAgICAgcmV0dXJuIChkeCAqIGR4ICsgZHkgKiBkeSA8PSAocmFkaXVzICogcmFkaXVzKSk7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBHcmlkSW5kZXg7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgUG9pbnQgZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XG5cbmltcG9ydCB7IG1hdDQsIHZlYzQgfSBmcm9tICdnbC1tYXRyaXgnO1xuaW1wb3J0ICogYXMgc3ltYm9sU2l6ZSBmcm9tICcuL3N5bWJvbF9zaXplJztcbmltcG9ydCB7IGFkZER5bmFtaWNBdHRyaWJ1dGVzIH0gZnJvbSAnLi4vZGF0YS9idWNrZXQvc3ltYm9sX2J1Y2tldCc7XG5pbXBvcnQgcHJvcGVydGllcyBmcm9tICcuLi9zdHlsZS9zdHlsZV9sYXllci9zeW1ib2xfc3R5bGVfbGF5ZXJfcHJvcGVydGllcyc7XG5jb25zdCBzeW1ib2xMYXlvdXRQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5sYXlvdXQ7XG5cbmltcG9ydCB0eXBlIFBhaW50ZXIgZnJvbSAnLi4vcmVuZGVyL3BhaW50ZXInO1xuaW1wb3J0IHR5cGUgVHJhbnNmb3JtIGZyb20gJy4uL2dlby90cmFuc2Zvcm0nO1xuaW1wb3J0IHR5cGUgU3ltYm9sQnVja2V0IGZyb20gJy4uL2RhdGEvYnVja2V0L3N5bWJvbF9idWNrZXQnO1xuaW1wb3J0IHR5cGUge1xuICAgIEdseXBoT2Zmc2V0QXJyYXksXG4gICAgU3ltYm9sTGluZVZlcnRleEFycmF5LFxuICAgIFN5bWJvbER5bmFtaWNMYXlvdXRBcnJheVxufSBmcm9tICcuLi9kYXRhL2FycmF5X3R5cGVzJztcbmltcG9ydCB7IFdyaXRpbmdNb2RlIH0gZnJvbSAnLi4vc3ltYm9sL3NoYXBpbmcnO1xuXG5leHBvcnQgeyB1cGRhdGVMaW5lTGFiZWxzLCBoaWRlR2x5cGhzLCBnZXRMYWJlbFBsYW5lTWF0cml4LCBnZXRHbENvb3JkTWF0cml4LCBwcm9qZWN0LCBwbGFjZUZpcnN0QW5kTGFzdEdseXBoLCB4eVRyYW5zZm9ybU1hdDQgfTtcblxuLypcbiAqICMgT3ZlcnZpZXcgb2YgY29vcmRpbmF0ZSBzcGFjZXNcbiAqXG4gKiAjIyBUaWxlIGNvb3JkaW5hdGUgc3BhY2VzXG4gKiBFYWNoIGxhYmVsIGhhcyBhbiBhbmNob3IuIFNvbWUgbGFiZWxzIGhhdmUgY29ycmVzcG9uZGluZyBsaW5lIGdlb21ldHJpZXMuXG4gKiBUaGUgcG9pbnRzIGZvciBib3RoIGFuY2hvcnMgYW5kIGxpbmVzIGFyZSBzdG9yZWQgaW4gdGlsZSB1bml0cy4gRWFjaCB0aWxlIGhhcyBpdCdzIG93blxuICogY29vcmRpbmF0ZSBzcGFjZSBnb2luZyBmcm9tICgwLCAwKSBhdCB0aGUgdG9wIGxlZnQgdG8gKEVYVEVOVCwgRVhURU5UKSBhdCB0aGUgYm90dG9tIHJpZ2h0LlxuICpcbiAqICMjIEdMIGNvb3JkaW5hdGUgc3BhY2VcbiAqIEF0IHRoZSBlbmQgb2YgZXZlcnl0aGluZywgdGhlIHZlcnRleCBzaGFkZXIgbmVlZHMgdG8gcHJvZHVjZSBhIHBvc2l0aW9uIGluIEdMIGNvb3JkaW5hdGUgc3BhY2UsXG4gKiB3aGljaCBpcyAoLTEsIDEpIGF0IHRoZSB0b3AgbGVmdCBhbmQgKDEsIC0xKSBpbiB0aGUgYm90dG9tIHJpZ2h0LlxuICpcbiAqICMjIE1hcCBwaXhlbCBjb29yZGluYXRlIHNwYWNlc1xuICogRWFjaCB0aWxlIGhhcyBhIHBpeGVsIGNvb3JkaW5hdGUgc3BhY2UuIEl0J3MganVzdCB0aGUgdGlsZSB1bml0cyBzY2FsZWQgc28gdGhhdCBvbmUgdW5pdCBpc1xuICogd2hhdGV2ZXIgY291bnRzIGFzIDEgcGl4ZWwgYXQgdGhlIGN1cnJlbnQgem9vbS5cbiAqIFRoaXMgc3BhY2UgaXMgdXNlZCBmb3IgcGl0Y2gtYWxpZ25tZW50PW1hcCwgcm90YXRpb24tYWxpZ25tZW50PW1hcFxuICpcbiAqICMjIFJvdGF0ZWQgbWFwIHBpeGVsIGNvb3JkaW5hdGUgc3BhY2VzXG4gKiBMaWtlIHRoZSBhYm92ZSwgYnV0IHJvdGF0ZWQgc28gYXhpcyBvZiB0aGUgc3BhY2UgYXJlIGFsaWduZWQgd2l0aCB0aGUgdmlld3BvcnQgaW5zdGVhZCBvZiB0aGUgdGlsZS5cbiAqIFRoaXMgc3BhY2UgaXMgdXNlZCBmb3IgcGl0Y2gtYWxpZ25tZW50PW1hcCwgcm90YXRpb24tYWxpZ25tZW50PXZpZXdwb3J0XG4gKlxuICogIyMgVmlld3BvcnQgcGl4ZWwgY29vcmRpbmF0ZSBzcGFjZVxuICogKDAsIDApIGlzIGF0IHRoZSB0b3AgbGVmdCBvZiB0aGUgY2FudmFzIGFuZCAocGl4ZWxXaWR0aCwgcGl4ZWxIZWlnaHQpIGlzIGF0IHRoZSBib3R0b20gcmlnaHQgY29ybmVyXG4gKiBvZiB0aGUgY2FudmFzLiBUaGlzIHNwYWNlIGlzIHVzZWQgZm9yIHBpdGNoLWFsaWdubWVudD12aWV3cG9ydFxuICpcbiAqXG4gKiAjIFZlcnRleCBwcm9qZWN0aW9uXG4gKiBJdCBnb2VzIHJvdWdobHkgbGlrZSB0aGlzOlxuICogMS4gcHJvamVjdCB0aGUgYW5jaG9yIGFuZCBsaW5lIGZyb20gdGlsZSB1bml0cyBpbnRvIHRoZSBjb3JyZWN0IGxhYmVsIGNvb3JkaW5hdGUgc3BhY2VcbiAqICAgICAgLSBtYXAgcGl4ZWwgc3BhY2UgICAgICAgICAgIHBpdGNoLWFsaWdubWVudD1tYXAgICAgICAgICByb3RhdGlvbi1hbGlnbm1lbnQ9bWFwXG4gKiAgICAgIC0gcm90YXRlZCBtYXAgcGl4ZWwgc3BhY2UgICBwaXRjaC1hbGlnbm1lbnQ9bWFwICAgICAgICAgcm90YXRpb24tYWxpZ25tZW50PXZpZXdwb3J0XG4gKiAgICAgIC0gdmlld3BvcnQgcGl4ZWwgc3BhY2UgICAgICBwaXRjaC1hbGlnbm1lbnQ9dmlld3BvcnQgICAgcm90YXRpb24tYWxpZ25tZW50PSpcbiAqIDIuIGlmIHRoZSBsYWJlbCBmb2xsb3dzIGEgbGluZSwgZmluZCB0aGUgcG9pbnQgYWxvbmcgdGhlIGxpbmUgdGhhdCBpcyB0aGUgY29ycmVjdCBkaXN0YW5jZSBmcm9tIHRoZSBhbmNob3IuXG4gKiAzLiBhZGQgdGhlIGdseXBoJ3MgY29ybmVyIG9mZnNldCB0byB0aGUgcG9pbnQgZnJvbSBzdGVwIDNcbiAqIDQuIGNvbnZlcnQgZnJvbSB0aGUgbGFiZWwgY29vcmRpbmF0ZSBzcGFjZSB0byBnbCBjb29yZGluYXRlc1xuICpcbiAqIEZvciBob3Jpem9udGFsIGxhYmVscyB3ZSB3YW50IHRvIGRvIHN0ZXAgMSBpbiB0aGUgc2hhZGVyIGZvciBwZXJmb3JtYW5jZSByZWFzb25zIChubyBjcHUgd29yaykuXG4gKiAgICAgIFRoaXMgaXMgd2hhdCBgdV9sYWJlbF9wbGFuZV9tYXRyaXhgIGlzIHVzZWQgZm9yLlxuICogRm9yIGxhYmVscyBhbGlnbmVkIHdpdGggbGluZXMgd2UgaGF2ZSB0byBzdGVwcyAxIGFuZCAyIG9uIHRoZSBjcHUgc2luY2Ugd2UgbmVlZCBhY2Nlc3MgdG8gdGhlIGxpbmUgZ2VvbWV0cnkuXG4gKiAgICAgIFRoaXMgaXMgd2hhdCBgdXBkYXRlTGluZUxhYmVscyguLi4pYCBkb2VzLlxuICogICAgICBTaW5jZSB0aGUgY29udmVyc2lvbiBpcyBoYW5kbGVkIG9uIHRoZSBjcHUgd2UganVzdCBzZXQgYHVfbGFiZWxfcGxhbmVfbWF0cml4YCB0byBhbiBpZGVudGl0eSBtYXRyaXguXG4gKlxuICogU3RlcHMgMyBhbmQgNCBhcmUgZG9uZSBpbiB0aGUgc2hhZGVycyBmb3IgYWxsIGxhYmVscy5cbiAqL1xuXG4vKlxuICogUmV0dXJucyBhIG1hdHJpeCBmb3IgY29udmVydGluZyBmcm9tIHRpbGUgdW5pdHMgdG8gdGhlIGNvcnJlY3QgbGFiZWwgY29vcmRpbmF0ZSBzcGFjZS5cbiAqL1xuZnVuY3Rpb24gZ2V0TGFiZWxQbGFuZU1hdHJpeChwb3NNYXRyaXg6IG1hdDQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpdGNoV2l0aE1hcDogYm9vbGVhbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRlV2l0aE1hcDogYm9vbGVhbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtOiBUcmFuc2Zvcm0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsc1RvVGlsZVVuaXRzOiBudW1iZXIpIHtcbiAgICBjb25zdCBtID0gbWF0NC5jcmVhdGUoKTtcbiAgICBpZiAocGl0Y2hXaXRoTWFwKSB7XG4gICAgICAgIG1hdDQuc2NhbGUobSwgbSwgWzEgLyBwaXhlbHNUb1RpbGVVbml0cywgMSAvIHBpeGVsc1RvVGlsZVVuaXRzLCAxXSk7XG4gICAgICAgIGlmICghcm90YXRlV2l0aE1hcCkge1xuICAgICAgICAgICAgbWF0NC5yb3RhdGVaKG0sIG0sIHRyYW5zZm9ybS5hbmdsZSk7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBtYXQ0Lm11bHRpcGx5KG0sIHRyYW5zZm9ybS5sYWJlbFBsYW5lTWF0cml4LCBwb3NNYXRyaXgpO1xuICAgIH1cbiAgICByZXR1cm4gbTtcbn1cblxuLypcbiAqIFJldHVybnMgYSBtYXRyaXggZm9yIGNvbnZlcnRpbmcgZnJvbSB0aGUgY29ycmVjdCBsYWJlbCBjb29yZGluYXRlIHNwYWNlIHRvIGdsIGNvb3Jkcy5cbiAqL1xuZnVuY3Rpb24gZ2V0R2xDb29yZE1hdHJpeChwb3NNYXRyaXg6IG1hdDQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHBpdGNoV2l0aE1hcDogYm9vbGVhbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRlV2l0aE1hcDogYm9vbGVhbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtOiBUcmFuc2Zvcm0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsc1RvVGlsZVVuaXRzOiBudW1iZXIpIHtcbiAgICBpZiAocGl0Y2hXaXRoTWFwKSB7XG4gICAgICAgIGNvbnN0IG0gPSBtYXQ0LmNsb25lKHBvc01hdHJpeCk7XG4gICAgICAgIG1hdDQuc2NhbGUobSwgbSwgW3BpeGVsc1RvVGlsZVVuaXRzLCBwaXhlbHNUb1RpbGVVbml0cywgMV0pO1xuICAgICAgICBpZiAoIXJvdGF0ZVdpdGhNYXApIHtcbiAgICAgICAgICAgIG1hdDQucm90YXRlWihtLCBtLCAtdHJhbnNmb3JtLmFuZ2xlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdHJhbnNmb3JtLmdsQ29vcmRNYXRyaXg7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBwcm9qZWN0KHBvaW50OiBQb2ludCwgbWF0cml4OiBtYXQ0KSB7XG4gICAgY29uc3QgcG9zID0gW3BvaW50LngsIHBvaW50LnksIDAsIDFdO1xuICAgIHh5VHJhbnNmb3JtTWF0NChwb3MsIHBvcywgbWF0cml4KTtcbiAgICBjb25zdCB3ID0gcG9zWzNdO1xuICAgIHJldHVybiB7XG4gICAgICAgIHBvaW50OiBuZXcgUG9pbnQocG9zWzBdIC8gdywgcG9zWzFdIC8gdyksXG4gICAgICAgIHNpZ25lZERpc3RhbmNlRnJvbUNhbWVyYTogd1xuICAgIH07XG59XG5cbmZ1bmN0aW9uIGlzVmlzaWJsZShhbmNob3JQb3M6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLFxuICAgICAgICAgICAgICAgICAgIGNsaXBwaW5nQnVmZmVyOiBbbnVtYmVyLCBudW1iZXJdKSB7XG4gICAgY29uc3QgeCA9IGFuY2hvclBvc1swXSAvIGFuY2hvclBvc1szXTtcbiAgICBjb25zdCB5ID0gYW5jaG9yUG9zWzFdIC8gYW5jaG9yUG9zWzNdO1xuICAgIGNvbnN0IGluUGFkZGVkVmlld3BvcnQgPSAoXG4gICAgICAgIHggPj0gLWNsaXBwaW5nQnVmZmVyWzBdICYmXG4gICAgICAgIHggPD0gY2xpcHBpbmdCdWZmZXJbMF0gJiZcbiAgICAgICAgeSA+PSAtY2xpcHBpbmdCdWZmZXJbMV0gJiZcbiAgICAgICAgeSA8PSBjbGlwcGluZ0J1ZmZlclsxXSk7XG4gICAgcmV0dXJuIGluUGFkZGVkVmlld3BvcnQ7XG59XG5cbi8qXG4gKiAgVXBkYXRlIHRoZSBgZHluYW1pY0xheW91dFZlcnRleEJ1ZmZlcmAgZm9yIHRoZSBidWZmZXIgd2l0aCB0aGUgY29ycmVjdCBnbHlwaCBwb3NpdGlvbnMgZm9yIHRoZSBjdXJyZW50IG1hcCB2aWV3LlxuICogIFRoaXMgaXMgb25seSBydW4gb24gbGFiZWxzIHRoYXQgYXJlIGFsaWduZWQgd2l0aCBsaW5lcy4gSG9yaXpvbnRhbCBsYWJlbHMgYXJlIGhhbmRsZWQgZW50aXJlbHkgaW4gdGhlIHNoYWRlci5cbiAqL1xuZnVuY3Rpb24gdXBkYXRlTGluZUxhYmVscyhidWNrZXQ6IFN5bWJvbEJ1Y2tldCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zTWF0cml4OiBtYXQ0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwYWludGVyOiBQYWludGVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBpc1RleHQ6IGJvb2xlYW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsUGxhbmVNYXRyaXg6IG1hdDQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGdsQ29vcmRNYXRyaXg6IG1hdDQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHBpdGNoV2l0aE1hcDogYm9vbGVhbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAga2VlcFVwcmlnaHQ6IGJvb2xlYW4pIHtcblxuICAgIGNvbnN0IHNpemVEYXRhID0gaXNUZXh0ID8gYnVja2V0LnRleHRTaXplRGF0YSA6IGJ1Y2tldC5pY29uU2l6ZURhdGE7XG4gICAgY29uc3QgcGFydGlhbGx5RXZhbHVhdGVkU2l6ZSA9IHN5bWJvbFNpemUuZXZhbHVhdGVTaXplRm9yWm9vbShzaXplRGF0YSwgcGFpbnRlci50cmFuc2Zvcm0uem9vbSxcbiAgICAgICAgc3ltYm9sTGF5b3V0UHJvcGVydGllcy5wcm9wZXJ0aWVzW2lzVGV4dCA/ICd0ZXh0LXNpemUnIDogJ2ljb24tc2l6ZSddKTtcblxuICAgIGNvbnN0IGNsaXBwaW5nQnVmZmVyID0gWzI1NiAvIHBhaW50ZXIud2lkdGggKiAyICsgMSwgMjU2IC8gcGFpbnRlci5oZWlnaHQgKiAyICsgMV07XG5cbiAgICBjb25zdCBkeW5hbWljTGF5b3V0VmVydGV4QXJyYXkgPSBpc1RleHQgP1xuICAgICAgICBidWNrZXQudGV4dC5keW5hbWljTGF5b3V0VmVydGV4QXJyYXkgOlxuICAgICAgICBidWNrZXQuaWNvbi5keW5hbWljTGF5b3V0VmVydGV4QXJyYXk7XG4gICAgZHluYW1pY0xheW91dFZlcnRleEFycmF5LmNsZWFyKCk7XG5cbiAgICBjb25zdCBsaW5lVmVydGV4QXJyYXkgPSBidWNrZXQubGluZVZlcnRleEFycmF5O1xuICAgIGNvbnN0IHBsYWNlZFN5bWJvbHMgPSBpc1RleHQgPyBidWNrZXQudGV4dC5wbGFjZWRTeW1ib2xBcnJheSA6IGJ1Y2tldC5pY29uLnBsYWNlZFN5bWJvbEFycmF5O1xuXG4gICAgY29uc3QgYXNwZWN0UmF0aW8gPSBwYWludGVyLnRyYW5zZm9ybS53aWR0aCAvIHBhaW50ZXIudHJhbnNmb3JtLmhlaWdodDtcblxuICAgIGxldCB1c2VWZXJ0aWNhbCA9IGZhbHNlO1xuXG4gICAgZm9yIChsZXQgcyA9IDA7IHMgPCBwbGFjZWRTeW1ib2xzLmxlbmd0aDsgcysrKSB7XG4gICAgICAgIGNvbnN0IHN5bWJvbDogYW55ID0gcGxhY2VkU3ltYm9scy5nZXQocyk7XG4gICAgICAgIC8vIERvbid0IGRvIGNhbGN1bGF0aW9ucyBmb3IgdmVydGljYWwgZ2x5cGhzIHVubGVzcyB0aGUgcHJldmlvdXMgc3ltYm9sIHdhcyBob3Jpem9udGFsXG4gICAgICAgIC8vIGFuZCB3ZSBkZXRlcm1pbmVkIHRoYXQgdmVydGljYWwgZ2x5cGhzIHdlcmUgbmVjZXNzYXJ5LlxuICAgICAgICAvLyBBbHNvIGRvbid0IGRvIGNhbGN1bGF0aW9ucyBmb3Igc3ltYm9scyB0aGF0IGFyZSBjb2xsaWRlZCBhbmQgZnVsbHkgZmFkZWQgb3V0XG4gICAgICAgIGlmIChzeW1ib2wuaGlkZGVuIHx8IHN5bWJvbC53cml0aW5nTW9kZSA9PT0gV3JpdGluZ01vZGUudmVydGljYWwgJiYgIXVzZVZlcnRpY2FsKSB7XG4gICAgICAgICAgICBoaWRlR2x5cGhzKHN5bWJvbC5udW1HbHlwaHMsIGR5bmFtaWNMYXlvdXRWZXJ0ZXhBcnJheSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBBd2t3YXJkLi4uIGJ1dCB3ZSdyZSBjb3VudGluZyBvbiB0aGUgcGFpcmVkIFwidmVydGljYWxcIiBzeW1ib2wgY29taW5nIGltbWVkaWF0ZWx5IGFmdGVyIGl0cyBob3Jpem9udGFsIGNvdW50ZXJwYXJ0XG4gICAgICAgIHVzZVZlcnRpY2FsID0gZmFsc2U7XG5cbiAgICAgICAgY29uc3QgYW5jaG9yUG9zID0gW3N5bWJvbC5hbmNob3JYLCBzeW1ib2wuYW5jaG9yWSwgMCwgMV07XG4gICAgICAgIHZlYzQudHJhbnNmb3JtTWF0NChhbmNob3JQb3MsIGFuY2hvclBvcywgcG9zTWF0cml4KTtcblxuICAgICAgICAvLyBEb24ndCBib3RoZXIgY2FsY3VsYXRpbmcgdGhlIGNvcnJlY3QgcG9pbnQgZm9yIGludmlzaWJsZSBsYWJlbHMuXG4gICAgICAgIGlmICghaXNWaXNpYmxlKGFuY2hvclBvcywgY2xpcHBpbmdCdWZmZXIpKSB7XG4gICAgICAgICAgICBoaWRlR2x5cGhzKHN5bWJvbC5udW1HbHlwaHMsIGR5bmFtaWNMYXlvdXRWZXJ0ZXhBcnJheSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNhbWVyYVRvQW5jaG9yRGlzdGFuY2UgPSBhbmNob3JQb3NbM107XG4gICAgICAgIGNvbnN0IHBlcnNwZWN0aXZlUmF0aW8gPSAwLjUgKyAwLjUgKiAoY2FtZXJhVG9BbmNob3JEaXN0YW5jZSAvIHBhaW50ZXIudHJhbnNmb3JtLmNhbWVyYVRvQ2VudGVyRGlzdGFuY2UpO1xuXG4gICAgICAgIGNvbnN0IGZvbnRTaXplID0gc3ltYm9sU2l6ZS5ldmFsdWF0ZVNpemVGb3JGZWF0dXJlKHNpemVEYXRhLCBwYXJ0aWFsbHlFdmFsdWF0ZWRTaXplLCBzeW1ib2wpO1xuICAgICAgICBjb25zdCBwaXRjaFNjYWxlZEZvbnRTaXplID0gcGl0Y2hXaXRoTWFwID9cbiAgICAgICAgICAgIGZvbnRTaXplICogcGVyc3BlY3RpdmVSYXRpbyA6XG4gICAgICAgICAgICBmb250U2l6ZSAvIHBlcnNwZWN0aXZlUmF0aW87XG5cbiAgICAgICAgY29uc3QgdGlsZUFuY2hvclBvaW50ID0gbmV3IFBvaW50KHN5bWJvbC5hbmNob3JYLCBzeW1ib2wuYW5jaG9yWSk7XG4gICAgICAgIGNvbnN0IGFuY2hvclBvaW50ID0gcHJvamVjdCh0aWxlQW5jaG9yUG9pbnQsIGxhYmVsUGxhbmVNYXRyaXgpLnBvaW50O1xuICAgICAgICBjb25zdCBwcm9qZWN0aW9uQ2FjaGUgPSB7fTtcblxuICAgICAgICBjb25zdCBwbGFjZVVuZmxpcHBlZDogYW55ID0gcGxhY2VHbHlwaHNBbG9uZ0xpbmUoc3ltYm9sLCBwaXRjaFNjYWxlZEZvbnRTaXplLCBmYWxzZSAvKnVuZmxpcHBlZCovLCBrZWVwVXByaWdodCwgcG9zTWF0cml4LCBsYWJlbFBsYW5lTWF0cml4LCBnbENvb3JkTWF0cml4LFxuICAgICAgICAgICAgYnVja2V0LmdseXBoT2Zmc2V0QXJyYXksIGxpbmVWZXJ0ZXhBcnJheSwgZHluYW1pY0xheW91dFZlcnRleEFycmF5LCBhbmNob3JQb2ludCwgdGlsZUFuY2hvclBvaW50LCBwcm9qZWN0aW9uQ2FjaGUsIGFzcGVjdFJhdGlvKTtcblxuICAgICAgICB1c2VWZXJ0aWNhbCA9IHBsYWNlVW5mbGlwcGVkLnVzZVZlcnRpY2FsO1xuXG4gICAgICAgIGlmIChwbGFjZVVuZmxpcHBlZC5ub3RFbm91Z2hSb29tIHx8IHVzZVZlcnRpY2FsIHx8XG4gICAgICAgICAgICAocGxhY2VVbmZsaXBwZWQubmVlZHNGbGlwcGluZyAmJlxuICAgICAgICAgICAgIHBsYWNlR2x5cGhzQWxvbmdMaW5lKHN5bWJvbCwgcGl0Y2hTY2FsZWRGb250U2l6ZSwgdHJ1ZSAvKmZsaXBwZWQqLywga2VlcFVwcmlnaHQsIHBvc01hdHJpeCwgbGFiZWxQbGFuZU1hdHJpeCwgZ2xDb29yZE1hdHJpeCxcbiAgICAgICAgICAgICAgICAgYnVja2V0LmdseXBoT2Zmc2V0QXJyYXksIGxpbmVWZXJ0ZXhBcnJheSwgZHluYW1pY0xheW91dFZlcnRleEFycmF5LCBhbmNob3JQb2ludCwgdGlsZUFuY2hvclBvaW50LCBwcm9qZWN0aW9uQ2FjaGUsIGFzcGVjdFJhdGlvKS5ub3RFbm91Z2hSb29tKSkge1xuICAgICAgICAgICAgaGlkZUdseXBocyhzeW1ib2wubnVtR2x5cGhzLCBkeW5hbWljTGF5b3V0VmVydGV4QXJyYXkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGlzVGV4dCkge1xuICAgICAgICBidWNrZXQudGV4dC5keW5hbWljTGF5b3V0VmVydGV4QnVmZmVyLnVwZGF0ZURhdGEoZHluYW1pY0xheW91dFZlcnRleEFycmF5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBidWNrZXQuaWNvbi5keW5hbWljTGF5b3V0VmVydGV4QnVmZmVyLnVwZGF0ZURhdGEoZHluYW1pY0xheW91dFZlcnRleEFycmF5KTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHBsYWNlRmlyc3RBbmRMYXN0R2x5cGgoZm9udFNjYWxlOiBudW1iZXIsIGdseXBoT2Zmc2V0QXJyYXk6IEdseXBoT2Zmc2V0QXJyYXksIGxpbmVPZmZzZXRYOiBudW1iZXIsIGxpbmVPZmZzZXRZOiBudW1iZXIsIGZsaXA6IGJvb2xlYW4sIGFuY2hvclBvaW50OiBQb2ludCwgdGlsZUFuY2hvclBvaW50OiBQb2ludCwgc3ltYm9sOiBhbnksIGxpbmVWZXJ0ZXhBcnJheTogU3ltYm9sTGluZVZlcnRleEFycmF5LCBsYWJlbFBsYW5lTWF0cml4OiBtYXQ0LCBwcm9qZWN0aW9uQ2FjaGU6IGFueSwgcmV0dXJuVGlsZURpc3RhbmNlOiBib29sZWFuKSB7XG4gICAgY29uc3QgZ2x5cGhFbmRJbmRleCA9IHN5bWJvbC5nbHlwaFN0YXJ0SW5kZXggKyBzeW1ib2wubnVtR2x5cGhzO1xuICAgIGNvbnN0IGxpbmVTdGFydEluZGV4ID0gc3ltYm9sLmxpbmVTdGFydEluZGV4O1xuICAgIGNvbnN0IGxpbmVFbmRJbmRleCA9IHN5bWJvbC5saW5lU3RhcnRJbmRleCArIHN5bWJvbC5saW5lTGVuZ3RoO1xuXG4gICAgY29uc3QgZmlyc3RHbHlwaE9mZnNldCA9IGdseXBoT2Zmc2V0QXJyYXkuZ2V0b2Zmc2V0WChzeW1ib2wuZ2x5cGhTdGFydEluZGV4KTtcbiAgICBjb25zdCBsYXN0R2x5cGhPZmZzZXQgPSBnbHlwaE9mZnNldEFycmF5LmdldG9mZnNldFgoZ2x5cGhFbmRJbmRleCAtIDEpO1xuXG4gICAgY29uc3QgZmlyc3RQbGFjZWRHbHlwaCA9IHBsYWNlR2x5cGhBbG9uZ0xpbmUoZm9udFNjYWxlICogZmlyc3RHbHlwaE9mZnNldCwgbGluZU9mZnNldFgsIGxpbmVPZmZzZXRZLCBmbGlwLCBhbmNob3JQb2ludCwgdGlsZUFuY2hvclBvaW50LCBzeW1ib2wuc2VnbWVudCxcbiAgICAgICAgbGluZVN0YXJ0SW5kZXgsIGxpbmVFbmRJbmRleCwgbGluZVZlcnRleEFycmF5LCBsYWJlbFBsYW5lTWF0cml4LCBwcm9qZWN0aW9uQ2FjaGUsIHJldHVyblRpbGVEaXN0YW5jZSk7XG4gICAgaWYgKCFmaXJzdFBsYWNlZEdseXBoKVxuICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IGxhc3RQbGFjZWRHbHlwaCA9IHBsYWNlR2x5cGhBbG9uZ0xpbmUoZm9udFNjYWxlICogbGFzdEdseXBoT2Zmc2V0LCBsaW5lT2Zmc2V0WCwgbGluZU9mZnNldFksIGZsaXAsIGFuY2hvclBvaW50LCB0aWxlQW5jaG9yUG9pbnQsIHN5bWJvbC5zZWdtZW50LFxuICAgICAgICBsaW5lU3RhcnRJbmRleCwgbGluZUVuZEluZGV4LCBsaW5lVmVydGV4QXJyYXksIGxhYmVsUGxhbmVNYXRyaXgsIHByb2plY3Rpb25DYWNoZSwgcmV0dXJuVGlsZURpc3RhbmNlKTtcbiAgICBpZiAoIWxhc3RQbGFjZWRHbHlwaClcbiAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICByZXR1cm4geyBmaXJzdDogZmlyc3RQbGFjZWRHbHlwaCwgbGFzdDogbGFzdFBsYWNlZEdseXBoIH07XG59XG5cbmZ1bmN0aW9uIHJlcXVpcmVzT3JpZW50YXRpb25DaGFuZ2Uod3JpdGluZ01vZGUsIGZpcnN0UG9pbnQsIGxhc3RQb2ludCwgYXNwZWN0UmF0aW8pIHtcbiAgICBpZiAod3JpdGluZ01vZGUgPT09IFdyaXRpbmdNb2RlLmhvcml6b250YWwpIHtcbiAgICAgICAgLy8gT24gdG9wIG9mIGNob29zaW5nIHdoZXRoZXIgdG8gZmxpcCwgY2hvb3NlIHdoZXRoZXIgdG8gcmVuZGVyIHRoaXMgdmVyc2lvbiBvZiB0aGUgZ2x5cGhzIG9yIHRoZSBhbHRlcm5hdGVcbiAgICAgICAgLy8gdmVydGljYWwgZ2x5cGhzLiBXZSBjYW4ndCBqdXN0IGZpbHRlciBvdXQgdmVydGljYWwgZ2x5cGhzIGluIHRoZSBob3Jpem9udGFsIHJhbmdlIGJlY2F1c2UgdGhlIGhvcml6b250YWxcbiAgICAgICAgLy8gYW5kIHZlcnRpY2FsIHZlcnNpb25zIGNhbiBoYXZlIHNsaWdodGx5IGRpZmZlcmVudCBwcm9qZWN0aW9ucyB3aGljaCBjb3VsZCBsZWFkIHRvIGFuZ2xlcyB3aGVyZSBib3RoIG9yXG4gICAgICAgIC8vIG5laXRoZXIgc2hvd2VkLlxuICAgICAgICBjb25zdCByaXNlID0gTWF0aC5hYnMobGFzdFBvaW50LnkgLSBmaXJzdFBvaW50LnkpO1xuICAgICAgICBjb25zdCBydW4gPSBNYXRoLmFicyhsYXN0UG9pbnQueCAtIGZpcnN0UG9pbnQueCkgKiBhc3BlY3RSYXRpbztcbiAgICAgICAgaWYgKHJpc2UgPiBydW4pIHtcbiAgICAgICAgICAgIHJldHVybiB7IHVzZVZlcnRpY2FsOiB0cnVlIH07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAod3JpdGluZ01vZGUgPT09IFdyaXRpbmdNb2RlLnZlcnRpY2FsID8gZmlyc3RQb2ludC55IDwgbGFzdFBvaW50LnkgOiBmaXJzdFBvaW50LnggPiBsYXN0UG9pbnQueCkge1xuICAgICAgICAvLyBJbmNsdWRlcyBcImhvcml6b250YWxPbmx5XCIgY2FzZSBmb3IgbGFiZWxzIHdpdGhvdXQgdmVydGljYWwgZ2x5cGhzXG4gICAgICAgIHJldHVybiB7IG5lZWRzRmxpcHBpbmc6IHRydWUgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gcGxhY2VHbHlwaHNBbG9uZ0xpbmUoc3ltYm9sLCBmb250U2l6ZSwgZmxpcCwga2VlcFVwcmlnaHQsIHBvc01hdHJpeCwgbGFiZWxQbGFuZU1hdHJpeCwgZ2xDb29yZE1hdHJpeCwgZ2x5cGhPZmZzZXRBcnJheSwgbGluZVZlcnRleEFycmF5LCBkeW5hbWljTGF5b3V0VmVydGV4QXJyYXksIGFuY2hvclBvaW50LCB0aWxlQW5jaG9yUG9pbnQsIHByb2plY3Rpb25DYWNoZSwgYXNwZWN0UmF0aW8pIHtcbiAgICBjb25zdCBmb250U2NhbGUgPSBmb250U2l6ZSAvIDI0O1xuICAgIGNvbnN0IGxpbmVPZmZzZXRYID0gc3ltYm9sLmxpbmVPZmZzZXRYICogZm9udFNjYWxlO1xuICAgIGNvbnN0IGxpbmVPZmZzZXRZID0gc3ltYm9sLmxpbmVPZmZzZXRZICogZm9udFNjYWxlO1xuXG4gICAgbGV0IHBsYWNlZEdseXBocztcbiAgICBpZiAoc3ltYm9sLm51bUdseXBocyA+IDEpIHtcbiAgICAgICAgY29uc3QgZ2x5cGhFbmRJbmRleCA9IHN5bWJvbC5nbHlwaFN0YXJ0SW5kZXggKyBzeW1ib2wubnVtR2x5cGhzO1xuICAgICAgICBjb25zdCBsaW5lU3RhcnRJbmRleCA9IHN5bWJvbC5saW5lU3RhcnRJbmRleDtcbiAgICAgICAgY29uc3QgbGluZUVuZEluZGV4ID0gc3ltYm9sLmxpbmVTdGFydEluZGV4ICsgc3ltYm9sLmxpbmVMZW5ndGg7XG5cbiAgICAgICAgLy8gUGxhY2UgdGhlIGZpcnN0IGFuZCB0aGUgbGFzdCBnbHlwaCBpbiB0aGUgbGFiZWwgZmlyc3QsIHNvIHdlIGNhbiBmaWd1cmUgb3V0XG4gICAgICAgIC8vIHRoZSBvdmVyYWxsIG9yaWVudGF0aW9uIG9mIHRoZSBsYWJlbCBhbmQgZGV0ZXJtaW5lIHdoZXRoZXIgaXQgbmVlZHMgdG8gYmUgZmxpcHBlZCBpbiBrZWVwVXByaWdodCBtb2RlXG4gICAgICAgIGNvbnN0IGZpcnN0QW5kTGFzdEdseXBoID0gcGxhY2VGaXJzdEFuZExhc3RHbHlwaChmb250U2NhbGUsIGdseXBoT2Zmc2V0QXJyYXksIGxpbmVPZmZzZXRYLCBsaW5lT2Zmc2V0WSwgZmxpcCwgYW5jaG9yUG9pbnQsIHRpbGVBbmNob3JQb2ludCwgc3ltYm9sLCBsaW5lVmVydGV4QXJyYXksIGxhYmVsUGxhbmVNYXRyaXgsIHByb2plY3Rpb25DYWNoZSwgZmFsc2UpO1xuICAgICAgICBpZiAoIWZpcnN0QW5kTGFzdEdseXBoKSB7XG4gICAgICAgICAgICByZXR1cm4geyBub3RFbm91Z2hSb29tOiB0cnVlIH07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZmlyc3RQb2ludCA9IHByb2plY3QoZmlyc3RBbmRMYXN0R2x5cGguZmlyc3QucG9pbnQsIGdsQ29vcmRNYXRyaXgpLnBvaW50O1xuICAgICAgICBjb25zdCBsYXN0UG9pbnQgPSBwcm9qZWN0KGZpcnN0QW5kTGFzdEdseXBoLmxhc3QucG9pbnQsIGdsQ29vcmRNYXRyaXgpLnBvaW50O1xuXG4gICAgICAgIGlmIChrZWVwVXByaWdodCAmJiAhZmxpcCkge1xuICAgICAgICAgICAgY29uc3Qgb3JpZW50YXRpb25DaGFuZ2UgPSByZXF1aXJlc09yaWVudGF0aW9uQ2hhbmdlKHN5bWJvbC53cml0aW5nTW9kZSwgZmlyc3RQb2ludCwgbGFzdFBvaW50LCBhc3BlY3RSYXRpbyk7XG4gICAgICAgICAgICBpZiAob3JpZW50YXRpb25DaGFuZ2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gb3JpZW50YXRpb25DaGFuZ2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBwbGFjZWRHbHlwaHMgPSBbZmlyc3RBbmRMYXN0R2x5cGguZmlyc3RdO1xuICAgICAgICBmb3IgKGxldCBnbHlwaEluZGV4ID0gc3ltYm9sLmdseXBoU3RhcnRJbmRleCArIDE7IGdseXBoSW5kZXggPCBnbHlwaEVuZEluZGV4IC0gMTsgZ2x5cGhJbmRleCsrKSB7XG4gICAgICAgICAgICAvLyBTaW5jZSBmaXJzdCBhbmQgbGFzdCBnbHlwaCBmaXQgb24gdGhlIGxpbmUsIHdlJ3JlIHN1cmUgdGhhdCB0aGUgcmVzdCBvZiB0aGUgZ2x5cGhzIGNhbiBiZSBwbGFjZWRcbiAgICAgICAgICAgIC8vICRGbG93Rml4TWVcbiAgICAgICAgICAgIHBsYWNlZEdseXBocy5wdXNoKHBsYWNlR2x5cGhBbG9uZ0xpbmUoZm9udFNjYWxlICogZ2x5cGhPZmZzZXRBcnJheS5nZXRvZmZzZXRYKGdseXBoSW5kZXgpLCBsaW5lT2Zmc2V0WCwgbGluZU9mZnNldFksIGZsaXAsIGFuY2hvclBvaW50LCB0aWxlQW5jaG9yUG9pbnQsIHN5bWJvbC5zZWdtZW50LFxuICAgICAgICAgICAgICAgIGxpbmVTdGFydEluZGV4LCBsaW5lRW5kSW5kZXgsIGxpbmVWZXJ0ZXhBcnJheSwgbGFiZWxQbGFuZU1hdHJpeCwgcHJvamVjdGlvbkNhY2hlLCBmYWxzZSkpO1xuICAgICAgICB9XG4gICAgICAgIHBsYWNlZEdseXBocy5wdXNoKGZpcnN0QW5kTGFzdEdseXBoLmxhc3QpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIE9ubHkgYSBzaW5nbGUgZ2x5cGggdG8gcGxhY2VcbiAgICAgICAgLy8gU28sIGRldGVybWluZSB3aGV0aGVyIHRvIGZsaXAgYmFzZWQgb24gcHJvamVjdGVkIGFuZ2xlIG9mIHRoZSBsaW5lIHNlZ21lbnQgaXQncyBvblxuICAgICAgICBpZiAoa2VlcFVwcmlnaHQgJiYgIWZsaXApIHtcbiAgICAgICAgICAgIGNvbnN0IGEgPSBwcm9qZWN0KHRpbGVBbmNob3JQb2ludCwgcG9zTWF0cml4KS5wb2ludDtcbiAgICAgICAgICAgIGNvbnN0IHRpbGVWZXJ0ZXhJbmRleCA9IChzeW1ib2wubGluZVN0YXJ0SW5kZXggKyBzeW1ib2wuc2VnbWVudCArIDEpO1xuICAgICAgICAgICAgLy8gJEZsb3dGaXhNZVxuICAgICAgICAgICAgY29uc3QgdGlsZVNlZ21lbnRFbmQgPSBuZXcgUG9pbnQobGluZVZlcnRleEFycmF5LmdldHgodGlsZVZlcnRleEluZGV4KSwgbGluZVZlcnRleEFycmF5LmdldHkodGlsZVZlcnRleEluZGV4KSk7XG4gICAgICAgICAgICBjb25zdCBwcm9qZWN0ZWRWZXJ0ZXggPSBwcm9qZWN0KHRpbGVTZWdtZW50RW5kLCBwb3NNYXRyaXgpO1xuICAgICAgICAgICAgLy8gV2Uga25vdyB0aGUgYW5jaG9yIHdpbGwgYmUgaW4gdGhlIHZpZXdwb3J0LCBidXQgdGhlIGVuZCBvZiB0aGUgbGluZSBzZWdtZW50IG1heSBiZVxuICAgICAgICAgICAgLy8gYmVoaW5kIHRoZSBwbGFuZSBvZiB0aGUgY2FtZXJhLCBpbiB3aGljaCBjYXNlIHdlIGNhbiB1c2UgYSBwb2ludCBhdCBhbnkgYXJiaXRyYXJ5IChjbG9zZXIpXG4gICAgICAgICAgICAvLyBwb2ludCBvbiB0aGUgc2VnbWVudC5cbiAgICAgICAgICAgIGNvbnN0IGIgPSAocHJvamVjdGVkVmVydGV4LnNpZ25lZERpc3RhbmNlRnJvbUNhbWVyYSA+IDApID9cbiAgICAgICAgICAgICAgICBwcm9qZWN0ZWRWZXJ0ZXgucG9pbnQgOlxuICAgICAgICAgICAgICAgIHByb2plY3RUcnVuY2F0ZWRMaW5lU2VnbWVudCh0aWxlQW5jaG9yUG9pbnQsIHRpbGVTZWdtZW50RW5kLCBhLCAxLCBwb3NNYXRyaXgpO1xuXG5cbiAgICAgICAgICAgIGNvbnN0IG9yaWVudGF0aW9uQ2hhbmdlID0gcmVxdWlyZXNPcmllbnRhdGlvbkNoYW5nZShzeW1ib2wud3JpdGluZ01vZGUsIGEsIGIsIGFzcGVjdFJhdGlvKTtcbiAgICAgICAgICAgIGlmIChvcmllbnRhdGlvbkNoYW5nZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBvcmllbnRhdGlvbkNoYW5nZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyAkRmxvd0ZpeE1lXG4gICAgICAgIGNvbnN0IHNpbmdsZUdseXBoID0gcGxhY2VHbHlwaEFsb25nTGluZShmb250U2NhbGUgKiBnbHlwaE9mZnNldEFycmF5LmdldG9mZnNldFgoc3ltYm9sLmdseXBoU3RhcnRJbmRleCksIGxpbmVPZmZzZXRYLCBsaW5lT2Zmc2V0WSwgZmxpcCwgYW5jaG9yUG9pbnQsIHRpbGVBbmNob3JQb2ludCwgc3ltYm9sLnNlZ21lbnQsXG4gICAgICAgICAgICBzeW1ib2wubGluZVN0YXJ0SW5kZXgsIHN5bWJvbC5saW5lU3RhcnRJbmRleCArIHN5bWJvbC5saW5lTGVuZ3RoLCBsaW5lVmVydGV4QXJyYXksIGxhYmVsUGxhbmVNYXRyaXgsIHByb2plY3Rpb25DYWNoZSwgZmFsc2UpO1xuICAgICAgICBpZiAoIXNpbmdsZUdseXBoKVxuICAgICAgICAgICAgcmV0dXJuIHsgbm90RW5vdWdoUm9vbTogdHJ1ZSB9O1xuXG4gICAgICAgIHBsYWNlZEdseXBocyA9IFtzaW5nbGVHbHlwaF07XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBnbHlwaDogYW55IG9mIHBsYWNlZEdseXBocykge1xuICAgICAgICBhZGREeW5hbWljQXR0cmlidXRlcyhkeW5hbWljTGF5b3V0VmVydGV4QXJyYXksIGdseXBoLnBvaW50LCBnbHlwaC5hbmdsZSk7XG4gICAgfVxuICAgIHJldHVybiB7fTtcbn1cblxuZnVuY3Rpb24gcHJvamVjdFRydW5jYXRlZExpbmVTZWdtZW50KHByZXZpb3VzVGlsZVBvaW50OiBQb2ludCwgY3VycmVudFRpbGVQb2ludDogUG9pbnQsIHByZXZpb3VzUHJvamVjdGVkUG9pbnQ6IFBvaW50LCBtaW5pbXVtTGVuZ3RoOiBudW1iZXIsIHByb2plY3Rpb25NYXRyaXg6IG1hdDQpIHtcbiAgICAvLyBXZSBhcmUgYXNzdW1pbmcgXCJwcmV2aW91c1RpbGVQb2ludFwiIHdvbid0IHByb2plY3QgdG8gYSBwb2ludCB3aXRoaW4gb25lIHVuaXQgb2YgdGhlIGNhbWVyYSBwbGFuZVxuICAgIC8vIElmIGl0IGRpZCwgdGhhdCB3b3VsZCBtZWFuIG91ciBsYWJlbCBleHRlbmRlZCBhbGwgdGhlIHdheSBvdXQgZnJvbSB3aXRoaW4gdGhlIHZpZXdwb3J0IHRvIGEgKHZlcnkgZGlzdGFudClcbiAgICAvLyBwb2ludCBuZWFyIHRoZSBwbGFuZSBvZiB0aGUgY2FtZXJhLiBXZSB3b3VsZG4ndCBiZSBhYmxlIHRvIHJlbmRlciB0aGUgbGFiZWwgYW55d2F5IG9uY2UgaXQgY3Jvc3NlZCB0aGVcbiAgICAvLyBwbGFuZSBvZiB0aGUgY2FtZXJhLlxuICAgIGNvbnN0IHByb2plY3RlZFVuaXRWZXJ0ZXggPSBwcm9qZWN0KHByZXZpb3VzVGlsZVBvaW50LmFkZChwcmV2aW91c1RpbGVQb2ludC5zdWIoY3VycmVudFRpbGVQb2ludCkuX3VuaXQoKSksIHByb2plY3Rpb25NYXRyaXgpLnBvaW50O1xuICAgIGNvbnN0IHByb2plY3RlZFVuaXRTZWdtZW50ID0gcHJldmlvdXNQcm9qZWN0ZWRQb2ludC5zdWIocHJvamVjdGVkVW5pdFZlcnRleCk7XG5cbiAgICByZXR1cm4gcHJldmlvdXNQcm9qZWN0ZWRQb2ludC5hZGQocHJvamVjdGVkVW5pdFNlZ21lbnQuX211bHQobWluaW11bUxlbmd0aCAvIHByb2plY3RlZFVuaXRTZWdtZW50Lm1hZygpKSk7XG59XG5cbmZ1bmN0aW9uIHBsYWNlR2x5cGhBbG9uZ0xpbmUob2Zmc2V0WDogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lT2Zmc2V0WDogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lT2Zmc2V0WTogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGlwOiBib29sZWFuLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmNob3JQb2ludDogUG9pbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbGVBbmNob3JQb2ludDogUG9pbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuY2hvclNlZ21lbnQ6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZVN0YXJ0SW5kZXg6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZUVuZEluZGV4OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVWZXJ0ZXhBcnJheTogU3ltYm9sTGluZVZlcnRleEFycmF5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbFBsYW5lTWF0cml4OiBtYXQ0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9qZWN0aW9uQ2FjaGU6IHtbbnVtYmVyXTogUG9pbnR9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5UaWxlRGlzdGFuY2U6IGJvb2xlYW4pIHtcblxuICAgIGNvbnN0IGNvbWJpbmVkT2Zmc2V0WCA9IGZsaXAgP1xuICAgICAgICBvZmZzZXRYIC0gbGluZU9mZnNldFggOlxuICAgICAgICBvZmZzZXRYICsgbGluZU9mZnNldFg7XG5cbiAgICBsZXQgZGlyID0gY29tYmluZWRPZmZzZXRYID4gMCA/IDEgOiAtMTtcblxuICAgIGxldCBhbmdsZSA9IDA7XG4gICAgaWYgKGZsaXApIHtcbiAgICAgICAgLy8gVGhlIGxhYmVsIG5lZWRzIHRvIGJlIGZsaXBwZWQgdG8ga2VlcCB0ZXh0IHVwcmlnaHQuXG4gICAgICAgIC8vIEl0ZXJhdGUgaW4gdGhlIHJldmVyc2UgZGlyZWN0aW9uLlxuICAgICAgICBkaXIgKj0gLTE7XG4gICAgICAgIGFuZ2xlID0gTWF0aC5QSTtcbiAgICB9XG5cbiAgICBpZiAoZGlyIDwgMCkgYW5nbGUgKz0gTWF0aC5QSTtcblxuICAgIGxldCBjdXJyZW50SW5kZXggPSBkaXIgPiAwID9cbiAgICAgICAgbGluZVN0YXJ0SW5kZXggKyBhbmNob3JTZWdtZW50IDpcbiAgICAgICAgbGluZVN0YXJ0SW5kZXggKyBhbmNob3JTZWdtZW50ICsgMTtcblxuICAgIGNvbnN0IGluaXRpYWxJbmRleCA9IGN1cnJlbnRJbmRleDtcbiAgICBsZXQgY3VycmVudCA9IGFuY2hvclBvaW50O1xuICAgIGxldCBwcmV2ID0gYW5jaG9yUG9pbnQ7XG4gICAgbGV0IGRpc3RhbmNlVG9QcmV2ID0gMDtcbiAgICBsZXQgY3VycmVudFNlZ21lbnREaXN0YW5jZSA9IDA7XG4gICAgY29uc3QgYWJzT2Zmc2V0WCA9IE1hdGguYWJzKGNvbWJpbmVkT2Zmc2V0WCk7XG5cbiAgICB3aGlsZSAoZGlzdGFuY2VUb1ByZXYgKyBjdXJyZW50U2VnbWVudERpc3RhbmNlIDw9IGFic09mZnNldFgpIHtcbiAgICAgICAgY3VycmVudEluZGV4ICs9IGRpcjtcblxuICAgICAgICAvLyBvZmZzZXQgZG9lcyBub3QgZml0IG9uIHRoZSBwcm9qZWN0ZWQgbGluZVxuICAgICAgICBpZiAoY3VycmVudEluZGV4IDwgbGluZVN0YXJ0SW5kZXggfHwgY3VycmVudEluZGV4ID49IGxpbmVFbmRJbmRleClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIHByZXYgPSBjdXJyZW50O1xuXG4gICAgICAgIGN1cnJlbnQgPSBwcm9qZWN0aW9uQ2FjaGVbY3VycmVudEluZGV4XTtcbiAgICAgICAgaWYgKGN1cnJlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgY3VycmVudFZlcnRleCA9IG5ldyBQb2ludChsaW5lVmVydGV4QXJyYXkuZ2V0eChjdXJyZW50SW5kZXgpLCBsaW5lVmVydGV4QXJyYXkuZ2V0eShjdXJyZW50SW5kZXgpKTtcbiAgICAgICAgICAgIGNvbnN0IHByb2plY3Rpb24gPSBwcm9qZWN0KGN1cnJlbnRWZXJ0ZXgsIGxhYmVsUGxhbmVNYXRyaXgpO1xuICAgICAgICAgICAgaWYgKHByb2plY3Rpb24uc2lnbmVkRGlzdGFuY2VGcm9tQ2FtZXJhID4gMCkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBwcm9qZWN0aW9uQ2FjaGVbY3VycmVudEluZGV4XSA9IHByb2plY3Rpb24ucG9pbnQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFRoZSB2ZXJ0ZXggaXMgYmVoaW5kIHRoZSBwbGFuZSBvZiB0aGUgY2FtZXJhLCBzbyB3ZSBjYW4ndCBwcm9qZWN0IGl0XG4gICAgICAgICAgICAgICAgLy8gSW5zdGVhZCwgd2UnbGwgY3JlYXRlIGEgdmVydGV4IGFsb25nIHRoZSBsaW5lIHRoYXQncyBmYXIgZW5vdWdoIHRvIGluY2x1ZGUgdGhlIGdseXBoXG4gICAgICAgICAgICAgICAgY29uc3QgcHJldmlvdXNMaW5lVmVydGV4SW5kZXggPSBjdXJyZW50SW5kZXggLSBkaXI7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJldmlvdXNUaWxlUG9pbnQgPSBkaXN0YW5jZVRvUHJldiA9PT0gMCA/XG4gICAgICAgICAgICAgICAgICAgIHRpbGVBbmNob3JQb2ludCA6XG4gICAgICAgICAgICAgICAgICAgIG5ldyBQb2ludChsaW5lVmVydGV4QXJyYXkuZ2V0eChwcmV2aW91c0xpbmVWZXJ0ZXhJbmRleCksIGxpbmVWZXJ0ZXhBcnJheS5nZXR5KHByZXZpb3VzTGluZVZlcnRleEluZGV4KSk7XG4gICAgICAgICAgICAgICAgLy8gRG9uJ3QgY2FjaGUgYmVjYXVzZSB0aGUgbmV3IHZlcnRleCBtaWdodCBub3QgYmUgZmFyIGVub3VnaCBvdXQgZm9yIGZ1dHVyZSBnbHlwaHMgb24gdGhlIHNhbWUgc2VnbWVudFxuICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBwcm9qZWN0VHJ1bmNhdGVkTGluZVNlZ21lbnQocHJldmlvdXNUaWxlUG9pbnQsIGN1cnJlbnRWZXJ0ZXgsIHByZXYsIGFic09mZnNldFggLSBkaXN0YW5jZVRvUHJldiArIDEsIGxhYmVsUGxhbmVNYXRyaXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZGlzdGFuY2VUb1ByZXYgKz0gY3VycmVudFNlZ21lbnREaXN0YW5jZTtcbiAgICAgICAgY3VycmVudFNlZ21lbnREaXN0YW5jZSA9IHByZXYuZGlzdChjdXJyZW50KTtcbiAgICB9XG5cbiAgICAvLyBUaGUgcG9pbnQgaXMgb24gdGhlIGN1cnJlbnQgc2VnbWVudC4gSW50ZXJwb2xhdGUgdG8gZmluZCBpdC5cbiAgICBjb25zdCBzZWdtZW50SW50ZXJwb2xhdGlvblQgPSAoYWJzT2Zmc2V0WCAtIGRpc3RhbmNlVG9QcmV2KSAvIGN1cnJlbnRTZWdtZW50RGlzdGFuY2U7XG4gICAgY29uc3QgcHJldlRvQ3VycmVudCA9IGN1cnJlbnQuc3ViKHByZXYpO1xuICAgIGNvbnN0IHAgPSBwcmV2VG9DdXJyZW50Lm11bHQoc2VnbWVudEludGVycG9sYXRpb25UKS5fYWRkKHByZXYpO1xuXG4gICAgLy8gb2Zmc2V0IHRoZSBwb2ludCBmcm9tIHRoZSBsaW5lIHRvIHRleHQtb2Zmc2V0IGFuZCBpY29uLW9mZnNldFxuICAgIHAuX2FkZChwcmV2VG9DdXJyZW50Ll91bml0KCkuX3BlcnAoKS5fbXVsdChsaW5lT2Zmc2V0WSAqIGRpcikpO1xuXG4gICAgY29uc3Qgc2VnbWVudEFuZ2xlID0gYW5nbGUgKyBNYXRoLmF0YW4yKGN1cnJlbnQueSAtIHByZXYueSwgY3VycmVudC54IC0gcHJldi54KTtcblxuICAgIHJldHVybiB7XG4gICAgICAgIHBvaW50OiBwLFxuICAgICAgICBhbmdsZTogc2VnbWVudEFuZ2xlLFxuICAgICAgICB0aWxlRGlzdGFuY2U6IHJldHVyblRpbGVEaXN0YW5jZSA/XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcHJldlRpbGVEaXN0YW5jZTogKGN1cnJlbnRJbmRleCAtIGRpcikgPT09IGluaXRpYWxJbmRleCA/IDAgOiBsaW5lVmVydGV4QXJyYXkuZ2V0dGlsZVVuaXREaXN0YW5jZUZyb21BbmNob3IoY3VycmVudEluZGV4IC0gZGlyKSxcbiAgICAgICAgICAgICAgICBsYXN0U2VnbWVudFZpZXdwb3J0RGlzdGFuY2U6IGFic09mZnNldFggLSBkaXN0YW5jZVRvUHJldlxuICAgICAgICAgICAgfSA6IG51bGxcbiAgICB9O1xufVxuXG5jb25zdCBoaWRkZW5HbHlwaEF0dHJpYnV0ZXMgPSBuZXcgRmxvYXQzMkFycmF5KFstSW5maW5pdHksIC1JbmZpbml0eSwgMCwgLUluZmluaXR5LCAtSW5maW5pdHksIDAsIC1JbmZpbml0eSwgLUluZmluaXR5LCAwLCAtSW5maW5pdHksIC1JbmZpbml0eSwgMF0pO1xuXG4vLyBIaWRlIHRoZW0gYnkgbW92aW5nIHRoZW0gb2Zmc2NyZWVuLiBXZSBzdGlsbCBuZWVkIHRvIGFkZCB0aGVtIHRvIHRoZSBidWZmZXJcbi8vIGJlY2F1c2UgdGhlIGR5bmFtaWMgYnVmZmVyIGlzIHBhaXJlZCB3aXRoIGEgc3RhdGljIGJ1ZmZlciB0aGF0IGRvZXNuJ3QgZ2V0IHVwZGF0ZWQuXG5mdW5jdGlvbiBoaWRlR2x5cGhzKG51bTogbnVtYmVyLCBkeW5hbWljTGF5b3V0VmVydGV4QXJyYXk6IFN5bWJvbER5bmFtaWNMYXlvdXRBcnJheSkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtOyBpKyspIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gZHluYW1pY0xheW91dFZlcnRleEFycmF5Lmxlbmd0aDtcbiAgICAgICAgZHluYW1pY0xheW91dFZlcnRleEFycmF5LnJlc2l6ZShvZmZzZXQgKyA0KTtcbiAgICAgICAgLy8gU2luY2UgYWxsIGhpZGRlbiBnbHlwaHMgaGF2ZSB0aGUgc2FtZSBhdHRyaWJ1dGVzLCB3ZSBjYW4gYnVpbGQgdXAgdGhlIGFycmF5IGZhc3RlciB3aXRoIGEgc2luZ2xlIGNhbGwgdG8gRmxvYXQzMkFycmF5LnNldFxuICAgICAgICAvLyBmb3IgZWFjaCBzZXQgb2YgZm91ciB2ZXJ0aWNlcywgaW5zdGVhZCBvZiBjYWxsaW5nIGFkZER5bmFtaWNBdHRyaWJ1dGVzIGZvciBlYWNoIHZlcnRleC5cbiAgICAgICAgZHluYW1pY0xheW91dFZlcnRleEFycmF5LmZsb2F0MzIuc2V0KGhpZGRlbkdseXBoQXR0cmlidXRlcywgb2Zmc2V0ICogMyk7XG4gICAgfVxufVxuXG4vLyBGb3IgbGluZSBsYWJlbCBsYXlvdXQsIHdlJ3JlIG5vdCB1c2luZyB6IG91dHB1dCBhbmQgb3VyIHcgaW5wdXQgaXMgYWx3YXlzIDFcbi8vIFRoaXMgY3VzdG9tIG1hdHJpeCB0cmFuc2Zvcm1hdGlvbiBpZ25vcmVzIHRob3NlIGNvbXBvbmVudHMgdG8gbWFrZSBwcm9qZWN0aW9uIGZhc3RlclxuZnVuY3Rpb24geHlUcmFuc2Zvcm1NYXQ0KG91dDogdmVjNCwgYTogdmVjNCwgbTogbWF0NCkge1xuICAgIGNvbnN0IHggPSBhWzBdLCB5ID0gYVsxXTtcbiAgICBvdXRbMF0gPSBtWzBdICogeCArIG1bNF0gKiB5ICsgbVsxMl07XG4gICAgb3V0WzFdID0gbVsxXSAqIHggKyBtWzVdICogeSArIG1bMTNdO1xuICAgIG91dFszXSA9IG1bM10gKiB4ICsgbVs3XSAqIHkgKyBtWzE1XTtcbiAgICByZXR1cm4gb3V0O1xufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuXG5pbXBvcnQgKiBhcyBpbnRlcnNlY3Rpb25UZXN0cyBmcm9tICcuLi91dGlsL2ludGVyc2VjdGlvbl90ZXN0cyc7XG5pbXBvcnQgR3JpZCBmcm9tICcuL2dyaWRfaW5kZXgnO1xuaW1wb3J0IHsgbWF0NCB9IGZyb20gJ2dsLW1hdHJpeCc7XG5cbmltcG9ydCAqIGFzIHByb2plY3Rpb24gZnJvbSAnLi4vc3ltYm9sL3Byb2plY3Rpb24nO1xuXG5pbXBvcnQgdHlwZSBUcmFuc2Zvcm0gZnJvbSAnLi4vZ2VvL3RyYW5zZm9ybSc7XG5pbXBvcnQgdHlwZSB7U2luZ2xlQ29sbGlzaW9uQm94fSBmcm9tICcuLi9kYXRhL2J1Y2tldC9zeW1ib2xfYnVja2V0JztcbmltcG9ydCB0eXBlIHtcbiAgICBHbHlwaE9mZnNldEFycmF5LFxuICAgIFN5bWJvbExpbmVWZXJ0ZXhBcnJheVxufSBmcm9tICcuLi9kYXRhL2FycmF5X3R5cGVzJztcblxuLy8gV2hlbiBhIHN5bWJvbCBjcm9zc2VzIHRoZSBlZGdlIHRoYXQgY2F1c2VzIGl0IHRvIGJlIGluY2x1ZGVkIGluXG4vLyBjb2xsaXNpb24gZGV0ZWN0aW9uLCBpdCB3aWxsIGNhdXNlIGNoYW5nZXMgaW4gdGhlIHN5bWJvbHMgYXJvdW5kXG4vLyBpdC4gVGhpcyBjb25zdGFudCBzcGVjaWZpZXMgaG93IG1hbnkgcGl4ZWxzIHRvIHBhZCB0aGUgZWRnZSBvZlxuLy8gdGhlIHZpZXdwb3J0IGZvciBjb2xsaXNpb24gZGV0ZWN0aW9uIHNvIHRoYXQgdGhlIGJ1bGsgb2YgdGhlIGNoYW5nZXNcbi8vIG9jY3VyIG9mZnNjcmVlbi4gTWFraW5nIHRoaXMgY29uc3RhbnQgZ3JlYXRlciBpbmNyZWFzZXMgbGFiZWxcbi8vIHN0YWJpbGl0eSwgYnV0IGl0J3MgZXhwZW5zaXZlLlxuY29uc3Qgdmlld3BvcnRQYWRkaW5nID0gMTAwO1xuXG4vKipcbiAqIEEgY29sbGlzaW9uIGluZGV4IHVzZWQgdG8gcHJldmVudCBzeW1ib2xzIGZyb20gb3ZlcmxhcHBpbmcuIEl0IGtlZXAgdHJhY2tzIG9mXG4gKiB3aGVyZSBwcmV2aW91cyBzeW1ib2xzIGhhdmUgYmVlbiBwbGFjZWQgYW5kIGlzIHVzZWQgdG8gY2hlY2sgaWYgYSBuZXdcbiAqIHN5bWJvbCBvdmVybGFwcyB3aXRoIGFueSBwcmV2aW91c2x5IGFkZGVkIHN5bWJvbHMuXG4gKlxuICogVGhlcmUgYXJlIHR3byBzdGVwcyB0byBpbnNlcnRpb246IGZpcnN0IHBsYWNlQ29sbGlzaW9uQm94L0NpcmNsZXMgY2hlY2tzIGlmXG4gKiB0aGVyZSdzIHJvb20gZm9yIGEgc3ltYm9sLCB0aGVuIGluc2VydENvbGxpc2lvbkJveC9DaXJjbGVzIGFjdHVhbGx5IHB1dHMgdGhlXG4gKiBzeW1ib2wgaW4gdGhlIGluZGV4LiBUaGUgdHdvIHN0ZXAgcHJvY2VzcyBhbGxvd3MgcGFpcmVkIHN5bWJvbHMgdG8gYmUgaW5zZXJ0ZWRcbiAqIHRvZ2V0aGVyIGV2ZW4gaWYgdGhleSBvdmVybGFwLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIENvbGxpc2lvbkluZGV4IHtcbiAgICBncmlkOiBHcmlkO1xuICAgIGlnbm9yZWRHcmlkOiBHcmlkO1xuICAgIHRyYW5zZm9ybTogVHJhbnNmb3JtO1xuICAgIHBpdGNoZmFjdG9yOiBudW1iZXI7XG4gICAgc2NyZWVuUmlnaHRCb3VuZGFyeTogbnVtYmVyO1xuICAgIHNjcmVlbkJvdHRvbUJvdW5kYXJ5OiBudW1iZXI7XG4gICAgZ3JpZFJpZ2h0Qm91bmRhcnk6IG51bWJlcjtcbiAgICBncmlkQm90dG9tQm91bmRhcnk6IG51bWJlcjtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICB0cmFuc2Zvcm06IFRyYW5zZm9ybSxcbiAgICAgICAgZ3JpZDogR3JpZCA9IG5ldyBHcmlkKHRyYW5zZm9ybS53aWR0aCArIDIgKiB2aWV3cG9ydFBhZGRpbmcsIHRyYW5zZm9ybS5oZWlnaHQgKyAyICogdmlld3BvcnRQYWRkaW5nLCAyNSksXG4gICAgICAgIGlnbm9yZWRHcmlkOiBHcmlkID0gbmV3IEdyaWQodHJhbnNmb3JtLndpZHRoICsgMiAqIHZpZXdwb3J0UGFkZGluZywgdHJhbnNmb3JtLmhlaWdodCArIDIgKiB2aWV3cG9ydFBhZGRpbmcsIDI1KVxuICAgICkge1xuICAgICAgICB0aGlzLnRyYW5zZm9ybSA9IHRyYW5zZm9ybTtcblxuICAgICAgICB0aGlzLmdyaWQgPSBncmlkO1xuICAgICAgICB0aGlzLmlnbm9yZWRHcmlkID0gaWdub3JlZEdyaWQ7XG4gICAgICAgIHRoaXMucGl0Y2hmYWN0b3IgPSBNYXRoLmNvcyh0cmFuc2Zvcm0uX3BpdGNoKSAqIHRyYW5zZm9ybS5jYW1lcmFUb0NlbnRlckRpc3RhbmNlO1xuXG4gICAgICAgIHRoaXMuc2NyZWVuUmlnaHRCb3VuZGFyeSA9IHRyYW5zZm9ybS53aWR0aCArIHZpZXdwb3J0UGFkZGluZztcbiAgICAgICAgdGhpcy5zY3JlZW5Cb3R0b21Cb3VuZGFyeSA9IHRyYW5zZm9ybS5oZWlnaHQgKyB2aWV3cG9ydFBhZGRpbmc7XG4gICAgICAgIHRoaXMuZ3JpZFJpZ2h0Qm91bmRhcnkgPSB0cmFuc2Zvcm0ud2lkdGggKyAyICogdmlld3BvcnRQYWRkaW5nO1xuICAgICAgICB0aGlzLmdyaWRCb3R0b21Cb3VuZGFyeSA9IHRyYW5zZm9ybS5oZWlnaHQgKyAyICogdmlld3BvcnRQYWRkaW5nO1xuICAgIH1cblxuICAgIHBsYWNlQ29sbGlzaW9uQm94KGNvbGxpc2lvbkJveDogU2luZ2xlQ29sbGlzaW9uQm94LCBhbGxvd092ZXJsYXA6IGJvb2xlYW4sIHRleHRQaXhlbFJhdGlvOiBudW1iZXIsIHBvc01hdHJpeDogbWF0NCwgY29sbGlzaW9uR3JvdXBQcmVkaWNhdGU/OiBhbnkpOiB7IGJveDogQXJyYXk8bnVtYmVyPiwgb2Zmc2NyZWVuOiBib29sZWFuIH0ge1xuICAgICAgICBjb25zdCBwcm9qZWN0ZWRQb2ludCA9IHRoaXMucHJvamVjdEFuZEdldFBlcnNwZWN0aXZlUmF0aW8ocG9zTWF0cml4LCBjb2xsaXNpb25Cb3guYW5jaG9yUG9pbnRYLCBjb2xsaXNpb25Cb3guYW5jaG9yUG9pbnRZKTtcbiAgICAgICAgY29uc3QgdGlsZVRvVmlld3BvcnQgPSB0ZXh0UGl4ZWxSYXRpbyAqIHByb2plY3RlZFBvaW50LnBlcnNwZWN0aXZlUmF0aW87XG4gICAgICAgIGNvbnN0IHRsWCA9IGNvbGxpc2lvbkJveC54MSAqIHRpbGVUb1ZpZXdwb3J0ICsgcHJvamVjdGVkUG9pbnQucG9pbnQueDtcbiAgICAgICAgY29uc3QgdGxZID0gY29sbGlzaW9uQm94LnkxICogdGlsZVRvVmlld3BvcnQgKyBwcm9qZWN0ZWRQb2ludC5wb2ludC55O1xuICAgICAgICBjb25zdCBiclggPSBjb2xsaXNpb25Cb3gueDIgKiB0aWxlVG9WaWV3cG9ydCArIHByb2plY3RlZFBvaW50LnBvaW50Lng7XG4gICAgICAgIGNvbnN0IGJyWSA9IGNvbGxpc2lvbkJveC55MiAqIHRpbGVUb1ZpZXdwb3J0ICsgcHJvamVjdGVkUG9pbnQucG9pbnQueTtcblxuICAgICAgICBpZiAoIXRoaXMuaXNJbnNpZGVHcmlkKHRsWCwgdGxZLCBiclgsIGJyWSkgfHxcbiAgICAgICAgICAgICghYWxsb3dPdmVybGFwICYmIHRoaXMuZ3JpZC5oaXRUZXN0KHRsWCwgdGxZLCBiclgsIGJyWSwgY29sbGlzaW9uR3JvdXBQcmVkaWNhdGUpKSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBib3g6IFtdLFxuICAgICAgICAgICAgICAgIG9mZnNjcmVlbjogZmFsc2VcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYm94OiBbdGxYLCB0bFksIGJyWCwgYnJZXSxcbiAgICAgICAgICAgIG9mZnNjcmVlbjogdGhpcy5pc09mZnNjcmVlbih0bFgsIHRsWSwgYnJYLCBiclkpXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgYXBwcm94aW1hdGVUaWxlRGlzdGFuY2UodGlsZURpc3RhbmNlOiBhbnksIGxhc3RTZWdtZW50QW5nbGU6IG51bWJlciwgcGl4ZWxzVG9UaWxlVW5pdHM6IG51bWJlciwgY2FtZXJhVG9BbmNob3JEaXN0YW5jZTogbnVtYmVyLCBwaXRjaFdpdGhNYXA6IGJvb2xlYW4pOiBudW1iZXIge1xuICAgICAgICAvLyBUaGlzIGlzIGEgcXVpY2sgYW5kIGRpcnR5IHNvbHV0aW9uIGZvciBjaG9zaW5nIHdoaWNoIGNvbGxpc2lvbiBjaXJjbGVzIHRvIHVzZSAoc2luY2UgY29sbGlzaW9uIGNpcmNsZXMgYXJlXG4gICAgICAgIC8vIGxhaWQgb3V0IGluIHRpbGUgdW5pdHMpLiBJZGVhbGx5LCBJIHRoaW5rIHdlIHNob3VsZCBnZW5lcmF0ZSBjb2xsaXNpb24gY2lyY2xlcyBvbiB0aGUgZmx5IGluIHZpZXdwb3J0IGNvb3JkaW5hdGVzXG4gICAgICAgIC8vIGF0IHRoZSB0aW1lIHdlIGRvIGNvbGxpc2lvbiBkZXRlY3Rpb24uXG4gICAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L21hcGJveC1nbC1qcy9pc3N1ZXMvNTQ3NFxuXG4gICAgICAgIC8vIGluY2lkZW5jZVN0cmV0Y2ggaXMgdGhlIHJhdGlvIG9mIGhvdyBtdWNoIHkgc3BhY2UgYSBsYWJlbCB0YWtlcyB1cCBvbiBhIHRpbGUgd2hpbGUgZHJhd24gcGVycGVuZGljdWxhciB0byB0aGUgdmlld3BvcnQgdnNcbiAgICAgICAgLy8gIGhvdyBtdWNoIHNwYWNlIGl0IHdvdWxkIHRha2UgdXAgaWYgaXQgd2VyZSBkcmF3biBmbGF0IG9uIHRoZSB0aWxlXG4gICAgICAgIC8vIFVzaW5nIGxhdyBvZiBzaW5lcywgY2FtZXJhX3RvX2FuY2hvci9zaW4oZ3JvdW5kX2FuZ2xlKSA9IGNhbWVyYV90b19jZW50ZXIvc2luKGluY2lkZW5jZV9hbmdsZSlcbiAgICAgICAgLy8gSW5jaWRlbmNlIGFuZ2xlIDkwIC0+IGhlYWQgb24sIHNpbihpbmNpZGVuY2VfYW5nbGUpID0gMSwgbm8gc3RyZXRjaFxuICAgICAgICAvLyBJbmNpZGVuY2UgYW5nbGUgMSAtPiB2ZXJ5IG9ibGlxdWUsIHNpbihpbmNpZGVuY2VfYW5nbGUpID1+IDAsIGxvdHMgb2Ygc3RyZXRjaFxuICAgICAgICAvLyBncm91bmRfYW5nbGUgPSB1X3BpdGNoICsgUEkvMiAtPiBzaW4oZ3JvdW5kX2FuZ2xlKSA9IGNvcyh1X3BpdGNoKVxuICAgICAgICAvLyBpbmNpZGVuY2VTdHJldGNoID0gMSAvIHNpbihpbmNpZGVuY2VBbmdsZSlcblxuICAgICAgICBjb25zdCBpbmNpZGVuY2VTdHJldGNoID0gcGl0Y2hXaXRoTWFwID8gMSA6IGNhbWVyYVRvQW5jaG9yRGlzdGFuY2UgLyB0aGlzLnBpdGNoZmFjdG9yO1xuICAgICAgICBjb25zdCBsYXN0U2VnbWVudFRpbGUgPSB0aWxlRGlzdGFuY2UubGFzdFNlZ21lbnRWaWV3cG9ydERpc3RhbmNlICogcGl4ZWxzVG9UaWxlVW5pdHM7XG4gICAgICAgIHJldHVybiB0aWxlRGlzdGFuY2UucHJldlRpbGVEaXN0YW5jZSArXG4gICAgICAgICAgICBsYXN0U2VnbWVudFRpbGUgK1xuICAgICAgICAgICAgKGluY2lkZW5jZVN0cmV0Y2ggLSAxKSAqIGxhc3RTZWdtZW50VGlsZSAqIE1hdGguYWJzKE1hdGguc2luKGxhc3RTZWdtZW50QW5nbGUpKTtcbiAgICB9XG5cbiAgICBwbGFjZUNvbGxpc2lvbkNpcmNsZXMoY29sbGlzaW9uQ2lyY2xlczogQXJyYXk8bnVtYmVyPixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dPdmVybGFwOiBib29sZWFuLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZTogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0UGl4ZWxSYXRpbzogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2w6IGFueSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZVZlcnRleEFycmF5OiBTeW1ib2xMaW5lVmVydGV4QXJyYXksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoT2Zmc2V0QXJyYXk6IEdseXBoT2Zmc2V0QXJyYXksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRTaXplOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHBvc01hdHJpeDogbWF0NCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxQbGFuZU1hdHJpeDogbWF0NCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0NvbGxpc2lvbkNpcmNsZXM6IGJvb2xlYW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHBpdGNoV2l0aE1hcDogYm9vbGVhbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGlzaW9uR3JvdXBQcmVkaWNhdGU/OiBhbnkpOiB7IGNpcmNsZXM6IEFycmF5PG51bWJlcj4sIG9mZnNjcmVlbjogYm9vbGVhbiB9IHtcbiAgICAgICAgY29uc3QgcGxhY2VkQ29sbGlzaW9uQ2lyY2xlcyA9IFtdO1xuXG4gICAgICAgIGNvbnN0IHByb2plY3RlZEFuY2hvciA9IHRoaXMucHJvamVjdEFuY2hvcihwb3NNYXRyaXgsIHN5bWJvbC5hbmNob3JYLCBzeW1ib2wuYW5jaG9yWSk7XG5cbiAgICAgICAgY29uc3QgcHJvamVjdGlvbkNhY2hlID0ge307XG4gICAgICAgIGNvbnN0IGZvbnRTY2FsZSA9IGZvbnRTaXplIC8gMjQ7XG4gICAgICAgIGNvbnN0IGxpbmVPZmZzZXRYID0gc3ltYm9sLmxpbmVPZmZzZXRYICogZm9udFNpemU7XG4gICAgICAgIGNvbnN0IGxpbmVPZmZzZXRZID0gc3ltYm9sLmxpbmVPZmZzZXRZICogZm9udFNpemU7XG5cbiAgICAgICAgY29uc3QgdGlsZVVuaXRBbmNob3JQb2ludCA9IG5ldyBQb2ludChzeW1ib2wuYW5jaG9yWCwgc3ltYm9sLmFuY2hvclkpO1xuICAgICAgICAvLyBwcm9qZWN0aW9uLnByb2plY3QgZ2VuZXJhdGVzIE5EQyBjb29yZGluYXRlcywgYXMgb3Bwb3NlZCB0byB0aGVcbiAgICAgICAgLy8gcGl4ZWwtYmFzZWQgZ3JpZCBjb29yZGluYXRlcyBnZW5lcmF0ZWQgYnkgdGhpcy5wcm9qZWN0UG9pbnRcbiAgICAgICAgY29uc3QgbGFiZWxQbGFuZUFuY2hvclBvaW50ID1cbiAgICAgICAgICAgIHByb2plY3Rpb24ucHJvamVjdCh0aWxlVW5pdEFuY2hvclBvaW50LCBsYWJlbFBsYW5lTWF0cml4KS5wb2ludDtcbiAgICAgICAgY29uc3QgZmlyc3RBbmRMYXN0R2x5cGggPSBwcm9qZWN0aW9uLnBsYWNlRmlyc3RBbmRMYXN0R2x5cGgoXG4gICAgICAgICAgICBmb250U2NhbGUsXG4gICAgICAgICAgICBnbHlwaE9mZnNldEFycmF5LFxuICAgICAgICAgICAgbGluZU9mZnNldFgsXG4gICAgICAgICAgICBsaW5lT2Zmc2V0WSxcbiAgICAgICAgICAgIC8qZmxpcCovIGZhbHNlLFxuICAgICAgICAgICAgbGFiZWxQbGFuZUFuY2hvclBvaW50LFxuICAgICAgICAgICAgdGlsZVVuaXRBbmNob3JQb2ludCxcbiAgICAgICAgICAgIHN5bWJvbCxcbiAgICAgICAgICAgIGxpbmVWZXJ0ZXhBcnJheSxcbiAgICAgICAgICAgIGxhYmVsUGxhbmVNYXRyaXgsXG4gICAgICAgICAgICBwcm9qZWN0aW9uQ2FjaGUsXG4gICAgICAgICAgICAvKnJldHVybiB0aWxlIGRpc3RhbmNlKi8gdHJ1ZSk7XG5cbiAgICAgICAgbGV0IGNvbGxpc2lvbkRldGVjdGVkID0gZmFsc2U7XG4gICAgICAgIGxldCBpbkdyaWQgPSBmYWxzZTtcbiAgICAgICAgbGV0IGVudGlyZWx5T2Zmc2NyZWVuID0gdHJ1ZTtcblxuICAgICAgICBjb25zdCB0aWxlVG9WaWV3cG9ydCA9IHByb2plY3RlZEFuY2hvci5wZXJzcGVjdGl2ZVJhdGlvICogdGV4dFBpeGVsUmF0aW87XG4gICAgICAgIC8vIHBpeGVsc1RvVGlsZVVuaXRzIGlzIHVzZWQgZm9yIHRyYW5zbGF0aW5nIGxpbmUgZ2VvbWV0cnkgdG8gdGlsZSB1bml0c1xuICAgICAgICAvLyAuLi4gc28gd2UgY2FyZSBhYm91dCAnc2NhbGUnIGJ1dCBub3QgJ3BlcnNwZWN0aXZlUmF0aW8nXG4gICAgICAgIC8vIGVxdWl2YWxlbnQgdG8gcGl4ZWxfdG9fdGlsZV91bml0c1xuICAgICAgICBjb25zdCBwaXhlbHNUb1RpbGVVbml0cyA9IDEgLyAodGV4dFBpeGVsUmF0aW8gKiBzY2FsZSk7XG5cbiAgICAgICAgbGV0IGZpcnN0VGlsZURpc3RhbmNlID0gMCwgbGFzdFRpbGVEaXN0YW5jZSA9IDA7XG4gICAgICAgIGlmIChmaXJzdEFuZExhc3RHbHlwaCkge1xuICAgICAgICAgICAgZmlyc3RUaWxlRGlzdGFuY2UgPSB0aGlzLmFwcHJveGltYXRlVGlsZURpc3RhbmNlKGZpcnN0QW5kTGFzdEdseXBoLmZpcnN0LnRpbGVEaXN0YW5jZSwgZmlyc3RBbmRMYXN0R2x5cGguZmlyc3QuYW5nbGUsIHBpeGVsc1RvVGlsZVVuaXRzLCBwcm9qZWN0ZWRBbmNob3IuY2FtZXJhRGlzdGFuY2UsIHBpdGNoV2l0aE1hcCk7XG4gICAgICAgICAgICBsYXN0VGlsZURpc3RhbmNlID0gdGhpcy5hcHByb3hpbWF0ZVRpbGVEaXN0YW5jZShmaXJzdEFuZExhc3RHbHlwaC5sYXN0LnRpbGVEaXN0YW5jZSwgZmlyc3RBbmRMYXN0R2x5cGgubGFzdC5hbmdsZSwgcGl4ZWxzVG9UaWxlVW5pdHMsIHByb2plY3RlZEFuY2hvci5jYW1lcmFEaXN0YW5jZSwgcGl0Y2hXaXRoTWFwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgY29sbGlzaW9uQ2lyY2xlcy5sZW5ndGg7IGsgKz0gNSkge1xuICAgICAgICAgICAgY29uc3QgYW5jaG9yUG9pbnRYID0gY29sbGlzaW9uQ2lyY2xlc1trXTtcbiAgICAgICAgICAgIGNvbnN0IGFuY2hvclBvaW50WSA9IGNvbGxpc2lvbkNpcmNsZXNbayArIDFdO1xuICAgICAgICAgICAgY29uc3QgdGlsZVVuaXRSYWRpdXMgPSBjb2xsaXNpb25DaXJjbGVzW2sgKyAyXTtcbiAgICAgICAgICAgIGNvbnN0IGJveFNpZ25lZERpc3RhbmNlRnJvbUFuY2hvciA9IGNvbGxpc2lvbkNpcmNsZXNbayArIDNdO1xuICAgICAgICAgICAgaWYgKCFmaXJzdEFuZExhc3RHbHlwaCB8fFxuICAgICAgICAgICAgICAgIChib3hTaWduZWREaXN0YW5jZUZyb21BbmNob3IgPCAtZmlyc3RUaWxlRGlzdGFuY2UpIHx8XG4gICAgICAgICAgICAgICAgKGJveFNpZ25lZERpc3RhbmNlRnJvbUFuY2hvciA+IGxhc3RUaWxlRGlzdGFuY2UpKSB7XG4gICAgICAgICAgICAgICAgLy8gVGhlIGxhYmVsIGVpdGhlciBkb2Vzbid0IGZpdCBvbiBpdHMgbGluZSBvciB3ZVxuICAgICAgICAgICAgICAgIC8vIGRvbid0IG5lZWQgdG8gdXNlIHRoaXMgY2lyY2xlIGJlY2F1c2UgdGhlIGxhYmVsXG4gICAgICAgICAgICAgICAgLy8gZG9lc24ndCBleHRlbmQgdGhpcyBmYXIuIEVpdGhlciB3YXksIG1hcmsgdGhlIGNpcmNsZSB1bnVzZWQuXG4gICAgICAgICAgICAgICAgbWFya0NvbGxpc2lvbkNpcmNsZVVzZWQoY29sbGlzaW9uQ2lyY2xlcywgaywgZmFsc2UpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBwcm9qZWN0ZWRQb2ludCA9IHRoaXMucHJvamVjdFBvaW50KHBvc01hdHJpeCwgYW5jaG9yUG9pbnRYLCBhbmNob3JQb2ludFkpO1xuICAgICAgICAgICAgY29uc3QgcmFkaXVzID0gdGlsZVVuaXRSYWRpdXMgKiB0aWxlVG9WaWV3cG9ydDtcblxuICAgICAgICAgICAgY29uc3QgYXRMZWFzdE9uZUNpcmNsZVBsYWNlZCA9IHBsYWNlZENvbGxpc2lvbkNpcmNsZXMubGVuZ3RoID4gMDtcbiAgICAgICAgICAgIGlmIChhdExlYXN0T25lQ2lyY2xlUGxhY2VkKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZHggPSBwcm9qZWN0ZWRQb2ludC54IC0gcGxhY2VkQ29sbGlzaW9uQ2lyY2xlc1twbGFjZWRDb2xsaXNpb25DaXJjbGVzLmxlbmd0aCAtIDRdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGR5ID0gcHJvamVjdGVkUG9pbnQueSAtIHBsYWNlZENvbGxpc2lvbkNpcmNsZXNbcGxhY2VkQ29sbGlzaW9uQ2lyY2xlcy5sZW5ndGggLSAzXTtcbiAgICAgICAgICAgICAgICAvLyBUaGUgY2lyY2xlIGVkZ2VzIHRvdWNoIHdoZW4gdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlaXIgY2VudGVycyBpcyAyeCB0aGUgcmFkaXVzXG4gICAgICAgICAgICAgICAgLy8gV2hlbiB0aGUgZGlzdGFuY2UgaXMgMXggdGhlIHJhZGl1cywgdGhleSdyZSBkb3VibGVkIHVwLCBhbmQgd2UgY291bGQgcmVtb3ZlXG4gICAgICAgICAgICAgICAgLy8gZXZlcnkgb3RoZXIgY2lyY2xlIHdoaWxlIGtlZXBpbmcgdGhlbSBhbGwgaW4gdG91Y2guXG4gICAgICAgICAgICAgICAgLy8gV2UgYWN0dWFsbHkgc3RhcnQgcmVtb3ZpbmcgY2lyY2xlcyB3aGVuIHRoZSBkaXN0YW5jZSBpcyDDosKIwpoyeCB0aGUgcmFkaXVzOlxuICAgICAgICAgICAgICAgIC8vICB0aGlubmluZyB0aGUgbnVtYmVyIG9mIGNpcmNsZXMgYXMgbXVjaCBhcyBwb3NzaWJsZSBpcyBhIG1ham9yIHBlcmZvcm1hbmNlIHdpbixcbiAgICAgICAgICAgICAgICAvLyAgYW5kIHRoZSBzbWFsbCBnYXBzIGludHJvZHVjZWQgZG9uJ3QgbWFrZSBhIHZlcnkgbm90aWNlYWJsZSBkaWZmZXJlbmNlLlxuICAgICAgICAgICAgICAgIGNvbnN0IHBsYWNlZFRvb0RlbnNlbHkgPSByYWRpdXMgKiByYWRpdXMgKiAyID4gZHggKiBkeCArIGR5ICogZHk7XG4gICAgICAgICAgICAgICAgaWYgKHBsYWNlZFRvb0RlbnNlbHkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYXRMZWFzdE9uZU1vcmVDaXJjbGUgPSAoayArIDgpIDwgY29sbGlzaW9uQ2lyY2xlcy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhdExlYXN0T25lTW9yZUNpcmNsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV4dEJveERpc3RhbmNlVG9BbmNob3IgPSBjb2xsaXNpb25DaXJjbGVzW2sgKyA4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgobmV4dEJveERpc3RhbmNlVG9BbmNob3IgPiAtZmlyc3RUaWxlRGlzdGFuY2UpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAobmV4dEJveERpc3RhbmNlVG9BbmNob3IgPCBsYXN0VGlsZURpc3RhbmNlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhpZGUgc2lnbmlmaWNhbnRseSBvdmVybGFwcGluZyBjaXJjbGVzLCB1bmxlc3MgdGhpcyBpcyB0aGUgbGFzdCBvbmUgd2UgY2FuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXNlLCBpbiB3aGljaCBjYXNlIHdlIHdhbnQgdG8ga2VlcCBpdCBpbiBwbGFjZSBldmVuIGlmIGl0J3MgdGlnaHRseSBwYWNrZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aXRoIHRoZSBvbmUgYmVmb3JlIGl0LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtDb2xsaXNpb25DaXJjbGVVc2VkKGNvbGxpc2lvbkNpcmNsZXMsIGssIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGNvbGxpc2lvbkJveEFycmF5SW5kZXggPSBrIC8gNTtcbiAgICAgICAgICAgIHBsYWNlZENvbGxpc2lvbkNpcmNsZXMucHVzaChwcm9qZWN0ZWRQb2ludC54LCBwcm9qZWN0ZWRQb2ludC55LCByYWRpdXMsIGNvbGxpc2lvbkJveEFycmF5SW5kZXgpO1xuICAgICAgICAgICAgbWFya0NvbGxpc2lvbkNpcmNsZVVzZWQoY29sbGlzaW9uQ2lyY2xlcywgaywgdHJ1ZSk7XG5cbiAgICAgICAgICAgIGNvbnN0IHgxID0gcHJvamVjdGVkUG9pbnQueCAtIHJhZGl1cztcbiAgICAgICAgICAgIGNvbnN0IHkxID0gcHJvamVjdGVkUG9pbnQueSAtIHJhZGl1cztcbiAgICAgICAgICAgIGNvbnN0IHgyID0gcHJvamVjdGVkUG9pbnQueCArIHJhZGl1cztcbiAgICAgICAgICAgIGNvbnN0IHkyID0gcHJvamVjdGVkUG9pbnQueSArIHJhZGl1cztcbiAgICAgICAgICAgIGVudGlyZWx5T2Zmc2NyZWVuID0gZW50aXJlbHlPZmZzY3JlZW4gJiYgdGhpcy5pc09mZnNjcmVlbih4MSwgeTEsIHgyLCB5Mik7XG4gICAgICAgICAgICBpbkdyaWQgPSBpbkdyaWQgfHwgdGhpcy5pc0luc2lkZUdyaWQoeDEsIHkxLCB4MiwgeTIpO1xuXG4gICAgICAgICAgICBpZiAoIWFsbG93T3ZlcmxhcCkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmdyaWQuaGl0VGVzdENpcmNsZShwcm9qZWN0ZWRQb2ludC54LCBwcm9qZWN0ZWRQb2ludC55LCByYWRpdXMsIGNvbGxpc2lvbkdyb3VwUHJlZGljYXRlKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXNob3dDb2xsaXNpb25DaXJjbGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNpcmNsZXM6IFtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNjcmVlbjogZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBEb24ndCBlYXJseSBleGl0IGlmIHdlJ3JlIHNob3dpbmcgdGhlIGRlYnVnIGNpcmNsZXMgYmVjYXVzZSB3ZSBzdGlsbCB3YW50IHRvIGNhbGN1bGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hpY2ggY2lyY2xlcyBhcmUgaW4gdXNlXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xsaXNpb25EZXRlY3RlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY2lyY2xlczogKGNvbGxpc2lvbkRldGVjdGVkIHx8ICFpbkdyaWQpID8gW10gOiBwbGFjZWRDb2xsaXNpb25DaXJjbGVzLFxuICAgICAgICAgICAgb2Zmc2NyZWVuOiBlbnRpcmVseU9mZnNjcmVlblxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEJlY2F1c2UgdGhlIGdlb21ldHJpZXMgaW4gdGhlIENvbGxpc2lvbkluZGV4IGFyZSBhbiBhcHByb3hpbWF0aW9uIG9mIHRoZSBzaGFwZSBvZlxuICAgICAqIHN5bWJvbHMgb24gdGhlIG1hcCwgd2UgdXNlIHRoZSBDb2xsaXNpb25JbmRleCB0byBsb29rIHVwIHRoZSBzeW1ib2wgcGFydCBvZlxuICAgICAqIGBxdWVyeVJlbmRlcmVkRmVhdHVyZXNgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBxdWVyeVJlbmRlcmVkU3ltYm9scyh2aWV3cG9ydFF1ZXJ5R2VvbWV0cnk6IEFycmF5PFBvaW50Pikge1xuICAgICAgICBpZiAodmlld3BvcnRRdWVyeUdlb21ldHJ5Lmxlbmd0aCA9PT0gMCB8fCAodGhpcy5ncmlkLmtleXNMZW5ndGgoKSA9PT0gMCAmJiB0aGlzLmlnbm9yZWRHcmlkLmtleXNMZW5ndGgoKSA9PT0gMCkpIHtcbiAgICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gW107XG4gICAgICAgIGxldCBtaW5YID0gSW5maW5pdHk7XG4gICAgICAgIGxldCBtaW5ZID0gSW5maW5pdHk7XG4gICAgICAgIGxldCBtYXhYID0gLUluZmluaXR5O1xuICAgICAgICBsZXQgbWF4WSA9IC1JbmZpbml0eTtcbiAgICAgICAgZm9yIChjb25zdCBwb2ludCBvZiB2aWV3cG9ydFF1ZXJ5R2VvbWV0cnkpIHtcbiAgICAgICAgICAgIGNvbnN0IGdyaWRQb2ludCA9IG5ldyBQb2ludChwb2ludC54ICsgdmlld3BvcnRQYWRkaW5nLCBwb2ludC55ICsgdmlld3BvcnRQYWRkaW5nKTtcbiAgICAgICAgICAgIG1pblggPSBNYXRoLm1pbihtaW5YLCBncmlkUG9pbnQueCk7XG4gICAgICAgICAgICBtaW5ZID0gTWF0aC5taW4obWluWSwgZ3JpZFBvaW50LnkpO1xuICAgICAgICAgICAgbWF4WCA9IE1hdGgubWF4KG1heFgsIGdyaWRQb2ludC54KTtcbiAgICAgICAgICAgIG1heFkgPSBNYXRoLm1heChtYXhZLCBncmlkUG9pbnQueSk7XG4gICAgICAgICAgICBxdWVyeS5wdXNoKGdyaWRQb2ludCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmZWF0dXJlcyA9IHRoaXMuZ3JpZC5xdWVyeShtaW5YLCBtaW5ZLCBtYXhYLCBtYXhZKVxuICAgICAgICAgICAgLmNvbmNhdCh0aGlzLmlnbm9yZWRHcmlkLnF1ZXJ5KG1pblgsIG1pblksIG1heFgsIG1heFkpKTtcblxuICAgICAgICBjb25zdCBzZWVuRmVhdHVyZXMgPSB7fTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0ge307XG5cbiAgICAgICAgZm9yIChjb25zdCBmZWF0dXJlIG9mIGZlYXR1cmVzKSB7XG4gICAgICAgICAgICBjb25zdCBmZWF0dXJlS2V5ID0gZmVhdHVyZS5rZXk7XG4gICAgICAgICAgICAvLyBTa2lwIGFscmVhZHkgc2VlbiBmZWF0dXJlcy5cbiAgICAgICAgICAgIGlmIChzZWVuRmVhdHVyZXNbZmVhdHVyZUtleS5idWNrZXRJbnN0YW5jZUlkXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgc2VlbkZlYXR1cmVzW2ZlYXR1cmVLZXkuYnVja2V0SW5zdGFuY2VJZF0gPSB7fTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzZWVuRmVhdHVyZXNbZmVhdHVyZUtleS5idWNrZXRJbnN0YW5jZUlkXVtmZWF0dXJlS2V5LmZlYXR1cmVJbmRleF0pIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgcXVlcnkgaW50ZXJzZWN0cyB3aXRoIHRoZSBmZWF0dXJlIGJveFxuICAgICAgICAgICAgLy8gXCJDb2xsaXNpb24gQ2lyY2xlc1wiIGZvciBsaW5lIGxhYmVscyBhcmUgdHJlYXRlZCBhcyBib3hlcyBoZXJlXG4gICAgICAgICAgICAvLyBTaW5jZSB0aGVyZSdzIG5vIGFjdHVhbCBjb2xsaXNpb24gdGFraW5nIHBsYWNlLCB0aGUgY2lyY2xlIHZzLiBzcXVhcmVcbiAgICAgICAgICAgIC8vIGRpc3RpbmN0aW9uIGRvZXNuJ3QgbWF0dGVyIGFzIG11Y2gsIGFuZCBib3ggZ2VvbWV0cnkgaXMgZWFzaWVyXG4gICAgICAgICAgICAvLyB0byB3b3JrIHdpdGguXG4gICAgICAgICAgICBjb25zdCBiYm94ID0gW1xuICAgICAgICAgICAgICAgIG5ldyBQb2ludChmZWF0dXJlLngxLCBmZWF0dXJlLnkxKSxcbiAgICAgICAgICAgICAgICBuZXcgUG9pbnQoZmVhdHVyZS54MiwgZmVhdHVyZS55MSksXG4gICAgICAgICAgICAgICAgbmV3IFBvaW50KGZlYXR1cmUueDIsIGZlYXR1cmUueTIpLFxuICAgICAgICAgICAgICAgIG5ldyBQb2ludChmZWF0dXJlLngxLCBmZWF0dXJlLnkyKVxuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGlmICghaW50ZXJzZWN0aW9uVGVzdHMucG9seWdvbkludGVyc2VjdHNQb2x5Z29uKHF1ZXJ5LCBiYm94KSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzZWVuRmVhdHVyZXNbZmVhdHVyZUtleS5idWNrZXRJbnN0YW5jZUlkXVtmZWF0dXJlS2V5LmZlYXR1cmVJbmRleF0gPSB0cnVlO1xuICAgICAgICAgICAgaWYgKHJlc3VsdFtmZWF0dXJlS2V5LmJ1Y2tldEluc3RhbmNlSWRdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXN1bHRbZmVhdHVyZUtleS5idWNrZXRJbnN0YW5jZUlkXSA9IFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzdWx0W2ZlYXR1cmVLZXkuYnVja2V0SW5zdGFuY2VJZF0ucHVzaChmZWF0dXJlS2V5LmZlYXR1cmVJbmRleCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGluc2VydENvbGxpc2lvbkJveChjb2xsaXNpb25Cb3g6IEFycmF5PG51bWJlcj4sIGlnbm9yZVBsYWNlbWVudDogYm9vbGVhbiwgYnVja2V0SW5zdGFuY2VJZDogbnVtYmVyLCBmZWF0dXJlSW5kZXg6IG51bWJlciwgY29sbGlzaW9uR3JvdXBJRDogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IGdyaWQgPSBpZ25vcmVQbGFjZW1lbnQgPyB0aGlzLmlnbm9yZWRHcmlkIDogdGhpcy5ncmlkO1xuXG4gICAgICAgIGNvbnN0IGtleSA9IHsgYnVja2V0SW5zdGFuY2VJZCwgZmVhdHVyZUluZGV4LCBjb2xsaXNpb25Hcm91cElEIH07XG4gICAgICAgIGdyaWQuaW5zZXJ0KGtleSwgY29sbGlzaW9uQm94WzBdLCBjb2xsaXNpb25Cb3hbMV0sIGNvbGxpc2lvbkJveFsyXSwgY29sbGlzaW9uQm94WzNdKTtcbiAgICB9XG5cbiAgICBpbnNlcnRDb2xsaXNpb25DaXJjbGVzKGNvbGxpc2lvbkNpcmNsZXM6IEFycmF5PG51bWJlcj4sIGlnbm9yZVBsYWNlbWVudDogYm9vbGVhbiwgYnVja2V0SW5zdGFuY2VJZDogbnVtYmVyLCBmZWF0dXJlSW5kZXg6IG51bWJlciwgY29sbGlzaW9uR3JvdXBJRDogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IGdyaWQgPSBpZ25vcmVQbGFjZW1lbnQgPyB0aGlzLmlnbm9yZWRHcmlkIDogdGhpcy5ncmlkO1xuXG4gICAgICAgIGNvbnN0IGtleSA9IHsgYnVja2V0SW5zdGFuY2VJZCwgZmVhdHVyZUluZGV4LCBjb2xsaXNpb25Hcm91cElEIH07XG4gICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgY29sbGlzaW9uQ2lyY2xlcy5sZW5ndGg7IGsgKz0gNCkge1xuICAgICAgICAgICAgZ3JpZC5pbnNlcnRDaXJjbGUoa2V5LCBjb2xsaXNpb25DaXJjbGVzW2tdLCBjb2xsaXNpb25DaXJjbGVzW2sgKyAxXSwgY29sbGlzaW9uQ2lyY2xlc1trICsgMl0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvamVjdEFuY2hvcihwb3NNYXRyaXg6IG1hdDQsIHg6IG51bWJlciwgeTogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IHAgPSBbeCwgeSwgMCwgMV07XG4gICAgICAgIHByb2plY3Rpb24ueHlUcmFuc2Zvcm1NYXQ0KHAsIHAsIHBvc01hdHJpeCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBwZXJzcGVjdGl2ZVJhdGlvOiAwLjUgKyAwLjUgKiAodGhpcy50cmFuc2Zvcm0uY2FtZXJhVG9DZW50ZXJEaXN0YW5jZSAvIHBbM10pLFxuICAgICAgICAgICAgY2FtZXJhRGlzdGFuY2U6IHBbM11cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcm9qZWN0UG9pbnQocG9zTWF0cml4OiBtYXQ0LCB4OiBudW1iZXIsIHk6IG51bWJlcikge1xuICAgICAgICBjb25zdCBwID0gW3gsIHksIDAsIDFdO1xuICAgICAgICBwcm9qZWN0aW9uLnh5VHJhbnNmb3JtTWF0NChwLCBwLCBwb3NNYXRyaXgpO1xuICAgICAgICByZXR1cm4gbmV3IFBvaW50KFxuICAgICAgICAgICAgKCgocFswXSAvIHBbM10gKyAxKSAvIDIpICogdGhpcy50cmFuc2Zvcm0ud2lkdGgpICsgdmlld3BvcnRQYWRkaW5nLFxuICAgICAgICAgICAgKCgoLXBbMV0gLyBwWzNdICsgMSkgLyAyKSAqIHRoaXMudHJhbnNmb3JtLmhlaWdodCkgKyB2aWV3cG9ydFBhZGRpbmdcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcm9qZWN0QW5kR2V0UGVyc3BlY3RpdmVSYXRpbyhwb3NNYXRyaXg6IG1hdDQsIHg6IG51bWJlciwgeTogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IHAgPSBbeCwgeSwgMCwgMV07XG4gICAgICAgIHByb2plY3Rpb24ueHlUcmFuc2Zvcm1NYXQ0KHAsIHAsIHBvc01hdHJpeCk7XG4gICAgICAgIGNvbnN0IGEgPSBuZXcgUG9pbnQoXG4gICAgICAgICAgICAoKChwWzBdIC8gcFszXSArIDEpIC8gMikgKiB0aGlzLnRyYW5zZm9ybS53aWR0aCkgKyB2aWV3cG9ydFBhZGRpbmcsXG4gICAgICAgICAgICAoKCgtcFsxXSAvIHBbM10gKyAxKSAvIDIpICogdGhpcy50cmFuc2Zvcm0uaGVpZ2h0KSArIHZpZXdwb3J0UGFkZGluZ1xuICAgICAgICApO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcG9pbnQ6IGEsXG4gICAgICAgICAgICAvLyBTZWUgcGVyc3BlY3RpdmUgcmF0aW8gY29tbWVudCBpbiBzeW1ib2xfc2RmLnZlcnRleFxuICAgICAgICAgICAgLy8gV2UncmUgZG9pbmcgY29sbGlzaW9uIGRldGVjdGlvbiBpbiB2aWV3cG9ydCBzcGFjZSBzbyB3ZSBuZWVkXG4gICAgICAgICAgICAvLyB0byBzY2FsZSBkb3duIGJveGVzIGluIHRoZSBkaXN0YW5jZVxuICAgICAgICAgICAgcGVyc3BlY3RpdmVSYXRpbzogMC41ICsgMC41ICogKHRoaXMudHJhbnNmb3JtLmNhbWVyYVRvQ2VudGVyRGlzdGFuY2UgLyBwWzNdKVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGlzT2Zmc2NyZWVuKHgxOiBudW1iZXIsIHkxOiBudW1iZXIsIHgyOiBudW1iZXIsIHkyOiBudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIHgyIDwgdmlld3BvcnRQYWRkaW5nIHx8IHgxID49IHRoaXMuc2NyZWVuUmlnaHRCb3VuZGFyeSB8fCB5MiA8IHZpZXdwb3J0UGFkZGluZyB8fCB5MSA+IHRoaXMuc2NyZWVuQm90dG9tQm91bmRhcnk7XG4gICAgfVxuXG4gICAgaXNJbnNpZGVHcmlkKHgxOiBudW1iZXIsIHkxOiBudW1iZXIsIHgyOiBudW1iZXIsIHkyOiBudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIHgyID49IDAgJiYgeDEgPCB0aGlzLmdyaWRSaWdodEJvdW5kYXJ5ICYmIHkyID49IDAgJiYgeTEgPCB0aGlzLmdyaWRCb3R0b21Cb3VuZGFyeTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIG1hcmtDb2xsaXNpb25DaXJjbGVVc2VkKGNvbGxpc2lvbkNpcmNsZXM6IEFycmF5PG51bWJlcj4sIGluZGV4OiBudW1iZXIsIHVzZWQ6IGJvb2xlYW4pIHtcbiAgICBjb2xsaXNpb25DaXJjbGVzW2luZGV4ICsgNF0gPSB1c2VkID8gMSA6IDA7XG59XG5cbmV4cG9ydCBkZWZhdWx0IENvbGxpc2lvbkluZGV4O1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IEVYVEVOVCBmcm9tICcuLi9kYXRhL2V4dGVudCc7XG5cbmltcG9ydCB0eXBlIHtPdmVyc2NhbGVkVGlsZUlEfSBmcm9tICcuL3RpbGVfaWQnO1xuXG4vKipcbiAqIENvbnZlcnRzIGEgcGl4ZWwgdmFsdWUgYXQgYSB0aGUgZ2l2ZW4gem9vbSBsZXZlbCB0byB0aWxlIHVuaXRzLlxuICpcbiAqIFRoZSBzaGFkZXJzIG1vc3RseSBjYWxjdWxhdGUgZXZlcnl0aGluZyBpbiB0aWxlIHVuaXRzIHNvIHN0eWxlXG4gKiBwcm9wZXJ0aWVzIG5lZWQgdG8gYmUgY29udmVydGVkIGZyb20gcGl4ZWxzIHRvIHRpbGUgdW5pdHMgdXNpbmcgdGhpcy5cbiAqXG4gKiBGb3IgZXhhbXBsZSwgYSB0cmFuc2xhdGlvbiBieSAzMCBwaXhlbHMgYXQgem9vbSA2LjUgd2lsbCBiZSBhXG4gKiB0cmFuc2xhdGlvbiBieSBwaXhlbHNUb1RpbGVVbml0cygzMCwgNi41KSB0aWxlIHVuaXRzLlxuICpcbiAqIEByZXR1cm5zIHZhbHVlIGluIHRpbGUgdW5pdHNcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHRpbGU6IHt0aWxlSUQ6IE92ZXJzY2FsZWRUaWxlSUQsIHRpbGVTaXplOiBudW1iZXJ9LCBwaXhlbFZhbHVlOiBudW1iZXIsIHo6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIHBpeGVsVmFsdWUgKiAoRVhURU5UIC8gKHRpbGUudGlsZVNpemUgKiBNYXRoLnBvdygyLCB6IC0gdGlsZS50aWxlSUQub3ZlcnNjYWxlZFopKSk7XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgQ29sbGlzaW9uSW5kZXggZnJvbSAnLi9jb2xsaXNpb25faW5kZXgnO1xuaW1wb3J0IEVYVEVOVCBmcm9tICcuLi9kYXRhL2V4dGVudCc7XG5pbXBvcnQgKiBhcyBzeW1ib2xTaXplIGZyb20gJy4vc3ltYm9sX3NpemUnO1xuaW1wb3J0ICogYXMgcHJvamVjdGlvbiBmcm9tICcuL3Byb2plY3Rpb24nO1xuaW1wb3J0IHsgZ2V0QW5jaG9ySnVzdGlmaWNhdGlvbiwgZXZhbHVhdGVSYWRpYWxPZmZzZXQgfSBmcm9tICcuL3N5bWJvbF9sYXlvdXQnO1xuaW1wb3J0IHsgZ2V0QW5jaG9yQWxpZ25tZW50IH0gZnJvbSAnLi9zaGFwaW5nJztcbmltcG9ydCBzeW1ib2xMYXllclByb3BlcnRpZXMgZnJvbSAnLi4vc3R5bGUvc3R5bGVfbGF5ZXIvc3ltYm9sX3N0eWxlX2xheWVyX3Byb3BlcnRpZXMnO1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHBpeGVsc1RvVGlsZVVuaXRzIGZyb20gJy4uL3NvdXJjZS9waXhlbHNfdG9fdGlsZV91bml0cyc7XG5pbXBvcnQgUG9pbnQgZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XG5pbXBvcnQgdHlwZSBUcmFuc2Zvcm0gZnJvbSAnLi4vZ2VvL3RyYW5zZm9ybSc7XG5pbXBvcnQgdHlwZSBTdHlsZUxheWVyIGZyb20gJy4uL3N0eWxlL3N0eWxlX2xheWVyJztcblxuaW1wb3J0IHR5cGUgVGlsZSBmcm9tICcuLi9zb3VyY2UvdGlsZSc7XG5pbXBvcnQgdHlwZSBTeW1ib2xCdWNrZXQsIHsgU2luZ2xlQ29sbGlzaW9uQm94IH0gZnJvbSAnLi4vZGF0YS9idWNrZXQvc3ltYm9sX2J1Y2tldCc7XG5pbXBvcnQgdHlwZSB7bWF0NH0gZnJvbSAnZ2wtbWF0cml4JztcbmltcG9ydCB0eXBlIHtDb2xsaXNpb25Cb3hBcnJheSwgQ29sbGlzaW9uVmVydGV4QXJyYXksIFN5bWJvbEluc3RhbmNlfSBmcm9tICcuLi9kYXRhL2FycmF5X3R5cGVzJztcbmltcG9ydCB0eXBlIEZlYXR1cmVJbmRleCBmcm9tICcuLi9kYXRhL2ZlYXR1cmVfaW5kZXgnO1xuaW1wb3J0IHR5cGUge092ZXJzY2FsZWRUaWxlSUR9IGZyb20gJy4uL3NvdXJjZS90aWxlX2lkJztcbmltcG9ydCB0eXBlIHtUZXh0QW5jaG9yfSBmcm9tICcuL3N5bWJvbF9sYXlvdXQnO1xuXG5jbGFzcyBPcGFjaXR5U3RhdGUge1xuICAgIG9wYWNpdHk6IG51bWJlcjtcbiAgICBwbGFjZWQ6IGJvb2xlYW47XG4gICAgY29uc3RydWN0b3IocHJldlN0YXRlOiA/T3BhY2l0eVN0YXRlLCBpbmNyZW1lbnQ6IG51bWJlciwgcGxhY2VkOiBib29sZWFuLCBza2lwRmFkZTogP2Jvb2xlYW4pIHtcbiAgICAgICAgaWYgKHByZXZTdGF0ZSkge1xuICAgICAgICAgICAgdGhpcy5vcGFjaXR5ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgcHJldlN0YXRlLm9wYWNpdHkgKyAocHJldlN0YXRlLnBsYWNlZCA/IGluY3JlbWVudCA6IC1pbmNyZW1lbnQpKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm9wYWNpdHkgPSAoc2tpcEZhZGUgJiYgcGxhY2VkKSA/IDEgOiAwO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucGxhY2VkID0gcGxhY2VkO1xuICAgIH1cbiAgICBpc0hpZGRlbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3BhY2l0eSA9PT0gMCAmJiAhdGhpcy5wbGFjZWQ7XG4gICAgfVxufVxuXG5jbGFzcyBKb2ludE9wYWNpdHlTdGF0ZSB7XG4gICAgdGV4dDogT3BhY2l0eVN0YXRlO1xuICAgIGljb246IE9wYWNpdHlTdGF0ZTtcbiAgICBjb25zdHJ1Y3RvcihwcmV2U3RhdGU6ID9Kb2ludE9wYWNpdHlTdGF0ZSwgaW5jcmVtZW50OiBudW1iZXIsIHBsYWNlZFRleHQ6IGJvb2xlYW4sIHBsYWNlZEljb246IGJvb2xlYW4sIHNraXBGYWRlOiA/Ym9vbGVhbikge1xuICAgICAgICB0aGlzLnRleHQgPSBuZXcgT3BhY2l0eVN0YXRlKHByZXZTdGF0ZSA/IHByZXZTdGF0ZS50ZXh0IDogbnVsbCwgaW5jcmVtZW50LCBwbGFjZWRUZXh0LCBza2lwRmFkZSk7XG4gICAgICAgIHRoaXMuaWNvbiA9IG5ldyBPcGFjaXR5U3RhdGUocHJldlN0YXRlID8gcHJldlN0YXRlLmljb24gOiBudWxsLCBpbmNyZW1lbnQsIHBsYWNlZEljb24sIHNraXBGYWRlKTtcbiAgICB9XG4gICAgaXNIaWRkZW4oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRleHQuaXNIaWRkZW4oKSAmJiB0aGlzLmljb24uaXNIaWRkZW4oKTtcbiAgICB9XG59XG5cbmNsYXNzIEpvaW50UGxhY2VtZW50IHtcbiAgICB0ZXh0OiBib29sZWFuO1xuICAgIGljb246IGJvb2xlYW47XG4gICAgLy8gc2tpcEZhZGUgPSBvdXRzaWRlIHZpZXdwb3J0LCBidXQgd2l0aGluIENvbGxpc2lvbkluZGV4Ojp2aWV3cG9ydFBhZGRpbmcgcHggb2YgdGhlIGVkZ2VcbiAgICAvLyBCZWNhdXNlIHRoZXNlIHN5bWJvbHMgYXJlbid0IG9uc2NyZWVuIHlldCwgd2UgY2FuIHNraXAgdGhlIFwiZmFkZSBpblwiIGFuaW1hdGlvbixcbiAgICAvLyBhbmQgaWYgYSBzdWJzZXF1ZW50IHZpZXdwb3J0IGNoYW5nZSBicmluZ3MgdGhlbSBpbnRvIHZpZXcsIHRoZXknbGwgYmUgZnVsbHlcbiAgICAvLyB2aXNpYmxlIHJpZ2h0IGF3YXkuXG4gICAgc2tpcEZhZGU6IGJvb2xlYW47XG4gICAgY29uc3RydWN0b3IodGV4dDogYm9vbGVhbiwgaWNvbjogYm9vbGVhbiwgc2tpcEZhZGU6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy50ZXh0ID0gdGV4dDtcbiAgICAgICAgdGhpcy5pY29uID0gaWNvbjtcbiAgICAgICAgdGhpcy5za2lwRmFkZSA9IHNraXBGYWRlO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFJldGFpbmVkUXVlcnlEYXRhIHtcbiAgICBidWNrZXRJbnN0YW5jZUlkOiBudW1iZXI7XG4gICAgZmVhdHVyZUluZGV4OiBGZWF0dXJlSW5kZXg7XG4gICAgc291cmNlTGF5ZXJJbmRleDogbnVtYmVyO1xuICAgIGJ1Y2tldEluZGV4OiBudW1iZXI7XG4gICAgdGlsZUlEOiBPdmVyc2NhbGVkVGlsZUlEO1xuICAgIGZlYXR1cmVTb3J0T3JkZXI6ID9BcnJheTxudW1iZXI+XG4gICAgY29uc3RydWN0b3IoYnVja2V0SW5zdGFuY2VJZDogbnVtYmVyLFxuICAgICAgICAgICAgICAgIGZlYXR1cmVJbmRleDogRmVhdHVyZUluZGV4LFxuICAgICAgICAgICAgICAgIHNvdXJjZUxheWVySW5kZXg6IG51bWJlcixcbiAgICAgICAgICAgICAgICBidWNrZXRJbmRleDogbnVtYmVyLFxuICAgICAgICAgICAgICAgIHRpbGVJRDogT3ZlcnNjYWxlZFRpbGVJRCkge1xuICAgICAgICB0aGlzLmJ1Y2tldEluc3RhbmNlSWQgPSBidWNrZXRJbnN0YW5jZUlkO1xuICAgICAgICB0aGlzLmZlYXR1cmVJbmRleCA9IGZlYXR1cmVJbmRleDtcbiAgICAgICAgdGhpcy5zb3VyY2VMYXllckluZGV4ID0gc291cmNlTGF5ZXJJbmRleDtcbiAgICAgICAgdGhpcy5idWNrZXRJbmRleCA9IGJ1Y2tldEluZGV4O1xuICAgICAgICB0aGlzLnRpbGVJRCA9IHRpbGVJRDtcbiAgICB9XG59XG5cbnR5cGUgQ29sbGlzaW9uR3JvdXAgPSB7IElEOiBudW1iZXIsIHByZWRpY2F0ZT86IGFueSB9O1xuXG5jbGFzcyBDb2xsaXNpb25Hcm91cHMge1xuICAgIGNvbGxpc2lvbkdyb3Vwczoge1tncm91cE5hbWU6IHN0cmluZ106IENvbGxpc2lvbkdyb3VwfTtcbiAgICBtYXhHcm91cElEOiBudW1iZXI7XG4gICAgY3Jvc3NTb3VyY2VDb2xsaXNpb25zOiBib29sZWFuO1xuXG4gICAgY29uc3RydWN0b3IoY3Jvc3NTb3VyY2VDb2xsaXNpb25zOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuY3Jvc3NTb3VyY2VDb2xsaXNpb25zID0gY3Jvc3NTb3VyY2VDb2xsaXNpb25zO1xuICAgICAgICB0aGlzLm1heEdyb3VwSUQgPSAwO1xuICAgICAgICB0aGlzLmNvbGxpc2lvbkdyb3VwcyA9IHt9O1xuICAgIH1cblxuICAgIGdldChzb3VyY2VJRDogc3RyaW5nKSB7XG4gICAgICAgIC8vIFRoZSBwcmVkaWNhdGUvZ3JvdXBJRCBtZWNoYW5pc20gYWxsb3dzIGZvciBhcmJpdHJhcnkgZ3JvdXBpbmcsXG4gICAgICAgIC8vIGJ1dCB0aGUgY3VycmVudCBpbnRlcmZhY2UgZGVmaW5lcyBvbmUgc291cmNlID09IG9uZSBncm91cCB3aGVuXG4gICAgICAgIC8vIGNyb3NzU291cmNlQ29sbGlzaW9ucyA9PSB0cnVlLlxuICAgICAgICBpZiAoIXRoaXMuY3Jvc3NTb3VyY2VDb2xsaXNpb25zKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuY29sbGlzaW9uR3JvdXBzW3NvdXJjZUlEXSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5leHRHcm91cElEID0gKyt0aGlzLm1heEdyb3VwSUQ7XG4gICAgICAgICAgICAgICAgdGhpcy5jb2xsaXNpb25Hcm91cHNbc291cmNlSURdID0ge1xuICAgICAgICAgICAgICAgICAgICBJRDogbmV4dEdyb3VwSUQsXG4gICAgICAgICAgICAgICAgICAgIHByZWRpY2F0ZTogKGtleSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGtleS5jb2xsaXNpb25Hcm91cElEID09PSBuZXh0R3JvdXBJRDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb2xsaXNpb25Hcm91cHNbc291cmNlSURdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHsgSUQ6IDAsIHByZWRpY2F0ZTogbnVsbCB9O1xuICAgICAgICB9XG4gICAgfVxufVxuXG5cbmZ1bmN0aW9uIGNhbGN1bGF0ZVZhcmlhYmxlTGF5b3V0T2Zmc2V0KGFuY2hvcjogVGV4dEFuY2hvciwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIsIHJhZGlhbE9mZnNldDogbnVtYmVyLCB0ZXh0Qm94U2NhbGU6IG51bWJlcik6IFBvaW50IHtcbiAgICBjb25zdCB7aG9yaXpvbnRhbEFsaWduLCB2ZXJ0aWNhbEFsaWdufSA9IGdldEFuY2hvckFsaWdubWVudChhbmNob3IpO1xuICAgIGNvbnN0IHNoaWZ0WCA9IC0oaG9yaXpvbnRhbEFsaWduIC0gMC41KSAqIHdpZHRoO1xuICAgIGNvbnN0IHNoaWZ0WSA9IC0odmVydGljYWxBbGlnbiAtIDAuNSkgKiBoZWlnaHQ7XG4gICAgY29uc3Qgb2Zmc2V0ID0gZXZhbHVhdGVSYWRpYWxPZmZzZXQoYW5jaG9yLCByYWRpYWxPZmZzZXQpO1xuICAgIHJldHVybiBuZXcgUG9pbnQoXG4gICAgICAgIHNoaWZ0WCArIG9mZnNldFswXSAqIHRleHRCb3hTY2FsZSxcbiAgICAgICAgc2hpZnRZICsgb2Zmc2V0WzFdICogdGV4dEJveFNjYWxlXG4gICAgKTtcbn1cblxuZnVuY3Rpb24gc2hpZnRWYXJpYWJsZUNvbGxpc2lvbkJveChjb2xsaXNpb25Cb3g6IFNpbmdsZUNvbGxpc2lvbkJveCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGlmdFg6IG51bWJlciwgc2hpZnRZOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRlV2l0aE1hcDogYm9vbGVhbiwgcGl0Y2hXaXRoTWFwOiBib29sZWFuLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZ2xlOiBudW1iZXIpIHtcbiAgICBjb25zdCB7eDEsIHgyLCB5MSwgeTIsIGFuY2hvclBvaW50WCwgYW5jaG9yUG9pbnRZfSA9IGNvbGxpc2lvbkJveDtcbiAgICBjb25zdCByb3RhdGVkT2Zmc2V0ID0gbmV3IFBvaW50KHNoaWZ0WCwgc2hpZnRZKTtcbiAgICBpZiAocm90YXRlV2l0aE1hcCkge1xuICAgICAgICByb3RhdGVkT2Zmc2V0Ll9yb3RhdGUocGl0Y2hXaXRoTWFwID8gYW5nbGUgOiAtYW5nbGUpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICB4MTogeDEgKyByb3RhdGVkT2Zmc2V0LngsXG4gICAgICAgIHkxOiB5MSArIHJvdGF0ZWRPZmZzZXQueSxcbiAgICAgICAgeDI6IHgyICsgcm90YXRlZE9mZnNldC54LFxuICAgICAgICB5MjogeTIgKyByb3RhdGVkT2Zmc2V0LnksXG4gICAgICAgIC8vIHN5bWJvbCBhbmNob3IgcG9pbnQgc3RheXMgdGhlIHNhbWUgcmVnYXJkbGVzcyBvZiB0ZXh0LWFuY2hvclxuICAgICAgICBhbmNob3JQb2ludFgsXG4gICAgICAgIGFuY2hvclBvaW50WVxuICAgIH07XG59XG5cbmV4cG9ydCB0eXBlIFZhcmlhYmxlT2Zmc2V0ID0ge1xuICAgIHJhZGlhbE9mZnNldDogbnVtYmVyLFxuICAgIHdpZHRoOiBudW1iZXIsXG4gICAgaGVpZ2h0OiBudW1iZXIsXG4gICAgYW5jaG9yOiBUZXh0QW5jaG9yLFxuICAgIHRleHRCb3hTY2FsZTogbnVtYmVyLFxuICAgIHByZXZBbmNob3I/OiBUZXh0QW5jaG9yXG59O1xuXG5leHBvcnQgdHlwZSBDcm9zc1RpbGVJRCA9IHN0cmluZyB8IG51bWJlcjtcblxuZXhwb3J0IGNsYXNzIFBsYWNlbWVudCB7XG4gICAgdHJhbnNmb3JtOiBUcmFuc2Zvcm07XG4gICAgY29sbGlzaW9uSW5kZXg6IENvbGxpc2lvbkluZGV4O1xuICAgIHBsYWNlbWVudHM6IHsgW0Nyb3NzVGlsZUlEXTogSm9pbnRQbGFjZW1lbnQgfTtcbiAgICBvcGFjaXRpZXM6IHsgW0Nyb3NzVGlsZUlEXTogSm9pbnRPcGFjaXR5U3RhdGUgfTtcbiAgICB2YXJpYWJsZU9mZnNldHM6IHtbQ3Jvc3NUaWxlSURdOiBWYXJpYWJsZU9mZnNldCB9O1xuICAgIGNvbW1pdFRpbWU6IG51bWJlcjtcbiAgICBsYXN0UGxhY2VtZW50Q2hhbmdlVGltZTogbnVtYmVyO1xuICAgIHN0YWxlOiBib29sZWFuO1xuICAgIGZhZGVEdXJhdGlvbjogbnVtYmVyO1xuICAgIHJldGFpbmVkUXVlcnlEYXRhOiB7W251bWJlcl06IFJldGFpbmVkUXVlcnlEYXRhfTtcbiAgICBjb2xsaXNpb25Hcm91cHM6IENvbGxpc2lvbkdyb3VwcztcbiAgICBwcmV2UGxhY2VtZW50OiA/UGxhY2VtZW50O1xuXG4gICAgY29uc3RydWN0b3IodHJhbnNmb3JtOiBUcmFuc2Zvcm0sIGZhZGVEdXJhdGlvbjogbnVtYmVyLCBjcm9zc1NvdXJjZUNvbGxpc2lvbnM6IGJvb2xlYW4sIHByZXZQbGFjZW1lbnQ/OiBQbGFjZW1lbnQpIHtcbiAgICAgICAgdGhpcy50cmFuc2Zvcm0gPSB0cmFuc2Zvcm0uY2xvbmUoKTtcbiAgICAgICAgdGhpcy5jb2xsaXNpb25JbmRleCA9IG5ldyBDb2xsaXNpb25JbmRleCh0aGlzLnRyYW5zZm9ybSk7XG4gICAgICAgIHRoaXMucGxhY2VtZW50cyA9IHt9O1xuICAgICAgICB0aGlzLm9wYWNpdGllcyA9IHt9O1xuICAgICAgICB0aGlzLnZhcmlhYmxlT2Zmc2V0cyA9IHt9O1xuICAgICAgICB0aGlzLnN0YWxlID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY29tbWl0VGltZSA9IDA7XG4gICAgICAgIHRoaXMuZmFkZUR1cmF0aW9uID0gZmFkZUR1cmF0aW9uO1xuICAgICAgICB0aGlzLnJldGFpbmVkUXVlcnlEYXRhID0ge307XG4gICAgICAgIHRoaXMuY29sbGlzaW9uR3JvdXBzID0gbmV3IENvbGxpc2lvbkdyb3Vwcyhjcm9zc1NvdXJjZUNvbGxpc2lvbnMpO1xuXG4gICAgICAgIHRoaXMucHJldlBsYWNlbWVudCA9IHByZXZQbGFjZW1lbnQ7XG4gICAgICAgIGlmIChwcmV2UGxhY2VtZW50KSB7XG4gICAgICAgICAgICBwcmV2UGxhY2VtZW50LnByZXZQbGFjZW1lbnQgPSB1bmRlZmluZWQ7IC8vIE9ubHkgaG9sZCBvbiB0byBvbmUgcGxhY2VtZW50IGJhY2tcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHBsYWNlTGF5ZXJUaWxlKHN0eWxlTGF5ZXI6IFN0eWxlTGF5ZXIsIHRpbGU6IFRpbGUsIHNob3dDb2xsaXNpb25Cb3hlczogYm9vbGVhbiwgc2VlbkNyb3NzVGlsZUlEczogeyBbc3RyaW5nIHwgbnVtYmVyXTogYm9vbGVhbiB9KSB7XG4gICAgICAgIGNvbnN0IHN5bWJvbEJ1Y2tldCA9ICgodGlsZS5nZXRCdWNrZXQoc3R5bGVMYXllcik6IGFueSk6IFN5bWJvbEJ1Y2tldCk7XG4gICAgICAgIGNvbnN0IGJ1Y2tldEZlYXR1cmVJbmRleCA9IHRpbGUubGF0ZXN0RmVhdHVyZUluZGV4O1xuICAgICAgICBpZiAoIXN5bWJvbEJ1Y2tldCB8fCAhYnVja2V0RmVhdHVyZUluZGV4IHx8IHN0eWxlTGF5ZXIuaWQgIT09IHN5bWJvbEJ1Y2tldC5sYXllcklkc1swXSlcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBjb25zdCBjb2xsaXNpb25Cb3hBcnJheSA9IHRpbGUuY29sbGlzaW9uQm94QXJyYXk7XG5cbiAgICAgICAgY29uc3QgbGF5b3V0ID0gc3ltYm9sQnVja2V0LmxheWVyc1swXS5sYXlvdXQ7XG5cbiAgICAgICAgY29uc3Qgc2NhbGUgPSBNYXRoLnBvdygyLCB0aGlzLnRyYW5zZm9ybS56b29tIC0gdGlsZS50aWxlSUQub3ZlcnNjYWxlZFopO1xuICAgICAgICBjb25zdCB0ZXh0UGl4ZWxSYXRpbyA9IHRpbGUudGlsZVNpemUgLyBFWFRFTlQ7XG5cbiAgICAgICAgY29uc3QgcG9zTWF0cml4ID0gdGhpcy50cmFuc2Zvcm0uY2FsY3VsYXRlUG9zTWF0cml4KHRpbGUudGlsZUlELnRvVW53cmFwcGVkKCkpO1xuXG4gICAgICAgIGNvbnN0IHRleHRMYWJlbFBsYW5lTWF0cml4ID0gcHJvamVjdGlvbi5nZXRMYWJlbFBsYW5lTWF0cml4KHBvc01hdHJpeCxcbiAgICAgICAgICAgICAgICBsYXlvdXQuZ2V0KCd0ZXh0LXBpdGNoLWFsaWdubWVudCcpID09PSAnbWFwJyxcbiAgICAgICAgICAgICAgICBsYXlvdXQuZ2V0KCd0ZXh0LXJvdGF0aW9uLWFsaWdubWVudCcpID09PSAnbWFwJyxcbiAgICAgICAgICAgICAgICB0aGlzLnRyYW5zZm9ybSxcbiAgICAgICAgICAgICAgICBwaXhlbHNUb1RpbGVVbml0cyh0aWxlLCAxLCB0aGlzLnRyYW5zZm9ybS56b29tKSk7XG5cbiAgICAgICAgY29uc3QgaWNvbkxhYmVsUGxhbmVNYXRyaXggPSBwcm9qZWN0aW9uLmdldExhYmVsUGxhbmVNYXRyaXgocG9zTWF0cml4LFxuICAgICAgICAgICAgICAgIGxheW91dC5nZXQoJ2ljb24tcGl0Y2gtYWxpZ25tZW50JykgPT09ICdtYXAnLFxuICAgICAgICAgICAgICAgIGxheW91dC5nZXQoJ2ljb24tcm90YXRpb24tYWxpZ25tZW50JykgPT09ICdtYXAnLFxuICAgICAgICAgICAgICAgIHRoaXMudHJhbnNmb3JtLFxuICAgICAgICAgICAgICAgIHBpeGVsc1RvVGlsZVVuaXRzKHRpbGUsIDEsIHRoaXMudHJhbnNmb3JtLnpvb20pKTtcblxuICAgICAgICAvLyBBcyBsb25nIGFzIHRoaXMgcGxhY2VtZW50IGxpdmVzLCB3ZSBoYXZlIHRvIGhvbGQgb250byB0aGlzIGJ1Y2tldCdzXG4gICAgICAgIC8vIG1hdGNoaW5nIEZlYXR1cmVJbmRleC9kYXRhIGZvciBxdWVyeWluZyBwdXJwb3Nlc1xuICAgICAgICB0aGlzLnJldGFpbmVkUXVlcnlEYXRhW3N5bWJvbEJ1Y2tldC5idWNrZXRJbnN0YW5jZUlkXSA9IG5ldyBSZXRhaW5lZFF1ZXJ5RGF0YShcbiAgICAgICAgICAgIHN5bWJvbEJ1Y2tldC5idWNrZXRJbnN0YW5jZUlkLFxuICAgICAgICAgICAgYnVja2V0RmVhdHVyZUluZGV4LFxuICAgICAgICAgICAgc3ltYm9sQnVja2V0LnNvdXJjZUxheWVySW5kZXgsXG4gICAgICAgICAgICBzeW1ib2xCdWNrZXQuaW5kZXgsXG4gICAgICAgICAgICB0aWxlLnRpbGVJRFxuICAgICAgICApO1xuICAgICAgICB0aGlzLnBsYWNlTGF5ZXJCdWNrZXQoc3ltYm9sQnVja2V0LCBwb3NNYXRyaXgsIHRleHRMYWJlbFBsYW5lTWF0cml4LCBpY29uTGFiZWxQbGFuZU1hdHJpeCwgc2NhbGUsIHRleHRQaXhlbFJhdGlvLFxuICAgICAgICAgICAgICAgIHNob3dDb2xsaXNpb25Cb3hlcywgdGlsZS5ob2xkaW5nRm9yRmFkZSgpLCBzZWVuQ3Jvc3NUaWxlSURzLCBjb2xsaXNpb25Cb3hBcnJheSk7XG4gICAgfVxuXG4gICAgYXR0ZW1wdEFuY2hvclBsYWNlbWVudChhbmNob3I6IFRleHRBbmNob3IsIHRleHRCb3g6IFNpbmdsZUNvbGxpc2lvbkJveCwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICByYWRpYWxUZXh0T2Zmc2V0OiBudW1iZXIsIHRleHRCb3hTY2FsZTogbnVtYmVyLCByb3RhdGVXaXRoTWFwOiBib29sZWFuLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl0Y2hXaXRoTWFwOiBib29sZWFuLCB0ZXh0UGl4ZWxSYXRpbzogbnVtYmVyLCBwb3NNYXRyaXg6IG1hdDQsIGNvbGxpc2lvbkdyb3VwOiBDb2xsaXNpb25Hcm91cCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRBbGxvd092ZXJsYXA6IGJvb2xlYW4sIHN5bWJvbEluc3RhbmNlOiBTeW1ib2xJbnN0YW5jZSwgYnVja2V0OiBTeW1ib2xCdWNrZXQpIHtcblxuICAgICAgICBjb25zdCBzaGlmdCA9IGNhbGN1bGF0ZVZhcmlhYmxlTGF5b3V0T2Zmc2V0KGFuY2hvciwgd2lkdGgsIGhlaWdodCwgcmFkaWFsVGV4dE9mZnNldCwgdGV4dEJveFNjYWxlKTtcblxuICAgICAgICBjb25zdCBwbGFjZWRHbHlwaEJveGVzID0gdGhpcy5jb2xsaXNpb25JbmRleC5wbGFjZUNvbGxpc2lvbkJveChcbiAgICAgICAgICAgIHNoaWZ0VmFyaWFibGVDb2xsaXNpb25Cb3goXG4gICAgICAgICAgICAgICAgdGV4dEJveCwgc2hpZnQueCwgc2hpZnQueSxcbiAgICAgICAgICAgICAgICByb3RhdGVXaXRoTWFwLCBwaXRjaFdpdGhNYXAsIHRoaXMudHJhbnNmb3JtLmFuZ2xlKSxcbiAgICAgICAgICAgIHRleHRBbGxvd092ZXJsYXAsIHRleHRQaXhlbFJhdGlvLCBwb3NNYXRyaXgsIGNvbGxpc2lvbkdyb3VwLnByZWRpY2F0ZSk7XG5cbiAgICAgICAgaWYgKHBsYWNlZEdseXBoQm94ZXMuYm94Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxldCBwcmV2QW5jaG9yO1xuICAgICAgICAgICAgLy8gSWYgdGhpcyBsYWJlbCB3YXMgcGxhY2VkIGluIHRoZSBwcmV2aW91cyBwbGFjZW1lbnQsIHJlY29yZCB0aGUgYW5jaG9yIHBvc2l0aW9uXG4gICAgICAgICAgICAvLyB0byBhbGxvdyB1cyB0byBhbmltYXRlIHRoZSB0cmFuc2l0aW9uXG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2UGxhY2VtZW50ICYmXG4gICAgICAgICAgICAgICAgdGhpcy5wcmV2UGxhY2VtZW50LnZhcmlhYmxlT2Zmc2V0c1tzeW1ib2xJbnN0YW5jZS5jcm9zc1RpbGVJRF0gJiZcbiAgICAgICAgICAgICAgICB0aGlzLnByZXZQbGFjZW1lbnQucGxhY2VtZW50c1tzeW1ib2xJbnN0YW5jZS5jcm9zc1RpbGVJRF0gJiZcbiAgICAgICAgICAgICAgICB0aGlzLnByZXZQbGFjZW1lbnQucGxhY2VtZW50c1tzeW1ib2xJbnN0YW5jZS5jcm9zc1RpbGVJRF0udGV4dCkge1xuICAgICAgICAgICAgICAgIHByZXZBbmNob3IgPSB0aGlzLnByZXZQbGFjZW1lbnQudmFyaWFibGVPZmZzZXRzW3N5bWJvbEluc3RhbmNlLmNyb3NzVGlsZUlEXS5hbmNob3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhc3NlcnQoc3ltYm9sSW5zdGFuY2UuY3Jvc3NUaWxlSUQgIT09IDApO1xuICAgICAgICAgICAgdGhpcy52YXJpYWJsZU9mZnNldHNbc3ltYm9sSW5zdGFuY2UuY3Jvc3NUaWxlSURdID0ge1xuICAgICAgICAgICAgICAgIHJhZGlhbE9mZnNldDogcmFkaWFsVGV4dE9mZnNldCxcbiAgICAgICAgICAgICAgICB3aWR0aCxcbiAgICAgICAgICAgICAgICBoZWlnaHQsXG4gICAgICAgICAgICAgICAgYW5jaG9yLFxuICAgICAgICAgICAgICAgIHRleHRCb3hTY2FsZSxcbiAgICAgICAgICAgICAgICBwcmV2QW5jaG9yXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5tYXJrVXNlZEp1c3RpZmljYXRpb24oYnVja2V0LCBhbmNob3IsIHN5bWJvbEluc3RhbmNlKTtcbiAgICAgICAgICAgIHJldHVybiBwbGFjZWRHbHlwaEJveGVzO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcGxhY2VMYXllckJ1Y2tldChidWNrZXQ6IFN5bWJvbEJ1Y2tldCwgcG9zTWF0cml4OiBtYXQ0LCB0ZXh0TGFiZWxQbGFuZU1hdHJpeDogbWF0NCwgaWNvbkxhYmVsUGxhbmVNYXRyaXg6IG1hdDQsXG4gICAgICAgICAgICBzY2FsZTogbnVtYmVyLCB0ZXh0UGl4ZWxSYXRpbzogbnVtYmVyLCBzaG93Q29sbGlzaW9uQm94ZXM6IGJvb2xlYW4sIGhvbGRpbmdGb3JGYWRlOiBib29sZWFuLCBzZWVuQ3Jvc3NUaWxlSURzOiB7IFtzdHJpbmcgfCBudW1iZXJdOiBib29sZWFuIH0sXG4gICAgICAgICAgICBjb2xsaXNpb25Cb3hBcnJheTogP0NvbGxpc2lvbkJveEFycmF5KSB7XG4gICAgICAgIGNvbnN0IGxheW91dCA9IGJ1Y2tldC5sYXllcnNbMF0ubGF5b3V0O1xuICAgICAgICBjb25zdCBwYXJ0aWFsbHlFdmFsdWF0ZWRUZXh0U2l6ZSA9IHN5bWJvbFNpemUuZXZhbHVhdGVTaXplRm9yWm9vbShidWNrZXQudGV4dFNpemVEYXRhLCB0aGlzLnRyYW5zZm9ybS56b29tLCBzeW1ib2xMYXllclByb3BlcnRpZXMubGF5b3V0LnByb3BlcnRpZXNbJ3RleHQtc2l6ZSddKTtcbiAgICAgICAgY29uc3QgdGV4dE9wdGlvbmFsID0gbGF5b3V0LmdldCgndGV4dC1vcHRpb25hbCcpO1xuICAgICAgICBjb25zdCBpY29uT3B0aW9uYWwgPSBsYXlvdXQuZ2V0KCdpY29uLW9wdGlvbmFsJyk7XG4gICAgICAgIGNvbnN0IHRleHRBbGxvd092ZXJsYXAgPSBsYXlvdXQuZ2V0KCd0ZXh0LWFsbG93LW92ZXJsYXAnKTtcbiAgICAgICAgY29uc3QgaWNvbkFsbG93T3ZlcmxhcCA9IGxheW91dC5nZXQoJ2ljb24tYWxsb3ctb3ZlcmxhcCcpO1xuICAgICAgICAvLyBUaGlzIGxvZ2ljIGlzIHNpbWlsYXIgdG8gdGhlIFwiZGVmYXVsdE9wYWNpdHlTdGF0ZVwiIGxvZ2ljIGJlbG93IGluIHVwZGF0ZUJ1Y2tldE9wYWNpdGllc1xuICAgICAgICAvLyBJZiB3ZSBrbm93IGEgc3ltYm9sIGlzIGFsd2F5cyBzdXBwb3NlZCB0byBzaG93LCBmb3JjZSBpdCB0byBiZSBtYXJrZWQgdmlzaWJsZSBldmVuIGlmXG4gICAgICAgIC8vIGl0IHdhc24ndCBwbGFjZWQgaW50byB0aGUgY29sbGlzaW9uIGluZGV4IChiZWNhdXNlIHNvbWUgb3IgYWxsIG9mIGl0IHdhcyBvdXRzaWRlIHRoZSByYW5nZVxuICAgICAgICAvLyBvZiB0aGUgY29sbGlzaW9uIGdyaWQpLlxuICAgICAgICAvLyBUaGVyZSBpcyBhIHN1YnRsZSBlZGdlIGNhc2UgaGVyZSB3ZSdyZSBhY2NlcHRpbmc6XG4gICAgICAgIC8vICBTeW1ib2wgQSBoYXMgdGV4dC1hbGxvdy1vdmVybGFwOiB0cnVlLCBpY29uLWFsbG93LW92ZXJsYXA6IHRydWUsIGljb24tb3B0aW9uYWw6IGZhbHNlXG4gICAgICAgIC8vICBBJ3MgaWNvbiBpcyBvdXRzaWRlIHRoZSBncmlkLCBzbyBkb2Vzbid0IGdldCBwbGFjZWRcbiAgICAgICAgLy8gIEEncyB0ZXh0IHdvdWxkIGJlIGluc2lkZSBncmlkLCBidXQgZG9lc24ndCBnZXQgcGxhY2VkIGJlY2F1c2Ugb2YgaWNvbi1vcHRpb25hbDogZmFsc2VcbiAgICAgICAgLy8gIFdlIHN0aWxsIHNob3cgQSBiZWNhdXNlIG9mIHRoZSBhbGxvdy1vdmVybGFwIHNldHRpbmdzLlxuICAgICAgICAvLyAgU3ltYm9sIEIgaGFzIGFsbG93LW92ZXJsYXA6IGZhbHNlLCBhbmQgZ2V0cyBwbGFjZWQgd2hlcmUgQSdzIHRleHQgd291bGQgYmVcbiAgICAgICAgLy8gIE9uIHBhbm5pbmcgaW4sIHRoZXJlIGlzIGEgc2hvcnQgcGVyaW9kIHdoZW4gU3ltYm9sIEIgYW5kIFN5bWJvbCBBIHdpbGwgb3ZlcmxhcFxuICAgICAgICAvLyAgVGhpcyBpcyB0aGUgcmV2ZXJzZSBvZiBvdXIgbm9ybWFsIHBvbGljeSBvZiBcImZhZGUgaW4gb24gcGFuXCIsIGJ1dCBzaG91bGQgbG9vayBsaWtlIGFueSBvdGhlclxuICAgICAgICAvLyAgY29sbGlzaW9uIGFuZCBob3BlZnVsbHkgbm90IGJlIHRvbyBub3RpY2VhYmxlLlxuICAgICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL21hcGJveC9tYXBib3gtZ2wtanMvaXNzdWVzLzcxNzJcbiAgICAgICAgY29uc3QgYWx3YXlzU2hvd1RleHQgPSB0ZXh0QWxsb3dPdmVybGFwICYmIChpY29uQWxsb3dPdmVybGFwIHx8ICFidWNrZXQuaGFzSWNvbkRhdGEoKSB8fCBpY29uT3B0aW9uYWwpO1xuICAgICAgICBjb25zdCBhbHdheXNTaG93SWNvbiA9IGljb25BbGxvd092ZXJsYXAgJiYgKHRleHRBbGxvd092ZXJsYXAgfHwgIWJ1Y2tldC5oYXNUZXh0RGF0YSgpIHx8IHRleHRPcHRpb25hbCk7XG5cbiAgICAgICAgY29uc3QgY29sbGlzaW9uR3JvdXAgPSB0aGlzLmNvbGxpc2lvbkdyb3Vwcy5nZXQoYnVja2V0LnNvdXJjZUlEKTtcblxuICAgICAgICBjb25zdCByb3RhdGVXaXRoTWFwID0gbGF5b3V0LmdldCgndGV4dC1yb3RhdGlvbi1hbGlnbm1lbnQnKSA9PT0gJ21hcCc7XG4gICAgICAgIGNvbnN0IHBpdGNoV2l0aE1hcCA9IGxheW91dC5nZXQoJ3RleHQtcGl0Y2gtYWxpZ25tZW50JykgPT09ICdtYXAnO1xuXG4gICAgICAgIGlmICghYnVja2V0LmNvbGxpc2lvbkFycmF5cyAmJiBjb2xsaXNpb25Cb3hBcnJheSkge1xuICAgICAgICAgICAgYnVja2V0LmRlc2VyaWFsaXplQ29sbGlzaW9uQm94ZXMoY29sbGlzaW9uQm94QXJyYXkpO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBidWNrZXQuc3ltYm9sSW5zdGFuY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBzeW1ib2xJbnN0YW5jZSA9IGJ1Y2tldC5zeW1ib2xJbnN0YW5jZXMuZ2V0KGkpO1xuICAgICAgICAgICAgaWYgKCFzZWVuQ3Jvc3NUaWxlSURzW3N5bWJvbEluc3RhbmNlLmNyb3NzVGlsZUlEXSkge1xuICAgICAgICAgICAgICAgIGlmIChob2xkaW5nRm9yRmFkZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBNYXJrIGFsbCBzeW1ib2xzIGZyb20gdGhpcyB0aWxlIGFzIFwibm90IHBsYWNlZFwiLCBidXQgZG9uJ3QgYWRkIHRvIHNlZW5Dcm9zc1RpbGVJRHMsIGJlY2F1c2Ugd2UgZG9uJ3RcbiAgICAgICAgICAgICAgICAgICAgLy8ga25vdyB5ZXQgaWYgd2UgaGF2ZSBhIGR1cGxpY2F0ZSBpbiBhIHBhcmVudCB0aWxlIHRoYXQgX3Nob3VsZF8gYmUgcGxhY2VkLlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsYWNlbWVudHNbc3ltYm9sSW5zdGFuY2UuY3Jvc3NUaWxlSURdID0gbmV3IEpvaW50UGxhY2VtZW50KGZhbHNlLCBmYWxzZSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgcGxhY2VUZXh0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgbGV0IHBsYWNlSWNvbiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGxldCBvZmZzY3JlZW4gPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgbGV0IHBsYWNlZEdseXBoQm94ZXMgPSBudWxsO1xuICAgICAgICAgICAgICAgIGxldCBwbGFjZWRHbHlwaENpcmNsZXMgPSBudWxsO1xuICAgICAgICAgICAgICAgIGxldCBwbGFjZWRJY29uQm94ZXMgPSBudWxsO1xuICAgICAgICAgICAgICAgIGxldCB0ZXh0RmVhdHVyZUluZGV4ID0gMDtcbiAgICAgICAgICAgICAgICBsZXQgaWNvbkZlYXR1cmVJbmRleCA9IDA7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBjb2xsaXNpb25BcnJheXMgPSBidWNrZXQuY29sbGlzaW9uQXJyYXlzW2ldO1xuXG4gICAgICAgICAgICAgICAgaWYgKGNvbGxpc2lvbkFycmF5cy50ZXh0RmVhdHVyZUluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgIHRleHRGZWF0dXJlSW5kZXggPSBjb2xsaXNpb25BcnJheXMudGV4dEZlYXR1cmVJbmRleDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCB0ZXh0Qm94ID0gY29sbGlzaW9uQXJyYXlzLnRleHRCb3g7XG4gICAgICAgICAgICAgICAgaWYgKHRleHRCb3gpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFsYXlvdXQuZ2V0KCd0ZXh0LXZhcmlhYmxlLWFuY2hvcicpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWRHbHlwaEJveGVzID0gdGhpcy5jb2xsaXNpb25JbmRleC5wbGFjZUNvbGxpc2lvbkJveCh0ZXh0Qm94LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXlvdXQuZ2V0KCd0ZXh0LWFsbG93LW92ZXJsYXAnKSwgdGV4dFBpeGVsUmF0aW8sIHBvc01hdHJpeCwgY29sbGlzaW9uR3JvdXAucHJlZGljYXRlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlVGV4dCA9IHBsYWNlZEdseXBoQm94ZXMuYm94Lmxlbmd0aCA+IDA7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3aWR0aCA9IHRleHRCb3gueDIgLSB0ZXh0Qm94LngxO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGVpZ2h0ID0gdGV4dEJveC55MiAtIHRleHRCb3gueTE7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZXh0Qm94U2NhbGUgPSBzeW1ib2xJbnN0YW5jZS50ZXh0Qm94U2NhbGU7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgYW5jaG9ycyA9IGxheW91dC5nZXQoJ3RleHQtdmFyaWFibGUtYW5jaG9yJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHdlIHRoaXMgc3ltYm9sIHdhcyBpbiB0aGUgbGFzdCBwbGFjZW1lbnQsIHNoaWZ0IHRoZSBwcmV2aW91c2x5IHVzZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuY2hvciB0byB0aGUgZnJvbnQgb2YgdGhlIGFuY2hvciBsaXN0LlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucHJldlBsYWNlbWVudCAmJiB0aGlzLnByZXZQbGFjZW1lbnQudmFyaWFibGVPZmZzZXRzW3N5bWJvbEluc3RhbmNlLmNyb3NzVGlsZUlEXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHByZXZPZmZzZXRzID0gdGhpcy5wcmV2UGxhY2VtZW50LnZhcmlhYmxlT2Zmc2V0c1tzeW1ib2xJbnN0YW5jZS5jcm9zc1RpbGVJRF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFuY2hvcnNbMF0gIT09IHByZXZPZmZzZXRzLmFuY2hvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmNob3JzID0gYW5jaG9ycy5maWx0ZXIoYW5jaG9yID0+IGFuY2hvciAhPT0gcHJldk9mZnNldHMuYW5jaG9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jaG9ycy51bnNoaWZ0KHByZXZPZmZzZXRzLmFuY2hvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGFuY2hvciBvZiBhbmNob3JzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2VkR2x5cGhCb3hlcyA9IHRoaXMuYXR0ZW1wdEFuY2hvclBsYWNlbWVudChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jaG9yLCB0ZXh0Qm94LCB3aWR0aCwgaGVpZ2h0LCBzeW1ib2xJbnN0YW5jZS5yYWRpYWxUZXh0T2Zmc2V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0Qm94U2NhbGUsIHJvdGF0ZVdpdGhNYXAsIHBpdGNoV2l0aE1hcCwgdGV4dFBpeGVsUmF0aW8sIHBvc01hdHJpeCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGlzaW9uR3JvdXAsIHRleHRBbGxvd092ZXJsYXAsIHN5bWJvbEluc3RhbmNlLCBidWNrZXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwbGFjZWRHbHlwaEJveGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlVGV4dCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2UgZGlkbid0IGdldCBwbGFjZWQsIHdlIHN0aWxsIG5lZWQgdG8gY29weSBvdXIgcG9zaXRpb24gZnJvbSB0aGUgbGFzdCBwbGFjZW1lbnQgZm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmYWRlIGFuaW1hdGlvbnNcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy52YXJpYWJsZU9mZnNldHNbc3ltYm9sSW5zdGFuY2UuY3Jvc3NUaWxlSURdICYmIHRoaXMucHJldlBsYWNlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHByZXZPZmZzZXQgPSB0aGlzLnByZXZQbGFjZW1lbnQudmFyaWFibGVPZmZzZXRzW3N5bWJvbEluc3RhbmNlLmNyb3NzVGlsZUlEXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJldk9mZnNldCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZhcmlhYmxlT2Zmc2V0c1tzeW1ib2xJbnN0YW5jZS5jcm9zc1RpbGVJRF0gPSBwcmV2T2Zmc2V0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1hcmtVc2VkSnVzdGlmaWNhdGlvbihidWNrZXQsIHByZXZPZmZzZXQuYW5jaG9yLCBzeW1ib2xJbnN0YW5jZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgb2Zmc2NyZWVuID0gcGxhY2VkR2x5cGhCb3hlcyAmJiBwbGFjZWRHbHlwaEJveGVzLm9mZnNjcmVlbjtcbiAgICAgICAgICAgICAgICBjb25zdCB0ZXh0Q2lyY2xlcyA9IGNvbGxpc2lvbkFycmF5cy50ZXh0Q2lyY2xlcztcbiAgICAgICAgICAgICAgICBpZiAodGV4dENpcmNsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGxhY2VkU3ltYm9sID0gYnVja2V0LnRleHQucGxhY2VkU3ltYm9sQXJyYXkuZ2V0KHN5bWJvbEluc3RhbmNlLmNlbnRlckp1c3RpZmllZFRleHRTeW1ib2xJbmRleCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvbnRTaXplID0gc3ltYm9sU2l6ZS5ldmFsdWF0ZVNpemVGb3JGZWF0dXJlKGJ1Y2tldC50ZXh0U2l6ZURhdGEsIHBhcnRpYWxseUV2YWx1YXRlZFRleHRTaXplLCBwbGFjZWRTeW1ib2wpO1xuICAgICAgICAgICAgICAgICAgICBwbGFjZWRHbHlwaENpcmNsZXMgPSB0aGlzLmNvbGxpc2lvbkluZGV4LnBsYWNlQ29sbGlzaW9uQ2lyY2xlcyh0ZXh0Q2lyY2xlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXlvdXQuZ2V0KCd0ZXh0LWFsbG93LW92ZXJsYXAnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0UGl4ZWxSYXRpbyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWRTeW1ib2wsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVja2V0LmxpbmVWZXJ0ZXhBcnJheSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWNrZXQuZ2x5cGhPZmZzZXRBcnJheSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250U2l6ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NNYXRyaXgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dExhYmVsUGxhbmVNYXRyaXgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0NvbGxpc2lvbkJveGVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpdGNoV2l0aE1hcCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xsaXNpb25Hcm91cC5wcmVkaWNhdGUpO1xuICAgICAgICAgICAgICAgICAgICAvLyBJZiB0ZXh0LWFsbG93LW92ZXJsYXAgaXMgc2V0LCBmb3JjZSBcInBsYWNlZENpcmNsZXNcIiB0byB0cnVlXG4gICAgICAgICAgICAgICAgICAgIC8vIEluIHRoZW9yeSB0aGVyZSBzaG91bGQgYWx3YXlzIGJlIGF0IGxlYXN0IG9uZSBjaXJjbGUgcGxhY2VkXG4gICAgICAgICAgICAgICAgICAgIC8vIGluIHRoaXMgY2FzZSwgYnV0IGZvciBub3cgcXVpcmtzIGluIHRleHQtYW5jaG9yXG4gICAgICAgICAgICAgICAgICAgIC8vIGFuZCB0ZXh0LW9mZnNldCBtYXkgcHJldmVudCB0aGF0IGZyb20gYmVpbmcgdHJ1ZS5cbiAgICAgICAgICAgICAgICAgICAgcGxhY2VUZXh0ID0gbGF5b3V0LmdldCgndGV4dC1hbGxvdy1vdmVybGFwJykgfHwgcGxhY2VkR2x5cGhDaXJjbGVzLmNpcmNsZXMubGVuZ3RoID4gMDtcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2NyZWVuID0gb2Zmc2NyZWVuICYmIHBsYWNlZEdseXBoQ2lyY2xlcy5vZmZzY3JlZW47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGNvbGxpc2lvbkFycmF5cy5pY29uRmVhdHVyZUluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgIGljb25GZWF0dXJlSW5kZXggPSBjb2xsaXNpb25BcnJheXMuaWNvbkZlYXR1cmVJbmRleDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGNvbGxpc2lvbkFycmF5cy5pY29uQm94KSB7XG4gICAgICAgICAgICAgICAgICAgIHBsYWNlZEljb25Cb3hlcyA9IHRoaXMuY29sbGlzaW9uSW5kZXgucGxhY2VDb2xsaXNpb25Cb3goY29sbGlzaW9uQXJyYXlzLmljb25Cb3gsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0LmdldCgnaWNvbi1hbGxvdy1vdmVybGFwJyksIHRleHRQaXhlbFJhdGlvLCBwb3NNYXRyaXgsIGNvbGxpc2lvbkdyb3VwLnByZWRpY2F0ZSk7XG4gICAgICAgICAgICAgICAgICAgIHBsYWNlSWNvbiA9IHBsYWNlZEljb25Cb3hlcy5ib3gubGVuZ3RoID4gMDtcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2NyZWVuID0gb2Zmc2NyZWVuICYmIHBsYWNlZEljb25Cb3hlcy5vZmZzY3JlZW47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgaWNvbldpdGhvdXRUZXh0ID0gdGV4dE9wdGlvbmFsIHx8XG4gICAgICAgICAgICAgICAgICAgIChzeW1ib2xJbnN0YW5jZS5udW1Ib3Jpem9udGFsR2x5cGhWZXJ0aWNlcyA9PT0gMCAmJiBzeW1ib2xJbnN0YW5jZS5udW1WZXJ0aWNhbEdseXBoVmVydGljZXMgPT09IDApO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRleHRXaXRob3V0SWNvbiA9IGljb25PcHRpb25hbCB8fCBzeW1ib2xJbnN0YW5jZS5udW1JY29uVmVydGljZXMgPT09IDA7XG5cbiAgICAgICAgICAgICAgICAvLyBDb21iaW5lIHRoZSBzY2FsZXMgZm9yIGljb25zIGFuZCB0ZXh0LlxuICAgICAgICAgICAgICAgIGlmICghaWNvbldpdGhvdXRUZXh0ICYmICF0ZXh0V2l0aG91dEljb24pIHtcbiAgICAgICAgICAgICAgICAgICAgcGxhY2VJY29uID0gcGxhY2VUZXh0ID0gcGxhY2VJY29uICYmIHBsYWNlVGV4dDtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCF0ZXh0V2l0aG91dEljb24pIHtcbiAgICAgICAgICAgICAgICAgICAgcGxhY2VUZXh0ID0gcGxhY2VJY29uICYmIHBsYWNlVGV4dDtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFpY29uV2l0aG91dFRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgcGxhY2VJY29uID0gcGxhY2VJY29uICYmIHBsYWNlVGV4dDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAocGxhY2VUZXh0ICYmIHBsYWNlZEdseXBoQm94ZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb2xsaXNpb25JbmRleC5pbnNlcnRDb2xsaXNpb25Cb3gocGxhY2VkR2x5cGhCb3hlcy5ib3gsIGxheW91dC5nZXQoJ3RleHQtaWdub3JlLXBsYWNlbWVudCcpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Y2tldC5idWNrZXRJbnN0YW5jZUlkLCB0ZXh0RmVhdHVyZUluZGV4LCBjb2xsaXNpb25Hcm91cC5JRCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChwbGFjZUljb24gJiYgcGxhY2VkSWNvbkJveGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29sbGlzaW9uSW5kZXguaW5zZXJ0Q29sbGlzaW9uQm94KHBsYWNlZEljb25Cb3hlcy5ib3gsIGxheW91dC5nZXQoJ2ljb24taWdub3JlLXBsYWNlbWVudCcpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Y2tldC5idWNrZXRJbnN0YW5jZUlkLCBpY29uRmVhdHVyZUluZGV4LCBjb2xsaXNpb25Hcm91cC5JRCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChwbGFjZVRleHQgJiYgcGxhY2VkR2x5cGhDaXJjbGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29sbGlzaW9uSW5kZXguaW5zZXJ0Q29sbGlzaW9uQ2lyY2xlcyhwbGFjZWRHbHlwaENpcmNsZXMuY2lyY2xlcywgbGF5b3V0LmdldCgndGV4dC1pZ25vcmUtcGxhY2VtZW50JyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVja2V0LmJ1Y2tldEluc3RhbmNlSWQsIHRleHRGZWF0dXJlSW5kZXgsIGNvbGxpc2lvbkdyb3VwLklEKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBhc3NlcnQoc3ltYm9sSW5zdGFuY2UuY3Jvc3NUaWxlSUQgIT09IDApO1xuICAgICAgICAgICAgICAgIGFzc2VydChidWNrZXQuYnVja2V0SW5zdGFuY2VJZCAhPT0gMCk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnBsYWNlbWVudHNbc3ltYm9sSW5zdGFuY2UuY3Jvc3NUaWxlSURdID0gbmV3IEpvaW50UGxhY2VtZW50KHBsYWNlVGV4dCB8fCBhbHdheXNTaG93VGV4dCwgcGxhY2VJY29uIHx8IGFsd2F5c1Nob3dJY29uLCBvZmZzY3JlZW4gfHwgYnVja2V0Lmp1c3RSZWxvYWRlZCk7XG4gICAgICAgICAgICAgICAgc2VlbkNyb3NzVGlsZUlEc1tzeW1ib2xJbnN0YW5jZS5jcm9zc1RpbGVJRF0gPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgYnVja2V0Lmp1c3RSZWxvYWRlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIG1hcmtVc2VkSnVzdGlmaWNhdGlvbihidWNrZXQ6IFN5bWJvbEJ1Y2tldCwgcGxhY2VkQW5jaG9yOiBUZXh0QW5jaG9yLCBzeW1ib2xJbnN0YW5jZTogU3ltYm9sSW5zdGFuY2UpIHtcbiAgICAgICAgY29uc3QganVzdGlmaWNhdGlvbnMgPSB7XG4gICAgICAgICAgICBcImxlZnRcIjogc3ltYm9sSW5zdGFuY2UubGVmdEp1c3RpZmllZFRleHRTeW1ib2xJbmRleCxcbiAgICAgICAgICAgIFwiY2VudGVyXCI6IHN5bWJvbEluc3RhbmNlLmNlbnRlckp1c3RpZmllZFRleHRTeW1ib2xJbmRleCxcbiAgICAgICAgICAgIFwicmlnaHRcIjogc3ltYm9sSW5zdGFuY2UucmlnaHRKdXN0aWZpZWRUZXh0U3ltYm9sSW5kZXhcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgYXV0b0luZGV4ID0ganVzdGlmaWNhdGlvbnNbZ2V0QW5jaG9ySnVzdGlmaWNhdGlvbihwbGFjZWRBbmNob3IpXTtcblxuICAgICAgICBmb3IgKGNvbnN0IGp1c3RpZmljYXRpb24gaW4ganVzdGlmaWNhdGlvbnMpIHtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0ganVzdGlmaWNhdGlvbnNbanVzdGlmaWNhdGlvbl07XG4gICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgICAgICAgICAgIGlmIChhdXRvSW5kZXggPj0gMCAmJiBpbmRleCAhPT0gYXV0b0luZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRoZXJlIGFyZSBtdWx0aXBsZSBqdXN0aWZpY2F0aW9ucyBhbmQgdGhpcyBvbmUgaXNuJ3QgaXQ6IHNoaWZ0IG9mZnNjcmVlblxuICAgICAgICAgICAgICAgICAgICBidWNrZXQudGV4dC5wbGFjZWRTeW1ib2xBcnJheS5nZXQoaW5kZXgpLmNyb3NzVGlsZUlEID0gMDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBFaXRoZXIgdGhpcyBpcyB0aGUgY2hvc2VuIGp1c3RpZmljYXRpb24gb3IgdGhlIGp1c3RpZmljYXRpb24gaXMgaGFyZHdpcmVkOiB1c2UgdGhpcyBvbmVcbiAgICAgICAgICAgICAgICAgICAgYnVja2V0LnRleHQucGxhY2VkU3ltYm9sQXJyYXkuZ2V0KGluZGV4KS5jcm9zc1RpbGVJRCA9IHN5bWJvbEluc3RhbmNlLmNyb3NzVGlsZUlEO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbW1pdChub3c6IG51bWJlcik6IHZvaWQge1xuICAgICAgICB0aGlzLmNvbW1pdFRpbWUgPSBub3c7XG5cbiAgICAgICAgY29uc3QgcHJldlBsYWNlbWVudCA9IHRoaXMucHJldlBsYWNlbWVudDtcbiAgICAgICAgbGV0IHBsYWNlbWVudENoYW5nZWQgPSBmYWxzZTtcblxuICAgICAgICBjb25zdCBpbmNyZW1lbnQgPSAocHJldlBsYWNlbWVudCAmJiB0aGlzLmZhZGVEdXJhdGlvbiAhPT0gMCkgP1xuICAgICAgICAgICAgKHRoaXMuY29tbWl0VGltZSAtIHByZXZQbGFjZW1lbnQuY29tbWl0VGltZSkgLyB0aGlzLmZhZGVEdXJhdGlvbiA6XG4gICAgICAgICAgICAxO1xuXG4gICAgICAgIGNvbnN0IHByZXZPcGFjaXRpZXMgPSBwcmV2UGxhY2VtZW50ID8gcHJldlBsYWNlbWVudC5vcGFjaXRpZXMgOiB7fTtcbiAgICAgICAgY29uc3QgcHJldk9mZnNldHMgPSBwcmV2UGxhY2VtZW50ID8gcHJldlBsYWNlbWVudC52YXJpYWJsZU9mZnNldHMgOiB7fTtcbiAgICAgICAgLy8gYWRkIHRoZSBvcGFjaXRpZXMgZnJvbSB0aGUgY3VycmVudCBwbGFjZW1lbnQsIGFuZCBjb3B5IHRoZWlyIGN1cnJlbnQgdmFsdWVzIGZyb20gdGhlIHByZXZpb3VzIHBsYWNlbWVudFxuICAgICAgICBmb3IgKGNvbnN0IGNyb3NzVGlsZUlEIGluIHRoaXMucGxhY2VtZW50cykge1xuICAgICAgICAgICAgY29uc3Qgam9pbnRQbGFjZW1lbnQgPSB0aGlzLnBsYWNlbWVudHNbY3Jvc3NUaWxlSURdO1xuICAgICAgICAgICAgY29uc3QgcHJldk9wYWNpdHkgPSBwcmV2T3BhY2l0aWVzW2Nyb3NzVGlsZUlEXTtcbiAgICAgICAgICAgIGlmIChwcmV2T3BhY2l0eSkge1xuICAgICAgICAgICAgICAgIHRoaXMub3BhY2l0aWVzW2Nyb3NzVGlsZUlEXSA9IG5ldyBKb2ludE9wYWNpdHlTdGF0ZShwcmV2T3BhY2l0eSwgaW5jcmVtZW50LCBqb2ludFBsYWNlbWVudC50ZXh0LCBqb2ludFBsYWNlbWVudC5pY29uKTtcbiAgICAgICAgICAgICAgICBwbGFjZW1lbnRDaGFuZ2VkID0gcGxhY2VtZW50Q2hhbmdlZCB8fFxuICAgICAgICAgICAgICAgICAgICBqb2ludFBsYWNlbWVudC50ZXh0ICE9PSBwcmV2T3BhY2l0eS50ZXh0LnBsYWNlZCB8fFxuICAgICAgICAgICAgICAgICAgICBqb2ludFBsYWNlbWVudC5pY29uICE9PSBwcmV2T3BhY2l0eS5pY29uLnBsYWNlZDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcGFjaXRpZXNbY3Jvc3NUaWxlSURdID0gbmV3IEpvaW50T3BhY2l0eVN0YXRlKG51bGwsIGluY3JlbWVudCwgam9pbnRQbGFjZW1lbnQudGV4dCwgam9pbnRQbGFjZW1lbnQuaWNvbiwgam9pbnRQbGFjZW1lbnQuc2tpcEZhZGUpO1xuICAgICAgICAgICAgICAgIHBsYWNlbWVudENoYW5nZWQgPSBwbGFjZW1lbnRDaGFuZ2VkIHx8IGpvaW50UGxhY2VtZW50LnRleHQgfHwgam9pbnRQbGFjZW1lbnQuaWNvbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNvcHkgYW5kIHVwZGF0ZSB2YWx1ZXMgZnJvbSB0aGUgcHJldmlvdXMgcGxhY2VtZW50IHRoYXQgYXJlbid0IGluIHRoZSBjdXJyZW50IHBsYWNlbWVudCBidXQgaGF2ZW4ndCBmaW5pc2hlZCBmYWRpbmdcbiAgICAgICAgZm9yIChjb25zdCBjcm9zc1RpbGVJRCBpbiBwcmV2T3BhY2l0aWVzKSB7XG4gICAgICAgICAgICBjb25zdCBwcmV2T3BhY2l0eSA9IHByZXZPcGFjaXRpZXNbY3Jvc3NUaWxlSURdO1xuICAgICAgICAgICAgaWYgKCF0aGlzLm9wYWNpdGllc1tjcm9zc1RpbGVJRF0pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBqb2ludE9wYWNpdHkgPSBuZXcgSm9pbnRPcGFjaXR5U3RhdGUocHJldk9wYWNpdHksIGluY3JlbWVudCwgZmFsc2UsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBpZiAoIWpvaW50T3BhY2l0eS5pc0hpZGRlbigpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3BhY2l0aWVzW2Nyb3NzVGlsZUlEXSA9IGpvaW50T3BhY2l0eTtcbiAgICAgICAgICAgICAgICAgICAgcGxhY2VtZW50Q2hhbmdlZCA9IHBsYWNlbWVudENoYW5nZWQgfHwgcHJldk9wYWNpdHkudGV4dC5wbGFjZWQgfHwgcHJldk9wYWNpdHkuaWNvbi5wbGFjZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgY3Jvc3NUaWxlSUQgaW4gcHJldk9mZnNldHMpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy52YXJpYWJsZU9mZnNldHNbY3Jvc3NUaWxlSURdICYmIHRoaXMub3BhY2l0aWVzW2Nyb3NzVGlsZUlEXSAmJiAhdGhpcy5vcGFjaXRpZXNbY3Jvc3NUaWxlSURdLmlzSGlkZGVuKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnZhcmlhYmxlT2Zmc2V0c1tjcm9zc1RpbGVJRF0gPSBwcmV2T2Zmc2V0c1tjcm9zc1RpbGVJRF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0aGlzLmxhc3RQbGFjZW1lbnRDaGFuZ2VUaW1lIGlzIHRoZSB0aW1lIG9mIHRoZSBsYXN0IGNvbW1pdCgpIHRoYXRcbiAgICAgICAgLy8gcmVzdWx0ZWQgaW4gYSBwbGFjZW1lbnQgY2hhbmdlIC0tIGluIG90aGVyIHdvcmRzLCB0aGUgc3RhcnQgdGltZSBvZlxuICAgICAgICAvLyB0aGUgbGFzdCBzeW1ib2wgZmFkZSBhbmltYXRpb25cbiAgICAgICAgYXNzZXJ0KCFwcmV2UGxhY2VtZW50IHx8IHByZXZQbGFjZW1lbnQubGFzdFBsYWNlbWVudENoYW5nZVRpbWUgIT09IHVuZGVmaW5lZCk7XG4gICAgICAgIGlmIChwbGFjZW1lbnRDaGFuZ2VkKSB7XG4gICAgICAgICAgICB0aGlzLmxhc3RQbGFjZW1lbnRDaGFuZ2VUaW1lID0gbm93O1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB0aGlzLmxhc3RQbGFjZW1lbnRDaGFuZ2VUaW1lICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgdGhpcy5sYXN0UGxhY2VtZW50Q2hhbmdlVGltZSA9IHByZXZQbGFjZW1lbnQgPyBwcmV2UGxhY2VtZW50Lmxhc3RQbGFjZW1lbnRDaGFuZ2VUaW1lIDogbm93O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdXBkYXRlTGF5ZXJPcGFjaXRpZXMoc3R5bGVMYXllcjogU3R5bGVMYXllciwgdGlsZXM6IEFycmF5PFRpbGU+KSB7XG4gICAgICAgIGNvbnN0IHNlZW5Dcm9zc1RpbGVJRHMgPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCB0aWxlIG9mIHRpbGVzKSB7XG4gICAgICAgICAgICBjb25zdCBzeW1ib2xCdWNrZXQgPSAoKHRpbGUuZ2V0QnVja2V0KHN0eWxlTGF5ZXIpOiBhbnkpOiBTeW1ib2xCdWNrZXQpO1xuICAgICAgICAgICAgaWYgKHN5bWJvbEJ1Y2tldCAmJiB0aWxlLmxhdGVzdEZlYXR1cmVJbmRleCAmJiBzdHlsZUxheWVyLmlkID09PSBzeW1ib2xCdWNrZXQubGF5ZXJJZHNbMF0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUJ1Y2tldE9wYWNpdGllcyhzeW1ib2xCdWNrZXQsIHNlZW5Dcm9zc1RpbGVJRHMsIHRpbGUuY29sbGlzaW9uQm94QXJyYXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgdXBkYXRlQnVja2V0T3BhY2l0aWVzKGJ1Y2tldDogU3ltYm9sQnVja2V0LCBzZWVuQ3Jvc3NUaWxlSURzOiB7IFtzdHJpbmcgfCBudW1iZXJdOiBib29sZWFuIH0sIGNvbGxpc2lvbkJveEFycmF5OiA/Q29sbGlzaW9uQm94QXJyYXkpIHtcbiAgICAgICAgaWYgKGJ1Y2tldC5oYXNUZXh0RGF0YSgpKSBidWNrZXQudGV4dC5vcGFjaXR5VmVydGV4QXJyYXkuY2xlYXIoKTtcbiAgICAgICAgaWYgKGJ1Y2tldC5oYXNJY29uRGF0YSgpKSBidWNrZXQuaWNvbi5vcGFjaXR5VmVydGV4QXJyYXkuY2xlYXIoKTtcbiAgICAgICAgaWYgKGJ1Y2tldC5oYXNDb2xsaXNpb25Cb3hEYXRhKCkpIGJ1Y2tldC5jb2xsaXNpb25Cb3guY29sbGlzaW9uVmVydGV4QXJyYXkuY2xlYXIoKTtcbiAgICAgICAgaWYgKGJ1Y2tldC5oYXNDb2xsaXNpb25DaXJjbGVEYXRhKCkpIGJ1Y2tldC5jb2xsaXNpb25DaXJjbGUuY29sbGlzaW9uVmVydGV4QXJyYXkuY2xlYXIoKTtcblxuICAgICAgICBjb25zdCBsYXlvdXQgPSBidWNrZXQubGF5ZXJzWzBdLmxheW91dDtcbiAgICAgICAgY29uc3QgZHVwbGljYXRlT3BhY2l0eVN0YXRlID0gbmV3IEpvaW50T3BhY2l0eVN0YXRlKG51bGwsIDAsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICAgIGNvbnN0IHRleHRBbGxvd092ZXJsYXAgPSBsYXlvdXQuZ2V0KCd0ZXh0LWFsbG93LW92ZXJsYXAnKTtcbiAgICAgICAgY29uc3QgaWNvbkFsbG93T3ZlcmxhcCA9IGxheW91dC5nZXQoJ2ljb24tYWxsb3ctb3ZlcmxhcCcpO1xuICAgICAgICBjb25zdCB2YXJpYWJsZVBsYWNlbWVudCA9IGxheW91dC5nZXQoJ3RleHQtdmFyaWFibGUtYW5jaG9yJyk7XG4gICAgICAgIGNvbnN0IHJvdGF0ZVdpdGhNYXAgPSBsYXlvdXQuZ2V0KCd0ZXh0LXJvdGF0aW9uLWFsaWdubWVudCcpID09PSAnbWFwJztcbiAgICAgICAgY29uc3QgcGl0Y2hXaXRoTWFwID0gbGF5b3V0LmdldCgndGV4dC1waXRjaC1hbGlnbm1lbnQnKSA9PT0gJ21hcCc7XG4gICAgICAgIC8vIElmIGFsbG93LW92ZXJsYXAgaXMgdHJ1ZSwgd2UgY2FuIHNob3cgc3ltYm9scyBiZWZvcmUgcGxhY2VtZW50IHJ1bnMgb24gdGhlbVxuICAgICAgICAvLyBCdXQgd2UgaGF2ZSB0byB3YWl0IGZvciBwbGFjZW1lbnQgaWYgd2UgcG90ZW50aWFsbHkgZGVwZW5kIG9uIGEgcGFpcmVkIGljb24vdGV4dFxuICAgICAgICAvLyB3aXRoIGFsbG93LW92ZXJsYXA6IGZhbHNlLlxuICAgICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL21hcGJveC9tYXBib3gtZ2wtanMvaXNzdWVzLzcwMzJcbiAgICAgICAgY29uc3QgZGVmYXVsdE9wYWNpdHlTdGF0ZSA9IG5ldyBKb2ludE9wYWNpdHlTdGF0ZShudWxsLCAwLFxuICAgICAgICAgICAgICAgIHRleHRBbGxvd092ZXJsYXAgJiYgKGljb25BbGxvd092ZXJsYXAgfHwgIWJ1Y2tldC5oYXNJY29uRGF0YSgpIHx8IGxheW91dC5nZXQoJ2ljb24tb3B0aW9uYWwnKSksXG4gICAgICAgICAgICAgICAgaWNvbkFsbG93T3ZlcmxhcCAmJiAodGV4dEFsbG93T3ZlcmxhcCB8fCAhYnVja2V0Lmhhc1RleHREYXRhKCkgfHwgbGF5b3V0LmdldCgndGV4dC1vcHRpb25hbCcpKSxcbiAgICAgICAgICAgICAgICB0cnVlKTtcblxuICAgICAgICBpZiAoIWJ1Y2tldC5jb2xsaXNpb25BcnJheXMgJiYgY29sbGlzaW9uQm94QXJyYXkgJiYgKGJ1Y2tldC5oYXNDb2xsaXNpb25Cb3hEYXRhKCkgfHwgYnVja2V0Lmhhc0NvbGxpc2lvbkNpcmNsZURhdGEoKSkpIHtcbiAgICAgICAgICAgIGJ1Y2tldC5kZXNlcmlhbGl6ZUNvbGxpc2lvbkJveGVzKGNvbGxpc2lvbkJveEFycmF5KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IHMgPSAwOyBzIDwgYnVja2V0LnN5bWJvbEluc3RhbmNlcy5sZW5ndGg7IHMrKykge1xuICAgICAgICAgICAgY29uc3Qgc3ltYm9sSW5zdGFuY2UgPSBidWNrZXQuc3ltYm9sSW5zdGFuY2VzLmdldChzKTtcbiAgICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgICBudW1Ib3Jpem9udGFsR2x5cGhWZXJ0aWNlcyxcbiAgICAgICAgICAgICAgICBudW1WZXJ0aWNhbEdseXBoVmVydGljZXMsXG4gICAgICAgICAgICAgICAgY3Jvc3NUaWxlSURcbiAgICAgICAgICAgIH0gPSBzeW1ib2xJbnN0YW5jZTtcblxuICAgICAgICAgICAgY29uc3QgaXNEdXBsaWNhdGUgPSBzZWVuQ3Jvc3NUaWxlSURzW2Nyb3NzVGlsZUlEXTtcblxuICAgICAgICAgICAgbGV0IG9wYWNpdHlTdGF0ZSA9IHRoaXMub3BhY2l0aWVzW2Nyb3NzVGlsZUlEXTtcbiAgICAgICAgICAgIGlmIChpc0R1cGxpY2F0ZSkge1xuICAgICAgICAgICAgICAgIG9wYWNpdHlTdGF0ZSA9IGR1cGxpY2F0ZU9wYWNpdHlTdGF0ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIW9wYWNpdHlTdGF0ZSkge1xuICAgICAgICAgICAgICAgIG9wYWNpdHlTdGF0ZSA9IGRlZmF1bHRPcGFjaXR5U3RhdGU7XG4gICAgICAgICAgICAgICAgLy8gc3RvcmUgdGhlIHN0YXRlIHNvIHRoYXQgZnV0dXJlIHBsYWNlbWVudHMgdXNlIGl0IGFzIGEgc3RhcnRpbmcgcG9pbnRcbiAgICAgICAgICAgICAgICB0aGlzLm9wYWNpdGllc1tjcm9zc1RpbGVJRF0gPSBvcGFjaXR5U3RhdGU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHNlZW5Dcm9zc1RpbGVJRHNbY3Jvc3NUaWxlSURdID0gdHJ1ZTtcblxuICAgICAgICAgICAgY29uc3QgaGFzVGV4dCA9IG51bUhvcml6b250YWxHbHlwaFZlcnRpY2VzID4gMCB8fCBudW1WZXJ0aWNhbEdseXBoVmVydGljZXMgPiAwO1xuICAgICAgICAgICAgY29uc3QgaGFzSWNvbiA9IHN5bWJvbEluc3RhbmNlLm51bUljb25WZXJ0aWNlcyA+IDA7XG5cbiAgICAgICAgICAgIGlmIChoYXNUZXh0KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFja2VkT3BhY2l0eSA9IHBhY2tPcGFjaXR5KG9wYWNpdHlTdGF0ZS50ZXh0KTtcbiAgICAgICAgICAgICAgICAvLyBWZXJ0aWNhbCB0ZXh0IGZhZGVzIGluL291dCBvbiBjb2xsaXNpb24gdGhlIHNhbWUgd2F5IGFzIGNvcnJlc3BvbmRpbmdcbiAgICAgICAgICAgICAgICAvLyBob3Jpem9udGFsIHRleHQuIFN3aXRjaCBiZXR3ZWVuIHZlcnRpY2FsL2hvcml6b250YWwgc2hvdWxkIGJlIGluc3RhbnRhbmVvdXNcbiAgICAgICAgICAgICAgICBjb25zdCBvcGFjaXR5RW50cnlDb3VudCA9IChudW1Ib3Jpem9udGFsR2x5cGhWZXJ0aWNlcyArIG51bVZlcnRpY2FsR2x5cGhWZXJ0aWNlcykgLyA0O1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3BhY2l0eUVudHJ5Q291bnQ7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBidWNrZXQudGV4dC5vcGFjaXR5VmVydGV4QXJyYXkuZW1wbGFjZUJhY2socGFja2VkT3BhY2l0eSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgbGFiZWwgaXMgY29tcGxldGVseSBmYWRlZCwgbWFyayBpdCBzbyB0aGF0IHdlIGRvbid0IGhhdmUgdG8gY2FsY3VsYXRlXG4gICAgICAgICAgICAgICAgLy8gaXRzIHBvc2l0aW9uIGF0IHJlbmRlciB0aW1lLiBJZiB0aGlzIGxheWVyIGhhcyB2YXJpYWJsZSBwbGFjZW1lbnQsIHNoaWZ0IHRoZSB2YXJpb3VzXG4gICAgICAgICAgICAgICAgLy8gc3ltYm9sIGluc3RhbmNlcyBhcHByb3ByaWF0ZWx5IHNvIHRoYXQgc3ltYm9scyBmcm9tIGJ1Y2tldHMgdGhhdCBoYXZlIHlldCB0byBiZSBwbGFjZWRcbiAgICAgICAgICAgICAgICAvLyBvZmZzZXQgYXBwcm9wcmlhdGVseS5cbiAgICAgICAgICAgICAgICBjb25zdCBoaWRkZW4gPSBvcGFjaXR5U3RhdGUudGV4dC5pc0hpZGRlbigpID8gMSA6IDA7XG4gICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICBzeW1ib2xJbnN0YW5jZS5yaWdodEp1c3RpZmllZFRleHRTeW1ib2xJbmRleCxcbiAgICAgICAgICAgICAgICAgICAgc3ltYm9sSW5zdGFuY2UuY2VudGVySnVzdGlmaWVkVGV4dFN5bWJvbEluZGV4LFxuICAgICAgICAgICAgICAgICAgICBzeW1ib2xJbnN0YW5jZS5sZWZ0SnVzdGlmaWVkVGV4dFN5bWJvbEluZGV4LFxuICAgICAgICAgICAgICAgICAgICBzeW1ib2xJbnN0YW5jZS52ZXJ0aWNhbFBsYWNlZFRleHRTeW1ib2xJbmRleFxuICAgICAgICAgICAgICAgIF0uZm9yRWFjaChpbmRleCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBidWNrZXQudGV4dC5wbGFjZWRTeW1ib2xBcnJheS5nZXQoaW5kZXgpLmhpZGRlbiA9IGhpZGRlbjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgcHJldk9mZnNldCA9IHRoaXMudmFyaWFibGVPZmZzZXRzW3N5bWJvbEluc3RhbmNlLmNyb3NzVGlsZUlEXTtcbiAgICAgICAgICAgICAgICBpZiAocHJldk9mZnNldCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1hcmtVc2VkSnVzdGlmaWNhdGlvbihidWNrZXQsIHByZXZPZmZzZXQuYW5jaG9yLCBzeW1ib2xJbnN0YW5jZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaGFzSWNvbikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhY2tlZE9wYWNpdHkgPSBwYWNrT3BhY2l0eShvcGFjaXR5U3RhdGUuaWNvbik7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzeW1ib2xJbnN0YW5jZS5udW1JY29uVmVydGljZXMgLyA0OyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgYnVja2V0Lmljb24ub3BhY2l0eVZlcnRleEFycmF5LmVtcGxhY2VCYWNrKHBhY2tlZE9wYWNpdHkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBidWNrZXQuaWNvbi5wbGFjZWRTeW1ib2xBcnJheS5nZXQocykuaGlkZGVuID1cbiAgICAgICAgICAgICAgICAgICAgKG9wYWNpdHlTdGF0ZS5pY29uLmlzSGlkZGVuKCk6IGFueSk7XG4gICAgICAgICAgICB9XG5cblxuICAgICAgICAgICAgaWYgKGJ1Y2tldC5oYXNDb2xsaXNpb25Cb3hEYXRhKCkgfHwgYnVja2V0Lmhhc0NvbGxpc2lvbkNpcmNsZURhdGEoKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbGxpc2lvbkFycmF5cyA9IGJ1Y2tldC5jb2xsaXNpb25BcnJheXNbc107XG4gICAgICAgICAgICAgICAgaWYgKGNvbGxpc2lvbkFycmF5cykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29sbGlzaW9uQXJyYXlzLnRleHRCb3gpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzaGlmdCA9IG5ldyBQb2ludCgwLCAwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB1c2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YXJpYWJsZVBsYWNlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhcmlhYmxlT2Zmc2V0ID0gdGhpcy52YXJpYWJsZU9mZnNldHNbY3Jvc3NUaWxlSURdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YXJpYWJsZU9mZnNldCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIHdpbGwgc2hvdyBlaXRoZXIgdGhlIGN1cnJlbnRseSBwbGFjZWQgcG9zaXRpb24gb3IgdGhlIGxhc3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3VjY2Vzc2Z1bGx5IHBsYWNlZCBwb3NpdGlvbiAoc28geW91IGNhbiB2aXN1YWxpemUgd2hhdCBjb2xsaXNpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8ganVzdCBtYWRlIHRoZSBzeW1ib2wgZGlzYXBwZWFyLCBhbmQgdGhlIG1vc3QgbGlrZWx5IHBsYWNlIGZvciB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3ltYm9sIHRvIGNvbWUgYmFjaylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hpZnQgPSBjYWxjdWxhdGVWYXJpYWJsZUxheW91dE9mZnNldCh2YXJpYWJsZU9mZnNldC5hbmNob3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlT2Zmc2V0LndpZHRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZU9mZnNldC5oZWlnaHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlT2Zmc2V0LnJhZGlhbE9mZnNldCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVPZmZzZXQudGV4dEJveFNjYWxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJvdGF0ZVdpdGhNYXApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoaWZ0Ll9yb3RhdGUocGl0Y2hXaXRoTWFwID8gdGhpcy50cmFuc2Zvcm0uYW5nbGUgOiAtdGhpcy50cmFuc2Zvcm0uYW5nbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm8gb2Zmc2V0IC0+IHRoaXMgc3ltYm9sIGhhc24ndCBiZWVuIHBsYWNlZCBzaW5jZSBjb21pbmcgb24tc2NyZWVuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vIHNpbmdsZSBib3ggaXMgcGFydGljdWxhcmx5IG1lYW5pbmdmdWwgYW5kIGFsbCBvZiB0aGVtIHdvdWxkIGJlIHRvbyBub2lzeVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVc2UgdGhlIGNlbnRlciBib3gganVzdCB0byBzaG93IHNvbWV0aGluZydzIHRoZXJlLCBidXQgbWFyayBpdCBcIm5vdCB1c2VkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlQ29sbGlzaW9uVmVydGljZXMoYnVja2V0LmNvbGxpc2lvbkJveC5jb2xsaXNpb25WZXJ0ZXhBcnJheSwgb3BhY2l0eVN0YXRlLnRleHQucGxhY2VkLCAhdXNlZCwgc2hpZnQueCwgc2hpZnQueSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoY29sbGlzaW9uQXJyYXlzLmljb25Cb3gpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUNvbGxpc2lvblZlcnRpY2VzKGJ1Y2tldC5jb2xsaXNpb25Cb3guY29sbGlzaW9uVmVydGV4QXJyYXksIG9wYWNpdHlTdGF0ZS5pY29uLnBsYWNlZCwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGV4dENpcmNsZXMgPSBjb2xsaXNpb25BcnJheXMudGV4dENpcmNsZXM7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0Q2lyY2xlcyAmJiBidWNrZXQuaGFzQ29sbGlzaW9uQ2lyY2xlRGF0YSgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IHRleHRDaXJjbGVzLmxlbmd0aDsgayArPSA1KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm90VXNlZCA9IGlzRHVwbGljYXRlIHx8IHRleHRDaXJjbGVzW2sgKyA0XSA9PT0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVDb2xsaXNpb25WZXJ0aWNlcyhidWNrZXQuY29sbGlzaW9uQ2lyY2xlLmNvbGxpc2lvblZlcnRleEFycmF5LCBvcGFjaXR5U3RhdGUudGV4dC5wbGFjZWQsIG5vdFVzZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgYnVja2V0LnNvcnRGZWF0dXJlcyh0aGlzLnRyYW5zZm9ybS5hbmdsZSk7XG4gICAgICAgIGlmICh0aGlzLnJldGFpbmVkUXVlcnlEYXRhW2J1Y2tldC5idWNrZXRJbnN0YW5jZUlkXSkge1xuICAgICAgICAgICAgdGhpcy5yZXRhaW5lZFF1ZXJ5RGF0YVtidWNrZXQuYnVja2V0SW5zdGFuY2VJZF0uZmVhdHVyZVNvcnRPcmRlciA9IGJ1Y2tldC5mZWF0dXJlU29ydE9yZGVyO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGJ1Y2tldC5oYXNUZXh0RGF0YSgpICYmIGJ1Y2tldC50ZXh0Lm9wYWNpdHlWZXJ0ZXhCdWZmZXIpIHtcbiAgICAgICAgICAgIGJ1Y2tldC50ZXh0Lm9wYWNpdHlWZXJ0ZXhCdWZmZXIudXBkYXRlRGF0YShidWNrZXQudGV4dC5vcGFjaXR5VmVydGV4QXJyYXkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChidWNrZXQuaGFzSWNvbkRhdGEoKSAmJiBidWNrZXQuaWNvbi5vcGFjaXR5VmVydGV4QnVmZmVyKSB7XG4gICAgICAgICAgICBidWNrZXQuaWNvbi5vcGFjaXR5VmVydGV4QnVmZmVyLnVwZGF0ZURhdGEoYnVja2V0Lmljb24ub3BhY2l0eVZlcnRleEFycmF5KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYnVja2V0Lmhhc0NvbGxpc2lvbkJveERhdGEoKSAmJiBidWNrZXQuY29sbGlzaW9uQm94LmNvbGxpc2lvblZlcnRleEJ1ZmZlcikge1xuICAgICAgICAgICAgYnVja2V0LmNvbGxpc2lvbkJveC5jb2xsaXNpb25WZXJ0ZXhCdWZmZXIudXBkYXRlRGF0YShidWNrZXQuY29sbGlzaW9uQm94LmNvbGxpc2lvblZlcnRleEFycmF5KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYnVja2V0Lmhhc0NvbGxpc2lvbkNpcmNsZURhdGEoKSAmJiBidWNrZXQuY29sbGlzaW9uQ2lyY2xlLmNvbGxpc2lvblZlcnRleEJ1ZmZlcikge1xuICAgICAgICAgICAgYnVja2V0LmNvbGxpc2lvbkNpcmNsZS5jb2xsaXNpb25WZXJ0ZXhCdWZmZXIudXBkYXRlRGF0YShidWNrZXQuY29sbGlzaW9uQ2lyY2xlLmNvbGxpc2lvblZlcnRleEFycmF5KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGFzc2VydChidWNrZXQudGV4dC5vcGFjaXR5VmVydGV4QXJyYXkubGVuZ3RoID09PSBidWNrZXQudGV4dC5sYXlvdXRWZXJ0ZXhBcnJheS5sZW5ndGggLyA0KTtcbiAgICAgICAgYXNzZXJ0KGJ1Y2tldC5pY29uLm9wYWNpdHlWZXJ0ZXhBcnJheS5sZW5ndGggPT09IGJ1Y2tldC5pY29uLmxheW91dFZlcnRleEFycmF5Lmxlbmd0aCAvIDQpO1xuICAgIH1cblxuICAgIHN5bWJvbEZhZGVDaGFuZ2Uobm93OiBudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmFkZUR1cmF0aW9uID09PSAwID9cbiAgICAgICAgICAgIDEgOlxuICAgICAgICAgICAgKG5vdyAtIHRoaXMuY29tbWl0VGltZSkgLyB0aGlzLmZhZGVEdXJhdGlvbjtcbiAgICB9XG5cbiAgICBoYXNUcmFuc2l0aW9ucyhub3c6IG51bWJlcikge1xuICAgICAgICByZXR1cm4gdGhpcy5zdGFsZSB8fFxuICAgICAgICAgICAgbm93IC0gdGhpcy5sYXN0UGxhY2VtZW50Q2hhbmdlVGltZSA8IHRoaXMuZmFkZUR1cmF0aW9uO1xuICAgIH1cblxuICAgIHN0aWxsUmVjZW50KG5vdzogbnVtYmVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbW1pdFRpbWUgKyB0aGlzLmZhZGVEdXJhdGlvbiA+IG5vdztcbiAgICB9XG5cbiAgICBzZXRTdGFsZSgpIHtcbiAgICAgICAgdGhpcy5zdGFsZSA9IHRydWU7XG4gICAgfVxufVxuXG5mdW5jdGlvbiB1cGRhdGVDb2xsaXNpb25WZXJ0aWNlcyhjb2xsaXNpb25WZXJ0ZXhBcnJheTogQ29sbGlzaW9uVmVydGV4QXJyYXksIHBsYWNlZDogYm9vbGVhbiwgbm90VXNlZDogYm9vbGVhbiwgc2hpZnRYPzogbnVtYmVyLCBzaGlmdFk/OiBudW1iZXIpIHtcbiAgICBjb2xsaXNpb25WZXJ0ZXhBcnJheS5lbXBsYWNlQmFjayhwbGFjZWQgPyAxIDogMCwgbm90VXNlZCA/IDEgOiAwLCBzaGlmdFggfHwgMCwgc2hpZnRZIHx8IDApO1xuICAgIGNvbGxpc2lvblZlcnRleEFycmF5LmVtcGxhY2VCYWNrKHBsYWNlZCA/IDEgOiAwLCBub3RVc2VkID8gMSA6IDAsIHNoaWZ0WCB8fCAwLCBzaGlmdFkgfHwgMCk7XG4gICAgY29sbGlzaW9uVmVydGV4QXJyYXkuZW1wbGFjZUJhY2socGxhY2VkID8gMSA6IDAsIG5vdFVzZWQgPyAxIDogMCwgc2hpZnRYIHx8IDAsIHNoaWZ0WSB8fCAwKTtcbiAgICBjb2xsaXNpb25WZXJ0ZXhBcnJheS5lbXBsYWNlQmFjayhwbGFjZWQgPyAxIDogMCwgbm90VXNlZCA/IDEgOiAwLCBzaGlmdFggfHwgMCwgc2hpZnRZIHx8IDApO1xufVxuXG4vLyBBbGwgZm91ciB2ZXJ0aWNlcyBmb3IgYSBnbHlwaCB3aWxsIGhhdmUgdGhlIHNhbWUgb3BhY2l0eSBzdGF0ZVxuLy8gU28gd2UgcGFjayB0aGUgb3BhY2l0eSBpbnRvIGEgdWludDgsIGFuZCB0aGVuIHJlcGVhdCBpdCBmb3VyIHRpbWVzXG4vLyB0byBtYWtlIGEgc2luZ2xlIHVpbnQzMiB0aGF0IHdlIGNhbiB1cGxvYWQgZm9yIGVhY2ggZ2x5cGggaW4gdGhlXG4vLyBsYWJlbC5cbmNvbnN0IHNoaWZ0MjUgPSBNYXRoLnBvdygyLCAyNSk7XG5jb25zdCBzaGlmdDI0ID0gTWF0aC5wb3coMiwgMjQpO1xuY29uc3Qgc2hpZnQxNyA9IE1hdGgucG93KDIsIDE3KTtcbmNvbnN0IHNoaWZ0MTYgPSBNYXRoLnBvdygyLCAxNik7XG5jb25zdCBzaGlmdDkgPSBNYXRoLnBvdygyLCA5KTtcbmNvbnN0IHNoaWZ0OCA9IE1hdGgucG93KDIsIDgpO1xuY29uc3Qgc2hpZnQxID0gTWF0aC5wb3coMiwgMSk7XG5mdW5jdGlvbiBwYWNrT3BhY2l0eShvcGFjaXR5U3RhdGU6IE9wYWNpdHlTdGF0ZSk6IG51bWJlciB7XG4gICAgaWYgKG9wYWNpdHlTdGF0ZS5vcGFjaXR5ID09PSAwICYmICFvcGFjaXR5U3RhdGUucGxhY2VkKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH0gZWxzZSBpZiAob3BhY2l0eVN0YXRlLm9wYWNpdHkgPT09IDEgJiYgb3BhY2l0eVN0YXRlLnBsYWNlZCkge1xuICAgICAgICByZXR1cm4gNDI5NDk2NzI5NTtcbiAgICB9XG4gICAgY29uc3QgdGFyZ2V0Qml0ID0gb3BhY2l0eVN0YXRlLnBsYWNlZCA/IDEgOiAwO1xuICAgIGNvbnN0IG9wYWNpdHlCaXRzID0gTWF0aC5mbG9vcihvcGFjaXR5U3RhdGUub3BhY2l0eSAqIDEyNyk7XG4gICAgcmV0dXJuIG9wYWNpdHlCaXRzICogc2hpZnQyNSArIHRhcmdldEJpdCAqIHNoaWZ0MjQgK1xuICAgICAgICBvcGFjaXR5Qml0cyAqIHNoaWZ0MTcgKyB0YXJnZXRCaXQgKiBzaGlmdDE2ICtcbiAgICAgICAgb3BhY2l0eUJpdHMgKiBzaGlmdDkgKyB0YXJnZXRCaXQgKiBzaGlmdDggK1xuICAgICAgICBvcGFjaXR5Qml0cyAqIHNoaWZ0MSArIHRhcmdldEJpdDtcbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCBicm93c2VyIGZyb20gJy4uL3V0aWwvYnJvd3Nlcic7XG5cbmltcG9ydCB7IFBsYWNlbWVudCB9IGZyb20gJy4uL3N5bWJvbC9wbGFjZW1lbnQnO1xuXG5pbXBvcnQgdHlwZSBUcmFuc2Zvcm0gZnJvbSAnLi4vZ2VvL3RyYW5zZm9ybSc7XG5pbXBvcnQgdHlwZSBTdHlsZUxheWVyIGZyb20gJy4vc3R5bGVfbGF5ZXInO1xuaW1wb3J0IHR5cGUgVGlsZSBmcm9tICcuLi9zb3VyY2UvdGlsZSc7XG5cbmNsYXNzIExheWVyUGxhY2VtZW50IHtcbiAgICBfY3VycmVudFRpbGVJbmRleDogbnVtYmVyO1xuICAgIF90aWxlczogQXJyYXk8VGlsZT47XG4gICAgX3NlZW5Dcm9zc1RpbGVJRHM6IHsgW3N0cmluZyB8IG51bWJlcl06IGJvb2xlYW4gfTtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLl9jdXJyZW50VGlsZUluZGV4ID0gMDtcbiAgICAgICAgdGhpcy5fc2VlbkNyb3NzVGlsZUlEcyA9IHt9O1xuICAgIH1cblxuICAgIGNvbnRpbnVlUGxhY2VtZW50KHRpbGVzOiBBcnJheTxUaWxlPiwgcGxhY2VtZW50OiBQbGFjZW1lbnQsIHNob3dDb2xsaXNpb25Cb3hlczogYm9vbGVhbiwgc3R5bGVMYXllcjogU3R5bGVMYXllciwgc2hvdWxkUGF1c2VQbGFjZW1lbnQpIHtcbiAgICAgICAgd2hpbGUgKHRoaXMuX2N1cnJlbnRUaWxlSW5kZXggPCB0aWxlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IHRpbGUgPSB0aWxlc1t0aGlzLl9jdXJyZW50VGlsZUluZGV4XTtcbiAgICAgICAgICAgIHBsYWNlbWVudC5wbGFjZUxheWVyVGlsZShzdHlsZUxheWVyLCB0aWxlLCBzaG93Q29sbGlzaW9uQm94ZXMsIHRoaXMuX3NlZW5Dcm9zc1RpbGVJRHMpO1xuXG4gICAgICAgICAgICB0aGlzLl9jdXJyZW50VGlsZUluZGV4Kys7XG4gICAgICAgICAgICBpZiAoc2hvdWxkUGF1c2VQbGFjZW1lbnQoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG5jbGFzcyBQYXVzZWFibGVQbGFjZW1lbnQge1xuICAgIHBsYWNlbWVudDogUGxhY2VtZW50O1xuICAgIF9kb25lOiBib29sZWFuO1xuICAgIF9jdXJyZW50UGxhY2VtZW50SW5kZXg6IG51bWJlcjtcbiAgICBfZm9yY2VGdWxsUGxhY2VtZW50OiBib29sZWFuO1xuICAgIF9zaG93Q29sbGlzaW9uQm94ZXM6IGJvb2xlYW47XG4gICAgX2luUHJvZ3Jlc3NMYXllcjogP0xheWVyUGxhY2VtZW50O1xuXG4gICAgY29uc3RydWN0b3IodHJhbnNmb3JtOiBUcmFuc2Zvcm0sIG9yZGVyOiBBcnJheTxzdHJpbmc+LFxuICAgICAgICAgICAgICAgIGZvcmNlRnVsbFBsYWNlbWVudDogYm9vbGVhbixcbiAgICAgICAgICAgICAgICBzaG93Q29sbGlzaW9uQm94ZXM6IGJvb2xlYW4sXG4gICAgICAgICAgICAgICAgZmFkZUR1cmF0aW9uOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgY3Jvc3NTb3VyY2VDb2xsaXNpb25zOiBib29sZWFuLFxuICAgICAgICAgICAgICAgIHByZXZQbGFjZW1lbnQ/OiBQbGFjZW1lbnQpIHtcblxuICAgICAgICB0aGlzLnBsYWNlbWVudCA9IG5ldyBQbGFjZW1lbnQodHJhbnNmb3JtLCBmYWRlRHVyYXRpb24sIGNyb3NzU291cmNlQ29sbGlzaW9ucywgcHJldlBsYWNlbWVudCk7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRQbGFjZW1lbnRJbmRleCA9IG9yZGVyLmxlbmd0aCAtIDE7XG4gICAgICAgIHRoaXMuX2ZvcmNlRnVsbFBsYWNlbWVudCA9IGZvcmNlRnVsbFBsYWNlbWVudDtcbiAgICAgICAgdGhpcy5fc2hvd0NvbGxpc2lvbkJveGVzID0gc2hvd0NvbGxpc2lvbkJveGVzO1xuICAgICAgICB0aGlzLl9kb25lID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaXNEb25lKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZG9uZTtcbiAgICB9XG5cbiAgICBjb250aW51ZVBsYWNlbWVudChvcmRlcjogQXJyYXk8c3RyaW5nPiwgbGF5ZXJzOiB7W3N0cmluZ106IFN0eWxlTGF5ZXJ9LCBsYXllclRpbGVzOiB7W3N0cmluZ106IEFycmF5PFRpbGU+fSkge1xuICAgICAgICBjb25zdCBzdGFydFRpbWUgPSBicm93c2VyLm5vdygpO1xuXG4gICAgICAgIGNvbnN0IHNob3VsZFBhdXNlUGxhY2VtZW50ID0gKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZWxhcHNlZFRpbWUgPSBicm93c2VyLm5vdygpIC0gc3RhcnRUaW1lO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ZvcmNlRnVsbFBsYWNlbWVudCA/IGZhbHNlIDogZWxhcHNlZFRpbWUgPiAyO1xuICAgICAgICB9O1xuXG4gICAgICAgIHdoaWxlICh0aGlzLl9jdXJyZW50UGxhY2VtZW50SW5kZXggPj0gMCkge1xuICAgICAgICAgICAgY29uc3QgbGF5ZXJJZCA9IG9yZGVyW3RoaXMuX2N1cnJlbnRQbGFjZW1lbnRJbmRleF07XG4gICAgICAgICAgICBjb25zdCBsYXllciA9IGxheWVyc1tsYXllcklkXTtcbiAgICAgICAgICAgIGNvbnN0IHBsYWNlbWVudFpvb20gPSB0aGlzLnBsYWNlbWVudC5jb2xsaXNpb25JbmRleC50cmFuc2Zvcm0uem9vbTtcbiAgICAgICAgICAgIGlmIChsYXllci50eXBlID09PSAnc3ltYm9sJyAmJlxuICAgICAgICAgICAgICAgICghbGF5ZXIubWluem9vbSB8fCBsYXllci5taW56b29tIDw9IHBsYWNlbWVudFpvb20pICYmXG4gICAgICAgICAgICAgICAgKCFsYXllci5tYXh6b29tIHx8IGxheWVyLm1heHpvb20gPiBwbGFjZW1lbnRab29tKSkge1xuXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLl9pblByb2dyZXNzTGF5ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faW5Qcm9ncmVzc0xheWVyID0gbmV3IExheWVyUGxhY2VtZW50KCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgcGF1c2VQbGFjZW1lbnQgPSB0aGlzLl9pblByb2dyZXNzTGF5ZXIuY29udGludWVQbGFjZW1lbnQobGF5ZXJUaWxlc1tsYXllci5zb3VyY2VdLCB0aGlzLnBsYWNlbWVudCwgdGhpcy5fc2hvd0NvbGxpc2lvbkJveGVzLCBsYXllciwgc2hvdWxkUGF1c2VQbGFjZW1lbnQpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHBhdXNlUGxhY2VtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFdlIGRpZG4ndCBmaW5pc2ggcGxhY2luZyBhbGwgbGF5ZXJzIHdpdGhpbiAybXMsXG4gICAgICAgICAgICAgICAgICAgIC8vIGJ1dCB3ZSBjYW4ga2VlcCByZW5kZXJpbmcgd2l0aCBhIHBhcnRpYWwgcGxhY2VtZW50XG4gICAgICAgICAgICAgICAgICAgIC8vIFdlJ2xsIHJlc3VtZSBoZXJlIG9uIHRoZSBuZXh0IGZyYW1lXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5faW5Qcm9ncmVzc0xheWVyO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLl9jdXJyZW50UGxhY2VtZW50SW5kZXgtLTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2RvbmUgPSB0cnVlO1xuICAgIH1cblxuICAgIGNvbW1pdChub3c6IG51bWJlcikge1xuICAgICAgICB0aGlzLnBsYWNlbWVudC5jb21taXQobm93KTtcbiAgICAgICAgcmV0dXJuIHRoaXMucGxhY2VtZW50O1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgUGF1c2VhYmxlUGxhY2VtZW50O1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IEVYVEVOVCBmcm9tICcuLi9kYXRhL2V4dGVudCc7XG5cbmltcG9ydCB7IFN5bWJvbEluc3RhbmNlQXJyYXkgfSBmcm9tICcuLi9kYXRhL2FycmF5X3R5cGVzJztcblxuaW1wb3J0IHR5cGUgeyBTeW1ib2xJbnN0YW5jZSB9IGZyb20gJy4uL2RhdGEvYXJyYXlfdHlwZXMnO1xuaW1wb3J0IHR5cGUge092ZXJzY2FsZWRUaWxlSUR9IGZyb20gJy4uL3NvdXJjZS90aWxlX2lkJztcbmltcG9ydCB0eXBlIFN5bWJvbEJ1Y2tldCBmcm9tICcuLi9kYXRhL2J1Y2tldC9zeW1ib2xfYnVja2V0JztcbmltcG9ydCB0eXBlIFN0eWxlTGF5ZXIgZnJvbSAnLi4vc3R5bGUvc3R5bGVfbGF5ZXInO1xuaW1wb3J0IHR5cGUgVGlsZSBmcm9tICcuLi9zb3VyY2UvdGlsZSc7XG5cbi8qXG4gICAgVGhlIENyb3NzVGlsZVN5bWJvbEluZGV4IGdlbmVyYWxseSB3b3JrcyBvbiB0aGUgYXNzdW1wdGlvbiB0aGF0XG4gICAgYSBjb25jZXB0dWFsIFwidW5pcXVlIHN5bWJvbFwiIGNhbiBiZSBpZGVudGlmaWVkIGJ5IHRoZSB0ZXh0IG9mXG4gICAgdGhlIGxhYmVsIGNvbWJpbmVkIHdpdGggdGhlIGFuY2hvciBwb2ludC4gVGhlIGdvYWwgaXMgdG8gYXNzaWduXG4gICAgdGhlc2UgY29uY2VwdHVhbCBcInVuaXF1ZSBzeW1ib2xzXCIgYSBzaGFyZWQgY3Jvc3NUaWxlSUQgdGhhdCBjYW4gYmVcbiAgICB1c2VkIGJ5IFBsYWNlbWVudCB0byBrZWVwIGZhZGluZyBvcGFjaXR5IHN0YXRlcyBjb25zaXN0ZW50IGFuZCB0b1xuICAgIGRlZHVwbGljYXRlIGxhYmVscy5cblxuICAgIFRoZSBDcm9zc1RpbGVTeW1ib2xJbmRleCBpbmRleGVzIGFsbCB0aGUgY3VycmVudCBzeW1ib2wgaW5zdGFuY2VzIGFuZFxuICAgIHRoZWlyIGNyb3NzVGlsZUlEcy4gV2hlbiBhIHN5bWJvbCBidWNrZXQgZ2V0cyBhZGRlZCBvciB1cGRhdGVkLCB0aGVcbiAgICBpbmRleCBhc3NpZ25zIGEgY3Jvc3NUaWxlSUQgdG8gZWFjaCBvZiBpdCdzIHN5bWJvbCBpbnN0YW5jZXMgYnkgZWl0aGVyXG4gICAgbWF0Y2hpbmcgaXQgd2l0aCBhbiBleGlzdGluZyBpZCBvciBhc3NpZ25pbmcgYSBuZXcgb25lLlxuKi9cblxuLy8gUm91bmQgYW5jaG9yIHBvc2l0aW9ucyB0byByb3VnaGx5IDQgcGl4ZWwgZ3JpZFxuY29uc3Qgcm91bmRpbmdGYWN0b3IgPSA1MTIgLyBFWFRFTlQgLyAyO1xuXG5jbGFzcyBUaWxlTGF5ZXJJbmRleCB7XG4gICAgdGlsZUlEOiBPdmVyc2NhbGVkVGlsZUlEO1xuICAgIGluZGV4ZWRTeW1ib2xJbnN0YW5jZXM6IHtbbnVtYmVyXTogQXJyYXk8e1xuICAgICAgICBjcm9zc1RpbGVJRDogbnVtYmVyLFxuICAgICAgICBjb29yZDoge1xuICAgICAgICAgICAgeDogbnVtYmVyLFxuICAgICAgICAgICAgeTogbnVtYmVyXG4gICAgICAgIH1cbiAgICB9Pn07XG4gICAgYnVja2V0SW5zdGFuY2VJZDogbnVtYmVyO1xuXG4gICAgY29uc3RydWN0b3IodGlsZUlEOiBPdmVyc2NhbGVkVGlsZUlELCBzeW1ib2xJbnN0YW5jZXM6IFN5bWJvbEluc3RhbmNlQXJyYXksIGJ1Y2tldEluc3RhbmNlSWQ6IG51bWJlcikge1xuICAgICAgICB0aGlzLnRpbGVJRCA9IHRpbGVJRDtcbiAgICAgICAgdGhpcy5pbmRleGVkU3ltYm9sSW5zdGFuY2VzID0ge307XG4gICAgICAgIHRoaXMuYnVja2V0SW5zdGFuY2VJZCA9IGJ1Y2tldEluc3RhbmNlSWQ7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzeW1ib2xJbnN0YW5jZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHN5bWJvbEluc3RhbmNlID0gc3ltYm9sSW5zdGFuY2VzLmdldChpKTtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IHN5bWJvbEluc3RhbmNlLmtleTtcbiAgICAgICAgICAgIGlmICghdGhpcy5pbmRleGVkU3ltYm9sSW5zdGFuY2VzW2tleV0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmluZGV4ZWRTeW1ib2xJbnN0YW5jZXNba2V5XSA9IFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVGhpcyB0aWxlIG1heSBoYXZlIG11bHRpcGxlIHN5bWJvbCBpbnN0YW5jZXMgd2l0aCB0aGUgc2FtZSBrZXlcbiAgICAgICAgICAgIC8vIFN0b3JlIGVhY2ggb25lIGFsb25nIHdpdGggaXRzIGNvb3JkaW5hdGVzXG4gICAgICAgICAgICB0aGlzLmluZGV4ZWRTeW1ib2xJbnN0YW5jZXNba2V5XS5wdXNoKHtcbiAgICAgICAgICAgICAgICBjcm9zc1RpbGVJRDogc3ltYm9sSW5zdGFuY2UuY3Jvc3NUaWxlSUQsXG4gICAgICAgICAgICAgICAgY29vcmQ6IHRoaXMuZ2V0U2NhbGVkQ29vcmRpbmF0ZXMoc3ltYm9sSW5zdGFuY2UsIHRpbGVJRClcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ29udmVydHMgdGhlIGNvb3JkaW5hdGVzIG9mIHRoZSBpbnB1dCBzeW1ib2wgaW5zdGFuY2UgaW50byBjb29yZGluYXRlcyB0aGF0IGJlIGNhbiBjb21wYXJlZFxuICAgIC8vIGFnYWluc3Qgb3RoZXIgc3ltYm9scyBpbiB0aGlzIGluZGV4LiBDb29yZGluYXRlcyBhcmU6XG4gICAgLy8gKDEpIHdvcmxkLWJhc2VkIChzbyBhZnRlciBjb252ZXJzaW9uIHRoZSBzb3VyY2UgdGlsZSBpcyBpcnJlbGV2YW50KVxuICAgIC8vICgyKSBjb252ZXJ0ZWQgdG8gdGhlIHotc2NhbGUgb2YgdGhpcyBUaWxlTGF5ZXJJbmRleFxuICAgIC8vICgzKSBkb3duLXNhbXBsZWQgYnkgXCJyb3VuZGluZ0ZhY3RvclwiIGZyb20gdGlsZSBjb29yZGluYXRlIHByZWNpc2lvbiBpbiBvcmRlciB0byBiZVxuICAgIC8vICAgICBtb3JlIHRvbGVyYW50IG9mIHNtYWxsIGRpZmZlcmVuY2VzIGJldHdlZW4gdGlsZXMuXG4gICAgZ2V0U2NhbGVkQ29vcmRpbmF0ZXMoc3ltYm9sSW5zdGFuY2U6IFN5bWJvbEluc3RhbmNlLCBjaGlsZFRpbGVJRDogT3ZlcnNjYWxlZFRpbGVJRCkge1xuICAgICAgICBjb25zdCB6RGlmZmVyZW5jZSA9IGNoaWxkVGlsZUlELmNhbm9uaWNhbC56IC0gdGhpcy50aWxlSUQuY2Fub25pY2FsLno7XG4gICAgICAgIGNvbnN0IHNjYWxlID0gcm91bmRpbmdGYWN0b3IgLyBNYXRoLnBvdygyLCB6RGlmZmVyZW5jZSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB4OiBNYXRoLmZsb29yKChjaGlsZFRpbGVJRC5jYW5vbmljYWwueCAqIEVYVEVOVCArIHN5bWJvbEluc3RhbmNlLmFuY2hvclgpICogc2NhbGUpLFxuICAgICAgICAgICAgeTogTWF0aC5mbG9vcigoY2hpbGRUaWxlSUQuY2Fub25pY2FsLnkgKiBFWFRFTlQgKyBzeW1ib2xJbnN0YW5jZS5hbmNob3JZKSAqIHNjYWxlKVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZpbmRNYXRjaGVzKHN5bWJvbEluc3RhbmNlczogU3ltYm9sSW5zdGFuY2VBcnJheSwgbmV3VGlsZUlEOiBPdmVyc2NhbGVkVGlsZUlELCB6b29tQ3Jvc3NUaWxlSURzOiB7W2Nyb3NzVGlsZUlEOiBudW1iZXJdOiBib29sZWFufSkge1xuICAgICAgICBjb25zdCB0b2xlcmFuY2UgPSB0aGlzLnRpbGVJRC5jYW5vbmljYWwueiA8IG5ld1RpbGVJRC5jYW5vbmljYWwueiA/IDEgOiBNYXRoLnBvdygyLCB0aGlzLnRpbGVJRC5jYW5vbmljYWwueiAtIG5ld1RpbGVJRC5jYW5vbmljYWwueik7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzeW1ib2xJbnN0YW5jZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHN5bWJvbEluc3RhbmNlID0gc3ltYm9sSW5zdGFuY2VzLmdldChpKTtcbiAgICAgICAgICAgIGlmIChzeW1ib2xJbnN0YW5jZS5jcm9zc1RpbGVJRCkge1xuICAgICAgICAgICAgICAgIC8vIGFscmVhZHkgaGFzIGEgbWF0Y2gsIHNraXBcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgaW5kZXhlZEluc3RhbmNlcyA9IHRoaXMuaW5kZXhlZFN5bWJvbEluc3RhbmNlc1tzeW1ib2xJbnN0YW5jZS5rZXldO1xuICAgICAgICAgICAgaWYgKCFpbmRleGVkSW5zdGFuY2VzKSB7XG4gICAgICAgICAgICAgICAgLy8gTm8gc3ltYm9sIHdpdGggdGhpcyBrZXkgaW4gdGhpcyBidWNrZXRcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3Qgc2NhbGVkU3ltYm9sQ29vcmQgPSB0aGlzLmdldFNjYWxlZENvb3JkaW5hdGVzKHN5bWJvbEluc3RhbmNlLCBuZXdUaWxlSUQpO1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHRoaXNUaWxlU3ltYm9sIG9mIGluZGV4ZWRJbnN0YW5jZXMpIHtcbiAgICAgICAgICAgICAgICAvLyBSZXR1cm4gYW55IHN5bWJvbCB3aXRoIHRoZSBzYW1lIGtleXMgd2hvc2UgY29vcmRpbmF0ZXMgYXJlIHdpdGhpbiAxXG4gICAgICAgICAgICAgICAgLy8gZ3JpZCB1bml0LiAod2l0aCBhIDRweCBncmlkLCB0aGlzIGNvdmVycyBhIDEycHggYnkgMTJweCBhcmVhKVxuICAgICAgICAgICAgICAgIGlmIChNYXRoLmFicyh0aGlzVGlsZVN5bWJvbC5jb29yZC54IC0gc2NhbGVkU3ltYm9sQ29vcmQueCkgPD0gdG9sZXJhbmNlICYmXG4gICAgICAgICAgICAgICAgICAgIE1hdGguYWJzKHRoaXNUaWxlU3ltYm9sLmNvb3JkLnkgLSBzY2FsZWRTeW1ib2xDb29yZC55KSA8PSB0b2xlcmFuY2UgJiZcbiAgICAgICAgICAgICAgICAgICAgIXpvb21Dcm9zc1RpbGVJRHNbdGhpc1RpbGVTeW1ib2wuY3Jvc3NUaWxlSURdKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIE9uY2Ugd2UndmUgbWFya2VkIG91cnNlbHZlcyBkdXBsaWNhdGUgYWdhaW5zdCB0aGlzIHBhcmVudCBzeW1ib2wsXG4gICAgICAgICAgICAgICAgICAgIC8vIGRvbid0IGxldCBhbnkgb3RoZXIgc3ltYm9scyBhdCB0aGUgc2FtZSB6b29tIGxldmVsIGR1cGxpY2F0ZSBhZ2FpbnN0XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzYW1lIHBhcmVudCAoc2VlIGlzc3VlICM1OTkzKVxuICAgICAgICAgICAgICAgICAgICB6b29tQ3Jvc3NUaWxlSURzW3RoaXNUaWxlU3ltYm9sLmNyb3NzVGlsZUlEXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHN5bWJvbEluc3RhbmNlLmNyb3NzVGlsZUlEID0gdGhpc1RpbGVTeW1ib2wuY3Jvc3NUaWxlSUQ7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuY2xhc3MgQ3Jvc3NUaWxlSURzIHtcbiAgICBtYXhDcm9zc1RpbGVJRDogbnVtYmVyO1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLm1heENyb3NzVGlsZUlEID0gMDtcbiAgICB9XG4gICAgZ2VuZXJhdGUoKSB7XG4gICAgICAgIHJldHVybiArK3RoaXMubWF4Q3Jvc3NUaWxlSUQ7XG4gICAgfVxufVxuXG5jbGFzcyBDcm9zc1RpbGVTeW1ib2xMYXllckluZGV4IHtcbiAgICBpbmRleGVzOiB7W3pvb206IHN0cmluZyB8IG51bWJlcl06IHtbdGlsZUlkOiBzdHJpbmcgfCBudW1iZXJdOiBUaWxlTGF5ZXJJbmRleH19O1xuICAgIHVzZWRDcm9zc1RpbGVJRHM6IHtbem9vbTogc3RyaW5nIHwgbnVtYmVyXToge1tjcm9zc1RpbGVJRDogbnVtYmVyXTogYm9vbGVhbn19O1xuICAgIGxuZzogbnVtYmVyO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuaW5kZXhlcyA9IHt9O1xuICAgICAgICB0aGlzLnVzZWRDcm9zc1RpbGVJRHMgPSB7fTtcbiAgICAgICAgdGhpcy5sbmcgPSAwO1xuICAgIH1cblxuICAgIC8qXG4gICAgICogU29tZXRpbWVzIHdoZW4gYSB1c2VyIHBhbnMgYWNyb3NzIHRoZSBhbnRpbWVyaWRpYW4gdGhlIGxvbmdpdHVkZSB2YWx1ZSBnZXRzIHdyYXBwZWQuXG4gICAgICogVG8gcHJldmVudCBsYWJlbHMgZnJvbSBmbGFzaGluZyBvdXQgYW5kIGluIHdlIGFkanVzdCB0aGUgdGlsZUlEIHZhbHVlcyBpbiB0aGUgaW5kZXhlc1xuICAgICAqIHNvIHRoYXQgdGhleSBtYXRjaCB0aGUgbmV3IHdyYXBwZWQgdmVyc2lvbiBvZiB0aGUgbWFwLlxuICAgICAqL1xuICAgIGhhbmRsZVdyYXBKdW1wKGxuZzogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IHdyYXBEZWx0YSA9IE1hdGgucm91bmQoKGxuZyAtIHRoaXMubG5nKSAvIDM2MCk7XG4gICAgICAgIGlmICh3cmFwRGVsdGEgIT09IDApIHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qgem9vbSBpbiB0aGlzLmluZGV4ZXMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB6b29tSW5kZXhlcyA9IHRoaXMuaW5kZXhlc1t6b29tXTtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdab29tSW5kZXggPSB7fTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiB6b29tSW5kZXhlcykge1xuICAgICAgICAgICAgICAgICAgICAvLyBjaGFuZ2UgdGhlIHRpbGVJRCdzIHdyYXAgYW5kIGFkZCBpdCB0byBhIG5ldyBpbmRleFxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IHpvb21JbmRleGVzW2tleV07XG4gICAgICAgICAgICAgICAgICAgIGluZGV4LnRpbGVJRCA9IGluZGV4LnRpbGVJRC51bndyYXBUbyhpbmRleC50aWxlSUQud3JhcCArIHdyYXBEZWx0YSk7XG4gICAgICAgICAgICAgICAgICAgIG5ld1pvb21JbmRleFtpbmRleC50aWxlSUQua2V5XSA9IGluZGV4O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmluZGV4ZXNbem9vbV0gPSBuZXdab29tSW5kZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5sbmcgPSBsbmc7XG4gICAgfVxuXG4gICAgYWRkQnVja2V0KHRpbGVJRDogT3ZlcnNjYWxlZFRpbGVJRCwgYnVja2V0OiBTeW1ib2xCdWNrZXQsIGNyb3NzVGlsZUlEczogQ3Jvc3NUaWxlSURzKSB7XG4gICAgICAgIGlmICh0aGlzLmluZGV4ZXNbdGlsZUlELm92ZXJzY2FsZWRaXSAmJlxuICAgICAgICAgICAgdGhpcy5pbmRleGVzW3RpbGVJRC5vdmVyc2NhbGVkWl1bdGlsZUlELmtleV0pIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmluZGV4ZXNbdGlsZUlELm92ZXJzY2FsZWRaXVt0aWxlSUQua2V5XS5idWNrZXRJbnN0YW5jZUlkID09PVxuICAgICAgICAgICAgICAgIGJ1Y2tldC5idWNrZXRJbnN0YW5jZUlkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBXZSdyZSByZXBsYWNpbmcgdGhpcyBidWNrZXQgd2l0aCBhbiB1cGRhdGVkIHZlcnNpb25cbiAgICAgICAgICAgICAgICAvLyBSZW1vdmUgdGhlIG9sZCBidWNrZXQncyBcInVzZWQgY3Jvc3NUaWxlSURzXCIgbm93IHNvIHRoYXRcbiAgICAgICAgICAgICAgICAvLyB0aGUgbmV3IGJ1Y2tldCBjYW4gY2xhaW0gdGhlbS5cbiAgICAgICAgICAgICAgICAvLyBUaGUgb2xkIGluZGV4IGVudHJpZXMgdGhlbXNlbHZlcyBzdGljayBhcm91bmQgdW50aWxcbiAgICAgICAgICAgICAgICAvLyAncmVtb3ZlU3RhbGVCdWNrZXRzJyBpcyBjYWxsZWQuXG4gICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVCdWNrZXRDcm9zc1RpbGVJRHModGlsZUlELm92ZXJzY2FsZWRaLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmluZGV4ZXNbdGlsZUlELm92ZXJzY2FsZWRaXVt0aWxlSUQua2V5XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ1Y2tldC5zeW1ib2xJbnN0YW5jZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHN5bWJvbEluc3RhbmNlID0gYnVja2V0LnN5bWJvbEluc3RhbmNlcy5nZXQoaSk7XG4gICAgICAgICAgICBzeW1ib2xJbnN0YW5jZS5jcm9zc1RpbGVJRCA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMudXNlZENyb3NzVGlsZUlEc1t0aWxlSUQub3ZlcnNjYWxlZFpdKSB7XG4gICAgICAgICAgICB0aGlzLnVzZWRDcm9zc1RpbGVJRHNbdGlsZUlELm92ZXJzY2FsZWRaXSA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHpvb21Dcm9zc1RpbGVJRHMgPSB0aGlzLnVzZWRDcm9zc1RpbGVJRHNbdGlsZUlELm92ZXJzY2FsZWRaXTtcblxuICAgICAgICBmb3IgKGNvbnN0IHpvb20gaW4gdGhpcy5pbmRleGVzKSB7XG4gICAgICAgICAgICBjb25zdCB6b29tSW5kZXhlcyA9IHRoaXMuaW5kZXhlc1t6b29tXTtcbiAgICAgICAgICAgIGlmIChOdW1iZXIoem9vbSkgPiB0aWxlSUQub3ZlcnNjYWxlZFopIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGlkIGluIHpvb21JbmRleGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkSW5kZXggPSB6b29tSW5kZXhlc1tpZF07XG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZEluZGV4LnRpbGVJRC5pc0NoaWxkT2YodGlsZUlEKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRJbmRleC5maW5kTWF0Y2hlcyhidWNrZXQuc3ltYm9sSW5zdGFuY2VzLCB0aWxlSUQsIHpvb21Dcm9zc1RpbGVJRHMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRDb29yZCA9IHRpbGVJRC5zY2FsZWRUbyhOdW1iZXIoem9vbSkpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudEluZGV4ID0gem9vbUluZGV4ZXNbcGFyZW50Q29vcmQua2V5XTtcbiAgICAgICAgICAgICAgICBpZiAocGFyZW50SW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50SW5kZXguZmluZE1hdGNoZXMoYnVja2V0LnN5bWJvbEluc3RhbmNlcywgdGlsZUlELCB6b29tQ3Jvc3NUaWxlSURzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ1Y2tldC5zeW1ib2xJbnN0YW5jZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHN5bWJvbEluc3RhbmNlID0gYnVja2V0LnN5bWJvbEluc3RhbmNlcy5nZXQoaSk7XG4gICAgICAgICAgICBpZiAoIXN5bWJvbEluc3RhbmNlLmNyb3NzVGlsZUlEKSB7XG4gICAgICAgICAgICAgICAgLy8gc3ltYm9sIGRpZCBub3QgbWF0Y2ggYW55IGtub3duIHN5bWJvbCwgYXNzaWduIGEgbmV3IGlkXG4gICAgICAgICAgICAgICAgc3ltYm9sSW5zdGFuY2UuY3Jvc3NUaWxlSUQgPSBjcm9zc1RpbGVJRHMuZ2VuZXJhdGUoKTtcbiAgICAgICAgICAgICAgICB6b29tQ3Jvc3NUaWxlSURzW3N5bWJvbEluc3RhbmNlLmNyb3NzVGlsZUlEXSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5pbmRleGVzW3RpbGVJRC5vdmVyc2NhbGVkWl0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5pbmRleGVzW3RpbGVJRC5vdmVyc2NhbGVkWl0gPSB7fTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmluZGV4ZXNbdGlsZUlELm92ZXJzY2FsZWRaXVt0aWxlSUQua2V5XSA9IG5ldyBUaWxlTGF5ZXJJbmRleCh0aWxlSUQsIGJ1Y2tldC5zeW1ib2xJbnN0YW5jZXMsIGJ1Y2tldC5idWNrZXRJbnN0YW5jZUlkKTtcblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZW1vdmVCdWNrZXRDcm9zc1RpbGVJRHMoem9vbTogc3RyaW5nIHwgbnVtYmVyLCByZW1vdmVkQnVja2V0OiBUaWxlTGF5ZXJJbmRleCkge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiByZW1vdmVkQnVja2V0LmluZGV4ZWRTeW1ib2xJbnN0YW5jZXMpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc3ltYm9sSW5zdGFuY2Ugb2YgcmVtb3ZlZEJ1Y2tldC5pbmRleGVkU3ltYm9sSW5zdGFuY2VzWyhrZXk6IGFueSldKSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMudXNlZENyb3NzVGlsZUlEc1t6b29tXVtzeW1ib2xJbnN0YW5jZS5jcm9zc1RpbGVJRF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZW1vdmVTdGFsZUJ1Y2tldHMoY3VycmVudElEczogeyBbc3RyaW5nIHwgbnVtYmVyXTogYm9vbGVhbiB9KSB7XG4gICAgICAgIGxldCB0aWxlc0NoYW5nZWQgPSBmYWxzZTtcbiAgICAgICAgZm9yIChjb25zdCB6IGluIHRoaXMuaW5kZXhlcykge1xuICAgICAgICAgICAgY29uc3Qgem9vbUluZGV4ZXMgPSB0aGlzLmluZGV4ZXNbel07XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHRpbGVLZXkgaW4gem9vbUluZGV4ZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWN1cnJlbnRJRHNbem9vbUluZGV4ZXNbdGlsZUtleV0uYnVja2V0SW5zdGFuY2VJZF0pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVCdWNrZXRDcm9zc1RpbGVJRHMoeiwgem9vbUluZGV4ZXNbdGlsZUtleV0pO1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgem9vbUluZGV4ZXNbdGlsZUtleV07XG4gICAgICAgICAgICAgICAgICAgIHRpbGVzQ2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aWxlc0NoYW5nZWQ7XG4gICAgfVxufVxuXG5jbGFzcyBDcm9zc1RpbGVTeW1ib2xJbmRleCB7XG4gICAgbGF5ZXJJbmRleGVzOiB7W2xheWVySWQ6IHN0cmluZ106IENyb3NzVGlsZVN5bWJvbExheWVySW5kZXh9O1xuICAgIGNyb3NzVGlsZUlEczogQ3Jvc3NUaWxlSURzO1xuICAgIG1heEJ1Y2tldEluc3RhbmNlSWQ6IG51bWJlcjtcbiAgICBidWNrZXRzSW5DdXJyZW50UGxhY2VtZW50OiB7W251bWJlcl06IGJvb2xlYW59O1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMubGF5ZXJJbmRleGVzID0ge307XG4gICAgICAgIHRoaXMuY3Jvc3NUaWxlSURzID0gbmV3IENyb3NzVGlsZUlEcygpO1xuICAgICAgICB0aGlzLm1heEJ1Y2tldEluc3RhbmNlSWQgPSAwO1xuICAgICAgICB0aGlzLmJ1Y2tldHNJbkN1cnJlbnRQbGFjZW1lbnQgPSB7fTtcbiAgICB9XG5cbiAgICBhZGRMYXllcihzdHlsZUxheWVyOiBTdHlsZUxheWVyLCB0aWxlczogQXJyYXk8VGlsZT4sIGxuZzogbnVtYmVyKSB7XG4gICAgICAgIGxldCBsYXllckluZGV4ID0gdGhpcy5sYXllckluZGV4ZXNbc3R5bGVMYXllci5pZF07XG4gICAgICAgIGlmIChsYXllckluZGV4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxheWVySW5kZXggPSB0aGlzLmxheWVySW5kZXhlc1tzdHlsZUxheWVyLmlkXSA9IG5ldyBDcm9zc1RpbGVTeW1ib2xMYXllckluZGV4KCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgc3ltYm9sQnVja2V0c0NoYW5nZWQgPSBmYWxzZTtcbiAgICAgICAgY29uc3QgY3VycmVudEJ1Y2tldElEcyA9IHt9O1xuXG4gICAgICAgIGxheWVySW5kZXguaGFuZGxlV3JhcEp1bXAobG5nKTtcblxuICAgICAgICBmb3IgKGNvbnN0IHRpbGUgb2YgdGlsZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHN5bWJvbEJ1Y2tldCA9ICgodGlsZS5nZXRCdWNrZXQoc3R5bGVMYXllcik6IGFueSk6IFN5bWJvbEJ1Y2tldCk7XG4gICAgICAgICAgICBpZiAoIXN5bWJvbEJ1Y2tldCB8fCBzdHlsZUxheWVyLmlkICE9PSBzeW1ib2xCdWNrZXQubGF5ZXJJZHNbMF0pXG4gICAgICAgICAgICAgICAgY29udGludWU7XG5cbiAgICAgICAgICAgIGlmICghc3ltYm9sQnVja2V0LmJ1Y2tldEluc3RhbmNlSWQpIHtcbiAgICAgICAgICAgICAgICBzeW1ib2xCdWNrZXQuYnVja2V0SW5zdGFuY2VJZCA9ICsrdGhpcy5tYXhCdWNrZXRJbnN0YW5jZUlkO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobGF5ZXJJbmRleC5hZGRCdWNrZXQodGlsZS50aWxlSUQsIHN5bWJvbEJ1Y2tldCwgdGhpcy5jcm9zc1RpbGVJRHMpKSB7XG4gICAgICAgICAgICAgICAgc3ltYm9sQnVja2V0c0NoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY3VycmVudEJ1Y2tldElEc1tzeW1ib2xCdWNrZXQuYnVja2V0SW5zdGFuY2VJZF0gPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGxheWVySW5kZXgucmVtb3ZlU3RhbGVCdWNrZXRzKGN1cnJlbnRCdWNrZXRJRHMpKSB7XG4gICAgICAgICAgICBzeW1ib2xCdWNrZXRzQ2hhbmdlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc3ltYm9sQnVja2V0c0NoYW5nZWQ7XG4gICAgfVxuXG4gICAgcHJ1bmVVbnVzZWRMYXllcnModXNlZExheWVyczogQXJyYXk8c3RyaW5nPikge1xuICAgICAgICBjb25zdCB1c2VkTGF5ZXJNYXAgPSB7fTtcbiAgICAgICAgdXNlZExheWVycy5mb3JFYWNoKCh1c2VkTGF5ZXIpID0+IHtcbiAgICAgICAgICAgIHVzZWRMYXllck1hcFt1c2VkTGF5ZXJdID0gdHJ1ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIGZvciAoY29uc3QgbGF5ZXJJZCBpbiB0aGlzLmxheWVySW5kZXhlcykge1xuICAgICAgICAgICAgaWYgKCF1c2VkTGF5ZXJNYXBbbGF5ZXJJZF0pIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5sYXllckluZGV4ZXNbbGF5ZXJJZF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IENyb3NzVGlsZVN5bWJvbEluZGV4O1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5pbXBvcnQgeyBFdmVudCwgRXJyb3JFdmVudCwgRXZlbnRlZCB9IGZyb20gJy4uL3V0aWwvZXZlbnRlZCc7XG5pbXBvcnQgU3R5bGVMYXllciBmcm9tICcuL3N0eWxlX2xheWVyJztcbmltcG9ydCBjcmVhdGVTdHlsZUxheWVyIGZyb20gJy4vY3JlYXRlX3N0eWxlX2xheWVyJztcbmltcG9ydCBsb2FkU3ByaXRlIGZyb20gJy4vbG9hZF9zcHJpdGUnO1xuaW1wb3J0IEltYWdlTWFuYWdlciBmcm9tICcuLi9yZW5kZXIvaW1hZ2VfbWFuYWdlcic7XG5pbXBvcnQgR2x5cGhNYW5hZ2VyIGZyb20gJy4uL3JlbmRlci9nbHlwaF9tYW5hZ2VyJztcbmltcG9ydCBMaWdodCBmcm9tICcuL2xpZ2h0JztcbmltcG9ydCBMaW5lQXRsYXMgZnJvbSAnLi4vcmVuZGVyL2xpbmVfYXRsYXMnO1xuaW1wb3J0IHsgcGljaywgY2xvbmUsIGV4dGVuZCwgZGVlcEVxdWFsLCBmaWx0ZXJPYmplY3QsIG1hcE9iamVjdCB9IGZyb20gJy4uL3V0aWwvdXRpbCc7XG5pbXBvcnQgeyBnZXRKU09OLCBnZXRSZWZlcnJlciwgbWFrZVJlcXVlc3QsIFJlc291cmNlVHlwZSB9IGZyb20gJy4uL3V0aWwvYWpheCc7XG5pbXBvcnQgeyBpc01hcGJveFVSTCB9IGZyb20gJy4uL3V0aWwvbWFwYm94JztcbmltcG9ydCBicm93c2VyIGZyb20gJy4uL3V0aWwvYnJvd3Nlcic7XG5pbXBvcnQgRGlzcGF0Y2hlciBmcm9tICcuLi91dGlsL2Rpc3BhdGNoZXInO1xuaW1wb3J0IHsgdmFsaWRhdGVTdHlsZSwgZW1pdFZhbGlkYXRpb25FcnJvcnMgYXMgX2VtaXRWYWxpZGF0aW9uRXJyb3JzIH0gZnJvbSAnLi92YWxpZGF0ZV9zdHlsZSc7XG5pbXBvcnQge1xuICAgIGdldFR5cGUgYXMgZ2V0U291cmNlVHlwZSxcbiAgICBzZXRUeXBlIGFzIHNldFNvdXJjZVR5cGUsXG4gICAgdHlwZSBTb3VyY2VDbGFzc1xufSBmcm9tICcuLi9zb3VyY2Uvc291cmNlJztcbmltcG9ydCB7IHF1ZXJ5UmVuZGVyZWRGZWF0dXJlcywgcXVlcnlSZW5kZXJlZFN5bWJvbHMsIHF1ZXJ5U291cmNlRmVhdHVyZXMgfSBmcm9tICcuLi9zb3VyY2UvcXVlcnlfZmVhdHVyZXMnO1xuaW1wb3J0IFNvdXJjZUNhY2hlIGZyb20gJy4uL3NvdXJjZS9zb3VyY2VfY2FjaGUnO1xuaW1wb3J0IEdlb0pTT05Tb3VyY2UgZnJvbSAnLi4vc291cmNlL2dlb2pzb25fc291cmNlJztcbmltcG9ydCBzdHlsZVNwZWMgZnJvbSAnLi4vc3R5bGUtc3BlYy9yZWZlcmVuY2UvbGF0ZXN0JztcbmltcG9ydCBnZXRXb3JrZXJQb29sIGZyb20gJy4uL3V0aWwvZ2xvYmFsX3dvcmtlcl9wb29sJztcbmltcG9ydCBkZXJlZiBmcm9tICcuLi9zdHlsZS1zcGVjL2RlcmVmJztcbmltcG9ydCBkaWZmU3R5bGVzLCB7b3BlcmF0aW9ucyBhcyBkaWZmT3BlcmF0aW9uc30gZnJvbSAnLi4vc3R5bGUtc3BlYy9kaWZmJztcbmltcG9ydCB7XG4gICAgcmVnaXN0ZXJGb3JQbHVnaW5BdmFpbGFiaWxpdHksXG4gICAgZXZlbnRlZCBhcyBydGxUZXh0UGx1Z2luRXZlbnRlZFxufSBmcm9tICcuLi9zb3VyY2UvcnRsX3RleHRfcGx1Z2luJztcbmltcG9ydCBQYXVzZWFibGVQbGFjZW1lbnQgZnJvbSAnLi9wYXVzZWFibGVfcGxhY2VtZW50JztcbmltcG9ydCBab29tSGlzdG9yeSBmcm9tICcuL3pvb21faGlzdG9yeSc7XG5pbXBvcnQgQ3Jvc3NUaWxlU3ltYm9sSW5kZXggZnJvbSAnLi4vc3ltYm9sL2Nyb3NzX3RpbGVfc3ltYm9sX2luZGV4JztcbmltcG9ydCB7dmFsaWRhdGVDdXN0b21TdHlsZUxheWVyfSBmcm9tICcuL3N0eWxlX2xheWVyL2N1c3RvbV9zdHlsZV9sYXllcic7XG5cbi8vIFdlJ3JlIHNraXBwaW5nIHZhbGlkYXRpb24gZXJyb3JzIHdpdGggdGhlIGBzb3VyY2UuY2FudmFzYCBpZGVudGlmaWVyIGluIG9yZGVyXG4vLyB0byBjb250aW51ZSB0byBhbGxvdyBjYW52YXMgc291cmNlcyB0byBiZSBhZGRlZCBhdCBydW50aW1lL3VwZGF0ZWQgaW5cbi8vIHNtYXJ0IHNldFN0eWxlIChzZWUgaHR0cHM6Ly9naXRodWIuY29tL21hcGJveC9tYXBib3gtZ2wtanMvcHVsbC82NDI0KTpcbmNvbnN0IGVtaXRWYWxpZGF0aW9uRXJyb3JzID0gKGV2ZW50ZWQ6IEV2ZW50ZWQsIGVycm9yczogPyRSZWFkT25seUFycmF5PHttZXNzYWdlOiBzdHJpbmcsIGlkZW50aWZpZXI/OiBzdHJpbmd9PikgPT5cbiAgICBfZW1pdFZhbGlkYXRpb25FcnJvcnMoZXZlbnRlZCwgZXJyb3JzICYmIGVycm9ycy5maWx0ZXIoZXJyb3IgPT4gZXJyb3IuaWRlbnRpZmllciAhPT0gJ3NvdXJjZS5jYW52YXMnKSk7XG5cbmltcG9ydCB0eXBlIE1hcCBmcm9tICcuLi91aS9tYXAnO1xuaW1wb3J0IHR5cGUgVHJhbnNmb3JtIGZyb20gJy4uL2dlby90cmFuc2Zvcm0nO1xuaW1wb3J0IHR5cGUge1N0eWxlSW1hZ2V9IGZyb20gJy4vc3R5bGVfaW1hZ2UnO1xuaW1wb3J0IHR5cGUge1N0eWxlR2x5cGh9IGZyb20gJy4vc3R5bGVfZ2x5cGgnO1xuaW1wb3J0IHR5cGUge0NhbGxiYWNrfSBmcm9tICcuLi90eXBlcy9jYWxsYmFjayc7XG5pbXBvcnQgdHlwZSBFdmFsdWF0aW9uUGFyYW1ldGVycyBmcm9tICcuL2V2YWx1YXRpb25fcGFyYW1ldGVycyc7XG5pbXBvcnQgdHlwZSB7UGxhY2VtZW50fSBmcm9tICcuLi9zeW1ib2wvcGxhY2VtZW50JztcbmltcG9ydCB0eXBlIHtDYW5jZWxhYmxlfSBmcm9tICcuLi90eXBlcy9jYW5jZWxhYmxlJztcbmltcG9ydCB0eXBlIHtSZXF1ZXN0UGFyYW1ldGVycywgUmVzcG9uc2VDYWxsYmFja30gZnJvbSAnLi4vdXRpbC9hamF4JztcbmltcG9ydCB0eXBlIHtHZW9KU09OfSBmcm9tICdAbWFwYm94L2dlb2pzb24tdHlwZXMnO1xuaW1wb3J0IHR5cGUge1xuICAgIExheWVyU3BlY2lmaWNhdGlvbixcbiAgICBGaWx0ZXJTcGVjaWZpY2F0aW9uLFxuICAgIFN0eWxlU3BlY2lmaWNhdGlvbixcbiAgICBMaWdodFNwZWNpZmljYXRpb24sXG4gICAgU291cmNlU3BlY2lmaWNhdGlvblxufSBmcm9tICcuLi9zdHlsZS1zcGVjL3R5cGVzJztcbmltcG9ydCB0eXBlIHtDdXN0b21MYXllckludGVyZmFjZX0gZnJvbSAnLi9zdHlsZV9sYXllci9jdXN0b21fc3R5bGVfbGF5ZXInO1xuXG5jb25zdCBzdXBwb3J0ZWREaWZmT3BlcmF0aW9ucyA9IHBpY2soZGlmZk9wZXJhdGlvbnMsIFtcbiAgICAnYWRkTGF5ZXInLFxuICAgICdyZW1vdmVMYXllcicsXG4gICAgJ3NldFBhaW50UHJvcGVydHknLFxuICAgICdzZXRMYXlvdXRQcm9wZXJ0eScsXG4gICAgJ3NldEZpbHRlcicsXG4gICAgJ2FkZFNvdXJjZScsXG4gICAgJ3JlbW92ZVNvdXJjZScsXG4gICAgJ3NldExheWVyWm9vbVJhbmdlJyxcbiAgICAnc2V0TGlnaHQnLFxuICAgICdzZXRUcmFuc2l0aW9uJyxcbiAgICAnc2V0R2VvSlNPTlNvdXJjZURhdGEnXG4gICAgLy8gJ3NldEdseXBocycsXG4gICAgLy8gJ3NldFNwcml0ZScsXG5dKTtcblxuY29uc3QgaWdub3JlZERpZmZPcGVyYXRpb25zID0gcGljayhkaWZmT3BlcmF0aW9ucywgW1xuICAgICdzZXRDZW50ZXInLFxuICAgICdzZXRab29tJyxcbiAgICAnc2V0QmVhcmluZycsXG4gICAgJ3NldFBpdGNoJ1xuXSk7XG5cbmV4cG9ydCB0eXBlIFN0eWxlT3B0aW9ucyA9IHtcbiAgICB2YWxpZGF0ZT86IGJvb2xlYW4sXG4gICAgbG9jYWxJZGVvZ3JhcGhGb250RmFtaWx5Pzogc3RyaW5nXG59O1xuXG5leHBvcnQgdHlwZSBTdHlsZVNldHRlck9wdGlvbnMgPSB7XG4gICAgdmFsaWRhdGU/OiBib29sZWFuXG59O1xuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBTdHlsZSBleHRlbmRzIEV2ZW50ZWQge1xuICAgIG1hcDogTWFwO1xuICAgIHN0eWxlc2hlZXQ6IFN0eWxlU3BlY2lmaWNhdGlvbjtcbiAgICBkaXNwYXRjaGVyOiBEaXNwYXRjaGVyO1xuICAgIGltYWdlTWFuYWdlcjogSW1hZ2VNYW5hZ2VyO1xuICAgIGdseXBoTWFuYWdlcjogR2x5cGhNYW5hZ2VyO1xuICAgIGxpbmVBdGxhczogTGluZUF0bGFzO1xuICAgIGxpZ2h0OiBMaWdodDtcblxuICAgIF9yZXF1ZXN0OiA/Q2FuY2VsYWJsZTtcbiAgICBfc3ByaXRlUmVxdWVzdDogP0NhbmNlbGFibGU7XG4gICAgX2xheWVyczoge1tzdHJpbmddOiBTdHlsZUxheWVyfTtcbiAgICBfb3JkZXI6IEFycmF5PHN0cmluZz47XG4gICAgc291cmNlQ2FjaGVzOiB7W3N0cmluZ106IFNvdXJjZUNhY2hlfTtcbiAgICB6b29tSGlzdG9yeTogWm9vbUhpc3Rvcnk7XG4gICAgX2xvYWRlZDogYm9vbGVhbjtcbiAgICBfcnRsVGV4dFBsdWdpbkNhbGxiYWNrOiBGdW5jdGlvbjtcbiAgICBfY2hhbmdlZDogYm9vbGVhbjtcbiAgICBfdXBkYXRlZFNvdXJjZXM6IHtbc3RyaW5nXTogJ2NsZWFyJyB8ICdyZWxvYWQnfTtcbiAgICBfdXBkYXRlZExheWVyczoge1tzdHJpbmddOiB0cnVlfTtcbiAgICBfcmVtb3ZlZExheWVyczoge1tzdHJpbmddOiBTdHlsZUxheWVyfTtcbiAgICBfdXBkYXRlZFBhaW50UHJvcHM6IHtbbGF5ZXI6IHN0cmluZ106IHRydWV9O1xuICAgIF9sYXllck9yZGVyQ2hhbmdlZDogYm9vbGVhbjtcblxuICAgIGNyb3NzVGlsZVN5bWJvbEluZGV4OiBDcm9zc1RpbGVTeW1ib2xJbmRleDtcbiAgICBwYXVzZWFibGVQbGFjZW1lbnQ6IFBhdXNlYWJsZVBsYWNlbWVudDtcbiAgICBwbGFjZW1lbnQ6IFBsYWNlbWVudDtcbiAgICB6OiBudW1iZXI7XG5cbiAgICAvLyBleHBvc2VkIHRvIGFsbG93IHN0dWJiaW5nIGJ5IHVuaXQgdGVzdHNcbiAgICBzdGF0aWMgZ2V0U291cmNlVHlwZTogdHlwZW9mIGdldFNvdXJjZVR5cGU7XG4gICAgc3RhdGljIHNldFNvdXJjZVR5cGU6IHR5cGVvZiBzZXRTb3VyY2VUeXBlO1xuICAgIHN0YXRpYyByZWdpc3RlckZvclBsdWdpbkF2YWlsYWJpbGl0eTogdHlwZW9mIHJlZ2lzdGVyRm9yUGx1Z2luQXZhaWxhYmlsaXR5O1xuXG4gICAgY29uc3RydWN0b3IobWFwOiBNYXAsIG9wdGlvbnM6IFN0eWxlT3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHN1cGVyKCk7XG5cbiAgICAgICAgdGhpcy5tYXAgPSBtYXA7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hlciA9IG5ldyBEaXNwYXRjaGVyKGdldFdvcmtlclBvb2woKSwgdGhpcyk7XG4gICAgICAgIHRoaXMuaW1hZ2VNYW5hZ2VyID0gbmV3IEltYWdlTWFuYWdlcigpO1xuICAgICAgICB0aGlzLmltYWdlTWFuYWdlci5zZXRFdmVudGVkUGFyZW50KHRoaXMpO1xuICAgICAgICB0aGlzLmdseXBoTWFuYWdlciA9IG5ldyBHbHlwaE1hbmFnZXIobWFwLl9yZXF1ZXN0TWFuYWdlciwgb3B0aW9ucy5sb2NhbElkZW9ncmFwaEZvbnRGYW1pbHkpO1xuICAgICAgICB0aGlzLmxpbmVBdGxhcyA9IG5ldyBMaW5lQXRsYXMoMjU2LCA1MTIpO1xuICAgICAgICB0aGlzLmNyb3NzVGlsZVN5bWJvbEluZGV4ID0gbmV3IENyb3NzVGlsZVN5bWJvbEluZGV4KCk7XG5cbiAgICAgICAgdGhpcy5fbGF5ZXJzID0ge307XG4gICAgICAgIHRoaXMuX29yZGVyICA9IFtdO1xuICAgICAgICB0aGlzLnNvdXJjZUNhY2hlcyA9IHt9O1xuICAgICAgICB0aGlzLnpvb21IaXN0b3J5ID0gbmV3IFpvb21IaXN0b3J5KCk7XG4gICAgICAgIHRoaXMuX2xvYWRlZCA9IGZhbHNlO1xuXG4gICAgICAgIHRoaXMuX3Jlc2V0VXBkYXRlcygpO1xuXG4gICAgICAgIHRoaXMuZGlzcGF0Y2hlci5icm9hZGNhc3QoJ3NldFJlZmVycmVyJywgZ2V0UmVmZXJyZXIoKSk7XG5cbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgICAgIHRoaXMuX3J0bFRleHRQbHVnaW5DYWxsYmFjayA9IFN0eWxlLnJlZ2lzdGVyRm9yUGx1Z2luQXZhaWxhYmlsaXR5KChhcmdzKSA9PiB7XG4gICAgICAgICAgICBzZWxmLmRpc3BhdGNoZXIuYnJvYWRjYXN0KCdsb2FkUlRMVGV4dFBsdWdpbicsIGFyZ3MucGx1Z2luVVJMLCBhcmdzLmNvbXBsZXRpb25DYWxsYmFjayk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGlkIGluIHNlbGYuc291cmNlQ2FjaGVzKSB7XG4gICAgICAgICAgICAgICAgc2VsZi5zb3VyY2VDYWNoZXNbaWRdLnJlbG9hZCgpOyAvLyBTaG91bGQgYmUgYSBuby1vcCBpZiB0aGUgcGx1Z2luIGxvYWRzIGJlZm9yZSBhbnkgdGlsZXMgbG9hZFxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLm9uKCdkYXRhJywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAoZXZlbnQuZGF0YVR5cGUgIT09ICdzb3VyY2UnIHx8IGV2ZW50LnNvdXJjZURhdGFUeXBlICE9PSAnbWV0YWRhdGEnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBzb3VyY2VDYWNoZSA9IHRoaXMuc291cmNlQ2FjaGVzW2V2ZW50LnNvdXJjZUlkXTtcbiAgICAgICAgICAgIGlmICghc291cmNlQ2FjaGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZSA9IHNvdXJjZUNhY2hlLmdldFNvdXJjZSgpO1xuICAgICAgICAgICAgaWYgKCFzb3VyY2UgfHwgIXNvdXJjZS52ZWN0b3JMYXllcklkcykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yIChjb25zdCBsYXllcklkIGluIHRoaXMuX2xheWVycykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxheWVyID0gdGhpcy5fbGF5ZXJzW2xheWVySWRdO1xuICAgICAgICAgICAgICAgIGlmIChsYXllci5zb3VyY2UgPT09IHNvdXJjZS5pZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl92YWxpZGF0ZUxheWVyKGxheWVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGxvYWRVUkwodXJsOiBzdHJpbmcsIG9wdGlvbnM6IHtcbiAgICAgICAgdmFsaWRhdGU/OiBib29sZWFuLFxuICAgICAgICBhY2Nlc3NUb2tlbj86IHN0cmluZ1xuICAgIH0gPSB7fSkge1xuICAgICAgICB0aGlzLmZpcmUobmV3IEV2ZW50KCdkYXRhbG9hZGluZycsIHtkYXRhVHlwZTogJ3N0eWxlJ30pKTtcblxuICAgICAgICBjb25zdCB2YWxpZGF0ZSA9IHR5cGVvZiBvcHRpb25zLnZhbGlkYXRlID09PSAnYm9vbGVhbicgP1xuICAgICAgICAgICAgb3B0aW9ucy52YWxpZGF0ZSA6ICFpc01hcGJveFVSTCh1cmwpO1xuXG4gICAgICAgIHVybCA9IHRoaXMubWFwLl9yZXF1ZXN0TWFuYWdlci5ub3JtYWxpemVTdHlsZVVSTCh1cmwsIG9wdGlvbnMuYWNjZXNzVG9rZW4pO1xuICAgICAgICBjb25zdCByZXF1ZXN0ID0gdGhpcy5tYXAuX3JlcXVlc3RNYW5hZ2VyLnRyYW5zZm9ybVJlcXVlc3QodXJsLCBSZXNvdXJjZVR5cGUuU3R5bGUpO1xuXG4gICAgICAgIHRoaXMuX3JlcXVlc3QgPSBnZXRKU09OKHJlcXVlc3QsIChlcnJvcjogP0Vycm9yLCBqc29uOiA/T2JqZWN0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9yZXF1ZXN0ID0gbnVsbDtcbiAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXJyb3JFdmVudChlcnJvcikpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChqc29uKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbG9hZChqc29uLCB2YWxpZGF0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGxvYWRKU09OKGpzb246IFN0eWxlU3BlY2lmaWNhdGlvbiwgb3B0aW9uczogU3R5bGVTZXR0ZXJPcHRpb25zID0ge30pIHtcbiAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgnZGF0YWxvYWRpbmcnLCB7ZGF0YVR5cGU6ICdzdHlsZSd9KSk7XG5cbiAgICAgICAgdGhpcy5fcmVxdWVzdCA9IGJyb3dzZXIuZnJhbWUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fcmVxdWVzdCA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLl9sb2FkKGpzb24sIG9wdGlvbnMudmFsaWRhdGUgIT09IGZhbHNlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgX2xvYWQoanNvbjogU3R5bGVTcGVjaWZpY2F0aW9uLCB2YWxpZGF0ZTogYm9vbGVhbikge1xuICAgICAgICBpZiAodmFsaWRhdGUgJiYgZW1pdFZhbGlkYXRpb25FcnJvcnModGhpcywgdmFsaWRhdGVTdHlsZShqc29uKSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2xvYWRlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuc3R5bGVzaGVldCA9IGpzb247XG5cbiAgICAgICAgZm9yIChjb25zdCBpZCBpbiBqc29uLnNvdXJjZXMpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkU291cmNlKGlkLCBqc29uLnNvdXJjZXNbaWRdLCB7dmFsaWRhdGU6IGZhbHNlfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoanNvbi5zcHJpdGUpIHtcbiAgICAgICAgICAgIHRoaXMuX3Nwcml0ZVJlcXVlc3QgPSBsb2FkU3ByaXRlKGpzb24uc3ByaXRlLCB0aGlzLm1hcC5fcmVxdWVzdE1hbmFnZXIsIChlcnIsIGltYWdlcykgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX3Nwcml0ZVJlcXVlc3QgPSBudWxsO1xuICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFcnJvckV2ZW50KGVycikpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaW1hZ2VzKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaWQgaW4gaW1hZ2VzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmltYWdlTWFuYWdlci5hZGRJbWFnZShpZCwgaW1hZ2VzW2lkXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLmltYWdlTWFuYWdlci5zZXRMb2FkZWQodHJ1ZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgnZGF0YScsIHtkYXRhVHlwZTogJ3N0eWxlJ30pKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5pbWFnZU1hbmFnZXIuc2V0TG9hZGVkKHRydWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5nbHlwaE1hbmFnZXIuc2V0VVJMKGpzb24uZ2x5cGhzKTtcblxuICAgICAgICBjb25zdCBsYXllcnMgPSBkZXJlZih0aGlzLnN0eWxlc2hlZXQubGF5ZXJzKTtcblxuICAgICAgICB0aGlzLl9vcmRlciA9IGxheWVycy5tYXAoKGxheWVyKSA9PiBsYXllci5pZCk7XG5cbiAgICAgICAgdGhpcy5fbGF5ZXJzID0ge307XG4gICAgICAgIGZvciAobGV0IGxheWVyIG9mIGxheWVycykge1xuICAgICAgICAgICAgbGF5ZXIgPSBjcmVhdGVTdHlsZUxheWVyKGxheWVyKTtcbiAgICAgICAgICAgIGxheWVyLnNldEV2ZW50ZWRQYXJlbnQodGhpcywge2xheWVyOiB7aWQ6IGxheWVyLmlkfX0pO1xuICAgICAgICAgICAgdGhpcy5fbGF5ZXJzW2xheWVyLmlkXSA9IGxheWVyO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5kaXNwYXRjaGVyLmJyb2FkY2FzdCgnc2V0TGF5ZXJzJywgdGhpcy5fc2VyaWFsaXplTGF5ZXJzKHRoaXMuX29yZGVyKSk7XG5cbiAgICAgICAgdGhpcy5saWdodCA9IG5ldyBMaWdodCh0aGlzLnN0eWxlc2hlZXQubGlnaHQpO1xuXG4gICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ2RhdGEnLCB7ZGF0YVR5cGU6ICdzdHlsZSd9KSk7XG4gICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ3N0eWxlLmxvYWQnKSk7XG4gICAgfVxuXG4gICAgX3ZhbGlkYXRlTGF5ZXIobGF5ZXI6IFN0eWxlTGF5ZXIpIHtcbiAgICAgICAgY29uc3Qgc291cmNlQ2FjaGUgPSB0aGlzLnNvdXJjZUNhY2hlc1tsYXllci5zb3VyY2VdO1xuICAgICAgICBpZiAoIXNvdXJjZUNhY2hlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzb3VyY2VMYXllciA9IGxheWVyLnNvdXJjZUxheWVyO1xuICAgICAgICBpZiAoIXNvdXJjZUxheWVyKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzb3VyY2UgPSBzb3VyY2VDYWNoZS5nZXRTb3VyY2UoKTtcbiAgICAgICAgaWYgKHNvdXJjZS50eXBlID09PSAnZ2VvanNvbicgfHwgKHNvdXJjZS52ZWN0b3JMYXllcklkcyAmJiBzb3VyY2UudmVjdG9yTGF5ZXJJZHMuaW5kZXhPZihzb3VyY2VMYXllcikgPT09IC0xKSkge1xuICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFcnJvckV2ZW50KG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICBgU291cmNlIGxheWVyIFwiJHtzb3VyY2VMYXllcn1cIiBgICtcbiAgICAgICAgICAgICAgICBgZG9lcyBub3QgZXhpc3Qgb24gc291cmNlIFwiJHtzb3VyY2UuaWR9XCIgYCArXG4gICAgICAgICAgICAgICAgYGFzIHNwZWNpZmllZCBieSBzdHlsZSBsYXllciBcIiR7bGF5ZXIuaWR9XCJgXG4gICAgICAgICAgICApKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBsb2FkZWQoKSB7XG4gICAgICAgIGlmICghdGhpcy5fbG9hZGVkKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLl91cGRhdGVkU291cmNlcykubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGZvciAoY29uc3QgaWQgaW4gdGhpcy5zb3VyY2VDYWNoZXMpXG4gICAgICAgICAgICBpZiAoIXRoaXMuc291cmNlQ2FjaGVzW2lkXS5sb2FkZWQoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgaWYgKCF0aGlzLmltYWdlTWFuYWdlci5pc0xvYWRlZCgpKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIF9zZXJpYWxpemVMYXllcnMoaWRzOiBBcnJheTxzdHJpbmc+KTogQXJyYXk8T2JqZWN0PiB7XG4gICAgICAgIGNvbnN0IHNlcmlhbGl6ZWRMYXllcnMgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBpZCBvZiBpZHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGxheWVyID0gdGhpcy5fbGF5ZXJzW2lkXTtcbiAgICAgICAgICAgIGlmIChsYXllci50eXBlICE9PSAnY3VzdG9tJykge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWRMYXllcnMucHVzaChsYXllci5zZXJpYWxpemUoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZWRMYXllcnM7XG4gICAgfVxuXG4gICAgaGFzVHJhbnNpdGlvbnMoKSB7XG4gICAgICAgIGlmICh0aGlzLmxpZ2h0ICYmIHRoaXMubGlnaHQuaGFzVHJhbnNpdGlvbigpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgaWQgaW4gdGhpcy5zb3VyY2VDYWNoZXMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnNvdXJjZUNhY2hlc1tpZF0uaGFzVHJhbnNpdGlvbigpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IGlkIGluIHRoaXMuX2xheWVycykge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2xheWVyc1tpZF0uaGFzVHJhbnNpdGlvbigpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgX2NoZWNrTG9hZGVkKCkge1xuICAgICAgICBpZiAoIXRoaXMuX2xvYWRlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTdHlsZSBpcyBub3QgZG9uZSBsb2FkaW5nJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBcHBseSBxdWV1ZWQgc3R5bGUgdXBkYXRlcyBpbiBhIGJhdGNoIGFuZCByZWNhbGN1bGF0ZSB6b29tLWRlcGVuZGVudCBwYWludCBwcm9wZXJ0aWVzLlxuICAgICAqL1xuICAgIHVwZGF0ZShwYXJhbWV0ZXJzOiBFdmFsdWF0aW9uUGFyYW1ldGVycykge1xuICAgICAgICBpZiAoIXRoaXMuX2xvYWRlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2hhbmdlZCA9IHRoaXMuX2NoYW5nZWQ7XG4gICAgICAgIGlmICh0aGlzLl9jaGFuZ2VkKSB7XG4gICAgICAgICAgICBjb25zdCB1cGRhdGVkSWRzID0gT2JqZWN0LmtleXModGhpcy5fdXBkYXRlZExheWVycyk7XG4gICAgICAgICAgICBjb25zdCByZW1vdmVkSWRzID0gT2JqZWN0LmtleXModGhpcy5fcmVtb3ZlZExheWVycyk7XG5cbiAgICAgICAgICAgIGlmICh1cGRhdGVkSWRzLmxlbmd0aCB8fCByZW1vdmVkSWRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVdvcmtlckxheWVycyh1cGRhdGVkSWRzLCByZW1vdmVkSWRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoY29uc3QgaWQgaW4gdGhpcy5fdXBkYXRlZFNvdXJjZXMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhY3Rpb24gPSB0aGlzLl91cGRhdGVkU291cmNlc1tpZF07XG4gICAgICAgICAgICAgICAgYXNzZXJ0KGFjdGlvbiA9PT0gJ3JlbG9hZCcgfHwgYWN0aW9uID09PSAnY2xlYXInKTtcbiAgICAgICAgICAgICAgICBpZiAoYWN0aW9uID09PSAncmVsb2FkJykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZWxvYWRTb3VyY2UoaWQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uID09PSAnY2xlYXInKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NsZWFyU291cmNlKGlkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgaWQgaW4gdGhpcy5fdXBkYXRlZFBhaW50UHJvcHMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9sYXllcnNbaWRdLnVwZGF0ZVRyYW5zaXRpb25zKHBhcmFtZXRlcnMpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmxpZ2h0LnVwZGF0ZVRyYW5zaXRpb25zKHBhcmFtZXRlcnMpO1xuXG4gICAgICAgICAgICB0aGlzLl9yZXNldFVwZGF0ZXMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3Qgc291cmNlSWQgaW4gdGhpcy5zb3VyY2VDYWNoZXMpIHtcbiAgICAgICAgICAgIHRoaXMuc291cmNlQ2FjaGVzW3NvdXJjZUlkXS51c2VkID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IGxheWVySWQgb2YgdGhpcy5fb3JkZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IGxheWVyID0gdGhpcy5fbGF5ZXJzW2xheWVySWRdO1xuXG4gICAgICAgICAgICBsYXllci5yZWNhbGN1bGF0ZShwYXJhbWV0ZXJzKTtcbiAgICAgICAgICAgIGlmICghbGF5ZXIuaXNIaWRkZW4ocGFyYW1ldGVycy56b29tKSAmJiBsYXllci5zb3VyY2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNvdXJjZUNhY2hlc1tsYXllci5zb3VyY2VdLnVzZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5saWdodC5yZWNhbGN1bGF0ZShwYXJhbWV0ZXJzKTtcbiAgICAgICAgdGhpcy56ID0gcGFyYW1ldGVycy56b29tO1xuXG4gICAgICAgIGlmIChjaGFuZ2VkKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEV2ZW50KCdkYXRhJywge2RhdGFUeXBlOiAnc3R5bGUnfSkpO1xuICAgICAgICB9XG5cbiAgICB9XG5cbiAgICBfdXBkYXRlV29ya2VyTGF5ZXJzKHVwZGF0ZWRJZHM6IEFycmF5PHN0cmluZz4sIHJlbW92ZWRJZHM6IEFycmF5PHN0cmluZz4pIHtcbiAgICAgICAgdGhpcy5kaXNwYXRjaGVyLmJyb2FkY2FzdCgndXBkYXRlTGF5ZXJzJywge1xuICAgICAgICAgICAgbGF5ZXJzOiB0aGlzLl9zZXJpYWxpemVMYXllcnModXBkYXRlZElkcyksXG4gICAgICAgICAgICByZW1vdmVkSWRzXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIF9yZXNldFVwZGF0ZXMoKSB7XG4gICAgICAgIHRoaXMuX2NoYW5nZWQgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLl91cGRhdGVkTGF5ZXJzID0ge307XG4gICAgICAgIHRoaXMuX3JlbW92ZWRMYXllcnMgPSB7fTtcblxuICAgICAgICB0aGlzLl91cGRhdGVkU291cmNlcyA9IHt9O1xuICAgICAgICB0aGlzLl91cGRhdGVkUGFpbnRQcm9wcyA9IHt9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSB0aGlzIHN0eWxlJ3Mgc3RhdGUgdG8gbWF0Y2ggdGhlIGdpdmVuIHN0eWxlIEpTT04sIHBlcmZvcm1pbmcgb25seVxuICAgICAqIHRoZSBuZWNlc3NhcnkgbXV0YXRpb25zLlxuICAgICAqXG4gICAgICogTWF5IHRocm93IGFuIEVycm9yICgnVW5pbXBsZW1lbnRlZDogTUVUSE9EJykgaWYgdGhlIG1hcGJveC1nbC1zdHlsZS1zcGVjXG4gICAgICogZGlmZiBhbGdvcml0aG0gcHJvZHVjZXMgYW4gb3BlcmF0aW9uIHRoYXQgaXMgbm90IHN1cHBvcnRlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIGlmIGFueSBjaGFuZ2VzIHdlcmUgbWFkZTsgZmFsc2Ugb3RoZXJ3aXNlXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBzZXRTdGF0ZShuZXh0U3RhdGU6IFN0eWxlU3BlY2lmaWNhdGlvbikge1xuICAgICAgICB0aGlzLl9jaGVja0xvYWRlZCgpO1xuXG4gICAgICAgIGlmIChlbWl0VmFsaWRhdGlvbkVycm9ycyh0aGlzLCB2YWxpZGF0ZVN0eWxlKG5leHRTdGF0ZSkpKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgbmV4dFN0YXRlID0gY2xvbmUobmV4dFN0YXRlKTtcbiAgICAgICAgbmV4dFN0YXRlLmxheWVycyA9IGRlcmVmKG5leHRTdGF0ZS5sYXllcnMpO1xuXG4gICAgICAgIGNvbnN0IGNoYW5nZXMgPSBkaWZmU3R5bGVzKHRoaXMuc2VyaWFsaXplKCksIG5leHRTdGF0ZSlcbiAgICAgICAgICAgIC5maWx0ZXIob3AgPT4gIShvcC5jb21tYW5kIGluIGlnbm9yZWREaWZmT3BlcmF0aW9ucykpO1xuXG4gICAgICAgIGlmIChjaGFuZ2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdW5pbXBsZW1lbnRlZE9wcyA9IGNoYW5nZXMuZmlsdGVyKG9wID0+ICEob3AuY29tbWFuZCBpbiBzdXBwb3J0ZWREaWZmT3BlcmF0aW9ucykpO1xuICAgICAgICBpZiAodW5pbXBsZW1lbnRlZE9wcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuaW1wbGVtZW50ZWQ6ICR7dW5pbXBsZW1lbnRlZE9wcy5tYXAob3AgPT4gb3AuY29tbWFuZCkuam9pbignLCAnKX0uYCk7XG4gICAgICAgIH1cblxuICAgICAgICBjaGFuZ2VzLmZvckVhY2goKG9wKSA9PiB7XG4gICAgICAgICAgICBpZiAob3AuY29tbWFuZCA9PT0gJ3NldFRyYW5zaXRpb24nKSB7XG4gICAgICAgICAgICAgICAgLy8gYHRyYW5zaXRpb25gIGlzIGFsd2F5cyByZWFkIGRpcmVjdGx5IG9mZiBvZlxuICAgICAgICAgICAgICAgIC8vIGB0aGlzLnN0eWxlc2hlZXRgLCB3aGljaCB3ZSB1cGRhdGUgYmVsb3dcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAodGhpczogYW55KVtvcC5jb21tYW5kXS5hcHBseSh0aGlzLCBvcC5hcmdzKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5zdHlsZXNoZWV0ID0gbmV4dFN0YXRlO1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGFkZEltYWdlKGlkOiBzdHJpbmcsIGltYWdlOiBTdHlsZUltYWdlKSB7XG4gICAgICAgIGlmICh0aGlzLmdldEltYWdlKGlkKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmlyZShuZXcgRXJyb3JFdmVudChuZXcgRXJyb3IoJ0FuIGltYWdlIHdpdGggdGhpcyBuYW1lIGFscmVhZHkgZXhpc3RzLicpKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbWFnZU1hbmFnZXIuYWRkSW1hZ2UoaWQsIGltYWdlKTtcbiAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgnZGF0YScsIHtkYXRhVHlwZTogJ3N0eWxlJ30pKTtcbiAgICB9XG5cbiAgICB1cGRhdGVJbWFnZShpZDogc3RyaW5nLCBpbWFnZTogU3R5bGVJbWFnZSkge1xuICAgICAgICB0aGlzLmltYWdlTWFuYWdlci51cGRhdGVJbWFnZShpZCwgaW1hZ2UpO1xuICAgIH1cblxuICAgIGdldEltYWdlKGlkOiBzdHJpbmcpOiA/U3R5bGVJbWFnZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmltYWdlTWFuYWdlci5nZXRJbWFnZShpZCk7XG4gICAgfVxuXG4gICAgcmVtb3ZlSW1hZ2UoaWQ6IHN0cmluZykge1xuICAgICAgICBpZiAoIXRoaXMuZ2V0SW1hZ2UoaWQpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5maXJlKG5ldyBFcnJvckV2ZW50KG5ldyBFcnJvcignTm8gaW1hZ2Ugd2l0aCB0aGlzIG5hbWUgZXhpc3RzLicpKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbWFnZU1hbmFnZXIucmVtb3ZlSW1hZ2UoaWQpO1xuICAgICAgICB0aGlzLmZpcmUobmV3IEV2ZW50KCdkYXRhJywge2RhdGFUeXBlOiAnc3R5bGUnfSkpO1xuICAgIH1cblxuICAgIGxpc3RJbWFnZXMoKSB7XG4gICAgICAgIHRoaXMuX2NoZWNrTG9hZGVkKCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaW1hZ2VNYW5hZ2VyLmxpc3RJbWFnZXMoKTtcbiAgICB9XG5cbiAgICBhZGRTb3VyY2UoaWQ6IHN0cmluZywgc291cmNlOiBTb3VyY2VTcGVjaWZpY2F0aW9uLCBvcHRpb25zOiBTdHlsZVNldHRlck9wdGlvbnMgPSB7fSkge1xuICAgICAgICB0aGlzLl9jaGVja0xvYWRlZCgpO1xuXG4gICAgICAgIGlmICh0aGlzLnNvdXJjZUNhY2hlc1tpZF0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGVyZSBpcyBhbHJlYWR5IGEgc291cmNlIHdpdGggdGhpcyBJRCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFzb3VyY2UudHlwZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgdHlwZSBwcm9wZXJ0eSBtdXN0IGJlIGRlZmluZWQsIGJ1dCB0aGUgb25seSB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXMgd2VyZSBnaXZlbjogJHtPYmplY3Qua2V5cyhzb3VyY2UpLmpvaW4oJywgJyl9LmApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYnVpbHRJbnMgPSBbJ3ZlY3RvcicsICdyYXN0ZXInLCAnZ2VvanNvbicsICd2aWRlbycsICdpbWFnZSddO1xuICAgICAgICBjb25zdCBzaG91bGRWYWxpZGF0ZSA9IGJ1aWx0SW5zLmluZGV4T2Yoc291cmNlLnR5cGUpID49IDA7XG4gICAgICAgIGlmIChzaG91bGRWYWxpZGF0ZSAmJiB0aGlzLl92YWxpZGF0ZSh2YWxpZGF0ZVN0eWxlLnNvdXJjZSwgYHNvdXJjZXMuJHtpZH1gLCBzb3VyY2UsIG51bGwsIG9wdGlvbnMpKSByZXR1cm47XG5cbiAgICAgICAgaWYgKHRoaXMubWFwICYmIHRoaXMubWFwLl9jb2xsZWN0UmVzb3VyY2VUaW1pbmcpIChzb3VyY2U6IGFueSkuY29sbGVjdFJlc291cmNlVGltaW5nID0gdHJ1ZTtcbiAgICAgICAgY29uc3Qgc291cmNlQ2FjaGUgPSB0aGlzLnNvdXJjZUNhY2hlc1tpZF0gPSBuZXcgU291cmNlQ2FjaGUoaWQsIHNvdXJjZSwgdGhpcy5kaXNwYXRjaGVyKTtcbiAgICAgICAgc291cmNlQ2FjaGUuc3R5bGUgPSB0aGlzO1xuICAgICAgICBzb3VyY2VDYWNoZS5zZXRFdmVudGVkUGFyZW50KHRoaXMsICgpID0+ICh7XG4gICAgICAgICAgICBpc1NvdXJjZUxvYWRlZDogdGhpcy5sb2FkZWQoKSxcbiAgICAgICAgICAgIHNvdXJjZTogc291cmNlQ2FjaGUuc2VyaWFsaXplKCksXG4gICAgICAgICAgICBzb3VyY2VJZDogaWRcbiAgICAgICAgfSkpO1xuXG4gICAgICAgIHNvdXJjZUNhY2hlLm9uQWRkKHRoaXMubWFwKTtcbiAgICAgICAgdGhpcy5fY2hhbmdlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGEgc291cmNlIGZyb20gdGhpcyBzdHlsZXNoZWV0LCBnaXZlbiBpdHMgaWQuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGlkIGlkIG9mIHRoZSBzb3VyY2UgdG8gcmVtb3ZlXG4gICAgICogQHRocm93cyB7RXJyb3J9IGlmIG5vIHNvdXJjZSBpcyBmb3VuZCB3aXRoIHRoZSBnaXZlbiBJRFxuICAgICAqL1xuICAgIHJlbW92ZVNvdXJjZShpZDogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2NoZWNrTG9hZGVkKCk7XG5cbiAgICAgICAgaWYgKHRoaXMuc291cmNlQ2FjaGVzW2lkXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZXJlIGlzIG5vIHNvdXJjZSB3aXRoIHRoaXMgSUQnKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IGxheWVySWQgaW4gdGhpcy5fbGF5ZXJzKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fbGF5ZXJzW2xheWVySWRdLnNvdXJjZSA9PT0gaWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5maXJlKG5ldyBFcnJvckV2ZW50KG5ldyBFcnJvcihgU291cmNlIFwiJHtpZH1cIiBjYW5ub3QgYmUgcmVtb3ZlZCB3aGlsZSBsYXllciBcIiR7bGF5ZXJJZH1cIiBpcyB1c2luZyBpdC5gKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc291cmNlQ2FjaGUgPSB0aGlzLnNvdXJjZUNhY2hlc1tpZF07XG4gICAgICAgIGRlbGV0ZSB0aGlzLnNvdXJjZUNhY2hlc1tpZF07XG4gICAgICAgIGRlbGV0ZSB0aGlzLl91cGRhdGVkU291cmNlc1tpZF07XG4gICAgICAgIHNvdXJjZUNhY2hlLmZpcmUobmV3IEV2ZW50KCdkYXRhJywge3NvdXJjZURhdGFUeXBlOiAnbWV0YWRhdGEnLCBkYXRhVHlwZTonc291cmNlJywgc291cmNlSWQ6IGlkfSkpO1xuICAgICAgICBzb3VyY2VDYWNoZS5zZXRFdmVudGVkUGFyZW50KG51bGwpO1xuICAgICAgICBzb3VyY2VDYWNoZS5jbGVhclRpbGVzKCk7XG5cbiAgICAgICAgaWYgKHNvdXJjZUNhY2hlLm9uUmVtb3ZlKSBzb3VyY2VDYWNoZS5vblJlbW92ZSh0aGlzLm1hcCk7XG4gICAgICAgIHRoaXMuX2NoYW5nZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogU2V0IHRoZSBkYXRhIG9mIGEgR2VvSlNPTiBzb3VyY2UsIGdpdmVuIGl0cyBpZC5cbiAgICAqIEBwYXJhbSB7c3RyaW5nfSBpZCBpZCBvZiB0aGUgc291cmNlXG4gICAgKiBAcGFyYW0ge0dlb0pTT058c3RyaW5nfSBkYXRhIEdlb0pTT04gc291cmNlXG4gICAgKi9cbiAgICBzZXRHZW9KU09OU291cmNlRGF0YShpZDogc3RyaW5nLCBkYXRhOiBHZW9KU09OIHwgc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2NoZWNrTG9hZGVkKCk7XG5cbiAgICAgICAgYXNzZXJ0KHRoaXMuc291cmNlQ2FjaGVzW2lkXSAhPT0gdW5kZWZpbmVkLCAnVGhlcmUgaXMgbm8gc291cmNlIHdpdGggdGhpcyBJRCcpO1xuICAgICAgICBjb25zdCBnZW9qc29uU291cmNlOiBHZW9KU09OU291cmNlID0gKHRoaXMuc291cmNlQ2FjaGVzW2lkXS5nZXRTb3VyY2UoKTogYW55KTtcbiAgICAgICAgYXNzZXJ0KGdlb2pzb25Tb3VyY2UudHlwZSA9PT0gJ2dlb2pzb24nKTtcblxuICAgICAgICBnZW9qc29uU291cmNlLnNldERhdGEoZGF0YSk7XG4gICAgICAgIHRoaXMuX2NoYW5nZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBhIHNvdXJjZSBieSBpZC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaWQgaWQgb2YgdGhlIGRlc2lyZWQgc291cmNlXG4gICAgICogQHJldHVybnMge09iamVjdH0gc291cmNlXG4gICAgICovXG4gICAgZ2V0U291cmNlKGlkOiBzdHJpbmcpOiBPYmplY3Qge1xuICAgICAgICByZXR1cm4gdGhpcy5zb3VyY2VDYWNoZXNbaWRdICYmIHRoaXMuc291cmNlQ2FjaGVzW2lkXS5nZXRTb3VyY2UoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGQgYSBsYXllciB0byB0aGUgbWFwIHN0eWxlLiBUaGUgbGF5ZXIgd2lsbCBiZSBpbnNlcnRlZCBiZWZvcmUgdGhlIGxheWVyIHdpdGhcbiAgICAgKiBJRCBgYmVmb3JlYCwgb3IgYXBwZW5kZWQgaWYgYGJlZm9yZWAgaXMgb21pdHRlZC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2JlZm9yZV0gSUQgb2YgYW4gZXhpc3RpbmcgbGF5ZXIgdG8gaW5zZXJ0IGJlZm9yZVxuICAgICAqL1xuICAgIGFkZExheWVyKGxheWVyT2JqZWN0OiBMYXllclNwZWNpZmljYXRpb24gfCBDdXN0b21MYXllckludGVyZmFjZSwgYmVmb3JlPzogc3RyaW5nLCBvcHRpb25zOiBTdHlsZVNldHRlck9wdGlvbnMgPSB7fSkge1xuICAgICAgICB0aGlzLl9jaGVja0xvYWRlZCgpO1xuXG4gICAgICAgIGNvbnN0IGlkID0gbGF5ZXJPYmplY3QuaWQ7XG5cbiAgICAgICAgaWYgKHRoaXMuZ2V0TGF5ZXIoaWQpKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEVycm9yRXZlbnQobmV3IEVycm9yKGBMYXllciB3aXRoIGlkIFwiJHtpZH1cIiBhbHJlYWR5IGV4aXN0cyBvbiB0aGlzIG1hcGApKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbGF5ZXI7XG4gICAgICAgIGlmIChsYXllck9iamVjdC50eXBlID09PSAnY3VzdG9tJykge1xuXG4gICAgICAgICAgICBpZiAoZW1pdFZhbGlkYXRpb25FcnJvcnModGhpcywgdmFsaWRhdGVDdXN0b21TdHlsZUxheWVyKGxheWVyT2JqZWN0KSkpIHJldHVybjtcblxuICAgICAgICAgICAgbGF5ZXIgPSBjcmVhdGVTdHlsZUxheWVyKGxheWVyT2JqZWN0KTtcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBsYXllck9iamVjdC5zb3VyY2UgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRTb3VyY2UoaWQsIGxheWVyT2JqZWN0LnNvdXJjZSk7XG4gICAgICAgICAgICAgICAgbGF5ZXJPYmplY3QgPSBjbG9uZShsYXllck9iamVjdCk7XG4gICAgICAgICAgICAgICAgbGF5ZXJPYmplY3QgPSAoZXh0ZW5kKGxheWVyT2JqZWN0LCB7c291cmNlOiBpZH0pOiBhbnkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyB0aGlzIGxheWVyIGlzIG5vdCBpbiB0aGUgc3R5bGUubGF5ZXJzIGFycmF5LCBzbyB3ZSBwYXNzIGFuIGltcG9zc2libGUgYXJyYXkgaW5kZXhcbiAgICAgICAgICAgIGlmICh0aGlzLl92YWxpZGF0ZSh2YWxpZGF0ZVN0eWxlLmxheWVyLFxuICAgICAgICAgICAgICAgIGBsYXllcnMuJHtpZH1gLCBsYXllck9iamVjdCwge2FycmF5SW5kZXg6IC0xfSwgb3B0aW9ucykpIHJldHVybjtcblxuICAgICAgICAgICAgbGF5ZXIgPSBjcmVhdGVTdHlsZUxheWVyKGxheWVyT2JqZWN0KTtcbiAgICAgICAgICAgIHRoaXMuX3ZhbGlkYXRlTGF5ZXIobGF5ZXIpO1xuXG4gICAgICAgICAgICBsYXllci5zZXRFdmVudGVkUGFyZW50KHRoaXMsIHtsYXllcjoge2lkfX0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaW5kZXggPSBiZWZvcmUgPyB0aGlzLl9vcmRlci5pbmRleE9mKGJlZm9yZSkgOiB0aGlzLl9vcmRlci5sZW5ndGg7XG4gICAgICAgIGlmIChiZWZvcmUgJiYgaW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEVycm9yRXZlbnQobmV3IEVycm9yKGBMYXllciB3aXRoIGlkIFwiJHtiZWZvcmV9XCIgZG9lcyBub3QgZXhpc3Qgb24gdGhpcyBtYXAuYCkpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX29yZGVyLnNwbGljZShpbmRleCwgMCwgaWQpO1xuICAgICAgICB0aGlzLl9sYXllck9yZGVyQ2hhbmdlZCA9IHRydWU7XG5cbiAgICAgICAgdGhpcy5fbGF5ZXJzW2lkXSA9IGxheWVyO1xuXG4gICAgICAgIGlmICh0aGlzLl9yZW1vdmVkTGF5ZXJzW2lkXSAmJiBsYXllci5zb3VyY2UgJiYgbGF5ZXIudHlwZSAhPT0gJ2N1c3RvbScpIHtcbiAgICAgICAgICAgIC8vIElmLCBpbiB0aGUgY3VycmVudCBiYXRjaCwgd2UgaGF2ZSBhbHJlYWR5IHJlbW92ZWQgdGhpcyBsYXllclxuICAgICAgICAgICAgLy8gYW5kIHdlIGFyZSBub3cgcmUtYWRkaW5nIGl0IHdpdGggYSBkaWZmZXJlbnQgYHR5cGVgLCB0aGVuIHdlXG4gICAgICAgICAgICAvLyBuZWVkIHRvIGNsZWFyIChyYXRoZXIgdGhhbiBqdXN0IHJlbG9hZCkgdGhlIHVuZGVyeWxpbmcgc291cmNlJ3NcbiAgICAgICAgICAgIC8vIHRpbGVzLiAgT3RoZXJ3aXNlLCB0aWxlcyBtYXJrZWQgJ3JlbG9hZGluZycgd2lsbCBoYXZlIGJ1Y2tldHMgL1xuICAgICAgICAgICAgLy8gYnVmZmVycyB0aGF0IGFyZSBzZXQgdXAgZm9yIHRoZSBfcHJldmlvdXNfIHZlcnNpb24gb2YgdGhpc1xuICAgICAgICAgICAgLy8gbGF5ZXIsIGNhdXNpbmcsIGUuZy46XG4gICAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L21hcGJveC1nbC1qcy9pc3N1ZXMvMzYzM1xuICAgICAgICAgICAgY29uc3QgcmVtb3ZlZCA9IHRoaXMuX3JlbW92ZWRMYXllcnNbaWRdO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuX3JlbW92ZWRMYXllcnNbaWRdO1xuICAgICAgICAgICAgaWYgKHJlbW92ZWQudHlwZSAhPT0gbGF5ZXIudHlwZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZWRTb3VyY2VzW2xheWVyLnNvdXJjZV0gPSAnY2xlYXInO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVkU291cmNlc1tsYXllci5zb3VyY2VdID0gJ3JlbG9hZCc7XG4gICAgICAgICAgICAgICAgdGhpcy5zb3VyY2VDYWNoZXNbbGF5ZXIuc291cmNlXS5wYXVzZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3VwZGF0ZUxheWVyKGxheWVyKTtcblxuICAgICAgICBpZiAobGF5ZXIub25BZGQpIHtcbiAgICAgICAgICAgIGxheWVyLm9uQWRkKHRoaXMubWFwKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1vdmVzIGEgbGF5ZXIgdG8gYSBkaWZmZXJlbnQgei1wb3NpdGlvbi4gVGhlIGxheWVyIHdpbGwgYmUgaW5zZXJ0ZWQgYmVmb3JlIHRoZSBsYXllciB3aXRoXG4gICAgICogSUQgYGJlZm9yZWAsIG9yIGFwcGVuZGVkIGlmIGBiZWZvcmVgIGlzIG9taXR0ZWQuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGlkICBJRCBvZiB0aGUgbGF5ZXIgdG8gbW92ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbYmVmb3JlXSBJRCBvZiBhbiBleGlzdGluZyBsYXllciB0byBpbnNlcnQgYmVmb3JlXG4gICAgICovXG4gICAgbW92ZUxheWVyKGlkOiBzdHJpbmcsIGJlZm9yZT86IHN0cmluZykge1xuICAgICAgICB0aGlzLl9jaGVja0xvYWRlZCgpO1xuICAgICAgICB0aGlzLl9jaGFuZ2VkID0gdHJ1ZTtcblxuICAgICAgICBjb25zdCBsYXllciA9IHRoaXMuX2xheWVyc1tpZF07XG4gICAgICAgIGlmICghbGF5ZXIpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXJyb3JFdmVudChuZXcgRXJyb3IoYFRoZSBsYXllciAnJHtpZH0nIGRvZXMgbm90IGV4aXN0IGluIHRoZSBtYXAncyBzdHlsZSBhbmQgY2Fubm90IGJlIG1vdmVkLmApKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaWQgPT09IGJlZm9yZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLl9vcmRlci5pbmRleE9mKGlkKTtcbiAgICAgICAgdGhpcy5fb3JkZXIuc3BsaWNlKGluZGV4LCAxKTtcblxuICAgICAgICBjb25zdCBuZXdJbmRleCA9IGJlZm9yZSA/IHRoaXMuX29yZGVyLmluZGV4T2YoYmVmb3JlKSA6IHRoaXMuX29yZGVyLmxlbmd0aDtcbiAgICAgICAgaWYgKGJlZm9yZSAmJiBuZXdJbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXJyb3JFdmVudChuZXcgRXJyb3IoYExheWVyIHdpdGggaWQgXCIke2JlZm9yZX1cIiBkb2VzIG5vdCBleGlzdCBvbiB0aGlzIG1hcC5gKSkpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX29yZGVyLnNwbGljZShuZXdJbmRleCwgMCwgaWQpO1xuXG4gICAgICAgIHRoaXMuX2xheWVyT3JkZXJDaGFuZ2VkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgdGhlIGxheWVyIHdpdGggdGhlIGdpdmVuIGlkIGZyb20gdGhlIHN0eWxlLlxuICAgICAqXG4gICAgICogSWYgbm8gc3VjaCBsYXllciBleGlzdHMsIGFuIGBlcnJvcmAgZXZlbnQgaXMgZmlyZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaWQgaWQgb2YgdGhlIGxheWVyIHRvIHJlbW92ZVxuICAgICAqIEBmaXJlcyBlcnJvclxuICAgICAqL1xuICAgIHJlbW92ZUxheWVyKGlkOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5fY2hlY2tMb2FkZWQoKTtcblxuICAgICAgICBjb25zdCBsYXllciA9IHRoaXMuX2xheWVyc1tpZF07XG4gICAgICAgIGlmICghbGF5ZXIpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXJyb3JFdmVudChuZXcgRXJyb3IoYFRoZSBsYXllciAnJHtpZH0nIGRvZXMgbm90IGV4aXN0IGluIHRoZSBtYXAncyBzdHlsZSBhbmQgY2Fubm90IGJlIHJlbW92ZWQuYCkpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxheWVyLnNldEV2ZW50ZWRQYXJlbnQobnVsbCk7XG5cbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLl9vcmRlci5pbmRleE9mKGlkKTtcbiAgICAgICAgdGhpcy5fb3JkZXIuc3BsaWNlKGluZGV4LCAxKTtcblxuICAgICAgICB0aGlzLl9sYXllck9yZGVyQ2hhbmdlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuX2NoYW5nZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLl9yZW1vdmVkTGF5ZXJzW2lkXSA9IGxheWVyO1xuICAgICAgICBkZWxldGUgdGhpcy5fbGF5ZXJzW2lkXTtcbiAgICAgICAgZGVsZXRlIHRoaXMuX3VwZGF0ZWRMYXllcnNbaWRdO1xuICAgICAgICBkZWxldGUgdGhpcy5fdXBkYXRlZFBhaW50UHJvcHNbaWRdO1xuXG4gICAgICAgIGlmIChsYXllci5vblJlbW92ZSkge1xuICAgICAgICAgICAgbGF5ZXIub25SZW1vdmUodGhpcy5tYXApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRoZSBzdHlsZSBsYXllciBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4gYGlkYC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBpZCAtIGlkIG9mIHRoZSBkZXNpcmVkIGxheWVyXG4gICAgICogQHJldHVybnMgez9PYmplY3R9IGEgbGF5ZXIsIGlmIG9uZSB3aXRoIHRoZSBnaXZlbiBgaWRgIGV4aXN0c1xuICAgICAqL1xuICAgIGdldExheWVyKGlkOiBzdHJpbmcpOiBPYmplY3Qge1xuICAgICAgICByZXR1cm4gdGhpcy5fbGF5ZXJzW2lkXTtcbiAgICB9XG5cbiAgICBzZXRMYXllclpvb21SYW5nZShsYXllcklkOiBzdHJpbmcsIG1pbnpvb206ID9udW1iZXIsIG1heHpvb206ID9udW1iZXIpIHtcbiAgICAgICAgdGhpcy5fY2hlY2tMb2FkZWQoKTtcblxuICAgICAgICBjb25zdCBsYXllciA9IHRoaXMuZ2V0TGF5ZXIobGF5ZXJJZCk7XG4gICAgICAgIGlmICghbGF5ZXIpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXJyb3JFdmVudChuZXcgRXJyb3IoYFRoZSBsYXllciAnJHtsYXllcklkfScgZG9lcyBub3QgZXhpc3QgaW4gdGhlIG1hcCdzIHN0eWxlIGFuZCBjYW5ub3QgaGF2ZSB6b29tIGV4dGVudC5gKSkpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGxheWVyLm1pbnpvb20gPT09IG1pbnpvb20gJiYgbGF5ZXIubWF4em9vbSA9PT0gbWF4em9vbSkgcmV0dXJuO1xuXG4gICAgICAgIGlmIChtaW56b29tICE9IG51bGwpIHtcbiAgICAgICAgICAgIGxheWVyLm1pbnpvb20gPSBtaW56b29tO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtYXh6b29tICE9IG51bGwpIHtcbiAgICAgICAgICAgIGxheWVyLm1heHpvb20gPSBtYXh6b29tO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3VwZGF0ZUxheWVyKGxheWVyKTtcbiAgICB9XG5cbiAgICBzZXRGaWx0ZXIobGF5ZXJJZDogc3RyaW5nLCBmaWx0ZXI6ID9GaWx0ZXJTcGVjaWZpY2F0aW9uLCAgb3B0aW9uczogU3R5bGVTZXR0ZXJPcHRpb25zID0ge30pIHtcbiAgICAgICAgdGhpcy5fY2hlY2tMb2FkZWQoKTtcblxuICAgICAgICBjb25zdCBsYXllciA9IHRoaXMuZ2V0TGF5ZXIobGF5ZXJJZCk7XG4gICAgICAgIGlmICghbGF5ZXIpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXJyb3JFdmVudChuZXcgRXJyb3IoYFRoZSBsYXllciAnJHtsYXllcklkfScgZG9lcyBub3QgZXhpc3QgaW4gdGhlIG1hcCdzIHN0eWxlIGFuZCBjYW5ub3QgYmUgZmlsdGVyZWQuYCkpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkZWVwRXF1YWwobGF5ZXIuZmlsdGVyLCBmaWx0ZXIpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZmlsdGVyID09PSBudWxsIHx8IGZpbHRlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsYXllci5maWx0ZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVMYXllcihsYXllcik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fdmFsaWRhdGUodmFsaWRhdGVTdHlsZS5maWx0ZXIsIGBsYXllcnMuJHtsYXllci5pZH0uZmlsdGVyYCwgZmlsdGVyLCBudWxsLCBvcHRpb25zKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGF5ZXIuZmlsdGVyID0gY2xvbmUoZmlsdGVyKTtcbiAgICAgICAgdGhpcy5fdXBkYXRlTGF5ZXIobGF5ZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBhIGxheWVyJ3MgZmlsdGVyIG9iamVjdFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBsYXllciB0aGUgbGF5ZXIgdG8gaW5zcGVjdFxuICAgICAqIEByZXR1cm5zIHsqfSB0aGUgbGF5ZXIncyBmaWx0ZXIsIGlmIGFueVxuICAgICAqL1xuICAgIGdldEZpbHRlcihsYXllcjogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiBjbG9uZSh0aGlzLmdldExheWVyKGxheWVyKS5maWx0ZXIpO1xuICAgIH1cblxuICAgIHNldExheW91dFByb3BlcnR5KGxheWVySWQ6IHN0cmluZywgbmFtZTogc3RyaW5nLCB2YWx1ZTogYW55LCAgb3B0aW9uczogU3R5bGVTZXR0ZXJPcHRpb25zID0ge30pIHtcbiAgICAgICAgdGhpcy5fY2hlY2tMb2FkZWQoKTtcblxuICAgICAgICBjb25zdCBsYXllciA9IHRoaXMuZ2V0TGF5ZXIobGF5ZXJJZCk7XG4gICAgICAgIGlmICghbGF5ZXIpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXJyb3JFdmVudChuZXcgRXJyb3IoYFRoZSBsYXllciAnJHtsYXllcklkfScgZG9lcyBub3QgZXhpc3QgaW4gdGhlIG1hcCdzIHN0eWxlIGFuZCBjYW5ub3QgYmUgc3R5bGVkLmApKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGVlcEVxdWFsKGxheWVyLmdldExheW91dFByb3BlcnR5KG5hbWUpLCB2YWx1ZSkpIHJldHVybjtcblxuICAgICAgICBsYXllci5zZXRMYXlvdXRQcm9wZXJ0eShuYW1lLCB2YWx1ZSwgb3B0aW9ucyk7XG4gICAgICAgIHRoaXMuX3VwZGF0ZUxheWVyKGxheWVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYSBsYXlvdXQgcHJvcGVydHkncyB2YWx1ZSBmcm9tIGEgZ2l2ZW4gbGF5ZXJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbGF5ZXJJZCB0aGUgbGF5ZXIgdG8gaW5zcGVjdFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBsYXlvdXQgcHJvcGVydHlcbiAgICAgKiBAcmV0dXJucyB7Kn0gdGhlIHByb3BlcnR5IHZhbHVlXG4gICAgICovXG4gICAgZ2V0TGF5b3V0UHJvcGVydHkobGF5ZXJJZDogc3RyaW5nLCBuYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgbGF5ZXIgPSB0aGlzLmdldExheWVyKGxheWVySWQpO1xuICAgICAgICBpZiAoIWxheWVyKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEVycm9yRXZlbnQobmV3IEVycm9yKGBUaGUgbGF5ZXIgJyR7bGF5ZXJJZH0nIGRvZXMgbm90IGV4aXN0IGluIHRoZSBtYXAncyBzdHlsZS5gKSkpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGxheWVyLmdldExheW91dFByb3BlcnR5KG5hbWUpO1xuICAgIH1cblxuICAgIHNldFBhaW50UHJvcGVydHkobGF5ZXJJZDogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnksIG9wdGlvbnM6IFN0eWxlU2V0dGVyT3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHRoaXMuX2NoZWNrTG9hZGVkKCk7XG5cbiAgICAgICAgY29uc3QgbGF5ZXIgPSB0aGlzLmdldExheWVyKGxheWVySWQpO1xuICAgICAgICBpZiAoIWxheWVyKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEVycm9yRXZlbnQobmV3IEVycm9yKGBUaGUgbGF5ZXIgJyR7bGF5ZXJJZH0nIGRvZXMgbm90IGV4aXN0IGluIHRoZSBtYXAncyBzdHlsZSBhbmQgY2Fubm90IGJlIHN0eWxlZC5gKSkpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRlZXBFcXVhbChsYXllci5nZXRQYWludFByb3BlcnR5KG5hbWUpLCB2YWx1ZSkpIHJldHVybjtcblxuICAgICAgICBjb25zdCByZXF1aXJlc1JlbGF5b3V0ID0gbGF5ZXIuc2V0UGFpbnRQcm9wZXJ0eShuYW1lLCB2YWx1ZSwgb3B0aW9ucyk7XG4gICAgICAgIGlmIChyZXF1aXJlc1JlbGF5b3V0KSB7XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVMYXllcihsYXllcik7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9jaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fdXBkYXRlZFBhaW50UHJvcHNbbGF5ZXJJZF0gPSB0cnVlO1xuICAgIH1cblxuICAgIGdldFBhaW50UHJvcGVydHkobGF5ZXI6IHN0cmluZywgbmFtZTogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldExheWVyKGxheWVyKS5nZXRQYWludFByb3BlcnR5KG5hbWUpO1xuICAgIH1cblxuICAgIHNldEZlYXR1cmVTdGF0ZShmZWF0dXJlOiB7IHNvdXJjZTogc3RyaW5nOyBzb3VyY2VMYXllcj86IHN0cmluZzsgaWQ6IHN0cmluZyB8IG51bWJlcjsgfSwgc3RhdGU6IE9iamVjdCkge1xuICAgICAgICB0aGlzLl9jaGVja0xvYWRlZCgpO1xuICAgICAgICBjb25zdCBzb3VyY2VJZCA9IGZlYXR1cmUuc291cmNlO1xuICAgICAgICBjb25zdCBzb3VyY2VMYXllciA9IGZlYXR1cmUuc291cmNlTGF5ZXI7XG4gICAgICAgIGNvbnN0IHNvdXJjZUNhY2hlID0gdGhpcy5zb3VyY2VDYWNoZXNbc291cmNlSWRdO1xuICAgICAgICBjb25zdCBmZWF0dXJlSWQgPSBwYXJzZUludChmZWF0dXJlLmlkLCAxMCk7XG5cbiAgICAgICAgaWYgKHNvdXJjZUNhY2hlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXJyb3JFdmVudChuZXcgRXJyb3IoYFRoZSBzb3VyY2UgJyR7c291cmNlSWR9JyBkb2VzIG5vdCBleGlzdCBpbiB0aGUgbWFwJ3Mgc3R5bGUuYCkpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzb3VyY2VUeXBlID0gc291cmNlQ2FjaGUuZ2V0U291cmNlKCkudHlwZTtcbiAgICAgICAgaWYgKHNvdXJjZVR5cGUgPT09ICdnZW9qc29uJyAmJiBzb3VyY2VMYXllcikge1xuICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFcnJvckV2ZW50KG5ldyBFcnJvcihgR2VvSlNPTiBzb3VyY2VzIGNhbm5vdCBoYXZlIGEgc291cmNlTGF5ZXIgcGFyYW1ldGVyLmApKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNvdXJjZVR5cGUgPT09ICd2ZWN0b3InICYmICFzb3VyY2VMYXllcikge1xuICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFcnJvckV2ZW50KG5ldyBFcnJvcihgVGhlIHNvdXJjZUxheWVyIHBhcmFtZXRlciBtdXN0IGJlIHByb3ZpZGVkIGZvciB2ZWN0b3Igc291cmNlIHR5cGVzLmApKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzTmFOKGZlYXR1cmVJZCkgfHwgZmVhdHVyZUlkIDwgMCkge1xuICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFcnJvckV2ZW50KG5ldyBFcnJvcihgVGhlIGZlYXR1cmUgaWQgcGFyYW1ldGVyIG11c3QgYmUgcHJvdmlkZWQgYW5kIG5vbi1uZWdhdGl2ZS5gKSkpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgc291cmNlQ2FjaGUuc2V0RmVhdHVyZVN0YXRlKHNvdXJjZUxheWVyLCBmZWF0dXJlSWQsIHN0YXRlKTtcbiAgICB9XG5cbiAgICByZW1vdmVGZWF0dXJlU3RhdGUodGFyZ2V0OiB7IHNvdXJjZTogc3RyaW5nOyBzb3VyY2VMYXllcj86IHN0cmluZzsgaWQ/OiBzdHJpbmcgfCBudW1iZXI7IH0sIGtleT86IHN0cmluZykge1xuICAgICAgICB0aGlzLl9jaGVja0xvYWRlZCgpO1xuICAgICAgICBjb25zdCBzb3VyY2VJZCA9IHRhcmdldC5zb3VyY2U7XG4gICAgICAgIGNvbnN0IHNvdXJjZUNhY2hlID0gdGhpcy5zb3VyY2VDYWNoZXNbc291cmNlSWRdO1xuXG4gICAgICAgIGlmIChzb3VyY2VDYWNoZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEVycm9yRXZlbnQobmV3IEVycm9yKGBUaGUgc291cmNlICcke3NvdXJjZUlkfScgZG9lcyBub3QgZXhpc3QgaW4gdGhlIG1hcCdzIHN0eWxlLmApKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzb3VyY2VUeXBlID0gc291cmNlQ2FjaGUuZ2V0U291cmNlKCkudHlwZTtcbiAgICAgICAgY29uc3Qgc291cmNlTGF5ZXIgPSBzb3VyY2VUeXBlID09PSAndmVjdG9yJyA/IHRhcmdldC5zb3VyY2VMYXllciA6IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgZmVhdHVyZUlkID0gcGFyc2VJbnQodGFyZ2V0LmlkLCAxMCk7XG5cbiAgICAgICAgaWYgKHNvdXJjZVR5cGUgPT09ICd2ZWN0b3InICYmICFzb3VyY2VMYXllcikge1xuICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFcnJvckV2ZW50KG5ldyBFcnJvcihgVGhlIHNvdXJjZUxheWVyIHBhcmFtZXRlciBtdXN0IGJlIHByb3ZpZGVkIGZvciB2ZWN0b3Igc291cmNlIHR5cGVzLmApKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGFyZ2V0LmlkICE9PSB1bmRlZmluZWQgJiYgaXNOYU4oZmVhdHVyZUlkKSB8fCBmZWF0dXJlSWQgPCAwKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEVycm9yRXZlbnQobmV3IEVycm9yKGBUaGUgZmVhdHVyZSBpZCBwYXJhbWV0ZXIgbXVzdCBiZSBub24tbmVnYXRpdmUuYCkpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChrZXkgJiYgKHR5cGVvZiB0YXJnZXQuaWQgIT09ICdzdHJpbmcnICYmIHR5cGVvZiB0YXJnZXQuaWQgIT09ICdudW1iZXInKSkge1xuICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFcnJvckV2ZW50KG5ldyBFcnJvcihgQSBmZWF0dXJlIGlkIGlzIHJlcXVyZWQgdG8gcmVtb3ZlIGl0cyBzcGVjaWZpYyBzdGF0ZSBwcm9wZXJ0eS5gKSkpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgc291cmNlQ2FjaGUucmVtb3ZlRmVhdHVyZVN0YXRlKHNvdXJjZUxheWVyLCBmZWF0dXJlSWQsIGtleSk7XG4gICAgfVxuXG4gICAgZ2V0RmVhdHVyZVN0YXRlKGZlYXR1cmU6IHsgc291cmNlOiBzdHJpbmc7IHNvdXJjZUxheWVyPzogc3RyaW5nOyBpZDogc3RyaW5nIHwgbnVtYmVyOyB9KSB7XG4gICAgICAgIHRoaXMuX2NoZWNrTG9hZGVkKCk7XG4gICAgICAgIGNvbnN0IHNvdXJjZUlkID0gZmVhdHVyZS5zb3VyY2U7XG4gICAgICAgIGNvbnN0IHNvdXJjZUxheWVyID0gZmVhdHVyZS5zb3VyY2VMYXllcjtcbiAgICAgICAgY29uc3Qgc291cmNlQ2FjaGUgPSB0aGlzLnNvdXJjZUNhY2hlc1tzb3VyY2VJZF07XG4gICAgICAgIGNvbnN0IGZlYXR1cmVJZCA9IHBhcnNlSW50KGZlYXR1cmUuaWQsIDEwKTtcblxuICAgICAgICBpZiAoc291cmNlQ2FjaGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFcnJvckV2ZW50KG5ldyBFcnJvcihgVGhlIHNvdXJjZSAnJHtzb3VyY2VJZH0nIGRvZXMgbm90IGV4aXN0IGluIHRoZSBtYXAncyBzdHlsZS5gKSkpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNvdXJjZVR5cGUgPSBzb3VyY2VDYWNoZS5nZXRTb3VyY2UoKS50eXBlO1xuICAgICAgICBpZiAoc291cmNlVHlwZSA9PT0gJ3ZlY3RvcicgJiYgIXNvdXJjZUxheWVyKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEVycm9yRXZlbnQobmV3IEVycm9yKGBUaGUgc291cmNlTGF5ZXIgcGFyYW1ldGVyIG11c3QgYmUgcHJvdmlkZWQgZm9yIHZlY3RvciBzb3VyY2UgdHlwZXMuYCkpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNOYU4oZmVhdHVyZUlkKSB8fCBmZWF0dXJlSWQgPCAwKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEVycm9yRXZlbnQobmV3IEVycm9yKGBUaGUgZmVhdHVyZSBpZCBwYXJhbWV0ZXIgbXVzdCBiZSBwcm92aWRlZCBhbmQgbm9uLW5lZ2F0aXZlLmApKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc291cmNlQ2FjaGUuZ2V0RmVhdHVyZVN0YXRlKHNvdXJjZUxheWVyLCBmZWF0dXJlSWQpO1xuICAgIH1cblxuICAgIGdldFRyYW5zaXRpb24oKSB7XG4gICAgICAgIHJldHVybiBleHRlbmQoeyBkdXJhdGlvbjogMzAwLCBkZWxheTogMCB9LCB0aGlzLnN0eWxlc2hlZXQgJiYgdGhpcy5zdHlsZXNoZWV0LnRyYW5zaXRpb24pO1xuICAgIH1cblxuICAgIHNlcmlhbGl6ZSgpIHtcbiAgICAgICAgcmV0dXJuIGZpbHRlck9iamVjdCh7XG4gICAgICAgICAgICB2ZXJzaW9uOiB0aGlzLnN0eWxlc2hlZXQudmVyc2lvbixcbiAgICAgICAgICAgIG5hbWU6IHRoaXMuc3R5bGVzaGVldC5uYW1lLFxuICAgICAgICAgICAgbWV0YWRhdGE6IHRoaXMuc3R5bGVzaGVldC5tZXRhZGF0YSxcbiAgICAgICAgICAgIGxpZ2h0OiB0aGlzLnN0eWxlc2hlZXQubGlnaHQsXG4gICAgICAgICAgICBjZW50ZXI6IHRoaXMuc3R5bGVzaGVldC5jZW50ZXIsXG4gICAgICAgICAgICB6b29tOiB0aGlzLnN0eWxlc2hlZXQuem9vbSxcbiAgICAgICAgICAgIGJlYXJpbmc6IHRoaXMuc3R5bGVzaGVldC5iZWFyaW5nLFxuICAgICAgICAgICAgcGl0Y2g6IHRoaXMuc3R5bGVzaGVldC5waXRjaCxcbiAgICAgICAgICAgIHNwcml0ZTogdGhpcy5zdHlsZXNoZWV0LnNwcml0ZSxcbiAgICAgICAgICAgIGdseXBoczogdGhpcy5zdHlsZXNoZWV0LmdseXBocyxcbiAgICAgICAgICAgIHRyYW5zaXRpb246IHRoaXMuc3R5bGVzaGVldC50cmFuc2l0aW9uLFxuICAgICAgICAgICAgc291cmNlczogbWFwT2JqZWN0KHRoaXMuc291cmNlQ2FjaGVzLCAoc291cmNlKSA9PiBzb3VyY2Uuc2VyaWFsaXplKCkpLFxuICAgICAgICAgICAgbGF5ZXJzOiB0aGlzLl9zZXJpYWxpemVMYXllcnModGhpcy5fb3JkZXIpXG4gICAgICAgIH0sICh2YWx1ZSkgPT4geyByZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZDsgfSk7XG4gICAgfVxuXG4gICAgX3VwZGF0ZUxheWVyKGxheWVyOiBTdHlsZUxheWVyKSB7XG4gICAgICAgIHRoaXMuX3VwZGF0ZWRMYXllcnNbbGF5ZXIuaWRdID0gdHJ1ZTtcbiAgICAgICAgaWYgKGxheWVyLnNvdXJjZSAmJiAhdGhpcy5fdXBkYXRlZFNvdXJjZXNbbGF5ZXIuc291cmNlXSkge1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlZFNvdXJjZXNbbGF5ZXIuc291cmNlXSA9ICdyZWxvYWQnO1xuICAgICAgICAgICAgdGhpcy5zb3VyY2VDYWNoZXNbbGF5ZXIuc291cmNlXS5wYXVzZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2NoYW5nZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIF9mbGF0dGVuQW5kU29ydFJlbmRlcmVkRmVhdHVyZXMoc291cmNlUmVzdWx0czogQXJyYXk8YW55Pikge1xuICAgICAgICAvLyBGZWF0dXJlIG9yZGVyIGlzIGNvbXBsaWNhdGVkLlxuICAgICAgICAvLyBUaGUgb3JkZXIgYmV0d2VlbiBmZWF0dXJlcyBpbiB0d28gMkQgbGF5ZXJzIGlzIGFsd2F5cyBkZXRlcm1pbmVkIGJ5IGxheWVyIG9yZGVyLlxuICAgICAgICAvLyBUaGUgb3JkZXIgYmV0d2VlbiBmZWF0dXJlcyBpbiB0d28gM0QgbGF5ZXJzIGlzIGFsd2F5cyBkZXRlcm1pbmVkIGJ5IGRlcHRoLlxuICAgICAgICAvLyBUaGUgb3JkZXIgYmV0d2VlbiBhIGZlYXR1cmUgaW4gYSAyRCBsYXllciBhbmQgYSAzRCBsYXllciBpcyB0cmlja3k6XG4gICAgICAgIC8vICAgICAgTW9zdCBvZnRlbiBsYXllciBvcmRlciBkZXRlcm1pbmVzIHRoZSBmZWF0dXJlIG9yZGVyIGluIHRoaXMgY2FzZS4gSWZcbiAgICAgICAgLy8gICAgICBhIGxpbmUgbGF5ZXIgaXMgYWJvdmUgYSBleHRydXNpb24gbGF5ZXIgdGhlIGxpbmUgZmVhdHVyZSB3aWxsIGJlIHJlbmRlcmVkXG4gICAgICAgIC8vICAgICAgYWJvdmUgdGhlIGV4dHJ1c2lvbi4gSWYgdGhlIGxpbmUgbGF5ZXIgaXMgYmVsb3cgdGhlIGV4dHJ1c2lvbiBsYXllcixcbiAgICAgICAgLy8gICAgICBpdCB3aWxsIGJlIHJlbmRlcmVkIGJlbG93IGl0LlxuICAgICAgICAvL1xuICAgICAgICAvLyAgICAgIFRoZXJlIGlzIGEgd2VpcmQgY2FzZSB0aG91Z2guXG4gICAgICAgIC8vICAgICAgWW91IGhhdmUgbGF5ZXJzIGluIHRoaXMgb3JkZXI6IGV4dHJ1c2lvbl9sYXllcl9hLCBsaW5lX2xheWVyLCBleHRydXNpb25fbGF5ZXJfYlxuICAgICAgICAvLyAgICAgIEVhY2ggbGF5ZXIgaGFzIGEgZmVhdHVyZSB0aGF0IG92ZXJsYXBzIHRoZSBvdGhlciBmZWF0dXJlcy5cbiAgICAgICAgLy8gICAgICBUaGUgZmVhdHVyZSBpbiBleHRydXNpb25fbGF5ZXJfYSBpcyBjbG9zZXIgdGhhbiB0aGUgZmVhdHVyZSBpbiBleHRydXNpb25fbGF5ZXJfYiBzbyBpdCBpcyByZW5kZXJlZCBhYm92ZS5cbiAgICAgICAgLy8gICAgICBUaGUgZmVhdHVyZSBpbiBsaW5lX2xheWVyIGlzIHJlbmRlcmVkIGFib3ZlIGV4dHJ1c2lvbl9sYXllcl9hLlxuICAgICAgICAvLyAgICAgIFRoaXMgbWVhbnMgdGhhdCB0aGF0IHRoZSBsaW5lX2xheWVyIGZlYXR1cmUgaXMgYWJvdmUgdGhlIGV4dHJ1c2lvbl9sYXllcl9iIGZlYXR1cmUgZGVzcGl0ZVxuICAgICAgICAvLyAgICAgIGl0IGJlaW5nIGluIGFuIGVhcmxpZXIgbGF5ZXIuXG5cbiAgICAgICAgY29uc3QgaXNMYXllcjNEID0gbGF5ZXJJZCA9PiB0aGlzLl9sYXllcnNbbGF5ZXJJZF0udHlwZSA9PT0gJ2ZpbGwtZXh0cnVzaW9uJztcblxuICAgICAgICBjb25zdCBsYXllckluZGV4ID0ge307XG4gICAgICAgIGNvbnN0IGZlYXR1cmVzM0QgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgbCA9IHRoaXMuX29yZGVyLmxlbmd0aCAtIDE7IGwgPj0gMDsgbC0tKSB7XG4gICAgICAgICAgICBjb25zdCBsYXllcklkID0gdGhpcy5fb3JkZXJbbF07XG4gICAgICAgICAgICBpZiAoaXNMYXllcjNEKGxheWVySWQpKSB7XG4gICAgICAgICAgICAgICAgbGF5ZXJJbmRleFtsYXllcklkXSA9IGw7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBzb3VyY2VSZXN1bHQgb2Ygc291cmNlUmVzdWx0cykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXllckZlYXR1cmVzID0gc291cmNlUmVzdWx0W2xheWVySWRdO1xuICAgICAgICAgICAgICAgICAgICBpZiAobGF5ZXJGZWF0dXJlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBmZWF0dXJlV3JhcHBlciBvZiBsYXllckZlYXR1cmVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZXMzRC5wdXNoKGZlYXR1cmVXcmFwcGVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZlYXR1cmVzM0Quc29ydCgoYSwgYikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGIuaW50ZXJzZWN0aW9uWiAtIGEuaW50ZXJzZWN0aW9uWjtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgZmVhdHVyZXMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgbCA9IHRoaXMuX29yZGVyLmxlbmd0aCAtIDE7IGwgPj0gMDsgbC0tKSB7XG4gICAgICAgICAgICBjb25zdCBsYXllcklkID0gdGhpcy5fb3JkZXJbbF07XG5cbiAgICAgICAgICAgIGlmIChpc0xheWVyM0QobGF5ZXJJZCkpIHtcbiAgICAgICAgICAgICAgICAvLyBhZGQgYWxsIDNEIGZlYXR1cmVzIHRoYXQgYXJlIGluIG9yIGFib3ZlIHRoZSBjdXJyZW50IGxheWVyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IGZlYXR1cmVzM0QubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdG9wbW9zdDNEID0gZmVhdHVyZXMzRFtpXS5mZWF0dXJlO1xuICAgICAgICAgICAgICAgICAgICBpZiAobGF5ZXJJbmRleFt0b3Btb3N0M0QubGF5ZXIuaWRdIDwgbCkgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGZlYXR1cmVzLnB1c2godG9wbW9zdDNEKTtcbiAgICAgICAgICAgICAgICAgICAgZmVhdHVyZXMzRC5wb3AoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc291cmNlUmVzdWx0IG9mIHNvdXJjZVJlc3VsdHMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGF5ZXJGZWF0dXJlcyA9IHNvdXJjZVJlc3VsdFtsYXllcklkXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxheWVyRmVhdHVyZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZmVhdHVyZVdyYXBwZXIgb2YgbGF5ZXJGZWF0dXJlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVzLnB1c2goZmVhdHVyZVdyYXBwZXIuZmVhdHVyZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmVhdHVyZXM7XG4gICAgfVxuXG4gICAgcXVlcnlSZW5kZXJlZEZlYXR1cmVzKHF1ZXJ5R2VvbWV0cnk6IGFueSwgcGFyYW1zOiBhbnksIHRyYW5zZm9ybTogVHJhbnNmb3JtKSB7XG4gICAgICAgIGlmIChwYXJhbXMgJiYgcGFyYW1zLmZpbHRlcikge1xuICAgICAgICAgICAgdGhpcy5fdmFsaWRhdGUodmFsaWRhdGVTdHlsZS5maWx0ZXIsICdxdWVyeVJlbmRlcmVkRmVhdHVyZXMuZmlsdGVyJywgcGFyYW1zLmZpbHRlcik7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpbmNsdWRlZFNvdXJjZXMgPSB7fTtcbiAgICAgICAgaWYgKHBhcmFtcyAmJiBwYXJhbXMubGF5ZXJzKSB7XG4gICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkocGFyYW1zLmxheWVycykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpcmUobmV3IEVycm9yRXZlbnQobmV3IEVycm9yKCdwYXJhbWV0ZXJzLmxheWVycyBtdXN0IGJlIGFuIEFycmF5LicpKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChjb25zdCBsYXllcklkIG9mIHBhcmFtcy5sYXllcnMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsYXllciA9IHRoaXMuX2xheWVyc1tsYXllcklkXTtcbiAgICAgICAgICAgICAgICBpZiAoIWxheWVyKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgbGF5ZXIgaXMgbm90IGluIHRoZSBzdHlsZS5sYXllcnMgYXJyYXlcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFcnJvckV2ZW50KG5ldyBFcnJvcihgVGhlIGxheWVyICcke2xheWVySWR9JyBkb2VzIG5vdCBleGlzdCBpbiB0aGUgbWFwJ3Mgc3R5bGUgYW5kIGNhbm5vdCBiZSBxdWVyaWVkIGZvciBmZWF0dXJlcy5gKSkpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGluY2x1ZGVkU291cmNlc1tsYXllci5zb3VyY2VdID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNvdXJjZVJlc3VsdHMgPSBbXTtcblxuICAgICAgICBmb3IgKGNvbnN0IGlkIGluIHRoaXMuc291cmNlQ2FjaGVzKSB7XG4gICAgICAgICAgICBpZiAocGFyYW1zLmxheWVycyAmJiAhaW5jbHVkZWRTb3VyY2VzW2lkXSkgY29udGludWU7XG4gICAgICAgICAgICBzb3VyY2VSZXN1bHRzLnB1c2goXG4gICAgICAgICAgICAgICAgcXVlcnlSZW5kZXJlZEZlYXR1cmVzKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNvdXJjZUNhY2hlc1tpZF0sXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2xheWVycyxcbiAgICAgICAgICAgICAgICAgICAgcXVlcnlHZW9tZXRyeSxcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zLFxuICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm0pXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMucGxhY2VtZW50KSB7XG4gICAgICAgICAgICAvLyBJZiBhIHBsYWNlbWVudCBoYXMgcnVuLCBxdWVyeSBhZ2FpbnN0IGl0cyBDb2xsaXNpb25JbmRleFxuICAgICAgICAgICAgLy8gZm9yIHN5bWJvbCByZXN1bHRzLCBhbmQgdHJlYXQgaXQgYXMgYW4gZXh0cmEgc291cmNlIHRvIG1lcmdlXG4gICAgICAgICAgICBzb3VyY2VSZXN1bHRzLnB1c2goXG4gICAgICAgICAgICAgICAgcXVlcnlSZW5kZXJlZFN5bWJvbHMoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2xheWVycyxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zb3VyY2VDYWNoZXMsXG4gICAgICAgICAgICAgICAgICAgIHF1ZXJ5R2VvbWV0cnksXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtcyxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbGFjZW1lbnQuY29sbGlzaW9uSW5kZXgsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGxhY2VtZW50LnJldGFpbmVkUXVlcnlEYXRhKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLl9mbGF0dGVuQW5kU29ydFJlbmRlcmVkRmVhdHVyZXMoc291cmNlUmVzdWx0cyk7XG4gICAgfVxuXG4gICAgcXVlcnlTb3VyY2VGZWF0dXJlcyhzb3VyY2VJRDogc3RyaW5nLCBwYXJhbXM6ID97c291cmNlTGF5ZXI6ID9zdHJpbmcsIGZpbHRlcjogP0FycmF5PGFueT59KSB7XG4gICAgICAgIGlmIChwYXJhbXMgJiYgcGFyYW1zLmZpbHRlcikge1xuICAgICAgICAgICAgdGhpcy5fdmFsaWRhdGUodmFsaWRhdGVTdHlsZS5maWx0ZXIsICdxdWVyeVNvdXJjZUZlYXR1cmVzLmZpbHRlcicsIHBhcmFtcy5maWx0ZXIpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNvdXJjZUNhY2hlID0gdGhpcy5zb3VyY2VDYWNoZXNbc291cmNlSURdO1xuICAgICAgICByZXR1cm4gc291cmNlQ2FjaGUgPyBxdWVyeVNvdXJjZUZlYXR1cmVzKHNvdXJjZUNhY2hlLCBwYXJhbXMpIDogW107XG4gICAgfVxuXG4gICAgYWRkU291cmNlVHlwZShuYW1lOiBzdHJpbmcsIFNvdXJjZVR5cGU6IFNvdXJjZUNsYXNzLCBjYWxsYmFjazogQ2FsbGJhY2s8dm9pZD4pIHtcbiAgICAgICAgaWYgKFN0eWxlLmdldFNvdXJjZVR5cGUobmFtZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhuZXcgRXJyb3IoYEEgc291cmNlIHR5cGUgY2FsbGVkIFwiJHtuYW1lfVwiIGFscmVhZHkgZXhpc3RzLmApKTtcbiAgICAgICAgfVxuXG4gICAgICAgIFN0eWxlLnNldFNvdXJjZVR5cGUobmFtZSwgU291cmNlVHlwZSk7XG5cbiAgICAgICAgaWYgKCFTb3VyY2VUeXBlLndvcmtlclNvdXJjZVVSTCkge1xuICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwsIG51bGwpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5kaXNwYXRjaGVyLmJyb2FkY2FzdCgnbG9hZFdvcmtlclNvdXJjZScsIHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICB1cmw6IFNvdXJjZVR5cGUud29ya2VyU291cmNlVVJMXG4gICAgICAgIH0sIGNhbGxiYWNrKTtcbiAgICB9XG5cbiAgICBnZXRMaWdodCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGlnaHQuZ2V0TGlnaHQoKTtcbiAgICB9XG5cbiAgICBzZXRMaWdodChsaWdodE9wdGlvbnM6IExpZ2h0U3BlY2lmaWNhdGlvbiwgb3B0aW9uczogU3R5bGVTZXR0ZXJPcHRpb25zID0ge30pIHtcbiAgICAgICAgdGhpcy5fY2hlY2tMb2FkZWQoKTtcblxuICAgICAgICBjb25zdCBsaWdodCA9IHRoaXMubGlnaHQuZ2V0TGlnaHQoKTtcbiAgICAgICAgbGV0IF91cGRhdGUgPSBmYWxzZTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gbGlnaHRPcHRpb25zKSB7XG4gICAgICAgICAgICBpZiAoIWRlZXBFcXVhbChsaWdodE9wdGlvbnNba2V5XSwgbGlnaHRba2V5XSkpIHtcbiAgICAgICAgICAgICAgICBfdXBkYXRlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIV91cGRhdGUpIHJldHVybjtcblxuICAgICAgICBjb25zdCBwYXJhbWV0ZXJzID0ge1xuICAgICAgICAgICAgbm93OiBicm93c2VyLm5vdygpLFxuICAgICAgICAgICAgdHJhbnNpdGlvbjogZXh0ZW5kKHtcbiAgICAgICAgICAgICAgICBkdXJhdGlvbjogMzAwLFxuICAgICAgICAgICAgICAgIGRlbGF5OiAwXG4gICAgICAgICAgICB9LCB0aGlzLnN0eWxlc2hlZXQudHJhbnNpdGlvbilcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLmxpZ2h0LnNldExpZ2h0KGxpZ2h0T3B0aW9ucywgb3B0aW9ucyk7XG4gICAgICAgIHRoaXMubGlnaHQudXBkYXRlVHJhbnNpdGlvbnMocGFyYW1ldGVycyk7XG4gICAgfVxuXG4gICAgX3ZhbGlkYXRlKHZhbGlkYXRlOiAoe30pID0+IHZvaWQsIGtleTogc3RyaW5nLCB2YWx1ZTogYW55LCBwcm9wczogYW55LCBvcHRpb25zOiBTdHlsZVNldHRlck9wdGlvbnMgPSB7fSkge1xuICAgICAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLnZhbGlkYXRlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbWl0VmFsaWRhdGlvbkVycm9ycyh0aGlzLCB2YWxpZGF0ZS5jYWxsKHZhbGlkYXRlU3R5bGUsIGV4dGVuZCh7XG4gICAgICAgICAgICBrZXksXG4gICAgICAgICAgICBzdHlsZTogdGhpcy5zZXJpYWxpemUoKSxcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgc3R5bGVTcGVjXG4gICAgICAgIH0sIHByb3BzKSkpO1xuICAgIH1cblxuICAgIF9yZW1vdmUoKSB7XG4gICAgICAgIGlmICh0aGlzLl9yZXF1ZXN0KSB7XG4gICAgICAgICAgICB0aGlzLl9yZXF1ZXN0LmNhbmNlbCgpO1xuICAgICAgICAgICAgdGhpcy5fcmVxdWVzdCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX3Nwcml0ZVJlcXVlc3QpIHtcbiAgICAgICAgICAgIHRoaXMuX3Nwcml0ZVJlcXVlc3QuY2FuY2VsKCk7XG4gICAgICAgICAgICB0aGlzLl9zcHJpdGVSZXF1ZXN0ID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBydGxUZXh0UGx1Z2luRXZlbnRlZC5vZmYoJ3BsdWdpbkF2YWlsYWJsZScsIHRoaXMuX3J0bFRleHRQbHVnaW5DYWxsYmFjayk7XG4gICAgICAgIGZvciAoY29uc3QgaWQgaW4gdGhpcy5zb3VyY2VDYWNoZXMpIHtcbiAgICAgICAgICAgIHRoaXMuc291cmNlQ2FjaGVzW2lkXS5jbGVhclRpbGVzKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kaXNwYXRjaGVyLnJlbW92ZSgpO1xuICAgIH1cblxuICAgIF9jbGVhclNvdXJjZShpZDogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuc291cmNlQ2FjaGVzW2lkXS5jbGVhclRpbGVzKCk7XG4gICAgfVxuXG4gICAgX3JlbG9hZFNvdXJjZShpZDogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuc291cmNlQ2FjaGVzW2lkXS5yZXN1bWUoKTtcbiAgICAgICAgdGhpcy5zb3VyY2VDYWNoZXNbaWRdLnJlbG9hZCgpO1xuICAgIH1cblxuICAgIF91cGRhdGVTb3VyY2VzKHRyYW5zZm9ybTogVHJhbnNmb3JtKSB7XG4gICAgICAgIGZvciAoY29uc3QgaWQgaW4gdGhpcy5zb3VyY2VDYWNoZXMpIHtcbiAgICAgICAgICAgIHRoaXMuc291cmNlQ2FjaGVzW2lkXS51cGRhdGUodHJhbnNmb3JtKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9nZW5lcmF0ZUNvbGxpc2lvbkJveGVzKCkge1xuICAgICAgICBmb3IgKGNvbnN0IGlkIGluIHRoaXMuc291cmNlQ2FjaGVzKSB7XG4gICAgICAgICAgICB0aGlzLl9yZWxvYWRTb3VyY2UoaWQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX3VwZGF0ZVBsYWNlbWVudCh0cmFuc2Zvcm06IFRyYW5zZm9ybSwgc2hvd0NvbGxpc2lvbkJveGVzOiBib29sZWFuLCBmYWRlRHVyYXRpb246IG51bWJlciwgY3Jvc3NTb3VyY2VDb2xsaXNpb25zOiBib29sZWFuKSB7XG4gICAgICAgIGxldCBzeW1ib2xCdWNrZXRzQ2hhbmdlZCA9IGZhbHNlO1xuICAgICAgICBsZXQgcGxhY2VtZW50Q29tbWl0dGVkID0gZmFsc2U7XG5cbiAgICAgICAgY29uc3QgbGF5ZXJUaWxlcyA9IHt9O1xuXG4gICAgICAgIGZvciAoY29uc3QgbGF5ZXJJRCBvZiB0aGlzLl9vcmRlcikge1xuICAgICAgICAgICAgY29uc3Qgc3R5bGVMYXllciA9IHRoaXMuX2xheWVyc1tsYXllcklEXTtcbiAgICAgICAgICAgIGlmIChzdHlsZUxheWVyLnR5cGUgIT09ICdzeW1ib2wnKSBjb250aW51ZTtcblxuICAgICAgICAgICAgaWYgKCFsYXllclRpbGVzW3N0eWxlTGF5ZXIuc291cmNlXSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZUNhY2hlID0gdGhpcy5zb3VyY2VDYWNoZXNbc3R5bGVMYXllci5zb3VyY2VdO1xuICAgICAgICAgICAgICAgIGxheWVyVGlsZXNbc3R5bGVMYXllci5zb3VyY2VdID0gc291cmNlQ2FjaGUuZ2V0UmVuZGVyYWJsZUlkcyh0cnVlKVxuICAgICAgICAgICAgICAgICAgICAubWFwKChpZCkgPT4gc291cmNlQ2FjaGUuZ2V0VGlsZUJ5SUQoaWQpKVxuICAgICAgICAgICAgICAgICAgICAuc29ydCgoYSwgYikgPT4gKGIudGlsZUlELm92ZXJzY2FsZWRaIC0gYS50aWxlSUQub3ZlcnNjYWxlZFopIHx8IChhLnRpbGVJRC5pc0xlc3NUaGFuKGIudGlsZUlEKSA/IC0xIDogMSkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsYXllckJ1Y2tldHNDaGFuZ2VkID0gdGhpcy5jcm9zc1RpbGVTeW1ib2xJbmRleC5hZGRMYXllcihzdHlsZUxheWVyLCBsYXllclRpbGVzW3N0eWxlTGF5ZXIuc291cmNlXSwgdHJhbnNmb3JtLmNlbnRlci5sbmcpO1xuICAgICAgICAgICAgc3ltYm9sQnVja2V0c0NoYW5nZWQgPSBzeW1ib2xCdWNrZXRzQ2hhbmdlZCB8fCBsYXllckJ1Y2tldHNDaGFuZ2VkO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY3Jvc3NUaWxlU3ltYm9sSW5kZXgucHJ1bmVVbnVzZWRMYXllcnModGhpcy5fb3JkZXIpO1xuXG4gICAgICAgIC8vIEFueXRoaW5nIHRoYXQgY2hhbmdlcyBvdXIgXCJpbiBwcm9ncmVzc1wiIGxheWVyIGFuZCB0aWxlIGluZGljZXMgcmVxdWlyZXMgdXNcbiAgICAgICAgLy8gdG8gc3RhcnQgb3Zlci4gV2hlbiB3ZSBzdGFydCBvdmVyLCB3ZSBkbyBhIGZ1bGwgcGxhY2VtZW50IGluc3RlYWQgb2YgaW5jcmVtZW50YWxcbiAgICAgICAgLy8gdG8gcHJldmVudCBzdGFydmF0aW9uLlxuICAgICAgICAvLyBXZSBuZWVkIHRvIHJlc3RhcnQgcGxhY2VtZW50IHRvIGtlZXAgbGF5ZXIgaW5kaWNlcyBpbiBzeW5jLlxuICAgICAgICAvLyBBbHNvIGZvcmNlIGZ1bGwgcGxhY2VtZW50IHdoZW4gZmFkZUR1cmF0aW9uID09PSAwIHRvIGVuc3VyZSB0aGF0IG5ld2x5IGxvYWRlZFxuICAgICAgICAvLyB0aWxlcyB3aWxsIGZ1bGx5IGRpc3BsYXkgc3ltYm9scyBpbiB0aGVpciBmaXJzdCBmcmFtZVxuICAgICAgICBjb25zdCBmb3JjZUZ1bGxQbGFjZW1lbnQgPSB0aGlzLl9sYXllck9yZGVyQ2hhbmdlZCB8fCBmYWRlRHVyYXRpb24gPT09IDA7XG5cbiAgICAgICAgaWYgKGZvcmNlRnVsbFBsYWNlbWVudCB8fCAhdGhpcy5wYXVzZWFibGVQbGFjZW1lbnQgfHwgKHRoaXMucGF1c2VhYmxlUGxhY2VtZW50LmlzRG9uZSgpICYmICF0aGlzLnBsYWNlbWVudC5zdGlsbFJlY2VudChicm93c2VyLm5vdygpKSkpIHtcbiAgICAgICAgICAgIHRoaXMucGF1c2VhYmxlUGxhY2VtZW50ID0gbmV3IFBhdXNlYWJsZVBsYWNlbWVudCh0cmFuc2Zvcm0sIHRoaXMuX29yZGVyLCBmb3JjZUZ1bGxQbGFjZW1lbnQsIHNob3dDb2xsaXNpb25Cb3hlcywgZmFkZUR1cmF0aW9uLCBjcm9zc1NvdXJjZUNvbGxpc2lvbnMsIHRoaXMucGxhY2VtZW50KTtcbiAgICAgICAgICAgIHRoaXMuX2xheWVyT3JkZXJDaGFuZ2VkID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5wYXVzZWFibGVQbGFjZW1lbnQuaXNEb25lKCkpIHtcbiAgICAgICAgICAgIC8vIHRoZSBsYXN0IHBsYWNlbWVudCBmaW5pc2hlZCBydW5uaW5nLCBidXQgdGhlIG5leHQgb25lIGhhc27DosKAwpl0XG4gICAgICAgICAgICAvLyBzdGFydGVkIHlldCBiZWNhdXNlIG9mIHRoZSBgc3RpbGxSZWNlbnRgIGNoZWNrIGltbWVkaWF0ZWx5XG4gICAgICAgICAgICAvLyBhYm92ZSwgc28gbWFyayBpdCBzdGFsZSB0byBlbnN1cmUgdGhhdCB3ZSByZXF1ZXN0IGFub3RoZXJcbiAgICAgICAgICAgIC8vIHJlbmRlciBmcmFtZVxuICAgICAgICAgICAgdGhpcy5wbGFjZW1lbnQuc2V0U3RhbGUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucGF1c2VhYmxlUGxhY2VtZW50LmNvbnRpbnVlUGxhY2VtZW50KHRoaXMuX29yZGVyLCB0aGlzLl9sYXllcnMsIGxheWVyVGlsZXMpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5wYXVzZWFibGVQbGFjZW1lbnQuaXNEb25lKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBsYWNlbWVudCA9IHRoaXMucGF1c2VhYmxlUGxhY2VtZW50LmNvbW1pdChicm93c2VyLm5vdygpKTtcbiAgICAgICAgICAgICAgICBwbGFjZW1lbnRDb21taXR0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoc3ltYm9sQnVja2V0c0NoYW5nZWQpIHtcbiAgICAgICAgICAgICAgICAvLyBzaW5jZSB0aGUgcGxhY2VtZW50IGdldHMgc3BsaXQgb3ZlciBtdWx0aXBsZSBmcmFtZXMgaXQgaXMgcG9zc2libGVcbiAgICAgICAgICAgICAgICAvLyB0aGVzZSBidWNrZXRzIHdlcmUgcHJvY2Vzc2VkIGJlZm9yZSB0aGV5IHdlcmUgY2hhbmdlZCBhbmQgc28gdGhlXG4gICAgICAgICAgICAgICAgLy8gcGxhY2VtZW50IGlzIGFscmVhZHkgc3RhbGUgd2hpbGUgaXQgaXMgaW4gcHJvZ3Jlc3NcbiAgICAgICAgICAgICAgICB0aGlzLnBhdXNlYWJsZVBsYWNlbWVudC5wbGFjZW1lbnQuc2V0U3RhbGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwbGFjZW1lbnRDb21taXR0ZWQgfHwgc3ltYm9sQnVja2V0c0NoYW5nZWQpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgbGF5ZXJJRCBvZiB0aGlzLl9vcmRlcikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0eWxlTGF5ZXIgPSB0aGlzLl9sYXllcnNbbGF5ZXJJRF07XG4gICAgICAgICAgICAgICAgaWYgKHN0eWxlTGF5ZXIudHlwZSAhPT0gJ3N5bWJvbCcpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIHRoaXMucGxhY2VtZW50LnVwZGF0ZUxheWVyT3BhY2l0aWVzKHN0eWxlTGF5ZXIsIGxheWVyVGlsZXNbc3R5bGVMYXllci5zb3VyY2VdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIG5lZWRzUmVuZGVyIGlzIGZhbHNlIHdoZW4gd2UgaGF2ZSBqdXN0IGZpbmlzaGVkIGEgcGxhY2VtZW50IHRoYXQgZGlkbid0IGNoYW5nZSB0aGUgdmlzaWJpbGl0eSBvZiBhbnkgc3ltYm9sc1xuICAgICAgICBjb25zdCBuZWVkc1JlcmVuZGVyID0gIXRoaXMucGF1c2VhYmxlUGxhY2VtZW50LmlzRG9uZSgpIHx8IHRoaXMucGxhY2VtZW50Lmhhc1RyYW5zaXRpb25zKGJyb3dzZXIubm93KCkpO1xuICAgICAgICByZXR1cm4gbmVlZHNSZXJlbmRlcjtcbiAgICB9XG5cbiAgICBfcmVsZWFzZVN5bWJvbEZhZGVUaWxlcygpIHtcbiAgICAgICAgZm9yIChjb25zdCBpZCBpbiB0aGlzLnNvdXJjZUNhY2hlcykge1xuICAgICAgICAgICAgdGhpcy5zb3VyY2VDYWNoZXNbaWRdLnJlbGVhc2VTeW1ib2xGYWRlVGlsZXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIENhbGxiYWNrcyBmcm9tIHdlYiB3b3JrZXJzXG5cbiAgICBnZXRJbWFnZXMobWFwSWQ6IHN0cmluZywgcGFyYW1zOiB7aWNvbnM6IEFycmF5PHN0cmluZz59LCBjYWxsYmFjazogQ2FsbGJhY2s8e1tzdHJpbmddOiBTdHlsZUltYWdlfT4pIHtcbiAgICAgICAgdGhpcy5pbWFnZU1hbmFnZXIuZ2V0SW1hZ2VzKHBhcmFtcy5pY29ucywgY2FsbGJhY2spO1xuICAgIH1cblxuICAgIGdldEdseXBocyhtYXBJZDogc3RyaW5nLCBwYXJhbXM6IHtzdGFja3M6IHtbc3RyaW5nXTogQXJyYXk8bnVtYmVyPn19LCBjYWxsYmFjazogQ2FsbGJhY2s8e1tzdHJpbmddOiB7W251bWJlcl06ID9TdHlsZUdseXBofX0+KSB7XG4gICAgICAgIHRoaXMuZ2x5cGhNYW5hZ2VyLmdldEdseXBocyhwYXJhbXMuc3RhY2tzLCBjYWxsYmFjayk7XG4gICAgfVxuXG4gICAgZ2V0UmVzb3VyY2UobWFwSWQ6IHN0cmluZywgcGFyYW1zOiBSZXF1ZXN0UGFyYW1ldGVycywgY2FsbGJhY2s6IFJlc3BvbnNlQ2FsbGJhY2s8YW55Pik6IENhbmNlbGFibGUge1xuICAgICAgICByZXR1cm4gbWFrZVJlcXVlc3QocGFyYW1zLCBjYWxsYmFjayk7XG4gICAgfVxufVxuXG5TdHlsZS5nZXRTb3VyY2VUeXBlID0gZ2V0U291cmNlVHlwZTtcblN0eWxlLnNldFNvdXJjZVR5cGUgPSBzZXRTb3VyY2VUeXBlO1xuU3R5bGUucmVnaXN0ZXJGb3JQbHVnaW5BdmFpbGFiaWxpdHkgPSByZWdpc3RlckZvclBsdWdpbkF2YWlsYWJpbGl0eTtcblxuZXhwb3J0IGRlZmF1bHQgU3R5bGU7XG4iLCIvLyBAZmxvd1xuaW1wb3J0IHsgY3JlYXRlTGF5b3V0IH0gZnJvbSAnLi4vdXRpbC9zdHJ1Y3RfYXJyYXknO1xuXG5leHBvcnQgZGVmYXVsdCBjcmVhdGVMYXlvdXQoW1xuICAgIHsgbmFtZTogJ2FfcG9zJywgdHlwZTogJ0ludDE2JywgY29tcG9uZW50czogMiB9XG5dKTtcbiIsIlxuLy8gRGlzYWJsZSBGbG93IGFubm90YXRpb25zIGhlcmUgYmVjYXVzZSBGbG93IGRvZXNuJ3Qgc3VwcG9ydCBpbXBvcnRpbmcgR0xTTCBmaWxlc1xuLyogZXNsaW50LWRpc2FibGUgZmxvd3R5cGUvcmVxdWlyZS12YWxpZC1maWxlLWFubm90YXRpb24gKi9cblxuaW1wb3J0IHByZWx1ZGVGcmFnIGZyb20gJy4vX3ByZWx1ZGUuZnJhZ21lbnQuZ2xzbCc7XG5pbXBvcnQgcHJlbHVkZVZlcnQgZnJvbSAnLi9fcHJlbHVkZS52ZXJ0ZXguZ2xzbCc7XG5pbXBvcnQgYmFja2dyb3VuZEZyYWcgZnJvbSAnLi9iYWNrZ3JvdW5kLmZyYWdtZW50Lmdsc2wnO1xuaW1wb3J0IGJhY2tncm91bmRWZXJ0IGZyb20gJy4vYmFja2dyb3VuZC52ZXJ0ZXguZ2xzbCc7XG5pbXBvcnQgYmFja2dyb3VuZFBhdHRlcm5GcmFnIGZyb20gJy4vYmFja2dyb3VuZF9wYXR0ZXJuLmZyYWdtZW50Lmdsc2wnO1xuaW1wb3J0IGJhY2tncm91bmRQYXR0ZXJuVmVydCBmcm9tICcuL2JhY2tncm91bmRfcGF0dGVybi52ZXJ0ZXguZ2xzbCc7XG5pbXBvcnQgY2lyY2xlRnJhZyBmcm9tICcuL2NpcmNsZS5mcmFnbWVudC5nbHNsJztcbmltcG9ydCBjaXJjbGVWZXJ0IGZyb20gJy4vY2lyY2xlLnZlcnRleC5nbHNsJztcbmltcG9ydCBjbGlwcGluZ01hc2tGcmFnIGZyb20gJy4vY2xpcHBpbmdfbWFzay5mcmFnbWVudC5nbHNsJztcbmltcG9ydCBjbGlwcGluZ01hc2tWZXJ0IGZyb20gJy4vY2xpcHBpbmdfbWFzay52ZXJ0ZXguZ2xzbCc7XG5pbXBvcnQgaGVhdG1hcEZyYWcgZnJvbSAnLi9oZWF0bWFwLmZyYWdtZW50Lmdsc2wnO1xuaW1wb3J0IGhlYXRtYXBWZXJ0IGZyb20gJy4vaGVhdG1hcC52ZXJ0ZXguZ2xzbCc7XG5pbXBvcnQgaGVhdG1hcFRleHR1cmVGcmFnIGZyb20gJy4vaGVhdG1hcF90ZXh0dXJlLmZyYWdtZW50Lmdsc2wnO1xuaW1wb3J0IGhlYXRtYXBUZXh0dXJlVmVydCBmcm9tICcuL2hlYXRtYXBfdGV4dHVyZS52ZXJ0ZXguZ2xzbCc7XG5pbXBvcnQgY29sbGlzaW9uQm94RnJhZyBmcm9tICcuL2NvbGxpc2lvbl9ib3guZnJhZ21lbnQuZ2xzbCc7XG5pbXBvcnQgY29sbGlzaW9uQm94VmVydCBmcm9tICcuL2NvbGxpc2lvbl9ib3gudmVydGV4Lmdsc2wnO1xuaW1wb3J0IGNvbGxpc2lvbkNpcmNsZUZyYWcgZnJvbSAnLi9jb2xsaXNpb25fY2lyY2xlLmZyYWdtZW50Lmdsc2wnO1xuaW1wb3J0IGNvbGxpc2lvbkNpcmNsZVZlcnQgZnJvbSAnLi9jb2xsaXNpb25fY2lyY2xlLnZlcnRleC5nbHNsJztcbmltcG9ydCBkZWJ1Z0ZyYWcgZnJvbSAnLi9kZWJ1Zy5mcmFnbWVudC5nbHNsJztcbmltcG9ydCBkZWJ1Z1ZlcnQgZnJvbSAnLi9kZWJ1Zy52ZXJ0ZXguZ2xzbCc7XG5pbXBvcnQgZmlsbEZyYWcgZnJvbSAnLi9maWxsLmZyYWdtZW50Lmdsc2wnO1xuaW1wb3J0IGZpbGxWZXJ0IGZyb20gJy4vZmlsbC52ZXJ0ZXguZ2xzbCc7XG5pbXBvcnQgZmlsbE91dGxpbmVGcmFnIGZyb20gJy4vZmlsbF9vdXRsaW5lLmZyYWdtZW50Lmdsc2wnO1xuaW1wb3J0IGZpbGxPdXRsaW5lVmVydCBmcm9tICcuL2ZpbGxfb3V0bGluZS52ZXJ0ZXguZ2xzbCc7XG5pbXBvcnQgZmlsbE91dGxpbmVQYXR0ZXJuRnJhZyBmcm9tICcuL2ZpbGxfb3V0bGluZV9wYXR0ZXJuLmZyYWdtZW50Lmdsc2wnO1xuaW1wb3J0IGZpbGxPdXRsaW5lUGF0dGVyblZlcnQgZnJvbSAnLi9maWxsX291dGxpbmVfcGF0dGVybi52ZXJ0ZXguZ2xzbCc7XG5pbXBvcnQgZmlsbFBhdHRlcm5GcmFnIGZyb20gJy4vZmlsbF9wYXR0ZXJuLmZyYWdtZW50Lmdsc2wnO1xuaW1wb3J0IGZpbGxQYXR0ZXJuVmVydCBmcm9tICcuL2ZpbGxfcGF0dGVybi52ZXJ0ZXguZ2xzbCc7XG5pbXBvcnQgZmlsbEV4dHJ1c2lvbkZyYWcgZnJvbSAnLi9maWxsX2V4dHJ1c2lvbi5mcmFnbWVudC5nbHNsJztcbmltcG9ydCBmaWxsRXh0cnVzaW9uVmVydCBmcm9tICcuL2ZpbGxfZXh0cnVzaW9uLnZlcnRleC5nbHNsJztcbmltcG9ydCBmaWxsRXh0cnVzaW9uUGF0dGVybkZyYWcgZnJvbSAnLi9maWxsX2V4dHJ1c2lvbl9wYXR0ZXJuLmZyYWdtZW50Lmdsc2wnO1xuaW1wb3J0IGZpbGxFeHRydXNpb25QYXR0ZXJuVmVydCBmcm9tICcuL2ZpbGxfZXh0cnVzaW9uX3BhdHRlcm4udmVydGV4Lmdsc2wnO1xuaW1wb3J0IGhpbGxzaGFkZVByZXBhcmVGcmFnIGZyb20gJy4vaGlsbHNoYWRlX3ByZXBhcmUuZnJhZ21lbnQuZ2xzbCc7XG5pbXBvcnQgaGlsbHNoYWRlUHJlcGFyZVZlcnQgZnJvbSAnLi9oaWxsc2hhZGVfcHJlcGFyZS52ZXJ0ZXguZ2xzbCc7XG5pbXBvcnQgaGlsbHNoYWRlRnJhZyBmcm9tICcuL2hpbGxzaGFkZS5mcmFnbWVudC5nbHNsJztcbmltcG9ydCBoaWxsc2hhZGVWZXJ0IGZyb20gJy4vaGlsbHNoYWRlLnZlcnRleC5nbHNsJztcbmltcG9ydCBsaW5lRnJhZyBmcm9tICcuL2xpbmUuZnJhZ21lbnQuZ2xzbCc7XG5pbXBvcnQgbGluZVZlcnQgZnJvbSAnLi9saW5lLnZlcnRleC5nbHNsJztcbmltcG9ydCBsaW5lR3JhZGllbnRGcmFnIGZyb20gJy4vbGluZV9ncmFkaWVudC5mcmFnbWVudC5nbHNsJztcbmltcG9ydCBsaW5lR3JhZGllbnRWZXJ0IGZyb20gJy4vbGluZV9ncmFkaWVudC52ZXJ0ZXguZ2xzbCc7XG5pbXBvcnQgbGluZVBhdHRlcm5GcmFnIGZyb20gJy4vbGluZV9wYXR0ZXJuLmZyYWdtZW50Lmdsc2wnO1xuaW1wb3J0IGxpbmVQYXR0ZXJuVmVydCBmcm9tICcuL2xpbmVfcGF0dGVybi52ZXJ0ZXguZ2xzbCc7XG5pbXBvcnQgbGluZVNERkZyYWcgZnJvbSAnLi9saW5lX3NkZi5mcmFnbWVudC5nbHNsJztcbmltcG9ydCBsaW5lU0RGVmVydCBmcm9tICcuL2xpbmVfc2RmLnZlcnRleC5nbHNsJztcbmltcG9ydCByYXN0ZXJGcmFnIGZyb20gJy4vcmFzdGVyLmZyYWdtZW50Lmdsc2wnO1xuaW1wb3J0IHJhc3RlclZlcnQgZnJvbSAnLi9yYXN0ZXIudmVydGV4Lmdsc2wnO1xuaW1wb3J0IHN5bWJvbEljb25GcmFnIGZyb20gJy4vc3ltYm9sX2ljb24uZnJhZ21lbnQuZ2xzbCc7XG5pbXBvcnQgc3ltYm9sSWNvblZlcnQgZnJvbSAnLi9zeW1ib2xfaWNvbi52ZXJ0ZXguZ2xzbCc7XG5pbXBvcnQgc3ltYm9sU0RGRnJhZyBmcm9tICcuL3N5bWJvbF9zZGYuZnJhZ21lbnQuZ2xzbCc7XG5pbXBvcnQgc3ltYm9sU0RGVmVydCBmcm9tICcuL3N5bWJvbF9zZGYudmVydGV4Lmdsc2wnO1xuXG5leHBvcnQgY29uc3QgcHJlbHVkZSA9IGNvbXBpbGUocHJlbHVkZUZyYWcsIHByZWx1ZGVWZXJ0KTtcbmV4cG9ydCBjb25zdCBiYWNrZ3JvdW5kID0gY29tcGlsZShiYWNrZ3JvdW5kRnJhZywgYmFja2dyb3VuZFZlcnQpO1xuZXhwb3J0IGNvbnN0IGJhY2tncm91bmRQYXR0ZXJuID0gY29tcGlsZShiYWNrZ3JvdW5kUGF0dGVybkZyYWcsIGJhY2tncm91bmRQYXR0ZXJuVmVydCk7XG5leHBvcnQgY29uc3QgY2lyY2xlID0gY29tcGlsZShjaXJjbGVGcmFnLCBjaXJjbGVWZXJ0KTtcbmV4cG9ydCBjb25zdCBjbGlwcGluZ01hc2sgPSBjb21waWxlKGNsaXBwaW5nTWFza0ZyYWcsIGNsaXBwaW5nTWFza1ZlcnQpO1xuZXhwb3J0IGNvbnN0IGhlYXRtYXAgPSBjb21waWxlKGhlYXRtYXBGcmFnLCBoZWF0bWFwVmVydCk7XG5leHBvcnQgY29uc3QgaGVhdG1hcFRleHR1cmUgPSBjb21waWxlKGhlYXRtYXBUZXh0dXJlRnJhZywgaGVhdG1hcFRleHR1cmVWZXJ0KTtcbmV4cG9ydCBjb25zdCBjb2xsaXNpb25Cb3ggPSBjb21waWxlKGNvbGxpc2lvbkJveEZyYWcsIGNvbGxpc2lvbkJveFZlcnQpO1xuZXhwb3J0IGNvbnN0IGNvbGxpc2lvbkNpcmNsZSA9IGNvbXBpbGUoY29sbGlzaW9uQ2lyY2xlRnJhZywgY29sbGlzaW9uQ2lyY2xlVmVydCk7XG5leHBvcnQgY29uc3QgZGVidWcgPSBjb21waWxlKGRlYnVnRnJhZywgZGVidWdWZXJ0KTtcbmV4cG9ydCBjb25zdCBmaWxsID0gY29tcGlsZShmaWxsRnJhZywgZmlsbFZlcnQpO1xuZXhwb3J0IGNvbnN0IGZpbGxPdXRsaW5lID0gY29tcGlsZShmaWxsT3V0bGluZUZyYWcsIGZpbGxPdXRsaW5lVmVydCk7XG5leHBvcnQgY29uc3QgZmlsbE91dGxpbmVQYXR0ZXJuID0gY29tcGlsZShmaWxsT3V0bGluZVBhdHRlcm5GcmFnLCBmaWxsT3V0bGluZVBhdHRlcm5WZXJ0KTtcbmV4cG9ydCBjb25zdCBmaWxsUGF0dGVybiA9IGNvbXBpbGUoZmlsbFBhdHRlcm5GcmFnLCBmaWxsUGF0dGVyblZlcnQpO1xuZXhwb3J0IGNvbnN0IGZpbGxFeHRydXNpb24gPSBjb21waWxlKGZpbGxFeHRydXNpb25GcmFnLCBmaWxsRXh0cnVzaW9uVmVydCk7XG5leHBvcnQgY29uc3QgZmlsbEV4dHJ1c2lvblBhdHRlcm4gPSBjb21waWxlKGZpbGxFeHRydXNpb25QYXR0ZXJuRnJhZywgZmlsbEV4dHJ1c2lvblBhdHRlcm5WZXJ0KTtcbmV4cG9ydCBjb25zdCBoaWxsc2hhZGVQcmVwYXJlID0gY29tcGlsZShoaWxsc2hhZGVQcmVwYXJlRnJhZywgaGlsbHNoYWRlUHJlcGFyZVZlcnQpO1xuZXhwb3J0IGNvbnN0IGhpbGxzaGFkZSA9IGNvbXBpbGUoaGlsbHNoYWRlRnJhZywgaGlsbHNoYWRlVmVydCk7XG5leHBvcnQgY29uc3QgbGluZSA9IGNvbXBpbGUobGluZUZyYWcsIGxpbmVWZXJ0KTtcbmV4cG9ydCBjb25zdCBsaW5lR3JhZGllbnQgPSBjb21waWxlKGxpbmVHcmFkaWVudEZyYWcsIGxpbmVHcmFkaWVudFZlcnQpO1xuZXhwb3J0IGNvbnN0IGxpbmVQYXR0ZXJuID0gY29tcGlsZShsaW5lUGF0dGVybkZyYWcsIGxpbmVQYXR0ZXJuVmVydCk7XG5leHBvcnQgY29uc3QgbGluZVNERiA9IGNvbXBpbGUobGluZVNERkZyYWcsIGxpbmVTREZWZXJ0KTtcbmV4cG9ydCBjb25zdCByYXN0ZXIgPSBjb21waWxlKHJhc3RlckZyYWcsIHJhc3RlclZlcnQpO1xuZXhwb3J0IGNvbnN0IHN5bWJvbEljb24gPSBjb21waWxlKHN5bWJvbEljb25GcmFnLCBzeW1ib2xJY29uVmVydCk7XG5leHBvcnQgY29uc3Qgc3ltYm9sU0RGID0gY29tcGlsZShzeW1ib2xTREZGcmFnLCBzeW1ib2xTREZWZXJ0KTtcblxuLy8gRXhwYW5kICNwcmFnbWFzIHRvICNpZmRlZnMuXG5cbmZ1bmN0aW9uIGNvbXBpbGUoZnJhZ21lbnRTb3VyY2UsIHZlcnRleFNvdXJjZSkge1xuICAgIGNvbnN0IHJlID0gLyNwcmFnbWEgbWFwYm94OiAoW1xcd10rKSAoW1xcd10rKSAoW1xcd10rKSAoW1xcd10rKS9nO1xuXG4gICAgY29uc3QgZnJhZ21lbnRQcmFnbWFzID0ge307XG5cbiAgICBmcmFnbWVudFNvdXJjZSA9IGZyYWdtZW50U291cmNlLnJlcGxhY2UocmUsIChtYXRjaCwgb3BlcmF0aW9uLCBwcmVjaXNpb24sIHR5cGUsIG5hbWUpID0+IHtcbiAgICAgICAgZnJhZ21lbnRQcmFnbWFzW25hbWVdID0gdHJ1ZTtcbiAgICAgICAgaWYgKG9wZXJhdGlvbiA9PT0gJ2RlZmluZScpIHtcbiAgICAgICAgICAgIHJldHVybiBgXG4jaWZuZGVmIEhBU19VTklGT1JNX3VfJHtuYW1lfVxudmFyeWluZyAke3ByZWNpc2lvbn0gJHt0eXBlfSAke25hbWV9O1xuI2Vsc2VcbnVuaWZvcm0gJHtwcmVjaXNpb259ICR7dHlwZX0gdV8ke25hbWV9O1xuI2VuZGlmXG5gO1xuICAgICAgICB9IGVsc2UgLyogaWYgKG9wZXJhdGlvbiA9PT0gJ2luaXRpYWxpemUnKSAqLyB7XG4gICAgICAgICAgICByZXR1cm4gYFxuI2lmZGVmIEhBU19VTklGT1JNX3VfJHtuYW1lfVxuICAgICR7cHJlY2lzaW9ufSAke3R5cGV9ICR7bmFtZX0gPSB1XyR7bmFtZX07XG4jZW5kaWZcbmA7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHZlcnRleFNvdXJjZSA9IHZlcnRleFNvdXJjZS5yZXBsYWNlKHJlLCAobWF0Y2gsIG9wZXJhdGlvbiwgcHJlY2lzaW9uLCB0eXBlLCBuYW1lKSA9PiB7XG4gICAgICAgIGNvbnN0IGF0dHJUeXBlID0gdHlwZSA9PT0gJ2Zsb2F0JyA/ICd2ZWMyJyA6ICd2ZWM0JztcbiAgICAgICAgY29uc3QgdW5wYWNrVHlwZSA9IG5hbWUubWF0Y2goL2NvbG9yLykgPyAnY29sb3InIDogYXR0clR5cGU7XG5cbiAgICAgICAgaWYgKGZyYWdtZW50UHJhZ21hc1tuYW1lXSkge1xuICAgICAgICAgICAgaWYgKG9wZXJhdGlvbiA9PT0gJ2RlZmluZScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYFxuI2lmbmRlZiBIQVNfVU5JRk9STV91XyR7bmFtZX1cbnVuaWZvcm0gbG93cCBmbG9hdCBhXyR7bmFtZX1fdDtcbmF0dHJpYnV0ZSAke3ByZWNpc2lvbn0gJHthdHRyVHlwZX0gYV8ke25hbWV9O1xudmFyeWluZyAke3ByZWNpc2lvbn0gJHt0eXBlfSAke25hbWV9O1xuI2Vsc2VcbnVuaWZvcm0gJHtwcmVjaXNpb259ICR7dHlwZX0gdV8ke25hbWV9O1xuI2VuZGlmXG5gO1xuICAgICAgICAgICAgfSBlbHNlIC8qIGlmIChvcGVyYXRpb24gPT09ICdpbml0aWFsaXplJykgKi8ge1xuICAgICAgICAgICAgICAgIGlmICh1bnBhY2tUeXBlID09PSAndmVjNCcpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gdmVjNCBhdHRyaWJ1dGVzIGFyZSBvbmx5IHVzZWQgZm9yIGNyb3NzLWZhZGVkIHByb3BlcnRpZXMsIGFuZCBhcmUgbm90IHBhY2tlZFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYFxuI2lmbmRlZiBIQVNfVU5JRk9STV91XyR7bmFtZX1cbiAgICAke25hbWV9ID0gYV8ke25hbWV9O1xuI2Vsc2VcbiAgICAke3ByZWNpc2lvbn0gJHt0eXBlfSAke25hbWV9ID0gdV8ke25hbWV9O1xuI2VuZGlmXG5gO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgXG4jaWZuZGVmIEhBU19VTklGT1JNX3VfJHtuYW1lfVxuICAgICR7bmFtZX0gPSB1bnBhY2tfbWl4XyR7dW5wYWNrVHlwZX0oYV8ke25hbWV9LCBhXyR7bmFtZX1fdCk7XG4jZWxzZVxuICAgICR7cHJlY2lzaW9ufSAke3R5cGV9ICR7bmFtZX0gPSB1XyR7bmFtZX07XG4jZW5kaWZcbmA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKG9wZXJhdGlvbiA9PT0gJ2RlZmluZScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYFxuI2lmbmRlZiBIQVNfVU5JRk9STV91XyR7bmFtZX1cbnVuaWZvcm0gbG93cCBmbG9hdCBhXyR7bmFtZX1fdDtcbmF0dHJpYnV0ZSAke3ByZWNpc2lvbn0gJHthdHRyVHlwZX0gYV8ke25hbWV9O1xuI2Vsc2VcbnVuaWZvcm0gJHtwcmVjaXNpb259ICR7dHlwZX0gdV8ke25hbWV9O1xuI2VuZGlmXG5gO1xuICAgICAgICAgICAgfSBlbHNlIC8qIGlmIChvcGVyYXRpb24gPT09ICdpbml0aWFsaXplJykgKi8ge1xuICAgICAgICAgICAgICAgIGlmICh1bnBhY2tUeXBlID09PSAndmVjNCcpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gdmVjNCBhdHRyaWJ1dGVzIGFyZSBvbmx5IHVzZWQgZm9yIGNyb3NzLWZhZGVkIHByb3BlcnRpZXMsIGFuZCBhcmUgbm90IHBhY2tlZFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYFxuI2lmbmRlZiBIQVNfVU5JRk9STV91XyR7bmFtZX1cbiAgICAke3ByZWNpc2lvbn0gJHt0eXBlfSAke25hbWV9ID0gYV8ke25hbWV9O1xuI2Vsc2VcbiAgICAke3ByZWNpc2lvbn0gJHt0eXBlfSAke25hbWV9ID0gdV8ke25hbWV9O1xuI2VuZGlmXG5gO1xuICAgICAgICAgICAgICAgIH0gZWxzZSAvKiAqL3tcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGBcbiNpZm5kZWYgSEFTX1VOSUZPUk1fdV8ke25hbWV9XG4gICAgJHtwcmVjaXNpb259ICR7dHlwZX0gJHtuYW1lfSA9IHVucGFja19taXhfJHt1bnBhY2tUeXBlfShhXyR7bmFtZX0sIGFfJHtuYW1lfV90KTtcbiNlbHNlXG4gICAgJHtwcmVjaXNpb259ICR7dHlwZX0gJHtuYW1lfSA9IHVfJHtuYW1lfTtcbiNlbmRpZlxuYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiB7ZnJhZ21lbnRTb3VyY2UsIHZlcnRleFNvdXJjZX07XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5cbmltcG9ydCB0eXBlIFByb2dyYW0gZnJvbSAnLi9wcm9ncmFtJztcbmltcG9ydCB0eXBlIFZlcnRleEJ1ZmZlciBmcm9tICcuLi9nbC92ZXJ0ZXhfYnVmZmVyJztcbmltcG9ydCB0eXBlIEluZGV4QnVmZmVyIGZyb20gJy4uL2dsL2luZGV4X2J1ZmZlcic7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gJy4uL2dsL2NvbnRleHQnO1xuXG5jbGFzcyBWZXJ0ZXhBcnJheU9iamVjdCB7XG4gICAgY29udGV4dDogQ29udGV4dDtcbiAgICBib3VuZFByb2dyYW06ID9Qcm9ncmFtPCo+O1xuICAgIGJvdW5kTGF5b3V0VmVydGV4QnVmZmVyOiA/VmVydGV4QnVmZmVyO1xuICAgIGJvdW5kUGFpbnRWZXJ0ZXhCdWZmZXJzOiBBcnJheTxWZXJ0ZXhCdWZmZXI+O1xuICAgIGJvdW5kSW5kZXhCdWZmZXI6ID9JbmRleEJ1ZmZlcjtcbiAgICBib3VuZFZlcnRleE9mZnNldDogP251bWJlcjtcbiAgICBib3VuZER5bmFtaWNWZXJ0ZXhCdWZmZXI6ID9WZXJ0ZXhCdWZmZXI7XG4gICAgYm91bmREeW5hbWljVmVydGV4QnVmZmVyMjogP1ZlcnRleEJ1ZmZlcjtcbiAgICB2YW86IGFueTtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmJvdW5kUHJvZ3JhbSA9IG51bGw7XG4gICAgICAgIHRoaXMuYm91bmRMYXlvdXRWZXJ0ZXhCdWZmZXIgPSBudWxsO1xuICAgICAgICB0aGlzLmJvdW5kUGFpbnRWZXJ0ZXhCdWZmZXJzID0gW107XG4gICAgICAgIHRoaXMuYm91bmRJbmRleEJ1ZmZlciA9IG51bGw7XG4gICAgICAgIHRoaXMuYm91bmRWZXJ0ZXhPZmZzZXQgPSBudWxsO1xuICAgICAgICB0aGlzLmJvdW5kRHluYW1pY1ZlcnRleEJ1ZmZlciA9IG51bGw7XG4gICAgICAgIHRoaXMudmFvID0gbnVsbDtcbiAgICB9XG5cbiAgICBiaW5kKGNvbnRleHQ6IENvbnRleHQsXG4gICAgICAgICBwcm9ncmFtOiBQcm9ncmFtPCo+LFxuICAgICAgICAgbGF5b3V0VmVydGV4QnVmZmVyOiBWZXJ0ZXhCdWZmZXIsXG4gICAgICAgICBwYWludFZlcnRleEJ1ZmZlcnM6IEFycmF5PFZlcnRleEJ1ZmZlcj4sXG4gICAgICAgICBpbmRleEJ1ZmZlcjogP0luZGV4QnVmZmVyLFxuICAgICAgICAgdmVydGV4T2Zmc2V0OiA/bnVtYmVyLFxuICAgICAgICAgZHluYW1pY1ZlcnRleEJ1ZmZlcjogP1ZlcnRleEJ1ZmZlcixcbiAgICAgICAgIGR5bmFtaWNWZXJ0ZXhCdWZmZXIyOiA/VmVydGV4QnVmZmVyKSB7XG5cbiAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcblxuICAgICAgICBsZXQgcGFpbnRCdWZmZXJzRGlmZmVyID0gdGhpcy5ib3VuZFBhaW50VmVydGV4QnVmZmVycy5sZW5ndGggIT09IHBhaW50VmVydGV4QnVmZmVycy5sZW5ndGg7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyAhcGFpbnRCdWZmZXJzRGlmZmVyICYmIGkgPCBwYWludFZlcnRleEJ1ZmZlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmJvdW5kUGFpbnRWZXJ0ZXhCdWZmZXJzW2ldICE9PSBwYWludFZlcnRleEJ1ZmZlcnNbaV0pIHtcbiAgICAgICAgICAgICAgICBwYWludEJ1ZmZlcnNEaWZmZXIgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaXNGcmVzaEJpbmRSZXF1aXJlZCA9IChcbiAgICAgICAgICAgICF0aGlzLnZhbyB8fFxuICAgICAgICAgICAgdGhpcy5ib3VuZFByb2dyYW0gIT09IHByb2dyYW0gfHxcbiAgICAgICAgICAgIHRoaXMuYm91bmRMYXlvdXRWZXJ0ZXhCdWZmZXIgIT09IGxheW91dFZlcnRleEJ1ZmZlciB8fFxuICAgICAgICAgICAgcGFpbnRCdWZmZXJzRGlmZmVyIHx8XG4gICAgICAgICAgICB0aGlzLmJvdW5kSW5kZXhCdWZmZXIgIT09IGluZGV4QnVmZmVyIHx8XG4gICAgICAgICAgICB0aGlzLmJvdW5kVmVydGV4T2Zmc2V0ICE9PSB2ZXJ0ZXhPZmZzZXQgfHxcbiAgICAgICAgICAgIHRoaXMuYm91bmREeW5hbWljVmVydGV4QnVmZmVyICE9PSBkeW5hbWljVmVydGV4QnVmZmVyIHx8XG4gICAgICAgICAgICB0aGlzLmJvdW5kRHluYW1pY1ZlcnRleEJ1ZmZlcjIgIT09IGR5bmFtaWNWZXJ0ZXhCdWZmZXIyXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKCFjb250ZXh0LmV4dFZlcnRleEFycmF5T2JqZWN0IHx8IGlzRnJlc2hCaW5kUmVxdWlyZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZnJlc2hCaW5kKHByb2dyYW0sIGxheW91dFZlcnRleEJ1ZmZlciwgcGFpbnRWZXJ0ZXhCdWZmZXJzLCBpbmRleEJ1ZmZlciwgdmVydGV4T2Zmc2V0LCBkeW5hbWljVmVydGV4QnVmZmVyLCBkeW5hbWljVmVydGV4QnVmZmVyMik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb250ZXh0LmJpbmRWZXJ0ZXhBcnJheU9FUy5zZXQodGhpcy52YW8pO1xuXG4gICAgICAgICAgICBpZiAoZHluYW1pY1ZlcnRleEJ1ZmZlcikge1xuICAgICAgICAgICAgICAgIC8vIFRoZSBidWZmZXIgbWF5IGhhdmUgYmVlbiB1cGRhdGVkLiBSZWJpbmQgdG8gdXBsb2FkIGRhdGEuXG4gICAgICAgICAgICAgICAgZHluYW1pY1ZlcnRleEJ1ZmZlci5iaW5kKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChpbmRleEJ1ZmZlciAmJiBpbmRleEJ1ZmZlci5keW5hbWljRHJhdykge1xuICAgICAgICAgICAgICAgIGluZGV4QnVmZmVyLmJpbmQoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGR5bmFtaWNWZXJ0ZXhCdWZmZXIyKSB7XG4gICAgICAgICAgICAgICAgZHluYW1pY1ZlcnRleEJ1ZmZlcjIuYmluZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnJlc2hCaW5kKHByb2dyYW06IFByb2dyYW08Kj4sXG4gICAgICAgICAgICAgIGxheW91dFZlcnRleEJ1ZmZlcjogVmVydGV4QnVmZmVyLFxuICAgICAgICAgICAgICBwYWludFZlcnRleEJ1ZmZlcnM6IEFycmF5PFZlcnRleEJ1ZmZlcj4sXG4gICAgICAgICAgICAgIGluZGV4QnVmZmVyOiA/SW5kZXhCdWZmZXIsXG4gICAgICAgICAgICAgIHZlcnRleE9mZnNldDogP251bWJlcixcbiAgICAgICAgICAgICAgZHluYW1pY1ZlcnRleEJ1ZmZlcjogP1ZlcnRleEJ1ZmZlcixcbiAgICAgICAgICAgICAgZHluYW1pY1ZlcnRleEJ1ZmZlcjI6ID9WZXJ0ZXhCdWZmZXIpIHtcbiAgICAgICAgbGV0IG51bVByZXZBdHRyaWJ1dGVzO1xuICAgICAgICBjb25zdCBudW1OZXh0QXR0cmlidXRlcyA9IHByb2dyYW0ubnVtQXR0cmlidXRlcztcblxuICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5jb250ZXh0O1xuICAgICAgICBjb25zdCBnbCA9IGNvbnRleHQuZ2w7XG5cbiAgICAgICAgaWYgKGNvbnRleHQuZXh0VmVydGV4QXJyYXlPYmplY3QpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnZhbykgdGhpcy5kZXN0cm95KCk7XG4gICAgICAgICAgICB0aGlzLnZhbyA9IGNvbnRleHQuZXh0VmVydGV4QXJyYXlPYmplY3QuY3JlYXRlVmVydGV4QXJyYXlPRVMoKTtcbiAgICAgICAgICAgIGNvbnRleHQuYmluZFZlcnRleEFycmF5T0VTLnNldCh0aGlzLnZhbyk7XG4gICAgICAgICAgICBudW1QcmV2QXR0cmlidXRlcyA9IDA7XG5cbiAgICAgICAgICAgIC8vIHN0b3JlIHRoZSBhcmd1bWVudHMgc28gdGhhdCB3ZSBjYW4gdmVyaWZ5IHRoZW0gd2hlbiB0aGUgdmFvIGlzIGJvdW5kIGFnYWluXG4gICAgICAgICAgICB0aGlzLmJvdW5kUHJvZ3JhbSA9IHByb2dyYW07XG4gICAgICAgICAgICB0aGlzLmJvdW5kTGF5b3V0VmVydGV4QnVmZmVyID0gbGF5b3V0VmVydGV4QnVmZmVyO1xuICAgICAgICAgICAgdGhpcy5ib3VuZFBhaW50VmVydGV4QnVmZmVycyA9IHBhaW50VmVydGV4QnVmZmVycztcbiAgICAgICAgICAgIHRoaXMuYm91bmRJbmRleEJ1ZmZlciA9IGluZGV4QnVmZmVyO1xuICAgICAgICAgICAgdGhpcy5ib3VuZFZlcnRleE9mZnNldCA9IHZlcnRleE9mZnNldDtcbiAgICAgICAgICAgIHRoaXMuYm91bmREeW5hbWljVmVydGV4QnVmZmVyID0gZHluYW1pY1ZlcnRleEJ1ZmZlcjtcbiAgICAgICAgICAgIHRoaXMuYm91bmREeW5hbWljVmVydGV4QnVmZmVyMiA9IGR5bmFtaWNWZXJ0ZXhCdWZmZXIyO1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBudW1QcmV2QXR0cmlidXRlcyA9IGNvbnRleHQuY3VycmVudE51bUF0dHJpYnV0ZXMgfHwgMDtcblxuICAgICAgICAgICAgLy8gRGlzYWJsZSBhbGwgYXR0cmlidXRlcyBmcm9tIHRoZSBwcmV2aW91cyBwcm9ncmFtIHRoYXQgYXJlbid0IHVzZWQgaW5cbiAgICAgICAgICAgIC8vIHRoZSBuZXcgcHJvZ3JhbS4gTm90ZTogYXR0cmlidXRlIGluZGljZXMgYXJlICpub3QqIHByb2dyYW0gc3BlY2lmaWMhXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gbnVtTmV4dEF0dHJpYnV0ZXM7IGkgPCBudW1QcmV2QXR0cmlidXRlczsgaSsrKSB7XG4gICAgICAgICAgICAgICAgLy8gV2ViR0wgYnJlYWtzIGlmIHlvdSBkaXNhYmxlIGF0dHJpYnV0ZSAwLlxuICAgICAgICAgICAgICAgIC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMjAzMDUyMzFcbiAgICAgICAgICAgICAgICBhc3NlcnQoaSAhPT0gMCk7XG4gICAgICAgICAgICAgICAgZ2wuZGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KGkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGF5b3V0VmVydGV4QnVmZmVyLmVuYWJsZUF0dHJpYnV0ZXMoZ2wsIHByb2dyYW0pO1xuICAgICAgICBmb3IgKGNvbnN0IHZlcnRleEJ1ZmZlciBvZiBwYWludFZlcnRleEJ1ZmZlcnMpIHtcbiAgICAgICAgICAgIHZlcnRleEJ1ZmZlci5lbmFibGVBdHRyaWJ1dGVzKGdsLCBwcm9ncmFtKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkeW5hbWljVmVydGV4QnVmZmVyKSB7XG4gICAgICAgICAgICBkeW5hbWljVmVydGV4QnVmZmVyLmVuYWJsZUF0dHJpYnV0ZXMoZ2wsIHByb2dyYW0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkeW5hbWljVmVydGV4QnVmZmVyMikge1xuICAgICAgICAgICAgZHluYW1pY1ZlcnRleEJ1ZmZlcjIuZW5hYmxlQXR0cmlidXRlcyhnbCwgcHJvZ3JhbSk7XG4gICAgICAgIH1cblxuICAgICAgICBsYXlvdXRWZXJ0ZXhCdWZmZXIuYmluZCgpO1xuICAgICAgICBsYXlvdXRWZXJ0ZXhCdWZmZXIuc2V0VmVydGV4QXR0cmliUG9pbnRlcnMoZ2wsIHByb2dyYW0sIHZlcnRleE9mZnNldCk7XG4gICAgICAgIGZvciAoY29uc3QgdmVydGV4QnVmZmVyIG9mIHBhaW50VmVydGV4QnVmZmVycykge1xuICAgICAgICAgICAgdmVydGV4QnVmZmVyLmJpbmQoKTtcbiAgICAgICAgICAgIHZlcnRleEJ1ZmZlci5zZXRWZXJ0ZXhBdHRyaWJQb2ludGVycyhnbCwgcHJvZ3JhbSwgdmVydGV4T2Zmc2V0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkeW5hbWljVmVydGV4QnVmZmVyKSB7XG4gICAgICAgICAgICBkeW5hbWljVmVydGV4QnVmZmVyLmJpbmQoKTtcbiAgICAgICAgICAgIGR5bmFtaWNWZXJ0ZXhCdWZmZXIuc2V0VmVydGV4QXR0cmliUG9pbnRlcnMoZ2wsIHByb2dyYW0sIHZlcnRleE9mZnNldCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGluZGV4QnVmZmVyKSB7XG4gICAgICAgICAgICBpbmRleEJ1ZmZlci5iaW5kKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGR5bmFtaWNWZXJ0ZXhCdWZmZXIyKSB7XG4gICAgICAgICAgICBkeW5hbWljVmVydGV4QnVmZmVyMi5iaW5kKCk7XG4gICAgICAgICAgICBkeW5hbWljVmVydGV4QnVmZmVyMi5zZXRWZXJ0ZXhBdHRyaWJQb2ludGVycyhnbCwgcHJvZ3JhbSwgdmVydGV4T2Zmc2V0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRleHQuY3VycmVudE51bUF0dHJpYnV0ZXMgPSBudW1OZXh0QXR0cmlidXRlcztcbiAgICB9XG5cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBpZiAodGhpcy52YW8pIHtcbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5leHRWZXJ0ZXhBcnJheU9iamVjdC5kZWxldGVWZXJ0ZXhBcnJheU9FUyh0aGlzLnZhbyk7XG4gICAgICAgICAgICB0aGlzLnZhbyA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFZlcnRleEFycmF5T2JqZWN0O1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IGJyb3dzZXIgZnJvbSAnLi4vdXRpbC9icm93c2VyJztcblxuaW1wb3J0IHtwcmVsdWRlfSBmcm9tICcuLi9zaGFkZXJzJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCBQcm9ncmFtQ29uZmlndXJhdGlvbiBmcm9tICcuLi9kYXRhL3Byb2dyYW1fY29uZmlndXJhdGlvbic7XG5pbXBvcnQgVmVydGV4QXJyYXlPYmplY3QgZnJvbSAnLi92ZXJ0ZXhfYXJyYXlfb2JqZWN0JztcbmltcG9ydCBDb250ZXh0IGZyb20gJy4uL2dsL2NvbnRleHQnO1xuXG5pbXBvcnQgdHlwZSBTZWdtZW50VmVjdG9yIGZyb20gJy4uL2RhdGEvc2VnbWVudCc7XG5pbXBvcnQgdHlwZSBWZXJ0ZXhCdWZmZXIgZnJvbSAnLi4vZ2wvdmVydGV4X2J1ZmZlcic7XG5pbXBvcnQgdHlwZSBJbmRleEJ1ZmZlciBmcm9tICcuLi9nbC9pbmRleF9idWZmZXInO1xuaW1wb3J0IHR5cGUgRGVwdGhNb2RlIGZyb20gJy4uL2dsL2RlcHRoX21vZGUnO1xuaW1wb3J0IHR5cGUgU3RlbmNpbE1vZGUgZnJvbSAnLi4vZ2wvc3RlbmNpbF9tb2RlJztcbmltcG9ydCB0eXBlIENvbG9yTW9kZSBmcm9tICcuLi9nbC9jb2xvcl9tb2RlJztcbmltcG9ydCB0eXBlIEN1bGxGYWNlTW9kZSBmcm9tICcuLi9nbC9jdWxsX2ZhY2VfbW9kZSc7XG5pbXBvcnQgdHlwZSB7VW5pZm9ybUJpbmRpbmdzLCBVbmlmb3JtVmFsdWVzLCBVbmlmb3JtTG9jYXRpb25zfSBmcm9tICcuL3VuaWZvcm1fYmluZGluZyc7XG5pbXBvcnQgdHlwZSB7QmluZGVyVW5pZm9ybX0gZnJvbSAnLi4vZGF0YS9wcm9ncmFtX2NvbmZpZ3VyYXRpb24nO1xuXG5leHBvcnQgdHlwZSBEcmF3TW9kZSA9XG4gICAgfCAkUHJvcGVydHlUeXBlPFdlYkdMUmVuZGVyaW5nQ29udGV4dCwgJ0xJTkVTJz5cbiAgICB8ICRQcm9wZXJ0eVR5cGU8V2ViR0xSZW5kZXJpbmdDb250ZXh0LCAnVFJJQU5HTEVTJz5cbiAgICB8ICRQcm9wZXJ0eVR5cGU8V2ViR0xSZW5kZXJpbmdDb250ZXh0LCAnTElORV9TVFJJUCc+O1xuXG5jbGFzcyBQcm9ncmFtPFVzOiBVbmlmb3JtQmluZGluZ3M+IHtcbiAgICBwcm9ncmFtOiBXZWJHTFByb2dyYW07XG4gICAgYXR0cmlidXRlczoge1tzdHJpbmddOiBudW1iZXJ9O1xuICAgIG51bUF0dHJpYnV0ZXM6IG51bWJlcjtcbiAgICBmaXhlZFVuaWZvcm1zOiBVcztcbiAgICBiaW5kZXJVbmlmb3JtczogQXJyYXk8QmluZGVyVW5pZm9ybT47XG5cbiAgICBjb25zdHJ1Y3Rvcihjb250ZXh0OiBDb250ZXh0LFxuICAgICAgICAgICAgICAgIHNvdXJjZToge2ZyYWdtZW50U291cmNlOiBzdHJpbmcsIHZlcnRleFNvdXJjZTogc3RyaW5nfSxcbiAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uOiBQcm9ncmFtQ29uZmlndXJhdGlvbixcbiAgICAgICAgICAgICAgICBmaXhlZFVuaWZvcm1zOiAoQ29udGV4dCwgVW5pZm9ybUxvY2F0aW9ucykgPT4gVXMsXG4gICAgICAgICAgICAgICAgc2hvd092ZXJkcmF3SW5zcGVjdG9yOiBib29sZWFuKSB7XG4gICAgICAgIGNvbnN0IGdsID0gY29udGV4dC5nbDtcbiAgICAgICAgdGhpcy5wcm9ncmFtID0gZ2wuY3JlYXRlUHJvZ3JhbSgpO1xuXG4gICAgICAgIGNvbnN0IGRlZmluZXMgPSBjb25maWd1cmF0aW9uLmRlZmluZXMoKS5jb25jYXQoXG4gICAgICAgICAgICBgI2RlZmluZSBERVZJQ0VfUElYRUxfUkFUSU8gJHticm93c2VyLmRldmljZVBpeGVsUmF0aW8udG9GaXhlZCgxKX1gKTtcbiAgICAgICAgaWYgKHNob3dPdmVyZHJhd0luc3BlY3Rvcikge1xuICAgICAgICAgICAgZGVmaW5lcy5wdXNoKCcjZGVmaW5lIE9WRVJEUkFXX0lOU1BFQ1RPUjsnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZyYWdtZW50U291cmNlID0gZGVmaW5lcy5jb25jYXQocHJlbHVkZS5mcmFnbWVudFNvdXJjZSwgc291cmNlLmZyYWdtZW50U291cmNlKS5qb2luKCdcXG4nKTtcbiAgICAgICAgY29uc3QgdmVydGV4U291cmNlID0gZGVmaW5lcy5jb25jYXQocHJlbHVkZS52ZXJ0ZXhTb3VyY2UsIHNvdXJjZS52ZXJ0ZXhTb3VyY2UpLmpvaW4oJ1xcbicpO1xuICAgICAgICBjb25zdCBmcmFnbWVudFNoYWRlciA9IGdsLmNyZWF0ZVNoYWRlcihnbC5GUkFHTUVOVF9TSEFERVIpO1xuICAgICAgICBnbC5zaGFkZXJTb3VyY2UoZnJhZ21lbnRTaGFkZXIsIGZyYWdtZW50U291cmNlKTtcbiAgICAgICAgZ2wuY29tcGlsZVNoYWRlcihmcmFnbWVudFNoYWRlcik7XG4gICAgICAgIGFzc2VydChnbC5nZXRTaGFkZXJQYXJhbWV0ZXIoZnJhZ21lbnRTaGFkZXIsIGdsLkNPTVBJTEVfU1RBVFVTKSwgKGdsLmdldFNoYWRlckluZm9Mb2coZnJhZ21lbnRTaGFkZXIpOiBhbnkpKTtcbiAgICAgICAgZ2wuYXR0YWNoU2hhZGVyKHRoaXMucHJvZ3JhbSwgZnJhZ21lbnRTaGFkZXIpO1xuXG4gICAgICAgIGNvbnN0IHZlcnRleFNoYWRlciA9IGdsLmNyZWF0ZVNoYWRlcihnbC5WRVJURVhfU0hBREVSKTtcbiAgICAgICAgZ2wuc2hhZGVyU291cmNlKHZlcnRleFNoYWRlciwgdmVydGV4U291cmNlKTtcbiAgICAgICAgZ2wuY29tcGlsZVNoYWRlcih2ZXJ0ZXhTaGFkZXIpO1xuICAgICAgICBhc3NlcnQoZ2wuZ2V0U2hhZGVyUGFyYW1ldGVyKHZlcnRleFNoYWRlciwgZ2wuQ09NUElMRV9TVEFUVVMpLCAoZ2wuZ2V0U2hhZGVySW5mb0xvZyh2ZXJ0ZXhTaGFkZXIpOiBhbnkpKTtcbiAgICAgICAgZ2wuYXR0YWNoU2hhZGVyKHRoaXMucHJvZ3JhbSwgdmVydGV4U2hhZGVyKTtcblxuICAgICAgICAvLyBNYW51YWxseSBiaW5kIGxheW91dCBhdHRyaWJ1dGVzIGluIHRoZSBvcmRlciBkZWZpbmVkIGJ5IHRoZWlyXG4gICAgICAgIC8vIFByb2dyYW1JbnRlcmZhY2Ugc28gdGhhdCB3ZSBkb24ndCBkeW5hbWljYWxseSBsaW5rIGFuIHVudXNlZFxuICAgICAgICAvLyBhdHRyaWJ1dGUgYXQgcG9zaXRpb24gMCwgd2hpY2ggY2FuIGNhdXNlIHJlbmRlcmluZyB0byBmYWlsIGZvciBhblxuICAgICAgICAvLyBlbnRpcmUgbGF5ZXIgKHNlZSAjNDYwNywgIzQ3MjgpXG4gICAgICAgIGNvbnN0IGxheW91dEF0dHJpYnV0ZXMgPSBjb25maWd1cmF0aW9uLmxheW91dEF0dHJpYnV0ZXMgfHwgW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGF5b3V0QXR0cmlidXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgZ2wuYmluZEF0dHJpYkxvY2F0aW9uKHRoaXMucHJvZ3JhbSwgaSwgbGF5b3V0QXR0cmlidXRlc1tpXS5uYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGdsLmxpbmtQcm9ncmFtKHRoaXMucHJvZ3JhbSk7XG4gICAgICAgIGFzc2VydChnbC5nZXRQcm9ncmFtUGFyYW1ldGVyKHRoaXMucHJvZ3JhbSwgZ2wuTElOS19TVEFUVVMpLCAoZ2wuZ2V0UHJvZ3JhbUluZm9Mb2codGhpcy5wcm9ncmFtKTogYW55KSk7XG5cbiAgICAgICAgdGhpcy5udW1BdHRyaWJ1dGVzID0gZ2wuZ2V0UHJvZ3JhbVBhcmFtZXRlcih0aGlzLnByb2dyYW0sIGdsLkFDVElWRV9BVFRSSUJVVEVTKTtcblxuICAgICAgICB0aGlzLmF0dHJpYnV0ZXMgPSB7fTtcbiAgICAgICAgY29uc3QgdW5pZm9ybUxvY2F0aW9ucyA9IHt9O1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5udW1BdHRyaWJ1dGVzOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGF0dHJpYnV0ZSA9IGdsLmdldEFjdGl2ZUF0dHJpYih0aGlzLnByb2dyYW0sIGkpO1xuICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYXR0cmlidXRlc1thdHRyaWJ1dGUubmFtZV0gPSBnbC5nZXRBdHRyaWJMb2NhdGlvbih0aGlzLnByb2dyYW0sIGF0dHJpYnV0ZS5uYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG51bVVuaWZvcm1zID0gZ2wuZ2V0UHJvZ3JhbVBhcmFtZXRlcih0aGlzLnByb2dyYW0sIGdsLkFDVElWRV9VTklGT1JNUyk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtVW5pZm9ybXM7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgdW5pZm9ybSA9IGdsLmdldEFjdGl2ZVVuaWZvcm0odGhpcy5wcm9ncmFtLCBpKTtcbiAgICAgICAgICAgIGlmICh1bmlmb3JtKSB7XG4gICAgICAgICAgICAgICAgdW5pZm9ybUxvY2F0aW9uc1t1bmlmb3JtLm5hbWVdID0gZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHRoaXMucHJvZ3JhbSwgdW5pZm9ybS5uYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZml4ZWRVbmlmb3JtcyA9IGZpeGVkVW5pZm9ybXMoY29udGV4dCwgdW5pZm9ybUxvY2F0aW9ucyk7XG4gICAgICAgIHRoaXMuYmluZGVyVW5pZm9ybXMgPSBjb25maWd1cmF0aW9uLmdldFVuaWZvcm1zKGNvbnRleHQsIHVuaWZvcm1Mb2NhdGlvbnMpO1xuICAgIH1cblxuICAgIGRyYXcoY29udGV4dDogQ29udGV4dCxcbiAgICAgICAgIGRyYXdNb2RlOiBEcmF3TW9kZSxcbiAgICAgICAgIGRlcHRoTW9kZTogJFJlYWRPbmx5PERlcHRoTW9kZT4sXG4gICAgICAgICBzdGVuY2lsTW9kZTogJFJlYWRPbmx5PFN0ZW5jaWxNb2RlPixcbiAgICAgICAgIGNvbG9yTW9kZTogJFJlYWRPbmx5PENvbG9yTW9kZT4sXG4gICAgICAgICBjdWxsRmFjZU1vZGU6ICRSZWFkT25seTxDdWxsRmFjZU1vZGU+LFxuICAgICAgICAgdW5pZm9ybVZhbHVlczogVW5pZm9ybVZhbHVlczxVcz4sXG4gICAgICAgICBsYXllcklEOiBzdHJpbmcsXG4gICAgICAgICBsYXlvdXRWZXJ0ZXhCdWZmZXI6IFZlcnRleEJ1ZmZlcixcbiAgICAgICAgIGluZGV4QnVmZmVyOiBJbmRleEJ1ZmZlcixcbiAgICAgICAgIHNlZ21lbnRzOiBTZWdtZW50VmVjdG9yLFxuICAgICAgICAgY3VycmVudFByb3BlcnRpZXM6IGFueSxcbiAgICAgICAgIHpvb206ID9udW1iZXIsXG4gICAgICAgICBjb25maWd1cmF0aW9uOiA/UHJvZ3JhbUNvbmZpZ3VyYXRpb24sXG4gICAgICAgICBkeW5hbWljTGF5b3V0QnVmZmVyOiA/VmVydGV4QnVmZmVyLFxuICAgICAgICAgZHluYW1pY0xheW91dEJ1ZmZlcjI6ID9WZXJ0ZXhCdWZmZXIpIHtcblxuICAgICAgICBjb25zdCBnbCA9IGNvbnRleHQuZ2w7XG5cbiAgICAgICAgY29udGV4dC5wcm9ncmFtLnNldCh0aGlzLnByb2dyYW0pO1xuICAgICAgICBjb250ZXh0LnNldERlcHRoTW9kZShkZXB0aE1vZGUpO1xuICAgICAgICBjb250ZXh0LnNldFN0ZW5jaWxNb2RlKHN0ZW5jaWxNb2RlKTtcbiAgICAgICAgY29udGV4dC5zZXRDb2xvck1vZGUoY29sb3JNb2RlKTtcbiAgICAgICAgY29udGV4dC5zZXRDdWxsRmFjZShjdWxsRmFjZU1vZGUpO1xuXG4gICAgICAgIGZvciAoY29uc3QgbmFtZSBpbiB0aGlzLmZpeGVkVW5pZm9ybXMpIHtcbiAgICAgICAgICAgIHRoaXMuZml4ZWRVbmlmb3Jtc1tuYW1lXS5zZXQodW5pZm9ybVZhbHVlc1tuYW1lXSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgY29uZmlndXJhdGlvbi5zZXRVbmlmb3Jtcyhjb250ZXh0LCB0aGlzLmJpbmRlclVuaWZvcm1zLCBjdXJyZW50UHJvcGVydGllcywge3pvb206ICh6b29tOiBhbnkpfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwcmltaXRpdmVTaXplID0ge1xuICAgICAgICAgICAgW2dsLkxJTkVTXTogMixcbiAgICAgICAgICAgIFtnbC5UUklBTkdMRVNdOiAzLFxuICAgICAgICAgICAgW2dsLkxJTkVfU1RSSVBdOiAxXG4gICAgICAgIH1bZHJhd01vZGVdO1xuXG4gICAgICAgIGZvciAoY29uc3Qgc2VnbWVudCBvZiBzZWdtZW50cy5nZXQoKSkge1xuICAgICAgICAgICAgY29uc3QgdmFvcyA9IHNlZ21lbnQudmFvcyB8fCAoc2VnbWVudC52YW9zID0ge30pO1xuICAgICAgICAgICAgY29uc3QgdmFvOiBWZXJ0ZXhBcnJheU9iamVjdCA9IHZhb3NbbGF5ZXJJRF0gfHwgKHZhb3NbbGF5ZXJJRF0gPSBuZXcgVmVydGV4QXJyYXlPYmplY3QoKSk7XG5cbiAgICAgICAgICAgIHZhby5iaW5kKFxuICAgICAgICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgICAgICBsYXlvdXRWZXJ0ZXhCdWZmZXIsXG4gICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbiA/IGNvbmZpZ3VyYXRpb24uZ2V0UGFpbnRWZXJ0ZXhCdWZmZXJzKCkgOiBbXSxcbiAgICAgICAgICAgICAgICBpbmRleEJ1ZmZlcixcbiAgICAgICAgICAgICAgICBzZWdtZW50LnZlcnRleE9mZnNldCxcbiAgICAgICAgICAgICAgICBkeW5hbWljTGF5b3V0QnVmZmVyLFxuICAgICAgICAgICAgICAgIGR5bmFtaWNMYXlvdXRCdWZmZXIyXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBnbC5kcmF3RWxlbWVudHMoXG4gICAgICAgICAgICAgICAgZHJhd01vZGUsXG4gICAgICAgICAgICAgICAgc2VnbWVudC5wcmltaXRpdmVMZW5ndGggKiBwcmltaXRpdmVTaXplLFxuICAgICAgICAgICAgICAgIGdsLlVOU0lHTkVEX1NIT1JULFxuICAgICAgICAgICAgICAgIHNlZ21lbnQucHJpbWl0aXZlT2Zmc2V0ICogcHJpbWl0aXZlU2l6ZSAqIDIpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBQcm9ncmFtO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHtcbiAgICBVbmlmb3JtMWksXG4gICAgVW5pZm9ybTFmLFxuICAgIFVuaWZvcm0yZixcbiAgICBVbmlmb3JtNGZcbn0gZnJvbSAnLi4vdW5pZm9ybV9iaW5kaW5nJztcbmltcG9ydCBwaXhlbHNUb1RpbGVVbml0cyBmcm9tICcuLi8uLi9zb3VyY2UvcGl4ZWxzX3RvX3RpbGVfdW5pdHMnO1xuaW1wb3J0IGJyb3dzZXIgZnJvbSAnLi4vLi4vdXRpbC9icm93c2VyJztcblxuaW1wb3J0IHR5cGUgUGFpbnRlciBmcm9tICcuLi9wYWludGVyJztcbmltcG9ydCB0eXBlIHtPdmVyc2NhbGVkVGlsZUlEfSBmcm9tICcuLi8uLi9zb3VyY2UvdGlsZV9pZCc7XG5pbXBvcnQgdHlwZSB7Q3Jvc3NGYWRlZH0gZnJvbSAnLi4vLi4vc3R5bGUvcHJvcGVydGllcyc7XG5pbXBvcnQgdHlwZSB7Q3Jvc3NmYWRlUGFyYW1ldGVyc30gZnJvbSAnLi4vLi4vc3R5bGUvZXZhbHVhdGlvbl9wYXJhbWV0ZXJzJztcbmltcG9ydCB0eXBlIHtVbmlmb3JtVmFsdWVzfSBmcm9tICcuLi91bmlmb3JtX2JpbmRpbmcnO1xuaW1wb3J0IHR5cGUgVGlsZSBmcm9tICcuLi8uLi9zb3VyY2UvdGlsZSc7XG5cbnR5cGUgQmFja2dyb3VuZFBhdHRlcm5Vbmlmb3Jtc1R5cGUgPSB7fFxuICAgICd1X2ltYWdlJzogVW5pZm9ybTFpLFxuICAgICd1X3BhdHRlcm5fdGxfYSc6IFVuaWZvcm0yZixcbiAgICAndV9wYXR0ZXJuX2JyX2EnOiBVbmlmb3JtMmYsXG4gICAgJ3VfcGF0dGVybl90bF9iJzogVW5pZm9ybTJmLFxuICAgICd1X3BhdHRlcm5fYnJfYic6IFVuaWZvcm0yZixcbiAgICAndV90ZXhzaXplJzogVW5pZm9ybTJmLFxuICAgICd1X21peCc6IFVuaWZvcm0xZixcbiAgICAndV9wYXR0ZXJuX3NpemVfYSc6IFVuaWZvcm0yZixcbiAgICAndV9wYXR0ZXJuX3NpemVfYic6IFVuaWZvcm0yZixcbiAgICAndV9zY2FsZV9hJzogVW5pZm9ybTFmLFxuICAgICd1X3NjYWxlX2InOiBVbmlmb3JtMWYsXG4gICAgJ3VfcGl4ZWxfY29vcmRfdXBwZXInOiBVbmlmb3JtMmYsXG4gICAgJ3VfcGl4ZWxfY29vcmRfbG93ZXInOiBVbmlmb3JtMmYsXG4gICAgJ3VfdGlsZV91bml0c190b19waXhlbHMnOiBVbmlmb3JtMWZcbnx9O1xuXG5leHBvcnQgdHlwZSBQYXR0ZXJuVW5pZm9ybXNUeXBlID0ge3xcbiAgICAvLyBwYXR0ZXJuIHVuaWZvcm1zOlxuICAgICd1X2ltYWdlJzogVW5pZm9ybTFpLFxuICAgICd1X3RleHNpemUnOiBVbmlmb3JtMmYsXG4gICAgJ3Vfc2NhbGUnOiBVbmlmb3JtNGYsXG4gICAgJ3VfZmFkZSc6IFVuaWZvcm0xZixcbiAgICAndV9waXhlbF9jb29yZF91cHBlcic6IFVuaWZvcm0yZixcbiAgICAndV9waXhlbF9jb29yZF9sb3dlcic6IFVuaWZvcm0yZlxufH07XG5cbmZ1bmN0aW9uIHBhdHRlcm5Vbmlmb3JtVmFsdWVzKGNyb3NzZmFkZTogQ3Jvc3NmYWRlUGFyYW1ldGVycywgcGFpbnRlcjogUGFpbnRlcixcbiAgICAgICAgdGlsZTogVGlsZVxuKTogVW5pZm9ybVZhbHVlczxQYXR0ZXJuVW5pZm9ybXNUeXBlPiB7XG5cbiAgICBjb25zdCB0aWxlUmF0aW8gPSAxIC8gcGl4ZWxzVG9UaWxlVW5pdHModGlsZSwgMSwgcGFpbnRlci50cmFuc2Zvcm0udGlsZVpvb20pO1xuXG4gICAgY29uc3QgbnVtVGlsZXMgPSBNYXRoLnBvdygyLCB0aWxlLnRpbGVJRC5vdmVyc2NhbGVkWik7XG4gICAgY29uc3QgdGlsZVNpemVBdE5lYXJlc3Rab29tID0gdGlsZS50aWxlU2l6ZSAqIE1hdGgucG93KDIsIHBhaW50ZXIudHJhbnNmb3JtLnRpbGVab29tKSAvIG51bVRpbGVzO1xuXG4gICAgY29uc3QgcGl4ZWxYID0gdGlsZVNpemVBdE5lYXJlc3Rab29tICogKHRpbGUudGlsZUlELmNhbm9uaWNhbC54ICsgdGlsZS50aWxlSUQud3JhcCAqIG51bVRpbGVzKTtcbiAgICBjb25zdCBwaXhlbFkgPSB0aWxlU2l6ZUF0TmVhcmVzdFpvb20gKiB0aWxlLnRpbGVJRC5jYW5vbmljYWwueTtcblxuICAgIHJldHVybiB7XG4gICAgICAgICd1X2ltYWdlJzogMCxcbiAgICAgICAgJ3VfdGV4c2l6ZSc6IHRpbGUuaW1hZ2VBdGxhc1RleHR1cmUuc2l6ZSxcbiAgICAgICAgLy8gdGhpcyBhc3N1bWVzIGFsbCBpbWFnZXMgaW4gdGhlIGljb24gYXRsYXMgdGV4dHVyZSBoYXZlIHRoZSBzYW1lIHBpeGVsIHJhdGlvXG4gICAgICAgICd1X3NjYWxlJzogW2Jyb3dzZXIuZGV2aWNlUGl4ZWxSYXRpbywgdGlsZVJhdGlvLCBjcm9zc2ZhZGUuZnJvbVNjYWxlLCBjcm9zc2ZhZGUudG9TY2FsZV0sXG4gICAgICAgICd1X2ZhZGUnOiBjcm9zc2ZhZGUudCxcbiAgICAgICAgLy8gc3BsaXQgdGhlIHBpeGVsIGNvb3JkIGludG8gdHdvIHBhaXJzIG9mIDE2IGJpdCBudW1iZXJzLiBUaGUgZ2xzbCBzcGVjIG9ubHkgZ3VhcmFudGVlcyAxNiBiaXRzIG9mIHByZWNpc2lvbi5cbiAgICAgICAgJ3VfcGl4ZWxfY29vcmRfdXBwZXInOiBbcGl4ZWxYID4+IDE2LCBwaXhlbFkgPj4gMTZdLFxuICAgICAgICAndV9waXhlbF9jb29yZF9sb3dlcic6IFtwaXhlbFggJiAweEZGRkYsIHBpeGVsWSAmIDB4RkZGRl1cbiAgICB9O1xufVxuXG5mdW5jdGlvbiBiZ1BhdHRlcm5Vbmlmb3JtVmFsdWVzKGltYWdlOiBDcm9zc0ZhZGVkPHN0cmluZz4sIGNyb3NzZmFkZTogQ3Jvc3NmYWRlUGFyYW1ldGVycywgcGFpbnRlcjogUGFpbnRlcixcbiAgICAgICAgdGlsZToge3RpbGVJRDogT3ZlcnNjYWxlZFRpbGVJRCwgdGlsZVNpemU6IG51bWJlcn1cbik6IFVuaWZvcm1WYWx1ZXM8QmFja2dyb3VuZFBhdHRlcm5Vbmlmb3Jtc1R5cGU+IHtcbiAgICBjb25zdCBpbWFnZVBvc0EgPSBwYWludGVyLmltYWdlTWFuYWdlci5nZXRQYXR0ZXJuKGltYWdlLmZyb20pO1xuICAgIGNvbnN0IGltYWdlUG9zQiA9IHBhaW50ZXIuaW1hZ2VNYW5hZ2VyLmdldFBhdHRlcm4oaW1hZ2UudG8pO1xuICAgIGFzc2VydChpbWFnZVBvc0EgJiYgaW1hZ2VQb3NCKTtcbiAgICBjb25zdCB7d2lkdGgsIGhlaWdodH0gPSBwYWludGVyLmltYWdlTWFuYWdlci5nZXRQaXhlbFNpemUoKTtcblxuICAgIGNvbnN0IG51bVRpbGVzID0gTWF0aC5wb3coMiwgdGlsZS50aWxlSUQub3ZlcnNjYWxlZFopO1xuICAgIGNvbnN0IHRpbGVTaXplQXROZWFyZXN0Wm9vbSA9IHRpbGUudGlsZVNpemUgKiBNYXRoLnBvdygyLCBwYWludGVyLnRyYW5zZm9ybS50aWxlWm9vbSkgLyBudW1UaWxlcztcblxuICAgIGNvbnN0IHBpeGVsWCA9IHRpbGVTaXplQXROZWFyZXN0Wm9vbSAqICh0aWxlLnRpbGVJRC5jYW5vbmljYWwueCArIHRpbGUudGlsZUlELndyYXAgKiBudW1UaWxlcyk7XG4gICAgY29uc3QgcGl4ZWxZID0gdGlsZVNpemVBdE5lYXJlc3Rab29tICogdGlsZS50aWxlSUQuY2Fub25pY2FsLnk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICAndV9pbWFnZSc6IDAsXG4gICAgICAgICd1X3BhdHRlcm5fdGxfYSc6IChpbWFnZVBvc0E6IGFueSkudGwsXG4gICAgICAgICd1X3BhdHRlcm5fYnJfYSc6IChpbWFnZVBvc0E6IGFueSkuYnIsXG4gICAgICAgICd1X3BhdHRlcm5fdGxfYic6IChpbWFnZVBvc0I6IGFueSkudGwsXG4gICAgICAgICd1X3BhdHRlcm5fYnJfYic6IChpbWFnZVBvc0I6IGFueSkuYnIsXG4gICAgICAgICd1X3RleHNpemUnOiBbd2lkdGgsIGhlaWdodF0sXG4gICAgICAgICd1X21peCc6IGNyb3NzZmFkZS50LFxuICAgICAgICAndV9wYXR0ZXJuX3NpemVfYSc6IChpbWFnZVBvc0E6IGFueSkuZGlzcGxheVNpemUsXG4gICAgICAgICd1X3BhdHRlcm5fc2l6ZV9iJzogKGltYWdlUG9zQjogYW55KS5kaXNwbGF5U2l6ZSxcbiAgICAgICAgJ3Vfc2NhbGVfYSc6IGNyb3NzZmFkZS5mcm9tU2NhbGUsXG4gICAgICAgICd1X3NjYWxlX2InOiBjcm9zc2ZhZGUudG9TY2FsZSxcbiAgICAgICAgJ3VfdGlsZV91bml0c190b19waXhlbHMnOiAxIC8gcGl4ZWxzVG9UaWxlVW5pdHModGlsZSwgMSwgcGFpbnRlci50cmFuc2Zvcm0udGlsZVpvb20pLFxuICAgICAgICAvLyBzcGxpdCB0aGUgcGl4ZWwgY29vcmQgaW50byB0d28gcGFpcnMgb2YgMTYgYml0IG51bWJlcnMuIFRoZSBnbHNsIHNwZWMgb25seSBndWFyYW50ZWVzIDE2IGJpdHMgb2YgcHJlY2lzaW9uLlxuICAgICAgICAndV9waXhlbF9jb29yZF91cHBlcic6IFtwaXhlbFggPj4gMTYsIHBpeGVsWSA+PiAxNl0sXG4gICAgICAgICd1X3BpeGVsX2Nvb3JkX2xvd2VyJzogW3BpeGVsWCAmIDB4RkZGRiwgcGl4ZWxZICYgMHhGRkZGXVxuICAgIH07XG59XG5leHBvcnQgeyBiZ1BhdHRlcm5Vbmlmb3JtVmFsdWVzLCBwYXR0ZXJuVW5pZm9ybVZhbHVlcyB9O1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHsgcGF0dGVyblVuaWZvcm1WYWx1ZXMgfSBmcm9tICcuL3BhdHRlcm4nO1xuaW1wb3J0IHtcbiAgICBVbmlmb3JtMWksXG4gICAgVW5pZm9ybTFmLFxuICAgIFVuaWZvcm0yZixcbiAgICBVbmlmb3JtM2YsXG4gICAgVW5pZm9ybTRmLFxuICAgIFVuaWZvcm1NYXRyaXg0ZlxufSBmcm9tICcuLi91bmlmb3JtX2JpbmRpbmcnO1xuXG5pbXBvcnQge21hdDMsIHZlYzN9IGZyb20gJ2dsLW1hdHJpeCc7XG5pbXBvcnQgeyBleHRlbmQgfSBmcm9tICcuLi8uLi91dGlsL3V0aWwnO1xuXG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gJy4uLy4uL2dsL2NvbnRleHQnO1xuaW1wb3J0IHR5cGUgUGFpbnRlciBmcm9tICcuLi9wYWludGVyJztcbmltcG9ydCB0eXBlIHtPdmVyc2NhbGVkVGlsZUlEfSBmcm9tICcuLi8uLi9zb3VyY2UvdGlsZV9pZCc7XG5pbXBvcnQgdHlwZSB7VW5pZm9ybVZhbHVlcywgVW5pZm9ybUxvY2F0aW9uc30gZnJvbSAnLi4vdW5pZm9ybV9iaW5kaW5nJztcbmltcG9ydCB0eXBlIHtDcm9zc2ZhZGVQYXJhbWV0ZXJzfSBmcm9tICcuLi8uLi9zdHlsZS9ldmFsdWF0aW9uX3BhcmFtZXRlcnMnO1xuaW1wb3J0IHR5cGUgVGlsZSBmcm9tICcuLi8uLi9zb3VyY2UvdGlsZSc7XG5cbmV4cG9ydCB0eXBlIEZpbGxFeHRydXNpb25Vbmlmb3Jtc1R5cGUgPSB7fFxuICAgICd1X21hdHJpeCc6IFVuaWZvcm1NYXRyaXg0ZixcbiAgICAndV9saWdodHBvcyc6IFVuaWZvcm0zZixcbiAgICAndV9saWdodGludGVuc2l0eSc6IFVuaWZvcm0xZixcbiAgICAndV9saWdodGNvbG9yJzogVW5pZm9ybTNmLFxuICAgICd1X3ZlcnRpY2FsX2dyYWRpZW50JzogVW5pZm9ybTFmLFxuICAgICd1X29wYWNpdHknOiBVbmlmb3JtMWZcbnx9O1xuXG5leHBvcnQgdHlwZSBGaWxsRXh0cnVzaW9uUGF0dGVyblVuaWZvcm1zVHlwZSA9IHt8XG4gICAgJ3VfbWF0cml4JzogVW5pZm9ybU1hdHJpeDRmLFxuICAgICd1X2xpZ2h0cG9zJzogVW5pZm9ybTNmLFxuICAgICd1X2xpZ2h0aW50ZW5zaXR5JzogVW5pZm9ybTFmLFxuICAgICd1X2xpZ2h0Y29sb3InOiBVbmlmb3JtM2YsXG4gICAgJ3VfaGVpZ2h0X2ZhY3Rvcic6IFVuaWZvcm0xZixcbiAgICAndV92ZXJ0aWNhbF9ncmFkaWVudCc6IFVuaWZvcm0xZixcbiAgICAvLyBwYXR0ZXJuIHVuaWZvcm1zOlxuICAgICd1X3RleHNpemUnOiBVbmlmb3JtMmYsXG4gICAgJ3VfaW1hZ2UnOiBVbmlmb3JtMWksXG4gICAgJ3VfcGl4ZWxfY29vcmRfdXBwZXInOiBVbmlmb3JtMmYsXG4gICAgJ3VfcGl4ZWxfY29vcmRfbG93ZXInOiBVbmlmb3JtMmYsXG4gICAgJ3Vfc2NhbGUnOiBVbmlmb3JtNGYsXG4gICAgJ3VfZmFkZSc6IFVuaWZvcm0xZixcbiAgICAndV9vcGFjaXR5JzogVW5pZm9ybTFmXG58fTtcblxuY29uc3QgZmlsbEV4dHJ1c2lvblVuaWZvcm1zID0gKGNvbnRleHQ6IENvbnRleHQsIGxvY2F0aW9uczogVW5pZm9ybUxvY2F0aW9ucyk6IEZpbGxFeHRydXNpb25Vbmlmb3Jtc1R5cGUgPT4gKHtcbiAgICAndV9tYXRyaXgnOiBuZXcgVW5pZm9ybU1hdHJpeDRmKGNvbnRleHQsIGxvY2F0aW9ucy51X21hdHJpeCksXG4gICAgJ3VfbGlnaHRwb3MnOiBuZXcgVW5pZm9ybTNmKGNvbnRleHQsIGxvY2F0aW9ucy51X2xpZ2h0cG9zKSxcbiAgICAndV9saWdodGludGVuc2l0eSc6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfbGlnaHRpbnRlbnNpdHkpLFxuICAgICd1X2xpZ2h0Y29sb3InOiBuZXcgVW5pZm9ybTNmKGNvbnRleHQsIGxvY2F0aW9ucy51X2xpZ2h0Y29sb3IpLFxuICAgICd1X3ZlcnRpY2FsX2dyYWRpZW50JzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV92ZXJ0aWNhbF9ncmFkaWVudCksXG4gICAgJ3Vfb3BhY2l0eSc6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfb3BhY2l0eSlcbn0pO1xuXG5jb25zdCBmaWxsRXh0cnVzaW9uUGF0dGVyblVuaWZvcm1zID0gKGNvbnRleHQ6IENvbnRleHQsIGxvY2F0aW9uczogVW5pZm9ybUxvY2F0aW9ucyk6IEZpbGxFeHRydXNpb25QYXR0ZXJuVW5pZm9ybXNUeXBlID0+ICh7XG4gICAgJ3VfbWF0cml4JzogbmV3IFVuaWZvcm1NYXRyaXg0Zihjb250ZXh0LCBsb2NhdGlvbnMudV9tYXRyaXgpLFxuICAgICd1X2xpZ2h0cG9zJzogbmV3IFVuaWZvcm0zZihjb250ZXh0LCBsb2NhdGlvbnMudV9saWdodHBvcyksXG4gICAgJ3VfbGlnaHRpbnRlbnNpdHknOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X2xpZ2h0aW50ZW5zaXR5KSxcbiAgICAndV9saWdodGNvbG9yJzogbmV3IFVuaWZvcm0zZihjb250ZXh0LCBsb2NhdGlvbnMudV9saWdodGNvbG9yKSxcbiAgICAndV92ZXJ0aWNhbF9ncmFkaWVudCc6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfdmVydGljYWxfZ3JhZGllbnQpLFxuICAgICd1X2hlaWdodF9mYWN0b3InOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X2hlaWdodF9mYWN0b3IpLFxuICAgIC8vIHBhdHRlcm4gdW5pZm9ybXNcbiAgICAndV9pbWFnZSc6IG5ldyBVbmlmb3JtMWkoY29udGV4dCwgbG9jYXRpb25zLnVfaW1hZ2UpLFxuICAgICd1X3RleHNpemUnOiBuZXcgVW5pZm9ybTJmKGNvbnRleHQsIGxvY2F0aW9ucy51X3RleHNpemUpLFxuICAgICd1X3BpeGVsX2Nvb3JkX3VwcGVyJzogbmV3IFVuaWZvcm0yZihjb250ZXh0LCBsb2NhdGlvbnMudV9waXhlbF9jb29yZF91cHBlciksXG4gICAgJ3VfcGl4ZWxfY29vcmRfbG93ZXInOiBuZXcgVW5pZm9ybTJmKGNvbnRleHQsIGxvY2F0aW9ucy51X3BpeGVsX2Nvb3JkX2xvd2VyKSxcbiAgICAndV9zY2FsZSc6IG5ldyBVbmlmb3JtNGYoY29udGV4dCwgbG9jYXRpb25zLnVfc2NhbGUpLFxuICAgICd1X2ZhZGUnOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X2ZhZGUpLFxuICAgICd1X29wYWNpdHknOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X29wYWNpdHkpXG59KTtcblxuY29uc3QgZmlsbEV4dHJ1c2lvblVuaWZvcm1WYWx1ZXMgPSAoXG4gICAgbWF0cml4OiBGbG9hdDMyQXJyYXksXG4gICAgcGFpbnRlcjogUGFpbnRlcixcbiAgICBzaG91bGRVc2VWZXJ0aWNhbEdyYWRpZW50OiBib29sZWFuLFxuICAgIG9wYWNpdHk6IG51bWJlclxuKTogVW5pZm9ybVZhbHVlczxGaWxsRXh0cnVzaW9uVW5pZm9ybXNUeXBlPiA9PiB7XG4gICAgY29uc3QgbGlnaHQgPSBwYWludGVyLnN0eWxlLmxpZ2h0O1xuICAgIGNvbnN0IF9scCA9IGxpZ2h0LnByb3BlcnRpZXMuZ2V0KCdwb3NpdGlvbicpO1xuICAgIGNvbnN0IGxpZ2h0UG9zID0gW19scC54LCBfbHAueSwgX2xwLnpdO1xuICAgIGNvbnN0IGxpZ2h0TWF0ID0gbWF0My5jcmVhdGUoKTtcbiAgICBpZiAobGlnaHQucHJvcGVydGllcy5nZXQoJ2FuY2hvcicpID09PSAndmlld3BvcnQnKSB7XG4gICAgICAgIG1hdDMuZnJvbVJvdGF0aW9uKGxpZ2h0TWF0LCAtcGFpbnRlci50cmFuc2Zvcm0uYW5nbGUpO1xuICAgIH1cbiAgICB2ZWMzLnRyYW5zZm9ybU1hdDMobGlnaHRQb3MsIGxpZ2h0UG9zLCBsaWdodE1hdCk7XG5cbiAgICBjb25zdCBsaWdodENvbG9yID0gbGlnaHQucHJvcGVydGllcy5nZXQoJ2NvbG9yJyk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICAndV9tYXRyaXgnOiBtYXRyaXgsXG4gICAgICAgICd1X2xpZ2h0cG9zJzogbGlnaHRQb3MsXG4gICAgICAgICd1X2xpZ2h0aW50ZW5zaXR5JzogbGlnaHQucHJvcGVydGllcy5nZXQoJ2ludGVuc2l0eScpLFxuICAgICAgICAndV9saWdodGNvbG9yJzogW2xpZ2h0Q29sb3IuciwgbGlnaHRDb2xvci5nLCBsaWdodENvbG9yLmJdLFxuICAgICAgICAndV92ZXJ0aWNhbF9ncmFkaWVudCc6ICtzaG91bGRVc2VWZXJ0aWNhbEdyYWRpZW50LFxuICAgICAgICAndV9vcGFjaXR5Jzogb3BhY2l0eVxuICAgIH07XG59O1xuXG5jb25zdCBmaWxsRXh0cnVzaW9uUGF0dGVyblVuaWZvcm1WYWx1ZXMgPSAoXG4gICAgbWF0cml4OiBGbG9hdDMyQXJyYXksXG4gICAgcGFpbnRlcjogUGFpbnRlcixcbiAgICBzaG91bGRVc2VWZXJ0aWNhbEdyYWRpZW50OiBib29sZWFuLFxuICAgIG9wYWNpdHk6IG51bWJlcixcbiAgICBjb29yZDogT3ZlcnNjYWxlZFRpbGVJRCxcbiAgICBjcm9zc2ZhZGU6IENyb3NzZmFkZVBhcmFtZXRlcnMsXG4gICAgdGlsZTogVGlsZVxuKTogVW5pZm9ybVZhbHVlczxGaWxsRXh0cnVzaW9uUGF0dGVyblVuaWZvcm1zVHlwZT4gPT4ge1xuICAgIHJldHVybiBleHRlbmQoZmlsbEV4dHJ1c2lvblVuaWZvcm1WYWx1ZXMobWF0cml4LCBwYWludGVyLCBzaG91bGRVc2VWZXJ0aWNhbEdyYWRpZW50LCBvcGFjaXR5KSxcbiAgICAgICAgcGF0dGVyblVuaWZvcm1WYWx1ZXMoY3Jvc3NmYWRlLCBwYWludGVyLCB0aWxlKSxcbiAgICAgICAge1xuICAgICAgICAgICAgJ3VfaGVpZ2h0X2ZhY3Rvcic6IC1NYXRoLnBvdygyLCBjb29yZC5vdmVyc2NhbGVkWikgLyB0aWxlLnRpbGVTaXplIC8gOFxuICAgICAgICB9KTtcbn07XG5cbmV4cG9ydCB7XG4gICAgZmlsbEV4dHJ1c2lvblVuaWZvcm1zLFxuICAgIGZpbGxFeHRydXNpb25QYXR0ZXJuVW5pZm9ybXMsXG4gICAgZmlsbEV4dHJ1c2lvblVuaWZvcm1WYWx1ZXMsXG4gICAgZmlsbEV4dHJ1c2lvblBhdHRlcm5Vbmlmb3JtVmFsdWVzXG59O1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHtwYXR0ZXJuVW5pZm9ybVZhbHVlc30gZnJvbSAnLi9wYXR0ZXJuJztcbmltcG9ydCB7XG4gICAgVW5pZm9ybTFpLFxuICAgIFVuaWZvcm0xZixcbiAgICBVbmlmb3JtMmYsXG4gICAgVW5pZm9ybTRmLFxuICAgIFVuaWZvcm1NYXRyaXg0ZlxufSBmcm9tICcuLi91bmlmb3JtX2JpbmRpbmcnO1xuaW1wb3J0IHsgZXh0ZW5kIH0gZnJvbSAnLi4vLi4vdXRpbC91dGlsJztcblxuaW1wb3J0IHR5cGUgUGFpbnRlciBmcm9tICcuLi9wYWludGVyJztcbmltcG9ydCB0eXBlIHtVbmlmb3JtVmFsdWVzLCBVbmlmb3JtTG9jYXRpb25zfSBmcm9tICcuLi91bmlmb3JtX2JpbmRpbmcnO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tICcuLi8uLi9nbC9jb250ZXh0JztcbmltcG9ydCB0eXBlIHtDcm9zc2ZhZGVQYXJhbWV0ZXJzfSBmcm9tICcuLi8uLi9zdHlsZS9ldmFsdWF0aW9uX3BhcmFtZXRlcnMnO1xuaW1wb3J0IHR5cGUgVGlsZSBmcm9tICcuLi8uLi9zb3VyY2UvdGlsZSc7XG5cbmV4cG9ydCB0eXBlIEZpbGxVbmlmb3Jtc1R5cGUgPSB7fFxuICAgICd1X21hdHJpeCc6IFVuaWZvcm1NYXRyaXg0ZlxufH07XG5cbmV4cG9ydCB0eXBlIEZpbGxPdXRsaW5lVW5pZm9ybXNUeXBlID0ge3xcbiAgICAndV9tYXRyaXgnOiBVbmlmb3JtTWF0cml4NGYsXG4gICAgJ3Vfd29ybGQnOiBVbmlmb3JtMmZcbnx9O1xuXG5leHBvcnQgdHlwZSBGaWxsUGF0dGVyblVuaWZvcm1zVHlwZSA9IHt8XG4gICAgJ3VfbWF0cml4JzogVW5pZm9ybU1hdHJpeDRmLFxuICAgIC8vIHBhdHRlcm4gdW5pZm9ybXM6XG4gICAgJ3VfdGV4c2l6ZSc6IFVuaWZvcm0yZixcbiAgICAndV9pbWFnZSc6IFVuaWZvcm0xaSxcbiAgICAndV9waXhlbF9jb29yZF91cHBlcic6IFVuaWZvcm0yZixcbiAgICAndV9waXhlbF9jb29yZF9sb3dlcic6IFVuaWZvcm0yZixcbiAgICAndV9zY2FsZSc6IFVuaWZvcm00ZixcbiAgICAndV9mYWRlJzogVW5pZm9ybTFmXG58fTtcblxuZXhwb3J0IHR5cGUgRmlsbE91dGxpbmVQYXR0ZXJuVW5pZm9ybXNUeXBlID0ge3xcbiAgICAndV9tYXRyaXgnOiBVbmlmb3JtTWF0cml4NGYsXG4gICAgJ3Vfd29ybGQnOiBVbmlmb3JtMmYsXG4gICAgLy8gcGF0dGVybiB1bmlmb3JtczpcbiAgICAndV90ZXhzaXplJzogVW5pZm9ybTJmLFxuICAgICd1X2ltYWdlJzogVW5pZm9ybTFpLFxuICAgICd1X3BpeGVsX2Nvb3JkX3VwcGVyJzogVW5pZm9ybTJmLFxuICAgICd1X3BpeGVsX2Nvb3JkX2xvd2VyJzogVW5pZm9ybTJmLFxuICAgICd1X3NjYWxlJzogVW5pZm9ybTRmLFxuICAgICd1X2ZhZGUnOiBVbmlmb3JtMWZcbnx9O1xuXG5jb25zdCBmaWxsVW5pZm9ybXMgPSAoY29udGV4dDogQ29udGV4dCwgbG9jYXRpb25zOiBVbmlmb3JtTG9jYXRpb25zKTogRmlsbFVuaWZvcm1zVHlwZSA9PiAoe1xuICAgICd1X21hdHJpeCc6IG5ldyBVbmlmb3JtTWF0cml4NGYoY29udGV4dCwgbG9jYXRpb25zLnVfbWF0cml4KVxufSk7XG5cbmNvbnN0IGZpbGxQYXR0ZXJuVW5pZm9ybXMgPSAoY29udGV4dDogQ29udGV4dCwgbG9jYXRpb25zOiBVbmlmb3JtTG9jYXRpb25zKTogRmlsbFBhdHRlcm5Vbmlmb3Jtc1R5cGUgPT4gKHtcbiAgICAndV9tYXRyaXgnOiBuZXcgVW5pZm9ybU1hdHJpeDRmKGNvbnRleHQsIGxvY2F0aW9ucy51X21hdHJpeCksXG4gICAgJ3VfaW1hZ2UnOiBuZXcgVW5pZm9ybTFpKGNvbnRleHQsIGxvY2F0aW9ucy51X2ltYWdlKSxcbiAgICAndV90ZXhzaXplJzogbmV3IFVuaWZvcm0yZihjb250ZXh0LCBsb2NhdGlvbnMudV90ZXhzaXplKSxcbiAgICAndV9waXhlbF9jb29yZF91cHBlcic6IG5ldyBVbmlmb3JtMmYoY29udGV4dCwgbG9jYXRpb25zLnVfcGl4ZWxfY29vcmRfdXBwZXIpLFxuICAgICd1X3BpeGVsX2Nvb3JkX2xvd2VyJzogbmV3IFVuaWZvcm0yZihjb250ZXh0LCBsb2NhdGlvbnMudV9waXhlbF9jb29yZF9sb3dlciksXG4gICAgJ3Vfc2NhbGUnOiBuZXcgVW5pZm9ybTRmKGNvbnRleHQsIGxvY2F0aW9ucy51X3NjYWxlKSxcbiAgICAndV9mYWRlJzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9mYWRlKVxuXG59KTtcblxuY29uc3QgZmlsbE91dGxpbmVVbmlmb3JtcyA9IChjb250ZXh0OiBDb250ZXh0LCBsb2NhdGlvbnM6IFVuaWZvcm1Mb2NhdGlvbnMpOiBGaWxsT3V0bGluZVVuaWZvcm1zVHlwZSA9PiAoe1xuICAgICd1X21hdHJpeCc6IG5ldyBVbmlmb3JtTWF0cml4NGYoY29udGV4dCwgbG9jYXRpb25zLnVfbWF0cml4KSxcbiAgICAndV93b3JsZCc6IG5ldyBVbmlmb3JtMmYoY29udGV4dCwgbG9jYXRpb25zLnVfd29ybGQpXG59KTtcblxuY29uc3QgZmlsbE91dGxpbmVQYXR0ZXJuVW5pZm9ybXMgPSAoY29udGV4dDogQ29udGV4dCwgbG9jYXRpb25zOiBVbmlmb3JtTG9jYXRpb25zKTogRmlsbE91dGxpbmVQYXR0ZXJuVW5pZm9ybXNUeXBlID0+ICh7XG4gICAgJ3VfbWF0cml4JzogbmV3IFVuaWZvcm1NYXRyaXg0Zihjb250ZXh0LCBsb2NhdGlvbnMudV9tYXRyaXgpLFxuICAgICd1X3dvcmxkJzogbmV3IFVuaWZvcm0yZihjb250ZXh0LCBsb2NhdGlvbnMudV93b3JsZCksXG4gICAgJ3VfaW1hZ2UnOiBuZXcgVW5pZm9ybTFpKGNvbnRleHQsIGxvY2F0aW9ucy51X2ltYWdlKSxcbiAgICAndV90ZXhzaXplJzogbmV3IFVuaWZvcm0yZihjb250ZXh0LCBsb2NhdGlvbnMudV90ZXhzaXplKSxcbiAgICAndV9waXhlbF9jb29yZF91cHBlcic6IG5ldyBVbmlmb3JtMmYoY29udGV4dCwgbG9jYXRpb25zLnVfcGl4ZWxfY29vcmRfdXBwZXIpLFxuICAgICd1X3BpeGVsX2Nvb3JkX2xvd2VyJzogbmV3IFVuaWZvcm0yZihjb250ZXh0LCBsb2NhdGlvbnMudV9waXhlbF9jb29yZF9sb3dlciksXG4gICAgJ3Vfc2NhbGUnOiBuZXcgVW5pZm9ybTRmKGNvbnRleHQsIGxvY2F0aW9ucy51X3NjYWxlKSxcbiAgICAndV9mYWRlJzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9mYWRlKVxufSk7XG5cbmNvbnN0IGZpbGxVbmlmb3JtVmFsdWVzID0gKG1hdHJpeDogRmxvYXQzMkFycmF5KTogVW5pZm9ybVZhbHVlczxGaWxsVW5pZm9ybXNUeXBlPiA9PiAoe1xuICAgICd1X21hdHJpeCc6IG1hdHJpeFxufSk7XG5cbmNvbnN0IGZpbGxQYXR0ZXJuVW5pZm9ybVZhbHVlcyA9IChcbiAgICBtYXRyaXg6IEZsb2F0MzJBcnJheSxcbiAgICBwYWludGVyOiBQYWludGVyLFxuICAgIGNyb3NzZmFkZTogQ3Jvc3NmYWRlUGFyYW1ldGVycyxcbiAgICB0aWxlOiBUaWxlXG4pOiBVbmlmb3JtVmFsdWVzPEZpbGxQYXR0ZXJuVW5pZm9ybXNUeXBlPiA9PiBleHRlbmQoXG4gICAgZmlsbFVuaWZvcm1WYWx1ZXMobWF0cml4KSxcbiAgICBwYXR0ZXJuVW5pZm9ybVZhbHVlcyhjcm9zc2ZhZGUsIHBhaW50ZXIsIHRpbGUpXG4pO1xuXG5jb25zdCBmaWxsT3V0bGluZVVuaWZvcm1WYWx1ZXMgPSAoXG4gICAgbWF0cml4OiBGbG9hdDMyQXJyYXksXG4gICAgZHJhd2luZ0J1ZmZlclNpemU6IFtudW1iZXIsIG51bWJlcl1cbik6IFVuaWZvcm1WYWx1ZXM8RmlsbE91dGxpbmVVbmlmb3Jtc1R5cGU+ID0+ICh7XG4gICAgJ3VfbWF0cml4JzogbWF0cml4LFxuICAgICd1X3dvcmxkJzogZHJhd2luZ0J1ZmZlclNpemVcbn0pO1xuXG5jb25zdCBmaWxsT3V0bGluZVBhdHRlcm5Vbmlmb3JtVmFsdWVzID0gKFxuICAgIG1hdHJpeDogRmxvYXQzMkFycmF5LFxuICAgIHBhaW50ZXI6IFBhaW50ZXIsXG4gICAgY3Jvc3NmYWRlOiBDcm9zc2ZhZGVQYXJhbWV0ZXJzLFxuICAgIHRpbGU6IFRpbGUsXG4gICAgZHJhd2luZ0J1ZmZlclNpemU6IFtudW1iZXIsIG51bWJlcl1cbik6IFVuaWZvcm1WYWx1ZXM8RmlsbE91dGxpbmVQYXR0ZXJuVW5pZm9ybXNUeXBlPiA9PiBleHRlbmQoXG4gICAgZmlsbFBhdHRlcm5Vbmlmb3JtVmFsdWVzKG1hdHJpeCwgcGFpbnRlciwgY3Jvc3NmYWRlLCB0aWxlKSxcbiAgICB7XG4gICAgICAgICd1X3dvcmxkJzogZHJhd2luZ0J1ZmZlclNpemVcbiAgICB9XG4pO1xuXG5leHBvcnQge1xuICAgIGZpbGxVbmlmb3JtcyxcbiAgICBmaWxsUGF0dGVyblVuaWZvcm1zLFxuICAgIGZpbGxPdXRsaW5lVW5pZm9ybXMsXG4gICAgZmlsbE91dGxpbmVQYXR0ZXJuVW5pZm9ybXMsXG4gICAgZmlsbFVuaWZvcm1WYWx1ZXMsXG4gICAgZmlsbFBhdHRlcm5Vbmlmb3JtVmFsdWVzLFxuICAgIGZpbGxPdXRsaW5lVW5pZm9ybVZhbHVlcyxcbiAgICBmaWxsT3V0bGluZVBhdHRlcm5Vbmlmb3JtVmFsdWVzXG59O1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHtcbiAgICBVbmlmb3JtMWksXG4gICAgVW5pZm9ybTFmLFxuICAgIFVuaWZvcm0yZixcbiAgICBVbmlmb3JtTWF0cml4NGZcbn0gZnJvbSAnLi4vdW5pZm9ybV9iaW5kaW5nJztcbmltcG9ydCBwaXhlbHNUb1RpbGVVbml0cyBmcm9tICcuLi8uLi9zb3VyY2UvcGl4ZWxzX3RvX3RpbGVfdW5pdHMnO1xuXG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gJy4uLy4uL2dsL2NvbnRleHQnO1xuaW1wb3J0IHR5cGUge1VuaWZvcm1WYWx1ZXMsIFVuaWZvcm1Mb2NhdGlvbnN9IGZyb20gJy4uL3VuaWZvcm1fYmluZGluZyc7XG5pbXBvcnQgdHlwZSB7T3ZlcnNjYWxlZFRpbGVJRH0gZnJvbSAnLi4vLi4vc291cmNlL3RpbGVfaWQnO1xuaW1wb3J0IHR5cGUgVGlsZSBmcm9tICcuLi8uLi9zb3VyY2UvdGlsZSc7XG5pbXBvcnQgdHlwZSBDaXJjbGVTdHlsZUxheWVyIGZyb20gJy4uLy4uL3N0eWxlL3N0eWxlX2xheWVyL2NpcmNsZV9zdHlsZV9sYXllcic7XG5pbXBvcnQgdHlwZSBQYWludGVyIGZyb20gJy4uL3BhaW50ZXInO1xuXG5leHBvcnQgdHlwZSBDaXJjbGVVbmlmb3Jtc1R5cGUgPSB7fFxuICAgICd1X2NhbWVyYV90b19jZW50ZXJfZGlzdGFuY2UnOiBVbmlmb3JtMWYsXG4gICAgJ3Vfc2NhbGVfd2l0aF9tYXAnOiBVbmlmb3JtMWksXG4gICAgJ3VfcGl0Y2hfd2l0aF9tYXAnOiBVbmlmb3JtMWksXG4gICAgJ3VfZXh0cnVkZV9zY2FsZSc6IFVuaWZvcm0yZixcbiAgICAndV9tYXRyaXgnOiBVbmlmb3JtTWF0cml4NGZcbnx9O1xuXG5jb25zdCBjaXJjbGVVbmlmb3JtcyA9IChjb250ZXh0OiBDb250ZXh0LCBsb2NhdGlvbnM6IFVuaWZvcm1Mb2NhdGlvbnMpOiBDaXJjbGVVbmlmb3Jtc1R5cGUgPT4gKHtcbiAgICAndV9jYW1lcmFfdG9fY2VudGVyX2Rpc3RhbmNlJzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9jYW1lcmFfdG9fY2VudGVyX2Rpc3RhbmNlKSxcbiAgICAndV9zY2FsZV93aXRoX21hcCc6IG5ldyBVbmlmb3JtMWkoY29udGV4dCwgbG9jYXRpb25zLnVfc2NhbGVfd2l0aF9tYXApLFxuICAgICd1X3BpdGNoX3dpdGhfbWFwJzogbmV3IFVuaWZvcm0xaShjb250ZXh0LCBsb2NhdGlvbnMudV9waXRjaF93aXRoX21hcCksXG4gICAgJ3VfZXh0cnVkZV9zY2FsZSc6IG5ldyBVbmlmb3JtMmYoY29udGV4dCwgbG9jYXRpb25zLnVfZXh0cnVkZV9zY2FsZSksXG4gICAgJ3VfbWF0cml4JzogbmV3IFVuaWZvcm1NYXRyaXg0Zihjb250ZXh0LCBsb2NhdGlvbnMudV9tYXRyaXgpXG59KTtcblxuY29uc3QgY2lyY2xlVW5pZm9ybVZhbHVlcyA9IChcbiAgICBwYWludGVyOiBQYWludGVyLFxuICAgIGNvb3JkOiBPdmVyc2NhbGVkVGlsZUlELFxuICAgIHRpbGU6IFRpbGUsXG4gICAgbGF5ZXI6IENpcmNsZVN0eWxlTGF5ZXJcbik6IFVuaWZvcm1WYWx1ZXM8Q2lyY2xlVW5pZm9ybXNUeXBlPiA9PiB7XG4gICAgY29uc3QgdHJhbnNmb3JtID0gcGFpbnRlci50cmFuc2Zvcm07XG5cbiAgICBsZXQgcGl0Y2hXaXRoTWFwOiBib29sZWFuLCBleHRydWRlU2NhbGU6IFtudW1iZXIsIG51bWJlcl07XG4gICAgaWYgKGxheWVyLnBhaW50LmdldCgnY2lyY2xlLXBpdGNoLWFsaWdubWVudCcpID09PSAnbWFwJykge1xuICAgICAgICBjb25zdCBwaXhlbFJhdGlvID0gcGl4ZWxzVG9UaWxlVW5pdHModGlsZSwgMSwgdHJhbnNmb3JtLnpvb20pO1xuICAgICAgICBwaXRjaFdpdGhNYXAgPSB0cnVlO1xuICAgICAgICBleHRydWRlU2NhbGUgPSBbcGl4ZWxSYXRpbywgcGl4ZWxSYXRpb107XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcGl0Y2hXaXRoTWFwID0gZmFsc2U7XG4gICAgICAgIGV4dHJ1ZGVTY2FsZSA9IHRyYW5zZm9ybS5waXhlbHNUb0dMVW5pdHM7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgJ3VfY2FtZXJhX3RvX2NlbnRlcl9kaXN0YW5jZSc6IHRyYW5zZm9ybS5jYW1lcmFUb0NlbnRlckRpc3RhbmNlLFxuICAgICAgICAndV9zY2FsZV93aXRoX21hcCc6ICsobGF5ZXIucGFpbnQuZ2V0KCdjaXJjbGUtcGl0Y2gtc2NhbGUnKSA9PT0gJ21hcCcpLFxuICAgICAgICAndV9tYXRyaXgnOiBwYWludGVyLnRyYW5zbGF0ZVBvc01hdHJpeChcbiAgICAgICAgICAgIGNvb3JkLnBvc01hdHJpeCxcbiAgICAgICAgICAgIHRpbGUsXG4gICAgICAgICAgICBsYXllci5wYWludC5nZXQoJ2NpcmNsZS10cmFuc2xhdGUnKSxcbiAgICAgICAgICAgIGxheWVyLnBhaW50LmdldCgnY2lyY2xlLXRyYW5zbGF0ZS1hbmNob3InKSksXG4gICAgICAgICd1X3BpdGNoX3dpdGhfbWFwJzogKyhwaXRjaFdpdGhNYXApLFxuICAgICAgICAndV9leHRydWRlX3NjYWxlJzogZXh0cnVkZVNjYWxlXG4gICAgfTtcbn07XG5cbmV4cG9ydCB7IGNpcmNsZVVuaWZvcm1zLCBjaXJjbGVVbmlmb3JtVmFsdWVzIH07XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge1xuICAgIFVuaWZvcm0xZixcbiAgICBVbmlmb3JtMmYsXG4gICAgVW5pZm9ybU1hdHJpeDRmXG59IGZyb20gJy4uL3VuaWZvcm1fYmluZGluZyc7XG5pbXBvcnQgcGl4ZWxzVG9UaWxlVW5pdHMgZnJvbSAnLi4vLi4vc291cmNlL3BpeGVsc190b190aWxlX3VuaXRzJztcblxuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tICcuLi8uLi9nbC9jb250ZXh0JztcbmltcG9ydCB0eXBlIHtVbmlmb3JtVmFsdWVzLCBVbmlmb3JtTG9jYXRpb25zfSBmcm9tICcuLi91bmlmb3JtX2JpbmRpbmcnO1xuaW1wb3J0IHR5cGUgVHJhbnNmb3JtIGZyb20gJy4uLy4uL2dlby90cmFuc2Zvcm0nO1xuaW1wb3J0IHR5cGUgVGlsZSBmcm9tICcuLi8uLi9zb3VyY2UvdGlsZSc7XG5cbmV4cG9ydCB0eXBlIENvbGxpc2lvblVuaWZvcm1zVHlwZSA9IHt8XG4gICAgJ3VfbWF0cml4JzogVW5pZm9ybU1hdHJpeDRmLFxuICAgICd1X2NhbWVyYV90b19jZW50ZXJfZGlzdGFuY2UnOiBVbmlmb3JtMWYsXG4gICAgJ3VfcGl4ZWxzX3RvX3RpbGVfdW5pdHMnOiBVbmlmb3JtMWYsXG4gICAgJ3VfZXh0cnVkZV9zY2FsZSc6IFVuaWZvcm0yZixcbiAgICAndV9vdmVyc2NhbGVfZmFjdG9yJzogVW5pZm9ybTFmXG58fTtcblxuY29uc3QgY29sbGlzaW9uVW5pZm9ybXMgPSAoY29udGV4dDogQ29udGV4dCwgbG9jYXRpb25zOiBVbmlmb3JtTG9jYXRpb25zKTogQ29sbGlzaW9uVW5pZm9ybXNUeXBlID0+ICh7XG4gICAgJ3VfbWF0cml4JzogbmV3IFVuaWZvcm1NYXRyaXg0Zihjb250ZXh0LCBsb2NhdGlvbnMudV9tYXRyaXgpLFxuICAgICd1X2NhbWVyYV90b19jZW50ZXJfZGlzdGFuY2UnOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X2NhbWVyYV90b19jZW50ZXJfZGlzdGFuY2UpLFxuICAgICd1X3BpeGVsc190b190aWxlX3VuaXRzJzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9waXhlbHNfdG9fdGlsZV91bml0cyksXG4gICAgJ3VfZXh0cnVkZV9zY2FsZSc6IG5ldyBVbmlmb3JtMmYoY29udGV4dCwgbG9jYXRpb25zLnVfZXh0cnVkZV9zY2FsZSksXG4gICAgJ3Vfb3ZlcnNjYWxlX2ZhY3Rvcic6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfb3ZlcnNjYWxlX2ZhY3Rvcilcbn0pO1xuXG5jb25zdCBjb2xsaXNpb25Vbmlmb3JtVmFsdWVzID0gKFxuICAgIG1hdHJpeDogRmxvYXQzMkFycmF5LFxuICAgIHRyYW5zZm9ybTogVHJhbnNmb3JtLFxuICAgIHRpbGU6IFRpbGVcbik6IFVuaWZvcm1WYWx1ZXM8Q29sbGlzaW9uVW5pZm9ybXNUeXBlPiA9PiB7XG4gICAgY29uc3QgcGl4ZWxSYXRpbyA9IHBpeGVsc1RvVGlsZVVuaXRzKHRpbGUsIDEsIHRyYW5zZm9ybS56b29tKTtcbiAgICBjb25zdCBzY2FsZSA9IE1hdGgucG93KDIsIHRyYW5zZm9ybS56b29tIC0gdGlsZS50aWxlSUQub3ZlcnNjYWxlZFopO1xuICAgIGNvbnN0IG92ZXJzY2FsZUZhY3RvciA9IHRpbGUudGlsZUlELm92ZXJzY2FsZUZhY3RvcigpO1xuICAgIHJldHVybiB7XG4gICAgICAgICd1X21hdHJpeCc6IG1hdHJpeCxcbiAgICAgICAgJ3VfY2FtZXJhX3RvX2NlbnRlcl9kaXN0YW5jZSc6IHRyYW5zZm9ybS5jYW1lcmFUb0NlbnRlckRpc3RhbmNlLFxuICAgICAgICAndV9waXhlbHNfdG9fdGlsZV91bml0cyc6IHBpeGVsUmF0aW8sXG4gICAgICAgICd1X2V4dHJ1ZGVfc2NhbGUnOiBbdHJhbnNmb3JtLnBpeGVsc1RvR0xVbml0c1swXSAvIChwaXhlbFJhdGlvICogc2NhbGUpLFxuICAgICAgICAgICAgdHJhbnNmb3JtLnBpeGVsc1RvR0xVbml0c1sxXSAvIChwaXhlbFJhdGlvICogc2NhbGUpXSxcbiAgICAgICAgJ3Vfb3ZlcnNjYWxlX2ZhY3Rvcic6IG92ZXJzY2FsZUZhY3RvclxuICAgIH07XG59O1xuXG5leHBvcnQgeyBjb2xsaXNpb25Vbmlmb3JtcywgY29sbGlzaW9uVW5pZm9ybVZhbHVlcyB9O1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHtcbiAgICBVbmlmb3JtQ29sb3IsXG4gICAgVW5pZm9ybU1hdHJpeDRmXG59IGZyb20gJy4uL3VuaWZvcm1fYmluZGluZyc7XG5cbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSAnLi4vLi4vZ2wvY29udGV4dCc7XG5pbXBvcnQgdHlwZSB7VW5pZm9ybVZhbHVlcywgVW5pZm9ybUxvY2F0aW9uc30gZnJvbSAnLi4vdW5pZm9ybV9iaW5kaW5nJztcbmltcG9ydCB0eXBlIENvbG9yIGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvdXRpbC9jb2xvcic7XG5cbmV4cG9ydCB0eXBlIERlYnVnVW5pZm9ybXNUeXBlID0ge3xcbiAgICAndV9jb2xvcic6IFVuaWZvcm1Db2xvcixcbiAgICAndV9tYXRyaXgnOiBVbmlmb3JtTWF0cml4NGZcbnx9O1xuXG5jb25zdCBkZWJ1Z1VuaWZvcm1zID0gKGNvbnRleHQ6IENvbnRleHQsIGxvY2F0aW9uczogVW5pZm9ybUxvY2F0aW9ucyk6IERlYnVnVW5pZm9ybXNUeXBlID0+ICh7XG4gICAgJ3VfY29sb3InOiBuZXcgVW5pZm9ybUNvbG9yKGNvbnRleHQsIGxvY2F0aW9ucy51X2NvbG9yKSxcbiAgICAndV9tYXRyaXgnOiBuZXcgVW5pZm9ybU1hdHJpeDRmKGNvbnRleHQsIGxvY2F0aW9ucy51X21hdHJpeClcbn0pO1xuXG5jb25zdCBkZWJ1Z1VuaWZvcm1WYWx1ZXMgPSAobWF0cml4OiBGbG9hdDMyQXJyYXksIGNvbG9yOiBDb2xvcik6IFVuaWZvcm1WYWx1ZXM8RGVidWdVbmlmb3Jtc1R5cGU+ID0+ICh7XG4gICAgJ3VfbWF0cml4JzogbWF0cml4LFxuICAgICd1X2NvbG9yJzogY29sb3Jcbn0pO1xuXG5leHBvcnQgeyBkZWJ1Z1VuaWZvcm1zLCBkZWJ1Z1VuaWZvcm1WYWx1ZXMgfTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7IFVuaWZvcm1NYXRyaXg0ZiB9IGZyb20gJy4uL3VuaWZvcm1fYmluZGluZyc7XG5cbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSAnLi4vLi4vZ2wvY29udGV4dCc7XG5pbXBvcnQgdHlwZSB7VW5pZm9ybVZhbHVlcywgVW5pZm9ybUxvY2F0aW9uc30gZnJvbSAnLi4vdW5pZm9ybV9iaW5kaW5nJztcblxuZXhwb3J0IHR5cGUgQ2xpcHBpbmdNYXNrVW5pZm9ybXNUeXBlID0ge3xcbiAgICAndV9tYXRyaXgnOiBVbmlmb3JtTWF0cml4NGZcbnx9O1xuXG5jb25zdCBjbGlwcGluZ01hc2tVbmlmb3JtcyA9IChjb250ZXh0OiBDb250ZXh0LCBsb2NhdGlvbnM6IFVuaWZvcm1Mb2NhdGlvbnMpOiBDbGlwcGluZ01hc2tVbmlmb3Jtc1R5cGUgPT4gKHtcbiAgICAndV9tYXRyaXgnOiBuZXcgVW5pZm9ybU1hdHJpeDRmKGNvbnRleHQsIGxvY2F0aW9ucy51X21hdHJpeClcbn0pO1xuXG5jb25zdCBjbGlwcGluZ01hc2tVbmlmb3JtVmFsdWVzID0gKG1hdHJpeDogRmxvYXQzMkFycmF5KTogVW5pZm9ybVZhbHVlczxDbGlwcGluZ01hc2tVbmlmb3Jtc1R5cGU+ID0+ICh7XG4gICAgJ3VfbWF0cml4JzogbWF0cml4XG59KTtcblxuZXhwb3J0IHsgY2xpcHBpbmdNYXNrVW5pZm9ybXMsIGNsaXBwaW5nTWFza1VuaWZvcm1WYWx1ZXMgfTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7IG1hdDQgfSBmcm9tICdnbC1tYXRyaXgnO1xuXG5pbXBvcnQge1xuICAgIFVuaWZvcm0xaSxcbiAgICBVbmlmb3JtMWYsXG4gICAgVW5pZm9ybTJmLFxuICAgIFVuaWZvcm1NYXRyaXg0ZlxufSBmcm9tICcuLi91bmlmb3JtX2JpbmRpbmcnO1xuaW1wb3J0IHBpeGVsc1RvVGlsZVVuaXRzIGZyb20gJy4uLy4uL3NvdXJjZS9waXhlbHNfdG9fdGlsZV91bml0cyc7XG5cbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSAnLi4vLi4vZ2wvY29udGV4dCc7XG5pbXBvcnQgdHlwZSBUaWxlIGZyb20gJy4uLy4uL3NvdXJjZS90aWxlJztcbmltcG9ydCB0eXBlIHtVbmlmb3JtVmFsdWVzLCBVbmlmb3JtTG9jYXRpb25zfSBmcm9tICcuLi91bmlmb3JtX2JpbmRpbmcnO1xuaW1wb3J0IHR5cGUgUGFpbnRlciBmcm9tICcuLi9wYWludGVyJztcbmltcG9ydCB0eXBlIEhlYXRtYXBTdHlsZUxheWVyIGZyb20gJy4uLy4uL3N0eWxlL3N0eWxlX2xheWVyL2hlYXRtYXBfc3R5bGVfbGF5ZXInO1xuXG5leHBvcnQgdHlwZSBIZWF0bWFwVW5pZm9ybXNUeXBlID0ge3xcbiAgICAndV9leHRydWRlX3NjYWxlJzogVW5pZm9ybTFmLFxuICAgICd1X2ludGVuc2l0eSc6IFVuaWZvcm0xZixcbiAgICAndV9tYXRyaXgnOiBVbmlmb3JtTWF0cml4NGZcbnx9O1xuXG5leHBvcnQgdHlwZSBIZWF0bWFwVGV4dHVyZVVuaWZvcm1zVHlwZSA9IHt8XG4gICAgJ3VfbWF0cml4JzogVW5pZm9ybU1hdHJpeDRmLFxuICAgICd1X3dvcmxkJzogVW5pZm9ybTJmLFxuICAgICd1X2ltYWdlJzogVW5pZm9ybTFpLFxuICAgICd1X2NvbG9yX3JhbXAnOiBVbmlmb3JtMWksXG4gICAgJ3Vfb3BhY2l0eSc6IFVuaWZvcm0xZlxufH07XG5cbmNvbnN0IGhlYXRtYXBVbmlmb3JtcyA9IChjb250ZXh0OiBDb250ZXh0LCBsb2NhdGlvbnM6IFVuaWZvcm1Mb2NhdGlvbnMpOiBIZWF0bWFwVW5pZm9ybXNUeXBlID0+ICh7XG4gICAgJ3VfZXh0cnVkZV9zY2FsZSc6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfZXh0cnVkZV9zY2FsZSksXG4gICAgJ3VfaW50ZW5zaXR5JzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9pbnRlbnNpdHkpLFxuICAgICd1X21hdHJpeCc6IG5ldyBVbmlmb3JtTWF0cml4NGYoY29udGV4dCwgbG9jYXRpb25zLnVfbWF0cml4KVxufSk7XG5cbmNvbnN0IGhlYXRtYXBUZXh0dXJlVW5pZm9ybXMgPSAoY29udGV4dDogQ29udGV4dCwgbG9jYXRpb25zOiBVbmlmb3JtTG9jYXRpb25zKTogSGVhdG1hcFRleHR1cmVVbmlmb3Jtc1R5cGUgPT4gKHtcbiAgICAndV9tYXRyaXgnOiBuZXcgVW5pZm9ybU1hdHJpeDRmKGNvbnRleHQsIGxvY2F0aW9ucy51X21hdHJpeCksXG4gICAgJ3Vfd29ybGQnOiBuZXcgVW5pZm9ybTJmKGNvbnRleHQsIGxvY2F0aW9ucy51X3dvcmxkKSxcbiAgICAndV9pbWFnZSc6IG5ldyBVbmlmb3JtMWkoY29udGV4dCwgbG9jYXRpb25zLnVfaW1hZ2UpLFxuICAgICd1X2NvbG9yX3JhbXAnOiBuZXcgVW5pZm9ybTFpKGNvbnRleHQsIGxvY2F0aW9ucy51X2NvbG9yX3JhbXApLFxuICAgICd1X29wYWNpdHknOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X29wYWNpdHkpXG59KTtcblxuY29uc3QgaGVhdG1hcFVuaWZvcm1WYWx1ZXMgPSAoXG4gICAgbWF0cml4OiBGbG9hdDMyQXJyYXksXG4gICAgdGlsZTogVGlsZSxcbiAgICB6b29tOiBudW1iZXIsXG4gICAgaW50ZW5zaXR5OiBudW1iZXJcbik6IFVuaWZvcm1WYWx1ZXM8SGVhdG1hcFVuaWZvcm1zVHlwZT4gPT4gKHtcbiAgICAndV9tYXRyaXgnOiBtYXRyaXgsXG4gICAgJ3VfZXh0cnVkZV9zY2FsZSc6IHBpeGVsc1RvVGlsZVVuaXRzKHRpbGUsIDEsIHpvb20pLFxuICAgICd1X2ludGVuc2l0eSc6IGludGVuc2l0eVxufSk7XG5cbmNvbnN0IGhlYXRtYXBUZXh0dXJlVW5pZm9ybVZhbHVlcyA9IChcbiAgICBwYWludGVyOiBQYWludGVyLFxuICAgIGxheWVyOiBIZWF0bWFwU3R5bGVMYXllcixcbiAgICB0ZXh0dXJlVW5pdDogbnVtYmVyLFxuICAgIGNvbG9yUmFtcFVuaXQ6IG51bWJlclxuKTogVW5pZm9ybVZhbHVlczxIZWF0bWFwVGV4dHVyZVVuaWZvcm1zVHlwZT4gPT4ge1xuICAgIGNvbnN0IG1hdHJpeCA9IG1hdDQuY3JlYXRlKCk7XG4gICAgbWF0NC5vcnRobyhtYXRyaXgsIDAsIHBhaW50ZXIud2lkdGgsIHBhaW50ZXIuaGVpZ2h0LCAwLCAwLCAxKTtcblxuICAgIGNvbnN0IGdsID0gcGFpbnRlci5jb250ZXh0LmdsO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgJ3VfbWF0cml4JzogbWF0cml4LFxuICAgICAgICAndV93b3JsZCc6IFtnbC5kcmF3aW5nQnVmZmVyV2lkdGgsIGdsLmRyYXdpbmdCdWZmZXJIZWlnaHRdLFxuICAgICAgICAndV9pbWFnZSc6IHRleHR1cmVVbml0LFxuICAgICAgICAndV9jb2xvcl9yYW1wJzogY29sb3JSYW1wVW5pdCxcbiAgICAgICAgJ3Vfb3BhY2l0eSc6IGxheWVyLnBhaW50LmdldCgnaGVhdG1hcC1vcGFjaXR5JylcbiAgICB9O1xufTtcblxuZXhwb3J0IHtcbiAgICBoZWF0bWFwVW5pZm9ybXMsXG4gICAgaGVhdG1hcFRleHR1cmVVbmlmb3JtcyxcbiAgICBoZWF0bWFwVW5pZm9ybVZhbHVlcyxcbiAgICBoZWF0bWFwVGV4dHVyZVVuaWZvcm1WYWx1ZXNcbn07XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgeyBtYXQ0IH0gZnJvbSAnZ2wtbWF0cml4JztcblxuaW1wb3J0IHtcbiAgICBVbmlmb3JtMWksXG4gICAgVW5pZm9ybTFmLFxuICAgIFVuaWZvcm0yZixcbiAgICBVbmlmb3JtQ29sb3IsXG4gICAgVW5pZm9ybU1hdHJpeDRmXG59IGZyb20gJy4uL3VuaWZvcm1fYmluZGluZyc7XG5pbXBvcnQgRVhURU5UIGZyb20gJy4uLy4uL2RhdGEvZXh0ZW50JztcbmltcG9ydCBNZXJjYXRvckNvb3JkaW5hdGUgZnJvbSAnLi4vLi4vZ2VvL21lcmNhdG9yX2Nvb3JkaW5hdGUnO1xuXG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gJy4uLy4uL2dsL2NvbnRleHQnO1xuaW1wb3J0IHR5cGUge1VuaWZvcm1WYWx1ZXMsIFVuaWZvcm1Mb2NhdGlvbnN9IGZyb20gJy4uL3VuaWZvcm1fYmluZGluZyc7XG5pbXBvcnQgdHlwZSBUaWxlIGZyb20gJy4uLy4uL3NvdXJjZS90aWxlJztcbmltcG9ydCB0eXBlIFBhaW50ZXIgZnJvbSAnLi4vcGFpbnRlcic7XG5pbXBvcnQgdHlwZSBIaWxsc2hhZGVTdHlsZUxheWVyIGZyb20gJy4uLy4uL3N0eWxlL3N0eWxlX2xheWVyL2hpbGxzaGFkZV9zdHlsZV9sYXllcic7XG5pbXBvcnQgdHlwZSBERU1EYXRhIGZyb20gJy4uLy4uL2RhdGEvZGVtX2RhdGEnO1xuaW1wb3J0IHR5cGUge092ZXJzY2FsZWRUaWxlSUR9IGZyb20gJy4uLy4uL3NvdXJjZS90aWxlX2lkJztcblxuZXhwb3J0IHR5cGUgSGlsbHNoYWRlVW5pZm9ybXNUeXBlID0ge3xcbiAgICAndV9tYXRyaXgnOiBVbmlmb3JtTWF0cml4NGYsXG4gICAgJ3VfaW1hZ2UnOiBVbmlmb3JtMWksXG4gICAgJ3VfbGF0cmFuZ2UnOiBVbmlmb3JtMmYsXG4gICAgJ3VfbGlnaHQnOiBVbmlmb3JtMmYsXG4gICAgJ3Vfc2hhZG93JzogVW5pZm9ybUNvbG9yLFxuICAgICd1X2hpZ2hsaWdodCc6IFVuaWZvcm1Db2xvcixcbiAgICAndV9hY2NlbnQnOiBVbmlmb3JtQ29sb3Jcbnx9O1xuXG5leHBvcnQgdHlwZSBIaWxsc2hhZGVQcmVwYXJlVW5pZm9ybXNUeXBlID0ge3xcbiAgICAndV9tYXRyaXgnOiBVbmlmb3JtTWF0cml4NGYsXG4gICAgJ3VfaW1hZ2UnOiBVbmlmb3JtMWksXG4gICAgJ3VfZGltZW5zaW9uJzogVW5pZm9ybTJmLFxuICAgICd1X3pvb20nOiBVbmlmb3JtMWYsXG4gICAgJ3VfbWF4em9vbSc6IFVuaWZvcm0xZlxufH07XG5cbmNvbnN0IGhpbGxzaGFkZVVuaWZvcm1zID0gKGNvbnRleHQ6IENvbnRleHQsIGxvY2F0aW9uczogVW5pZm9ybUxvY2F0aW9ucyk6IEhpbGxzaGFkZVVuaWZvcm1zVHlwZSA9PiAoe1xuICAgICd1X21hdHJpeCc6IG5ldyBVbmlmb3JtTWF0cml4NGYoY29udGV4dCwgbG9jYXRpb25zLnVfbWF0cml4KSxcbiAgICAndV9pbWFnZSc6IG5ldyBVbmlmb3JtMWkoY29udGV4dCwgbG9jYXRpb25zLnVfaW1hZ2UpLFxuICAgICd1X2xhdHJhbmdlJzogbmV3IFVuaWZvcm0yZihjb250ZXh0LCBsb2NhdGlvbnMudV9sYXRyYW5nZSksXG4gICAgJ3VfbGlnaHQnOiBuZXcgVW5pZm9ybTJmKGNvbnRleHQsIGxvY2F0aW9ucy51X2xpZ2h0KSxcbiAgICAndV9zaGFkb3cnOiBuZXcgVW5pZm9ybUNvbG9yKGNvbnRleHQsIGxvY2F0aW9ucy51X3NoYWRvdyksXG4gICAgJ3VfaGlnaGxpZ2h0JzogbmV3IFVuaWZvcm1Db2xvcihjb250ZXh0LCBsb2NhdGlvbnMudV9oaWdobGlnaHQpLFxuICAgICd1X2FjY2VudCc6IG5ldyBVbmlmb3JtQ29sb3IoY29udGV4dCwgbG9jYXRpb25zLnVfYWNjZW50KVxufSk7XG5cbmNvbnN0IGhpbGxzaGFkZVByZXBhcmVVbmlmb3JtcyA9IChjb250ZXh0OiBDb250ZXh0LCBsb2NhdGlvbnM6IFVuaWZvcm1Mb2NhdGlvbnMpOiBIaWxsc2hhZGVQcmVwYXJlVW5pZm9ybXNUeXBlID0+ICh7XG4gICAgJ3VfbWF0cml4JzogbmV3IFVuaWZvcm1NYXRyaXg0Zihjb250ZXh0LCBsb2NhdGlvbnMudV9tYXRyaXgpLFxuICAgICd1X2ltYWdlJzogbmV3IFVuaWZvcm0xaShjb250ZXh0LCBsb2NhdGlvbnMudV9pbWFnZSksXG4gICAgJ3VfZGltZW5zaW9uJzogbmV3IFVuaWZvcm0yZihjb250ZXh0LCBsb2NhdGlvbnMudV9kaW1lbnNpb24pLFxuICAgICd1X3pvb20nOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X3pvb20pLFxuICAgICd1X21heHpvb20nOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X21heHpvb20pXG59KTtcblxuY29uc3QgaGlsbHNoYWRlVW5pZm9ybVZhbHVlcyA9IChcbiAgICBwYWludGVyOiBQYWludGVyLFxuICAgIHRpbGU6IFRpbGUsXG4gICAgbGF5ZXI6IEhpbGxzaGFkZVN0eWxlTGF5ZXJcbik6IFVuaWZvcm1WYWx1ZXM8SGlsbHNoYWRlVW5pZm9ybXNUeXBlPiA9PiB7XG4gICAgY29uc3Qgc2hhZG93ID0gbGF5ZXIucGFpbnQuZ2V0KFwiaGlsbHNoYWRlLXNoYWRvdy1jb2xvclwiKTtcbiAgICBjb25zdCBoaWdobGlnaHQgPSBsYXllci5wYWludC5nZXQoXCJoaWxsc2hhZGUtaGlnaGxpZ2h0LWNvbG9yXCIpO1xuICAgIGNvbnN0IGFjY2VudCA9IGxheWVyLnBhaW50LmdldChcImhpbGxzaGFkZS1hY2NlbnQtY29sb3JcIik7XG5cbiAgICBsZXQgYXppbXV0aGFsID0gbGF5ZXIucGFpbnQuZ2V0KCdoaWxsc2hhZGUtaWxsdW1pbmF0aW9uLWRpcmVjdGlvbicpICogKE1hdGguUEkgLyAxODApO1xuICAgIC8vIG1vZGlmeSBhemltdXRoYWwgYW5nbGUgYnkgbWFwIHJvdGF0aW9uIGlmIGxpZ2h0IGlzIGFuY2hvcmVkIGF0IHRoZSB2aWV3cG9ydFxuICAgIGlmIChsYXllci5wYWludC5nZXQoJ2hpbGxzaGFkZS1pbGx1bWluYXRpb24tYW5jaG9yJykgPT09ICd2aWV3cG9ydCcpIHtcbiAgICAgICAgYXppbXV0aGFsIC09IHBhaW50ZXIudHJhbnNmb3JtLmFuZ2xlO1xuICAgIH1cbiAgICBjb25zdCBhbGlnbiA9ICFwYWludGVyLm9wdGlvbnMubW92aW5nO1xuICAgIHJldHVybiB7XG4gICAgICAgICd1X21hdHJpeCc6IHBhaW50ZXIudHJhbnNmb3JtLmNhbGN1bGF0ZVBvc01hdHJpeCh0aWxlLnRpbGVJRC50b1Vud3JhcHBlZCgpLCBhbGlnbiksXG4gICAgICAgICd1X2ltYWdlJzogMCxcbiAgICAgICAgJ3VfbGF0cmFuZ2UnOiBnZXRUaWxlTGF0UmFuZ2UocGFpbnRlciwgdGlsZS50aWxlSUQpLFxuICAgICAgICAndV9saWdodCc6IFtsYXllci5wYWludC5nZXQoJ2hpbGxzaGFkZS1leGFnZ2VyYXRpb24nKSwgYXppbXV0aGFsXSxcbiAgICAgICAgJ3Vfc2hhZG93Jzogc2hhZG93LFxuICAgICAgICAndV9oaWdobGlnaHQnOiBoaWdobGlnaHQsXG4gICAgICAgICd1X2FjY2VudCc6IGFjY2VudFxuICAgIH07XG59O1xuXG5jb25zdCBoaWxsc2hhZGVVbmlmb3JtUHJlcGFyZVZhbHVlcyA9IChcbiAgICB0aWxlOiB7ZGVtOiA/REVNRGF0YSwgdGlsZUlEOiBPdmVyc2NhbGVkVGlsZUlEfSwgbWF4em9vbTogbnVtYmVyXG4pOiBVbmlmb3JtVmFsdWVzPEhpbGxzaGFkZVByZXBhcmVVbmlmb3Jtc1R5cGU+ID0+IHtcbiAgICBhc3NlcnQodGlsZS5kZW0pO1xuICAgIGNvbnN0IHN0cmlkZSA9ICgodGlsZS5kZW06IGFueSk6IERFTURhdGEpLnN0cmlkZTtcbiAgICBjb25zdCBtYXRyaXggPSBtYXQ0LmNyZWF0ZSgpO1xuICAgIC8vIEZsaXAgcmVuZGVyaW5nIGF0IHkgYXhpcy5cbiAgICBtYXQ0Lm9ydGhvKG1hdHJpeCwgMCwgRVhURU5ULCAtRVhURU5ULCAwLCAwLCAxKTtcbiAgICBtYXQ0LnRyYW5zbGF0ZShtYXRyaXgsIG1hdHJpeCwgWzAsIC1FWFRFTlQsIDBdKTtcblxuICAgIHJldHVybiB7XG4gICAgICAgICd1X21hdHJpeCc6IG1hdHJpeCxcbiAgICAgICAgJ3VfaW1hZ2UnOiAxLFxuICAgICAgICAndV9kaW1lbnNpb24nOiBbc3RyaWRlLCBzdHJpZGVdLFxuICAgICAgICAndV96b29tJzogdGlsZS50aWxlSUQub3ZlcnNjYWxlZFosXG4gICAgICAgICd1X21heHpvb20nOiBtYXh6b29tXG4gICAgfTtcbn07XG5cbmZ1bmN0aW9uIGdldFRpbGVMYXRSYW5nZShwYWludGVyOiBQYWludGVyLCB0aWxlSUQ6IE92ZXJzY2FsZWRUaWxlSUQpIHtcbiAgICAvLyBmb3Igc2NhbGluZyB0aGUgbWFnbml0dWRlIG9mIGEgcG9pbnRzIHNsb3BlIGJ5IGl0cyBsYXRpdHVkZVxuICAgIGNvbnN0IHRpbGVzQXRab29tID0gTWF0aC5wb3coMiwgdGlsZUlELmNhbm9uaWNhbC56KTtcbiAgICBjb25zdCB5ID0gdGlsZUlELmNhbm9uaWNhbC55O1xuICAgIHJldHVybiBbXG4gICAgICAgIG5ldyBNZXJjYXRvckNvb3JkaW5hdGUoMCwgeSAvIHRpbGVzQXRab29tKS50b0xuZ0xhdCgpLmxhdCxcbiAgICAgICAgbmV3IE1lcmNhdG9yQ29vcmRpbmF0ZSgwLCAoeSArIDEpIC8gdGlsZXNBdFpvb20pLnRvTG5nTGF0KCkubGF0XTtcbn1cblxuZXhwb3J0IHtcbiAgICBoaWxsc2hhZGVVbmlmb3JtcyxcbiAgICBoaWxsc2hhZGVQcmVwYXJlVW5pZm9ybXMsXG4gICAgaGlsbHNoYWRlVW5pZm9ybVZhbHVlcyxcbiAgICBoaWxsc2hhZGVVbmlmb3JtUHJlcGFyZVZhbHVlc1xufTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7XG4gICAgVW5pZm9ybTFpLFxuICAgIFVuaWZvcm0xZixcbiAgICBVbmlmb3JtMmYsXG4gICAgVW5pZm9ybTRmLFxuICAgIFVuaWZvcm1NYXRyaXg0ZlxufSBmcm9tICcuLi91bmlmb3JtX2JpbmRpbmcnO1xuaW1wb3J0IHBpeGVsc1RvVGlsZVVuaXRzIGZyb20gJy4uLy4uL3NvdXJjZS9waXhlbHNfdG9fdGlsZV91bml0cyc7XG5pbXBvcnQgeyBleHRlbmQgfSBmcm9tICcuLi8uLi91dGlsL3V0aWwnO1xuaW1wb3J0IGJyb3dzZXIgZnJvbSAnLi4vLi4vdXRpbC9icm93c2VyJztcblxuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tICcuLi8uLi9nbC9jb250ZXh0JztcbmltcG9ydCB0eXBlIHtVbmlmb3JtVmFsdWVzLCBVbmlmb3JtTG9jYXRpb25zfSBmcm9tICcuLi91bmlmb3JtX2JpbmRpbmcnO1xuaW1wb3J0IHR5cGUgVHJhbnNmb3JtIGZyb20gJy4uLy4uL2dlby90cmFuc2Zvcm0nO1xuaW1wb3J0IHR5cGUgVGlsZSBmcm9tICcuLi8uLi9zb3VyY2UvdGlsZSc7XG5pbXBvcnQgdHlwZSB7Q3Jvc3NGYWRlZH0gZnJvbSAnLi4vLi4vc3R5bGUvcHJvcGVydGllcyc7XG5pbXBvcnQgdHlwZSBMaW5lU3R5bGVMYXllciBmcm9tICcuLi8uLi9zdHlsZS9zdHlsZV9sYXllci9saW5lX3N0eWxlX2xheWVyJztcbmltcG9ydCB0eXBlIFBhaW50ZXIgZnJvbSAnLi4vcGFpbnRlcic7XG5pbXBvcnQgdHlwZSB7Q3Jvc3NmYWRlUGFyYW1ldGVyc30gZnJvbSAnLi4vLi4vc3R5bGUvZXZhbHVhdGlvbl9wYXJhbWV0ZXJzJztcblxuZXhwb3J0IHR5cGUgTGluZVVuaWZvcm1zVHlwZSA9IHt8XG4gICAgJ3VfbWF0cml4JzogVW5pZm9ybU1hdHJpeDRmLFxuICAgICd1X3JhdGlvJzogVW5pZm9ybTFmLFxuICAgICd1X2dsX3VuaXRzX3RvX3BpeGVscyc6IFVuaWZvcm0yZlxufH07XG5cbmV4cG9ydCB0eXBlIExpbmVHcmFkaWVudFVuaWZvcm1zVHlwZSA9IHt8XG4gICAgJ3VfbWF0cml4JzogVW5pZm9ybU1hdHJpeDRmLFxuICAgICd1X3JhdGlvJzogVW5pZm9ybTFmLFxuICAgICd1X2dsX3VuaXRzX3RvX3BpeGVscyc6IFVuaWZvcm0yZixcbiAgICAndV9pbWFnZSc6IFVuaWZvcm0xaVxufH07XG5cbmV4cG9ydCB0eXBlIExpbmVQYXR0ZXJuVW5pZm9ybXNUeXBlID0ge3xcbiAgICAndV9tYXRyaXgnOiBVbmlmb3JtTWF0cml4NGYsXG4gICAgJ3VfdGV4c2l6ZSc6IFVuaWZvcm0yZixcbiAgICAndV9yYXRpbyc6IFVuaWZvcm0xZixcbiAgICAndV9nbF91bml0c190b19waXhlbHMnOiBVbmlmb3JtMmYsXG4gICAgJ3VfaW1hZ2UnOiBVbmlmb3JtMWksXG4gICAgJ3Vfc2NhbGUnOiBVbmlmb3JtNGYsXG4gICAgJ3VfZmFkZSc6IFVuaWZvcm0xZlxufH07XG5cbmV4cG9ydCB0eXBlIExpbmVTREZVbmlmb3Jtc1R5cGUgPSB7fFxuICAgICd1X21hdHJpeCc6IFVuaWZvcm1NYXRyaXg0ZixcbiAgICAndV9yYXRpbyc6IFVuaWZvcm0xZixcbiAgICAndV9nbF91bml0c190b19waXhlbHMnOiBVbmlmb3JtMmYsXG4gICAgJ3VfcGF0dGVybnNjYWxlX2EnOiBVbmlmb3JtMmYsXG4gICAgJ3VfcGF0dGVybnNjYWxlX2InOiBVbmlmb3JtMmYsXG4gICAgJ3Vfc2RmZ2FtbWEnOiBVbmlmb3JtMWYsXG4gICAgJ3VfaW1hZ2UnOiBVbmlmb3JtMWksXG4gICAgJ3VfdGV4X3lfYSc6IFVuaWZvcm0xZixcbiAgICAndV90ZXhfeV9iJzogVW5pZm9ybTFmLFxuICAgICd1X21peCc6IFVuaWZvcm0xZlxufH07XG5cbmNvbnN0IGxpbmVVbmlmb3JtcyA9IChjb250ZXh0OiBDb250ZXh0LCBsb2NhdGlvbnM6IFVuaWZvcm1Mb2NhdGlvbnMpOiBMaW5lVW5pZm9ybXNUeXBlID0+ICh7XG4gICAgJ3VfbWF0cml4JzogbmV3IFVuaWZvcm1NYXRyaXg0Zihjb250ZXh0LCBsb2NhdGlvbnMudV9tYXRyaXgpLFxuICAgICd1X3JhdGlvJzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9yYXRpbyksXG4gICAgJ3VfZ2xfdW5pdHNfdG9fcGl4ZWxzJzogbmV3IFVuaWZvcm0yZihjb250ZXh0LCBsb2NhdGlvbnMudV9nbF91bml0c190b19waXhlbHMpXG59KTtcblxuY29uc3QgbGluZUdyYWRpZW50VW5pZm9ybXMgPSAoY29udGV4dDogQ29udGV4dCwgbG9jYXRpb25zOiBVbmlmb3JtTG9jYXRpb25zKTogTGluZUdyYWRpZW50VW5pZm9ybXNUeXBlID0+ICh7XG4gICAgJ3VfbWF0cml4JzogbmV3IFVuaWZvcm1NYXRyaXg0Zihjb250ZXh0LCBsb2NhdGlvbnMudV9tYXRyaXgpLFxuICAgICd1X3JhdGlvJzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9yYXRpbyksXG4gICAgJ3VfZ2xfdW5pdHNfdG9fcGl4ZWxzJzogbmV3IFVuaWZvcm0yZihjb250ZXh0LCBsb2NhdGlvbnMudV9nbF91bml0c190b19waXhlbHMpLFxuICAgICd1X2ltYWdlJzogbmV3IFVuaWZvcm0xaShjb250ZXh0LCBsb2NhdGlvbnMudV9pbWFnZSlcbn0pO1xuXG5jb25zdCBsaW5lUGF0dGVyblVuaWZvcm1zID0gKGNvbnRleHQ6IENvbnRleHQsIGxvY2F0aW9uczogVW5pZm9ybUxvY2F0aW9ucyk6IExpbmVQYXR0ZXJuVW5pZm9ybXNUeXBlID0+ICh7XG4gICAgJ3VfbWF0cml4JzogbmV3IFVuaWZvcm1NYXRyaXg0Zihjb250ZXh0LCBsb2NhdGlvbnMudV9tYXRyaXgpLFxuICAgICd1X3RleHNpemUnOiBuZXcgVW5pZm9ybTJmKGNvbnRleHQsIGxvY2F0aW9ucy51X3RleHNpemUpLFxuICAgICd1X3JhdGlvJzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9yYXRpbyksXG4gICAgJ3VfaW1hZ2UnOiBuZXcgVW5pZm9ybTFpKGNvbnRleHQsIGxvY2F0aW9ucy51X2ltYWdlKSxcbiAgICAndV9nbF91bml0c190b19waXhlbHMnOiBuZXcgVW5pZm9ybTJmKGNvbnRleHQsIGxvY2F0aW9ucy51X2dsX3VuaXRzX3RvX3BpeGVscyksXG4gICAgJ3Vfc2NhbGUnOiBuZXcgVW5pZm9ybTRmKGNvbnRleHQsIGxvY2F0aW9ucy51X3NjYWxlKSxcbiAgICAndV9mYWRlJzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9mYWRlKVxufSk7XG5cbmNvbnN0IGxpbmVTREZVbmlmb3JtcyA9IChjb250ZXh0OiBDb250ZXh0LCBsb2NhdGlvbnM6IFVuaWZvcm1Mb2NhdGlvbnMpOiBMaW5lU0RGVW5pZm9ybXNUeXBlID0+ICh7XG4gICAgJ3VfbWF0cml4JzogbmV3IFVuaWZvcm1NYXRyaXg0Zihjb250ZXh0LCBsb2NhdGlvbnMudV9tYXRyaXgpLFxuICAgICd1X3JhdGlvJzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9yYXRpbyksXG4gICAgJ3VfZ2xfdW5pdHNfdG9fcGl4ZWxzJzogbmV3IFVuaWZvcm0yZihjb250ZXh0LCBsb2NhdGlvbnMudV9nbF91bml0c190b19waXhlbHMpLFxuICAgICd1X3BhdHRlcm5zY2FsZV9hJzogbmV3IFVuaWZvcm0yZihjb250ZXh0LCBsb2NhdGlvbnMudV9wYXR0ZXJuc2NhbGVfYSksXG4gICAgJ3VfcGF0dGVybnNjYWxlX2InOiBuZXcgVW5pZm9ybTJmKGNvbnRleHQsIGxvY2F0aW9ucy51X3BhdHRlcm5zY2FsZV9iKSxcbiAgICAndV9zZGZnYW1tYSc6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfc2RmZ2FtbWEpLFxuICAgICd1X2ltYWdlJzogbmV3IFVuaWZvcm0xaShjb250ZXh0LCBsb2NhdGlvbnMudV9pbWFnZSksXG4gICAgJ3VfdGV4X3lfYSc6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfdGV4X3lfYSksXG4gICAgJ3VfdGV4X3lfYic6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfdGV4X3lfYiksXG4gICAgJ3VfbWl4JzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9taXgpXG59KTtcblxuY29uc3QgbGluZVVuaWZvcm1WYWx1ZXMgPSAoXG4gICAgcGFpbnRlcjogUGFpbnRlcixcbiAgICB0aWxlOiBUaWxlLFxuICAgIGxheWVyOiBMaW5lU3R5bGVMYXllclxuKTogVW5pZm9ybVZhbHVlczxMaW5lVW5pZm9ybXNUeXBlPiA9PiB7XG4gICAgY29uc3QgdHJhbnNmb3JtID0gcGFpbnRlci50cmFuc2Zvcm07XG5cbiAgICByZXR1cm4ge1xuICAgICAgICAndV9tYXRyaXgnOiBjYWxjdWxhdGVNYXRyaXgocGFpbnRlciwgdGlsZSwgbGF5ZXIpLFxuICAgICAgICAndV9yYXRpbyc6IDEgLyBwaXhlbHNUb1RpbGVVbml0cyh0aWxlLCAxLCB0cmFuc2Zvcm0uem9vbSksXG4gICAgICAgICd1X2dsX3VuaXRzX3RvX3BpeGVscyc6IFtcbiAgICAgICAgICAgIDEgLyB0cmFuc2Zvcm0ucGl4ZWxzVG9HTFVuaXRzWzBdLFxuICAgICAgICAgICAgMSAvIHRyYW5zZm9ybS5waXhlbHNUb0dMVW5pdHNbMV1cbiAgICAgICAgXVxuICAgIH07XG59O1xuXG5jb25zdCBsaW5lR3JhZGllbnRVbmlmb3JtVmFsdWVzID0gKFxuICAgIHBhaW50ZXI6IFBhaW50ZXIsXG4gICAgdGlsZTogVGlsZSxcbiAgICBsYXllcjogTGluZVN0eWxlTGF5ZXJcbik6IFVuaWZvcm1WYWx1ZXM8TGluZUdyYWRpZW50VW5pZm9ybXNUeXBlPiA9PiB7XG4gICAgcmV0dXJuIGV4dGVuZChsaW5lVW5pZm9ybVZhbHVlcyhwYWludGVyLCB0aWxlLCBsYXllciksIHtcbiAgICAgICAgJ3VfaW1hZ2UnOiAwXG4gICAgfSk7XG59O1xuXG5jb25zdCBsaW5lUGF0dGVyblVuaWZvcm1WYWx1ZXMgPSAoXG4gICAgcGFpbnRlcjogUGFpbnRlcixcbiAgICB0aWxlOiBUaWxlLFxuICAgIGxheWVyOiBMaW5lU3R5bGVMYXllcixcbiAgICBjcm9zc2ZhZGU6IENyb3NzZmFkZVBhcmFtZXRlcnNcbik6IFVuaWZvcm1WYWx1ZXM8TGluZVBhdHRlcm5Vbmlmb3Jtc1R5cGU+ID0+IHtcbiAgICBjb25zdCB0cmFuc2Zvcm0gPSBwYWludGVyLnRyYW5zZm9ybTtcbiAgICBjb25zdCB0aWxlWm9vbVJhdGlvID0gY2FsY3VsYXRlVGlsZVJhdGlvKHRpbGUsIHRyYW5zZm9ybSk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgJ3VfbWF0cml4JzogY2FsY3VsYXRlTWF0cml4KHBhaW50ZXIsIHRpbGUsIGxheWVyKSxcbiAgICAgICAgJ3VfdGV4c2l6ZSc6IHRpbGUuaW1hZ2VBdGxhc1RleHR1cmUuc2l6ZSxcbiAgICAgICAgLy8gY2FtZXJhIHpvb20gcmF0aW9cbiAgICAgICAgJ3VfcmF0aW8nOiAxIC8gcGl4ZWxzVG9UaWxlVW5pdHModGlsZSwgMSwgdHJhbnNmb3JtLnpvb20pLFxuICAgICAgICAndV9pbWFnZSc6IDAsXG4gICAgICAgIC8vIHRoaXMgYXNzdW1lcyBhbGwgaW1hZ2VzIGluIHRoZSBpY29uIGF0bGFzIHRleHR1cmUgaGF2ZSB0aGUgc2FtZSBwaXhlbCByYXRpb1xuICAgICAgICAndV9zY2FsZSc6IFticm93c2VyLmRldmljZVBpeGVsUmF0aW8sIHRpbGVab29tUmF0aW8sIGNyb3NzZmFkZS5mcm9tU2NhbGUsIGNyb3NzZmFkZS50b1NjYWxlXSxcbiAgICAgICAgJ3VfZmFkZSc6IGNyb3NzZmFkZS50LFxuICAgICAgICAndV9nbF91bml0c190b19waXhlbHMnOiBbXG4gICAgICAgICAgICAxIC8gdHJhbnNmb3JtLnBpeGVsc1RvR0xVbml0c1swXSxcbiAgICAgICAgICAgIDEgLyB0cmFuc2Zvcm0ucGl4ZWxzVG9HTFVuaXRzWzFdXG4gICAgICAgIF1cbiAgICB9O1xufTtcblxuY29uc3QgbGluZVNERlVuaWZvcm1WYWx1ZXMgPSAoXG4gICAgcGFpbnRlcjogUGFpbnRlcixcbiAgICB0aWxlOiBUaWxlLFxuICAgIGxheWVyOiBMaW5lU3R5bGVMYXllcixcbiAgICBkYXNoYXJyYXk6IENyb3NzRmFkZWQ8QXJyYXk8bnVtYmVyPj4sXG4gICAgY3Jvc3NmYWRlOiBDcm9zc2ZhZGVQYXJhbWV0ZXJzXG4pOiBVbmlmb3JtVmFsdWVzPExpbmVTREZVbmlmb3Jtc1R5cGU+ID0+IHtcbiAgICBjb25zdCB0cmFuc2Zvcm0gPSBwYWludGVyLnRyYW5zZm9ybTtcbiAgICBjb25zdCBsaW5lQXRsYXMgPSBwYWludGVyLmxpbmVBdGxhcztcbiAgICBjb25zdCB0aWxlUmF0aW8gPSBjYWxjdWxhdGVUaWxlUmF0aW8odGlsZSwgdHJhbnNmb3JtKTtcblxuICAgIGNvbnN0IHJvdW5kID0gbGF5ZXIubGF5b3V0LmdldCgnbGluZS1jYXAnKSA9PT0gJ3JvdW5kJztcblxuICAgIGNvbnN0IHBvc0EgPSBsaW5lQXRsYXMuZ2V0RGFzaChkYXNoYXJyYXkuZnJvbSwgcm91bmQpO1xuICAgIGNvbnN0IHBvc0IgPSBsaW5lQXRsYXMuZ2V0RGFzaChkYXNoYXJyYXkudG8sIHJvdW5kKTtcblxuICAgIGNvbnN0IHdpZHRoQSA9IHBvc0Eud2lkdGggKiBjcm9zc2ZhZGUuZnJvbVNjYWxlO1xuICAgIGNvbnN0IHdpZHRoQiA9IHBvc0Iud2lkdGggKiBjcm9zc2ZhZGUudG9TY2FsZTtcblxuICAgIHJldHVybiBleHRlbmQobGluZVVuaWZvcm1WYWx1ZXMocGFpbnRlciwgdGlsZSwgbGF5ZXIpLCB7XG4gICAgICAgICd1X3BhdHRlcm5zY2FsZV9hJzogW3RpbGVSYXRpbyAvIHdpZHRoQSwgLXBvc0EuaGVpZ2h0IC8gMl0sXG4gICAgICAgICd1X3BhdHRlcm5zY2FsZV9iJzogW3RpbGVSYXRpbyAvIHdpZHRoQiwgLXBvc0IuaGVpZ2h0IC8gMl0sXG4gICAgICAgICd1X3NkZmdhbW1hJzogbGluZUF0bGFzLndpZHRoIC8gKE1hdGgubWluKHdpZHRoQSwgd2lkdGhCKSAqIDI1NiAqIGJyb3dzZXIuZGV2aWNlUGl4ZWxSYXRpbykgLyAyLFxuICAgICAgICAndV9pbWFnZSc6IDAsXG4gICAgICAgICd1X3RleF95X2EnOiBwb3NBLnksXG4gICAgICAgICd1X3RleF95X2InOiBwb3NCLnksXG4gICAgICAgICd1X21peCc6IGNyb3NzZmFkZS50XG4gICAgfSk7XG59O1xuXG5mdW5jdGlvbiBjYWxjdWxhdGVUaWxlUmF0aW8odGlsZTogVGlsZSwgdHJhbnNmb3JtOiBUcmFuc2Zvcm0pIHtcbiAgICByZXR1cm4gMSAvIHBpeGVsc1RvVGlsZVVuaXRzKHRpbGUsIDEsIHRyYW5zZm9ybS50aWxlWm9vbSk7XG59XG5cbmZ1bmN0aW9uIGNhbGN1bGF0ZU1hdHJpeChwYWludGVyLCB0aWxlLCBsYXllcikge1xuICAgIHJldHVybiBwYWludGVyLnRyYW5zbGF0ZVBvc01hdHJpeChcbiAgICAgICAgdGlsZS50aWxlSUQucG9zTWF0cml4LFxuICAgICAgICB0aWxlLFxuICAgICAgICBsYXllci5wYWludC5nZXQoJ2xpbmUtdHJhbnNsYXRlJyksXG4gICAgICAgIGxheWVyLnBhaW50LmdldCgnbGluZS10cmFuc2xhdGUtYW5jaG9yJylcbiAgICApO1xufVxuXG5leHBvcnQge1xuICAgIGxpbmVVbmlmb3JtcyxcbiAgICBsaW5lR3JhZGllbnRVbmlmb3JtcyxcbiAgICBsaW5lUGF0dGVyblVuaWZvcm1zLFxuICAgIGxpbmVTREZVbmlmb3JtcyxcbiAgICBsaW5lVW5pZm9ybVZhbHVlcyxcbiAgICBsaW5lR3JhZGllbnRVbmlmb3JtVmFsdWVzLFxuICAgIGxpbmVQYXR0ZXJuVW5pZm9ybVZhbHVlcyxcbiAgICBsaW5lU0RGVW5pZm9ybVZhbHVlc1xufTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7XG4gICAgVW5pZm9ybTFpLFxuICAgIFVuaWZvcm0xZixcbiAgICBVbmlmb3JtMmYsXG4gICAgVW5pZm9ybTNmLFxuICAgIFVuaWZvcm1NYXRyaXg0ZlxufSBmcm9tICcuLi91bmlmb3JtX2JpbmRpbmcnO1xuXG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gJy4uLy4uL2dsL2NvbnRleHQnO1xuaW1wb3J0IHR5cGUge1VuaWZvcm1WYWx1ZXMsIFVuaWZvcm1Mb2NhdGlvbnN9IGZyb20gJy4uL3VuaWZvcm1fYmluZGluZyc7XG5pbXBvcnQgdHlwZSBSYXN0ZXJTdHlsZUxheWVyIGZyb20gJy4uLy4uL3N0eWxlL3N0eWxlX2xheWVyL3Jhc3Rlcl9zdHlsZV9sYXllcic7XG5cbmV4cG9ydCB0eXBlIFJhc3RlclVuaWZvcm1zVHlwZSA9IHt8XG4gICAgJ3VfbWF0cml4JzogVW5pZm9ybU1hdHJpeDRmLFxuICAgICd1X3RsX3BhcmVudCc6IFVuaWZvcm0yZixcbiAgICAndV9zY2FsZV9wYXJlbnQnOiBVbmlmb3JtMWYsXG4gICAgJ3VfYnVmZmVyX3NjYWxlJzogVW5pZm9ybTFmLFxuICAgICd1X2ZhZGVfdCc6IFVuaWZvcm0xZixcbiAgICAndV9vcGFjaXR5JzogVW5pZm9ybTFmLFxuICAgICd1X2ltYWdlMCc6IFVuaWZvcm0xaSxcbiAgICAndV9pbWFnZTEnOiBVbmlmb3JtMWksXG4gICAgJ3VfYnJpZ2h0bmVzc19sb3cnOiBVbmlmb3JtMWYsXG4gICAgJ3VfYnJpZ2h0bmVzc19oaWdoJzogVW5pZm9ybTFmLFxuICAgICd1X3NhdHVyYXRpb25fZmFjdG9yJzogVW5pZm9ybTFmLFxuICAgICd1X2NvbnRyYXN0X2ZhY3Rvcic6IFVuaWZvcm0xZixcbiAgICAndV9zcGluX3dlaWdodHMnOiBVbmlmb3JtM2Zcbnx9O1xuXG5jb25zdCByYXN0ZXJVbmlmb3JtcyA9IChjb250ZXh0OiBDb250ZXh0LCBsb2NhdGlvbnM6IFVuaWZvcm1Mb2NhdGlvbnMpOiBSYXN0ZXJVbmlmb3Jtc1R5cGUgPT4gKHtcbiAgICAndV9tYXRyaXgnOiBuZXcgVW5pZm9ybU1hdHJpeDRmKGNvbnRleHQsIGxvY2F0aW9ucy51X21hdHJpeCksXG4gICAgJ3VfdGxfcGFyZW50JzogbmV3IFVuaWZvcm0yZihjb250ZXh0LCBsb2NhdGlvbnMudV90bF9wYXJlbnQpLFxuICAgICd1X3NjYWxlX3BhcmVudCc6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfc2NhbGVfcGFyZW50KSxcbiAgICAndV9idWZmZXJfc2NhbGUnOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X2J1ZmZlcl9zY2FsZSksXG4gICAgJ3VfZmFkZV90JzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9mYWRlX3QpLFxuICAgICd1X29wYWNpdHknOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X29wYWNpdHkpLFxuICAgICd1X2ltYWdlMCc6IG5ldyBVbmlmb3JtMWkoY29udGV4dCwgbG9jYXRpb25zLnVfaW1hZ2UwKSxcbiAgICAndV9pbWFnZTEnOiBuZXcgVW5pZm9ybTFpKGNvbnRleHQsIGxvY2F0aW9ucy51X2ltYWdlMSksXG4gICAgJ3VfYnJpZ2h0bmVzc19sb3cnOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X2JyaWdodG5lc3NfbG93KSxcbiAgICAndV9icmlnaHRuZXNzX2hpZ2gnOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X2JyaWdodG5lc3NfaGlnaCksXG4gICAgJ3Vfc2F0dXJhdGlvbl9mYWN0b3InOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X3NhdHVyYXRpb25fZmFjdG9yKSxcbiAgICAndV9jb250cmFzdF9mYWN0b3InOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X2NvbnRyYXN0X2ZhY3RvciksXG4gICAgJ3Vfc3Bpbl93ZWlnaHRzJzogbmV3IFVuaWZvcm0zZihjb250ZXh0LCBsb2NhdGlvbnMudV9zcGluX3dlaWdodHMpXG59KTtcblxuY29uc3QgcmFzdGVyVW5pZm9ybVZhbHVlcyA9IChcbiAgICBtYXRyaXg6IEZsb2F0MzJBcnJheSxcbiAgICBwYXJlbnRUTDogW251bWJlciwgbnVtYmVyXSxcbiAgICBwYXJlbnRTY2FsZUJ5OiBudW1iZXIsXG4gICAgZmFkZToge21peDogbnVtYmVyLCBvcGFjaXR5OiBudW1iZXJ9LFxuICAgIGxheWVyOiBSYXN0ZXJTdHlsZUxheWVyXG4pOiBVbmlmb3JtVmFsdWVzPFJhc3RlclVuaWZvcm1zVHlwZT4gPT4gKHtcbiAgICAndV9tYXRyaXgnOiBtYXRyaXgsXG4gICAgJ3VfdGxfcGFyZW50JzogcGFyZW50VEwsXG4gICAgJ3Vfc2NhbGVfcGFyZW50JzogcGFyZW50U2NhbGVCeSxcbiAgICAndV9idWZmZXJfc2NhbGUnOiAxLFxuICAgICd1X2ZhZGVfdCc6IGZhZGUubWl4LFxuICAgICd1X29wYWNpdHknOiBmYWRlLm9wYWNpdHkgKiBsYXllci5wYWludC5nZXQoJ3Jhc3Rlci1vcGFjaXR5JyksXG4gICAgJ3VfaW1hZ2UwJzogMCxcbiAgICAndV9pbWFnZTEnOiAxLFxuICAgICd1X2JyaWdodG5lc3NfbG93JzogbGF5ZXIucGFpbnQuZ2V0KCdyYXN0ZXItYnJpZ2h0bmVzcy1taW4nKSxcbiAgICAndV9icmlnaHRuZXNzX2hpZ2gnOiBsYXllci5wYWludC5nZXQoJ3Jhc3Rlci1icmlnaHRuZXNzLW1heCcpLFxuICAgICd1X3NhdHVyYXRpb25fZmFjdG9yJzogc2F0dXJhdGlvbkZhY3RvcihsYXllci5wYWludC5nZXQoJ3Jhc3Rlci1zYXR1cmF0aW9uJykpLFxuICAgICd1X2NvbnRyYXN0X2ZhY3Rvcic6IGNvbnRyYXN0RmFjdG9yKGxheWVyLnBhaW50LmdldCgncmFzdGVyLWNvbnRyYXN0JykpLFxuICAgICd1X3NwaW5fd2VpZ2h0cyc6IHNwaW5XZWlnaHRzKGxheWVyLnBhaW50LmdldCgncmFzdGVyLWh1ZS1yb3RhdGUnKSlcbn0pO1xuXG5mdW5jdGlvbiBzcGluV2VpZ2h0cyhhbmdsZSkge1xuICAgIGFuZ2xlICo9IE1hdGguUEkgLyAxODA7XG4gICAgY29uc3QgcyA9IE1hdGguc2luKGFuZ2xlKTtcbiAgICBjb25zdCBjID0gTWF0aC5jb3MoYW5nbGUpO1xuICAgIHJldHVybiBbXG4gICAgICAgICgyICogYyArIDEpIC8gMyxcbiAgICAgICAgKC1NYXRoLnNxcnQoMykgKiBzIC0gYyArIDEpIC8gMyxcbiAgICAgICAgKE1hdGguc3FydCgzKSAqIHMgLSBjICsgMSkgLyAzXG4gICAgXTtcbn1cblxuZnVuY3Rpb24gY29udHJhc3RGYWN0b3IoY29udHJhc3QpIHtcbiAgICByZXR1cm4gY29udHJhc3QgPiAwID9cbiAgICAgICAgMSAvICgxIC0gY29udHJhc3QpIDpcbiAgICAgICAgMSArIGNvbnRyYXN0O1xufVxuXG5mdW5jdGlvbiBzYXR1cmF0aW9uRmFjdG9yKHNhdHVyYXRpb24pIHtcbiAgICByZXR1cm4gc2F0dXJhdGlvbiA+IDAgP1xuICAgICAgICAxIC0gMSAvICgxLjAwMSAtIHNhdHVyYXRpb24pIDpcbiAgICAgICAgLXNhdHVyYXRpb247XG59XG5cbmV4cG9ydCB7IHJhc3RlclVuaWZvcm1zLCByYXN0ZXJVbmlmb3JtVmFsdWVzIH07XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge1xuICAgIFVuaWZvcm0xaSxcbiAgICBVbmlmb3JtMWYsXG4gICAgVW5pZm9ybTJmLFxuICAgIFVuaWZvcm1NYXRyaXg0ZlxufSBmcm9tICcuLi91bmlmb3JtX2JpbmRpbmcnO1xuaW1wb3J0IHsgZXh0ZW5kIH0gZnJvbSAnLi4vLi4vdXRpbC91dGlsJztcblxuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tICcuLi8uLi9nbC9jb250ZXh0JztcbmltcG9ydCB0eXBlIFBhaW50ZXIgZnJvbSAnLi4vcGFpbnRlcic7XG5pbXBvcnQgdHlwZSB7VW5pZm9ybVZhbHVlcywgVW5pZm9ybUxvY2F0aW9uc30gZnJvbSAnLi4vdW5pZm9ybV9iaW5kaW5nJztcblxuZXhwb3J0IHR5cGUgU3ltYm9sSWNvblVuaWZvcm1zVHlwZSA9IHt8XG4gICAgJ3VfaXNfc2l6ZV96b29tX2NvbnN0YW50JzogVW5pZm9ybTFpLFxuICAgICd1X2lzX3NpemVfZmVhdHVyZV9jb25zdGFudCc6IFVuaWZvcm0xaSxcbiAgICAndV9zaXplX3QnOiBVbmlmb3JtMWYsXG4gICAgJ3Vfc2l6ZSc6IFVuaWZvcm0xZixcbiAgICAndV9jYW1lcmFfdG9fY2VudGVyX2Rpc3RhbmNlJzogVW5pZm9ybTFmLFxuICAgICd1X3BpdGNoJzogVW5pZm9ybTFmLFxuICAgICd1X3JvdGF0ZV9zeW1ib2wnOiBVbmlmb3JtMWksXG4gICAgJ3VfYXNwZWN0X3JhdGlvJzogVW5pZm9ybTFmLFxuICAgICd1X2ZhZGVfY2hhbmdlJzogVW5pZm9ybTFmLFxuICAgICd1X21hdHJpeCc6IFVuaWZvcm1NYXRyaXg0ZixcbiAgICAndV9sYWJlbF9wbGFuZV9tYXRyaXgnOiBVbmlmb3JtTWF0cml4NGYsXG4gICAgJ3VfZ2xfY29vcmRfbWF0cml4JzogVW5pZm9ybU1hdHJpeDRmLFxuICAgICd1X2lzX3RleHQnOiBVbmlmb3JtMWYsXG4gICAgJ3VfcGl0Y2hfd2l0aF9tYXAnOiBVbmlmb3JtMWksXG4gICAgJ3VfdGV4c2l6ZSc6IFVuaWZvcm0yZixcbiAgICAndV90ZXh0dXJlJzogVW5pZm9ybTFpXG58fTtcblxuZXhwb3J0IHR5cGUgU3ltYm9sU0RGVW5pZm9ybXNUeXBlID0ge3xcbiAgICAndV9pc19zaXplX3pvb21fY29uc3RhbnQnOiBVbmlmb3JtMWksXG4gICAgJ3VfaXNfc2l6ZV9mZWF0dXJlX2NvbnN0YW50JzogVW5pZm9ybTFpLFxuICAgICd1X3NpemVfdCc6IFVuaWZvcm0xZixcbiAgICAndV9zaXplJzogVW5pZm9ybTFmLFxuICAgICd1X2NhbWVyYV90b19jZW50ZXJfZGlzdGFuY2UnOiBVbmlmb3JtMWYsXG4gICAgJ3VfcGl0Y2gnOiBVbmlmb3JtMWYsXG4gICAgJ3Vfcm90YXRlX3N5bWJvbCc6IFVuaWZvcm0xaSxcbiAgICAndV9hc3BlY3RfcmF0aW8nOiBVbmlmb3JtMWYsXG4gICAgJ3VfZmFkZV9jaGFuZ2UnOiBVbmlmb3JtMWYsXG4gICAgJ3VfbWF0cml4JzogVW5pZm9ybU1hdHJpeDRmLFxuICAgICd1X2xhYmVsX3BsYW5lX21hdHJpeCc6IFVuaWZvcm1NYXRyaXg0ZixcbiAgICAndV9nbF9jb29yZF9tYXRyaXgnOiBVbmlmb3JtTWF0cml4NGYsXG4gICAgJ3VfaXNfdGV4dCc6IFVuaWZvcm0xZixcbiAgICAndV9waXRjaF93aXRoX21hcCc6IFVuaWZvcm0xaSxcbiAgICAndV90ZXhzaXplJzogVW5pZm9ybTJmLFxuICAgICd1X3RleHR1cmUnOiBVbmlmb3JtMWksXG4gICAgJ3VfZ2FtbWFfc2NhbGUnOiBVbmlmb3JtMWYsXG4gICAgJ3VfaXNfaGFsbyc6IFVuaWZvcm0xZlxufH07XG5cbmNvbnN0IHN5bWJvbEljb25Vbmlmb3JtcyA9IChjb250ZXh0OiBDb250ZXh0LCBsb2NhdGlvbnM6IFVuaWZvcm1Mb2NhdGlvbnMpOiBTeW1ib2xJY29uVW5pZm9ybXNUeXBlID0+ICh7XG4gICAgJ3VfaXNfc2l6ZV96b29tX2NvbnN0YW50JzogbmV3IFVuaWZvcm0xaShjb250ZXh0LCBsb2NhdGlvbnMudV9pc19zaXplX3pvb21fY29uc3RhbnQpLFxuICAgICd1X2lzX3NpemVfZmVhdHVyZV9jb25zdGFudCc6IG5ldyBVbmlmb3JtMWkoY29udGV4dCwgbG9jYXRpb25zLnVfaXNfc2l6ZV9mZWF0dXJlX2NvbnN0YW50KSxcbiAgICAndV9zaXplX3QnOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X3NpemVfdCksXG4gICAgJ3Vfc2l6ZSc6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfc2l6ZSksXG4gICAgJ3VfY2FtZXJhX3RvX2NlbnRlcl9kaXN0YW5jZSc6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfY2FtZXJhX3RvX2NlbnRlcl9kaXN0YW5jZSksXG4gICAgJ3VfcGl0Y2gnOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X3BpdGNoKSxcbiAgICAndV9yb3RhdGVfc3ltYm9sJzogbmV3IFVuaWZvcm0xaShjb250ZXh0LCBsb2NhdGlvbnMudV9yb3RhdGVfc3ltYm9sKSxcbiAgICAndV9hc3BlY3RfcmF0aW8nOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X2FzcGVjdF9yYXRpbyksXG4gICAgJ3VfZmFkZV9jaGFuZ2UnOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X2ZhZGVfY2hhbmdlKSxcbiAgICAndV9tYXRyaXgnOiBuZXcgVW5pZm9ybU1hdHJpeDRmKGNvbnRleHQsIGxvY2F0aW9ucy51X21hdHJpeCksXG4gICAgJ3VfbGFiZWxfcGxhbmVfbWF0cml4JzogbmV3IFVuaWZvcm1NYXRyaXg0Zihjb250ZXh0LCBsb2NhdGlvbnMudV9sYWJlbF9wbGFuZV9tYXRyaXgpLFxuICAgICd1X2dsX2Nvb3JkX21hdHJpeCc6IG5ldyBVbmlmb3JtTWF0cml4NGYoY29udGV4dCwgbG9jYXRpb25zLnVfZ2xfY29vcmRfbWF0cml4KSxcbiAgICAndV9pc190ZXh0JzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9pc190ZXh0KSxcbiAgICAndV9waXRjaF93aXRoX21hcCc6IG5ldyBVbmlmb3JtMWkoY29udGV4dCwgbG9jYXRpb25zLnVfcGl0Y2hfd2l0aF9tYXApLFxuICAgICd1X3RleHNpemUnOiBuZXcgVW5pZm9ybTJmKGNvbnRleHQsIGxvY2F0aW9ucy51X3RleHNpemUpLFxuICAgICd1X3RleHR1cmUnOiBuZXcgVW5pZm9ybTFpKGNvbnRleHQsIGxvY2F0aW9ucy51X3RleHR1cmUpXG59KTtcblxuY29uc3Qgc3ltYm9sU0RGVW5pZm9ybXMgPSAoY29udGV4dDogQ29udGV4dCwgbG9jYXRpb25zOiBVbmlmb3JtTG9jYXRpb25zKTogU3ltYm9sU0RGVW5pZm9ybXNUeXBlID0+ICh7XG4gICAgJ3VfaXNfc2l6ZV96b29tX2NvbnN0YW50JzogbmV3IFVuaWZvcm0xaShjb250ZXh0LCBsb2NhdGlvbnMudV9pc19zaXplX3pvb21fY29uc3RhbnQpLFxuICAgICd1X2lzX3NpemVfZmVhdHVyZV9jb25zdGFudCc6IG5ldyBVbmlmb3JtMWkoY29udGV4dCwgbG9jYXRpb25zLnVfaXNfc2l6ZV9mZWF0dXJlX2NvbnN0YW50KSxcbiAgICAndV9zaXplX3QnOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X3NpemVfdCksXG4gICAgJ3Vfc2l6ZSc6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfc2l6ZSksXG4gICAgJ3VfY2FtZXJhX3RvX2NlbnRlcl9kaXN0YW5jZSc6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfY2FtZXJhX3RvX2NlbnRlcl9kaXN0YW5jZSksXG4gICAgJ3VfcGl0Y2gnOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X3BpdGNoKSxcbiAgICAndV9yb3RhdGVfc3ltYm9sJzogbmV3IFVuaWZvcm0xaShjb250ZXh0LCBsb2NhdGlvbnMudV9yb3RhdGVfc3ltYm9sKSxcbiAgICAndV9hc3BlY3RfcmF0aW8nOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X2FzcGVjdF9yYXRpbyksXG4gICAgJ3VfZmFkZV9jaGFuZ2UnOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X2ZhZGVfY2hhbmdlKSxcbiAgICAndV9tYXRyaXgnOiBuZXcgVW5pZm9ybU1hdHJpeDRmKGNvbnRleHQsIGxvY2F0aW9ucy51X21hdHJpeCksXG4gICAgJ3VfbGFiZWxfcGxhbmVfbWF0cml4JzogbmV3IFVuaWZvcm1NYXRyaXg0Zihjb250ZXh0LCBsb2NhdGlvbnMudV9sYWJlbF9wbGFuZV9tYXRyaXgpLFxuICAgICd1X2dsX2Nvb3JkX21hdHJpeCc6IG5ldyBVbmlmb3JtTWF0cml4NGYoY29udGV4dCwgbG9jYXRpb25zLnVfZ2xfY29vcmRfbWF0cml4KSxcbiAgICAndV9pc190ZXh0JzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9pc190ZXh0KSxcbiAgICAndV9waXRjaF93aXRoX21hcCc6IG5ldyBVbmlmb3JtMWkoY29udGV4dCwgbG9jYXRpb25zLnVfcGl0Y2hfd2l0aF9tYXApLFxuICAgICd1X3RleHNpemUnOiBuZXcgVW5pZm9ybTJmKGNvbnRleHQsIGxvY2F0aW9ucy51X3RleHNpemUpLFxuICAgICd1X3RleHR1cmUnOiBuZXcgVW5pZm9ybTFpKGNvbnRleHQsIGxvY2F0aW9ucy51X3RleHR1cmUpLFxuICAgICd1X2dhbW1hX3NjYWxlJzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9nYW1tYV9zY2FsZSksXG4gICAgJ3VfaXNfaGFsbyc6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfaXNfaGFsbylcbn0pO1xuXG5jb25zdCBzeW1ib2xJY29uVW5pZm9ybVZhbHVlcyA9IChcbiAgICBmdW5jdGlvblR5cGU6IHN0cmluZyxcbiAgICBzaXplOiA/e3VTaXplVDogbnVtYmVyLCB1U2l6ZTogbnVtYmVyfSxcbiAgICByb3RhdGVJblNoYWRlcjogYm9vbGVhbixcbiAgICBwaXRjaFdpdGhNYXA6IGJvb2xlYW4sXG4gICAgcGFpbnRlcjogUGFpbnRlcixcbiAgICBtYXRyaXg6IEZsb2F0MzJBcnJheSxcbiAgICBsYWJlbFBsYW5lTWF0cml4OiBGbG9hdDMyQXJyYXksXG4gICAgZ2xDb29yZE1hdHJpeDogRmxvYXQzMkFycmF5LFxuICAgIGlzVGV4dDogYm9vbGVhbixcbiAgICB0ZXhTaXplOiBbbnVtYmVyLCBudW1iZXJdXG4pOiBVbmlmb3JtVmFsdWVzPFN5bWJvbEljb25Vbmlmb3Jtc1R5cGU+ID0+IHtcbiAgICBjb25zdCB0cmFuc2Zvcm0gPSBwYWludGVyLnRyYW5zZm9ybTtcblxuICAgIHJldHVybiB7XG4gICAgICAgICd1X2lzX3NpemVfem9vbV9jb25zdGFudCc6ICsoZnVuY3Rpb25UeXBlID09PSAnY29uc3RhbnQnIHx8IGZ1bmN0aW9uVHlwZSA9PT0gJ3NvdXJjZScpLFxuICAgICAgICAndV9pc19zaXplX2ZlYXR1cmVfY29uc3RhbnQnOiArKGZ1bmN0aW9uVHlwZSA9PT0gJ2NvbnN0YW50JyB8fCBmdW5jdGlvblR5cGUgPT09ICdjYW1lcmEnKSxcbiAgICAgICAgJ3Vfc2l6ZV90Jzogc2l6ZSA/IHNpemUudVNpemVUIDogMCxcbiAgICAgICAgJ3Vfc2l6ZSc6IHNpemUgPyBzaXplLnVTaXplIDogMCxcbiAgICAgICAgJ3VfY2FtZXJhX3RvX2NlbnRlcl9kaXN0YW5jZSc6IHRyYW5zZm9ybS5jYW1lcmFUb0NlbnRlckRpc3RhbmNlLFxuICAgICAgICAndV9waXRjaCc6IHRyYW5zZm9ybS5waXRjaCAvIDM2MCAqIDIgKiBNYXRoLlBJLFxuICAgICAgICAndV9yb3RhdGVfc3ltYm9sJzogK3JvdGF0ZUluU2hhZGVyLFxuICAgICAgICAndV9hc3BlY3RfcmF0aW8nOiB0cmFuc2Zvcm0ud2lkdGggLyB0cmFuc2Zvcm0uaGVpZ2h0LFxuICAgICAgICAndV9mYWRlX2NoYW5nZSc6IHBhaW50ZXIub3B0aW9ucy5mYWRlRHVyYXRpb24gPyBwYWludGVyLnN5bWJvbEZhZGVDaGFuZ2UgOiAxLFxuICAgICAgICAndV9tYXRyaXgnOiBtYXRyaXgsXG4gICAgICAgICd1X2xhYmVsX3BsYW5lX21hdHJpeCc6IGxhYmVsUGxhbmVNYXRyaXgsXG4gICAgICAgICd1X2dsX2Nvb3JkX21hdHJpeCc6IGdsQ29vcmRNYXRyaXgsXG4gICAgICAgICd1X2lzX3RleHQnOiAraXNUZXh0LFxuICAgICAgICAndV9waXRjaF93aXRoX21hcCc6ICtwaXRjaFdpdGhNYXAsXG4gICAgICAgICd1X3RleHNpemUnOiB0ZXhTaXplLFxuICAgICAgICAndV90ZXh0dXJlJzogMFxuICAgIH07XG59O1xuXG5jb25zdCBzeW1ib2xTREZVbmlmb3JtVmFsdWVzID0gKFxuICAgIGZ1bmN0aW9uVHlwZTogc3RyaW5nLFxuICAgIHNpemU6ID97dVNpemVUOiBudW1iZXIsIHVTaXplOiBudW1iZXJ9LFxuICAgIHJvdGF0ZUluU2hhZGVyOiBib29sZWFuLFxuICAgIHBpdGNoV2l0aE1hcDogYm9vbGVhbixcbiAgICBwYWludGVyOiBQYWludGVyLFxuICAgIG1hdHJpeDogRmxvYXQzMkFycmF5LFxuICAgIGxhYmVsUGxhbmVNYXRyaXg6IEZsb2F0MzJBcnJheSxcbiAgICBnbENvb3JkTWF0cml4OiBGbG9hdDMyQXJyYXksXG4gICAgaXNUZXh0OiBib29sZWFuLFxuICAgIHRleFNpemU6IFtudW1iZXIsIG51bWJlcl0sXG4gICAgaXNIYWxvOiBib29sZWFuXG4pOiBVbmlmb3JtVmFsdWVzPFN5bWJvbFNERlVuaWZvcm1zVHlwZT4gPT4ge1xuICAgIGNvbnN0IHRyYW5zZm9ybSA9IHBhaW50ZXIudHJhbnNmb3JtO1xuXG4gICAgcmV0dXJuIGV4dGVuZChzeW1ib2xJY29uVW5pZm9ybVZhbHVlcyhmdW5jdGlvblR5cGUsIHNpemUsXG4gICAgICAgIHJvdGF0ZUluU2hhZGVyLCBwaXRjaFdpdGhNYXAsIHBhaW50ZXIsIG1hdHJpeCwgbGFiZWxQbGFuZU1hdHJpeCxcbiAgICAgICAgZ2xDb29yZE1hdHJpeCwgaXNUZXh0LCB0ZXhTaXplKSwge1xuICAgICAgICAndV9nYW1tYV9zY2FsZSc6IChwaXRjaFdpdGhNYXAgPyBNYXRoLmNvcyh0cmFuc2Zvcm0uX3BpdGNoKSAqIHRyYW5zZm9ybS5jYW1lcmFUb0NlbnRlckRpc3RhbmNlIDogMSksXG4gICAgICAgICd1X2lzX2hhbG8nOiAraXNIYWxvXG4gICAgfSk7XG59O1xuXG5leHBvcnQgeyBzeW1ib2xJY29uVW5pZm9ybXMsIHN5bWJvbFNERlVuaWZvcm1zLCBzeW1ib2xJY29uVW5pZm9ybVZhbHVlcywgc3ltYm9sU0RGVW5pZm9ybVZhbHVlcyB9O1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHsgYmdQYXR0ZXJuVW5pZm9ybVZhbHVlcyB9IGZyb20gJy4vcGF0dGVybic7XG5pbXBvcnQge1xuICAgIFVuaWZvcm0xaSxcbiAgICBVbmlmb3JtMWYsXG4gICAgVW5pZm9ybTJmLFxuICAgIFVuaWZvcm1Db2xvcixcbiAgICBVbmlmb3JtTWF0cml4NGZcbn0gZnJvbSAnLi4vdW5pZm9ybV9iaW5kaW5nJztcbmltcG9ydCB7IGV4dGVuZCB9IGZyb20gJy4uLy4uL3V0aWwvdXRpbCc7XG5cbmltcG9ydCB0eXBlIFBhaW50ZXIgZnJvbSAnLi4vcGFpbnRlcic7XG5pbXBvcnQgdHlwZSB7VW5pZm9ybVZhbHVlcywgVW5pZm9ybUxvY2F0aW9uc30gZnJvbSAnLi4vdW5pZm9ybV9iaW5kaW5nJztcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSAnLi4vLi4vZ2wvY29udGV4dCc7XG5pbXBvcnQgdHlwZSBDb2xvciBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL3V0aWwvY29sb3InO1xuaW1wb3J0IHR5cGUge0Nyb3NzRmFkZWR9IGZyb20gJy4uLy4uL3N0eWxlL3Byb3BlcnRpZXMnO1xuaW1wb3J0IHR5cGUge0Nyb3NzZmFkZVBhcmFtZXRlcnN9IGZyb20gJy4uLy4uL3N0eWxlL2V2YWx1YXRpb25fcGFyYW1ldGVycyc7XG5pbXBvcnQgdHlwZSB7T3ZlcnNjYWxlZFRpbGVJRH0gZnJvbSAnLi4vLi4vc291cmNlL3RpbGVfaWQnO1xuXG5leHBvcnQgdHlwZSBCYWNrZ3JvdW5kVW5pZm9ybXNUeXBlID0ge3xcbiAgICAndV9tYXRyaXgnOiBVbmlmb3JtTWF0cml4NGYsXG4gICAgJ3Vfb3BhY2l0eSc6IFVuaWZvcm0xZixcbiAgICAndV9jb2xvcic6IFVuaWZvcm1Db2xvclxufH07XG5cbmV4cG9ydCB0eXBlIEJhY2tncm91bmRQYXR0ZXJuVW5pZm9ybXNUeXBlID0ge3xcbiAgICAndV9tYXRyaXgnOiBVbmlmb3JtTWF0cml4NGYsXG4gICAgJ3Vfb3BhY2l0eSc6IFVuaWZvcm0xZixcbiAgICAvLyBwYXR0ZXJuIHVuaWZvcm1zOlxuICAgICd1X2ltYWdlJzogVW5pZm9ybTFpLFxuICAgICd1X3BhdHRlcm5fdGxfYSc6IFVuaWZvcm0yZixcbiAgICAndV9wYXR0ZXJuX2JyX2EnOiBVbmlmb3JtMmYsXG4gICAgJ3VfcGF0dGVybl90bF9iJzogVW5pZm9ybTJmLFxuICAgICd1X3BhdHRlcm5fYnJfYic6IFVuaWZvcm0yZixcbiAgICAndV90ZXhzaXplJzogVW5pZm9ybTJmLFxuICAgICd1X21peCc6IFVuaWZvcm0xZixcbiAgICAndV9wYXR0ZXJuX3NpemVfYSc6IFVuaWZvcm0yZixcbiAgICAndV9wYXR0ZXJuX3NpemVfYic6IFVuaWZvcm0yZixcbiAgICAndV9zY2FsZV9hJzogVW5pZm9ybTFmLFxuICAgICd1X3NjYWxlX2InOiBVbmlmb3JtMWYsXG4gICAgJ3VfcGl4ZWxfY29vcmRfdXBwZXInOiBVbmlmb3JtMmYsXG4gICAgJ3VfcGl4ZWxfY29vcmRfbG93ZXInOiBVbmlmb3JtMmYsXG4gICAgJ3VfdGlsZV91bml0c190b19waXhlbHMnOiBVbmlmb3JtMWZcbnx9O1xuXG5jb25zdCBiYWNrZ3JvdW5kVW5pZm9ybXMgPSAoY29udGV4dDogQ29udGV4dCwgbG9jYXRpb25zOiBVbmlmb3JtTG9jYXRpb25zKTogQmFja2dyb3VuZFVuaWZvcm1zVHlwZSA9PiAoe1xuICAgICd1X21hdHJpeCc6IG5ldyBVbmlmb3JtTWF0cml4NGYoY29udGV4dCwgbG9jYXRpb25zLnVfbWF0cml4KSxcbiAgICAndV9vcGFjaXR5JzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9vcGFjaXR5KSxcbiAgICAndV9jb2xvcic6IG5ldyBVbmlmb3JtQ29sb3IoY29udGV4dCwgbG9jYXRpb25zLnVfY29sb3IpXG59KTtcblxuY29uc3QgYmFja2dyb3VuZFBhdHRlcm5Vbmlmb3JtcyA9IChjb250ZXh0OiBDb250ZXh0LCBsb2NhdGlvbnM6IFVuaWZvcm1Mb2NhdGlvbnMpOiBCYWNrZ3JvdW5kUGF0dGVyblVuaWZvcm1zVHlwZSA9PiAoe1xuICAgICd1X21hdHJpeCc6IG5ldyBVbmlmb3JtTWF0cml4NGYoY29udGV4dCwgbG9jYXRpb25zLnVfbWF0cml4KSxcbiAgICAndV9vcGFjaXR5JzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9vcGFjaXR5KSxcbiAgICAndV9pbWFnZSc6IG5ldyBVbmlmb3JtMWkoY29udGV4dCwgbG9jYXRpb25zLnVfaW1hZ2UpLFxuICAgICd1X3BhdHRlcm5fdGxfYSc6IG5ldyBVbmlmb3JtMmYoY29udGV4dCwgbG9jYXRpb25zLnVfcGF0dGVybl90bF9hKSxcbiAgICAndV9wYXR0ZXJuX2JyX2EnOiBuZXcgVW5pZm9ybTJmKGNvbnRleHQsIGxvY2F0aW9ucy51X3BhdHRlcm5fYnJfYSksXG4gICAgJ3VfcGF0dGVybl90bF9iJzogbmV3IFVuaWZvcm0yZihjb250ZXh0LCBsb2NhdGlvbnMudV9wYXR0ZXJuX3RsX2IpLFxuICAgICd1X3BhdHRlcm5fYnJfYic6IG5ldyBVbmlmb3JtMmYoY29udGV4dCwgbG9jYXRpb25zLnVfcGF0dGVybl9icl9iKSxcbiAgICAndV90ZXhzaXplJzogbmV3IFVuaWZvcm0yZihjb250ZXh0LCBsb2NhdGlvbnMudV90ZXhzaXplKSxcbiAgICAndV9taXgnOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X21peCksXG4gICAgJ3VfcGF0dGVybl9zaXplX2EnOiBuZXcgVW5pZm9ybTJmKGNvbnRleHQsIGxvY2F0aW9ucy51X3BhdHRlcm5fc2l6ZV9hKSxcbiAgICAndV9wYXR0ZXJuX3NpemVfYic6IG5ldyBVbmlmb3JtMmYoY29udGV4dCwgbG9jYXRpb25zLnVfcGF0dGVybl9zaXplX2IpLFxuICAgICd1X3NjYWxlX2EnOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X3NjYWxlX2EpLFxuICAgICd1X3NjYWxlX2InOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X3NjYWxlX2IpLFxuICAgICd1X3BpeGVsX2Nvb3JkX3VwcGVyJzogbmV3IFVuaWZvcm0yZihjb250ZXh0LCBsb2NhdGlvbnMudV9waXhlbF9jb29yZF91cHBlciksXG4gICAgJ3VfcGl4ZWxfY29vcmRfbG93ZXInOiBuZXcgVW5pZm9ybTJmKGNvbnRleHQsIGxvY2F0aW9ucy51X3BpeGVsX2Nvb3JkX2xvd2VyKSxcbiAgICAndV90aWxlX3VuaXRzX3RvX3BpeGVscyc6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfdGlsZV91bml0c190b19waXhlbHMpXG59KTtcblxuY29uc3QgYmFja2dyb3VuZFVuaWZvcm1WYWx1ZXMgPSAoXG4gICAgbWF0cml4OiBGbG9hdDMyQXJyYXksXG4gICAgb3BhY2l0eTogbnVtYmVyLFxuICAgIGNvbG9yOiBDb2xvclxuKTogVW5pZm9ybVZhbHVlczxCYWNrZ3JvdW5kVW5pZm9ybXNUeXBlPiA9PiAoe1xuICAgICd1X21hdHJpeCc6IG1hdHJpeCxcbiAgICAndV9vcGFjaXR5Jzogb3BhY2l0eSxcbiAgICAndV9jb2xvcic6IGNvbG9yXG59KTtcblxuY29uc3QgYmFja2dyb3VuZFBhdHRlcm5Vbmlmb3JtVmFsdWVzID0gKFxuICAgIG1hdHJpeDogRmxvYXQzMkFycmF5LFxuICAgIG9wYWNpdHk6IG51bWJlcixcbiAgICBwYWludGVyOiBQYWludGVyLFxuICAgIGltYWdlOiBDcm9zc0ZhZGVkPHN0cmluZz4sXG4gICAgdGlsZToge3RpbGVJRDogT3ZlcnNjYWxlZFRpbGVJRCwgdGlsZVNpemU6IG51bWJlcn0sXG4gICAgY3Jvc3NmYWRlOiBDcm9zc2ZhZGVQYXJhbWV0ZXJzXG4pOiBVbmlmb3JtVmFsdWVzPEJhY2tncm91bmRQYXR0ZXJuVW5pZm9ybXNUeXBlPiA9PiBleHRlbmQoXG4gICAgYmdQYXR0ZXJuVW5pZm9ybVZhbHVlcyhpbWFnZSwgY3Jvc3NmYWRlLCBwYWludGVyLCB0aWxlKSxcbiAgICB7XG4gICAgICAgICd1X21hdHJpeCc6IG1hdHJpeCxcbiAgICAgICAgJ3Vfb3BhY2l0eSc6IG9wYWNpdHlcbiAgICB9XG4pO1xuXG5leHBvcnQge1xuICAgIGJhY2tncm91bmRVbmlmb3JtcyxcbiAgICBiYWNrZ3JvdW5kUGF0dGVyblVuaWZvcm1zLFxuICAgIGJhY2tncm91bmRVbmlmb3JtVmFsdWVzLFxuICAgIGJhY2tncm91bmRQYXR0ZXJuVW5pZm9ybVZhbHVlc1xufTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7IGZpbGxFeHRydXNpb25Vbmlmb3JtcywgZmlsbEV4dHJ1c2lvblBhdHRlcm5Vbmlmb3JtcyB9IGZyb20gJy4vZmlsbF9leHRydXNpb25fcHJvZ3JhbSc7XG5pbXBvcnQgeyBmaWxsVW5pZm9ybXMsIGZpbGxQYXR0ZXJuVW5pZm9ybXMsIGZpbGxPdXRsaW5lVW5pZm9ybXMsIGZpbGxPdXRsaW5lUGF0dGVyblVuaWZvcm1zIH0gZnJvbSAnLi9maWxsX3Byb2dyYW0nO1xuaW1wb3J0IHsgY2lyY2xlVW5pZm9ybXMgfSBmcm9tICcuL2NpcmNsZV9wcm9ncmFtJztcbmltcG9ydCB7IGNvbGxpc2lvblVuaWZvcm1zIH0gZnJvbSAnLi9jb2xsaXNpb25fcHJvZ3JhbSc7XG5pbXBvcnQgeyBkZWJ1Z1VuaWZvcm1zIH0gZnJvbSAnLi9kZWJ1Z19wcm9ncmFtJztcbmltcG9ydCB7IGNsaXBwaW5nTWFza1VuaWZvcm1zIH0gZnJvbSAnLi9jbGlwcGluZ19tYXNrX3Byb2dyYW0nO1xuaW1wb3J0IHsgaGVhdG1hcFVuaWZvcm1zLCBoZWF0bWFwVGV4dHVyZVVuaWZvcm1zIH0gZnJvbSAnLi9oZWF0bWFwX3Byb2dyYW0nO1xuaW1wb3J0IHsgaGlsbHNoYWRlVW5pZm9ybXMsIGhpbGxzaGFkZVByZXBhcmVVbmlmb3JtcyB9IGZyb20gJy4vaGlsbHNoYWRlX3Byb2dyYW0nO1xuaW1wb3J0IHsgbGluZVVuaWZvcm1zLCBsaW5lR3JhZGllbnRVbmlmb3JtcywgbGluZVBhdHRlcm5Vbmlmb3JtcywgbGluZVNERlVuaWZvcm1zIH0gZnJvbSAnLi9saW5lX3Byb2dyYW0nO1xuaW1wb3J0IHsgcmFzdGVyVW5pZm9ybXMgfSBmcm9tICcuL3Jhc3Rlcl9wcm9ncmFtJztcbmltcG9ydCB7IHN5bWJvbEljb25Vbmlmb3Jtcywgc3ltYm9sU0RGVW5pZm9ybXMgfSBmcm9tICcuL3N5bWJvbF9wcm9ncmFtJztcbmltcG9ydCB7IGJhY2tncm91bmRVbmlmb3JtcywgYmFja2dyb3VuZFBhdHRlcm5Vbmlmb3JtcyB9IGZyb20gJy4vYmFja2dyb3VuZF9wcm9ncmFtJztcblxuZXhwb3J0IGNvbnN0IHByb2dyYW1Vbmlmb3JtcyA9IHtcbiAgICBmaWxsRXh0cnVzaW9uOiBmaWxsRXh0cnVzaW9uVW5pZm9ybXMsXG4gICAgZmlsbEV4dHJ1c2lvblBhdHRlcm46IGZpbGxFeHRydXNpb25QYXR0ZXJuVW5pZm9ybXMsXG4gICAgZmlsbDogZmlsbFVuaWZvcm1zLFxuICAgIGZpbGxQYXR0ZXJuOiBmaWxsUGF0dGVyblVuaWZvcm1zLFxuICAgIGZpbGxPdXRsaW5lOiBmaWxsT3V0bGluZVVuaWZvcm1zLFxuICAgIGZpbGxPdXRsaW5lUGF0dGVybjogZmlsbE91dGxpbmVQYXR0ZXJuVW5pZm9ybXMsXG4gICAgY2lyY2xlOiBjaXJjbGVVbmlmb3JtcyxcbiAgICBjb2xsaXNpb25Cb3g6IGNvbGxpc2lvblVuaWZvcm1zLFxuICAgIGNvbGxpc2lvbkNpcmNsZTogY29sbGlzaW9uVW5pZm9ybXMsXG4gICAgZGVidWc6IGRlYnVnVW5pZm9ybXMsXG4gICAgY2xpcHBpbmdNYXNrOiBjbGlwcGluZ01hc2tVbmlmb3JtcyxcbiAgICBoZWF0bWFwOiBoZWF0bWFwVW5pZm9ybXMsXG4gICAgaGVhdG1hcFRleHR1cmU6IGhlYXRtYXBUZXh0dXJlVW5pZm9ybXMsXG4gICAgaGlsbHNoYWRlOiBoaWxsc2hhZGVVbmlmb3JtcyxcbiAgICBoaWxsc2hhZGVQcmVwYXJlOiBoaWxsc2hhZGVQcmVwYXJlVW5pZm9ybXMsXG4gICAgbGluZTogbGluZVVuaWZvcm1zLFxuICAgIGxpbmVHcmFkaWVudDogbGluZUdyYWRpZW50VW5pZm9ybXMsXG4gICAgbGluZVBhdHRlcm46IGxpbmVQYXR0ZXJuVW5pZm9ybXMsXG4gICAgbGluZVNERjogbGluZVNERlVuaWZvcm1zLFxuICAgIHJhc3RlcjogcmFzdGVyVW5pZm9ybXMsXG4gICAgc3ltYm9sSWNvbjogc3ltYm9sSWNvblVuaWZvcm1zLFxuICAgIHN5bWJvbFNERjogc3ltYm9sU0RGVW5pZm9ybXMsXG4gICAgYmFja2dyb3VuZDogYmFja2dyb3VuZFVuaWZvcm1zLFxuICAgIGJhY2tncm91bmRQYXR0ZXJuOiBiYWNrZ3JvdW5kUGF0dGVyblVuaWZvcm1zXG59O1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHsgT3ZlcnNjYWxlZFRpbGVJRCwgQ2Fub25pY2FsVGlsZUlEIH0gZnJvbSAnLi4vc291cmNlL3RpbGVfaWQnO1xuXG5pbXBvcnQgdHlwZSBUaWxlIGZyb20gJy4vLi4vc291cmNlL3RpbGUnO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tICcuLi9nbC9jb250ZXh0JztcblxudHlwZSBNYXNrID0ge1xuICAgIFtudW1iZXJdOiBDYW5vbmljYWxUaWxlSURcbn07XG5cbi8vIFVwZGF0ZXMgdGhlIFRpbGVNYXNrcyBmb3IgYWxsIHJlbmRlcmFibGUgdGlsZXMuIEEgVGlsZU1hc2sgZGVzY3JpYmVzIGFsbCByZWdpb25zXG4vLyB3aXRoaW4gdGhhdCB0aWxlIHRoYXQgYXJlICpub3QqIGNvdmVyZWQgYnkgb3RoZXIgcmVuZGVyYWJsZSB0aWxlcy5cbi8vIEV4YW1wbGU6IHJlbmRlcmFibGVUaWxlcyBpbiBvdXIgbGlzdCBhcmUgMi8xLzMsIDMvMy82LCBhbmQgNC81LzEzLiBUaGUgc2NoZW1hdGljIGZvciBjcmVhdGluZyB0aGVcbi8vIFRpbGVNYXNrIGZvciAyLzEvMyBsb29rcyBsaWtlIHRoaXM6XG4vL1xuLy8gICAgw6LClMKMw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKsw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKsw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKQXG4vLyAgICDDosKUwoIgICAgICAgIMOiwpTCgiAgICAgICAgw6LClMKCIyMjIyMjIyMjIyMjIyMjIyPDosKUwoJcbi8vICAgIMOiwpTCgiA0LzQvMTIgw6LClMKCIDQvNS8xMiDDosKUwoIjIyMjIyMjIyMjIyMjIyMjI8OiwpTCglxuLy8gICAgw6LClMKCICAgICAgICDDosKUwoIgICAgICAgIMOiwpTCgiMjIyMjIyMjIyMjIyMjIyMjw6LClMKCXG4vLyAgICDDosKUwpzDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoAzLzIvNsOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCpCMjIyMjMy8zLzYjIyMjIyMjw6LClMKCXG4vLyAgICDDosKUwoIgICAgICAgIMOiwpTCgiMjIyMjIyMjw6LClMKCIyMjIyMjIyMjIyMjIyMjIyPDosKUwoJcbi8vICAgIMOiwpTCgiA0LzQvMTMgw6LClMKCIzQvNS8xMyPDosKUwoIjIyMjIyMjIyMjIyMjIyMjI8OiwpTCglxuLy8gICAgw6LClMKCICAgICAgICDDosKUwoIjIyMjIyMjI8OiwpTCgiMjIyMjIyMjIyMjIyMjIyMjw6LClMKCXG4vLyAgICDDosKUwpzDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwrTDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoAyLzEvM8OiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCpFxuLy8gICAgw6LClMKCICAgICAgICAgICAgICAgICDDosKUwoIgICAgICAgICAgICAgICAgIMOiwpTCglxuLy8gICAgw6LClMKCICAgICAgICAgICAgICAgICDDosKUwoIgICAgICAgICAgICAgICAgIMOiwpTCglxuLy8gICAgw6LClMKCICAgICAgICAgICAgICAgICDDosKUwoIgICAgICAgICAgICAgICAgIMOiwpTCglxuLy8gICAgw6LClMKCICAgICAgMy8yLzcgICAgICDDosKUwoIgICAgICAzLzMvNyAgICAgIMOiwpTCglxuLy8gICAgw6LClMKCICAgICAgICAgICAgICAgICDDosKUwoIgICAgICAgICAgICAgICAgIMOiwpTCglxuLy8gICAgw6LClMKCICAgICAgICAgICAgICAgICDDosKUwoIgICAgICAgICAgICAgICAgIMOiwpTCglxuLy8gICAgw6LClMKCICAgICAgICAgICAgICAgICDDosKUwoIgICAgICAgICAgICAgICAgIMOiwpTCglxuLy8gICAgw6LClMKUw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMK0w6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKAw6LClMKYXG4vL1xuLy8gVGhlIFRpbGVNYXNrIGZvciAyLzEvMyB0aHVzIGNvbnNpc3RzIG9mIHRoZSB0aWxlcyA0LzQvMTIsIDQvNS8xMiwgNC80LzEzLCAzLzIvNywgYW5kIDMvMy83LFxuLy8gYnV0IGl0IGRvZXMgKm5vdCogaW5jbHVkZSA0LzUvMTMsIGFuZCAzLzMvNiwgc2luY2UgdGhlc2UgYXJlIG90aGVyIHJlbmRlcmFibGVUaWxlcy5cbi8vIEEgVGlsZU1hc2sgYWx3YXlzIGNvbnRhaW5zIFRpbGVJRHMgKnJlbGF0aXZlKiB0byB0aGUgdGlsZSBpdCBpcyBnZW5lcmF0ZWQgZm9yLCBzbyAyLzEvMyBpc1xuLy8gXCJzdWJ0cmFjdGVkXCIgZnJvbSB0aGVzZSBUaWxlSURzLiBUaGUgZmluYWwgVGlsZU1hc2sgZm9yIDIvMS8zIHdpbGwgdGh1cyBiZTpcbi8vXG4vLyAgICDDosKUwozDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwqzDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwqzDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwpBcbi8vICAgIMOiwpTCgiAgICAgICAgw6LClMKCICAgICAgICDDosKUwoIjIyMjIyMjIyMjIyMjIyMjI8OiwpTCglxuLy8gICAgw6LClMKCIDIvMC8wICDDosKUwoIgMi8xLzAgIMOiwpTCgiMjIyMjIyMjIyMjIyMjIyMjw6LClMKCXG4vLyAgICDDosKUwoIgICAgICAgIMOiwpTCgiAgICAgICAgw6LClMKCIyMjIyMjIyMjIyMjIyMjIyPDosKUwoJcbi8vICAgIMOiwpTCnMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCvMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCpCMjIyMjIyMjIyMjIyMjIyMjw6LClMKCXG4vLyAgICDDosKUwoIgICAgICAgIMOiwpTCgiMjIyMjIyMjw6LClMKCIyMjIyMjIyMjIyMjIyMjIyPDosKUwoJcbi8vICAgIMOiwpTCgiAyLzAvMSAgw6LClMKCIyMjIyMjIyPDosKUwoIjIyMjIyMjIyMjIyMjIyMjI8OiwpTCglxuLy8gICAgw6LClMKCICAgICAgICDDosKUwoIjIyMjIyMjI8OiwpTCgiMjIyMjIyMjIyMjIyMjIyMjw6LClMKCXG4vLyAgICDDosKUwpzDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwrTDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwrzDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwoDDosKUwqRcbi8vICAgIMOiwpTCgiAgICAgICAgICAgICAgICAgw6LClMKCICAgICAgICAgICAgICAgICDDosKUwoJcbi8vICAgIMOiwpTCgiAgICAgICAgICAgICAgICAgw6LClMKCICAgICAgICAgICAgICAgICDDosKUwoJcbi8vICAgIMOiwpTCgiAgICAgICAgICAgICAgICAgw6LClMKCICAgICAgICAgICAgICAgICDDosKUwoJcbi8vICAgIMOiwpTCgiAgICAgIDEvMC8xICAgICAgw6LClMKCICAgICAgMS8xLzEgICAgICDDosKUwoJcbi8vICAgIMOiwpTCgiAgICAgICAgICAgICAgICAgw6LClMKCICAgICAgICAgICAgICAgICDDosKUwoJcbi8vICAgIMOiwpTCgiAgICAgICAgICAgICAgICAgw6LClMKCICAgICAgICAgICAgICAgICDDosKUwoJcbi8vICAgIMOiwpTCgiAgICAgICAgICAgICAgICAgw6LClMKCICAgICAgICAgICAgICAgICDDosKUwoJcbi8vICAgIMOiwpTClMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCtMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCgMOiwpTCmFxuLy9cbi8vIE9ubHkgb3RoZXIgcmVuZGVyYWJsZSB0aWxlcyB0aGF0IGFyZSAqY2hpbGRyZW4qIG9mIHRoZSB0aWxlIHdlIGFyZSBnZW5lcmF0aW5nIHRoZSBtYXNrIGZvciB3aWxsXG4vLyBiZSBjb25zaWRlcmVkLiBGb3IgZXhhbXBsZSwgYWRkaW5nIFRpbGVJRCA0LzgvMTMgdG8gcmVuZGVyYWJsZVRpbGVzIHdvbid0IGFmZmVjdCB0aGUgVGlsZU1hc2sgZm9yXG4vLyAyLzEvMywgc2luY2UgaXQgaXMgbm90IGEgZGVzY2VuZGFudCBvZiBpdC5cblxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihyZW5kZXJhYmxlVGlsZXM6IEFycmF5PFRpbGU+LCBjb250ZXh0OiBDb250ZXh0KSB7XG4gICAgY29uc3Qgc29ydGVkUmVuZGVyYWJsZXMgPSByZW5kZXJhYmxlVGlsZXMuc29ydCgoYSwgYikgPT4geyByZXR1cm4gYS50aWxlSUQuaXNMZXNzVGhhbihiLnRpbGVJRCkgPyAtMSA6IGIudGlsZUlELmlzTGVzc1RoYW4oYS50aWxlSUQpID8gMSA6IDA7IH0pO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzb3J0ZWRSZW5kZXJhYmxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBtYXNrID0ge307XG4gICAgICAgIGNvbnN0IHRpbGUgPSAgc29ydGVkUmVuZGVyYWJsZXNbaV07XG4gICAgICAgIGNvbnN0IGNoaWxkQXJyYXkgPSBzb3J0ZWRSZW5kZXJhYmxlcy5zbGljZShpICsgMSk7XG4gICAgICAgIC8vIFRyeSB0byBhZGQgYWxsIHJlbWFpbmluZyBpZHMgYXMgY2hpbGRyZW4uIFdlIHNvcnRlZCB0aGUgdGlsZSBsaXN0XG4gICAgICAgIC8vIGJ5IHogZWFybGllciwgc28gYWxsIHByZWNlZGluZyBpdGVtcyBjYW5ub3QgYmUgY2hpbGRyZW4gb2YgdGhlIGN1cnJlbnRcbiAgICAgICAgLy8gdGlsZS4gV2UgYWxzbyBjb21wdXRlIHRoZSBsb3dlciBib3VuZCBvZiB0aGUgbmV4dCB3cmFwLCBiZWNhdXNlIGl0ZW1zIG9mIHRoZSBuZXh0IHdyYXBcbiAgICAgICAgLy8gY2FuIG5ldmVyIGJlIGNoaWxkcmVuIG9mIHRoZSBjdXJyZW50IHdyYXAuXG5cbiAgICAgICAgY29tcHV0ZVRpbGVNYXNrcyh0aWxlLnRpbGVJRC53cmFwcGVkKCksIHRpbGUudGlsZUlELCBjaGlsZEFycmF5LCBuZXcgT3ZlcnNjYWxlZFRpbGVJRCgwLCB0aWxlLnRpbGVJRC53cmFwICsgMSwgMCwgMCwgMCksIG1hc2spO1xuICAgICAgICB0aWxlLnNldE1hc2sobWFzaywgY29udGV4dCk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBjb21wdXRlVGlsZU1hc2tzKHJvb3RUaWxlOiBPdmVyc2NhbGVkVGlsZUlELCByZWY6IE92ZXJzY2FsZWRUaWxlSUQsIGNoaWxkQXJyYXk6IEFycmF5PFRpbGU+LCBsb3dlckJvdW5kOiBPdmVyc2NhbGVkVGlsZUlELCBtYXNrOiBNYXNrKSB7XG4gICAgLy8gSWYgdGhlIHJlZmVyZW5jZSBvciBhbnkgb2YgaXRzIGNoaWxkcmVuIGlzIGZvdW5kIGluIHRoZSBsaXN0LCB3ZSBuZWVkIHRvIHJlY3Vyc2UuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZEFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkVGlsZSA9IGNoaWxkQXJyYXlbaV07XG4gICAgICAgIC8vIGNoaWxkVGlsZSBpcyBmcm9tIGEgbGFyZ2VyIHdyYXAgdGhhbiB0aGUgcm9vdFRpbGUgc28gaXQgY2Fubm90IGJlIGEgY2hpbGQgdGlsZVxuICAgICAgICBpZiAobG93ZXJCb3VuZC5pc0xlc3NUaGFuKGNoaWxkVGlsZS50aWxlSUQpKSBicmVhaztcbiAgICAgICAgLy8gVGhlIGN1cnJlbnQgdGlsZSBpcyBtYXNrZWQgb3V0LCBzbyB3ZSBkb24ndCBuZWVkIHRvIGFkZCB0aGVtIHRvIHRoZSBtYXNrIHNldC5cbiAgICAgICAgaWYgKHJlZi5rZXkgPT09IGNoaWxkVGlsZS50aWxlSUQua2V5KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gZWxzZSBpZiAoY2hpbGRUaWxlLnRpbGVJRC5pc0NoaWxkT2YocmVmKSkge1xuICAgICAgICAgICAgLy8gVGhlcmUncyBhdCBsZWFzdCBvbmUgY2hpbGQgdGlsZSB0aGF0IGlzIG1hc2tlZCBvdXQsIHNvIHJlY3Vyc2l2ZWx5IGRlc2NlbmRcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0gcmVmLmNoaWxkcmVuKEluZmluaXR5KTtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgY2hpbGRyZW4ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjaGlsZCA9IGNoaWxkcmVuW2pdO1xuICAgICAgICAgICAgICAgIGNvbXB1dGVUaWxlTWFza3Mocm9vdFRpbGUsIGNoaWxkLCBjaGlsZEFycmF5LnNsaWNlKGkpLCBsb3dlckJvdW5kLCBtYXNrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBXZSBjb3VsZG4ndCBmaW5kIGEgY2hpbGQsIHNvIGl0J3MgZGVmaW5pdGVseSBhIG1hc2tlZCBwYXJ0LlxuICAgIC8vIENvbXB1dGUgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgcm9vdCB0aWxlIElEIGFuZCB0aGUgcmVmZXJlbmNlIHRpbGUgSUQsIHNpbmNlIFRpbGVNYXNrXG4gICAgLy8gZWxlbWVudHMgYXJlIGFsd2F5cyByZWxhdGl2ZSAoc2VlIGJlbG93IGZvciBleHBsYW5hdGlvbikuXG4gICAgY29uc3QgZGlmZlogPSByZWYub3ZlcnNjYWxlZFogLSByb290VGlsZS5vdmVyc2NhbGVkWjtcbiAgICBjb25zdCBtYXNrVGlsZUlkID0gbmV3IENhbm9uaWNhbFRpbGVJRChkaWZmWiwgcmVmLmNhbm9uaWNhbC54IC0gKHJvb3RUaWxlLmNhbm9uaWNhbC54IDw8IGRpZmZaKSwgcmVmLmNhbm9uaWNhbC55IC0gKHJvb3RUaWxlLmNhbm9uaWNhbC55IDw8IGRpZmZaKSk7XG4gICAgbWFza1ttYXNrVGlsZUlkLmtleV0gPSBtYXNrW21hc2tUaWxlSWQua2V5XSB8fCBtYXNrVGlsZUlkO1xufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHR5cGUgUGFpbnRlciBmcm9tICcuL3BhaW50ZXInO1xuaW1wb3J0IHR5cGUgU291cmNlQ2FjaGUgZnJvbSAnLi4vc291cmNlL3NvdXJjZV9jYWNoZSc7XG5pbXBvcnQgdHlwZSBTdHlsZUxheWVyIGZyb20gJy4uL3N0eWxlL3N0eWxlX2xheWVyJztcbmltcG9ydCB0eXBlIHtPdmVyc2NhbGVkVGlsZUlEfSBmcm9tICcuLi9zb3VyY2UvdGlsZV9pZCc7XG5pbXBvcnQgdHlwZSBTeW1ib2xCdWNrZXQgZnJvbSAnLi4vZGF0YS9idWNrZXQvc3ltYm9sX2J1Y2tldCc7XG5pbXBvcnQgRGVwdGhNb2RlIGZyb20gJy4uL2dsL2RlcHRoX21vZGUnO1xuaW1wb3J0IFN0ZW5jaWxNb2RlIGZyb20gJy4uL2dsL3N0ZW5jaWxfbW9kZSc7XG5pbXBvcnQgQ3VsbEZhY2VNb2RlIGZyb20gJy4uL2dsL2N1bGxfZmFjZV9tb2RlJztcbmltcG9ydCB7IGNvbGxpc2lvblVuaWZvcm1WYWx1ZXMgfSBmcm9tICcuL3Byb2dyYW0vY29sbGlzaW9uX3Byb2dyYW0nO1xuXG5leHBvcnQgZGVmYXVsdCBkcmF3Q29sbGlzaW9uRGVidWc7XG5cbmZ1bmN0aW9uIGRyYXdDb2xsaXNpb25EZWJ1Z0dlb21ldHJ5KHBhaW50ZXI6IFBhaW50ZXIsIHNvdXJjZUNhY2hlOiBTb3VyY2VDYWNoZSwgbGF5ZXI6IFN0eWxlTGF5ZXIsIGNvb3JkczogQXJyYXk8T3ZlcnNjYWxlZFRpbGVJRD4sIGRyYXdDaXJjbGVzOiBib29sZWFuKSB7XG4gICAgY29uc3QgY29udGV4dCA9IHBhaW50ZXIuY29udGV4dDtcbiAgICBjb25zdCBnbCA9IGNvbnRleHQuZ2w7XG4gICAgY29uc3QgcHJvZ3JhbSA9IGRyYXdDaXJjbGVzID8gcGFpbnRlci51c2VQcm9ncmFtKCdjb2xsaXNpb25DaXJjbGUnKSA6IHBhaW50ZXIudXNlUHJvZ3JhbSgnY29sbGlzaW9uQm94Jyk7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvb3Jkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBjb29yZCA9IGNvb3Jkc1tpXTtcbiAgICAgICAgY29uc3QgdGlsZSA9IHNvdXJjZUNhY2hlLmdldFRpbGUoY29vcmQpO1xuICAgICAgICBjb25zdCBidWNrZXQ6ID9TeW1ib2xCdWNrZXQgPSAodGlsZS5nZXRCdWNrZXQobGF5ZXIpOiBhbnkpO1xuICAgICAgICBpZiAoIWJ1Y2tldCkgY29udGludWU7XG4gICAgICAgIGNvbnN0IGJ1ZmZlcnMgPSBkcmF3Q2lyY2xlcyA/IGJ1Y2tldC5jb2xsaXNpb25DaXJjbGUgOiBidWNrZXQuY29sbGlzaW9uQm94O1xuICAgICAgICBpZiAoIWJ1ZmZlcnMpIGNvbnRpbnVlO1xuXG4gICAgICAgIHByb2dyYW0uZHJhdyhjb250ZXh0LCBkcmF3Q2lyY2xlcyA/IGdsLlRSSUFOR0xFUyA6IGdsLkxJTkVTLFxuICAgICAgICAgICAgRGVwdGhNb2RlLmRpc2FibGVkLCBTdGVuY2lsTW9kZS5kaXNhYmxlZCxcbiAgICAgICAgICAgIHBhaW50ZXIuY29sb3JNb2RlRm9yUmVuZGVyUGFzcygpLFxuICAgICAgICAgICAgQ3VsbEZhY2VNb2RlLmRpc2FibGVkLFxuICAgICAgICAgICAgY29sbGlzaW9uVW5pZm9ybVZhbHVlcyhcbiAgICAgICAgICAgICAgICBjb29yZC5wb3NNYXRyaXgsXG4gICAgICAgICAgICAgICAgcGFpbnRlci50cmFuc2Zvcm0sXG4gICAgICAgICAgICAgICAgdGlsZSksXG4gICAgICAgICAgICBsYXllci5pZCwgYnVmZmVycy5sYXlvdXRWZXJ0ZXhCdWZmZXIsIGJ1ZmZlcnMuaW5kZXhCdWZmZXIsXG4gICAgICAgICAgICBidWZmZXJzLnNlZ21lbnRzLCBudWxsLCBwYWludGVyLnRyYW5zZm9ybS56b29tLCBudWxsLCBudWxsLFxuICAgICAgICAgICAgYnVmZmVycy5jb2xsaXNpb25WZXJ0ZXhCdWZmZXIpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZHJhd0NvbGxpc2lvbkRlYnVnKHBhaW50ZXI6IFBhaW50ZXIsIHNvdXJjZUNhY2hlOiBTb3VyY2VDYWNoZSwgbGF5ZXI6IFN0eWxlTGF5ZXIsIGNvb3JkczogQXJyYXk8T3ZlcnNjYWxlZFRpbGVJRD4pIHtcbiAgICBkcmF3Q29sbGlzaW9uRGVidWdHZW9tZXRyeShwYWludGVyLCBzb3VyY2VDYWNoZSwgbGF5ZXIsIGNvb3JkcywgZmFsc2UpO1xuICAgIGRyYXdDb2xsaXNpb25EZWJ1Z0dlb21ldHJ5KHBhaW50ZXIsIHNvdXJjZUNhY2hlLCBsYXllciwgY29vcmRzLCB0cnVlKTtcbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCBQb2ludCBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcbmltcG9ydCBkcmF3Q29sbGlzaW9uRGVidWcgZnJvbSAnLi9kcmF3X2NvbGxpc2lvbl9kZWJ1Zyc7XG5cbmltcG9ydCBTZWdtZW50VmVjdG9yIGZyb20gJy4uL2RhdGEvc2VnbWVudCc7XG5pbXBvcnQgcGl4ZWxzVG9UaWxlVW5pdHMgZnJvbSAnLi4vc291cmNlL3BpeGVsc190b190aWxlX3VuaXRzJztcbmltcG9ydCAqIGFzIHN5bWJvbFByb2plY3Rpb24gZnJvbSAnLi4vc3ltYm9sL3Byb2plY3Rpb24nO1xuaW1wb3J0ICogYXMgc3ltYm9sU2l6ZSBmcm9tICcuLi9zeW1ib2wvc3ltYm9sX3NpemUnO1xuaW1wb3J0IHsgbWF0NCB9IGZyb20gJ2dsLW1hdHJpeCc7XG5jb25zdCBpZGVudGl0eU1hdDQgPSBtYXQ0LmlkZW50aXR5KG5ldyBGbG9hdDMyQXJyYXkoMTYpKTtcbmltcG9ydCBwcm9wZXJ0aWVzIGZyb20gJy4uL3N0eWxlL3N0eWxlX2xheWVyL3N5bWJvbF9zdHlsZV9sYXllcl9wcm9wZXJ0aWVzJztcbmNvbnN0IHN5bWJvbExheW91dFByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmxheW91dDtcbmltcG9ydCBTdGVuY2lsTW9kZSBmcm9tICcuLi9nbC9zdGVuY2lsX21vZGUnO1xuaW1wb3J0IERlcHRoTW9kZSBmcm9tICcuLi9nbC9kZXB0aF9tb2RlJztcbmltcG9ydCBDdWxsRmFjZU1vZGUgZnJvbSAnLi4vZ2wvY3VsbF9mYWNlX21vZGUnO1xuaW1wb3J0IHthZGREeW5hbWljQXR0cmlidXRlc30gZnJvbSAnLi4vZGF0YS9idWNrZXQvc3ltYm9sX2J1Y2tldCc7XG5cbmltcG9ydCB7IGdldEFuY2hvckFsaWdubWVudCB9IGZyb20gJy4uL3N5bWJvbC9zaGFwaW5nJztcbmltcG9ydCBPTkVfRU0gZnJvbSAnLi4vc3ltYm9sL29uZV9lbSc7XG5pbXBvcnQgeyBldmFsdWF0ZVJhZGlhbE9mZnNldCB9IGZyb20gJy4uL3N5bWJvbC9zeW1ib2xfbGF5b3V0JztcblxuaW1wb3J0IHtcbiAgICBzeW1ib2xJY29uVW5pZm9ybVZhbHVlcyxcbiAgICBzeW1ib2xTREZVbmlmb3JtVmFsdWVzXG59IGZyb20gJy4vcHJvZ3JhbS9zeW1ib2xfcHJvZ3JhbSc7XG5cbmltcG9ydCB0eXBlIFBhaW50ZXIgZnJvbSAnLi9wYWludGVyJztcbmltcG9ydCB0eXBlIFNvdXJjZUNhY2hlIGZyb20gJy4uL3NvdXJjZS9zb3VyY2VfY2FjaGUnO1xuaW1wb3J0IHR5cGUgU3ltYm9sU3R5bGVMYXllciBmcm9tICcuLi9zdHlsZS9zdHlsZV9sYXllci9zeW1ib2xfc3R5bGVfbGF5ZXInO1xuaW1wb3J0IHR5cGUgU3ltYm9sQnVja2V0LCB7U3ltYm9sQnVmZmVyc30gZnJvbSAnLi4vZGF0YS9idWNrZXQvc3ltYm9sX2J1Y2tldCc7XG5pbXBvcnQgdHlwZSBUZXh0dXJlIGZyb20gJy4uL3JlbmRlci90ZXh0dXJlJztcbmltcG9ydCB0eXBlIHtPdmVyc2NhbGVkVGlsZUlEfSBmcm9tICcuLi9zb3VyY2UvdGlsZV9pZCc7XG5pbXBvcnQgdHlwZSB7VW5pZm9ybVZhbHVlc30gZnJvbSAnLi91bmlmb3JtX2JpbmRpbmcnO1xuaW1wb3J0IHR5cGUge1N5bWJvbFNERlVuaWZvcm1zVHlwZX0gZnJvbSAnLi4vcmVuZGVyL3Byb2dyYW0vc3ltYm9sX3Byb2dyYW0nO1xuaW1wb3J0IHR5cGUgeyBDcm9zc1RpbGVJRCwgVmFyaWFibGVPZmZzZXQgfSBmcm9tICcuLi9zeW1ib2wvcGxhY2VtZW50JztcblxuZXhwb3J0IGRlZmF1bHQgZHJhd1N5bWJvbHM7XG5cbnR5cGUgU3ltYm9sVGlsZVJlbmRlclN0YXRlID0ge1xuICAgIHNlZ21lbnRzOiBTZWdtZW50VmVjdG9yLFxuICAgIHNvcnRLZXk6IG51bWJlcixcbiAgICBzdGF0ZToge1xuICAgICAgICBwcm9ncmFtOiBhbnksXG4gICAgICAgIGJ1ZmZlcnM6IFN5bWJvbEJ1ZmZlcnMsXG4gICAgICAgIHVuaWZvcm1WYWx1ZXM6IGFueSxcbiAgICAgICAgYXRsYXNUZXh0dXJlOiBUZXh0dXJlLFxuICAgICAgICBhdGxhc0ludGVycG9sYXRpb246IGFueSxcbiAgICAgICAgaXNTREY6IGJvb2xlYW4sXG4gICAgICAgIGhhc0hhbG86IGJvb2xlYW5cbiAgICB9XG59O1xuXG5mdW5jdGlvbiBkcmF3U3ltYm9scyhwYWludGVyOiBQYWludGVyLCBzb3VyY2VDYWNoZTogU291cmNlQ2FjaGUsIGxheWVyOiBTeW1ib2xTdHlsZUxheWVyLCBjb29yZHM6IEFycmF5PE92ZXJzY2FsZWRUaWxlSUQ+LCB2YXJpYWJsZU9mZnNldHM6IHtbQ3Jvc3NUaWxlSURdOiBWYXJpYWJsZU9mZnNldH0pIHtcbiAgICBpZiAocGFpbnRlci5yZW5kZXJQYXNzICE9PSAndHJhbnNsdWNlbnQnKSByZXR1cm47XG5cbiAgICAvLyBEaXNhYmxlIHRoZSBzdGVuY2lsIHRlc3Qgc28gdGhhdCBsYWJlbHMgYXJlbid0IGNsaXBwZWQgdG8gdGlsZSBib3VuZGFyaWVzLlxuICAgIGNvbnN0IHN0ZW5jaWxNb2RlID0gU3RlbmNpbE1vZGUuZGlzYWJsZWQ7XG4gICAgY29uc3QgY29sb3JNb2RlID0gcGFpbnRlci5jb2xvck1vZGVGb3JSZW5kZXJQYXNzKCk7XG5cbiAgICBpZiAobGF5ZXIucGFpbnQuZ2V0KCdpY29uLW9wYWNpdHknKS5jb25zdGFudE9yKDEpICE9PSAwKSB7XG4gICAgICAgIGRyYXdMYXllclN5bWJvbHMocGFpbnRlciwgc291cmNlQ2FjaGUsIGxheWVyLCBjb29yZHMsIGZhbHNlLFxuICAgICAgICAgICAgbGF5ZXIucGFpbnQuZ2V0KCdpY29uLXRyYW5zbGF0ZScpLFxuICAgICAgICAgICAgbGF5ZXIucGFpbnQuZ2V0KCdpY29uLXRyYW5zbGF0ZS1hbmNob3InKSxcbiAgICAgICAgICAgIGxheWVyLmxheW91dC5nZXQoJ2ljb24tcm90YXRpb24tYWxpZ25tZW50JyksXG4gICAgICAgICAgICBsYXllci5sYXlvdXQuZ2V0KCdpY29uLXBpdGNoLWFsaWdubWVudCcpLFxuICAgICAgICAgICAgbGF5ZXIubGF5b3V0LmdldCgnaWNvbi1rZWVwLXVwcmlnaHQnKSxcbiAgICAgICAgICAgIHN0ZW5jaWxNb2RlLCBjb2xvck1vZGUsIHZhcmlhYmxlT2Zmc2V0c1xuICAgICAgICApO1xuICAgIH1cblxuICAgIGlmIChsYXllci5wYWludC5nZXQoJ3RleHQtb3BhY2l0eScpLmNvbnN0YW50T3IoMSkgIT09IDApIHtcbiAgICAgICAgZHJhd0xheWVyU3ltYm9scyhwYWludGVyLCBzb3VyY2VDYWNoZSwgbGF5ZXIsIGNvb3JkcywgdHJ1ZSxcbiAgICAgICAgICAgIGxheWVyLnBhaW50LmdldCgndGV4dC10cmFuc2xhdGUnKSxcbiAgICAgICAgICAgIGxheWVyLnBhaW50LmdldCgndGV4dC10cmFuc2xhdGUtYW5jaG9yJyksXG4gICAgICAgICAgICBsYXllci5sYXlvdXQuZ2V0KCd0ZXh0LXJvdGF0aW9uLWFsaWdubWVudCcpLFxuICAgICAgICAgICAgbGF5ZXIubGF5b3V0LmdldCgndGV4dC1waXRjaC1hbGlnbm1lbnQnKSxcbiAgICAgICAgICAgIGxheWVyLmxheW91dC5nZXQoJ3RleHQta2VlcC11cHJpZ2h0JyksXG4gICAgICAgICAgICBzdGVuY2lsTW9kZSwgY29sb3JNb2RlLCB2YXJpYWJsZU9mZnNldHNcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoc291cmNlQ2FjaGUubWFwLnNob3dDb2xsaXNpb25Cb3hlcykge1xuICAgICAgICBkcmF3Q29sbGlzaW9uRGVidWcocGFpbnRlciwgc291cmNlQ2FjaGUsIGxheWVyLCBjb29yZHMpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gY2FsY3VsYXRlVmFyaWFibGVSZW5kZXJTaGlmdChhbmNob3IsIHdpZHRoLCBoZWlnaHQsIHJhZGlhbE9mZnNldCwgdGV4dEJveFNjYWxlLCByZW5kZXJUZXh0U2l6ZSk6IFBvaW50IHtcbiAgICBjb25zdCB7aG9yaXpvbnRhbEFsaWduLCB2ZXJ0aWNhbEFsaWdufSA9IGdldEFuY2hvckFsaWdubWVudChhbmNob3IpO1xuICAgIGNvbnN0IHNoaWZ0WCA9IC0oaG9yaXpvbnRhbEFsaWduIC0gMC41KSAqIHdpZHRoO1xuICAgIGNvbnN0IHNoaWZ0WSA9IC0odmVydGljYWxBbGlnbiAtIDAuNSkgKiBoZWlnaHQ7XG4gICAgY29uc3Qgb2Zmc2V0ID0gZXZhbHVhdGVSYWRpYWxPZmZzZXQoYW5jaG9yLCByYWRpYWxPZmZzZXQpO1xuICAgIHJldHVybiBuZXcgUG9pbnQoXG4gICAgICAgIChzaGlmdFggLyB0ZXh0Qm94U2NhbGUgKyBvZmZzZXRbMF0pICogcmVuZGVyVGV4dFNpemUsXG4gICAgICAgIChzaGlmdFkgLyB0ZXh0Qm94U2NhbGUgKyBvZmZzZXRbMV0pICogcmVuZGVyVGV4dFNpemVcbiAgICApO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVWYXJpYWJsZUFuY2hvcnMoYnVja2V0LCByb3RhdGVXaXRoTWFwLCBwaXRjaFdpdGhNYXAsIHZhcmlhYmxlT2Zmc2V0cywgc3ltYm9sU2l6ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm0sIGxhYmVsUGxhbmVNYXRyaXgsIHBvc01hdHJpeCwgdGlsZVNjYWxlLCBzaXplKSB7XG4gICAgY29uc3QgcGxhY2VkU3ltYm9scyA9IGJ1Y2tldC50ZXh0LnBsYWNlZFN5bWJvbEFycmF5O1xuICAgIGNvbnN0IGR5bmFtaWNMYXlvdXRWZXJ0ZXhBcnJheSA9IGJ1Y2tldC50ZXh0LmR5bmFtaWNMYXlvdXRWZXJ0ZXhBcnJheTtcbiAgICBkeW5hbWljTGF5b3V0VmVydGV4QXJyYXkuY2xlYXIoKTtcbiAgICBmb3IgKGxldCBzID0gMDsgcyA8IHBsYWNlZFN5bWJvbHMubGVuZ3RoOyBzKyspIHtcbiAgICAgICAgY29uc3Qgc3ltYm9sOiBhbnkgPSBwbGFjZWRTeW1ib2xzLmdldChzKTtcbiAgICAgICAgY29uc3QgdmFyaWFibGVPZmZzZXQgPSAoIXN5bWJvbC5oaWRkZW4gJiYgc3ltYm9sLmNyb3NzVGlsZUlEKSA/IHZhcmlhYmxlT2Zmc2V0c1tzeW1ib2wuY3Jvc3NUaWxlSURdIDogbnVsbDtcbiAgICAgICAgaWYgKCF2YXJpYWJsZU9mZnNldCkge1xuICAgICAgICAgICAgLy8gVGhlc2Ugc3ltYm9scyBhcmUgZnJvbSBhIGp1c3RpZmljYXRpb24gdGhhdCBpcyBub3QgYmVpbmcgdXNlZCwgb3IgYSBsYWJlbCB0aGF0IHdhc24ndCBwbGFjZWRcbiAgICAgICAgICAgIC8vIHNvIHdlIGRvbid0IG5lZWQgdG8gZG8gdGhlIGV4dHJhIG1hdGggdG8gZmlndXJlIG91dCB3aGF0IGluY3JlbWVudGFsIHNoaWZ0IHRvIGFwcGx5LlxuICAgICAgICAgICAgc3ltYm9sUHJvamVjdGlvbi5oaWRlR2x5cGhzKHN5bWJvbC5udW1HbHlwaHMsIGR5bmFtaWNMYXlvdXRWZXJ0ZXhBcnJheSk7XG4gICAgICAgIH0gZWxzZSAge1xuICAgICAgICAgICAgY29uc3QgdGlsZUFuY2hvciA9IG5ldyBQb2ludChzeW1ib2wuYW5jaG9yWCwgc3ltYm9sLmFuY2hvclkpO1xuICAgICAgICAgICAgY29uc3QgcHJvamVjdGVkQW5jaG9yID0gc3ltYm9sUHJvamVjdGlvbi5wcm9qZWN0KHRpbGVBbmNob3IsIHBpdGNoV2l0aE1hcCA/IHBvc01hdHJpeCA6IGxhYmVsUGxhbmVNYXRyaXgpO1xuICAgICAgICAgICAgY29uc3QgcGVyc3BlY3RpdmVSYXRpbyA9IDAuNSArIDAuNSAqICh0cmFuc2Zvcm0uY2FtZXJhVG9DZW50ZXJEaXN0YW5jZSAvIHByb2plY3RlZEFuY2hvci5zaWduZWREaXN0YW5jZUZyb21DYW1lcmEpO1xuICAgICAgICAgICAgbGV0IHJlbmRlclRleHRTaXplID0gc3ltYm9sU2l6ZS5ldmFsdWF0ZVNpemVGb3JGZWF0dXJlKGJ1Y2tldC50ZXh0U2l6ZURhdGEsIHNpemUsIHN5bWJvbCkgKiBwZXJzcGVjdGl2ZVJhdGlvIC8gT05FX0VNO1xuICAgICAgICAgICAgaWYgKHBpdGNoV2l0aE1hcCkge1xuICAgICAgICAgICAgICAgIC8vIEdvIGZyb20gc2l6ZSBpbiBwaXhlbHMgdG8gZXF1aXZhbGVudCBzaXplIGluIHRpbGUgdW5pdHNcbiAgICAgICAgICAgICAgICByZW5kZXJUZXh0U2l6ZSAqPSBidWNrZXQudGlsZVBpeGVsUmF0aW8gLyB0aWxlU2NhbGU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHsgd2lkdGgsIGhlaWdodCwgcmFkaWFsT2Zmc2V0LCB0ZXh0Qm94U2NhbGUgfSA9IHZhcmlhYmxlT2Zmc2V0O1xuXG4gICAgICAgICAgICBjb25zdCBzaGlmdCA9IGNhbGN1bGF0ZVZhcmlhYmxlUmVuZGVyU2hpZnQoXG4gICAgICAgICAgICAgICAgdmFyaWFibGVPZmZzZXQuYW5jaG9yLCB3aWR0aCwgaGVpZ2h0LCByYWRpYWxPZmZzZXQsIHRleHRCb3hTY2FsZSwgcmVuZGVyVGV4dFNpemUpO1xuXG4gICAgICAgICAgICAvLyBVc3VhbCBjYXNlIGlzIHRoYXQgd2UgdGFrZSB0aGUgcHJvamVjdGVkIGFuY2hvciBhbmQgYWRkIHRoZSBwaXhlbC1iYXNlZCBzaGlmdFxuICAgICAgICAgICAgLy8gY2FsY3VsYXRlZCBhYm92ZS4gSW4gdGhlIChzb21ld2hhdCB3ZWlyZCkgY2FzZSBvZiBwaXRjaC1hbGlnbmVkIHRleHQsIHdlIGFkZCBhbiBlcXVpdmFsZW50XG4gICAgICAgICAgICAvLyB0aWxlLXVuaXQgYmFzZWQgc2hpZnQgdG8gdGhlIGFuY2hvciBiZWZvcmUgcHJvamVjdGluZyB0byB0aGUgbGFiZWwgcGxhbmUuXG4gICAgICAgICAgICBjb25zdCBzaGlmdGVkQW5jaG9yID0gcGl0Y2hXaXRoTWFwID9cbiAgICAgICAgICAgICAgICBzeW1ib2xQcm9qZWN0aW9uLnByb2plY3QodGlsZUFuY2hvci5hZGQoc2hpZnQpLCBsYWJlbFBsYW5lTWF0cml4KS5wb2ludCA6XG4gICAgICAgICAgICAgICAgcHJvamVjdGVkQW5jaG9yLnBvaW50LmFkZChyb3RhdGVXaXRoTWFwID9cbiAgICAgICAgICAgICAgICAgICAgc2hpZnQucm90YXRlKC10cmFuc2Zvcm0uYW5nbGUpIDpcbiAgICAgICAgICAgICAgICAgICAgc2hpZnQpO1xuXG4gICAgICAgICAgICBmb3IgKGxldCBnID0gMDsgZyA8IHN5bWJvbC5udW1HbHlwaHM7IGcrKykge1xuICAgICAgICAgICAgICAgIGFkZER5bmFtaWNBdHRyaWJ1dGVzKGR5bmFtaWNMYXlvdXRWZXJ0ZXhBcnJheSwgc2hpZnRlZEFuY2hvciwgMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgYnVja2V0LnRleHQuZHluYW1pY0xheW91dFZlcnRleEJ1ZmZlci51cGRhdGVEYXRhKGR5bmFtaWNMYXlvdXRWZXJ0ZXhBcnJheSk7XG59XG5cbmZ1bmN0aW9uIGRyYXdMYXllclN5bWJvbHMocGFpbnRlciwgc291cmNlQ2FjaGUsIGxheWVyLCBjb29yZHMsIGlzVGV4dCwgdHJhbnNsYXRlLCB0cmFuc2xhdGVBbmNob3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJvdGF0aW9uQWxpZ25tZW50LCBwaXRjaEFsaWdubWVudCwga2VlcFVwcmlnaHQsIHN0ZW5jaWxNb2RlLCBjb2xvck1vZGUsIHZhcmlhYmxlT2Zmc2V0cykge1xuXG4gICAgY29uc3QgY29udGV4dCA9IHBhaW50ZXIuY29udGV4dDtcbiAgICBjb25zdCBnbCA9IGNvbnRleHQuZ2w7XG4gICAgY29uc3QgdHIgPSBwYWludGVyLnRyYW5zZm9ybTtcblxuICAgIGNvbnN0IHJvdGF0ZVdpdGhNYXAgPSByb3RhdGlvbkFsaWdubWVudCA9PT0gJ21hcCc7XG4gICAgY29uc3QgcGl0Y2hXaXRoTWFwID0gcGl0Y2hBbGlnbm1lbnQgPT09ICdtYXAnO1xuICAgIGNvbnN0IGFsb25nTGluZSA9IHJvdGF0ZVdpdGhNYXAgJiYgbGF5ZXIubGF5b3V0LmdldCgnc3ltYm9sLXBsYWNlbWVudCcpICE9PSAncG9pbnQnO1xuICAgIC8vIExpbmUgbGFiZWwgcm90YXRpb24gaGFwcGVucyBpbiBgdXBkYXRlTGluZUxhYmVsc2BcbiAgICAvLyBQaXRjaGVkIHBvaW50IGxhYmVscyBhcmUgYXV0b21hdGljYWxseSByb3RhdGVkIGJ5IHRoZSBsYWJlbFBsYW5lTWF0cml4IHByb2plY3Rpb25cbiAgICAvLyBVbnBpdGNoZWQgcG9pbnQgbGFiZWxzIG5lZWQgdG8gaGF2ZSB0aGVpciByb3RhdGlvbiBhcHBsaWVkIGFmdGVyIHByb2plY3Rpb25cbiAgICBjb25zdCByb3RhdGVJblNoYWRlciA9IHJvdGF0ZVdpdGhNYXAgJiYgIXBpdGNoV2l0aE1hcCAmJiAhYWxvbmdMaW5lO1xuXG4gICAgY29uc3Qgc29ydEZlYXR1cmVzQnlLZXkgPSBsYXllci5sYXlvdXQuZ2V0KCdzeW1ib2wtc29ydC1rZXknKS5jb25zdGFudE9yKDEpICE9PSB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBkZXB0aE1vZGUgPSBwYWludGVyLmRlcHRoTW9kZUZvclN1YmxheWVyKDAsIERlcHRoTW9kZS5SZWFkT25seSk7XG5cbiAgICBsZXQgcHJvZ3JhbTtcbiAgICBsZXQgc2l6ZTtcbiAgICBjb25zdCB2YXJpYWJsZVBsYWNlbWVudCA9IGxheWVyLmxheW91dC5nZXQoJ3RleHQtdmFyaWFibGUtYW5jaG9yJyk7XG5cbiAgICBjb25zdCB0aWxlUmVuZGVyU3RhdGU6IEFycmF5PFN5bWJvbFRpbGVSZW5kZXJTdGF0ZT4gPSBbXTtcblxuICAgIGZvciAoY29uc3QgY29vcmQgb2YgY29vcmRzKSB7XG4gICAgICAgIGNvbnN0IHRpbGUgPSBzb3VyY2VDYWNoZS5nZXRUaWxlKGNvb3JkKTtcbiAgICAgICAgY29uc3QgYnVja2V0OiBTeW1ib2xCdWNrZXQgPSAodGlsZS5nZXRCdWNrZXQobGF5ZXIpOiBhbnkpO1xuICAgICAgICBpZiAoIWJ1Y2tldCkgY29udGludWU7XG4gICAgICAgIGNvbnN0IGJ1ZmZlcnMgPSBpc1RleHQgPyBidWNrZXQudGV4dCA6IGJ1Y2tldC5pY29uO1xuICAgICAgICBpZiAoIWJ1ZmZlcnMgfHwgIWJ1ZmZlcnMuc2VnbWVudHMuZ2V0KCkubGVuZ3RoKSBjb250aW51ZTtcbiAgICAgICAgY29uc3QgcHJvZ3JhbUNvbmZpZ3VyYXRpb24gPSBidWZmZXJzLnByb2dyYW1Db25maWd1cmF0aW9ucy5nZXQobGF5ZXIuaWQpO1xuXG4gICAgICAgIGNvbnN0IGlzU0RGID0gaXNUZXh0IHx8IGJ1Y2tldC5zZGZJY29ucztcblxuICAgICAgICBjb25zdCBzaXplRGF0YSA9IGlzVGV4dCA/IGJ1Y2tldC50ZXh0U2l6ZURhdGEgOiBidWNrZXQuaWNvblNpemVEYXRhO1xuXG4gICAgICAgIGlmICghcHJvZ3JhbSkge1xuICAgICAgICAgICAgcHJvZ3JhbSA9IHBhaW50ZXIudXNlUHJvZ3JhbShpc1NERiA/ICdzeW1ib2xTREYnIDogJ3N5bWJvbEljb24nLCBwcm9ncmFtQ29uZmlndXJhdGlvbik7XG4gICAgICAgICAgICBzaXplID0gc3ltYm9sU2l6ZS5ldmFsdWF0ZVNpemVGb3Jab29tKHNpemVEYXRhLCB0ci56b29tLCBzeW1ib2xMYXlvdXRQcm9wZXJ0aWVzLnByb3BlcnRpZXNbaXNUZXh0ID8gJ3RleHQtc2l6ZScgOiAnaWNvbi1zaXplJ10pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29udGV4dC5hY3RpdmVUZXh0dXJlLnNldChnbC5URVhUVVJFMCk7XG5cbiAgICAgICAgbGV0IHRleFNpemU6IFtudW1iZXIsIG51bWJlcl07XG4gICAgICAgIGxldCBhdGxhc1RleHR1cmU7XG4gICAgICAgIGxldCBhdGxhc0ludGVycG9sYXRpb247XG4gICAgICAgIGlmIChpc1RleHQpIHtcbiAgICAgICAgICAgIGF0bGFzVGV4dHVyZSA9IHRpbGUuZ2x5cGhBdGxhc1RleHR1cmU7XG4gICAgICAgICAgICBhdGxhc0ludGVycG9sYXRpb24gPSBnbC5MSU5FQVI7XG4gICAgICAgICAgICB0ZXhTaXplID0gdGlsZS5nbHlwaEF0bGFzVGV4dHVyZS5zaXplO1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBpY29uU2NhbGVkID0gbGF5ZXIubGF5b3V0LmdldCgnaWNvbi1zaXplJykuY29uc3RhbnRPcigwKSAhPT0gMSB8fCBidWNrZXQuaWNvbnNOZWVkTGluZWFyO1xuICAgICAgICAgICAgY29uc3QgaWNvblRyYW5zZm9ybWVkID0gcGl0Y2hXaXRoTWFwIHx8IHRyLnBpdGNoICE9PSAwO1xuXG4gICAgICAgICAgICBhdGxhc1RleHR1cmUgPSB0aWxlLmltYWdlQXRsYXNUZXh0dXJlO1xuICAgICAgICAgICAgYXRsYXNJbnRlcnBvbGF0aW9uID0gaXNTREYgfHwgcGFpbnRlci5vcHRpb25zLnJvdGF0aW5nIHx8IHBhaW50ZXIub3B0aW9ucy56b29taW5nIHx8IGljb25TY2FsZWQgfHwgaWNvblRyYW5zZm9ybWVkID9cbiAgICAgICAgICAgICAgICBnbC5MSU5FQVIgOlxuICAgICAgICAgICAgICAgIGdsLk5FQVJFU1Q7XG4gICAgICAgICAgICB0ZXhTaXplID0gdGlsZS5pbWFnZUF0bGFzVGV4dHVyZS5zaXplO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcyA9IHBpeGVsc1RvVGlsZVVuaXRzKHRpbGUsIDEsIHBhaW50ZXIudHJhbnNmb3JtLnpvb20pO1xuICAgICAgICBjb25zdCBsYWJlbFBsYW5lTWF0cml4ID0gc3ltYm9sUHJvamVjdGlvbi5nZXRMYWJlbFBsYW5lTWF0cml4KGNvb3JkLnBvc01hdHJpeCwgcGl0Y2hXaXRoTWFwLCByb3RhdGVXaXRoTWFwLCBwYWludGVyLnRyYW5zZm9ybSwgcyk7XG4gICAgICAgIGNvbnN0IGdsQ29vcmRNYXRyaXggPSBzeW1ib2xQcm9qZWN0aW9uLmdldEdsQ29vcmRNYXRyaXgoY29vcmQucG9zTWF0cml4LCBwaXRjaFdpdGhNYXAsIHJvdGF0ZVdpdGhNYXAsIHBhaW50ZXIudHJhbnNmb3JtLCBzKTtcblxuICAgICAgICBpZiAoYWxvbmdMaW5lKSB7XG4gICAgICAgICAgICBzeW1ib2xQcm9qZWN0aW9uLnVwZGF0ZUxpbmVMYWJlbHMoYnVja2V0LCBjb29yZC5wb3NNYXRyaXgsIHBhaW50ZXIsIGlzVGV4dCwgbGFiZWxQbGFuZU1hdHJpeCwgZ2xDb29yZE1hdHJpeCwgcGl0Y2hXaXRoTWFwLCBrZWVwVXByaWdodCk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNUZXh0ICYmIHNpemUgJiYgdmFyaWFibGVQbGFjZW1lbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRpbGVTY2FsZSA9IE1hdGgucG93KDIsIHRyLnpvb20gLSB0aWxlLnRpbGVJRC5vdmVyc2NhbGVkWik7XG4gICAgICAgICAgICB1cGRhdGVWYXJpYWJsZUFuY2hvcnMoYnVja2V0LCByb3RhdGVXaXRoTWFwLCBwaXRjaFdpdGhNYXAsIHZhcmlhYmxlT2Zmc2V0cywgc3ltYm9sU2l6ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ciwgbGFiZWxQbGFuZU1hdHJpeCwgY29vcmQucG9zTWF0cml4LCB0aWxlU2NhbGUsIHNpemUpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbWF0cml4ID0gcGFpbnRlci50cmFuc2xhdGVQb3NNYXRyaXgoY29vcmQucG9zTWF0cml4LCB0aWxlLCB0cmFuc2xhdGUsIHRyYW5zbGF0ZUFuY2hvciksXG4gICAgICAgICAgICB1TGFiZWxQbGFuZU1hdHJpeCA9IChhbG9uZ0xpbmUgfHwgKGlzVGV4dCAmJiB2YXJpYWJsZVBsYWNlbWVudCkpID8gaWRlbnRpdHlNYXQ0IDogbGFiZWxQbGFuZU1hdHJpeCxcbiAgICAgICAgICAgIHVnbENvb3JkTWF0cml4ID0gcGFpbnRlci50cmFuc2xhdGVQb3NNYXRyaXgoZ2xDb29yZE1hdHJpeCwgdGlsZSwgdHJhbnNsYXRlLCB0cmFuc2xhdGVBbmNob3IsIHRydWUpO1xuXG4gICAgICAgIGNvbnN0IGhhc0hhbG8gPSBpc1NERiAmJiBsYXllci5wYWludC5nZXQoaXNUZXh0ID8gJ3RleHQtaGFsby13aWR0aCcgOiAnaWNvbi1oYWxvLXdpZHRoJykuY29uc3RhbnRPcigxKSAhPT0gMDtcblxuICAgICAgICBsZXQgdW5pZm9ybVZhbHVlcztcbiAgICAgICAgaWYgKGlzU0RGKSB7XG4gICAgICAgICAgICB1bmlmb3JtVmFsdWVzID0gc3ltYm9sU0RGVW5pZm9ybVZhbHVlcyhzaXplRGF0YS5mdW5jdGlvblR5cGUsXG4gICAgICAgICAgICAgICAgc2l6ZSwgcm90YXRlSW5TaGFkZXIsIHBpdGNoV2l0aE1hcCwgcGFpbnRlciwgbWF0cml4LFxuICAgICAgICAgICAgICAgIHVMYWJlbFBsYW5lTWF0cml4LCB1Z2xDb29yZE1hdHJpeCwgaXNUZXh0LCB0ZXhTaXplLCB0cnVlKTtcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdW5pZm9ybVZhbHVlcyA9IHN5bWJvbEljb25Vbmlmb3JtVmFsdWVzKHNpemVEYXRhLmZ1bmN0aW9uVHlwZSxcbiAgICAgICAgICAgICAgICBzaXplLCByb3RhdGVJblNoYWRlciwgcGl0Y2hXaXRoTWFwLCBwYWludGVyLCBtYXRyaXgsXG4gICAgICAgICAgICAgICAgdUxhYmVsUGxhbmVNYXRyaXgsIHVnbENvb3JkTWF0cml4LCBpc1RleHQsIHRleFNpemUpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3RhdGUgPSB7XG4gICAgICAgICAgICBwcm9ncmFtLFxuICAgICAgICAgICAgYnVmZmVycyxcbiAgICAgICAgICAgIHVuaWZvcm1WYWx1ZXMsXG4gICAgICAgICAgICBhdGxhc1RleHR1cmUsXG4gICAgICAgICAgICBhdGxhc0ludGVycG9sYXRpb24sXG4gICAgICAgICAgICBpc1NERixcbiAgICAgICAgICAgIGhhc0hhbG9cbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoc29ydEZlYXR1cmVzQnlLZXkpIHtcbiAgICAgICAgICAgIGNvbnN0IG9sZFNlZ21lbnRzID0gYnVmZmVycy5zZWdtZW50cy5nZXQoKTtcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc2VnbWVudCBvZiBvbGRTZWdtZW50cykge1xuICAgICAgICAgICAgICAgIHRpbGVSZW5kZXJTdGF0ZS5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgc2VnbWVudHM6IG5ldyBTZWdtZW50VmVjdG9yKFtzZWdtZW50XSksXG4gICAgICAgICAgICAgICAgICAgIHNvcnRLZXk6ICgoc2VnbWVudC5zb3J0S2V5OiBhbnkpOiBudW1iZXIpLFxuICAgICAgICAgICAgICAgICAgICBzdGF0ZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGlsZVJlbmRlclN0YXRlLnB1c2goe1xuICAgICAgICAgICAgICAgIHNlZ21lbnRzOiBidWZmZXJzLnNlZ21lbnRzLFxuICAgICAgICAgICAgICAgIHNvcnRLZXk6IDAsXG4gICAgICAgICAgICAgICAgc3RhdGVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNvcnRGZWF0dXJlc0J5S2V5KSB7XG4gICAgICAgIHRpbGVSZW5kZXJTdGF0ZS5zb3J0KChhLCBiKSA9PiBhLnNvcnRLZXkgLSBiLnNvcnRLZXkpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3Qgc2VnbWVudFN0YXRlIG9mIHRpbGVSZW5kZXJTdGF0ZSkge1xuICAgICAgICBjb25zdCBzdGF0ZSA9IHNlZ21lbnRTdGF0ZS5zdGF0ZTtcblxuICAgICAgICBzdGF0ZS5hdGxhc1RleHR1cmUuYmluZChzdGF0ZS5hdGxhc0ludGVycG9sYXRpb24sIGdsLkNMQU1QX1RPX0VER0UpO1xuXG4gICAgICAgIGlmIChzdGF0ZS5pc1NERikge1xuICAgICAgICAgICAgY29uc3QgdW5pZm9ybVZhbHVlcyA9ICgoc3RhdGUudW5pZm9ybVZhbHVlczogYW55KTogVW5pZm9ybVZhbHVlczxTeW1ib2xTREZVbmlmb3Jtc1R5cGU+KTtcbiAgICAgICAgICAgIGlmIChzdGF0ZS5oYXNIYWxvKSB7XG4gICAgICAgICAgICAgICAgdW5pZm9ybVZhbHVlc1sndV9pc19oYWxvJ10gPSAxO1xuICAgICAgICAgICAgICAgIGRyYXdTeW1ib2xFbGVtZW50cyhzdGF0ZS5idWZmZXJzLCBzZWdtZW50U3RhdGUuc2VnbWVudHMsIGxheWVyLCBwYWludGVyLCBzdGF0ZS5wcm9ncmFtLCBkZXB0aE1vZGUsIHN0ZW5jaWxNb2RlLCBjb2xvck1vZGUsIHVuaWZvcm1WYWx1ZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdW5pZm9ybVZhbHVlc1sndV9pc19oYWxvJ10gPSAwO1xuICAgICAgICB9XG4gICAgICAgIGRyYXdTeW1ib2xFbGVtZW50cyhzdGF0ZS5idWZmZXJzLCBzZWdtZW50U3RhdGUuc2VnbWVudHMsIGxheWVyLCBwYWludGVyLCBzdGF0ZS5wcm9ncmFtLCBkZXB0aE1vZGUsIHN0ZW5jaWxNb2RlLCBjb2xvck1vZGUsIHN0YXRlLnVuaWZvcm1WYWx1ZXMpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZHJhd1N5bWJvbEVsZW1lbnRzKGJ1ZmZlcnMsIHNlZ21lbnRzLCBsYXllciwgcGFpbnRlciwgcHJvZ3JhbSwgZGVwdGhNb2RlLCBzdGVuY2lsTW9kZSwgY29sb3JNb2RlLCB1bmlmb3JtVmFsdWVzKSB7XG4gICAgY29uc3QgY29udGV4dCA9IHBhaW50ZXIuY29udGV4dDtcbiAgICBjb25zdCBnbCA9IGNvbnRleHQuZ2w7XG4gICAgcHJvZ3JhbS5kcmF3KGNvbnRleHQsIGdsLlRSSUFOR0xFUywgZGVwdGhNb2RlLCBzdGVuY2lsTW9kZSwgY29sb3JNb2RlLCBDdWxsRmFjZU1vZGUuZGlzYWJsZWQsXG4gICAgICAgIHVuaWZvcm1WYWx1ZXMsIGxheWVyLmlkLCBidWZmZXJzLmxheW91dFZlcnRleEJ1ZmZlcixcbiAgICAgICAgYnVmZmVycy5pbmRleEJ1ZmZlciwgc2VnbWVudHMsIGxheWVyLnBhaW50LFxuICAgICAgICBwYWludGVyLnRyYW5zZm9ybS56b29tLCBidWZmZXJzLnByb2dyYW1Db25maWd1cmF0aW9ucy5nZXQobGF5ZXIuaWQpLFxuICAgICAgICBidWZmZXJzLmR5bmFtaWNMYXlvdXRWZXJ0ZXhCdWZmZXIsIGJ1ZmZlcnMub3BhY2l0eVZlcnRleEJ1ZmZlcik7XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgU3RlbmNpbE1vZGUgZnJvbSAnLi4vZ2wvc3RlbmNpbF9tb2RlJztcbmltcG9ydCBEZXB0aE1vZGUgZnJvbSAnLi4vZ2wvZGVwdGhfbW9kZSc7XG5pbXBvcnQgQ3VsbEZhY2VNb2RlIGZyb20gJy4uL2dsL2N1bGxfZmFjZV9tb2RlJztcbmltcG9ydCB7IGNpcmNsZVVuaWZvcm1WYWx1ZXMgfSBmcm9tICcuL3Byb2dyYW0vY2lyY2xlX3Byb2dyYW0nO1xuXG5pbXBvcnQgdHlwZSBQYWludGVyIGZyb20gJy4vcGFpbnRlcic7XG5pbXBvcnQgdHlwZSBTb3VyY2VDYWNoZSBmcm9tICcuLi9zb3VyY2Uvc291cmNlX2NhY2hlJztcbmltcG9ydCB0eXBlIENpcmNsZVN0eWxlTGF5ZXIgZnJvbSAnLi4vc3R5bGUvc3R5bGVfbGF5ZXIvY2lyY2xlX3N0eWxlX2xheWVyJztcbmltcG9ydCB0eXBlIENpcmNsZUJ1Y2tldCBmcm9tICcuLi9kYXRhL2J1Y2tldC9jaXJjbGVfYnVja2V0JztcbmltcG9ydCB0eXBlIHtPdmVyc2NhbGVkVGlsZUlEfSBmcm9tICcuLi9zb3VyY2UvdGlsZV9pZCc7XG5cbmV4cG9ydCBkZWZhdWx0IGRyYXdDaXJjbGVzO1xuXG5mdW5jdGlvbiBkcmF3Q2lyY2xlcyhwYWludGVyOiBQYWludGVyLCBzb3VyY2VDYWNoZTogU291cmNlQ2FjaGUsIGxheWVyOiBDaXJjbGVTdHlsZUxheWVyLCBjb29yZHM6IEFycmF5PE92ZXJzY2FsZWRUaWxlSUQ+KSB7XG4gICAgaWYgKHBhaW50ZXIucmVuZGVyUGFzcyAhPT0gJ3RyYW5zbHVjZW50JykgcmV0dXJuO1xuXG4gICAgY29uc3Qgb3BhY2l0eSA9IGxheWVyLnBhaW50LmdldCgnY2lyY2xlLW9wYWNpdHknKTtcbiAgICBjb25zdCBzdHJva2VXaWR0aCA9IGxheWVyLnBhaW50LmdldCgnY2lyY2xlLXN0cm9rZS13aWR0aCcpO1xuICAgIGNvbnN0IHN0cm9rZU9wYWNpdHkgPSBsYXllci5wYWludC5nZXQoJ2NpcmNsZS1zdHJva2Utb3BhY2l0eScpO1xuXG4gICAgaWYgKG9wYWNpdHkuY29uc3RhbnRPcigxKSA9PT0gMCAmJiAoc3Ryb2tlV2lkdGguY29uc3RhbnRPcigxKSA9PT0gMCB8fCBzdHJva2VPcGFjaXR5LmNvbnN0YW50T3IoMSkgPT09IDApKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjb250ZXh0ID0gcGFpbnRlci5jb250ZXh0O1xuICAgIGNvbnN0IGdsID0gY29udGV4dC5nbDtcblxuICAgIGNvbnN0IGRlcHRoTW9kZSA9IHBhaW50ZXIuZGVwdGhNb2RlRm9yU3VibGF5ZXIoMCwgRGVwdGhNb2RlLlJlYWRPbmx5KTtcbiAgICAvLyBUdXJuIG9mZiBzdGVuY2lsIHRlc3RpbmcgdG8gYWxsb3cgY2lyY2xlcyB0byBiZSBkcmF3biBhY3Jvc3MgYm91bmRhcmllcyxcbiAgICAvLyBzbyB0aGF0IGxhcmdlIGNpcmNsZXMgYXJlIG5vdCBjbGlwcGVkIHRvIHRpbGVzXG4gICAgY29uc3Qgc3RlbmNpbE1vZGUgPSBTdGVuY2lsTW9kZS5kaXNhYmxlZDtcbiAgICBjb25zdCBjb2xvck1vZGUgPSBwYWludGVyLmNvbG9yTW9kZUZvclJlbmRlclBhc3MoKTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29vcmRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGNvb3JkID0gY29vcmRzW2ldO1xuXG4gICAgICAgIGNvbnN0IHRpbGUgPSBzb3VyY2VDYWNoZS5nZXRUaWxlKGNvb3JkKTtcbiAgICAgICAgY29uc3QgYnVja2V0OiA/Q2lyY2xlQnVja2V0PCo+ID0gKHRpbGUuZ2V0QnVja2V0KGxheWVyKTogYW55KTtcbiAgICAgICAgaWYgKCFidWNrZXQpIGNvbnRpbnVlO1xuXG4gICAgICAgIGNvbnN0IHByb2dyYW1Db25maWd1cmF0aW9uID0gYnVja2V0LnByb2dyYW1Db25maWd1cmF0aW9ucy5nZXQobGF5ZXIuaWQpO1xuICAgICAgICBjb25zdCBwcm9ncmFtID0gcGFpbnRlci51c2VQcm9ncmFtKCdjaXJjbGUnLCBwcm9ncmFtQ29uZmlndXJhdGlvbik7XG5cbiAgICAgICAgcHJvZ3JhbS5kcmF3KGNvbnRleHQsIGdsLlRSSUFOR0xFUywgZGVwdGhNb2RlLCBzdGVuY2lsTW9kZSwgY29sb3JNb2RlLCBDdWxsRmFjZU1vZGUuZGlzYWJsZWQsXG4gICAgICAgICAgICBjaXJjbGVVbmlmb3JtVmFsdWVzKHBhaW50ZXIsIGNvb3JkLCB0aWxlLCBsYXllciksIGxheWVyLmlkLFxuICAgICAgICAgICAgYnVja2V0LmxheW91dFZlcnRleEJ1ZmZlciwgYnVja2V0LmluZGV4QnVmZmVyLCBidWNrZXQuc2VnbWVudHMsXG4gICAgICAgICAgICBsYXllci5wYWludCwgcGFpbnRlci50cmFuc2Zvcm0uem9vbSwgcHJvZ3JhbUNvbmZpZ3VyYXRpb24pO1xuICAgIH1cbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCBUZXh0dXJlIGZyb20gJy4vdGV4dHVyZSc7XG5pbXBvcnQgQ29sb3IgZnJvbSAnLi4vc3R5bGUtc3BlYy91dGlsL2NvbG9yJztcbmltcG9ydCBEZXB0aE1vZGUgZnJvbSAnLi4vZ2wvZGVwdGhfbW9kZSc7XG5pbXBvcnQgU3RlbmNpbE1vZGUgZnJvbSAnLi4vZ2wvc3RlbmNpbF9tb2RlJztcbmltcG9ydCBDb2xvck1vZGUgZnJvbSAnLi4vZ2wvY29sb3JfbW9kZSc7XG5pbXBvcnQgQ3VsbEZhY2VNb2RlIGZyb20gJy4uL2dsL2N1bGxfZmFjZV9tb2RlJztcbmltcG9ydCB7XG4gICAgaGVhdG1hcFVuaWZvcm1WYWx1ZXMsXG4gICAgaGVhdG1hcFRleHR1cmVVbmlmb3JtVmFsdWVzXG59IGZyb20gJy4vcHJvZ3JhbS9oZWF0bWFwX3Byb2dyYW0nO1xuXG5pbXBvcnQgdHlwZSBQYWludGVyIGZyb20gJy4vcGFpbnRlcic7XG5pbXBvcnQgdHlwZSBTb3VyY2VDYWNoZSBmcm9tICcuLi9zb3VyY2Uvc291cmNlX2NhY2hlJztcbmltcG9ydCB0eXBlIEhlYXRtYXBTdHlsZUxheWVyIGZyb20gJy4uL3N0eWxlL3N0eWxlX2xheWVyL2hlYXRtYXBfc3R5bGVfbGF5ZXInO1xuaW1wb3J0IHR5cGUgSGVhdG1hcEJ1Y2tldCBmcm9tICcuLi9kYXRhL2J1Y2tldC9oZWF0bWFwX2J1Y2tldCc7XG5pbXBvcnQgdHlwZSB7T3ZlcnNjYWxlZFRpbGVJRH0gZnJvbSAnLi4vc291cmNlL3RpbGVfaWQnO1xuXG5leHBvcnQgZGVmYXVsdCBkcmF3SGVhdG1hcDtcblxuZnVuY3Rpb24gZHJhd0hlYXRtYXAocGFpbnRlcjogUGFpbnRlciwgc291cmNlQ2FjaGU6IFNvdXJjZUNhY2hlLCBsYXllcjogSGVhdG1hcFN0eWxlTGF5ZXIsIGNvb3JkczogQXJyYXk8T3ZlcnNjYWxlZFRpbGVJRD4pIHtcbiAgICBpZiAobGF5ZXIucGFpbnQuZ2V0KCdoZWF0bWFwLW9wYWNpdHknKSA9PT0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHBhaW50ZXIucmVuZGVyUGFzcyA9PT0gJ29mZnNjcmVlbicpIHtcbiAgICAgICAgY29uc3QgY29udGV4dCA9IHBhaW50ZXIuY29udGV4dDtcbiAgICAgICAgY29uc3QgZ2wgPSBjb250ZXh0LmdsO1xuXG4gICAgICAgIGNvbnN0IGRlcHRoTW9kZSA9IHBhaW50ZXIuZGVwdGhNb2RlRm9yU3VibGF5ZXIoMCwgRGVwdGhNb2RlLlJlYWRPbmx5KTtcbiAgICAgICAgLy8gQWxsb3cga2VybmVscyB0byBiZSBkcmF3biBhY3Jvc3MgYm91bmRhcmllcywgc28gdGhhdFxuICAgICAgICAvLyBsYXJnZSBrZXJuZWxzIGFyZSBub3QgY2xpcHBlZCB0byB0aWxlc1xuICAgICAgICBjb25zdCBzdGVuY2lsTW9kZSA9IFN0ZW5jaWxNb2RlLmRpc2FibGVkO1xuICAgICAgICAvLyBUdXJuIG9uIGFkZGl0aXZlIGJsZW5kaW5nIGZvciBrZXJuZWxzLCB3aGljaCBpcyBhIGtleSBhc3BlY3Qgb2Yga2VybmVsIGRlbnNpdHkgZXN0aW1hdGlvbiBmb3JtdWxhXG4gICAgICAgIGNvbnN0IGNvbG9yTW9kZSA9IG5ldyBDb2xvck1vZGUoW2dsLk9ORSwgZ2wuT05FXSwgQ29sb3IudHJhbnNwYXJlbnQsIFt0cnVlLCB0cnVlLCB0cnVlLCB0cnVlXSk7XG5cbiAgICAgICAgYmluZEZyYW1lYnVmZmVyKGNvbnRleHQsIHBhaW50ZXIsIGxheWVyKTtcblxuICAgICAgICBjb250ZXh0LmNsZWFyKHsgY29sb3I6IENvbG9yLnRyYW5zcGFyZW50IH0pO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29vcmRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBjb29yZCA9IGNvb3Jkc1tpXTtcblxuICAgICAgICAgICAgLy8gU2tpcCB0aWxlcyB0aGF0IGhhdmUgdW5jb3ZlcmVkIHBhcmVudHMgdG8gYXZvaWQgZmxpY2tlcmluZzsgd2UgZG9uJ3QgbmVlZFxuICAgICAgICAgICAgLy8gdG8gdXNlIGNvbXBsZXggdGlsZSBtYXNraW5nIGhlcmUgYmVjYXVzZSB0aGUgY2hhbmdlIGJldHdlZW4gem9vbSBsZXZlbHMgaXMgc3VidGxlLFxuICAgICAgICAgICAgLy8gc28gaXQncyBmaW5lIHRvIHNpbXBseSByZW5kZXIgdGhlIHBhcmVudCB1bnRpbCBhbGwgaXRzIDQgY2hpbGRyZW4gYXJlIGxvYWRlZFxuICAgICAgICAgICAgaWYgKHNvdXJjZUNhY2hlLmhhc1JlbmRlcmFibGVQYXJlbnQoY29vcmQpKSBjb250aW51ZTtcblxuICAgICAgICAgICAgY29uc3QgdGlsZSA9IHNvdXJjZUNhY2hlLmdldFRpbGUoY29vcmQpO1xuICAgICAgICAgICAgY29uc3QgYnVja2V0OiA/SGVhdG1hcEJ1Y2tldCA9ICh0aWxlLmdldEJ1Y2tldChsYXllcik6IGFueSk7XG4gICAgICAgICAgICBpZiAoIWJ1Y2tldCkgY29udGludWU7XG5cbiAgICAgICAgICAgIGNvbnN0IHByb2dyYW1Db25maWd1cmF0aW9uID0gYnVja2V0LnByb2dyYW1Db25maWd1cmF0aW9ucy5nZXQobGF5ZXIuaWQpO1xuICAgICAgICAgICAgY29uc3QgcHJvZ3JhbSA9IHBhaW50ZXIudXNlUHJvZ3JhbSgnaGVhdG1hcCcsIHByb2dyYW1Db25maWd1cmF0aW9uKTtcbiAgICAgICAgICAgIGNvbnN0IHt6b29tfSA9IHBhaW50ZXIudHJhbnNmb3JtO1xuXG4gICAgICAgICAgICBwcm9ncmFtLmRyYXcoY29udGV4dCwgZ2wuVFJJQU5HTEVTLCBkZXB0aE1vZGUsIHN0ZW5jaWxNb2RlLCBjb2xvck1vZGUsIEN1bGxGYWNlTW9kZS5kaXNhYmxlZCxcbiAgICAgICAgICAgICAgICBoZWF0bWFwVW5pZm9ybVZhbHVlcyhjb29yZC5wb3NNYXRyaXgsXG4gICAgICAgICAgICAgICAgICAgIHRpbGUsIHpvb20sIGxheWVyLnBhaW50LmdldCgnaGVhdG1hcC1pbnRlbnNpdHknKSksXG4gICAgICAgICAgICAgICAgbGF5ZXIuaWQsIGJ1Y2tldC5sYXlvdXRWZXJ0ZXhCdWZmZXIsIGJ1Y2tldC5pbmRleEJ1ZmZlcixcbiAgICAgICAgICAgICAgICBidWNrZXQuc2VnbWVudHMsIGxheWVyLnBhaW50LCBwYWludGVyLnRyYW5zZm9ybS56b29tLFxuICAgICAgICAgICAgICAgIHByb2dyYW1Db25maWd1cmF0aW9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRleHQudmlld3BvcnQuc2V0KFswLCAwLCBwYWludGVyLndpZHRoLCBwYWludGVyLmhlaWdodF0pO1xuXG4gICAgfSBlbHNlIGlmIChwYWludGVyLnJlbmRlclBhc3MgPT09ICd0cmFuc2x1Y2VudCcpIHtcbiAgICAgICAgcGFpbnRlci5jb250ZXh0LnNldENvbG9yTW9kZShwYWludGVyLmNvbG9yTW9kZUZvclJlbmRlclBhc3MoKSk7XG4gICAgICAgIHJlbmRlclRleHR1cmVUb01hcChwYWludGVyLCBsYXllcik7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBiaW5kRnJhbWVidWZmZXIoY29udGV4dCwgcGFpbnRlciwgbGF5ZXIpIHtcbiAgICBjb25zdCBnbCA9IGNvbnRleHQuZ2w7XG4gICAgY29udGV4dC5hY3RpdmVUZXh0dXJlLnNldChnbC5URVhUVVJFMSk7XG5cbiAgICAvLyBVc2UgYSA0eCBkb3duc2NhbGVkIHNjcmVlbiB0ZXh0dXJlIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2VcbiAgICBjb250ZXh0LnZpZXdwb3J0LnNldChbMCwgMCwgcGFpbnRlci53aWR0aCAvIDQsIHBhaW50ZXIuaGVpZ2h0IC8gNF0pO1xuXG4gICAgbGV0IGZibyA9IGxheWVyLmhlYXRtYXBGYm87XG5cbiAgICBpZiAoIWZibykge1xuICAgICAgICBjb25zdCB0ZXh0dXJlID0gZ2wuY3JlYXRlVGV4dHVyZSgpO1xuICAgICAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCB0ZXh0dXJlKTtcbiAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX1dSQVBfUywgZ2wuQ0xBTVBfVE9fRURHRSk7XG4gICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9XUkFQX1QsIGdsLkNMQU1QX1RPX0VER0UpO1xuICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUlOX0ZJTFRFUiwgZ2wuTElORUFSKTtcbiAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01BR19GSUxURVIsIGdsLkxJTkVBUik7XG5cbiAgICAgICAgZmJvID0gbGF5ZXIuaGVhdG1hcEZibyA9IGNvbnRleHQuY3JlYXRlRnJhbWVidWZmZXIocGFpbnRlci53aWR0aCAvIDQsIHBhaW50ZXIuaGVpZ2h0IC8gNCk7XG5cbiAgICAgICAgYmluZFRleHR1cmVUb0ZyYW1lYnVmZmVyKGNvbnRleHQsIHBhaW50ZXIsIHRleHR1cmUsIGZibyk7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCBmYm8uY29sb3JBdHRhY2htZW50LmdldCgpKTtcbiAgICAgICAgY29udGV4dC5iaW5kRnJhbWVidWZmZXIuc2V0KGZiby5mcmFtZWJ1ZmZlcik7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBiaW5kVGV4dHVyZVRvRnJhbWVidWZmZXIoY29udGV4dCwgcGFpbnRlciwgdGV4dHVyZSwgZmJvKSB7XG4gICAgY29uc3QgZ2wgPSBjb250ZXh0LmdsO1xuICAgIC8vIFVzZSB0aGUgaGlnaGVyIHByZWNpc2lvbiBoYWxmLWZsb2F0IHRleHR1cmUgd2hlcmUgYXZhaWxhYmxlIChwcm9kdWNpbmcgbXVjaCBzbW9vdGhlciBsb29raW5nIGhlYXRtYXBzKTtcbiAgICBnbC50ZXhJbWFnZTJEKGdsLlRFWFRVUkVfMkQsIDAsIGdsLlJHQkEsIHBhaW50ZXIud2lkdGggLyA0LCBwYWludGVyLmhlaWdodCAvIDQsIDAsIGdsLlJHQkEsXG4gICAgICAgIGNvbnRleHQuZXh0VGV4dHVyZUhhbGZGbG9hdCA/IGNvbnRleHQuZXh0VGV4dHVyZUhhbGZGbG9hdC5IQUxGX0ZMT0FUX09FUyA6IGdsLlVOU0lHTkVEX0JZVEUsIG51bGwpO1xuXG4gICAgZmJvLmNvbG9yQXR0YWNobWVudC5zZXQodGV4dHVyZSk7XG5cbiAgICAvLyBJZiB1c2luZyBoYWxmLWZsb2F0IHRleHR1cmUgYXMgYSByZW5kZXIgdGFyZ2V0IGlzIG5vdCBzdXBwb3J0ZWQsIGZhbGwgYmFjayB0byBhIGxvdyBwcmVjaXNpb24gdGV4dHVyZVxuICAgIGlmIChjb250ZXh0LmV4dFRleHR1cmVIYWxmRmxvYXQgJiYgZ2wuY2hlY2tGcmFtZWJ1ZmZlclN0YXR1cyhnbC5GUkFNRUJVRkZFUikgIT09IGdsLkZSQU1FQlVGRkVSX0NPTVBMRVRFKSB7XG4gICAgICAgIGNvbnRleHQuZXh0VGV4dHVyZUhhbGZGbG9hdCA9IG51bGw7XG4gICAgICAgIGZiby5jb2xvckF0dGFjaG1lbnQuc2V0RGlydHkoKTtcbiAgICAgICAgYmluZFRleHR1cmVUb0ZyYW1lYnVmZmVyKGNvbnRleHQsIHBhaW50ZXIsIHRleHR1cmUsIGZibyk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiByZW5kZXJUZXh0dXJlVG9NYXAocGFpbnRlciwgbGF5ZXIpIHtcbiAgICBjb25zdCBjb250ZXh0ID0gcGFpbnRlci5jb250ZXh0O1xuICAgIGNvbnN0IGdsID0gY29udGV4dC5nbDtcblxuICAgIC8vIEhlcmUgd2UgYmluZCB0d28gZGlmZmVyZW50IHRleHR1cmVzIGZyb20gd2hpY2ggd2UnbGwgc2FtcGxlIGluIGRyYXdpbmdcbiAgICAvLyBoZWF0bWFwczogdGhlIGtlcm5lbCB0ZXh0dXJlLCBwcmVwYXJlZCBpbiB0aGUgb2Zmc2NyZWVuIHBhc3MsIGFuZCBhXG4gICAgLy8gY29sb3IgcmFtcCB0ZXh0dXJlLlxuICAgIGNvbnN0IGZibyA9IGxheWVyLmhlYXRtYXBGYm87XG4gICAgaWYgKCFmYm8pIHJldHVybjtcbiAgICBjb250ZXh0LmFjdGl2ZVRleHR1cmUuc2V0KGdsLlRFWFRVUkUwKTtcbiAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCBmYm8uY29sb3JBdHRhY2htZW50LmdldCgpKTtcblxuICAgIGNvbnRleHQuYWN0aXZlVGV4dHVyZS5zZXQoZ2wuVEVYVFVSRTEpO1xuICAgIGxldCBjb2xvclJhbXBUZXh0dXJlID0gbGF5ZXIuY29sb3JSYW1wVGV4dHVyZTtcbiAgICBpZiAoIWNvbG9yUmFtcFRleHR1cmUpIHtcbiAgICAgICAgY29sb3JSYW1wVGV4dHVyZSA9IGxheWVyLmNvbG9yUmFtcFRleHR1cmUgPSBuZXcgVGV4dHVyZShjb250ZXh0LCBsYXllci5jb2xvclJhbXAsIGdsLlJHQkEpO1xuICAgIH1cbiAgICBjb2xvclJhbXBUZXh0dXJlLmJpbmQoZ2wuTElORUFSLCBnbC5DTEFNUF9UT19FREdFKTtcblxuICAgIHBhaW50ZXIudXNlUHJvZ3JhbSgnaGVhdG1hcFRleHR1cmUnKS5kcmF3KGNvbnRleHQsIGdsLlRSSUFOR0xFUyxcbiAgICAgICAgRGVwdGhNb2RlLmRpc2FibGVkLCBTdGVuY2lsTW9kZS5kaXNhYmxlZCwgcGFpbnRlci5jb2xvck1vZGVGb3JSZW5kZXJQYXNzKCksIEN1bGxGYWNlTW9kZS5kaXNhYmxlZCxcbiAgICAgICAgaGVhdG1hcFRleHR1cmVVbmlmb3JtVmFsdWVzKHBhaW50ZXIsIGxheWVyLCAwLCAxKSxcbiAgICAgICAgbGF5ZXIuaWQsIHBhaW50ZXIudmlld3BvcnRCdWZmZXIsIHBhaW50ZXIucXVhZFRyaWFuZ2xlSW5kZXhCdWZmZXIsXG4gICAgICAgIHBhaW50ZXIudmlld3BvcnRTZWdtZW50cywgbGF5ZXIucGFpbnQsIHBhaW50ZXIudHJhbnNmb3JtLnpvb20pO1xufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IERlcHRoTW9kZSBmcm9tICcuLi9nbC9kZXB0aF9tb2RlJztcbmltcG9ydCBDdWxsRmFjZU1vZGUgZnJvbSAnLi4vZ2wvY3VsbF9mYWNlX21vZGUnO1xuaW1wb3J0IFRleHR1cmUgZnJvbSAnLi90ZXh0dXJlJztcbmltcG9ydCB7XG4gICAgbGluZVVuaWZvcm1WYWx1ZXMsXG4gICAgbGluZVBhdHRlcm5Vbmlmb3JtVmFsdWVzLFxuICAgIGxpbmVTREZVbmlmb3JtVmFsdWVzLFxuICAgIGxpbmVHcmFkaWVudFVuaWZvcm1WYWx1ZXNcbn0gZnJvbSAnLi9wcm9ncmFtL2xpbmVfcHJvZ3JhbSc7XG5cbmltcG9ydCB0eXBlIFBhaW50ZXIgZnJvbSAnLi9wYWludGVyJztcbmltcG9ydCB0eXBlIFNvdXJjZUNhY2hlIGZyb20gJy4uL3NvdXJjZS9zb3VyY2VfY2FjaGUnO1xuaW1wb3J0IHR5cGUgTGluZVN0eWxlTGF5ZXIgZnJvbSAnLi4vc3R5bGUvc3R5bGVfbGF5ZXIvbGluZV9zdHlsZV9sYXllcic7XG5pbXBvcnQgdHlwZSBMaW5lQnVja2V0IGZyb20gJy4uL2RhdGEvYnVja2V0L2xpbmVfYnVja2V0JztcbmltcG9ydCB0eXBlIHtPdmVyc2NhbGVkVGlsZUlEfSBmcm9tICcuLi9zb3VyY2UvdGlsZV9pZCc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGRyYXdMaW5lKHBhaW50ZXI6IFBhaW50ZXIsIHNvdXJjZUNhY2hlOiBTb3VyY2VDYWNoZSwgbGF5ZXI6IExpbmVTdHlsZUxheWVyLCBjb29yZHM6IEFycmF5PE92ZXJzY2FsZWRUaWxlSUQ+KSB7XG4gICAgaWYgKHBhaW50ZXIucmVuZGVyUGFzcyAhPT0gJ3RyYW5zbHVjZW50JykgcmV0dXJuO1xuXG4gICAgY29uc3Qgb3BhY2l0eSA9IGxheWVyLnBhaW50LmdldCgnbGluZS1vcGFjaXR5Jyk7XG4gICAgY29uc3Qgd2lkdGggPSBsYXllci5wYWludC5nZXQoJ2xpbmUtd2lkdGgnKTtcbiAgICBpZiAob3BhY2l0eS5jb25zdGFudE9yKDEpID09PSAwIHx8IHdpZHRoLmNvbnN0YW50T3IoMSkgPT09IDApIHJldHVybjtcblxuICAgIGNvbnN0IGRlcHRoTW9kZSA9IHBhaW50ZXIuZGVwdGhNb2RlRm9yU3VibGF5ZXIoMCwgRGVwdGhNb2RlLlJlYWRPbmx5KTtcbiAgICBjb25zdCBjb2xvck1vZGUgPSBwYWludGVyLmNvbG9yTW9kZUZvclJlbmRlclBhc3MoKTtcblxuICAgIGNvbnN0IGRhc2hhcnJheSA9IGxheWVyLnBhaW50LmdldCgnbGluZS1kYXNoYXJyYXknKTtcbiAgICBjb25zdCBwYXR0ZXJuUHJvcGVydHkgPSBsYXllci5wYWludC5nZXQoJ2xpbmUtcGF0dGVybicpO1xuICAgIGNvbnN0IGltYWdlID0gcGF0dGVyblByb3BlcnR5LmNvbnN0YW50T3IoKDE6IGFueSkpO1xuXG4gICAgY29uc3QgZ3JhZGllbnQgPSBsYXllci5wYWludC5nZXQoJ2xpbmUtZ3JhZGllbnQnKTtcbiAgICBjb25zdCBjcm9zc2ZhZGUgPSBsYXllci5nZXRDcm9zc2ZhZGVQYXJhbWV0ZXJzKCk7XG5cbiAgICBjb25zdCBwcm9ncmFtSWQgPVxuICAgICAgICBkYXNoYXJyYXkgPyAnbGluZVNERicgOlxuICAgICAgICBpbWFnZSA/ICdsaW5lUGF0dGVybicgOlxuICAgICAgICBncmFkaWVudCA/ICdsaW5lR3JhZGllbnQnIDogJ2xpbmUnO1xuXG4gICAgY29uc3QgY29udGV4dCA9IHBhaW50ZXIuY29udGV4dDtcbiAgICBjb25zdCBnbCA9IGNvbnRleHQuZ2w7XG5cbiAgICBsZXQgZmlyc3RUaWxlID0gdHJ1ZTtcblxuICAgIGlmIChncmFkaWVudCkge1xuICAgICAgICBjb250ZXh0LmFjdGl2ZVRleHR1cmUuc2V0KGdsLlRFWFRVUkUwKTtcblxuICAgICAgICBsZXQgZ3JhZGllbnRUZXh0dXJlID0gbGF5ZXIuZ3JhZGllbnRUZXh0dXJlO1xuICAgICAgICBpZiAoIWxheWVyLmdyYWRpZW50KSByZXR1cm47XG4gICAgICAgIGlmICghZ3JhZGllbnRUZXh0dXJlKSBncmFkaWVudFRleHR1cmUgPSBsYXllci5ncmFkaWVudFRleHR1cmUgPSBuZXcgVGV4dHVyZShjb250ZXh0LCBsYXllci5ncmFkaWVudCwgZ2wuUkdCQSk7XG4gICAgICAgIGdyYWRpZW50VGV4dHVyZS5iaW5kKGdsLkxJTkVBUiwgZ2wuQ0xBTVBfVE9fRURHRSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBjb29yZCBvZiBjb29yZHMpIHtcbiAgICAgICAgY29uc3QgdGlsZSA9IHNvdXJjZUNhY2hlLmdldFRpbGUoY29vcmQpO1xuXG4gICAgICAgIGlmIChpbWFnZSAmJiAhdGlsZS5wYXR0ZXJuc0xvYWRlZCgpKSBjb250aW51ZTtcblxuICAgICAgICBjb25zdCBidWNrZXQ6ID9MaW5lQnVja2V0ID0gKHRpbGUuZ2V0QnVja2V0KGxheWVyKTogYW55KTtcbiAgICAgICAgaWYgKCFidWNrZXQpIGNvbnRpbnVlO1xuXG4gICAgICAgIGNvbnN0IHByb2dyYW1Db25maWd1cmF0aW9uID0gYnVja2V0LnByb2dyYW1Db25maWd1cmF0aW9ucy5nZXQobGF5ZXIuaWQpO1xuICAgICAgICBjb25zdCBwcmV2UHJvZ3JhbSA9IHBhaW50ZXIuY29udGV4dC5wcm9ncmFtLmdldCgpO1xuICAgICAgICBjb25zdCBwcm9ncmFtID0gcGFpbnRlci51c2VQcm9ncmFtKHByb2dyYW1JZCwgcHJvZ3JhbUNvbmZpZ3VyYXRpb24pO1xuICAgICAgICBjb25zdCBwcm9ncmFtQ2hhbmdlZCA9IGZpcnN0VGlsZSB8fCBwcm9ncmFtLnByb2dyYW0gIT09IHByZXZQcm9ncmFtO1xuXG4gICAgICAgIGNvbnN0IGNvbnN0YW50UGF0dGVybiA9IHBhdHRlcm5Qcm9wZXJ0eS5jb25zdGFudE9yKG51bGwpO1xuICAgICAgICBpZiAoY29uc3RhbnRQYXR0ZXJuICYmIHRpbGUuaW1hZ2VBdGxhcykge1xuICAgICAgICAgICAgY29uc3QgcG9zVG8gPSB0aWxlLmltYWdlQXRsYXMucGF0dGVyblBvc2l0aW9uc1tjb25zdGFudFBhdHRlcm4udG9dO1xuICAgICAgICAgICAgY29uc3QgcG9zRnJvbSA9IHRpbGUuaW1hZ2VBdGxhcy5wYXR0ZXJuUG9zaXRpb25zW2NvbnN0YW50UGF0dGVybi5mcm9tXTtcbiAgICAgICAgICAgIGlmIChwb3NUbyAmJiBwb3NGcm9tKSBwcm9ncmFtQ29uZmlndXJhdGlvbi5zZXRDb25zdGFudFBhdHRlcm5Qb3NpdGlvbnMocG9zVG8sIHBvc0Zyb20pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdW5pZm9ybVZhbHVlcyA9IGRhc2hhcnJheSA/IGxpbmVTREZVbmlmb3JtVmFsdWVzKHBhaW50ZXIsIHRpbGUsIGxheWVyLCBkYXNoYXJyYXksIGNyb3NzZmFkZSkgOlxuICAgICAgICAgICAgaW1hZ2UgPyBsaW5lUGF0dGVyblVuaWZvcm1WYWx1ZXMocGFpbnRlciwgdGlsZSwgbGF5ZXIsIGNyb3NzZmFkZSkgOlxuICAgICAgICAgICAgZ3JhZGllbnQgPyBsaW5lR3JhZGllbnRVbmlmb3JtVmFsdWVzKHBhaW50ZXIsIHRpbGUsIGxheWVyKSA6XG4gICAgICAgICAgICBsaW5lVW5pZm9ybVZhbHVlcyhwYWludGVyLCB0aWxlLCBsYXllcik7XG5cbiAgICAgICAgaWYgKGRhc2hhcnJheSAmJiAocHJvZ3JhbUNoYW5nZWQgfHwgcGFpbnRlci5saW5lQXRsYXMuZGlydHkpKSB7XG4gICAgICAgICAgICBjb250ZXh0LmFjdGl2ZVRleHR1cmUuc2V0KGdsLlRFWFRVUkUwKTtcbiAgICAgICAgICAgIHBhaW50ZXIubGluZUF0bGFzLmJpbmQoY29udGV4dCk7XG4gICAgICAgIH0gZWxzZSBpZiAoaW1hZ2UpIHtcbiAgICAgICAgICAgIGNvbnRleHQuYWN0aXZlVGV4dHVyZS5zZXQoZ2wuVEVYVFVSRTApO1xuICAgICAgICAgICAgdGlsZS5pbWFnZUF0bGFzVGV4dHVyZS5iaW5kKGdsLkxJTkVBUiwgZ2wuQ0xBTVBfVE9fRURHRSk7XG4gICAgICAgICAgICBwcm9ncmFtQ29uZmlndXJhdGlvbi51cGRhdGVQYXR0ZXJuUGFpbnRCdWZmZXJzKGNyb3NzZmFkZSk7XG4gICAgICAgIH1cblxuICAgICAgICBwcm9ncmFtLmRyYXcoY29udGV4dCwgZ2wuVFJJQU5HTEVTLCBkZXB0aE1vZGUsXG4gICAgICAgICAgICBwYWludGVyLnN0ZW5jaWxNb2RlRm9yQ2xpcHBpbmcoY29vcmQpLCBjb2xvck1vZGUsIEN1bGxGYWNlTW9kZS5kaXNhYmxlZCwgdW5pZm9ybVZhbHVlcyxcbiAgICAgICAgICAgIGxheWVyLmlkLCBidWNrZXQubGF5b3V0VmVydGV4QnVmZmVyLCBidWNrZXQuaW5kZXhCdWZmZXIsIGJ1Y2tldC5zZWdtZW50cyxcbiAgICAgICAgICAgIGxheWVyLnBhaW50LCBwYWludGVyLnRyYW5zZm9ybS56b29tLCBwcm9ncmFtQ29uZmlndXJhdGlvbik7XG5cbiAgICAgICAgZmlyc3RUaWxlID0gZmFsc2U7XG4gICAgICAgIC8vIG9uY2UgcmVmYWN0b3JlZCBzbyB0aGF0IGJvdW5kIHRleHR1cmUgc3RhdGUgaXMgbWFuYWdlZCwgd2UnbGwgYWxzbyBiZSBhYmxlIHRvIHJlbW92ZSB0aGlzIGZpcnN0VGlsZS9wcm9ncmFtQ2hhbmdlZCBsb2dpY1xuICAgIH1cbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCBDb2xvciBmcm9tICcuLi9zdHlsZS1zcGVjL3V0aWwvY29sb3InO1xuaW1wb3J0IERlcHRoTW9kZSBmcm9tICcuLi9nbC9kZXB0aF9tb2RlJztcbmltcG9ydCBDdWxsRmFjZU1vZGUgZnJvbSAnLi4vZ2wvY3VsbF9mYWNlX21vZGUnO1xuaW1wb3J0IHtcbiAgICBmaWxsVW5pZm9ybVZhbHVlcyxcbiAgICBmaWxsUGF0dGVyblVuaWZvcm1WYWx1ZXMsXG4gICAgZmlsbE91dGxpbmVVbmlmb3JtVmFsdWVzLFxuICAgIGZpbGxPdXRsaW5lUGF0dGVyblVuaWZvcm1WYWx1ZXNcbn0gZnJvbSAnLi9wcm9ncmFtL2ZpbGxfcHJvZ3JhbSc7XG5cbmltcG9ydCB0eXBlIFBhaW50ZXIgZnJvbSAnLi9wYWludGVyJztcbmltcG9ydCB0eXBlIFNvdXJjZUNhY2hlIGZyb20gJy4uL3NvdXJjZS9zb3VyY2VfY2FjaGUnO1xuaW1wb3J0IHR5cGUgRmlsbFN0eWxlTGF5ZXIgZnJvbSAnLi4vc3R5bGUvc3R5bGVfbGF5ZXIvZmlsbF9zdHlsZV9sYXllcic7XG5pbXBvcnQgdHlwZSBGaWxsQnVja2V0IGZyb20gJy4uL2RhdGEvYnVja2V0L2ZpbGxfYnVja2V0JztcbmltcG9ydCB0eXBlIHtPdmVyc2NhbGVkVGlsZUlEfSBmcm9tICcuLi9zb3VyY2UvdGlsZV9pZCc7XG5cbmV4cG9ydCBkZWZhdWx0IGRyYXdGaWxsO1xuXG5mdW5jdGlvbiBkcmF3RmlsbChwYWludGVyOiBQYWludGVyLCBzb3VyY2VDYWNoZTogU291cmNlQ2FjaGUsIGxheWVyOiBGaWxsU3R5bGVMYXllciwgY29vcmRzOiBBcnJheTxPdmVyc2NhbGVkVGlsZUlEPikge1xuICAgIGNvbnN0IGNvbG9yID0gbGF5ZXIucGFpbnQuZ2V0KCdmaWxsLWNvbG9yJyk7XG4gICAgY29uc3Qgb3BhY2l0eSA9IGxheWVyLnBhaW50LmdldCgnZmlsbC1vcGFjaXR5Jyk7XG5cbiAgICBpZiAob3BhY2l0eS5jb25zdGFudE9yKDEpID09PSAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjb2xvck1vZGUgPSBwYWludGVyLmNvbG9yTW9kZUZvclJlbmRlclBhc3MoKTtcblxuICAgIGNvbnN0IHBhdHRlcm4gPSBsYXllci5wYWludC5nZXQoJ2ZpbGwtcGF0dGVybicpO1xuICAgIGNvbnN0IHBhc3MgPSBwYWludGVyLm9wYXF1ZVBhc3NFbmFibGVkRm9yTGF5ZXIoKSAmJlxuICAgICAgICAoIXBhdHRlcm4uY29uc3RhbnRPcigoMTogYW55KSkgJiZcbiAgICAgICAgY29sb3IuY29uc3RhbnRPcihDb2xvci50cmFuc3BhcmVudCkuYSA9PT0gMSAmJlxuICAgICAgICBvcGFjaXR5LmNvbnN0YW50T3IoMCkgPT09IDEpID8gJ29wYXF1ZScgOiAndHJhbnNsdWNlbnQnO1xuXG4gICAgLy8gRHJhdyBmaWxsXG4gICAgaWYgKHBhaW50ZXIucmVuZGVyUGFzcyA9PT0gcGFzcykge1xuICAgICAgICBjb25zdCBkZXB0aE1vZGUgPSBwYWludGVyLmRlcHRoTW9kZUZvclN1YmxheWVyKFxuICAgICAgICAgICAgMSwgcGFpbnRlci5yZW5kZXJQYXNzID09PSAnb3BhcXVlJyA/IERlcHRoTW9kZS5SZWFkV3JpdGUgOiBEZXB0aE1vZGUuUmVhZE9ubHkpO1xuICAgICAgICBkcmF3RmlsbFRpbGVzKHBhaW50ZXIsIHNvdXJjZUNhY2hlLCBsYXllciwgY29vcmRzLCBkZXB0aE1vZGUsIGNvbG9yTW9kZSwgZmFsc2UpO1xuICAgIH1cblxuICAgIC8vIERyYXcgc3Ryb2tlXG4gICAgaWYgKHBhaW50ZXIucmVuZGVyUGFzcyA9PT0gJ3RyYW5zbHVjZW50JyAmJiBsYXllci5wYWludC5nZXQoJ2ZpbGwtYW50aWFsaWFzJykpIHtcblxuICAgICAgICAvLyBJZiB3ZSBkZWZpbmVkIGEgZGlmZmVyZW50IGNvbG9yIGZvciB0aGUgZmlsbCBvdXRsaW5lLCB3ZSBhcmVcbiAgICAgICAgLy8gZ29pbmcgdG8gaWdub3JlIHRoZSBiaXRzIGluIDB4MDcgYW5kIGp1c3QgY2FyZSBhYm91dCB0aGUgZ2xvYmFsXG4gICAgICAgIC8vIGNsaXBwaW5nIG1hc2suXG4gICAgICAgIC8vIE90aGVyd2lzZSwgd2Ugb25seSB3YW50IHRvIGRyYXdGaWxsIHRoZSBhbnRpYWxpYXNlZCBwYXJ0cyB0aGF0IGFyZVxuICAgICAgICAvLyAqb3V0c2lkZSogdGhlIGN1cnJlbnQgc2hhcGUuIFRoaXMgaXMgaW1wb3J0YW50IGluIGNhc2UgdGhlIGZpbGxcbiAgICAgICAgLy8gb3Igc3Ryb2tlIGNvbG9yIGlzIHRyYW5zbHVjZW50LiBJZiB3ZSB3b3VsZG4ndCBjbGlwIHRvIG91dHNpZGVcbiAgICAgICAgLy8gdGhlIGN1cnJlbnQgc2hhcGUsIHNvbWUgcGl4ZWxzIGZyb20gdGhlIG91dGxpbmUgc3Ryb2tlIG92ZXJsYXBwZWRcbiAgICAgICAgLy8gdGhlIChub24tYW50aWFsaWFzZWQpIGZpbGwuXG4gICAgICAgIGNvbnN0IGRlcHRoTW9kZSA9IHBhaW50ZXIuZGVwdGhNb2RlRm9yU3VibGF5ZXIoXG4gICAgICAgICAgICBsYXllci5nZXRQYWludFByb3BlcnR5KCdmaWxsLW91dGxpbmUtY29sb3InKSA/IDIgOiAwLCBEZXB0aE1vZGUuUmVhZE9ubHkpO1xuICAgICAgICBkcmF3RmlsbFRpbGVzKHBhaW50ZXIsIHNvdXJjZUNhY2hlLCBsYXllciwgY29vcmRzLCBkZXB0aE1vZGUsIGNvbG9yTW9kZSwgdHJ1ZSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBkcmF3RmlsbFRpbGVzKHBhaW50ZXIsIHNvdXJjZUNhY2hlLCBsYXllciwgY29vcmRzLCBkZXB0aE1vZGUsIGNvbG9yTW9kZSwgaXNPdXRsaW5lKSB7XG4gICAgY29uc3QgZ2wgPSBwYWludGVyLmNvbnRleHQuZ2w7XG5cbiAgICBjb25zdCBwYXR0ZXJuUHJvcGVydHkgPSBsYXllci5wYWludC5nZXQoJ2ZpbGwtcGF0dGVybicpO1xuICAgIGNvbnN0IGltYWdlID0gcGF0dGVyblByb3BlcnR5ICYmIHBhdHRlcm5Qcm9wZXJ0eS5jb25zdGFudE9yKCgxOiBhbnkpKTtcbiAgICBjb25zdCBjcm9zc2ZhZGUgPSBsYXllci5nZXRDcm9zc2ZhZGVQYXJhbWV0ZXJzKCk7XG4gICAgbGV0IGRyYXdNb2RlLCBwcm9ncmFtTmFtZSwgdW5pZm9ybVZhbHVlcywgaW5kZXhCdWZmZXIsIHNlZ21lbnRzO1xuXG4gICAgaWYgKCFpc091dGxpbmUpIHtcbiAgICAgICAgcHJvZ3JhbU5hbWUgPSBpbWFnZSA/ICdmaWxsUGF0dGVybicgOiAnZmlsbCc7XG4gICAgICAgIGRyYXdNb2RlID0gZ2wuVFJJQU5HTEVTO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHByb2dyYW1OYW1lID0gaW1hZ2UgJiYgIWxheWVyLmdldFBhaW50UHJvcGVydHkoJ2ZpbGwtb3V0bGluZS1jb2xvcicpID8gJ2ZpbGxPdXRsaW5lUGF0dGVybicgOiAnZmlsbE91dGxpbmUnO1xuICAgICAgICBkcmF3TW9kZSA9IGdsLkxJTkVTO1xuICAgIH1cblxuXG4gICAgZm9yIChjb25zdCBjb29yZCBvZiBjb29yZHMpIHtcbiAgICAgICAgY29uc3QgdGlsZSA9IHNvdXJjZUNhY2hlLmdldFRpbGUoY29vcmQpO1xuICAgICAgICBpZiAoaW1hZ2UgJiYgIXRpbGUucGF0dGVybnNMb2FkZWQoKSkgY29udGludWU7XG5cblxuICAgICAgICBjb25zdCBidWNrZXQ6ID9GaWxsQnVja2V0ID0gKHRpbGUuZ2V0QnVja2V0KGxheWVyKTogYW55KTtcbiAgICAgICAgaWYgKCFidWNrZXQpIGNvbnRpbnVlO1xuXG4gICAgICAgIGNvbnN0IHByb2dyYW1Db25maWd1cmF0aW9uID0gYnVja2V0LnByb2dyYW1Db25maWd1cmF0aW9ucy5nZXQobGF5ZXIuaWQpO1xuICAgICAgICBjb25zdCBwcm9ncmFtID0gcGFpbnRlci51c2VQcm9ncmFtKHByb2dyYW1OYW1lLCBwcm9ncmFtQ29uZmlndXJhdGlvbik7XG5cbiAgICAgICAgaWYgKGltYWdlKSB7XG4gICAgICAgICAgICBwYWludGVyLmNvbnRleHQuYWN0aXZlVGV4dHVyZS5zZXQoZ2wuVEVYVFVSRTApO1xuICAgICAgICAgICAgdGlsZS5pbWFnZUF0bGFzVGV4dHVyZS5iaW5kKGdsLkxJTkVBUiwgZ2wuQ0xBTVBfVE9fRURHRSk7XG4gICAgICAgICAgICBwcm9ncmFtQ29uZmlndXJhdGlvbi51cGRhdGVQYXR0ZXJuUGFpbnRCdWZmZXJzKGNyb3NzZmFkZSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb25zdGFudFBhdHRlcm4gPSBwYXR0ZXJuUHJvcGVydHkuY29uc3RhbnRPcihudWxsKTtcbiAgICAgICAgaWYgKGNvbnN0YW50UGF0dGVybiAmJiB0aWxlLmltYWdlQXRsYXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHBvc1RvID0gdGlsZS5pbWFnZUF0bGFzLnBhdHRlcm5Qb3NpdGlvbnNbY29uc3RhbnRQYXR0ZXJuLnRvXTtcbiAgICAgICAgICAgIGNvbnN0IHBvc0Zyb20gPSB0aWxlLmltYWdlQXRsYXMucGF0dGVyblBvc2l0aW9uc1tjb25zdGFudFBhdHRlcm4uZnJvbV07XG4gICAgICAgICAgICBpZiAocG9zVG8gJiYgcG9zRnJvbSkgcHJvZ3JhbUNvbmZpZ3VyYXRpb24uc2V0Q29uc3RhbnRQYXR0ZXJuUG9zaXRpb25zKHBvc1RvLCBwb3NGcm9tKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRpbGVNYXRyaXggPSBwYWludGVyLnRyYW5zbGF0ZVBvc01hdHJpeChjb29yZC5wb3NNYXRyaXgsIHRpbGUsXG4gICAgICAgICAgICBsYXllci5wYWludC5nZXQoJ2ZpbGwtdHJhbnNsYXRlJyksIGxheWVyLnBhaW50LmdldCgnZmlsbC10cmFuc2xhdGUtYW5jaG9yJykpO1xuXG4gICAgICAgIGlmICghaXNPdXRsaW5lKSB7XG4gICAgICAgICAgICBpbmRleEJ1ZmZlciA9IGJ1Y2tldC5pbmRleEJ1ZmZlcjtcbiAgICAgICAgICAgIHNlZ21lbnRzID0gYnVja2V0LnNlZ21lbnRzO1xuICAgICAgICAgICAgdW5pZm9ybVZhbHVlcyA9IGltYWdlID9cbiAgICAgICAgICAgICAgICBmaWxsUGF0dGVyblVuaWZvcm1WYWx1ZXModGlsZU1hdHJpeCwgcGFpbnRlciwgY3Jvc3NmYWRlLCB0aWxlKSA6XG4gICAgICAgICAgICAgICAgZmlsbFVuaWZvcm1WYWx1ZXModGlsZU1hdHJpeCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpbmRleEJ1ZmZlciA9IGJ1Y2tldC5pbmRleEJ1ZmZlcjI7XG4gICAgICAgICAgICBzZWdtZW50cyA9IGJ1Y2tldC5zZWdtZW50czI7XG4gICAgICAgICAgICBjb25zdCBkcmF3aW5nQnVmZmVyU2l6ZSA9IFtnbC5kcmF3aW5nQnVmZmVyV2lkdGgsIGdsLmRyYXdpbmdCdWZmZXJIZWlnaHRdO1xuICAgICAgICAgICAgdW5pZm9ybVZhbHVlcyA9IChwcm9ncmFtTmFtZSA9PT0gJ2ZpbGxPdXRsaW5lUGF0dGVybicgJiYgaW1hZ2UpID9cbiAgICAgICAgICAgICAgICBmaWxsT3V0bGluZVBhdHRlcm5Vbmlmb3JtVmFsdWVzKHRpbGVNYXRyaXgsIHBhaW50ZXIsIGNyb3NzZmFkZSwgdGlsZSwgZHJhd2luZ0J1ZmZlclNpemUpIDpcbiAgICAgICAgICAgICAgICBmaWxsT3V0bGluZVVuaWZvcm1WYWx1ZXModGlsZU1hdHJpeCwgZHJhd2luZ0J1ZmZlclNpemUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJvZ3JhbS5kcmF3KHBhaW50ZXIuY29udGV4dCwgZHJhd01vZGUsIGRlcHRoTW9kZSxcbiAgICAgICAgICAgIHBhaW50ZXIuc3RlbmNpbE1vZGVGb3JDbGlwcGluZyhjb29yZCksIGNvbG9yTW9kZSwgQ3VsbEZhY2VNb2RlLmRpc2FibGVkLCB1bmlmb3JtVmFsdWVzLFxuICAgICAgICAgICAgbGF5ZXIuaWQsIGJ1Y2tldC5sYXlvdXRWZXJ0ZXhCdWZmZXIsIGluZGV4QnVmZmVyLCBzZWdtZW50cyxcbiAgICAgICAgICAgIGxheWVyLnBhaW50LCBwYWludGVyLnRyYW5zZm9ybS56b29tLCBwcm9ncmFtQ29uZmlndXJhdGlvbik7XG4gICAgfVxufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IERlcHRoTW9kZSBmcm9tICcuLi9nbC9kZXB0aF9tb2RlJztcbmltcG9ydCBTdGVuY2lsTW9kZSBmcm9tICcuLi9nbC9zdGVuY2lsX21vZGUnO1xuaW1wb3J0IENvbG9yTW9kZSBmcm9tICcuLi9nbC9jb2xvcl9tb2RlJztcbmltcG9ydCBDdWxsRmFjZU1vZGUgZnJvbSAnLi4vZ2wvY3VsbF9mYWNlX21vZGUnO1xuaW1wb3J0IHtcbiAgICBmaWxsRXh0cnVzaW9uVW5pZm9ybVZhbHVlcyxcbiAgICBmaWxsRXh0cnVzaW9uUGF0dGVyblVuaWZvcm1WYWx1ZXMsXG59IGZyb20gJy4vcHJvZ3JhbS9maWxsX2V4dHJ1c2lvbl9wcm9ncmFtJztcblxuaW1wb3J0IHR5cGUgUGFpbnRlciBmcm9tICcuL3BhaW50ZXInO1xuaW1wb3J0IHR5cGUgU291cmNlQ2FjaGUgZnJvbSAnLi4vc291cmNlL3NvdXJjZV9jYWNoZSc7XG5pbXBvcnQgdHlwZSBGaWxsRXh0cnVzaW9uU3R5bGVMYXllciBmcm9tICcuLi9zdHlsZS9zdHlsZV9sYXllci9maWxsX2V4dHJ1c2lvbl9zdHlsZV9sYXllcic7XG5pbXBvcnQgdHlwZSBGaWxsRXh0cnVzaW9uQnVja2V0IGZyb20gJy4uL2RhdGEvYnVja2V0L2ZpbGxfZXh0cnVzaW9uX2J1Y2tldCc7XG5pbXBvcnQgdHlwZSB7T3ZlcnNjYWxlZFRpbGVJRH0gZnJvbSAnLi4vc291cmNlL3RpbGVfaWQnO1xuXG5leHBvcnQgZGVmYXVsdCBkcmF3O1xuXG5mdW5jdGlvbiBkcmF3KHBhaW50ZXI6IFBhaW50ZXIsIHNvdXJjZTogU291cmNlQ2FjaGUsIGxheWVyOiBGaWxsRXh0cnVzaW9uU3R5bGVMYXllciwgY29vcmRzOiBBcnJheTxPdmVyc2NhbGVkVGlsZUlEPikge1xuICAgIGNvbnN0IG9wYWNpdHkgPSBsYXllci5wYWludC5nZXQoJ2ZpbGwtZXh0cnVzaW9uLW9wYWNpdHknKTtcbiAgICBpZiAob3BhY2l0eSA9PT0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHBhaW50ZXIucmVuZGVyUGFzcyA9PT0gJ3RyYW5zbHVjZW50Jykge1xuICAgICAgICBjb25zdCBkZXB0aE1vZGUgPSBuZXcgRGVwdGhNb2RlKHBhaW50ZXIuY29udGV4dC5nbC5MRVFVQUwsIERlcHRoTW9kZS5SZWFkV3JpdGUsIHBhaW50ZXIuZGVwdGhSYW5nZUZvcjNEKTtcblxuICAgICAgICBpZiAob3BhY2l0eSA9PT0gMSAmJiAhbGF5ZXIucGFpbnQuZ2V0KCdmaWxsLWV4dHJ1c2lvbi1wYXR0ZXJuJykuY29uc3RhbnRPcigoMTogYW55KSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbG9yTW9kZSA9IHBhaW50ZXIuY29sb3JNb2RlRm9yUmVuZGVyUGFzcygpO1xuICAgICAgICAgICAgZHJhd0V4dHJ1c2lvblRpbGVzKHBhaW50ZXIsIHNvdXJjZSwgbGF5ZXIsIGNvb3JkcywgZGVwdGhNb2RlLCBTdGVuY2lsTW9kZS5kaXNhYmxlZCwgY29sb3JNb2RlKTtcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gRHJhdyB0cmFuc3BhcmVudCBidWlsZGluZ3MgaW4gdHdvIHBhc3NlcyBzbyB0aGF0IG9ubHkgdGhlIGNsb3Nlc3Qgc3VyZmFjZSBpcyBkcmF3bi5cbiAgICAgICAgICAgIC8vIEZpcnN0IGRyYXcgYWxsIHRoZSBleHRydXNpb25zIGludG8gb25seSB0aGUgZGVwdGggYnVmZmVyLiBObyBjb2xvcnMgYXJlIGRyYXduLlxuICAgICAgICAgICAgZHJhd0V4dHJ1c2lvblRpbGVzKHBhaW50ZXIsIHNvdXJjZSwgbGF5ZXIsIGNvb3JkcywgZGVwdGhNb2RlLFxuICAgICAgICAgICAgICAgIFN0ZW5jaWxNb2RlLmRpc2FibGVkLFxuICAgICAgICAgICAgICAgIENvbG9yTW9kZS5kaXNhYmxlZCk7XG5cbiAgICAgICAgICAgIC8vIFRoZW4gZHJhdyBhbGwgdGhlIGV4dHJ1c2lvbnMgYSBzZWNvbmQgdHlwZSwgb25seSBjb2xvcmluZyBmcmFnbWVudHMgaWYgdGhleSBoYXZlIHRoZVxuICAgICAgICAgICAgLy8gc2FtZSBkZXB0aCB2YWx1ZSBhcyB0aGUgY2xvc2VzdCBmcmFnbWVudCBpbiB0aGUgcHJldmlvdXMgcGFzcy4gVXNlIHRoZSBzdGVuY2lsIGJ1ZmZlclxuICAgICAgICAgICAgLy8gdG8gcHJldmVudCB0aGUgc2Vjb25kIGRyYXcgaW4gY2FzZXMgd2hlcmUgd2UgaGF2ZSBjb2luY2lkZW50IHBvbHlnb25zLlxuICAgICAgICAgICAgZHJhd0V4dHJ1c2lvblRpbGVzKHBhaW50ZXIsIHNvdXJjZSwgbGF5ZXIsIGNvb3JkcywgZGVwdGhNb2RlLFxuICAgICAgICAgICAgICAgIHBhaW50ZXIuc3RlbmNpbE1vZGVGb3IzRCgpLFxuICAgICAgICAgICAgICAgIHBhaW50ZXIuY29sb3JNb2RlRm9yUmVuZGVyUGFzcygpKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gZHJhd0V4dHJ1c2lvblRpbGVzKHBhaW50ZXIsIHNvdXJjZSwgbGF5ZXIsIGNvb3JkcywgZGVwdGhNb2RlLCBzdGVuY2lsTW9kZSwgY29sb3JNb2RlKSB7XG4gICAgY29uc3QgY29udGV4dCA9IHBhaW50ZXIuY29udGV4dDtcbiAgICBjb25zdCBnbCA9IGNvbnRleHQuZ2w7XG4gICAgY29uc3QgcGF0dGVyblByb3BlcnR5ID0gbGF5ZXIucGFpbnQuZ2V0KCdmaWxsLWV4dHJ1c2lvbi1wYXR0ZXJuJyk7XG4gICAgY29uc3QgaW1hZ2UgPSBwYXR0ZXJuUHJvcGVydHkuY29uc3RhbnRPcigoMTogYW55KSk7XG4gICAgY29uc3QgY3Jvc3NmYWRlID0gbGF5ZXIuZ2V0Q3Jvc3NmYWRlUGFyYW1ldGVycygpO1xuICAgIGNvbnN0IG9wYWNpdHkgPSBsYXllci5wYWludC5nZXQoJ2ZpbGwtZXh0cnVzaW9uLW9wYWNpdHknKTtcblxuICAgIGZvciAoY29uc3QgY29vcmQgb2YgY29vcmRzKSB7XG4gICAgICAgIGNvbnN0IHRpbGUgPSBzb3VyY2UuZ2V0VGlsZShjb29yZCk7XG4gICAgICAgIGNvbnN0IGJ1Y2tldDogP0ZpbGxFeHRydXNpb25CdWNrZXQgPSAodGlsZS5nZXRCdWNrZXQobGF5ZXIpOiBhbnkpO1xuICAgICAgICBpZiAoIWJ1Y2tldCkgY29udGludWU7XG5cbiAgICAgICAgY29uc3QgcHJvZ3JhbUNvbmZpZ3VyYXRpb24gPSBidWNrZXQucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLmdldChsYXllci5pZCk7XG4gICAgICAgIGNvbnN0IHByb2dyYW0gPSBwYWludGVyLnVzZVByb2dyYW0oaW1hZ2UgPyAnZmlsbEV4dHJ1c2lvblBhdHRlcm4nIDogJ2ZpbGxFeHRydXNpb24nLCBwcm9ncmFtQ29uZmlndXJhdGlvbik7XG5cbiAgICAgICAgaWYgKGltYWdlKSB7XG4gICAgICAgICAgICBwYWludGVyLmNvbnRleHQuYWN0aXZlVGV4dHVyZS5zZXQoZ2wuVEVYVFVSRTApO1xuICAgICAgICAgICAgdGlsZS5pbWFnZUF0bGFzVGV4dHVyZS5iaW5kKGdsLkxJTkVBUiwgZ2wuQ0xBTVBfVE9fRURHRSk7XG4gICAgICAgICAgICBwcm9ncmFtQ29uZmlndXJhdGlvbi51cGRhdGVQYXR0ZXJuUGFpbnRCdWZmZXJzKGNyb3NzZmFkZSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb25zdGFudFBhdHRlcm4gPSBwYXR0ZXJuUHJvcGVydHkuY29uc3RhbnRPcihudWxsKTtcbiAgICAgICAgaWYgKGNvbnN0YW50UGF0dGVybiAmJiB0aWxlLmltYWdlQXRsYXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHBvc1RvID0gdGlsZS5pbWFnZUF0bGFzLnBhdHRlcm5Qb3NpdGlvbnNbY29uc3RhbnRQYXR0ZXJuLnRvXTtcbiAgICAgICAgICAgIGNvbnN0IHBvc0Zyb20gPSB0aWxlLmltYWdlQXRsYXMucGF0dGVyblBvc2l0aW9uc1tjb25zdGFudFBhdHRlcm4uZnJvbV07XG4gICAgICAgICAgICBpZiAocG9zVG8gJiYgcG9zRnJvbSkgcHJvZ3JhbUNvbmZpZ3VyYXRpb24uc2V0Q29uc3RhbnRQYXR0ZXJuUG9zaXRpb25zKHBvc1RvLCBwb3NGcm9tKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG1hdHJpeCA9IHBhaW50ZXIudHJhbnNsYXRlUG9zTWF0cml4KFxuICAgICAgICAgICAgY29vcmQucG9zTWF0cml4LFxuICAgICAgICAgICAgdGlsZSxcbiAgICAgICAgICAgIGxheWVyLnBhaW50LmdldCgnZmlsbC1leHRydXNpb24tdHJhbnNsYXRlJyksXG4gICAgICAgICAgICBsYXllci5wYWludC5nZXQoJ2ZpbGwtZXh0cnVzaW9uLXRyYW5zbGF0ZS1hbmNob3InKSk7XG5cbiAgICAgICAgY29uc3Qgc2hvdWxkVXNlVmVydGljYWxHcmFkaWVudCA9IGxheWVyLnBhaW50LmdldCgnZmlsbC1leHRydXNpb24tdmVydGljYWwtZ3JhZGllbnQnKTtcbiAgICAgICAgY29uc3QgdW5pZm9ybVZhbHVlcyA9IGltYWdlID9cbiAgICAgICAgICAgIGZpbGxFeHRydXNpb25QYXR0ZXJuVW5pZm9ybVZhbHVlcyhtYXRyaXgsIHBhaW50ZXIsIHNob3VsZFVzZVZlcnRpY2FsR3JhZGllbnQsIG9wYWNpdHksIGNvb3JkLCBjcm9zc2ZhZGUsIHRpbGUpIDpcbiAgICAgICAgICAgIGZpbGxFeHRydXNpb25Vbmlmb3JtVmFsdWVzKG1hdHJpeCwgcGFpbnRlciwgc2hvdWxkVXNlVmVydGljYWxHcmFkaWVudCwgb3BhY2l0eSk7XG5cblxuICAgICAgICBwcm9ncmFtLmRyYXcoY29udGV4dCwgY29udGV4dC5nbC5UUklBTkdMRVMsIGRlcHRoTW9kZSwgc3RlbmNpbE1vZGUsIGNvbG9yTW9kZSwgQ3VsbEZhY2VNb2RlLmJhY2tDQ1csXG4gICAgICAgICAgICB1bmlmb3JtVmFsdWVzLCBsYXllci5pZCwgYnVja2V0LmxheW91dFZlcnRleEJ1ZmZlciwgYnVja2V0LmluZGV4QnVmZmVyLFxuICAgICAgICAgICAgYnVja2V0LnNlZ21lbnRzLCBsYXllci5wYWludCwgcGFpbnRlci50cmFuc2Zvcm0uem9vbSxcbiAgICAgICAgICAgIHByb2dyYW1Db25maWd1cmF0aW9uKTtcbiAgICB9XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgVGV4dHVyZSBmcm9tICcuL3RleHR1cmUnO1xuaW1wb3J0IFN0ZW5jaWxNb2RlIGZyb20gJy4uL2dsL3N0ZW5jaWxfbW9kZSc7XG5pbXBvcnQgRGVwdGhNb2RlIGZyb20gJy4uL2dsL2RlcHRoX21vZGUnO1xuaW1wb3J0IEN1bGxGYWNlTW9kZSBmcm9tICcuLi9nbC9jdWxsX2ZhY2VfbW9kZSc7XG5pbXBvcnQge1xuICAgIGhpbGxzaGFkZVVuaWZvcm1WYWx1ZXMsXG4gICAgaGlsbHNoYWRlVW5pZm9ybVByZXBhcmVWYWx1ZXNcbn0gZnJvbSAnLi9wcm9ncmFtL2hpbGxzaGFkZV9wcm9ncmFtJztcblxuaW1wb3J0IHR5cGUgUGFpbnRlciBmcm9tICcuL3BhaW50ZXInO1xuaW1wb3J0IHR5cGUgU291cmNlQ2FjaGUgZnJvbSAnLi4vc291cmNlL3NvdXJjZV9jYWNoZSc7XG5pbXBvcnQgdHlwZSBIaWxsc2hhZGVTdHlsZUxheWVyIGZyb20gJy4uL3N0eWxlL3N0eWxlX2xheWVyL2hpbGxzaGFkZV9zdHlsZV9sYXllcic7XG5pbXBvcnQgdHlwZSB7T3ZlcnNjYWxlZFRpbGVJRH0gZnJvbSAnLi4vc291cmNlL3RpbGVfaWQnO1xuXG5leHBvcnQgZGVmYXVsdCBkcmF3SGlsbHNoYWRlO1xuXG5mdW5jdGlvbiBkcmF3SGlsbHNoYWRlKHBhaW50ZXI6IFBhaW50ZXIsIHNvdXJjZUNhY2hlOiBTb3VyY2VDYWNoZSwgbGF5ZXI6IEhpbGxzaGFkZVN0eWxlTGF5ZXIsIHRpbGVJRHM6IEFycmF5PE92ZXJzY2FsZWRUaWxlSUQ+KSB7XG4gICAgaWYgKHBhaW50ZXIucmVuZGVyUGFzcyAhPT0gJ29mZnNjcmVlbicgJiYgcGFpbnRlci5yZW5kZXJQYXNzICE9PSAndHJhbnNsdWNlbnQnKSByZXR1cm47XG5cbiAgICBjb25zdCBjb250ZXh0ID0gcGFpbnRlci5jb250ZXh0O1xuICAgIGNvbnN0IHNvdXJjZU1heFpvb20gPSBzb3VyY2VDYWNoZS5nZXRTb3VyY2UoKS5tYXh6b29tO1xuXG4gICAgY29uc3QgZGVwdGhNb2RlID0gcGFpbnRlci5kZXB0aE1vZGVGb3JTdWJsYXllcigwLCBEZXB0aE1vZGUuUmVhZE9ubHkpO1xuICAgIGNvbnN0IHN0ZW5jaWxNb2RlID0gU3RlbmNpbE1vZGUuZGlzYWJsZWQ7XG4gICAgY29uc3QgY29sb3JNb2RlID0gcGFpbnRlci5jb2xvck1vZGVGb3JSZW5kZXJQYXNzKCk7XG5cbiAgICBmb3IgKGNvbnN0IHRpbGVJRCBvZiB0aWxlSURzKSB7XG4gICAgICAgIGNvbnN0IHRpbGUgPSBzb3VyY2VDYWNoZS5nZXRUaWxlKHRpbGVJRCk7XG4gICAgICAgIGlmICh0aWxlLm5lZWRzSGlsbHNoYWRlUHJlcGFyZSAmJiBwYWludGVyLnJlbmRlclBhc3MgPT09ICdvZmZzY3JlZW4nKSB7XG4gICAgICAgICAgICBwcmVwYXJlSGlsbHNoYWRlKHBhaW50ZXIsIHRpbGUsIGxheWVyLCBzb3VyY2VNYXhab29tLCBkZXB0aE1vZGUsIHN0ZW5jaWxNb2RlLCBjb2xvck1vZGUpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH0gZWxzZSBpZiAocGFpbnRlci5yZW5kZXJQYXNzID09PSAndHJhbnNsdWNlbnQnKSB7XG4gICAgICAgICAgICByZW5kZXJIaWxsc2hhZGUocGFpbnRlciwgdGlsZSwgbGF5ZXIsIGRlcHRoTW9kZSwgc3RlbmNpbE1vZGUsIGNvbG9yTW9kZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjb250ZXh0LnZpZXdwb3J0LnNldChbMCwgMCwgcGFpbnRlci53aWR0aCwgcGFpbnRlci5oZWlnaHRdKTtcbn1cblxuZnVuY3Rpb24gcmVuZGVySGlsbHNoYWRlKHBhaW50ZXIsIHRpbGUsIGxheWVyLCBkZXB0aE1vZGUsIHN0ZW5jaWxNb2RlLCBjb2xvck1vZGUpIHtcbiAgICBjb25zdCBjb250ZXh0ID0gcGFpbnRlci5jb250ZXh0O1xuICAgIGNvbnN0IGdsID0gY29udGV4dC5nbDtcbiAgICBjb25zdCBmYm8gPSB0aWxlLmZibztcbiAgICBpZiAoIWZibykgcmV0dXJuO1xuXG4gICAgY29uc3QgcHJvZ3JhbSA9IHBhaW50ZXIudXNlUHJvZ3JhbSgnaGlsbHNoYWRlJyk7XG5cbiAgICBjb250ZXh0LmFjdGl2ZVRleHR1cmUuc2V0KGdsLlRFWFRVUkUwKTtcbiAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCBmYm8uY29sb3JBdHRhY2htZW50LmdldCgpKTtcblxuICAgIGNvbnN0IHVuaWZvcm1WYWx1ZXMgPSBoaWxsc2hhZGVVbmlmb3JtVmFsdWVzKHBhaW50ZXIsIHRpbGUsIGxheWVyKTtcblxuICAgIGlmICh0aWxlLm1hc2tlZEJvdW5kc0J1ZmZlciAmJiB0aWxlLm1hc2tlZEluZGV4QnVmZmVyICYmIHRpbGUuc2VnbWVudHMpIHtcbiAgICAgICAgcHJvZ3JhbS5kcmF3KGNvbnRleHQsIGdsLlRSSUFOR0xFUywgZGVwdGhNb2RlLCBzdGVuY2lsTW9kZSwgY29sb3JNb2RlLCBDdWxsRmFjZU1vZGUuZGlzYWJsZWQsXG4gICAgICAgICAgICB1bmlmb3JtVmFsdWVzLCBsYXllci5pZCwgdGlsZS5tYXNrZWRCb3VuZHNCdWZmZXIsXG4gICAgICAgICAgICB0aWxlLm1hc2tlZEluZGV4QnVmZmVyLCB0aWxlLnNlZ21lbnRzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBwcm9ncmFtLmRyYXcoY29udGV4dCwgZ2wuVFJJQU5HTEVTLCBkZXB0aE1vZGUsIHN0ZW5jaWxNb2RlLCBjb2xvck1vZGUsIEN1bGxGYWNlTW9kZS5kaXNhYmxlZCxcbiAgICAgICAgICAgIHVuaWZvcm1WYWx1ZXMsIGxheWVyLmlkLCBwYWludGVyLnJhc3RlckJvdW5kc0J1ZmZlcixcbiAgICAgICAgICAgIHBhaW50ZXIucXVhZFRyaWFuZ2xlSW5kZXhCdWZmZXIsIHBhaW50ZXIucmFzdGVyQm91bmRzU2VnbWVudHMpO1xuICAgIH1cbn1cblxuLy8gaGlsbHNoYWRlIHJlbmRlcmluZyBpcyBkb25lIGluIHR3byBzdGVwcy4gdGhlIHByZXBhcmUgc3RlcCBmaXJzdCBjYWxjdWxhdGVzIHRoZSBzbG9wZSBvZiB0aGUgdGVycmFpbiBpbiB0aGUgeCBhbmQgeVxuLy8gZGlyZWN0aW9ucyBmb3IgZWFjaCBwaXhlbCwgYW5kIHNhdmVzIHRob3NlIHZhbHVlcyB0byBhIGZyYW1lYnVmZmVyIHRleHR1cmUgaW4gdGhlIHIgYW5kIGcgY2hhbm5lbHMuXG5mdW5jdGlvbiBwcmVwYXJlSGlsbHNoYWRlKHBhaW50ZXIsIHRpbGUsIGxheWVyLCBzb3VyY2VNYXhab29tLCBkZXB0aE1vZGUsIHN0ZW5jaWxNb2RlLCBjb2xvck1vZGUpIHtcbiAgICBjb25zdCBjb250ZXh0ID0gcGFpbnRlci5jb250ZXh0O1xuICAgIGNvbnN0IGdsID0gY29udGV4dC5nbDtcbiAgICAvLyBkZWNvZGUgcmdiYSBsZXZlbHMgYnkgdXNpbmcgaW50ZWdlciBvdmVyZmxvdyB0byBjb252ZXJ0IGVhY2ggVWludDMyQXJyYXkgZWxlbWVudCAtPiA0IFVpbnQ4QXJyYXkgZWxlbWVudHMuXG4gICAgLy8gZXguXG4gICAgLy8gVWludDMyOlxuICAgIC8vIGJhc2UgMTAgLSA2NzMwOFxuICAgIC8vIGJhc2UgMiAtIDAwMDAgMDAwMCAwMDAwIDAwMDEgMDAwMCAwMTEwIDExMTAgMTEwMFxuICAgIC8vXG4gICAgLy8gVWludDg6XG4gICAgLy8gYmFzZSAxMCAtIDAsIDEsIDYsIDIzNiAodGhpcyBvcmRlciBpcyByZXZlcnNlZCBpbiB0aGUgcmVzdWx0aW5nIGFycmF5IHZpYSB0aGUgb3ZlcmZsb3cuXG4gICAgLy8gZmlyc3QgOCBiaXRzIHJlcHJlc2VudCAyMzYsIHNvIHRoZSByIGNvbXBvbmVudCBvZiB0aGUgdGV4dHVyZSBwaXhlbCB3aWxsIGJlIDIzNiBldGMuKVxuICAgIC8vIGJhc2UgMiAtIDAwMDAgMDAwMCwgMDAwMCAwMDAxLCAwMDAwIDAxMTAsIDExMTAgMTEwMFxuICAgIGlmICh0aWxlLmRlbSAmJiB0aWxlLmRlbS5kYXRhKSB7XG4gICAgICAgIGNvbnN0IHRpbGVTaXplID0gdGlsZS5kZW0uZGltO1xuICAgICAgICBjb25zdCB0ZXh0dXJlU3RyaWRlID0gdGlsZS5kZW0uc3RyaWRlO1xuXG4gICAgICAgIGNvbnN0IHBpeGVsRGF0YSA9IHRpbGUuZGVtLmdldFBpeGVscygpO1xuICAgICAgICBjb250ZXh0LmFjdGl2ZVRleHR1cmUuc2V0KGdsLlRFWFRVUkUxKTtcblxuICAgICAgICAvLyBpZiBVTlBBQ0tfUFJFTVVMVElQTFlfQUxQSEFfV0VCR0wgaXMgc2V0IHRvIHRydWUgcHJpb3IgdG8gZHJhd0hpbGxzaGFkZSBiZWluZyBjYWxsZWRcbiAgICAgICAgLy8gdGlsZXMgd2lsbCBhcHBlYXIgYmxhbmssIGJlY2F1c2UgYXMgeW91IGNhbiBzZWUgYWJvdmUgdGhlIGFscGhhIHZhbHVlIGZvciB0aGVzZSB0ZXh0dXJlc1xuICAgICAgICAvLyBpcyBhbHdheXMgMFxuICAgICAgICBjb250ZXh0LnBpeGVsU3RvcmVVbnBhY2tQcmVtdWx0aXBseUFscGhhLnNldChmYWxzZSk7XG4gICAgICAgIHRpbGUuZGVtVGV4dHVyZSA9IHRpbGUuZGVtVGV4dHVyZSB8fCBwYWludGVyLmdldFRpbGVUZXh0dXJlKHRleHR1cmVTdHJpZGUpO1xuICAgICAgICBpZiAodGlsZS5kZW1UZXh0dXJlKSB7XG4gICAgICAgICAgICBjb25zdCBkZW1UZXh0dXJlID0gdGlsZS5kZW1UZXh0dXJlO1xuICAgICAgICAgICAgZGVtVGV4dHVyZS51cGRhdGUocGl4ZWxEYXRhLCB7IHByZW11bHRpcGx5OiBmYWxzZSB9KTtcbiAgICAgICAgICAgIGRlbVRleHR1cmUuYmluZChnbC5ORUFSRVNULCBnbC5DTEFNUF9UT19FREdFKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRpbGUuZGVtVGV4dHVyZSA9IG5ldyBUZXh0dXJlKGNvbnRleHQsIHBpeGVsRGF0YSwgZ2wuUkdCQSwgeyBwcmVtdWx0aXBseTogZmFsc2UgfSk7XG4gICAgICAgICAgICB0aWxlLmRlbVRleHR1cmUuYmluZChnbC5ORUFSRVNULCBnbC5DTEFNUF9UT19FREdFKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRleHQuYWN0aXZlVGV4dHVyZS5zZXQoZ2wuVEVYVFVSRTApO1xuXG4gICAgICAgIGxldCBmYm8gPSB0aWxlLmZibztcblxuICAgICAgICBpZiAoIWZibykge1xuICAgICAgICAgICAgY29uc3QgcmVuZGVyVGV4dHVyZSA9IG5ldyBUZXh0dXJlKGNvbnRleHQsIHt3aWR0aDogdGlsZVNpemUsIGhlaWdodDogdGlsZVNpemUsIGRhdGE6IG51bGx9LCBnbC5SR0JBKTtcbiAgICAgICAgICAgIHJlbmRlclRleHR1cmUuYmluZChnbC5MSU5FQVIsIGdsLkNMQU1QX1RPX0VER0UpO1xuXG4gICAgICAgICAgICBmYm8gPSB0aWxlLmZibyA9IGNvbnRleHQuY3JlYXRlRnJhbWVidWZmZXIodGlsZVNpemUsIHRpbGVTaXplKTtcbiAgICAgICAgICAgIGZiby5jb2xvckF0dGFjaG1lbnQuc2V0KHJlbmRlclRleHR1cmUudGV4dHVyZSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb250ZXh0LmJpbmRGcmFtZWJ1ZmZlci5zZXQoZmJvLmZyYW1lYnVmZmVyKTtcbiAgICAgICAgY29udGV4dC52aWV3cG9ydC5zZXQoWzAsIDAsIHRpbGVTaXplLCB0aWxlU2l6ZV0pO1xuXG4gICAgICAgIHBhaW50ZXIudXNlUHJvZ3JhbSgnaGlsbHNoYWRlUHJlcGFyZScpLmRyYXcoY29udGV4dCwgZ2wuVFJJQU5HTEVTLFxuICAgICAgICAgICAgZGVwdGhNb2RlLCBzdGVuY2lsTW9kZSwgY29sb3JNb2RlLCBDdWxsRmFjZU1vZGUuZGlzYWJsZWQsXG4gICAgICAgICAgICBoaWxsc2hhZGVVbmlmb3JtUHJlcGFyZVZhbHVlcyh0aWxlLCBzb3VyY2VNYXhab29tKSxcbiAgICAgICAgICAgIGxheWVyLmlkLCBwYWludGVyLnJhc3RlckJvdW5kc0J1ZmZlcixcbiAgICAgICAgICAgIHBhaW50ZXIucXVhZFRyaWFuZ2xlSW5kZXhCdWZmZXIsIHBhaW50ZXIucmFzdGVyQm91bmRzU2VnbWVudHMpO1xuXG4gICAgICAgIHRpbGUubmVlZHNIaWxsc2hhZGVQcmVwYXJlID0gZmFsc2U7XG4gICAgfVxufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHsgY2xhbXAgfSBmcm9tICcuLi91dGlsL3V0aWwnO1xuXG5pbXBvcnQgSW1hZ2VTb3VyY2UgZnJvbSAnLi4vc291cmNlL2ltYWdlX3NvdXJjZSc7XG5pbXBvcnQgYnJvd3NlciBmcm9tICcuLi91dGlsL2Jyb3dzZXInO1xuaW1wb3J0IFN0ZW5jaWxNb2RlIGZyb20gJy4uL2dsL3N0ZW5jaWxfbW9kZSc7XG5pbXBvcnQgRGVwdGhNb2RlIGZyb20gJy4uL2dsL2RlcHRoX21vZGUnO1xuaW1wb3J0IEN1bGxGYWNlTW9kZSBmcm9tICcuLi9nbC9jdWxsX2ZhY2VfbW9kZSc7XG5pbXBvcnQgeyByYXN0ZXJVbmlmb3JtVmFsdWVzIH0gZnJvbSAnLi9wcm9ncmFtL3Jhc3Rlcl9wcm9ncmFtJztcblxuaW1wb3J0IHR5cGUgUGFpbnRlciBmcm9tICcuL3BhaW50ZXInO1xuaW1wb3J0IHR5cGUgU291cmNlQ2FjaGUgZnJvbSAnLi4vc291cmNlL3NvdXJjZV9jYWNoZSc7XG5pbXBvcnQgdHlwZSBSYXN0ZXJTdHlsZUxheWVyIGZyb20gJy4uL3N0eWxlL3N0eWxlX2xheWVyL3Jhc3Rlcl9zdHlsZV9sYXllcic7XG5pbXBvcnQgdHlwZSB7T3ZlcnNjYWxlZFRpbGVJRH0gZnJvbSAnLi4vc291cmNlL3RpbGVfaWQnO1xuXG5leHBvcnQgZGVmYXVsdCBkcmF3UmFzdGVyO1xuXG5mdW5jdGlvbiBkcmF3UmFzdGVyKHBhaW50ZXI6IFBhaW50ZXIsIHNvdXJjZUNhY2hlOiBTb3VyY2VDYWNoZSwgbGF5ZXI6IFJhc3RlclN0eWxlTGF5ZXIsIGNvb3JkczogQXJyYXk8T3ZlcnNjYWxlZFRpbGVJRD4pIHtcbiAgICBpZiAocGFpbnRlci5yZW5kZXJQYXNzICE9PSAndHJhbnNsdWNlbnQnKSByZXR1cm47XG4gICAgaWYgKGxheWVyLnBhaW50LmdldCgncmFzdGVyLW9wYWNpdHknKSA9PT0gMCkgcmV0dXJuO1xuXG4gICAgY29uc3QgY29udGV4dCA9IHBhaW50ZXIuY29udGV4dDtcbiAgICBjb25zdCBnbCA9IGNvbnRleHQuZ2w7XG4gICAgY29uc3Qgc291cmNlID0gc291cmNlQ2FjaGUuZ2V0U291cmNlKCk7XG4gICAgY29uc3QgcHJvZ3JhbSA9IHBhaW50ZXIudXNlUHJvZ3JhbSgncmFzdGVyJyk7XG5cbiAgICBjb25zdCBzdGVuY2lsTW9kZSA9IFN0ZW5jaWxNb2RlLmRpc2FibGVkO1xuICAgIGNvbnN0IGNvbG9yTW9kZSA9IHBhaW50ZXIuY29sb3JNb2RlRm9yUmVuZGVyUGFzcygpO1xuICAgIGNvbnN0IG1pblRpbGVaID0gY29vcmRzLmxlbmd0aCAmJiBjb29yZHNbMF0ub3ZlcnNjYWxlZFo7XG4gICAgY29uc3QgYWxpZ24gPSAhcGFpbnRlci5vcHRpb25zLm1vdmluZztcbiAgICBmb3IgKGNvbnN0IGNvb3JkIG9mIGNvb3Jkcykge1xuICAgICAgICAvLyBTZXQgdGhlIGxvd2VyIHpvb20gbGV2ZWwgdG8gc3VibGF5ZXIgMCwgYW5kIGhpZ2hlciB6b29tIGxldmVscyB0byBoaWdoZXIgc3VibGF5ZXJzXG4gICAgICAgIC8vIFVzZSBnbC5MRVNTIHRvIHByZXZlbnQgZG91YmxlIGRyYXdpbmcgaW4gYXJlYXMgd2hlcmUgdGlsZXMgb3ZlcmxhcC5cbiAgICAgICAgY29uc3QgZGVwdGhNb2RlID0gcGFpbnRlci5kZXB0aE1vZGVGb3JTdWJsYXllcihjb29yZC5vdmVyc2NhbGVkWiAtIG1pblRpbGVaLFxuICAgICAgICAgICAgbGF5ZXIucGFpbnQuZ2V0KCdyYXN0ZXItb3BhY2l0eScpID09PSAxID8gRGVwdGhNb2RlLlJlYWRXcml0ZSA6IERlcHRoTW9kZS5SZWFkT25seSwgZ2wuTEVTUyk7XG5cbiAgICAgICAgY29uc3QgdGlsZSA9IHNvdXJjZUNhY2hlLmdldFRpbGUoY29vcmQpO1xuICAgICAgICBjb25zdCBwb3NNYXRyaXggPSBwYWludGVyLnRyYW5zZm9ybS5jYWxjdWxhdGVQb3NNYXRyaXgoY29vcmQudG9VbndyYXBwZWQoKSwgYWxpZ24pO1xuXG4gICAgICAgIHRpbGUucmVnaXN0ZXJGYWRlRHVyYXRpb24obGF5ZXIucGFpbnQuZ2V0KCdyYXN0ZXItZmFkZS1kdXJhdGlvbicpKTtcblxuICAgICAgICBjb25zdCBwYXJlbnRUaWxlID0gc291cmNlQ2FjaGUuZmluZExvYWRlZFBhcmVudChjb29yZCwgMCksXG4gICAgICAgICAgICBmYWRlID0gZ2V0RmFkZVZhbHVlcyh0aWxlLCBwYXJlbnRUaWxlLCBzb3VyY2VDYWNoZSwgbGF5ZXIsIHBhaW50ZXIudHJhbnNmb3JtKTtcblxuICAgICAgICBsZXQgcGFyZW50U2NhbGVCeSwgcGFyZW50VEw7XG5cbiAgICAgICAgY29uc3QgdGV4dHVyZUZpbHRlciA9IGxheWVyLnBhaW50LmdldCgncmFzdGVyLXJlc2FtcGxpbmcnKSA9PT0gJ25lYXJlc3QnID8gIGdsLk5FQVJFU1QgOiBnbC5MSU5FQVI7XG5cbiAgICAgICAgY29udGV4dC5hY3RpdmVUZXh0dXJlLnNldChnbC5URVhUVVJFMCk7XG4gICAgICAgIHRpbGUudGV4dHVyZS5iaW5kKHRleHR1cmVGaWx0ZXIsIGdsLkNMQU1QX1RPX0VER0UsIGdsLkxJTkVBUl9NSVBNQVBfTkVBUkVTVCk7XG5cbiAgICAgICAgY29udGV4dC5hY3RpdmVUZXh0dXJlLnNldChnbC5URVhUVVJFMSk7XG5cbiAgICAgICAgaWYgKHBhcmVudFRpbGUpIHtcbiAgICAgICAgICAgIHBhcmVudFRpbGUudGV4dHVyZS5iaW5kKHRleHR1cmVGaWx0ZXIsIGdsLkNMQU1QX1RPX0VER0UsIGdsLkxJTkVBUl9NSVBNQVBfTkVBUkVTVCk7XG4gICAgICAgICAgICBwYXJlbnRTY2FsZUJ5ID0gTWF0aC5wb3coMiwgcGFyZW50VGlsZS50aWxlSUQub3ZlcnNjYWxlZFogLSB0aWxlLnRpbGVJRC5vdmVyc2NhbGVkWik7XG4gICAgICAgICAgICBwYXJlbnRUTCA9IFt0aWxlLnRpbGVJRC5jYW5vbmljYWwueCAqIHBhcmVudFNjYWxlQnkgJSAxLCB0aWxlLnRpbGVJRC5jYW5vbmljYWwueSAqIHBhcmVudFNjYWxlQnkgJSAxXTtcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGlsZS50ZXh0dXJlLmJpbmQodGV4dHVyZUZpbHRlciwgZ2wuQ0xBTVBfVE9fRURHRSwgZ2wuTElORUFSX01JUE1BUF9ORUFSRVNUKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHVuaWZvcm1WYWx1ZXMgPSByYXN0ZXJVbmlmb3JtVmFsdWVzKHBvc01hdHJpeCwgcGFyZW50VEwgfHwgWzAsIDBdLCBwYXJlbnRTY2FsZUJ5IHx8IDEsIGZhZGUsIGxheWVyKTtcblxuICAgICAgICBpZiAoc291cmNlIGluc3RhbmNlb2YgSW1hZ2VTb3VyY2UpIHtcbiAgICAgICAgICAgIHByb2dyYW0uZHJhdyhjb250ZXh0LCBnbC5UUklBTkdMRVMsIGRlcHRoTW9kZSwgc3RlbmNpbE1vZGUsIGNvbG9yTW9kZSwgQ3VsbEZhY2VNb2RlLmRpc2FibGVkLFxuICAgICAgICAgICAgICAgIHVuaWZvcm1WYWx1ZXMsIGxheWVyLmlkLCBzb3VyY2UuYm91bmRzQnVmZmVyLFxuICAgICAgICAgICAgICAgIHBhaW50ZXIucXVhZFRyaWFuZ2xlSW5kZXhCdWZmZXIsIHNvdXJjZS5ib3VuZHNTZWdtZW50cyk7XG4gICAgICAgIH0gZWxzZSBpZiAodGlsZS5tYXNrZWRCb3VuZHNCdWZmZXIgJiYgdGlsZS5tYXNrZWRJbmRleEJ1ZmZlciAmJiB0aWxlLnNlZ21lbnRzKSB7XG4gICAgICAgICAgICBwcm9ncmFtLmRyYXcoY29udGV4dCwgZ2wuVFJJQU5HTEVTLCBkZXB0aE1vZGUsIHN0ZW5jaWxNb2RlLCBjb2xvck1vZGUsIEN1bGxGYWNlTW9kZS5kaXNhYmxlZCxcbiAgICAgICAgICAgICAgICB1bmlmb3JtVmFsdWVzLCBsYXllci5pZCwgdGlsZS5tYXNrZWRCb3VuZHNCdWZmZXIsXG4gICAgICAgICAgICAgICAgdGlsZS5tYXNrZWRJbmRleEJ1ZmZlciwgdGlsZS5zZWdtZW50cywgbGF5ZXIucGFpbnQsXG4gICAgICAgICAgICAgICAgcGFpbnRlci50cmFuc2Zvcm0uem9vbSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwcm9ncmFtLmRyYXcoY29udGV4dCwgZ2wuVFJJQU5HTEVTLCBkZXB0aE1vZGUsIHN0ZW5jaWxNb2RlLCBjb2xvck1vZGUsIEN1bGxGYWNlTW9kZS5kaXNhYmxlZCxcbiAgICAgICAgICAgICAgICB1bmlmb3JtVmFsdWVzLCBsYXllci5pZCwgcGFpbnRlci5yYXN0ZXJCb3VuZHNCdWZmZXIsXG4gICAgICAgICAgICAgICAgcGFpbnRlci5xdWFkVHJpYW5nbGVJbmRleEJ1ZmZlciwgcGFpbnRlci5yYXN0ZXJCb3VuZHNTZWdtZW50cyk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmZ1bmN0aW9uIGdldEZhZGVWYWx1ZXModGlsZSwgcGFyZW50VGlsZSwgc291cmNlQ2FjaGUsIGxheWVyLCB0cmFuc2Zvcm0pIHtcbiAgICBjb25zdCBmYWRlRHVyYXRpb24gPSBsYXllci5wYWludC5nZXQoJ3Jhc3Rlci1mYWRlLWR1cmF0aW9uJyk7XG5cbiAgICBpZiAoZmFkZUR1cmF0aW9uID4gMCkge1xuICAgICAgICBjb25zdCBub3cgPSBicm93c2VyLm5vdygpO1xuICAgICAgICBjb25zdCBzaW5jZVRpbGUgPSAobm93IC0gdGlsZS50aW1lQWRkZWQpIC8gZmFkZUR1cmF0aW9uO1xuICAgICAgICBjb25zdCBzaW5jZVBhcmVudCA9IHBhcmVudFRpbGUgPyAobm93IC0gcGFyZW50VGlsZS50aW1lQWRkZWQpIC8gZmFkZUR1cmF0aW9uIDogLTE7XG5cbiAgICAgICAgY29uc3Qgc291cmNlID0gc291cmNlQ2FjaGUuZ2V0U291cmNlKCk7XG4gICAgICAgIGNvbnN0IGlkZWFsWiA9IHRyYW5zZm9ybS5jb3ZlcmluZ1pvb21MZXZlbCh7XG4gICAgICAgICAgICB0aWxlU2l6ZTogc291cmNlLnRpbGVTaXplLFxuICAgICAgICAgICAgcm91bmRab29tOiBzb3VyY2Uucm91bmRab29tXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIGlmIG5vIHBhcmVudCBvciBwYXJlbnQgaXMgb2xkZXIsIGZhZGUgaW47IGlmIHBhcmVudCBpcyB5b3VuZ2VyLCBmYWRlIG91dFxuICAgICAgICBjb25zdCBmYWRlSW4gPSAhcGFyZW50VGlsZSB8fCBNYXRoLmFicyhwYXJlbnRUaWxlLnRpbGVJRC5vdmVyc2NhbGVkWiAtIGlkZWFsWikgPiBNYXRoLmFicyh0aWxlLnRpbGVJRC5vdmVyc2NhbGVkWiAtIGlkZWFsWik7XG5cbiAgICAgICAgY29uc3QgY2hpbGRPcGFjaXR5ID0gKGZhZGVJbiAmJiB0aWxlLnJlZnJlc2hlZFVwb25FeHBpcmF0aW9uKSA/IDEgOiBjbGFtcChmYWRlSW4gPyBzaW5jZVRpbGUgOiAxIC0gc2luY2VQYXJlbnQsIDAsIDEpO1xuXG4gICAgICAgIC8vIHdlIGRvbid0IGNyb3NzZmFkZSB0aWxlcyB0aGF0IHdlcmUganVzdCByZWZyZXNoZWQgdXBvbiBleHBpcmluZzpcbiAgICAgICAgLy8gb25jZSB0aGV5J3JlIG9sZCBlbm91Z2ggdG8gcGFzcyB0aGUgY3Jvc3NmYWRpbmcgdGhyZXNob2xkXG4gICAgICAgIC8vIChmYWRlRHVyYXRpb24pLCB1bnNldCB0aGUgYHJlZnJlc2hlZFVwb25FeHBpcmF0aW9uYCBmbGFnIHNvIHdlIGRvbid0XG4gICAgICAgIC8vIGluY29ycmVjdGx5IGZhaWwgdG8gY3Jvc3NmYWRlIHRoZW0gd2hlbiB6b29taW5nXG4gICAgICAgIGlmICh0aWxlLnJlZnJlc2hlZFVwb25FeHBpcmF0aW9uICYmIHNpbmNlVGlsZSA+PSAxKSB0aWxlLnJlZnJlc2hlZFVwb25FeHBpcmF0aW9uID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKHBhcmVudFRpbGUpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgb3BhY2l0eTogMSxcbiAgICAgICAgICAgICAgICBtaXg6IDEgLSBjaGlsZE9wYWNpdHlcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIG9wYWNpdHk6IGNoaWxkT3BhY2l0eSxcbiAgICAgICAgICAgICAgICBtaXg6IDBcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgb3BhY2l0eTogMSxcbiAgICAgICAgICAgIG1peDogMFxuICAgICAgICB9O1xuICAgIH1cbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCBTdGVuY2lsTW9kZSBmcm9tICcuLi9nbC9zdGVuY2lsX21vZGUnO1xuaW1wb3J0IERlcHRoTW9kZSBmcm9tICcuLi9nbC9kZXB0aF9tb2RlJztcbmltcG9ydCBDdWxsRmFjZU1vZGUgZnJvbSAnLi4vZ2wvY3VsbF9mYWNlX21vZGUnO1xuaW1wb3J0IHtcbiAgICBiYWNrZ3JvdW5kVW5pZm9ybVZhbHVlcyxcbiAgICBiYWNrZ3JvdW5kUGF0dGVyblVuaWZvcm1WYWx1ZXNcbn0gZnJvbSAnLi9wcm9ncmFtL2JhY2tncm91bmRfcHJvZ3JhbSc7XG5cbmltcG9ydCB0eXBlIFBhaW50ZXIgZnJvbSAnLi9wYWludGVyJztcbmltcG9ydCB0eXBlIFNvdXJjZUNhY2hlIGZyb20gJy4uL3NvdXJjZS9zb3VyY2VfY2FjaGUnO1xuaW1wb3J0IHR5cGUgQmFja2dyb3VuZFN0eWxlTGF5ZXIgZnJvbSAnLi4vc3R5bGUvc3R5bGVfbGF5ZXIvYmFja2dyb3VuZF9zdHlsZV9sYXllcic7XG5cbmV4cG9ydCBkZWZhdWx0IGRyYXdCYWNrZ3JvdW5kO1xuXG5mdW5jdGlvbiBkcmF3QmFja2dyb3VuZChwYWludGVyOiBQYWludGVyLCBzb3VyY2VDYWNoZTogU291cmNlQ2FjaGUsIGxheWVyOiBCYWNrZ3JvdW5kU3R5bGVMYXllcikge1xuICAgIGNvbnN0IGNvbG9yID0gbGF5ZXIucGFpbnQuZ2V0KCdiYWNrZ3JvdW5kLWNvbG9yJyk7XG4gICAgY29uc3Qgb3BhY2l0eSA9IGxheWVyLnBhaW50LmdldCgnYmFja2dyb3VuZC1vcGFjaXR5Jyk7XG5cbiAgICBpZiAob3BhY2l0eSA9PT0gMCkgcmV0dXJuO1xuXG4gICAgY29uc3QgY29udGV4dCA9IHBhaW50ZXIuY29udGV4dDtcbiAgICBjb25zdCBnbCA9IGNvbnRleHQuZ2w7XG4gICAgY29uc3QgdHJhbnNmb3JtID0gcGFpbnRlci50cmFuc2Zvcm07XG4gICAgY29uc3QgdGlsZVNpemUgPSB0cmFuc2Zvcm0udGlsZVNpemU7XG4gICAgY29uc3QgaW1hZ2UgPSBsYXllci5wYWludC5nZXQoJ2JhY2tncm91bmQtcGF0dGVybicpO1xuICAgIGlmIChwYWludGVyLmlzUGF0dGVybk1pc3NpbmcoaW1hZ2UpKSByZXR1cm47XG5cbiAgICBjb25zdCBwYXNzID0gKCFpbWFnZSAmJiBjb2xvci5hID09PSAxICYmIG9wYWNpdHkgPT09IDEpID8gJ29wYXF1ZScgOiAndHJhbnNsdWNlbnQnO1xuICAgIGlmIChwYWludGVyLnJlbmRlclBhc3MgIT09IHBhc3MpIHJldHVybjtcblxuICAgIGNvbnN0IHN0ZW5jaWxNb2RlID0gU3RlbmNpbE1vZGUuZGlzYWJsZWQ7XG4gICAgY29uc3QgZGVwdGhNb2RlID0gcGFpbnRlci5kZXB0aE1vZGVGb3JTdWJsYXllcigwLCBwYXNzID09PSAnb3BhcXVlJyA/IERlcHRoTW9kZS5SZWFkV3JpdGUgOiBEZXB0aE1vZGUuUmVhZE9ubHkpO1xuICAgIGNvbnN0IGNvbG9yTW9kZSA9IHBhaW50ZXIuY29sb3JNb2RlRm9yUmVuZGVyUGFzcygpO1xuXG4gICAgY29uc3QgcHJvZ3JhbSA9IHBhaW50ZXIudXNlUHJvZ3JhbShpbWFnZSA/ICdiYWNrZ3JvdW5kUGF0dGVybicgOiAnYmFja2dyb3VuZCcpO1xuXG4gICAgY29uc3QgdGlsZUlEcyA9IHRyYW5zZm9ybS5jb3ZlcmluZ1RpbGVzKHt0aWxlU2l6ZX0pO1xuXG4gICAgaWYgKGltYWdlKSB7XG4gICAgICAgIGNvbnRleHQuYWN0aXZlVGV4dHVyZS5zZXQoZ2wuVEVYVFVSRTApO1xuICAgICAgICBwYWludGVyLmltYWdlTWFuYWdlci5iaW5kKHBhaW50ZXIuY29udGV4dCk7XG4gICAgfVxuXG4gICAgY29uc3QgY3Jvc3NmYWRlID0gbGF5ZXIuZ2V0Q3Jvc3NmYWRlUGFyYW1ldGVycygpO1xuICAgIGZvciAoY29uc3QgdGlsZUlEIG9mIHRpbGVJRHMpIHtcbiAgICAgICAgY29uc3QgbWF0cml4ID0gcGFpbnRlci50cmFuc2Zvcm0uY2FsY3VsYXRlUG9zTWF0cml4KHRpbGVJRC50b1Vud3JhcHBlZCgpKTtcblxuICAgICAgICBjb25zdCB1bmlmb3JtVmFsdWVzID0gaW1hZ2UgP1xuICAgICAgICAgICAgYmFja2dyb3VuZFBhdHRlcm5Vbmlmb3JtVmFsdWVzKG1hdHJpeCwgb3BhY2l0eSwgcGFpbnRlciwgaW1hZ2UsIHt0aWxlSUQsIHRpbGVTaXplfSwgY3Jvc3NmYWRlKSA6XG4gICAgICAgICAgICBiYWNrZ3JvdW5kVW5pZm9ybVZhbHVlcyhtYXRyaXgsIG9wYWNpdHksIGNvbG9yKTtcblxuICAgICAgICBwcm9ncmFtLmRyYXcoY29udGV4dCwgZ2wuVFJJQU5HTEVTLCBkZXB0aE1vZGUsIHN0ZW5jaWxNb2RlLCBjb2xvck1vZGUsIEN1bGxGYWNlTW9kZS5kaXNhYmxlZCxcbiAgICAgICAgICAgIHVuaWZvcm1WYWx1ZXMsIGxheWVyLmlkLCBwYWludGVyLnRpbGVFeHRlbnRCdWZmZXIsXG4gICAgICAgICAgICBwYWludGVyLnF1YWRUcmlhbmdsZUluZGV4QnVmZmVyLCBwYWludGVyLnRpbGVFeHRlbnRTZWdtZW50cyk7XG4gICAgfVxufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHsgbWF0NCB9IGZyb20gJ2dsLW1hdHJpeCc7XG5pbXBvcnQgRVhURU5UIGZyb20gJy4uL2RhdGEvZXh0ZW50JztcbmltcG9ydCB7IFBvc0FycmF5IH0gZnJvbSAnLi4vZGF0YS9hcnJheV90eXBlcyc7XG5pbXBvcnQgeyBMaW5lSW5kZXhBcnJheSB9IGZyb20gJy4uL2RhdGEvaW5kZXhfYXJyYXlfdHlwZSc7XG5pbXBvcnQgcG9zQXR0cmlidXRlcyBmcm9tICcuLi9kYXRhL3Bvc19hdHRyaWJ1dGVzJztcbmltcG9ydCBTZWdtZW50VmVjdG9yIGZyb20gJy4uL2RhdGEvc2VnbWVudCc7XG5pbXBvcnQgRGVwdGhNb2RlIGZyb20gJy4uL2dsL2RlcHRoX21vZGUnO1xuaW1wb3J0IFN0ZW5jaWxNb2RlIGZyb20gJy4uL2dsL3N0ZW5jaWxfbW9kZSc7XG5pbXBvcnQgQ3VsbEZhY2VNb2RlIGZyb20gJy4uL2dsL2N1bGxfZmFjZV9tb2RlJztcbmltcG9ydCB7IGRlYnVnVW5pZm9ybVZhbHVlcyB9IGZyb20gJy4vcHJvZ3JhbS9kZWJ1Z19wcm9ncmFtJztcbmltcG9ydCBDb2xvciBmcm9tICcuLi9zdHlsZS1zcGVjL3V0aWwvY29sb3InO1xuXG5pbXBvcnQgdHlwZSBQYWludGVyIGZyb20gJy4vcGFpbnRlcic7XG5pbXBvcnQgdHlwZSBTb3VyY2VDYWNoZSBmcm9tICcuLi9zb3VyY2Uvc291cmNlX2NhY2hlJztcbmltcG9ydCB0eXBlIHtPdmVyc2NhbGVkVGlsZUlEfSBmcm9tICcuLi9zb3VyY2UvdGlsZV9pZCc7XG5cbmV4cG9ydCBkZWZhdWx0IGRyYXdEZWJ1ZztcblxuZnVuY3Rpb24gZHJhd0RlYnVnKHBhaW50ZXI6IFBhaW50ZXIsIHNvdXJjZUNhY2hlOiBTb3VyY2VDYWNoZSwgY29vcmRzOiBBcnJheTxPdmVyc2NhbGVkVGlsZUlEPikge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29vcmRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGRyYXdEZWJ1Z1RpbGUocGFpbnRlciwgc291cmNlQ2FjaGUsIGNvb3Jkc1tpXSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBkcmF3RGVidWdUaWxlKHBhaW50ZXIsIHNvdXJjZUNhY2hlLCBjb29yZCkge1xuICAgIGNvbnN0IGNvbnRleHQgPSBwYWludGVyLmNvbnRleHQ7XG4gICAgY29uc3QgZ2wgPSBjb250ZXh0LmdsO1xuXG4gICAgY29uc3QgcG9zTWF0cml4ID0gY29vcmQucG9zTWF0cml4O1xuICAgIGNvbnN0IHByb2dyYW0gPSBwYWludGVyLnVzZVByb2dyYW0oJ2RlYnVnJyk7XG5cbiAgICBjb25zdCBkZXB0aE1vZGUgPSBEZXB0aE1vZGUuZGlzYWJsZWQ7XG4gICAgY29uc3Qgc3RlbmNpbE1vZGUgPSBTdGVuY2lsTW9kZS5kaXNhYmxlZDtcbiAgICBjb25zdCBjb2xvck1vZGUgPSBwYWludGVyLmNvbG9yTW9kZUZvclJlbmRlclBhc3MoKTtcbiAgICBjb25zdCBpZCA9ICckZGVidWcnO1xuXG4gICAgcHJvZ3JhbS5kcmF3KGNvbnRleHQsIGdsLkxJTkVfU1RSSVAsIGRlcHRoTW9kZSwgc3RlbmNpbE1vZGUsIGNvbG9yTW9kZSwgQ3VsbEZhY2VNb2RlLmRpc2FibGVkLFxuICAgICAgICBkZWJ1Z1VuaWZvcm1WYWx1ZXMocG9zTWF0cml4LCBDb2xvci5yZWQpLCBpZCxcbiAgICAgICAgcGFpbnRlci5kZWJ1Z0J1ZmZlciwgcGFpbnRlci50aWxlQm9yZGVySW5kZXhCdWZmZXIsIHBhaW50ZXIuZGVidWdTZWdtZW50cyk7XG5cbiAgICBjb25zdCB0aWxlUmF3RGF0YSA9IHNvdXJjZUNhY2hlLmdldFRpbGVCeUlEKGNvb3JkLmtleSkubGF0ZXN0UmF3VGlsZURhdGE7XG4gICAgY29uc3QgdGlsZUJ5dGVMZW5ndGggPSAodGlsZVJhd0RhdGEgJiYgdGlsZVJhd0RhdGEuYnl0ZUxlbmd0aCkgfHwgMDtcbiAgICBjb25zdCB0aWxlU2l6ZUtiID0gTWF0aC5mbG9vcih0aWxlQnl0ZUxlbmd0aCAvIDEwMjQpO1xuICAgIGNvbnN0IHZlcnRpY2VzID0gY3JlYXRlVGV4dFZlcnRpY2VzKGAke2Nvb3JkLnRvU3RyaW5nKCl9ICR7dGlsZVNpemVLYn1rYmAsIDUwLCAyMDAsIDUpO1xuICAgIGNvbnN0IGRlYnVnVGV4dEFycmF5ID0gbmV3IFBvc0FycmF5KCk7XG4gICAgY29uc3QgZGVidWdUZXh0SW5kaWNlcyA9IG5ldyBMaW5lSW5kZXhBcnJheSgpO1xuICAgIGZvciAobGV0IHYgPSAwOyB2IDwgdmVydGljZXMubGVuZ3RoOyB2ICs9IDIpIHtcbiAgICAgICAgZGVidWdUZXh0QXJyYXkuZW1wbGFjZUJhY2sodmVydGljZXNbdl0sIHZlcnRpY2VzW3YgKyAxXSk7XG4gICAgICAgIGRlYnVnVGV4dEluZGljZXMuZW1wbGFjZUJhY2sodiwgdiArIDEpO1xuICAgIH1cbiAgICBjb25zdCBkZWJ1Z1RleHRCdWZmZXIgPSBjb250ZXh0LmNyZWF0ZVZlcnRleEJ1ZmZlcihkZWJ1Z1RleHRBcnJheSwgcG9zQXR0cmlidXRlcy5tZW1iZXJzKTtcbiAgICBjb25zdCBkZWJ1Z1RleHRJbmRleEJ1ZmZlciA9IGNvbnRleHQuY3JlYXRlSW5kZXhCdWZmZXIoZGVidWdUZXh0SW5kaWNlcyk7XG4gICAgY29uc3QgZGVidWdUZXh0U2VnbWVudCA9IFNlZ21lbnRWZWN0b3Iuc2ltcGxlU2VnbWVudCgwLCAwLCBkZWJ1Z1RleHRBcnJheS5sZW5ndGggLyAyLCBkZWJ1Z1RleHRBcnJheS5sZW5ndGggLyAyKTtcblxuICAgIC8vIERyYXcgdGhlIGhhbG8gd2l0aCBtdWx0aXBsZSAxcHggbGluZXMgaW5zdGVhZCBvZiBvbmUgd2lkZXIgbGluZSBiZWNhdXNlXG4gICAgLy8gdGhlIGdsIHNwZWMgZG9lc24ndCBndWFyYW50ZWUgc3VwcG9ydCBmb3IgbGluZXMgd2l0aCB3aWR0aCA+IDEuXG4gICAgY29uc3QgdGlsZVNpemUgPSBzb3VyY2VDYWNoZS5nZXRUaWxlKGNvb3JkKS50aWxlU2l6ZTtcbiAgICBjb25zdCBvbmVQaXhlbCA9IEVYVEVOVCAvIChNYXRoLnBvdygyLCBwYWludGVyLnRyYW5zZm9ybS56b29tIC0gY29vcmQub3ZlcnNjYWxlZFopICogdGlsZVNpemUpO1xuICAgIGNvbnN0IHRyYW5zbGF0aW9ucyA9IFtbLTEsIC0xXSwgWy0xLCAxXSwgWzEsIC0xXSwgWzEsIDFdXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRyYW5zbGF0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCB0cmFuc2xhdGlvbiA9IHRyYW5zbGF0aW9uc1tpXTtcblxuICAgICAgICBwcm9ncmFtLmRyYXcoY29udGV4dCwgZ2wuTElORVMsIGRlcHRoTW9kZSwgc3RlbmNpbE1vZGUsIGNvbG9yTW9kZSwgQ3VsbEZhY2VNb2RlLmRpc2FibGVkLFxuICAgICAgICAgICAgZGVidWdVbmlmb3JtVmFsdWVzKFxuICAgICAgICAgICAgICAgIG1hdDQudHJhbnNsYXRlKFtdLCBwb3NNYXRyaXgsIFtcbiAgICAgICAgICAgICAgICAgICAgb25lUGl4ZWwgKiB0cmFuc2xhdGlvblswXSxcbiAgICAgICAgICAgICAgICAgICAgb25lUGl4ZWwgKiB0cmFuc2xhdGlvblsxXSwgMF0pLFxuICAgICAgICAgICAgICAgIENvbG9yLndoaXRlKSxcbiAgICAgICAgICAgIGlkLCBkZWJ1Z1RleHRCdWZmZXIsIGRlYnVnVGV4dEluZGV4QnVmZmVyLCBkZWJ1Z1RleHRTZWdtZW50KTtcbiAgICB9XG5cbiAgICBwcm9ncmFtLmRyYXcoY29udGV4dCwgZ2wuTElORVMsIGRlcHRoTW9kZSwgc3RlbmNpbE1vZGUsIGNvbG9yTW9kZSwgQ3VsbEZhY2VNb2RlLmRpc2FibGVkLFxuICAgICAgICBkZWJ1Z1VuaWZvcm1WYWx1ZXMocG9zTWF0cml4LCBDb2xvci5ibGFjayksIGlkLFxuICAgICAgICBkZWJ1Z1RleHRCdWZmZXIsIGRlYnVnVGV4dEluZGV4QnVmZmVyLCBkZWJ1Z1RleHRTZWdtZW50KTtcbn1cblxuLy8gRm9udCBkYXRhIEZyb20gSGVyc2hleSBTaW1wbGV4IEZvbnRcbi8vIGh0dHA6Ly9wYXVsYm91cmtlLm5ldC9kYXRhZm9ybWF0cy9oZXJzaGV5L1xuY29uc3Qgc2ltcGxleEZvbnQgPSB7XG4gICAgXCIgXCI6IFsxNiwgW11dLFxuICAgIFwiIVwiOiBbMTAsIFs1LCAyMSwgNSwgNywgLTEsIC0xLCA1LCAyLCA0LCAxLCA1LCAwLCA2LCAxLCA1LCAyXV0sXG4gICAgXCJcXFwiXCI6IFsxNiwgWzQsIDIxLCA0LCAxNCwgLTEsIC0xLCAxMiwgMjEsIDEyLCAxNF1dLFxuICAgIFwiI1wiOiBbMjEsIFsxMSwgMjUsIDQsIC03LCAtMSwgLTEsIDE3LCAyNSwgMTAsIC03LCAtMSwgLTEsIDQsIDEyLCAxOCwgMTIsIC0xLCAtMSwgMywgNiwgMTcsIDZdXSxcbiAgICBcIiRcIjogWzIwLCBbOCwgMjUsIDgsIC00LCAtMSwgLTEsIDEyLCAyNSwgMTIsIC00LCAtMSwgLTEsIDE3LCAxOCwgMTUsIDIwLCAxMiwgMjEsIDgsIDIxLCA1LCAyMCwgMywgMTgsIDMsIDE2LCA0LCAxNCwgNSwgMTMsIDcsIDEyLCAxMywgMTAsIDE1LCA5LCAxNiwgOCwgMTcsIDYsIDE3LCAzLCAxNSwgMSwgMTIsIDAsIDgsIDAsIDUsIDEsIDMsIDNdXSxcbiAgICBcIiVcIjogWzI0LCBbMjEsIDIxLCAzLCAwLCAtMSwgLTEsIDgsIDIxLCAxMCwgMTksIDEwLCAxNywgOSwgMTUsIDcsIDE0LCA1LCAxNCwgMywgMTYsIDMsIDE4LCA0LCAyMCwgNiwgMjEsIDgsIDIxLCAxMCwgMjAsIDEzLCAxOSwgMTYsIDE5LCAxOSwgMjAsIDIxLCAyMSwgLTEsIC0xLCAxNywgNywgMTUsIDYsIDE0LCA0LCAxNCwgMiwgMTYsIDAsIDE4LCAwLCAyMCwgMSwgMjEsIDMsIDIxLCA1LCAxOSwgNywgMTcsIDddXSxcbiAgICBcIiZcIjogWzI2LCBbMjMsIDEyLCAyMywgMTMsIDIyLCAxNCwgMjEsIDE0LCAyMCwgMTMsIDE5LCAxMSwgMTcsIDYsIDE1LCAzLCAxMywgMSwgMTEsIDAsIDcsIDAsIDUsIDEsIDQsIDIsIDMsIDQsIDMsIDYsIDQsIDgsIDUsIDksIDEyLCAxMywgMTMsIDE0LCAxNCwgMTYsIDE0LCAxOCwgMTMsIDIwLCAxMSwgMjEsIDksIDIwLCA4LCAxOCwgOCwgMTYsIDksIDEzLCAxMSwgMTAsIDE2LCAzLCAxOCwgMSwgMjAsIDAsIDIyLCAwLCAyMywgMSwgMjMsIDJdXSxcbiAgICBcIidcIjogWzEwLCBbNSwgMTksIDQsIDIwLCA1LCAyMSwgNiwgMjAsIDYsIDE4LCA1LCAxNiwgNCwgMTVdXSxcbiAgICBcIihcIjogWzE0LCBbMTEsIDI1LCA5LCAyMywgNywgMjAsIDUsIDE2LCA0LCAxMSwgNCwgNywgNSwgMiwgNywgLTIsIDksIC01LCAxMSwgLTddXSxcbiAgICBcIilcIjogWzE0LCBbMywgMjUsIDUsIDIzLCA3LCAyMCwgOSwgMTYsIDEwLCAxMSwgMTAsIDcsIDksIDIsIDcsIC0yLCA1LCAtNSwgMywgLTddXSxcbiAgICBcIipcIjogWzE2LCBbOCwgMjEsIDgsIDksIC0xLCAtMSwgMywgMTgsIDEzLCAxMiwgLTEsIC0xLCAxMywgMTgsIDMsIDEyXV0sXG4gICAgXCIrXCI6IFsyNiwgWzEzLCAxOCwgMTMsIDAsIC0xLCAtMSwgNCwgOSwgMjIsIDldXSxcbiAgICBcIixcIjogWzEwLCBbNiwgMSwgNSwgMCwgNCwgMSwgNSwgMiwgNiwgMSwgNiwgLTEsIDUsIC0zLCA0LCAtNF1dLFxuICAgIFwiLVwiOiBbMjYsIFs0LCA5LCAyMiwgOV1dLFxuICAgIFwiLlwiOiBbMTAsIFs1LCAyLCA0LCAxLCA1LCAwLCA2LCAxLCA1LCAyXV0sXG4gICAgXCIvXCI6IFsyMiwgWzIwLCAyNSwgMiwgLTddXSxcbiAgICBcIjBcIjogWzIwLCBbOSwgMjEsIDYsIDIwLCA0LCAxNywgMywgMTIsIDMsIDksIDQsIDQsIDYsIDEsIDksIDAsIDExLCAwLCAxNCwgMSwgMTYsIDQsIDE3LCA5LCAxNywgMTIsIDE2LCAxNywgMTQsIDIwLCAxMSwgMjEsIDksIDIxXV0sXG4gICAgXCIxXCI6IFsyMCwgWzYsIDE3LCA4LCAxOCwgMTEsIDIxLCAxMSwgMF1dLFxuICAgIFwiMlwiOiBbMjAsIFs0LCAxNiwgNCwgMTcsIDUsIDE5LCA2LCAyMCwgOCwgMjEsIDEyLCAyMSwgMTQsIDIwLCAxNSwgMTksIDE2LCAxNywgMTYsIDE1LCAxNSwgMTMsIDEzLCAxMCwgMywgMCwgMTcsIDBdXSxcbiAgICBcIjNcIjogWzIwLCBbNSwgMjEsIDE2LCAyMSwgMTAsIDEzLCAxMywgMTMsIDE1LCAxMiwgMTYsIDExLCAxNywgOCwgMTcsIDYsIDE2LCAzLCAxNCwgMSwgMTEsIDAsIDgsIDAsIDUsIDEsIDQsIDIsIDMsIDRdXSxcbiAgICBcIjRcIjogWzIwLCBbMTMsIDIxLCAzLCA3LCAxOCwgNywgLTEsIC0xLCAxMywgMjEsIDEzLCAwXV0sXG4gICAgXCI1XCI6IFsyMCwgWzE1LCAyMSwgNSwgMjEsIDQsIDEyLCA1LCAxMywgOCwgMTQsIDExLCAxNCwgMTQsIDEzLCAxNiwgMTEsIDE3LCA4LCAxNywgNiwgMTYsIDMsIDE0LCAxLCAxMSwgMCwgOCwgMCwgNSwgMSwgNCwgMiwgMywgNF1dLFxuICAgIFwiNlwiOiBbMjAsIFsxNiwgMTgsIDE1LCAyMCwgMTIsIDIxLCAxMCwgMjEsIDcsIDIwLCA1LCAxNywgNCwgMTIsIDQsIDcsIDUsIDMsIDcsIDEsIDEwLCAwLCAxMSwgMCwgMTQsIDEsIDE2LCAzLCAxNywgNiwgMTcsIDcsIDE2LCAxMCwgMTQsIDEyLCAxMSwgMTMsIDEwLCAxMywgNywgMTIsIDUsIDEwLCA0LCA3XV0sXG4gICAgXCI3XCI6IFsyMCwgWzE3LCAyMSwgNywgMCwgLTEsIC0xLCAzLCAyMSwgMTcsIDIxXV0sXG4gICAgXCI4XCI6IFsyMCwgWzgsIDIxLCA1LCAyMCwgNCwgMTgsIDQsIDE2LCA1LCAxNCwgNywgMTMsIDExLCAxMiwgMTQsIDExLCAxNiwgOSwgMTcsIDcsIDE3LCA0LCAxNiwgMiwgMTUsIDEsIDEyLCAwLCA4LCAwLCA1LCAxLCA0LCAyLCAzLCA0LCAzLCA3LCA0LCA5LCA2LCAxMSwgOSwgMTIsIDEzLCAxMywgMTUsIDE0LCAxNiwgMTYsIDE2LCAxOCwgMTUsIDIwLCAxMiwgMjEsIDgsIDIxXV0sXG4gICAgXCI5XCI6IFsyMCwgWzE2LCAxNCwgMTUsIDExLCAxMywgOSwgMTAsIDgsIDksIDgsIDYsIDksIDQsIDExLCAzLCAxNCwgMywgMTUsIDQsIDE4LCA2LCAyMCwgOSwgMjEsIDEwLCAyMSwgMTMsIDIwLCAxNSwgMTgsIDE2LCAxNCwgMTYsIDksIDE1LCA0LCAxMywgMSwgMTAsIDAsIDgsIDAsIDUsIDEsIDQsIDNdXSxcbiAgICBcIjpcIjogWzEwLCBbNSwgMTQsIDQsIDEzLCA1LCAxMiwgNiwgMTMsIDUsIDE0LCAtMSwgLTEsIDUsIDIsIDQsIDEsIDUsIDAsIDYsIDEsIDUsIDJdXSxcbiAgICBcIjtcIjogWzEwLCBbNSwgMTQsIDQsIDEzLCA1LCAxMiwgNiwgMTMsIDUsIDE0LCAtMSwgLTEsIDYsIDEsIDUsIDAsIDQsIDEsIDUsIDIsIDYsIDEsIDYsIC0xLCA1LCAtMywgNCwgLTRdXSxcbiAgICBcIjxcIjogWzI0LCBbMjAsIDE4LCA0LCA5LCAyMCwgMF1dLFxuICAgIFwiPVwiOiBbMjYsIFs0LCAxMiwgMjIsIDEyLCAtMSwgLTEsIDQsIDYsIDIyLCA2XV0sXG4gICAgXCI+XCI6IFsyNCwgWzQsIDE4LCAyMCwgOSwgNCwgMF1dLFxuICAgIFwiP1wiOiBbMTgsIFszLCAxNiwgMywgMTcsIDQsIDE5LCA1LCAyMCwgNywgMjEsIDExLCAyMSwgMTMsIDIwLCAxNCwgMTksIDE1LCAxNywgMTUsIDE1LCAxNCwgMTMsIDEzLCAxMiwgOSwgMTAsIDksIDcsIC0xLCAtMSwgOSwgMiwgOCwgMSwgOSwgMCwgMTAsIDEsIDksIDJdXSxcbiAgICBcIkBcIjogWzI3LCBbMTgsIDEzLCAxNywgMTUsIDE1LCAxNiwgMTIsIDE2LCAxMCwgMTUsIDksIDE0LCA4LCAxMSwgOCwgOCwgOSwgNiwgMTEsIDUsIDE0LCA1LCAxNiwgNiwgMTcsIDgsIC0xLCAtMSwgMTIsIDE2LCAxMCwgMTQsIDksIDExLCA5LCA4LCAxMCwgNiwgMTEsIDUsIC0xLCAtMSwgMTgsIDE2LCAxNywgOCwgMTcsIDYsIDE5LCA1LCAyMSwgNSwgMjMsIDcsIDI0LCAxMCwgMjQsIDEyLCAyMywgMTUsIDIyLCAxNywgMjAsIDE5LCAxOCwgMjAsIDE1LCAyMSwgMTIsIDIxLCA5LCAyMCwgNywgMTksIDUsIDE3LCA0LCAxNSwgMywgMTIsIDMsIDksIDQsIDYsIDUsIDQsIDcsIDIsIDksIDEsIDEyLCAwLCAxNSwgMCwgMTgsIDEsIDIwLCAyLCAyMSwgMywgLTEsIC0xLCAxOSwgMTYsIDE4LCA4LCAxOCwgNiwgMTksIDVdXSxcbiAgICBcIkFcIjogWzE4LCBbOSwgMjEsIDEsIDAsIC0xLCAtMSwgOSwgMjEsIDE3LCAwLCAtMSwgLTEsIDQsIDcsIDE0LCA3XV0sXG4gICAgXCJCXCI6IFsyMSwgWzQsIDIxLCA0LCAwLCAtMSwgLTEsIDQsIDIxLCAxMywgMjEsIDE2LCAyMCwgMTcsIDE5LCAxOCwgMTcsIDE4LCAxNSwgMTcsIDEzLCAxNiwgMTIsIDEzLCAxMSwgLTEsIC0xLCA0LCAxMSwgMTMsIDExLCAxNiwgMTAsIDE3LCA5LCAxOCwgNywgMTgsIDQsIDE3LCAyLCAxNiwgMSwgMTMsIDAsIDQsIDBdXSxcbiAgICBcIkNcIjogWzIxLCBbMTgsIDE2LCAxNywgMTgsIDE1LCAyMCwgMTMsIDIxLCA5LCAyMSwgNywgMjAsIDUsIDE4LCA0LCAxNiwgMywgMTMsIDMsIDgsIDQsIDUsIDUsIDMsIDcsIDEsIDksIDAsIDEzLCAwLCAxNSwgMSwgMTcsIDMsIDE4LCA1XV0sXG4gICAgXCJEXCI6IFsyMSwgWzQsIDIxLCA0LCAwLCAtMSwgLTEsIDQsIDIxLCAxMSwgMjEsIDE0LCAyMCwgMTYsIDE4LCAxNywgMTYsIDE4LCAxMywgMTgsIDgsIDE3LCA1LCAxNiwgMywgMTQsIDEsIDExLCAwLCA0LCAwXV0sXG4gICAgXCJFXCI6IFsxOSwgWzQsIDIxLCA0LCAwLCAtMSwgLTEsIDQsIDIxLCAxNywgMjEsIC0xLCAtMSwgNCwgMTEsIDEyLCAxMSwgLTEsIC0xLCA0LCAwLCAxNywgMF1dLFxuICAgIFwiRlwiOiBbMTgsIFs0LCAyMSwgNCwgMCwgLTEsIC0xLCA0LCAyMSwgMTcsIDIxLCAtMSwgLTEsIDQsIDExLCAxMiwgMTFdXSxcbiAgICBcIkdcIjogWzIxLCBbMTgsIDE2LCAxNywgMTgsIDE1LCAyMCwgMTMsIDIxLCA5LCAyMSwgNywgMjAsIDUsIDE4LCA0LCAxNiwgMywgMTMsIDMsIDgsIDQsIDUsIDUsIDMsIDcsIDEsIDksIDAsIDEzLCAwLCAxNSwgMSwgMTcsIDMsIDE4LCA1LCAxOCwgOCwgLTEsIC0xLCAxMywgOCwgMTgsIDhdXSxcbiAgICBcIkhcIjogWzIyLCBbNCwgMjEsIDQsIDAsIC0xLCAtMSwgMTgsIDIxLCAxOCwgMCwgLTEsIC0xLCA0LCAxMSwgMTgsIDExXV0sXG4gICAgXCJJXCI6IFs4LCBbNCwgMjEsIDQsIDBdXSxcbiAgICBcIkpcIjogWzE2LCBbMTIsIDIxLCAxMiwgNSwgMTEsIDIsIDEwLCAxLCA4LCAwLCA2LCAwLCA0LCAxLCAzLCAyLCAyLCA1LCAyLCA3XV0sXG4gICAgXCJLXCI6IFsyMSwgWzQsIDIxLCA0LCAwLCAtMSwgLTEsIDE4LCAyMSwgNCwgNywgLTEsIC0xLCA5LCAxMiwgMTgsIDBdXSxcbiAgICBcIkxcIjogWzE3LCBbNCwgMjEsIDQsIDAsIC0xLCAtMSwgNCwgMCwgMTYsIDBdXSxcbiAgICBcIk1cIjogWzI0LCBbNCwgMjEsIDQsIDAsIC0xLCAtMSwgNCwgMjEsIDEyLCAwLCAtMSwgLTEsIDIwLCAyMSwgMTIsIDAsIC0xLCAtMSwgMjAsIDIxLCAyMCwgMF1dLFxuICAgIFwiTlwiOiBbMjIsIFs0LCAyMSwgNCwgMCwgLTEsIC0xLCA0LCAyMSwgMTgsIDAsIC0xLCAtMSwgMTgsIDIxLCAxOCwgMF1dLFxuICAgIFwiT1wiOiBbMjIsIFs5LCAyMSwgNywgMjAsIDUsIDE4LCA0LCAxNiwgMywgMTMsIDMsIDgsIDQsIDUsIDUsIDMsIDcsIDEsIDksIDAsIDEzLCAwLCAxNSwgMSwgMTcsIDMsIDE4LCA1LCAxOSwgOCwgMTksIDEzLCAxOCwgMTYsIDE3LCAxOCwgMTUsIDIwLCAxMywgMjEsIDksIDIxXV0sXG4gICAgXCJQXCI6IFsyMSwgWzQsIDIxLCA0LCAwLCAtMSwgLTEsIDQsIDIxLCAxMywgMjEsIDE2LCAyMCwgMTcsIDE5LCAxOCwgMTcsIDE4LCAxNCwgMTcsIDEyLCAxNiwgMTEsIDEzLCAxMCwgNCwgMTBdXSxcbiAgICBcIlFcIjogWzIyLCBbOSwgMjEsIDcsIDIwLCA1LCAxOCwgNCwgMTYsIDMsIDEzLCAzLCA4LCA0LCA1LCA1LCAzLCA3LCAxLCA5LCAwLCAxMywgMCwgMTUsIDEsIDE3LCAzLCAxOCwgNSwgMTksIDgsIDE5LCAxMywgMTgsIDE2LCAxNywgMTgsIDE1LCAyMCwgMTMsIDIxLCA5LCAyMSwgLTEsIC0xLCAxMiwgNCwgMTgsIC0yXV0sXG4gICAgXCJSXCI6IFsyMSwgWzQsIDIxLCA0LCAwLCAtMSwgLTEsIDQsIDIxLCAxMywgMjEsIDE2LCAyMCwgMTcsIDE5LCAxOCwgMTcsIDE4LCAxNSwgMTcsIDEzLCAxNiwgMTIsIDEzLCAxMSwgNCwgMTEsIC0xLCAtMSwgMTEsIDExLCAxOCwgMF1dLFxuICAgIFwiU1wiOiBbMjAsIFsxNywgMTgsIDE1LCAyMCwgMTIsIDIxLCA4LCAyMSwgNSwgMjAsIDMsIDE4LCAzLCAxNiwgNCwgMTQsIDUsIDEzLCA3LCAxMiwgMTMsIDEwLCAxNSwgOSwgMTYsIDgsIDE3LCA2LCAxNywgMywgMTUsIDEsIDEyLCAwLCA4LCAwLCA1LCAxLCAzLCAzXV0sXG4gICAgXCJUXCI6IFsxNiwgWzgsIDIxLCA4LCAwLCAtMSwgLTEsIDEsIDIxLCAxNSwgMjFdXSxcbiAgICBcIlVcIjogWzIyLCBbNCwgMjEsIDQsIDYsIDUsIDMsIDcsIDEsIDEwLCAwLCAxMiwgMCwgMTUsIDEsIDE3LCAzLCAxOCwgNiwgMTgsIDIxXV0sXG4gICAgXCJWXCI6IFsxOCwgWzEsIDIxLCA5LCAwLCAtMSwgLTEsIDE3LCAyMSwgOSwgMF1dLFxuICAgIFwiV1wiOiBbMjQsIFsyLCAyMSwgNywgMCwgLTEsIC0xLCAxMiwgMjEsIDcsIDAsIC0xLCAtMSwgMTIsIDIxLCAxNywgMCwgLTEsIC0xLCAyMiwgMjEsIDE3LCAwXV0sXG4gICAgXCJYXCI6IFsyMCwgWzMsIDIxLCAxNywgMCwgLTEsIC0xLCAxNywgMjEsIDMsIDBdXSxcbiAgICBcIllcIjogWzE4LCBbMSwgMjEsIDksIDExLCA5LCAwLCAtMSwgLTEsIDE3LCAyMSwgOSwgMTFdXSxcbiAgICBcIlpcIjogWzIwLCBbMTcsIDIxLCAzLCAwLCAtMSwgLTEsIDMsIDIxLCAxNywgMjEsIC0xLCAtMSwgMywgMCwgMTcsIDBdXSxcbiAgICBcIltcIjogWzE0LCBbNCwgMjUsIDQsIC03LCAtMSwgLTEsIDUsIDI1LCA1LCAtNywgLTEsIC0xLCA0LCAyNSwgMTEsIDI1LCAtMSwgLTEsIDQsIC03LCAxMSwgLTddXSxcbiAgICBcIlxcXFxcIjogWzE0LCBbMCwgMjEsIDE0LCAtM11dLFxuICAgIFwiXVwiOiBbMTQsIFs5LCAyNSwgOSwgLTcsIC0xLCAtMSwgMTAsIDI1LCAxMCwgLTcsIC0xLCAtMSwgMywgMjUsIDEwLCAyNSwgLTEsIC0xLCAzLCAtNywgMTAsIC03XV0sXG4gICAgXCJeXCI6IFsxNiwgWzYsIDE1LCA4LCAxOCwgMTAsIDE1LCAtMSwgLTEsIDMsIDEyLCA4LCAxNywgMTMsIDEyLCAtMSwgLTEsIDgsIDE3LCA4LCAwXV0sXG4gICAgXCJfXCI6IFsxNiwgWzAsIC0yLCAxNiwgLTJdXSxcbiAgICBcImBcIjogWzEwLCBbNiwgMjEsIDUsIDIwLCA0LCAxOCwgNCwgMTYsIDUsIDE1LCA2LCAxNiwgNSwgMTddXSxcbiAgICBcImFcIjogWzE5LCBbMTUsIDE0LCAxNSwgMCwgLTEsIC0xLCAxNSwgMTEsIDEzLCAxMywgMTEsIDE0LCA4LCAxNCwgNiwgMTMsIDQsIDExLCAzLCA4LCAzLCA2LCA0LCAzLCA2LCAxLCA4LCAwLCAxMSwgMCwgMTMsIDEsIDE1LCAzXV0sXG4gICAgXCJiXCI6IFsxOSwgWzQsIDIxLCA0LCAwLCAtMSwgLTEsIDQsIDExLCA2LCAxMywgOCwgMTQsIDExLCAxNCwgMTMsIDEzLCAxNSwgMTEsIDE2LCA4LCAxNiwgNiwgMTUsIDMsIDEzLCAxLCAxMSwgMCwgOCwgMCwgNiwgMSwgNCwgM11dLFxuICAgIFwiY1wiOiBbMTgsIFsxNSwgMTEsIDEzLCAxMywgMTEsIDE0LCA4LCAxNCwgNiwgMTMsIDQsIDExLCAzLCA4LCAzLCA2LCA0LCAzLCA2LCAxLCA4LCAwLCAxMSwgMCwgMTMsIDEsIDE1LCAzXV0sXG4gICAgXCJkXCI6IFsxOSwgWzE1LCAyMSwgMTUsIDAsIC0xLCAtMSwgMTUsIDExLCAxMywgMTMsIDExLCAxNCwgOCwgMTQsIDYsIDEzLCA0LCAxMSwgMywgOCwgMywgNiwgNCwgMywgNiwgMSwgOCwgMCwgMTEsIDAsIDEzLCAxLCAxNSwgM11dLFxuICAgIFwiZVwiOiBbMTgsIFszLCA4LCAxNSwgOCwgMTUsIDEwLCAxNCwgMTIsIDEzLCAxMywgMTEsIDE0LCA4LCAxNCwgNiwgMTMsIDQsIDExLCAzLCA4LCAzLCA2LCA0LCAzLCA2LCAxLCA4LCAwLCAxMSwgMCwgMTMsIDEsIDE1LCAzXV0sXG4gICAgXCJmXCI6IFsxMiwgWzEwLCAyMSwgOCwgMjEsIDYsIDIwLCA1LCAxNywgNSwgMCwgLTEsIC0xLCAyLCAxNCwgOSwgMTRdXSxcbiAgICBcImdcIjogWzE5LCBbMTUsIDE0LCAxNSwgLTIsIDE0LCAtNSwgMTMsIC02LCAxMSwgLTcsIDgsIC03LCA2LCAtNiwgLTEsIC0xLCAxNSwgMTEsIDEzLCAxMywgMTEsIDE0LCA4LCAxNCwgNiwgMTMsIDQsIDExLCAzLCA4LCAzLCA2LCA0LCAzLCA2LCAxLCA4LCAwLCAxMSwgMCwgMTMsIDEsIDE1LCAzXV0sXG4gICAgXCJoXCI6IFsxOSwgWzQsIDIxLCA0LCAwLCAtMSwgLTEsIDQsIDEwLCA3LCAxMywgOSwgMTQsIDEyLCAxNCwgMTQsIDEzLCAxNSwgMTAsIDE1LCAwXV0sXG4gICAgXCJpXCI6IFs4LCBbMywgMjEsIDQsIDIwLCA1LCAyMSwgNCwgMjIsIDMsIDIxLCAtMSwgLTEsIDQsIDE0LCA0LCAwXV0sXG4gICAgXCJqXCI6IFsxMCwgWzUsIDIxLCA2LCAyMCwgNywgMjEsIDYsIDIyLCA1LCAyMSwgLTEsIC0xLCA2LCAxNCwgNiwgLTMsIDUsIC02LCAzLCAtNywgMSwgLTddXSxcbiAgICBcImtcIjogWzE3LCBbNCwgMjEsIDQsIDAsIC0xLCAtMSwgMTQsIDE0LCA0LCA0LCAtMSwgLTEsIDgsIDgsIDE1LCAwXV0sXG4gICAgXCJsXCI6IFs4LCBbNCwgMjEsIDQsIDBdXSxcbiAgICBcIm1cIjogWzMwLCBbNCwgMTQsIDQsIDAsIC0xLCAtMSwgNCwgMTAsIDcsIDEzLCA5LCAxNCwgMTIsIDE0LCAxNCwgMTMsIDE1LCAxMCwgMTUsIDAsIC0xLCAtMSwgMTUsIDEwLCAxOCwgMTMsIDIwLCAxNCwgMjMsIDE0LCAyNSwgMTMsIDI2LCAxMCwgMjYsIDBdXSxcbiAgICBcIm5cIjogWzE5LCBbNCwgMTQsIDQsIDAsIC0xLCAtMSwgNCwgMTAsIDcsIDEzLCA5LCAxNCwgMTIsIDE0LCAxNCwgMTMsIDE1LCAxMCwgMTUsIDBdXSxcbiAgICBcIm9cIjogWzE5LCBbOCwgMTQsIDYsIDEzLCA0LCAxMSwgMywgOCwgMywgNiwgNCwgMywgNiwgMSwgOCwgMCwgMTEsIDAsIDEzLCAxLCAxNSwgMywgMTYsIDYsIDE2LCA4LCAxNSwgMTEsIDEzLCAxMywgMTEsIDE0LCA4LCAxNF1dLFxuICAgIFwicFwiOiBbMTksIFs0LCAxNCwgNCwgLTcsIC0xLCAtMSwgNCwgMTEsIDYsIDEzLCA4LCAxNCwgMTEsIDE0LCAxMywgMTMsIDE1LCAxMSwgMTYsIDgsIDE2LCA2LCAxNSwgMywgMTMsIDEsIDExLCAwLCA4LCAwLCA2LCAxLCA0LCAzXV0sXG4gICAgXCJxXCI6IFsxOSwgWzE1LCAxNCwgMTUsIC03LCAtMSwgLTEsIDE1LCAxMSwgMTMsIDEzLCAxMSwgMTQsIDgsIDE0LCA2LCAxMywgNCwgMTEsIDMsIDgsIDMsIDYsIDQsIDMsIDYsIDEsIDgsIDAsIDExLCAwLCAxMywgMSwgMTUsIDNdXSxcbiAgICBcInJcIjogWzEzLCBbNCwgMTQsIDQsIDAsIC0xLCAtMSwgNCwgOCwgNSwgMTEsIDcsIDEzLCA5LCAxNCwgMTIsIDE0XV0sXG4gICAgXCJzXCI6IFsxNywgWzE0LCAxMSwgMTMsIDEzLCAxMCwgMTQsIDcsIDE0LCA0LCAxMywgMywgMTEsIDQsIDksIDYsIDgsIDExLCA3LCAxMywgNiwgMTQsIDQsIDE0LCAzLCAxMywgMSwgMTAsIDAsIDcsIDAsIDQsIDEsIDMsIDNdXSxcbiAgICBcInRcIjogWzEyLCBbNSwgMjEsIDUsIDQsIDYsIDEsIDgsIDAsIDEwLCAwLCAtMSwgLTEsIDIsIDE0LCA5LCAxNF1dLFxuICAgIFwidVwiOiBbMTksIFs0LCAxNCwgNCwgNCwgNSwgMSwgNywgMCwgMTAsIDAsIDEyLCAxLCAxNSwgNCwgLTEsIC0xLCAxNSwgMTQsIDE1LCAwXV0sXG4gICAgXCJ2XCI6IFsxNiwgWzIsIDE0LCA4LCAwLCAtMSwgLTEsIDE0LCAxNCwgOCwgMF1dLFxuICAgIFwid1wiOiBbMjIsIFszLCAxNCwgNywgMCwgLTEsIC0xLCAxMSwgMTQsIDcsIDAsIC0xLCAtMSwgMTEsIDE0LCAxNSwgMCwgLTEsIC0xLCAxOSwgMTQsIDE1LCAwXV0sXG4gICAgXCJ4XCI6IFsxNywgWzMsIDE0LCAxNCwgMCwgLTEsIC0xLCAxNCwgMTQsIDMsIDBdXSxcbiAgICBcInlcIjogWzE2LCBbMiwgMTQsIDgsIDAsIC0xLCAtMSwgMTQsIDE0LCA4LCAwLCA2LCAtNCwgNCwgLTYsIDIsIC03LCAxLCAtN11dLFxuICAgIFwielwiOiBbMTcsIFsxNCwgMTQsIDMsIDAsIC0xLCAtMSwgMywgMTQsIDE0LCAxNCwgLTEsIC0xLCAzLCAwLCAxNCwgMF1dLFxuICAgIFwie1wiOiBbMTQsIFs5LCAyNSwgNywgMjQsIDYsIDIzLCA1LCAyMSwgNSwgMTksIDYsIDE3LCA3LCAxNiwgOCwgMTQsIDgsIDEyLCA2LCAxMCwgLTEsIC0xLCA3LCAyNCwgNiwgMjIsIDYsIDIwLCA3LCAxOCwgOCwgMTcsIDksIDE1LCA5LCAxMywgOCwgMTEsIDQsIDksIDgsIDcsIDksIDUsIDksIDMsIDgsIDEsIDcsIDAsIDYsIC0yLCA2LCAtNCwgNywgLTYsIC0xLCAtMSwgNiwgOCwgOCwgNiwgOCwgNCwgNywgMiwgNiwgMSwgNSwgLTEsIDUsIC0zLCA2LCAtNSwgNywgLTYsIDksIC03XV0sXG4gICAgXCJ8XCI6IFs4LCBbNCwgMjUsIDQsIC03XV0sXG4gICAgXCJ9XCI6IFsxNCwgWzUsIDI1LCA3LCAyNCwgOCwgMjMsIDksIDIxLCA5LCAxOSwgOCwgMTcsIDcsIDE2LCA2LCAxNCwgNiwgMTIsIDgsIDEwLCAtMSwgLTEsIDcsIDI0LCA4LCAyMiwgOCwgMjAsIDcsIDE4LCA2LCAxNywgNSwgMTUsIDUsIDEzLCA2LCAxMSwgMTAsIDksIDYsIDcsIDUsIDUsIDUsIDMsIDYsIDEsIDcsIDAsIDgsIC0yLCA4LCAtNCwgNywgLTYsIC0xLCAtMSwgOCwgOCwgNiwgNiwgNiwgNCwgNywgMiwgOCwgMSwgOSwgLTEsIDksIC0zLCA4LCAtNSwgNywgLTYsIDUsIC03XV0sXG4gICAgXCJ+XCI6IFsyNCwgWzMsIDYsIDMsIDgsIDQsIDExLCA2LCAxMiwgOCwgMTIsIDEwLCAxMSwgMTQsIDgsIDE2LCA3LCAxOCwgNywgMjAsIDgsIDIxLCAxMCwgLTEsIC0xLCAzLCA4LCA0LCAxMCwgNiwgMTEsIDgsIDExLCAxMCwgMTAsIDE0LCA3LCAxNiwgNiwgMTgsIDYsIDIwLCA3LCAyMSwgMTAsIDIxLCAxMl1dXG59O1xuXG5mdW5jdGlvbiBjcmVhdGVUZXh0VmVydGljZXModGV4dCwgbGVmdCwgYmFzZWxpbmUsIHNjYWxlKSB7XG4gICAgc2NhbGUgPSBzY2FsZSB8fCAxO1xuXG4gICAgY29uc3Qgc3Ryb2tlcyA9IFtdO1xuICAgIGxldCBpLCBsZW4sIGosIGxlbjIsIGdseXBoLCB4LCB5LCBwcmV2O1xuXG4gICAgZm9yIChpID0gMCwgbGVuID0gdGV4dC5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBnbHlwaCA9IHNpbXBsZXhGb250W3RleHRbaV1dO1xuICAgICAgICBpZiAoIWdseXBoKSBjb250aW51ZTtcbiAgICAgICAgcHJldiA9IG51bGw7XG5cbiAgICAgICAgZm9yIChqID0gMCwgbGVuMiA9IGdseXBoWzFdLmxlbmd0aDsgaiA8IGxlbjI7IGogKz0gMikge1xuICAgICAgICAgICAgaWYgKGdseXBoWzFdW2pdID09PSAtMSAmJiBnbHlwaFsxXVtqICsgMV0gPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgcHJldiA9IG51bGw7XG5cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgeCA9IGxlZnQgKyBnbHlwaFsxXVtqXSAqIHNjYWxlO1xuICAgICAgICAgICAgICAgIHkgPSBiYXNlbGluZSAtIGdseXBoWzFdW2ogKyAxXSAqIHNjYWxlO1xuICAgICAgICAgICAgICAgIGlmIChwcmV2KSB7XG4gICAgICAgICAgICAgICAgICAgIHN0cm9rZXMucHVzaChwcmV2LngsIHByZXYueSwgeCwgeSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHByZXYgPSB7eCwgeX07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGVmdCArPSBnbHlwaFswXSAqIHNjYWxlO1xuICAgIH1cblxuICAgIHJldHVybiBzdHJva2VzO1xufVxuIiwiLy8gQGZsb3dcblxuZXhwb3J0IGRlZmF1bHQgZHJhd0N1c3RvbTtcblxuaW1wb3J0IERlcHRoTW9kZSBmcm9tICcuLi9nbC9kZXB0aF9tb2RlJztcbmltcG9ydCBTdGVuY2lsTW9kZSBmcm9tICcuLi9nbC9zdGVuY2lsX21vZGUnO1xuXG5pbXBvcnQgdHlwZSBQYWludGVyIGZyb20gJy4vcGFpbnRlcic7XG5pbXBvcnQgdHlwZSBTb3VyY2VDYWNoZSBmcm9tICcuLi9zb3VyY2Uvc291cmNlX2NhY2hlJztcbmltcG9ydCB0eXBlIEN1c3RvbVN0eWxlTGF5ZXIgZnJvbSAnLi4vc3R5bGUvc3R5bGVfbGF5ZXIvY3VzdG9tX3N0eWxlX2xheWVyJztcblxuZnVuY3Rpb24gZHJhd0N1c3RvbShwYWludGVyOiBQYWludGVyLCBzb3VyY2VDYWNoZTogU291cmNlQ2FjaGUsIGxheWVyOiBDdXN0b21TdHlsZUxheWVyKSB7XG5cbiAgICBjb25zdCBjb250ZXh0ID0gcGFpbnRlci5jb250ZXh0O1xuICAgIGNvbnN0IGltcGxlbWVudGF0aW9uID0gbGF5ZXIuaW1wbGVtZW50YXRpb247XG5cbiAgICBpZiAocGFpbnRlci5yZW5kZXJQYXNzID09PSAnb2Zmc2NyZWVuJykge1xuXG4gICAgICAgIGNvbnN0IHByZXJlbmRlciA9IGltcGxlbWVudGF0aW9uLnByZXJlbmRlcjtcbiAgICAgICAgaWYgKHByZXJlbmRlcikge1xuICAgICAgICAgICAgcGFpbnRlci5zZXRDdXN0b21MYXllckRlZmF1bHRzKCk7XG4gICAgICAgICAgICBjb250ZXh0LnNldENvbG9yTW9kZShwYWludGVyLmNvbG9yTW9kZUZvclJlbmRlclBhc3MoKSk7XG5cbiAgICAgICAgICAgIHByZXJlbmRlci5jYWxsKGltcGxlbWVudGF0aW9uLCBjb250ZXh0LmdsLCBwYWludGVyLnRyYW5zZm9ybS5jdXN0b21MYXllck1hdHJpeCgpKTtcblxuICAgICAgICAgICAgY29udGV4dC5zZXREaXJ0eSgpO1xuICAgICAgICAgICAgcGFpbnRlci5zZXRCYXNlU3RhdGUoKTtcbiAgICAgICAgfVxuXG4gICAgfSBlbHNlIGlmIChwYWludGVyLnJlbmRlclBhc3MgPT09ICd0cmFuc2x1Y2VudCcpIHtcblxuICAgICAgICBwYWludGVyLnNldEN1c3RvbUxheWVyRGVmYXVsdHMoKTtcblxuICAgICAgICBjb250ZXh0LnNldENvbG9yTW9kZShwYWludGVyLmNvbG9yTW9kZUZvclJlbmRlclBhc3MoKSk7XG4gICAgICAgIGNvbnRleHQuc2V0U3RlbmNpbE1vZGUoU3RlbmNpbE1vZGUuZGlzYWJsZWQpO1xuXG4gICAgICAgIGNvbnN0IGRlcHRoTW9kZSA9IGltcGxlbWVudGF0aW9uLnJlbmRlcmluZ01vZGUgPT09ICczZCcgP1xuICAgICAgICAgICAgbmV3IERlcHRoTW9kZShwYWludGVyLmNvbnRleHQuZ2wuTEVRVUFMLCBEZXB0aE1vZGUuUmVhZFdyaXRlLCBwYWludGVyLmRlcHRoUmFuZ2VGb3IzRCkgOlxuICAgICAgICAgICAgcGFpbnRlci5kZXB0aE1vZGVGb3JTdWJsYXllcigwLCBEZXB0aE1vZGUuUmVhZE9ubHkpO1xuXG4gICAgICAgIGNvbnRleHQuc2V0RGVwdGhNb2RlKGRlcHRoTW9kZSk7XG5cbiAgICAgICAgaW1wbGVtZW50YXRpb24ucmVuZGVyKGNvbnRleHQuZ2wsIHBhaW50ZXIudHJhbnNmb3JtLmN1c3RvbUxheWVyTWF0cml4KCkpO1xuXG4gICAgICAgIGNvbnRleHQuc2V0RGlydHkoKTtcbiAgICAgICAgcGFpbnRlci5zZXRCYXNlU3RhdGUoKTtcbiAgICAgICAgY29udGV4dC5iaW5kRnJhbWVidWZmZXIuc2V0KG51bGwpO1xuICAgIH1cbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCBicm93c2VyIGZyb20gJy4uL3V0aWwvYnJvd3Nlcic7XG5cbmltcG9ydCB7IG1hdDQgfSBmcm9tICdnbC1tYXRyaXgnO1xuaW1wb3J0IFNvdXJjZUNhY2hlIGZyb20gJy4uL3NvdXJjZS9zb3VyY2VfY2FjaGUnO1xuaW1wb3J0IEVYVEVOVCBmcm9tICcuLi9kYXRhL2V4dGVudCc7XG5pbXBvcnQgcGl4ZWxzVG9UaWxlVW5pdHMgZnJvbSAnLi4vc291cmNlL3BpeGVsc190b190aWxlX3VuaXRzJztcbmltcG9ydCBTZWdtZW50VmVjdG9yIGZyb20gJy4uL2RhdGEvc2VnbWVudCc7XG5pbXBvcnQgeyBSYXN0ZXJCb3VuZHNBcnJheSwgUG9zQXJyYXksIFRyaWFuZ2xlSW5kZXhBcnJheSwgTGluZVN0cmlwSW5kZXhBcnJheSB9IGZyb20gJy4uL2RhdGEvYXJyYXlfdHlwZXMnO1xuaW1wb3J0IHJhc3RlckJvdW5kc0F0dHJpYnV0ZXMgZnJvbSAnLi4vZGF0YS9yYXN0ZXJfYm91bmRzX2F0dHJpYnV0ZXMnO1xuaW1wb3J0IHBvc0F0dHJpYnV0ZXMgZnJvbSAnLi4vZGF0YS9wb3NfYXR0cmlidXRlcyc7XG5pbXBvcnQgUHJvZ3JhbUNvbmZpZ3VyYXRpb24gZnJvbSAnLi4vZGF0YS9wcm9ncmFtX2NvbmZpZ3VyYXRpb24nO1xuaW1wb3J0IENyb3NzVGlsZVN5bWJvbEluZGV4IGZyb20gJy4uL3N5bWJvbC9jcm9zc190aWxlX3N5bWJvbF9pbmRleCc7XG5pbXBvcnQgKiBhcyBzaGFkZXJzIGZyb20gJy4uL3NoYWRlcnMnO1xuaW1wb3J0IFByb2dyYW0gZnJvbSAnLi9wcm9ncmFtJztcbmltcG9ydCB7IHByb2dyYW1Vbmlmb3JtcyB9IGZyb20gJy4vcHJvZ3JhbS9wcm9ncmFtX3VuaWZvcm1zJztcbmltcG9ydCBDb250ZXh0IGZyb20gJy4uL2dsL2NvbnRleHQnO1xuaW1wb3J0IERlcHRoTW9kZSBmcm9tICcuLi9nbC9kZXB0aF9tb2RlJztcbmltcG9ydCBTdGVuY2lsTW9kZSBmcm9tICcuLi9nbC9zdGVuY2lsX21vZGUnO1xuaW1wb3J0IENvbG9yTW9kZSBmcm9tICcuLi9nbC9jb2xvcl9tb2RlJztcbmltcG9ydCBDdWxsRmFjZU1vZGUgZnJvbSAnLi4vZ2wvY3VsbF9mYWNlX21vZGUnO1xuaW1wb3J0IFRleHR1cmUgZnJvbSAnLi90ZXh0dXJlJztcbmltcG9ydCB1cGRhdGVUaWxlTWFza3MgZnJvbSAnLi90aWxlX21hc2snO1xuaW1wb3J0IHsgY2xpcHBpbmdNYXNrVW5pZm9ybVZhbHVlcyB9IGZyb20gJy4vcHJvZ3JhbS9jbGlwcGluZ19tYXNrX3Byb2dyYW0nO1xuaW1wb3J0IENvbG9yIGZyb20gJy4uL3N0eWxlLXNwZWMvdXRpbC9jb2xvcic7XG5pbXBvcnQgc3ltYm9sIGZyb20gJy4vZHJhd19zeW1ib2wnO1xuaW1wb3J0IGNpcmNsZSBmcm9tICcuL2RyYXdfY2lyY2xlJztcbmltcG9ydCBoZWF0bWFwIGZyb20gJy4vZHJhd19oZWF0bWFwJztcbmltcG9ydCBsaW5lIGZyb20gJy4vZHJhd19saW5lJztcbmltcG9ydCBmaWxsIGZyb20gJy4vZHJhd19maWxsJztcbmltcG9ydCBmaWxsRXh0cnVzaW9uIGZyb20gJy4vZHJhd19maWxsX2V4dHJ1c2lvbic7XG5pbXBvcnQgaGlsbHNoYWRlIGZyb20gJy4vZHJhd19oaWxsc2hhZGUnO1xuaW1wb3J0IHJhc3RlciBmcm9tICcuL2RyYXdfcmFzdGVyJztcbmltcG9ydCBiYWNrZ3JvdW5kIGZyb20gJy4vZHJhd19iYWNrZ3JvdW5kJztcbmltcG9ydCBkZWJ1ZyBmcm9tICcuL2RyYXdfZGVidWcnO1xuaW1wb3J0IGN1c3RvbSBmcm9tICcuL2RyYXdfY3VzdG9tJztcblxuY29uc3QgZHJhdyA9IHtcbiAgICBzeW1ib2wsXG4gICAgY2lyY2xlLFxuICAgIGhlYXRtYXAsXG4gICAgbGluZSxcbiAgICBmaWxsLFxuICAgICdmaWxsLWV4dHJ1c2lvbic6IGZpbGxFeHRydXNpb24sXG4gICAgaGlsbHNoYWRlLFxuICAgIHJhc3RlcixcbiAgICBiYWNrZ3JvdW5kLFxuICAgIGRlYnVnLFxuICAgIGN1c3RvbVxufTtcblxuaW1wb3J0IHR5cGUgVHJhbnNmb3JtIGZyb20gJy4uL2dlby90cmFuc2Zvcm0nO1xuaW1wb3J0IHR5cGUgVGlsZSBmcm9tICcuLi9zb3VyY2UvdGlsZSc7XG5pbXBvcnQgdHlwZSB7T3ZlcnNjYWxlZFRpbGVJRH0gZnJvbSAnLi4vc291cmNlL3RpbGVfaWQnO1xuaW1wb3J0IHR5cGUgU3R5bGUgZnJvbSAnLi4vc3R5bGUvc3R5bGUnO1xuaW1wb3J0IHR5cGUgU3R5bGVMYXllciBmcm9tICcuLi9zdHlsZS9zdHlsZV9sYXllcic7XG5pbXBvcnQgdHlwZSB7Q3Jvc3NGYWRlZH0gZnJvbSAnLi4vc3R5bGUvcHJvcGVydGllcyc7XG5pbXBvcnQgdHlwZSBMaW5lQXRsYXMgZnJvbSAnLi9saW5lX2F0bGFzJztcbmltcG9ydCB0eXBlIEltYWdlTWFuYWdlciBmcm9tICcuL2ltYWdlX21hbmFnZXInO1xuaW1wb3J0IHR5cGUgR2x5cGhNYW5hZ2VyIGZyb20gJy4vZ2x5cGhfbWFuYWdlcic7XG5pbXBvcnQgdHlwZSBWZXJ0ZXhCdWZmZXIgZnJvbSAnLi4vZ2wvdmVydGV4X2J1ZmZlcic7XG5pbXBvcnQgdHlwZSBJbmRleEJ1ZmZlciBmcm9tICcuLi9nbC9pbmRleF9idWZmZXInO1xuaW1wb3J0IHR5cGUge0RlcHRoUmFuZ2VUeXBlLCBEZXB0aE1hc2tUeXBlLCBEZXB0aEZ1bmNUeXBlfSBmcm9tICcuLi9nbC90eXBlcyc7XG5cbmV4cG9ydCB0eXBlIFJlbmRlclBhc3MgPSAnb2Zmc2NyZWVuJyB8ICdvcGFxdWUnIHwgJ3RyYW5zbHVjZW50JztcblxudHlwZSBQYWludGVyT3B0aW9ucyA9IHtcbiAgICBzaG93T3ZlcmRyYXdJbnNwZWN0b3I6IGJvb2xlYW4sXG4gICAgc2hvd1RpbGVCb3VuZGFyaWVzOiBib29sZWFuLFxuICAgIHJvdGF0aW5nOiBib29sZWFuLFxuICAgIHpvb21pbmc6IGJvb2xlYW4sXG4gICAgbW92aW5nOiBib29sZWFuLFxuICAgIGZhZGVEdXJhdGlvbjogbnVtYmVyXG59XG5cbi8qKlxuICogSW5pdGlhbGl6ZSBhIG5ldyBwYWludGVyIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0ge0NhbnZhc30gZ2wgYW4gZXhwZXJpbWVudGFsLXdlYmdsIGRyYXdpbmcgY29udGV4dFxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgUGFpbnRlciB7XG4gICAgY29udGV4dDogQ29udGV4dDtcbiAgICB0cmFuc2Zvcm06IFRyYW5zZm9ybTtcbiAgICBfdGlsZVRleHR1cmVzOiB7IFtudW1iZXJdOiBBcnJheTxUZXh0dXJlPiB9O1xuICAgIG51bVN1YmxheWVyczogbnVtYmVyO1xuICAgIGRlcHRoRXBzaWxvbjogbnVtYmVyO1xuICAgIGVtcHR5UHJvZ3JhbUNvbmZpZ3VyYXRpb246IFByb2dyYW1Db25maWd1cmF0aW9uO1xuICAgIHdpZHRoOiBudW1iZXI7XG4gICAgaGVpZ2h0OiBudW1iZXI7XG4gICAgZGVwdGhSYm86IFdlYkdMUmVuZGVyYnVmZmVyO1xuICAgIGRlcHRoUmJvTmVlZHNDbGVhcjogYm9vbGVhbjtcbiAgICB0aWxlRXh0ZW50QnVmZmVyOiBWZXJ0ZXhCdWZmZXI7XG4gICAgdGlsZUV4dGVudFNlZ21lbnRzOiBTZWdtZW50VmVjdG9yO1xuICAgIGRlYnVnQnVmZmVyOiBWZXJ0ZXhCdWZmZXI7XG4gICAgZGVidWdTZWdtZW50czogU2VnbWVudFZlY3RvcjtcbiAgICByYXN0ZXJCb3VuZHNCdWZmZXI6IFZlcnRleEJ1ZmZlcjtcbiAgICByYXN0ZXJCb3VuZHNTZWdtZW50czogU2VnbWVudFZlY3RvcjtcbiAgICB2aWV3cG9ydEJ1ZmZlcjogVmVydGV4QnVmZmVyO1xuICAgIHZpZXdwb3J0U2VnbWVudHM6IFNlZ21lbnRWZWN0b3I7XG4gICAgcXVhZFRyaWFuZ2xlSW5kZXhCdWZmZXI6IEluZGV4QnVmZmVyO1xuICAgIHRpbGVCb3JkZXJJbmRleEJ1ZmZlcjogSW5kZXhCdWZmZXI7XG4gICAgX3RpbGVDbGlwcGluZ01hc2tJRHM6IHsgW251bWJlcl06IG51bWJlciB9O1xuICAgIHN0ZW5jaWxDbGVhck1vZGU6IFN0ZW5jaWxNb2RlO1xuICAgIHN0eWxlOiBTdHlsZTtcbiAgICBvcHRpb25zOiBQYWludGVyT3B0aW9ucztcbiAgICBsaW5lQXRsYXM6IExpbmVBdGxhcztcbiAgICBpbWFnZU1hbmFnZXI6IEltYWdlTWFuYWdlcjtcbiAgICBnbHlwaE1hbmFnZXI6IEdseXBoTWFuYWdlcjtcbiAgICBkZXB0aFJhbmdlRm9yM0Q6IERlcHRoUmFuZ2VUeXBlO1xuICAgIG9wYXF1ZVBhc3NDdXRvZmY6IG51bWJlcjtcbiAgICByZW5kZXJQYXNzOiBSZW5kZXJQYXNzO1xuICAgIGN1cnJlbnRMYXllcjogbnVtYmVyO1xuICAgIGN1cnJlbnRTdGVuY2lsU291cmNlOiA/c3RyaW5nO1xuICAgIG5leHRTdGVuY2lsSUQ6IG51bWJlcjtcbiAgICBpZDogc3RyaW5nO1xuICAgIF9zaG93T3ZlcmRyYXdJbnNwZWN0b3I6IGJvb2xlYW47XG4gICAgY2FjaGU6IHsgW3N0cmluZ106IFByb2dyYW08Kj4gfTtcbiAgICBjcm9zc1RpbGVTeW1ib2xJbmRleDogQ3Jvc3NUaWxlU3ltYm9sSW5kZXg7XG4gICAgc3ltYm9sRmFkZUNoYW5nZTogbnVtYmVyO1xuXG4gICAgY29uc3RydWN0b3IoZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCwgdHJhbnNmb3JtOiBUcmFuc2Zvcm0pIHtcbiAgICAgICAgdGhpcy5jb250ZXh0ID0gbmV3IENvbnRleHQoZ2wpO1xuICAgICAgICB0aGlzLnRyYW5zZm9ybSA9IHRyYW5zZm9ybTtcbiAgICAgICAgdGhpcy5fdGlsZVRleHR1cmVzID0ge307XG5cbiAgICAgICAgdGhpcy5zZXR1cCgpO1xuXG4gICAgICAgIC8vIFdpdGhpbiBlYWNoIGxheWVyIHRoZXJlIGFyZSBtdWx0aXBsZSBkaXN0aW5jdCB6LXBsYW5lcyB0aGF0IGNhbiBiZSBkcmF3biB0by5cbiAgICAgICAgLy8gVGhpcyBpcyBpbXBsZW1lbnRlZCB1c2luZyB0aGUgV2ViR0wgZGVwdGggYnVmZmVyLlxuICAgICAgICB0aGlzLm51bVN1YmxheWVycyA9IFNvdXJjZUNhY2hlLm1heFVuZGVyem9vbWluZyArIFNvdXJjZUNhY2hlLm1heE92ZXJ6b29taW5nICsgMTtcbiAgICAgICAgdGhpcy5kZXB0aEVwc2lsb24gPSAxIC8gTWF0aC5wb3coMiwgMTYpO1xuXG4gICAgICAgIHRoaXMuZGVwdGhSYm9OZWVkc0NsZWFyID0gdHJ1ZTtcblxuICAgICAgICB0aGlzLmVtcHR5UHJvZ3JhbUNvbmZpZ3VyYXRpb24gPSBuZXcgUHJvZ3JhbUNvbmZpZ3VyYXRpb24oKTtcblxuICAgICAgICB0aGlzLmNyb3NzVGlsZVN5bWJvbEluZGV4ID0gbmV3IENyb3NzVGlsZVN5bWJvbEluZGV4KCk7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBVcGRhdGUgdGhlIEdMIHZpZXdwb3J0LCBwcm9qZWN0aW9uIG1hdHJpeCwgYW5kIHRyYW5zZm9ybXMgdG8gY29tcGVuc2F0ZVxuICAgICAqIGZvciBhIG5ldyB3aWR0aCBhbmQgaGVpZ2h0IHZhbHVlLlxuICAgICAqL1xuICAgIHJlc2l6ZSh3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcikge1xuICAgICAgICBjb25zdCBnbCA9IHRoaXMuY29udGV4dC5nbDtcblxuICAgICAgICB0aGlzLndpZHRoID0gd2lkdGggKiBicm93c2VyLmRldmljZVBpeGVsUmF0aW87XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0ICogYnJvd3Nlci5kZXZpY2VQaXhlbFJhdGlvO1xuICAgICAgICB0aGlzLmNvbnRleHQudmlld3BvcnQuc2V0KFswLCAwLCB0aGlzLndpZHRoLCB0aGlzLmhlaWdodF0pO1xuXG4gICAgICAgIGlmICh0aGlzLnN0eWxlKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGxheWVySWQgb2YgdGhpcy5zdHlsZS5fb3JkZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0eWxlLl9sYXllcnNbbGF5ZXJJZF0ucmVzaXplKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5kZXB0aFJibykge1xuICAgICAgICAgICAgZ2wuZGVsZXRlUmVuZGVyYnVmZmVyKHRoaXMuZGVwdGhSYm8pO1xuICAgICAgICAgICAgdGhpcy5kZXB0aFJibyA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXR1cCgpIHtcbiAgICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMuY29udGV4dDtcblxuICAgICAgICBjb25zdCB0aWxlRXh0ZW50QXJyYXkgPSBuZXcgUG9zQXJyYXkoKTtcbiAgICAgICAgdGlsZUV4dGVudEFycmF5LmVtcGxhY2VCYWNrKDAsIDApO1xuICAgICAgICB0aWxlRXh0ZW50QXJyYXkuZW1wbGFjZUJhY2soRVhURU5ULCAwKTtcbiAgICAgICAgdGlsZUV4dGVudEFycmF5LmVtcGxhY2VCYWNrKDAsIEVYVEVOVCk7XG4gICAgICAgIHRpbGVFeHRlbnRBcnJheS5lbXBsYWNlQmFjayhFWFRFTlQsIEVYVEVOVCk7XG4gICAgICAgIHRoaXMudGlsZUV4dGVudEJ1ZmZlciA9IGNvbnRleHQuY3JlYXRlVmVydGV4QnVmZmVyKHRpbGVFeHRlbnRBcnJheSwgcG9zQXR0cmlidXRlcy5tZW1iZXJzKTtcbiAgICAgICAgdGhpcy50aWxlRXh0ZW50U2VnbWVudHMgPSBTZWdtZW50VmVjdG9yLnNpbXBsZVNlZ21lbnQoMCwgMCwgNCwgMik7XG5cbiAgICAgICAgY29uc3QgZGVidWdBcnJheSA9IG5ldyBQb3NBcnJheSgpO1xuICAgICAgICBkZWJ1Z0FycmF5LmVtcGxhY2VCYWNrKDAsIDApO1xuICAgICAgICBkZWJ1Z0FycmF5LmVtcGxhY2VCYWNrKEVYVEVOVCwgMCk7XG4gICAgICAgIGRlYnVnQXJyYXkuZW1wbGFjZUJhY2soMCwgRVhURU5UKTtcbiAgICAgICAgZGVidWdBcnJheS5lbXBsYWNlQmFjayhFWFRFTlQsIEVYVEVOVCk7XG4gICAgICAgIHRoaXMuZGVidWdCdWZmZXIgPSBjb250ZXh0LmNyZWF0ZVZlcnRleEJ1ZmZlcihkZWJ1Z0FycmF5LCBwb3NBdHRyaWJ1dGVzLm1lbWJlcnMpO1xuICAgICAgICB0aGlzLmRlYnVnU2VnbWVudHMgPSBTZWdtZW50VmVjdG9yLnNpbXBsZVNlZ21lbnQoMCwgMCwgNCwgNSk7XG5cbiAgICAgICAgY29uc3QgcmFzdGVyQm91bmRzQXJyYXkgPSBuZXcgUmFzdGVyQm91bmRzQXJyYXkoKTtcbiAgICAgICAgcmFzdGVyQm91bmRzQXJyYXkuZW1wbGFjZUJhY2soMCwgMCwgMCwgMCk7XG4gICAgICAgIHJhc3RlckJvdW5kc0FycmF5LmVtcGxhY2VCYWNrKEVYVEVOVCwgMCwgRVhURU5ULCAwKTtcbiAgICAgICAgcmFzdGVyQm91bmRzQXJyYXkuZW1wbGFjZUJhY2soMCwgRVhURU5ULCAwLCBFWFRFTlQpO1xuICAgICAgICByYXN0ZXJCb3VuZHNBcnJheS5lbXBsYWNlQmFjayhFWFRFTlQsIEVYVEVOVCwgRVhURU5ULCBFWFRFTlQpO1xuICAgICAgICB0aGlzLnJhc3RlckJvdW5kc0J1ZmZlciA9IGNvbnRleHQuY3JlYXRlVmVydGV4QnVmZmVyKHJhc3RlckJvdW5kc0FycmF5LCByYXN0ZXJCb3VuZHNBdHRyaWJ1dGVzLm1lbWJlcnMpO1xuICAgICAgICB0aGlzLnJhc3RlckJvdW5kc1NlZ21lbnRzID0gU2VnbWVudFZlY3Rvci5zaW1wbGVTZWdtZW50KDAsIDAsIDQsIDIpO1xuXG4gICAgICAgIGNvbnN0IHZpZXdwb3J0QXJyYXkgPSBuZXcgUG9zQXJyYXkoKTtcbiAgICAgICAgdmlld3BvcnRBcnJheS5lbXBsYWNlQmFjaygwLCAwKTtcbiAgICAgICAgdmlld3BvcnRBcnJheS5lbXBsYWNlQmFjaygxLCAwKTtcbiAgICAgICAgdmlld3BvcnRBcnJheS5lbXBsYWNlQmFjaygwLCAxKTtcbiAgICAgICAgdmlld3BvcnRBcnJheS5lbXBsYWNlQmFjaygxLCAxKTtcbiAgICAgICAgdGhpcy52aWV3cG9ydEJ1ZmZlciA9IGNvbnRleHQuY3JlYXRlVmVydGV4QnVmZmVyKHZpZXdwb3J0QXJyYXksIHBvc0F0dHJpYnV0ZXMubWVtYmVycyk7XG4gICAgICAgIHRoaXMudmlld3BvcnRTZWdtZW50cyA9IFNlZ21lbnRWZWN0b3Iuc2ltcGxlU2VnbWVudCgwLCAwLCA0LCAyKTtcblxuICAgICAgICBjb25zdCB0aWxlTGluZVN0cmlwSW5kaWNlcyA9IG5ldyBMaW5lU3RyaXBJbmRleEFycmF5KCk7XG4gICAgICAgIHRpbGVMaW5lU3RyaXBJbmRpY2VzLmVtcGxhY2VCYWNrKDApO1xuICAgICAgICB0aWxlTGluZVN0cmlwSW5kaWNlcy5lbXBsYWNlQmFjaygxKTtcbiAgICAgICAgdGlsZUxpbmVTdHJpcEluZGljZXMuZW1wbGFjZUJhY2soMyk7XG4gICAgICAgIHRpbGVMaW5lU3RyaXBJbmRpY2VzLmVtcGxhY2VCYWNrKDIpO1xuICAgICAgICB0aWxlTGluZVN0cmlwSW5kaWNlcy5lbXBsYWNlQmFjaygwKTtcbiAgICAgICAgdGhpcy50aWxlQm9yZGVySW5kZXhCdWZmZXIgPSBjb250ZXh0LmNyZWF0ZUluZGV4QnVmZmVyKHRpbGVMaW5lU3RyaXBJbmRpY2VzKTtcblxuICAgICAgICBjb25zdCBxdWFkVHJpYW5nbGVJbmRpY2VzID0gbmV3IFRyaWFuZ2xlSW5kZXhBcnJheSgpO1xuICAgICAgICBxdWFkVHJpYW5nbGVJbmRpY2VzLmVtcGxhY2VCYWNrKDAsIDEsIDIpO1xuICAgICAgICBxdWFkVHJpYW5nbGVJbmRpY2VzLmVtcGxhY2VCYWNrKDIsIDEsIDMpO1xuICAgICAgICB0aGlzLnF1YWRUcmlhbmdsZUluZGV4QnVmZmVyID0gY29udGV4dC5jcmVhdGVJbmRleEJ1ZmZlcihxdWFkVHJpYW5nbGVJbmRpY2VzKTtcblxuICAgICAgICBjb25zdCBnbCA9IHRoaXMuY29udGV4dC5nbDtcbiAgICAgICAgdGhpcy5zdGVuY2lsQ2xlYXJNb2RlID0gbmV3IFN0ZW5jaWxNb2RlKHsgZnVuYzogZ2wuQUxXQVlTLCBtYXNrOiAwIH0sIDB4MCwgMHhGRiwgZ2wuWkVSTywgZ2wuWkVSTywgZ2wuWkVSTyk7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBSZXNldCB0aGUgZHJhd2luZyBjYW52YXMgYnkgY2xlYXJpbmcgdGhlIHN0ZW5jaWwgYnVmZmVyIHNvIHRoYXQgd2UgY2FuIGRyYXdcbiAgICAgKiBuZXcgdGlsZXMgYXQgdGhlIHNhbWUgbG9jYXRpb24sIHdoaWxlIHJldGFpbmluZyBwcmV2aW91c2x5IGRyYXduIHBpeGVscy5cbiAgICAgKi9cbiAgICBjbGVhclN0ZW5jaWwoKSB7XG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmNvbnRleHQ7XG4gICAgICAgIGNvbnN0IGdsID0gY29udGV4dC5nbDtcblxuICAgICAgICB0aGlzLm5leHRTdGVuY2lsSUQgPSAxO1xuICAgICAgICB0aGlzLmN1cnJlbnRTdGVuY2lsU291cmNlID0gdW5kZWZpbmVkO1xuXG4gICAgICAgIC8vIEFzIGEgdGVtcG9yYXJ5IHdvcmthcm91bmQgZm9yIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvbWFwYm94LWdsLWpzL2lzc3Vlcy81NDkwLFxuICAgICAgICAvLyBwZW5kaW5nIGFuIHVwc3RyZWFtIGZpeCwgd2UgZHJhdyBhIGZ1bGxzY3JlZW4gc3RlbmNpbD0wIGNsaXBwaW5nIG1hc2sgaGVyZSxcbiAgICAgICAgLy8gZWZmZWN0aXZlbHkgY2xlYXJpbmcgdGhlIHN0ZW5jaWwgYnVmZmVyOiBvbmNlIGFuIHVwc3RyZWFtIHBhdGNoIGxhbmRzLCByZW1vdmVcbiAgICAgICAgLy8gdGhpcyBmdW5jdGlvbiBpbiBmYXZvciBvZiBjb250ZXh0LmNsZWFyKHsgc3RlbmNpbDogMHgwIH0pXG5cbiAgICAgICAgY29uc3QgbWF0cml4ID0gbWF0NC5jcmVhdGUoKTtcbiAgICAgICAgbWF0NC5vcnRobyhtYXRyaXgsIDAsIHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0LCAwLCAwLCAxKTtcbiAgICAgICAgbWF0NC5zY2FsZShtYXRyaXgsIG1hdHJpeCwgW2dsLmRyYXdpbmdCdWZmZXJXaWR0aCwgZ2wuZHJhd2luZ0J1ZmZlckhlaWdodCwgMF0pO1xuXG4gICAgICAgIHRoaXMudXNlUHJvZ3JhbSgnY2xpcHBpbmdNYXNrJykuZHJhdyhjb250ZXh0LCBnbC5UUklBTkdMRVMsXG4gICAgICAgICAgICBEZXB0aE1vZGUuZGlzYWJsZWQsIHRoaXMuc3RlbmNpbENsZWFyTW9kZSwgQ29sb3JNb2RlLmRpc2FibGVkLCBDdWxsRmFjZU1vZGUuZGlzYWJsZWQsXG4gICAgICAgICAgICBjbGlwcGluZ01hc2tVbmlmb3JtVmFsdWVzKG1hdHJpeCksXG4gICAgICAgICAgICAnJGNsaXBwaW5nJywgdGhpcy52aWV3cG9ydEJ1ZmZlcixcbiAgICAgICAgICAgIHRoaXMucXVhZFRyaWFuZ2xlSW5kZXhCdWZmZXIsIHRoaXMudmlld3BvcnRTZWdtZW50cyk7XG4gICAgfVxuXG4gICAgX3JlbmRlclRpbGVDbGlwcGluZ01hc2tzKGxheWVyOiBTdHlsZUxheWVyLCB0aWxlSURzOiBBcnJheTxPdmVyc2NhbGVkVGlsZUlEPikge1xuICAgICAgICBpZiAodGhpcy5jdXJyZW50U3RlbmNpbFNvdXJjZSA9PT0gbGF5ZXIuc291cmNlIHx8ICFsYXllci5pc1RpbGVDbGlwcGVkKCkgfHwgIXRpbGVJRHMgfHwgIXRpbGVJRHMubGVuZ3RoKSByZXR1cm47XG5cbiAgICAgICAgdGhpcy5jdXJyZW50U3RlbmNpbFNvdXJjZSA9IGxheWVyLnNvdXJjZTtcblxuICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5jb250ZXh0O1xuICAgICAgICBjb25zdCBnbCA9IGNvbnRleHQuZ2w7XG5cbiAgICAgICAgaWYgKHRoaXMubmV4dFN0ZW5jaWxJRCArIHRpbGVJRHMubGVuZ3RoID4gMjU2KSB7XG4gICAgICAgICAgICAvLyB3ZSdsbCBydW4gb3V0IG9mIGZyZXNoIElEcyBzbyB3ZSBuZWVkIHRvIGNsZWFyIGFuZCBzdGFydCBmcm9tIHNjcmF0Y2hcbiAgICAgICAgICAgIHRoaXMuY2xlYXJTdGVuY2lsKCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb250ZXh0LnNldENvbG9yTW9kZShDb2xvck1vZGUuZGlzYWJsZWQpO1xuICAgICAgICBjb250ZXh0LnNldERlcHRoTW9kZShEZXB0aE1vZGUuZGlzYWJsZWQpO1xuXG4gICAgICAgIGNvbnN0IHByb2dyYW0gPSB0aGlzLnVzZVByb2dyYW0oJ2NsaXBwaW5nTWFzaycpO1xuXG4gICAgICAgIHRoaXMuX3RpbGVDbGlwcGluZ01hc2tJRHMgPSB7fTtcblxuICAgICAgICBmb3IgKGNvbnN0IHRpbGVJRCBvZiB0aWxlSURzKSB7XG4gICAgICAgICAgICBjb25zdCBpZCA9IHRoaXMuX3RpbGVDbGlwcGluZ01hc2tJRHNbdGlsZUlELmtleV0gPSB0aGlzLm5leHRTdGVuY2lsSUQrKztcblxuICAgICAgICAgICAgcHJvZ3JhbS5kcmF3KGNvbnRleHQsIGdsLlRSSUFOR0xFUywgRGVwdGhNb2RlLmRpc2FibGVkLFxuICAgICAgICAgICAgICAgIC8vIFRlc3RzIHdpbGwgYWx3YXlzIHBhc3MsIGFuZCByZWYgdmFsdWUgd2lsbCBiZSB3cml0dGVuIHRvIHN0ZW5jaWwgYnVmZmVyLlxuICAgICAgICAgICAgICAgIG5ldyBTdGVuY2lsTW9kZSh7IGZ1bmM6IGdsLkFMV0FZUywgbWFzazogMCB9LCBpZCwgMHhGRiwgZ2wuS0VFUCwgZ2wuS0VFUCwgZ2wuUkVQTEFDRSksXG4gICAgICAgICAgICAgICAgQ29sb3JNb2RlLmRpc2FibGVkLCBDdWxsRmFjZU1vZGUuZGlzYWJsZWQsIGNsaXBwaW5nTWFza1VuaWZvcm1WYWx1ZXModGlsZUlELnBvc01hdHJpeCksXG4gICAgICAgICAgICAgICAgJyRjbGlwcGluZycsIHRoaXMudGlsZUV4dGVudEJ1ZmZlcixcbiAgICAgICAgICAgICAgICB0aGlzLnF1YWRUcmlhbmdsZUluZGV4QnVmZmVyLCB0aGlzLnRpbGVFeHRlbnRTZWdtZW50cyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGVuY2lsTW9kZUZvcjNEKCk6IFN0ZW5jaWxNb2RlIHtcbiAgICAgICAgaWYgKHRoaXMubmV4dFN0ZW5jaWxJRCArIDEgPiAyNTYpIHtcbiAgICAgICAgICAgIHRoaXMuY2xlYXJTdGVuY2lsKCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpZCA9IHRoaXMubmV4dFN0ZW5jaWxJRCsrO1xuICAgICAgICBjb25zdCBnbCA9IHRoaXMuY29udGV4dC5nbDtcbiAgICAgICAgcmV0dXJuIG5ldyBTdGVuY2lsTW9kZSh7IGZ1bmM6IGdsLk5PVEVRVUFMLCBtYXNrOiAweEZGIH0sIGlkLCAweEZGLCBnbC5LRUVQLCBnbC5LRUVQLCBnbC5SRVBMQUNFKTtcbiAgICB9XG5cbiAgICBzdGVuY2lsTW9kZUZvckNsaXBwaW5nKHRpbGVJRDogT3ZlcnNjYWxlZFRpbGVJRCk6IFN0ZW5jaWxNb2RlIHtcbiAgICAgICAgY29uc3QgZ2wgPSB0aGlzLmNvbnRleHQuZ2w7XG4gICAgICAgIHJldHVybiBuZXcgU3RlbmNpbE1vZGUoeyBmdW5jOiBnbC5FUVVBTCwgbWFzazogMHhGRiB9LCB0aGlzLl90aWxlQ2xpcHBpbmdNYXNrSURzW3RpbGVJRC5rZXldLCAweDAwLCBnbC5LRUVQLCBnbC5LRUVQLCBnbC5SRVBMQUNFKTtcbiAgICB9XG5cbiAgICBjb2xvck1vZGVGb3JSZW5kZXJQYXNzKCk6ICRSZWFkT25seTxDb2xvck1vZGU+IHtcbiAgICAgICAgY29uc3QgZ2wgPSB0aGlzLmNvbnRleHQuZ2w7XG4gICAgICAgIGlmICh0aGlzLl9zaG93T3ZlcmRyYXdJbnNwZWN0b3IpIHtcbiAgICAgICAgICAgIGNvbnN0IG51bU92ZXJkcmF3U3RlcHMgPSA4O1xuICAgICAgICAgICAgY29uc3QgYSA9IDEgLyBudW1PdmVyZHJhd1N0ZXBzO1xuXG4gICAgICAgICAgICByZXR1cm4gbmV3IENvbG9yTW9kZShbZ2wuQ09OU1RBTlRfQ09MT1IsIGdsLk9ORV0sIG5ldyBDb2xvcihhLCBhLCBhLCAwKSwgW3RydWUsIHRydWUsIHRydWUsIHRydWVdKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnJlbmRlclBhc3MgPT09ICdvcGFxdWUnKSB7XG4gICAgICAgICAgICByZXR1cm4gQ29sb3JNb2RlLnVuYmxlbmRlZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBDb2xvck1vZGUuYWxwaGFCbGVuZGVkO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZGVwdGhNb2RlRm9yU3VibGF5ZXIobjogbnVtYmVyLCBtYXNrOiBEZXB0aE1hc2tUeXBlLCBmdW5jOiA/RGVwdGhGdW5jVHlwZSk6ICRSZWFkT25seTxEZXB0aE1vZGU+IHtcbiAgICAgICAgaWYgKCF0aGlzLm9wYXF1ZVBhc3NFbmFibGVkRm9yTGF5ZXIoKSkgcmV0dXJuIERlcHRoTW9kZS5kaXNhYmxlZDtcbiAgICAgICAgY29uc3QgZGVwdGggPSAxIC0gKCgxICsgdGhpcy5jdXJyZW50TGF5ZXIpICogdGhpcy5udW1TdWJsYXllcnMgKyBuKSAqIHRoaXMuZGVwdGhFcHNpbG9uO1xuICAgICAgICByZXR1cm4gbmV3IERlcHRoTW9kZShmdW5jIHx8IHRoaXMuY29udGV4dC5nbC5MRVFVQUwsIG1hc2ssIFtkZXB0aCwgZGVwdGhdKTtcbiAgICB9XG5cbiAgICAvKlxuICAgICAqIFRoZSBvcGFxdWUgcGFzcyBhbmQgM0QgbGF5ZXJzIGJvdGggdXNlIHRoZSBkZXB0aCBidWZmZXIuXG4gICAgICogTGF5ZXJzIGRyYXduIGFib3ZlIDNEIGxheWVycyBuZWVkIHRvIGJlIGRyYXduIHVzaW5nIHRoZVxuICAgICAqIHBhaW50ZXIncyBhbGdvcml0aG0gc28gdGhhdCB0aGV5IGFwcGVhciBhYm92ZSAzRCBmZWF0dXJlcy5cbiAgICAgKiBUaGlzIHJldHVybnMgdHJ1ZSBmb3IgbGF5ZXJzIHRoYXQgY2FuIGJlIGRyYXduIHVzaW5nIHRoZVxuICAgICAqIG9wYXF1ZSBwYXNzLlxuICAgICAqL1xuICAgIG9wYXF1ZVBhc3NFbmFibGVkRm9yTGF5ZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRMYXllciA8IHRoaXMub3BhcXVlUGFzc0N1dG9mZjtcbiAgICB9XG5cbiAgICByZW5kZXIoc3R5bGU6IFN0eWxlLCBvcHRpb25zOiBQYWludGVyT3B0aW9ucykge1xuICAgICAgICB0aGlzLnN0eWxlID0gc3R5bGU7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG5cbiAgICAgICAgdGhpcy5saW5lQXRsYXMgPSBzdHlsZS5saW5lQXRsYXM7XG4gICAgICAgIHRoaXMuaW1hZ2VNYW5hZ2VyID0gc3R5bGUuaW1hZ2VNYW5hZ2VyO1xuICAgICAgICB0aGlzLmdseXBoTWFuYWdlciA9IHN0eWxlLmdseXBoTWFuYWdlcjtcblxuICAgICAgICB0aGlzLnN5bWJvbEZhZGVDaGFuZ2UgPSBzdHlsZS5wbGFjZW1lbnQuc3ltYm9sRmFkZUNoYW5nZShicm93c2VyLm5vdygpKTtcblxuICAgICAgICB0aGlzLmltYWdlTWFuYWdlci5iZWdpbkZyYW1lKCk7XG5cbiAgICAgICAgY29uc3QgbGF5ZXJJZHMgPSB0aGlzLnN0eWxlLl9vcmRlcjtcbiAgICAgICAgY29uc3Qgc291cmNlQ2FjaGVzID0gdGhpcy5zdHlsZS5zb3VyY2VDYWNoZXM7XG5cbiAgICAgICAgZm9yIChjb25zdCBpZCBpbiBzb3VyY2VDYWNoZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZUNhY2hlID0gc291cmNlQ2FjaGVzW2lkXTtcbiAgICAgICAgICAgIGlmIChzb3VyY2VDYWNoZS51c2VkKSB7XG4gICAgICAgICAgICAgICAgc291cmNlQ2FjaGUucHJlcGFyZSh0aGlzLmNvbnRleHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29vcmRzQXNjZW5kaW5nOiB7W3N0cmluZ106IEFycmF5PE92ZXJzY2FsZWRUaWxlSUQ+fSA9IHt9O1xuICAgICAgICBjb25zdCBjb29yZHNEZXNjZW5kaW5nOiB7W3N0cmluZ106IEFycmF5PE92ZXJzY2FsZWRUaWxlSUQ+fSA9IHt9O1xuICAgICAgICBjb25zdCBjb29yZHNEZXNjZW5kaW5nU3ltYm9sOiB7W3N0cmluZ106IEFycmF5PE92ZXJzY2FsZWRUaWxlSUQ+fSA9IHt9O1xuXG4gICAgICAgIGZvciAoY29uc3QgaWQgaW4gc291cmNlQ2FjaGVzKSB7XG4gICAgICAgICAgICBjb25zdCBzb3VyY2VDYWNoZSA9IHNvdXJjZUNhY2hlc1tpZF07XG4gICAgICAgICAgICBjb29yZHNBc2NlbmRpbmdbaWRdID0gc291cmNlQ2FjaGUuZ2V0VmlzaWJsZUNvb3JkaW5hdGVzKCk7XG4gICAgICAgICAgICBjb29yZHNEZXNjZW5kaW5nW2lkXSA9IGNvb3Jkc0FzY2VuZGluZ1tpZF0uc2xpY2UoKS5yZXZlcnNlKCk7XG4gICAgICAgICAgICBjb29yZHNEZXNjZW5kaW5nU3ltYm9sW2lkXSA9IHNvdXJjZUNhY2hlLmdldFZpc2libGVDb29yZGluYXRlcyh0cnVlKS5yZXZlcnNlKCk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IGlkIGluIHNvdXJjZUNhY2hlcykge1xuICAgICAgICAgICAgY29uc3Qgc291cmNlQ2FjaGUgPSBzb3VyY2VDYWNoZXNbaWRdO1xuICAgICAgICAgICAgY29uc3Qgc291cmNlID0gc291cmNlQ2FjaGUuZ2V0U291cmNlKCk7XG4gICAgICAgICAgICBpZiAoc291cmNlLnR5cGUgIT09ICdyYXN0ZXInICYmIHNvdXJjZS50eXBlICE9PSAncmFzdGVyLWRlbScpIGNvbnRpbnVlO1xuICAgICAgICAgICAgY29uc3QgdmlzaWJsZVRpbGVzID0gW107XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNvb3JkIG9mIGNvb3Jkc0FzY2VuZGluZ1tpZF0pIHZpc2libGVUaWxlcy5wdXNoKHNvdXJjZUNhY2hlLmdldFRpbGUoY29vcmQpKTtcbiAgICAgICAgICAgIHVwZGF0ZVRpbGVNYXNrcyh2aXNpYmxlVGlsZXMsIHRoaXMuY29udGV4dCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm9wYXF1ZVBhc3NDdXRvZmYgPSBJbmZpbml0eTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsYXllcklkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgbGF5ZXJJZCA9IGxheWVySWRzW2ldO1xuICAgICAgICAgICAgaWYgKHRoaXMuc3R5bGUuX2xheWVyc1tsYXllcklkXS5pczNEKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9wYXF1ZVBhc3NDdXRvZmYgPSBpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gT2Zmc2NyZWVuIHBhc3MgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgICAgLy8gV2UgZmlyc3QgZG8gYWxsIHJlbmRlcmluZyB0aGF0IHJlcXVpcmVzIHJlbmRlcmluZyB0byBhIHNlcGFyYXRlXG4gICAgICAgIC8vIGZyYW1lYnVmZmVyLCBhbmQgdGhlbiBzYXZlIHRob3NlIGZvciByZW5kZXJpbmcgYmFjayB0byB0aGUgbWFwXG4gICAgICAgIC8vIGxhdGVyOiBpbiBkb2luZyB0aGlzIHdlIGF2b2lkIGRvaW5nIGV4cGVuc2l2ZSBmcmFtZWJ1ZmZlciByZXN0b3Jlcy5cbiAgICAgICAgdGhpcy5yZW5kZXJQYXNzID0gJ29mZnNjcmVlbic7XG4gICAgICAgIHRoaXMuZGVwdGhSYm9OZWVkc0NsZWFyID0gdHJ1ZTtcblxuICAgICAgICBmb3IgKGNvbnN0IGxheWVySWQgb2YgbGF5ZXJJZHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGxheWVyID0gdGhpcy5zdHlsZS5fbGF5ZXJzW2xheWVySWRdO1xuICAgICAgICAgICAgaWYgKCFsYXllci5oYXNPZmZzY3JlZW5QYXNzKCkgfHwgbGF5ZXIuaXNIaWRkZW4odGhpcy50cmFuc2Zvcm0uem9vbSkpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICBjb25zdCBjb29yZHMgPSBjb29yZHNEZXNjZW5kaW5nW2xheWVyLnNvdXJjZV07XG4gICAgICAgICAgICBpZiAobGF5ZXIudHlwZSAhPT0gJ2N1c3RvbScgJiYgIWNvb3Jkcy5sZW5ndGgpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICB0aGlzLnJlbmRlckxheWVyKHRoaXMsIHNvdXJjZUNhY2hlc1tsYXllci5zb3VyY2VdLCBsYXllciwgY29vcmRzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlYmluZCB0aGUgbWFpbiBmcmFtZWJ1ZmZlciBub3cgdGhhdCBhbGwgb2Zmc2NyZWVuIGxheWVycyBoYXZlIGJlZW4gcmVuZGVyZWQ6XG4gICAgICAgIHRoaXMuY29udGV4dC5iaW5kRnJhbWVidWZmZXIuc2V0KG51bGwpO1xuXG4gICAgICAgIC8vIENsZWFyIGJ1ZmZlcnMgaW4gcHJlcGFyYXRpb24gZm9yIGRyYXdpbmcgdG8gdGhlIG1haW4gZnJhbWVidWZmZXJcbiAgICAgICAgdGhpcy5jb250ZXh0LmNsZWFyKHsgY29sb3I6IG9wdGlvbnMuc2hvd092ZXJkcmF3SW5zcGVjdG9yID8gQ29sb3IuYmxhY2sgOiBDb2xvci50cmFuc3BhcmVudCwgZGVwdGg6IDEgfSk7XG4gICAgICAgIHRoaXMuY2xlYXJTdGVuY2lsKCk7XG5cbiAgICAgICAgdGhpcy5fc2hvd092ZXJkcmF3SW5zcGVjdG9yID0gb3B0aW9ucy5zaG93T3ZlcmRyYXdJbnNwZWN0b3I7XG4gICAgICAgIHRoaXMuZGVwdGhSYW5nZUZvcjNEID0gWzAsIDEgLSAoKHN0eWxlLl9vcmRlci5sZW5ndGggKyAyKSAqIHRoaXMubnVtU3VibGF5ZXJzICogdGhpcy5kZXB0aEVwc2lsb24pXTtcblxuICAgICAgICAvLyBPcGFxdWUgcGFzcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgICAvLyBEcmF3IG9wYXF1ZSBsYXllcnMgdG9wLXRvLWJvdHRvbSBmaXJzdC5cbiAgICAgICAgdGhpcy5yZW5kZXJQYXNzID0gJ29wYXF1ZSc7XG5cbiAgICAgICAgZm9yICh0aGlzLmN1cnJlbnRMYXllciA9IGxheWVySWRzLmxlbmd0aCAtIDE7IHRoaXMuY3VycmVudExheWVyID49IDA7IHRoaXMuY3VycmVudExheWVyLS0pIHtcbiAgICAgICAgICAgIGNvbnN0IGxheWVyID0gdGhpcy5zdHlsZS5fbGF5ZXJzW2xheWVySWRzW3RoaXMuY3VycmVudExheWVyXV07XG4gICAgICAgICAgICBjb25zdCBzb3VyY2VDYWNoZSA9IHNvdXJjZUNhY2hlc1tsYXllci5zb3VyY2VdO1xuICAgICAgICAgICAgY29uc3QgY29vcmRzID0gY29vcmRzQXNjZW5kaW5nW2xheWVyLnNvdXJjZV07XG5cbiAgICAgICAgICAgIHRoaXMuX3JlbmRlclRpbGVDbGlwcGluZ01hc2tzKGxheWVyLCBjb29yZHMpO1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJMYXllcih0aGlzLCBzb3VyY2VDYWNoZSwgbGF5ZXIsIGNvb3Jkcyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUcmFuc2x1Y2VudCBwYXNzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICAgIC8vIERyYXcgYWxsIG90aGVyIGxheWVycyBib3R0b20tdG8tdG9wLlxuICAgICAgICB0aGlzLnJlbmRlclBhc3MgPSAndHJhbnNsdWNlbnQnO1xuXG4gICAgICAgIGZvciAodGhpcy5jdXJyZW50TGF5ZXIgPSAwOyB0aGlzLmN1cnJlbnRMYXllciA8IGxheWVySWRzLmxlbmd0aDsgdGhpcy5jdXJyZW50TGF5ZXIrKykge1xuICAgICAgICAgICAgY29uc3QgbGF5ZXIgPSB0aGlzLnN0eWxlLl9sYXllcnNbbGF5ZXJJZHNbdGhpcy5jdXJyZW50TGF5ZXJdXTtcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZUNhY2hlID0gc291cmNlQ2FjaGVzW2xheWVyLnNvdXJjZV07XG5cbiAgICAgICAgICAgIC8vIEZvciBzeW1ib2wgbGF5ZXJzIGluIHRoZSB0cmFuc2x1Y2VudCBwYXNzLCB3ZSBhZGQgZXh0cmEgdGlsZXMgdG8gdGhlIHJlbmRlcmFibGUgc2V0XG4gICAgICAgICAgICAvLyBmb3IgY3Jvc3MtdGlsZSBzeW1ib2wgZmFkaW5nLiBTeW1ib2wgbGF5ZXJzIGRvbid0IHVzZSB0aWxlIGNsaXBwaW5nLCBzbyBubyBuZWVkIHRvIHJlbmRlclxuICAgICAgICAgICAgLy8gc2VwYXJhdGUgY2xpcHBpbmcgbWFza3NcbiAgICAgICAgICAgIGNvbnN0IGNvb3JkcyA9IChsYXllci50eXBlID09PSAnc3ltYm9sJyA/IGNvb3Jkc0Rlc2NlbmRpbmdTeW1ib2wgOiBjb29yZHNEZXNjZW5kaW5nKVtsYXllci5zb3VyY2VdO1xuXG4gICAgICAgICAgICB0aGlzLl9yZW5kZXJUaWxlQ2xpcHBpbmdNYXNrcyhsYXllciwgY29vcmRzQXNjZW5kaW5nW2xheWVyLnNvdXJjZV0pO1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJMYXllcih0aGlzLCBzb3VyY2VDYWNoZSwgbGF5ZXIsIGNvb3Jkcyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnNob3dUaWxlQm91bmRhcmllcykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBpZCBpbiBzb3VyY2VDYWNoZXMpIHtcbiAgICAgICAgICAgICAgICBkcmF3LmRlYnVnKHRoaXMsIHNvdXJjZUNhY2hlc1tpZF0sIGNvb3Jkc0FzY2VuZGluZ1tpZF0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZXRDdXN0b21MYXllckRlZmF1bHRzKCk7XG4gICAgfVxuXG4gICAgc2V0dXBPZmZzY3JlZW5EZXB0aFJlbmRlcmJ1ZmZlcigpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMuY29udGV4dDtcbiAgICAgICAgLy8gQWxsIG9mIHRoZSAzRCB0ZXh0dXJlcyB3aWxsIHVzZSB0aGUgc2FtZSBkZXB0aCByZW5kZXJidWZmZXIuXG4gICAgICAgIGlmICghdGhpcy5kZXB0aFJibykge1xuICAgICAgICAgICAgdGhpcy5kZXB0aFJibyA9IGNvbnRleHQuY3JlYXRlUmVuZGVyYnVmZmVyKGNvbnRleHQuZ2wuREVQVEhfQ09NUE9ORU5UMTYsIHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlbmRlckxheWVyKHBhaW50ZXI6IFBhaW50ZXIsIHNvdXJjZUNhY2hlOiBTb3VyY2VDYWNoZSwgbGF5ZXI6IFN0eWxlTGF5ZXIsIGNvb3JkczogQXJyYXk8T3ZlcnNjYWxlZFRpbGVJRD4pIHtcbiAgICAgICAgaWYgKGxheWVyLmlzSGlkZGVuKHRoaXMudHJhbnNmb3JtLnpvb20pKSByZXR1cm47XG4gICAgICAgIGlmIChsYXllci50eXBlICE9PSAnYmFja2dyb3VuZCcgJiYgbGF5ZXIudHlwZSAhPT0gJ2N1c3RvbScgJiYgIWNvb3Jkcy5sZW5ndGgpIHJldHVybjtcbiAgICAgICAgdGhpcy5pZCA9IGxheWVyLmlkO1xuXG4gICAgICAgIGRyYXdbbGF5ZXIudHlwZV0ocGFpbnRlciwgc291cmNlQ2FjaGUsIGxheWVyLCBjb29yZHMsIHRoaXMuc3R5bGUucGxhY2VtZW50LnZhcmlhYmxlT2Zmc2V0cyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVHJhbnNmb3JtIGEgbWF0cml4IHRvIGluY29ycG9yYXRlIHRoZSAqLXRyYW5zbGF0ZSBhbmQgKi10cmFuc2xhdGUtYW5jaG9yIHByb3BlcnRpZXMgaW50byBpdC5cbiAgICAgKiBAcGFyYW0gaW5WaWV3cG9ydFBpeGVsVW5pdHNVbml0cyBUcnVlIHdoZW4gdGhlIHVuaXRzIGFjY2VwdGVkIGJ5IHRoZSBtYXRyaXggYXJlIGluIHZpZXdwb3J0IHBpeGVscyBpbnN0ZWFkIG9mIHRpbGUgdW5pdHMuXG4gICAgICogQHJldHVybnMge0Zsb2F0MzJBcnJheX0gbWF0cml4XG4gICAgICovXG4gICAgdHJhbnNsYXRlUG9zTWF0cml4KG1hdHJpeDogRmxvYXQzMkFycmF5LCB0aWxlOiBUaWxlLCB0cmFuc2xhdGU6IFtudW1iZXIsIG51bWJlcl0sIHRyYW5zbGF0ZUFuY2hvcjogJ21hcCcgfCAndmlld3BvcnQnLCBpblZpZXdwb3J0UGl4ZWxVbml0c1VuaXRzPzogYm9vbGVhbikge1xuICAgICAgICBpZiAoIXRyYW5zbGF0ZVswXSAmJiAhdHJhbnNsYXRlWzFdKSByZXR1cm4gbWF0cml4O1xuXG4gICAgICAgIGNvbnN0IGFuZ2xlID0gaW5WaWV3cG9ydFBpeGVsVW5pdHNVbml0cyA/XG4gICAgICAgICAgICAodHJhbnNsYXRlQW5jaG9yID09PSAnbWFwJyA/IHRoaXMudHJhbnNmb3JtLmFuZ2xlIDogMCkgOlxuICAgICAgICAgICAgKHRyYW5zbGF0ZUFuY2hvciA9PT0gJ3ZpZXdwb3J0JyA/IC10aGlzLnRyYW5zZm9ybS5hbmdsZSA6IDApO1xuXG4gICAgICAgIGlmIChhbmdsZSkge1xuICAgICAgICAgICAgY29uc3Qgc2luQSA9IE1hdGguc2luKGFuZ2xlKTtcbiAgICAgICAgICAgIGNvbnN0IGNvc0EgPSBNYXRoLmNvcyhhbmdsZSk7XG4gICAgICAgICAgICB0cmFuc2xhdGUgPSBbXG4gICAgICAgICAgICAgICAgdHJhbnNsYXRlWzBdICogY29zQSAtIHRyYW5zbGF0ZVsxXSAqIHNpbkEsXG4gICAgICAgICAgICAgICAgdHJhbnNsYXRlWzBdICogc2luQSArIHRyYW5zbGF0ZVsxXSAqIGNvc0FcbiAgICAgICAgICAgIF07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0cmFuc2xhdGlvbiA9IFtcbiAgICAgICAgICAgIGluVmlld3BvcnRQaXhlbFVuaXRzVW5pdHMgPyB0cmFuc2xhdGVbMF0gOiBwaXhlbHNUb1RpbGVVbml0cyh0aWxlLCB0cmFuc2xhdGVbMF0sIHRoaXMudHJhbnNmb3JtLnpvb20pLFxuICAgICAgICAgICAgaW5WaWV3cG9ydFBpeGVsVW5pdHNVbml0cyA/IHRyYW5zbGF0ZVsxXSA6IHBpeGVsc1RvVGlsZVVuaXRzKHRpbGUsIHRyYW5zbGF0ZVsxXSwgdGhpcy50cmFuc2Zvcm0uem9vbSksXG4gICAgICAgICAgICAwXG4gICAgICAgIF07XG5cbiAgICAgICAgY29uc3QgdHJhbnNsYXRlZE1hdHJpeCA9IG5ldyBGbG9hdDMyQXJyYXkoMTYpO1xuICAgICAgICBtYXQ0LnRyYW5zbGF0ZSh0cmFuc2xhdGVkTWF0cml4LCBtYXRyaXgsIHRyYW5zbGF0aW9uKTtcbiAgICAgICAgcmV0dXJuIHRyYW5zbGF0ZWRNYXRyaXg7XG4gICAgfVxuXG4gICAgc2F2ZVRpbGVUZXh0dXJlKHRleHR1cmU6IFRleHR1cmUpIHtcbiAgICAgICAgY29uc3QgdGV4dHVyZXMgPSB0aGlzLl90aWxlVGV4dHVyZXNbdGV4dHVyZS5zaXplWzBdXTtcbiAgICAgICAgaWYgKCF0ZXh0dXJlcykge1xuICAgICAgICAgICAgdGhpcy5fdGlsZVRleHR1cmVzW3RleHR1cmUuc2l6ZVswXV0gPSBbdGV4dHVyZV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0ZXh0dXJlcy5wdXNoKHRleHR1cmUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0VGlsZVRleHR1cmUoc2l6ZTogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IHRleHR1cmVzID0gdGhpcy5fdGlsZVRleHR1cmVzW3NpemVdO1xuICAgICAgICByZXR1cm4gdGV4dHVyZXMgJiYgdGV4dHVyZXMubGVuZ3RoID4gMCA/IHRleHR1cmVzLnBvcCgpIDogbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciBhIHBhdHRlcm4gaW1hZ2UgaXMgbmVlZGVkLCBhbmQgaWYgaXQgaXMsIHdoZXRoZXIgaXQgaXMgbm90IGxvYWRlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHRydWUgaWYgYSBuZWVkZWQgaW1hZ2UgaXMgbWlzc2luZyBhbmQgcmVuZGVyaW5nIG5lZWRzIHRvIGJlIHNraXBwZWQuXG4gICAgICovXG4gICAgaXNQYXR0ZXJuTWlzc2luZyhpbWFnZTogP0Nyb3NzRmFkZWQ8c3RyaW5nPik6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIWltYWdlKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGNvbnN0IGltYWdlUG9zQSA9IHRoaXMuaW1hZ2VNYW5hZ2VyLmdldFBhdHRlcm4oaW1hZ2UuZnJvbSk7XG4gICAgICAgIGNvbnN0IGltYWdlUG9zQiA9IHRoaXMuaW1hZ2VNYW5hZ2VyLmdldFBhdHRlcm4oaW1hZ2UudG8pO1xuICAgICAgICByZXR1cm4gIWltYWdlUG9zQSB8fCAhaW1hZ2VQb3NCO1xuICAgIH1cblxuICAgIHVzZVByb2dyYW0obmFtZTogc3RyaW5nLCBwcm9ncmFtQ29uZmlndXJhdGlvbjogUHJvZ3JhbUNvbmZpZ3VyYXRpb24gPSB0aGlzLmVtcHR5UHJvZ3JhbUNvbmZpZ3VyYXRpb24pOiBQcm9ncmFtPGFueT4ge1xuICAgICAgICB0aGlzLmNhY2hlID0gdGhpcy5jYWNoZSB8fCB7fTtcbiAgICAgICAgY29uc3Qga2V5ID0gYCR7bmFtZX0ke3Byb2dyYW1Db25maWd1cmF0aW9uLmNhY2hlS2V5IHx8ICcnfSR7dGhpcy5fc2hvd092ZXJkcmF3SW5zcGVjdG9yID8gJy9vdmVyZHJhdycgOiAnJ31gO1xuICAgICAgICBpZiAoIXRoaXMuY2FjaGVba2V5XSkge1xuICAgICAgICAgICAgdGhpcy5jYWNoZVtrZXldID0gbmV3IFByb2dyYW0odGhpcy5jb250ZXh0LCBzaGFkZXJzW25hbWVdLCBwcm9ncmFtQ29uZmlndXJhdGlvbiwgcHJvZ3JhbVVuaWZvcm1zW25hbWVdLCB0aGlzLl9zaG93T3ZlcmRyYXdJbnNwZWN0b3IpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmNhY2hlW2tleV07XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBSZXNldCBzb21lIEdMIHN0YXRlIHRvIGRlZmF1bHQgdmFsdWVzIHRvIGF2b2lkIGhhcmQtdG8tZGVidWcgYnVnc1xuICAgICAqIGluIGN1c3RvbSBsYXllcnMuXG4gICAgICovXG4gICAgc2V0Q3VzdG9tTGF5ZXJEZWZhdWx0cygpIHtcbiAgICAgICAgLy8gUHJldmVudCBjdXN0b20gbGF5ZXJzIGZyb20gdW5pbnRlbnRpb25hbGx5IG1vZGlmeSB0aGUgbGFzdCBWQU8gdXNlZC5cbiAgICAgICAgLy8gQWxsIG90aGVyIHN0YXRlIGlzIHN0YXRlIGlzIHJlc3RvcmVkIG9uIGl0J3Mgb3duLCBidXQgZm9yIFZBT3MgaXQnc1xuICAgICAgICAvLyBzaW1wbGVyIHRvIHVuYmluZCBzbyB0aGF0IHdlIGRvbid0IGhhdmUgdG8gdHJhY2sgdGhlIHN0YXRlIG9mIFZBT3MuXG4gICAgICAgIHRoaXMuY29udGV4dC51bmJpbmRWQU8oKTtcblxuICAgICAgICAvLyBUaGUgZGVmYXVsdCB2YWx1ZXMgZm9yIHRoaXMgc3RhdGUgaXMgbWVhbmluZ2Z1bCBhbmQgb2Z0ZW4gZXhwZWN0ZWQuXG4gICAgICAgIC8vIExlYXZpbmcgdGhpcyBzdGF0ZSBkaXJ0eSBjb3VsZCBjYXVzZSBhIGxvdCBvZiBjb25mdXNpb24gZm9yIHVzZXJzLlxuICAgICAgICB0aGlzLmNvbnRleHQuY3VsbEZhY2Uuc2V0RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLmNvbnRleHQuYWN0aXZlVGV4dHVyZS5zZXREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuY29udGV4dC5waXhlbFN0b3JlVW5wYWNrLnNldERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5jb250ZXh0LnBpeGVsU3RvcmVVbnBhY2tQcmVtdWx0aXBseUFscGhhLnNldERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5jb250ZXh0LnBpeGVsU3RvcmVVbnBhY2tGbGlwWS5zZXREZWZhdWx0KCk7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBTZXQgR0wgc3RhdGUgdGhhdCBpcyBzaGFyZWQgYnkgYWxsIGxheWVycy5cbiAgICAgKi9cbiAgICBzZXRCYXNlU3RhdGUoKSB7XG4gICAgICAgIGNvbnN0IGdsID0gdGhpcy5jb250ZXh0LmdsO1xuICAgICAgICB0aGlzLmNvbnRleHQuY3VsbEZhY2Uuc2V0KGZhbHNlKTtcbiAgICAgICAgdGhpcy5jb250ZXh0LnZpZXdwb3J0LnNldChbMCwgMCwgdGhpcy53aWR0aCwgdGhpcy5oZWlnaHRdKTtcbiAgICAgICAgdGhpcy5jb250ZXh0LmJsZW5kRXF1YXRpb24uc2V0KGdsLkZVTkNfQUREKTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFBhaW50ZXI7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgTWVyY2F0b3JDb29yZGluYXRlIGZyb20gJy4uL2dlby9tZXJjYXRvcl9jb29yZGluYXRlJztcbmltcG9ydCBQb2ludCBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcblxuaW1wb3J0IHsgT3ZlcnNjYWxlZFRpbGVJRCB9IGZyb20gJy4uL3NvdXJjZS90aWxlX2lkJztcblxuZXhwb3J0IGRlZmF1bHQgdGlsZUNvdmVyO1xuXG5mdW5jdGlvbiB0aWxlQ292ZXIoejogbnVtYmVyLCBib3VuZHM6IFtNZXJjYXRvckNvb3JkaW5hdGUsIE1lcmNhdG9yQ29vcmRpbmF0ZSwgTWVyY2F0b3JDb29yZGluYXRlLCBNZXJjYXRvckNvb3JkaW5hdGVdLFxuICAgIGFjdHVhbFo6IG51bWJlciwgcmVuZGVyV29ybGRDb3BpZXM6IGJvb2xlYW4gfCB2b2lkKTogQXJyYXk8T3ZlcnNjYWxlZFRpbGVJRD4ge1xuICAgIGlmIChyZW5kZXJXb3JsZENvcGllcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJlbmRlcldvcmxkQ29waWVzID0gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3QgdGlsZXMgPSAxIDw8IHo7XG4gICAgY29uc3QgdCA9IHt9O1xuXG4gICAgZnVuY3Rpb24gc2NhbkxpbmUoeDAsIHgxLCB5KSB7XG4gICAgICAgIGxldCB4LCB3LCB3eCwgY29vcmQ7XG4gICAgICAgIGlmICh5ID49IDAgJiYgeSA8PSB0aWxlcykge1xuICAgICAgICAgICAgZm9yICh4ID0geDA7IHggPCB4MTsgeCsrKSB7XG4gICAgICAgICAgICAgICAgdyA9IE1hdGguZmxvb3IoeCAvIHRpbGVzKTtcbiAgICAgICAgICAgICAgICB3eCA9ICh4ICUgdGlsZXMgKyB0aWxlcykgJSB0aWxlcztcbiAgICAgICAgICAgICAgICBpZiAodyA9PT0gMCB8fCByZW5kZXJXb3JsZENvcGllcyA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICBjb29yZCA9IG5ldyBPdmVyc2NhbGVkVGlsZUlEKGFjdHVhbFosIHcsIHosIHd4LCB5KTtcbiAgICAgICAgICAgICAgICAgICAgdFtjb29yZC5rZXldID0gY29vcmQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgem9vbWVkQm91bmRzID0gYm91bmRzLm1hcCgoY29vcmQpID0+IG5ldyBQb2ludChjb29yZC54LCBjb29yZC55KS5fbXVsdCh0aWxlcykpO1xuXG4gICAgLy8gRGl2aWRlIHRoZSBzY3JlZW4gdXAgaW4gdHdvIHRyaWFuZ2xlcyBhbmQgc2NhbiBlYWNoIG9mIHRoZW06XG4gICAgLy8gKy0tLS9cbiAgICAvLyB8IC8gfFxuICAgIC8vIC8tLS0rXG4gICAgc2NhblRyaWFuZ2xlKHpvb21lZEJvdW5kc1swXSwgem9vbWVkQm91bmRzWzFdLCB6b29tZWRCb3VuZHNbMl0sIDAsIHRpbGVzLCBzY2FuTGluZSk7XG4gICAgc2NhblRyaWFuZ2xlKHpvb21lZEJvdW5kc1syXSwgem9vbWVkQm91bmRzWzNdLCB6b29tZWRCb3VuZHNbMF0sIDAsIHRpbGVzLCBzY2FuTGluZSk7XG5cbiAgICByZXR1cm4gT2JqZWN0LmtleXModCkubWFwKChpZCkgPT4ge1xuICAgICAgICByZXR1cm4gdFtpZF07XG4gICAgfSk7XG59XG5cblxuLy8gVGFrZW4gZnJvbSBwb2x5bWFwcyBzcmMvTGF5ZXIuanNcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9zaW1wbGVnZW8vcG9seW1hcHMvYmxvYi9tYXN0ZXIvc3JjL0xheWVyLmpzI0wzMzMtTDM4M1xuXG5mdW5jdGlvbiBlZGdlKGE6IFBvaW50LCBiOiBQb2ludCkge1xuICAgIGlmIChhLnkgPiBiLnkpIHsgY29uc3QgdCA9IGE7IGEgPSBiOyBiID0gdDsgfVxuICAgIHJldHVybiB7XG4gICAgICAgIHgwOiBhLngsXG4gICAgICAgIHkwOiBhLnksXG4gICAgICAgIHgxOiBiLngsXG4gICAgICAgIHkxOiBiLnksXG4gICAgICAgIGR4OiBiLnggLSBhLngsXG4gICAgICAgIGR5OiBiLnkgLSBhLnlcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBzY2FuU3BhbnMoZTAsIGUxLCB5bWluLCB5bWF4LCBzY2FuTGluZSkge1xuICAgIGNvbnN0IHkwID0gTWF0aC5tYXgoeW1pbiwgTWF0aC5mbG9vcihlMS55MCkpO1xuICAgIGNvbnN0IHkxID0gTWF0aC5taW4oeW1heCwgTWF0aC5jZWlsKGUxLnkxKSk7XG5cbiAgICAvLyBzb3J0IGVkZ2VzIGJ5IHgtY29vcmRpbmF0ZVxuICAgIGlmICgoZTAueDAgPT09IGUxLngwICYmIGUwLnkwID09PSBlMS55MCkgP1xuICAgICAgICAoZTAueDAgKyBlMS5keSAvIGUwLmR5ICogZTAuZHggPCBlMS54MSkgOlxuICAgICAgICAoZTAueDEgLSBlMS5keSAvIGUwLmR5ICogZTAuZHggPCBlMS54MCkpIHtcbiAgICAgICAgY29uc3QgdCA9IGUwOyBlMCA9IGUxOyBlMSA9IHQ7XG4gICAgfVxuXG4gICAgLy8gc2NhbiBsaW5lcyFcbiAgICBjb25zdCBtMCA9IGUwLmR4IC8gZTAuZHk7XG4gICAgY29uc3QgbTEgPSBlMS5keCAvIGUxLmR5O1xuICAgIGNvbnN0IGQwID0gZTAuZHggPiAwOyAvLyB1c2UgeSArIDEgdG8gY29tcHV0ZSB4MFxuICAgIGNvbnN0IGQxID0gZTEuZHggPCAwOyAvLyB1c2UgeSArIDEgdG8gY29tcHV0ZSB4MVxuICAgIGZvciAobGV0IHkgPSB5MDsgeSA8IHkxOyB5KyspIHtcbiAgICAgICAgY29uc3QgeDAgPSBtMCAqIE1hdGgubWF4KDAsIE1hdGgubWluKGUwLmR5LCB5ICsgZDAgLSBlMC55MCkpICsgZTAueDA7XG4gICAgICAgIGNvbnN0IHgxID0gbTEgKiBNYXRoLm1heCgwLCBNYXRoLm1pbihlMS5keSwgeSArIGQxIC0gZTEueTApKSArIGUxLngwO1xuICAgICAgICBzY2FuTGluZShNYXRoLmZsb29yKHgxKSwgTWF0aC5jZWlsKHgwKSwgeSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBzY2FuVHJpYW5nbGUoYTogUG9pbnQsIGI6IFBvaW50LCBjOiBQb2ludCwgeW1pbiwgeW1heCwgc2NhbkxpbmUpIHtcbiAgICBsZXQgYWIgPSBlZGdlKGEsIGIpLFxuICAgICAgICBiYyA9IGVkZ2UoYiwgYyksXG4gICAgICAgIGNhID0gZWRnZShjLCBhKTtcblxuICAgIGxldCB0O1xuXG4gICAgLy8gc29ydCBlZGdlcyBieSB5LWxlbmd0aFxuICAgIGlmIChhYi5keSA+IGJjLmR5KSB7IHQgPSBhYjsgYWIgPSBiYzsgYmMgPSB0OyB9XG4gICAgaWYgKGFiLmR5ID4gY2EuZHkpIHsgdCA9IGFiOyBhYiA9IGNhOyBjYSA9IHQ7IH1cbiAgICBpZiAoYmMuZHkgPiBjYS5keSkgeyB0ID0gYmM7IGJjID0gY2E7IGNhID0gdDsgfVxuXG4gICAgLy8gc2NhbiBzcGFuISBzY2FuIHNwYW4hXG4gICAgaWYgKGFiLmR5KSBzY2FuU3BhbnMoY2EsIGFiLCB5bWluLCB5bWF4LCBzY2FuTGluZSk7XG4gICAgaWYgKGJjLmR5KSBzY2FuU3BhbnMoY2EsIGJjLCB5bWluLCB5bWF4LCBzY2FuTGluZSk7XG59XG5cbiIsIi8vIEBmbG93XG5cbmltcG9ydCBMbmdMYXQgZnJvbSAnLi9sbmdfbGF0JztcbmltcG9ydCBMbmdMYXRCb3VuZHMgZnJvbSAnLi9sbmdfbGF0X2JvdW5kcyc7XG5pbXBvcnQgTWVyY2F0b3JDb29yZGluYXRlLCB7bWVyY2F0b3JYZnJvbUxuZywgbWVyY2F0b3JZZnJvbUxhdCwgbWVyY2F0b3JaZnJvbUFsdGl0dWRlfSBmcm9tICcuL21lcmNhdG9yX2Nvb3JkaW5hdGUnO1xuaW1wb3J0IFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuaW1wb3J0IHsgd3JhcCwgY2xhbXAgfSBmcm9tICcuLi91dGlsL3V0aWwnO1xuaW1wb3J0IHtudW1iZXIgYXMgaW50ZXJwb2xhdGV9IGZyb20gJy4uL3N0eWxlLXNwZWMvdXRpbC9pbnRlcnBvbGF0ZSc7XG5pbXBvcnQgdGlsZUNvdmVyIGZyb20gJy4uL3V0aWwvdGlsZV9jb3Zlcic7XG5pbXBvcnQgeyBVbndyYXBwZWRUaWxlSUQgfSBmcm9tICcuLi9zb3VyY2UvdGlsZV9pZCc7XG5pbXBvcnQgRVhURU5UIGZyb20gJy4uL2RhdGEvZXh0ZW50JztcbmltcG9ydCB7IHZlYzQsIG1hdDQsIG1hdDIgfSBmcm9tICdnbC1tYXRyaXgnO1xuXG5pbXBvcnQgdHlwZSB7IE92ZXJzY2FsZWRUaWxlSUQsIENhbm9uaWNhbFRpbGVJRCB9IGZyb20gJy4uL3NvdXJjZS90aWxlX2lkJztcblxuLyoqXG4gKiBBIHNpbmdsZSB0cmFuc2Zvcm0sIGdlbmVyYWxseSB1c2VkIGZvciBhIHNpbmdsZSB0aWxlIHRvIGJlXG4gKiBzY2FsZWQsIHJvdGF0ZWQsIGFuZCB6b29tZWQuXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBUcmFuc2Zvcm0ge1xuICAgIHRpbGVTaXplOiBudW1iZXI7XG4gICAgdGlsZVpvb206IG51bWJlcjtcbiAgICBsbmdSYW5nZTogP1tudW1iZXIsIG51bWJlcl07XG4gICAgbGF0UmFuZ2U6ID9bbnVtYmVyLCBudW1iZXJdO1xuICAgIG1heFZhbGlkTGF0aXR1ZGU6IG51bWJlcjtcbiAgICBzY2FsZTogbnVtYmVyO1xuICAgIHdpZHRoOiBudW1iZXI7XG4gICAgaGVpZ2h0OiBudW1iZXI7XG4gICAgYW5nbGU6IG51bWJlcjtcbiAgICByb3RhdGlvbk1hdHJpeDogRmxvYXQ2NEFycmF5O1xuICAgIHpvb21GcmFjdGlvbjogbnVtYmVyO1xuICAgIHBpeGVsc1RvR0xVbml0czogW251bWJlciwgbnVtYmVyXTtcbiAgICBjYW1lcmFUb0NlbnRlckRpc3RhbmNlOiBudW1iZXI7XG4gICAgbWVyY2F0b3JNYXRyaXg6IEFycmF5PG51bWJlcj47XG4gICAgcHJvak1hdHJpeDogRmxvYXQ2NEFycmF5O1xuICAgIGFsaWduZWRQcm9qTWF0cml4OiBGbG9hdDY0QXJyYXk7XG4gICAgcGl4ZWxNYXRyaXg6IEZsb2F0NjRBcnJheTtcbiAgICBwaXhlbE1hdHJpeEludmVyc2U6IEZsb2F0NjRBcnJheTtcbiAgICBnbENvb3JkTWF0cml4OiBGbG9hdDMyQXJyYXk7XG4gICAgbGFiZWxQbGFuZU1hdHJpeDogRmxvYXQzMkFycmF5O1xuICAgIF9mb3Y6IG51bWJlcjtcbiAgICBfcGl0Y2g6IG51bWJlcjtcbiAgICBfem9vbTogbnVtYmVyO1xuICAgIF91bm1vZGlmaWVkOiBib29sZWFuO1xuICAgIF9yZW5kZXJXb3JsZENvcGllczogYm9vbGVhbjtcbiAgICBfbWluWm9vbTogbnVtYmVyO1xuICAgIF9tYXhab29tOiBudW1iZXI7XG4gICAgX2NlbnRlcjogTG5nTGF0O1xuICAgIF9jb25zdHJhaW5pbmc6IGJvb2xlYW47XG4gICAgX3Bvc01hdHJpeENhY2hlOiB7W251bWJlcl06IEZsb2F0MzJBcnJheX07XG4gICAgX2FsaWduZWRQb3NNYXRyaXhDYWNoZToge1tudW1iZXJdOiBGbG9hdDMyQXJyYXl9O1xuXG4gICAgY29uc3RydWN0b3IobWluWm9vbTogP251bWJlciwgbWF4Wm9vbTogP251bWJlciwgcmVuZGVyV29ybGRDb3BpZXM6IGJvb2xlYW4gfCB2b2lkKSB7XG4gICAgICAgIHRoaXMudGlsZVNpemUgPSA1MTI7IC8vIGNvbnN0YW50XG4gICAgICAgIHRoaXMubWF4VmFsaWRMYXRpdHVkZSA9IDg1LjA1MTEyOTsgLy8gY29uc3RhbnRcblxuICAgICAgICB0aGlzLl9yZW5kZXJXb3JsZENvcGllcyA9IHJlbmRlcldvcmxkQ29waWVzID09PSB1bmRlZmluZWQgPyB0cnVlIDogcmVuZGVyV29ybGRDb3BpZXM7XG4gICAgICAgIHRoaXMuX21pblpvb20gPSBtaW5ab29tIHx8IDA7XG4gICAgICAgIHRoaXMuX21heFpvb20gPSBtYXhab29tIHx8IDIyO1xuXG4gICAgICAgIHRoaXMuc2V0TWF4Qm91bmRzKCk7XG5cbiAgICAgICAgdGhpcy53aWR0aCA9IDA7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gMDtcbiAgICAgICAgdGhpcy5fY2VudGVyID0gbmV3IExuZ0xhdCgwLCAwKTtcbiAgICAgICAgdGhpcy56b29tID0gMDtcbiAgICAgICAgdGhpcy5hbmdsZSA9IDA7XG4gICAgICAgIHRoaXMuX2ZvdiA9IDAuNjQzNTAxMTA4NzkzMjg0NDtcbiAgICAgICAgdGhpcy5fcGl0Y2ggPSAwO1xuICAgICAgICB0aGlzLl91bm1vZGlmaWVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fcG9zTWF0cml4Q2FjaGUgPSB7fTtcbiAgICAgICAgdGhpcy5fYWxpZ25lZFBvc01hdHJpeENhY2hlID0ge307XG4gICAgfVxuXG4gICAgY2xvbmUoKTogVHJhbnNmb3JtIHtcbiAgICAgICAgY29uc3QgY2xvbmUgPSBuZXcgVHJhbnNmb3JtKHRoaXMuX21pblpvb20sIHRoaXMuX21heFpvb20sIHRoaXMuX3JlbmRlcldvcmxkQ29waWVzKTtcbiAgICAgICAgY2xvbmUudGlsZVNpemUgPSB0aGlzLnRpbGVTaXplO1xuICAgICAgICBjbG9uZS5sYXRSYW5nZSA9IHRoaXMubGF0UmFuZ2U7XG4gICAgICAgIGNsb25lLndpZHRoID0gdGhpcy53aWR0aDtcbiAgICAgICAgY2xvbmUuaGVpZ2h0ID0gdGhpcy5oZWlnaHQ7XG4gICAgICAgIGNsb25lLl9jZW50ZXIgPSB0aGlzLl9jZW50ZXI7XG4gICAgICAgIGNsb25lLnpvb20gPSB0aGlzLnpvb207XG4gICAgICAgIGNsb25lLmFuZ2xlID0gdGhpcy5hbmdsZTtcbiAgICAgICAgY2xvbmUuX2ZvdiA9IHRoaXMuX2ZvdjtcbiAgICAgICAgY2xvbmUuX3BpdGNoID0gdGhpcy5fcGl0Y2g7XG4gICAgICAgIGNsb25lLl91bm1vZGlmaWVkID0gdGhpcy5fdW5tb2RpZmllZDtcbiAgICAgICAgY2xvbmUuX2NhbGNNYXRyaWNlcygpO1xuICAgICAgICByZXR1cm4gY2xvbmU7XG4gICAgfVxuXG4gICAgZ2V0IG1pblpvb20oKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX21pblpvb207IH1cbiAgICBzZXQgbWluWm9vbSh6b29tOiBudW1iZXIpIHtcbiAgICAgICAgaWYgKHRoaXMuX21pblpvb20gPT09IHpvb20pIHJldHVybjtcbiAgICAgICAgdGhpcy5fbWluWm9vbSA9IHpvb207XG4gICAgICAgIHRoaXMuem9vbSA9IE1hdGgubWF4KHRoaXMuem9vbSwgem9vbSk7XG4gICAgfVxuXG4gICAgZ2V0IG1heFpvb20oKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX21heFpvb207IH1cbiAgICBzZXQgbWF4Wm9vbSh6b29tOiBudW1iZXIpIHtcbiAgICAgICAgaWYgKHRoaXMuX21heFpvb20gPT09IHpvb20pIHJldHVybjtcbiAgICAgICAgdGhpcy5fbWF4Wm9vbSA9IHpvb207XG4gICAgICAgIHRoaXMuem9vbSA9IE1hdGgubWluKHRoaXMuem9vbSwgem9vbSk7XG4gICAgfVxuXG4gICAgZ2V0IHJlbmRlcldvcmxkQ29waWVzKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5fcmVuZGVyV29ybGRDb3BpZXM7IH1cbiAgICBzZXQgcmVuZGVyV29ybGRDb3BpZXMocmVuZGVyV29ybGRDb3BpZXM/OiA/Ym9vbGVhbikge1xuICAgICAgICBpZiAocmVuZGVyV29ybGRDb3BpZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVuZGVyV29ybGRDb3BpZXMgPSB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKHJlbmRlcldvcmxkQ29waWVzID09PSBudWxsKSB7XG4gICAgICAgICAgICByZW5kZXJXb3JsZENvcGllcyA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fcmVuZGVyV29ybGRDb3BpZXMgPSByZW5kZXJXb3JsZENvcGllcztcbiAgICB9XG5cbiAgICBnZXQgd29ybGRTaXplKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLnRpbGVTaXplICogdGhpcy5zY2FsZTtcbiAgICB9XG5cbiAgICBnZXQgY2VudGVyUG9pbnQoKTogUG9pbnQge1xuICAgICAgICByZXR1cm4gdGhpcy5zaXplLl9kaXYoMik7XG4gICAgfVxuXG4gICAgZ2V0IHNpemUoKTogUG9pbnQge1xuICAgICAgICByZXR1cm4gbmV3IFBvaW50KHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0KTtcbiAgICB9XG5cbiAgICBnZXQgYmVhcmluZygpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gLXRoaXMuYW5nbGUgLyBNYXRoLlBJICogMTgwO1xuICAgIH1cbiAgICBzZXQgYmVhcmluZyhiZWFyaW5nOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgYiA9IC13cmFwKGJlYXJpbmcsIC0xODAsIDE4MCkgKiBNYXRoLlBJIC8gMTgwO1xuICAgICAgICBpZiAodGhpcy5hbmdsZSA9PT0gYikgcmV0dXJuO1xuICAgICAgICB0aGlzLl91bm1vZGlmaWVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYW5nbGUgPSBiO1xuICAgICAgICB0aGlzLl9jYWxjTWF0cmljZXMoKTtcblxuICAgICAgICAvLyAyeDIgbWF0cml4IGZvciByb3RhdGluZyBwb2ludHNcbiAgICAgICAgdGhpcy5yb3RhdGlvbk1hdHJpeCA9IG1hdDIuY3JlYXRlKCk7XG4gICAgICAgIG1hdDIucm90YXRlKHRoaXMucm90YXRpb25NYXRyaXgsIHRoaXMucm90YXRpb25NYXRyaXgsIHRoaXMuYW5nbGUpO1xuICAgIH1cblxuICAgIGdldCBwaXRjaCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGl0Y2ggLyBNYXRoLlBJICogMTgwO1xuICAgIH1cbiAgICBzZXQgcGl0Y2gocGl0Y2g6IG51bWJlcikge1xuICAgICAgICBjb25zdCBwID0gY2xhbXAocGl0Y2gsIDAsIDYwKSAvIDE4MCAqIE1hdGguUEk7XG4gICAgICAgIGlmICh0aGlzLl9waXRjaCA9PT0gcCkgcmV0dXJuO1xuICAgICAgICB0aGlzLl91bm1vZGlmaWVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX3BpdGNoID0gcDtcbiAgICAgICAgdGhpcy5fY2FsY01hdHJpY2VzKCk7XG4gICAgfVxuXG4gICAgZ2V0IGZvdigpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5fZm92IC8gTWF0aC5QSSAqIDE4MDtcbiAgICB9XG4gICAgc2V0IGZvdihmb3Y6IG51bWJlcikge1xuICAgICAgICBmb3YgPSBNYXRoLm1heCgwLjAxLCBNYXRoLm1pbig2MCwgZm92KSk7XG4gICAgICAgIGlmICh0aGlzLl9mb3YgPT09IGZvdikgcmV0dXJuO1xuICAgICAgICB0aGlzLl91bm1vZGlmaWVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2ZvdiA9IGZvdiAvIDE4MCAqIE1hdGguUEk7XG4gICAgICAgIHRoaXMuX2NhbGNNYXRyaWNlcygpO1xuICAgIH1cblxuICAgIGdldCB6b29tKCk6IG51bWJlciB7IHJldHVybiB0aGlzLl96b29tOyB9XG4gICAgc2V0IHpvb20oem9vbTogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IHogPSBNYXRoLm1pbihNYXRoLm1heCh6b29tLCB0aGlzLm1pblpvb20pLCB0aGlzLm1heFpvb20pO1xuICAgICAgICBpZiAodGhpcy5fem9vbSA9PT0geikgcmV0dXJuO1xuICAgICAgICB0aGlzLl91bm1vZGlmaWVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX3pvb20gPSB6O1xuICAgICAgICB0aGlzLnNjYWxlID0gdGhpcy56b29tU2NhbGUoeik7XG4gICAgICAgIHRoaXMudGlsZVpvb20gPSBNYXRoLmZsb29yKHopO1xuICAgICAgICB0aGlzLnpvb21GcmFjdGlvbiA9IHogLSB0aGlzLnRpbGVab29tO1xuICAgICAgICB0aGlzLl9jb25zdHJhaW4oKTtcbiAgICAgICAgdGhpcy5fY2FsY01hdHJpY2VzKCk7XG4gICAgfVxuXG4gICAgZ2V0IGNlbnRlcigpOiBMbmdMYXQgeyByZXR1cm4gdGhpcy5fY2VudGVyOyB9XG4gICAgc2V0IGNlbnRlcihjZW50ZXI6IExuZ0xhdCkge1xuICAgICAgICBpZiAoY2VudGVyLmxhdCA9PT0gdGhpcy5fY2VudGVyLmxhdCAmJiBjZW50ZXIubG5nID09PSB0aGlzLl9jZW50ZXIubG5nKSByZXR1cm47XG4gICAgICAgIHRoaXMuX3VubW9kaWZpZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fY2VudGVyID0gY2VudGVyO1xuICAgICAgICB0aGlzLl9jb25zdHJhaW4oKTtcbiAgICAgICAgdGhpcy5fY2FsY01hdHJpY2VzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIGEgem9vbSBsZXZlbCB0aGF0IHdpbGwgY292ZXIgYWxsIHRpbGVzIHRoZSB0cmFuc2Zvcm1cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBvcHRpb25zLnRpbGVTaXplXG4gICAgICogQHBhcmFtIHtib29sZWFufSBvcHRpb25zLnJvdW5kWm9vbVxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IHpvb20gbGV2ZWxcbiAgICAgKi9cbiAgICBjb3ZlcmluZ1pvb21MZXZlbChvcHRpb25zOiB7cm91bmRab29tPzogYm9vbGVhbiwgdGlsZVNpemU6IG51bWJlcn0pIHtcbiAgICAgICAgcmV0dXJuIChvcHRpb25zLnJvdW5kWm9vbSA/IE1hdGgucm91bmQgOiBNYXRoLmZsb29yKShcbiAgICAgICAgICAgIHRoaXMuem9vbSArIHRoaXMuc2NhbGVab29tKHRoaXMudGlsZVNpemUgLyBvcHRpb25zLnRpbGVTaXplKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybiBhbnkgXCJ3cmFwcGVkXCIgY29waWVzIG9mIGEgZ2l2ZW4gdGlsZSBjb29yZGluYXRlIHRoYXQgYXJlIHZpc2libGVcbiAgICAgKiBpbiB0aGUgY3VycmVudCB2aWV3LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBnZXRWaXNpYmxlVW53cmFwcGVkQ29vcmRpbmF0ZXModGlsZUlEOiBDYW5vbmljYWxUaWxlSUQpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gW25ldyBVbndyYXBwZWRUaWxlSUQoMCwgdGlsZUlEKV07XG4gICAgICAgIGlmICh0aGlzLl9yZW5kZXJXb3JsZENvcGllcykge1xuICAgICAgICAgICAgY29uc3QgdXRsID0gdGhpcy5wb2ludENvb3JkaW5hdGUobmV3IFBvaW50KDAsIDApKTtcbiAgICAgICAgICAgIGNvbnN0IHV0ciA9IHRoaXMucG9pbnRDb29yZGluYXRlKG5ldyBQb2ludCh0aGlzLndpZHRoLCAwKSk7XG4gICAgICAgICAgICBjb25zdCB1YmwgPSB0aGlzLnBvaW50Q29vcmRpbmF0ZShuZXcgUG9pbnQodGhpcy53aWR0aCwgdGhpcy5oZWlnaHQpKTtcbiAgICAgICAgICAgIGNvbnN0IHViciA9IHRoaXMucG9pbnRDb29yZGluYXRlKG5ldyBQb2ludCgwLCB0aGlzLmhlaWdodCkpO1xuICAgICAgICAgICAgY29uc3QgdzAgPSBNYXRoLmZsb29yKE1hdGgubWluKHV0bC54LCB1dHIueCwgdWJsLngsIHVici54KSk7XG4gICAgICAgICAgICBjb25zdCB3MSA9IE1hdGguZmxvb3IoTWF0aC5tYXgodXRsLngsIHV0ci54LCB1YmwueCwgdWJyLngpKTtcblxuICAgICAgICAgICAgLy8gQWRkIGFuIGV4dHJhIGNvcHkgb2YgdGhlIHdvcmxkIG9uIGVhY2ggc2lkZSB0byBwcm9wZXJseSByZW5kZXIgSW1hZ2VTb3VyY2VzIGFuZCBDYW52YXNTb3VyY2VzLlxuICAgICAgICAgICAgLy8gQm90aCBzb3VyY2VzIGRyYXcgb3V0c2lkZSB0aGUgdGlsZSBib3VuZGFyaWVzIG9mIHRoZSB0aWxlIHRoYXQgXCJjb250YWlucyB0aGVtXCIgc28gd2UgbmVlZFxuICAgICAgICAgICAgLy8gdG8gYWRkIGV4dHJhIGNvcGllcyBvbiBib3RoIHNpZGVzIGluIGNhc2Ugb2Zmc2NyZWVuIHRpbGVzIG5lZWQgdG8gZHJhdyBpbnRvIG9uLXNjcmVlbiBvbmVzLlxuICAgICAgICAgICAgY29uc3QgZXh0cmFXb3JsZENvcHkgPSAxO1xuXG4gICAgICAgICAgICBmb3IgKGxldCB3ID0gdzAgLSBleHRyYVdvcmxkQ29weTsgdyA8PSB3MSArIGV4dHJhV29ybGRDb3B5OyB3KyspIHtcbiAgICAgICAgICAgICAgICBpZiAodyA9PT0gMCkgY29udGludWU7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobmV3IFVud3JhcHBlZFRpbGVJRCh3LCB0aWxlSUQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybiBhbGwgY29vcmRpbmF0ZXMgdGhhdCBjb3VsZCBjb3ZlciB0aGlzIHRyYW5zZm9ybSBmb3IgYSBjb3ZlcmluZ1xuICAgICAqIHpvb20gbGV2ZWwuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gb3B0aW9ucy50aWxlU2l6ZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBvcHRpb25zLm1pbnpvb21cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gb3B0aW9ucy5tYXh6b29tXG4gICAgICogQHBhcmFtIHtib29sZWFufSBvcHRpb25zLnJvdW5kWm9vbVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gb3B0aW9ucy5yZXBhcnNlT3ZlcnNjYWxlZFxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gb3B0aW9ucy5yZW5kZXJXb3JsZENvcGllc1xuICAgICAqIEByZXR1cm5zIHtBcnJheTxPdmVyc2NhbGVkVGlsZUlEPn0gT3ZlcnNjYWxlZFRpbGVJRHNcbiAgICAgKi9cbiAgICBjb3ZlcmluZ1RpbGVzKFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICB0aWxlU2l6ZTogbnVtYmVyLFxuICAgICAgICAgICAgbWluem9vbT86IG51bWJlcixcbiAgICAgICAgICAgIG1heHpvb20/OiBudW1iZXIsXG4gICAgICAgICAgICByb3VuZFpvb20/OiBib29sZWFuLFxuICAgICAgICAgICAgcmVwYXJzZU92ZXJzY2FsZWQ/OiBib29sZWFuLFxuICAgICAgICAgICAgcmVuZGVyV29ybGRDb3BpZXM/OiBib29sZWFuXG4gICAgICAgIH1cbiAgICApOiBBcnJheTxPdmVyc2NhbGVkVGlsZUlEPiB7XG4gICAgICAgIGxldCB6ID0gdGhpcy5jb3ZlcmluZ1pvb21MZXZlbChvcHRpb25zKTtcbiAgICAgICAgY29uc3QgYWN0dWFsWiA9IHo7XG5cbiAgICAgICAgaWYgKG9wdGlvbnMubWluem9vbSAhPT0gdW5kZWZpbmVkICYmIHogPCBvcHRpb25zLm1pbnpvb20pIHJldHVybiBbXTtcbiAgICAgICAgaWYgKG9wdGlvbnMubWF4em9vbSAhPT0gdW5kZWZpbmVkICYmIHogPiBvcHRpb25zLm1heHpvb20pIHogPSBvcHRpb25zLm1heHpvb207XG5cbiAgICAgICAgY29uc3QgY2VudGVyQ29vcmQgPSBNZXJjYXRvckNvb3JkaW5hdGUuZnJvbUxuZ0xhdCh0aGlzLmNlbnRlcik7XG4gICAgICAgIGNvbnN0IG51bVRpbGVzID0gTWF0aC5wb3coMiwgeik7XG4gICAgICAgIGNvbnN0IGNlbnRlclBvaW50ID0gbmV3IFBvaW50KG51bVRpbGVzICogY2VudGVyQ29vcmQueCAtIDAuNSwgbnVtVGlsZXMgKiBjZW50ZXJDb29yZC55IC0gMC41KTtcbiAgICAgICAgY29uc3QgY29ybmVyQ29vcmRzID0gW1xuICAgICAgICAgICAgdGhpcy5wb2ludENvb3JkaW5hdGUobmV3IFBvaW50KDAsIDApKSxcbiAgICAgICAgICAgIHRoaXMucG9pbnRDb29yZGluYXRlKG5ldyBQb2ludCh0aGlzLndpZHRoLCAwKSksXG4gICAgICAgICAgICB0aGlzLnBvaW50Q29vcmRpbmF0ZShuZXcgUG9pbnQodGhpcy53aWR0aCwgdGhpcy5oZWlnaHQpKSxcbiAgICAgICAgICAgIHRoaXMucG9pbnRDb29yZGluYXRlKG5ldyBQb2ludCgwLCB0aGlzLmhlaWdodCkpXG4gICAgICAgIF07XG4gICAgICAgIHJldHVybiB0aWxlQ292ZXIoeiwgY29ybmVyQ29vcmRzLCBvcHRpb25zLnJlcGFyc2VPdmVyc2NhbGVkID8gYWN0dWFsWiA6IHosIHRoaXMuX3JlbmRlcldvcmxkQ29waWVzKVxuICAgICAgICAgICAgLnNvcnQoKGEsIGIpID0+IGNlbnRlclBvaW50LmRpc3QoYS5jYW5vbmljYWwpIC0gY2VudGVyUG9pbnQuZGlzdChiLmNhbm9uaWNhbCkpO1xuICAgIH1cblxuICAgIHJlc2l6ZSh3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcikge1xuICAgICAgICB0aGlzLndpZHRoID0gd2lkdGg7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xuXG4gICAgICAgIHRoaXMucGl4ZWxzVG9HTFVuaXRzID0gWzIgLyB3aWR0aCwgLTIgLyBoZWlnaHRdO1xuICAgICAgICB0aGlzLl9jb25zdHJhaW4oKTtcbiAgICAgICAgdGhpcy5fY2FsY01hdHJpY2VzKCk7XG4gICAgfVxuXG4gICAgZ2V0IHVubW9kaWZpZWQoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl91bm1vZGlmaWVkOyB9XG5cbiAgICB6b29tU2NhbGUoem9vbTogbnVtYmVyKSB7IHJldHVybiBNYXRoLnBvdygyLCB6b29tKTsgfVxuICAgIHNjYWxlWm9vbShzY2FsZTogbnVtYmVyKSB7IHJldHVybiBNYXRoLmxvZyhzY2FsZSkgLyBNYXRoLkxOMjsgfVxuXG4gICAgcHJvamVjdChsbmdsYXQ6IExuZ0xhdCkge1xuICAgICAgICBjb25zdCBsYXQgPSBjbGFtcChsbmdsYXQubGF0LCAtdGhpcy5tYXhWYWxpZExhdGl0dWRlLCB0aGlzLm1heFZhbGlkTGF0aXR1ZGUpO1xuICAgICAgICByZXR1cm4gbmV3IFBvaW50KFxuICAgICAgICAgICAgICAgIG1lcmNhdG9yWGZyb21MbmcobG5nbGF0LmxuZykgKiB0aGlzLndvcmxkU2l6ZSxcbiAgICAgICAgICAgICAgICBtZXJjYXRvcllmcm9tTGF0KGxhdCkgKiB0aGlzLndvcmxkU2l6ZSk7XG4gICAgfVxuXG4gICAgdW5wcm9qZWN0KHBvaW50OiBQb2ludCk6IExuZ0xhdCB7XG4gICAgICAgIHJldHVybiBuZXcgTWVyY2F0b3JDb29yZGluYXRlKHBvaW50LnggLyB0aGlzLndvcmxkU2l6ZSwgcG9pbnQueSAvIHRoaXMud29ybGRTaXplKS50b0xuZ0xhdCgpO1xuICAgIH1cblxuICAgIGdldCBwb2ludCgpOiBQb2ludCB7IHJldHVybiB0aGlzLnByb2plY3QodGhpcy5jZW50ZXIpOyB9XG5cbiAgICBzZXRMb2NhdGlvbkF0UG9pbnQobG5nbGF0OiBMbmdMYXQsIHBvaW50OiBQb2ludCkge1xuICAgICAgICBjb25zdCBhID0gdGhpcy5wb2ludENvb3JkaW5hdGUocG9pbnQpO1xuICAgICAgICBjb25zdCBiID0gdGhpcy5wb2ludENvb3JkaW5hdGUodGhpcy5jZW50ZXJQb2ludCk7XG4gICAgICAgIGNvbnN0IGxvYyA9IHRoaXMubG9jYXRpb25Db29yZGluYXRlKGxuZ2xhdCk7XG4gICAgICAgIGNvbnN0IG5ld0NlbnRlciA9IG5ldyBNZXJjYXRvckNvb3JkaW5hdGUoXG4gICAgICAgICAgICAgICAgbG9jLnggLSAoYS54IC0gYi54KSxcbiAgICAgICAgICAgICAgICBsb2MueSAtIChhLnkgLSBiLnkpKTtcbiAgICAgICAgdGhpcy5jZW50ZXIgPSB0aGlzLmNvb3JkaW5hdGVMb2NhdGlvbihuZXdDZW50ZXIpO1xuICAgICAgICBpZiAodGhpcy5fcmVuZGVyV29ybGRDb3BpZXMpIHtcbiAgICAgICAgICAgIHRoaXMuY2VudGVyID0gdGhpcy5jZW50ZXIud3JhcCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2l2ZW4gYSBsb2NhdGlvbiwgcmV0dXJuIHRoZSBzY3JlZW4gcG9pbnQgdGhhdCBjb3JyZXNwb25kcyB0byBpdFxuICAgICAqIEBwYXJhbSB7TG5nTGF0fSBsbmdsYXQgbG9jYXRpb25cbiAgICAgKiBAcmV0dXJucyB7UG9pbnR9IHNjcmVlbiBwb2ludFxuICAgICAqL1xuICAgIGxvY2F0aW9uUG9pbnQobG5nbGF0OiBMbmdMYXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29vcmRpbmF0ZVBvaW50KHRoaXMubG9jYXRpb25Db29yZGluYXRlKGxuZ2xhdCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdpdmVuIGEgcG9pbnQgb24gc2NyZWVuLCByZXR1cm4gaXRzIGxuZ2xhdFxuICAgICAqIEBwYXJhbSB7UG9pbnR9IHAgc2NyZWVuIHBvaW50XG4gICAgICogQHJldHVybnMge0xuZ0xhdH0gbG5nbGF0IGxvY2F0aW9uXG4gICAgICovXG4gICAgcG9pbnRMb2NhdGlvbihwOiBQb2ludCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb29yZGluYXRlTG9jYXRpb24odGhpcy5wb2ludENvb3JkaW5hdGUocCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdpdmVuIGEgZ2VvZ3JhcGhpY2FsIGxuZ2xhdCwgcmV0dXJuIGFuIHVucm91bmRlZFxuICAgICAqIGNvb3JkaW5hdGUgdGhhdCByZXByZXNlbnRzIGl0IGF0IHRoaXMgdHJhbnNmb3JtJ3Mgem9vbSBsZXZlbC5cbiAgICAgKiBAcGFyYW0ge0xuZ0xhdH0gbG5nbGF0XG4gICAgICogQHJldHVybnMge0Nvb3JkaW5hdGV9XG4gICAgICovXG4gICAgbG9jYXRpb25Db29yZGluYXRlKGxuZ2xhdDogTG5nTGF0KSB7XG4gICAgICAgIHJldHVybiBNZXJjYXRvckNvb3JkaW5hdGUuZnJvbUxuZ0xhdChsbmdsYXQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdpdmVuIGEgQ29vcmRpbmF0ZSwgcmV0dXJuIGl0cyBnZW9ncmFwaGljYWwgcG9zaXRpb24uXG4gICAgICogQHBhcmFtIHtDb29yZGluYXRlfSBjb29yZFxuICAgICAqIEByZXR1cm5zIHtMbmdMYXR9IGxuZ2xhdFxuICAgICAqL1xuICAgIGNvb3JkaW5hdGVMb2NhdGlvbihjb29yZDogTWVyY2F0b3JDb29yZGluYXRlKSB7XG4gICAgICAgIHJldHVybiBjb29yZC50b0xuZ0xhdCgpO1xuICAgIH1cblxuICAgIHBvaW50Q29vcmRpbmF0ZShwOiBQb2ludCkge1xuICAgICAgICBjb25zdCB0YXJnZXRaID0gMDtcbiAgICAgICAgLy8gc2luY2Ugd2UgZG9uJ3Qga25vdyB0aGUgY29ycmVjdCBwcm9qZWN0ZWQgeiB2YWx1ZSBmb3IgdGhlIHBvaW50LFxuICAgICAgICAvLyB1bnByb2plY3QgdHdvIHBvaW50cyB0byBnZXQgYSBsaW5lIGFuZCB0aGVuIGZpbmQgdGhlIHBvaW50IG9uIHRoYXRcbiAgICAgICAgLy8gbGluZSB3aXRoIHo9MFxuXG4gICAgICAgIGNvbnN0IGNvb3JkMCA9IFtwLngsIHAueSwgMCwgMV07XG4gICAgICAgIGNvbnN0IGNvb3JkMSA9IFtwLngsIHAueSwgMSwgMV07XG5cbiAgICAgICAgdmVjNC50cmFuc2Zvcm1NYXQ0KGNvb3JkMCwgY29vcmQwLCB0aGlzLnBpeGVsTWF0cml4SW52ZXJzZSk7XG4gICAgICAgIHZlYzQudHJhbnNmb3JtTWF0NChjb29yZDEsIGNvb3JkMSwgdGhpcy5waXhlbE1hdHJpeEludmVyc2UpO1xuXG4gICAgICAgIGNvbnN0IHcwID0gY29vcmQwWzNdO1xuICAgICAgICBjb25zdCB3MSA9IGNvb3JkMVszXTtcbiAgICAgICAgY29uc3QgeDAgPSBjb29yZDBbMF0gLyB3MDtcbiAgICAgICAgY29uc3QgeDEgPSBjb29yZDFbMF0gLyB3MTtcbiAgICAgICAgY29uc3QgeTAgPSBjb29yZDBbMV0gLyB3MDtcbiAgICAgICAgY29uc3QgeTEgPSBjb29yZDFbMV0gLyB3MTtcbiAgICAgICAgY29uc3QgejAgPSBjb29yZDBbMl0gLyB3MDtcbiAgICAgICAgY29uc3QgejEgPSBjb29yZDFbMl0gLyB3MTtcblxuICAgICAgICBjb25zdCB0ID0gejAgPT09IHoxID8gMCA6ICh0YXJnZXRaIC0gejApIC8gKHoxIC0gejApO1xuXG4gICAgICAgIHJldHVybiBuZXcgTWVyY2F0b3JDb29yZGluYXRlKFxuICAgICAgICAgICAgaW50ZXJwb2xhdGUoeDAsIHgxLCB0KSAvIHRoaXMud29ybGRTaXplLFxuICAgICAgICAgICAgaW50ZXJwb2xhdGUoeTAsIHkxLCB0KSAvIHRoaXMud29ybGRTaXplKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHaXZlbiBhIGNvb3JkaW5hdGUsIHJldHVybiB0aGUgc2NyZWVuIHBvaW50IHRoYXQgY29ycmVzcG9uZHMgdG8gaXRcbiAgICAgKiBAcGFyYW0ge0Nvb3JkaW5hdGV9IGNvb3JkXG4gICAgICogQHJldHVybnMge1BvaW50fSBzY3JlZW4gcG9pbnRcbiAgICAgKi9cbiAgICBjb29yZGluYXRlUG9pbnQoY29vcmQ6IE1lcmNhdG9yQ29vcmRpbmF0ZSkge1xuICAgICAgICBjb25zdCBwID0gW2Nvb3JkLnggKiB0aGlzLndvcmxkU2l6ZSwgY29vcmQueSAqIHRoaXMud29ybGRTaXplLCAwLCAxXTtcbiAgICAgICAgdmVjNC50cmFuc2Zvcm1NYXQ0KHAsIHAsIHRoaXMucGl4ZWxNYXRyaXgpO1xuICAgICAgICByZXR1cm4gbmV3IFBvaW50KHBbMF0gLyBwWzNdLCBwWzFdIC8gcFszXSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgbWFwJ3MgZ2VvZ3JhcGhpY2FsIGJvdW5kcy4gV2hlbiB0aGUgYmVhcmluZyBvciBwaXRjaCBpcyBub24temVybywgdGhlIHZpc2libGUgcmVnaW9uIGlzIG5vdFxuICAgICAqIGFuIGF4aXMtYWxpZ25lZCByZWN0YW5nbGUsIGFuZCB0aGUgcmVzdWx0IGlzIHRoZSBzbWFsbGVzdCBib3VuZHMgdGhhdCBlbmNvbXBhc3NlcyB0aGUgdmlzaWJsZSByZWdpb24uXG4gICAgICovXG4gICAgZ2V0Qm91bmRzKCk6IExuZ0xhdEJvdW5kcyB7XG4gICAgICAgIHJldHVybiBuZXcgTG5nTGF0Qm91bmRzKClcbiAgICAgICAgICAgIC5leHRlbmQodGhpcy5wb2ludExvY2F0aW9uKG5ldyBQb2ludCgwLCAwKSkpXG4gICAgICAgICAgICAuZXh0ZW5kKHRoaXMucG9pbnRMb2NhdGlvbihuZXcgUG9pbnQodGhpcy53aWR0aCwgMCkpKVxuICAgICAgICAgICAgLmV4dGVuZCh0aGlzLnBvaW50TG9jYXRpb24obmV3IFBvaW50KHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0KSkpXG4gICAgICAgICAgICAuZXh0ZW5kKHRoaXMucG9pbnRMb2NhdGlvbihuZXcgUG9pbnQoMCwgdGhpcy5oZWlnaHQpKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgbWF4aW11bSBnZW9ncmFwaGljYWwgYm91bmRzIHRoZSBtYXAgaXMgY29uc3RyYWluZWQgdG8sIG9yIGBudWxsYCBpZiBub25lIHNldC5cbiAgICAgKi9cbiAgICBnZXRNYXhCb3VuZHMoKTogTG5nTGF0Qm91bmRzIHwgbnVsbCB7XG4gICAgICAgIGlmICghdGhpcy5sYXRSYW5nZSB8fCB0aGlzLmxhdFJhbmdlLmxlbmd0aCAhPT0gMiB8fFxuICAgICAgICAgICAgIXRoaXMubG5nUmFuZ2UgfHwgdGhpcy5sbmdSYW5nZS5sZW5ndGggIT09IDIpIHJldHVybiBudWxsO1xuXG4gICAgICAgIHJldHVybiBuZXcgTG5nTGF0Qm91bmRzKFt0aGlzLmxuZ1JhbmdlWzBdLCB0aGlzLmxhdFJhbmdlWzBdXSwgW3RoaXMubG5nUmFuZ2VbMV0sIHRoaXMubGF0UmFuZ2VbMV1dKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIG9yIGNsZWFycyB0aGUgbWFwJ3MgZ2VvZ3JhcGhpY2FsIGNvbnN0cmFpbnRzLlxuICAgICAqL1xuICAgIHNldE1heEJvdW5kcyhib3VuZHM/OiBMbmdMYXRCb3VuZHMpIHtcbiAgICAgICAgaWYgKGJvdW5kcykge1xuICAgICAgICAgICAgdGhpcy5sbmdSYW5nZSA9IFtib3VuZHMuZ2V0V2VzdCgpLCBib3VuZHMuZ2V0RWFzdCgpXTtcbiAgICAgICAgICAgIHRoaXMubGF0UmFuZ2UgPSBbYm91bmRzLmdldFNvdXRoKCksIGJvdW5kcy5nZXROb3J0aCgpXTtcbiAgICAgICAgICAgIHRoaXMuX2NvbnN0cmFpbigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5sbmdSYW5nZSA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLmxhdFJhbmdlID0gWy10aGlzLm1heFZhbGlkTGF0aXR1ZGUsIHRoaXMubWF4VmFsaWRMYXRpdHVkZV07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYWxjdWxhdGUgdGhlIHBvc01hdHJpeCB0aGF0LCBnaXZlbiBhIHRpbGUgY29vcmRpbmF0ZSwgd291bGQgYmUgdXNlZCB0byBkaXNwbGF5IHRoZSB0aWxlIG9uIGEgbWFwLlxuICAgICAqIEBwYXJhbSB7VW53cmFwcGVkVGlsZUlEfSB1bndyYXBwZWRUaWxlSUQ7XG4gICAgICovXG4gICAgY2FsY3VsYXRlUG9zTWF0cml4KHVud3JhcHBlZFRpbGVJRDogVW53cmFwcGVkVGlsZUlELCBhbGlnbmVkOiBib29sZWFuID0gZmFsc2UpOiBGbG9hdDMyQXJyYXkge1xuICAgICAgICBjb25zdCBwb3NNYXRyaXhLZXkgPSB1bndyYXBwZWRUaWxlSUQua2V5O1xuICAgICAgICBjb25zdCBjYWNoZSA9IGFsaWduZWQgPyB0aGlzLl9hbGlnbmVkUG9zTWF0cml4Q2FjaGUgOiB0aGlzLl9wb3NNYXRyaXhDYWNoZTtcbiAgICAgICAgaWYgKGNhY2hlW3Bvc01hdHJpeEtleV0pIHtcbiAgICAgICAgICAgIHJldHVybiBjYWNoZVtwb3NNYXRyaXhLZXldO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2Fub25pY2FsID0gdW53cmFwcGVkVGlsZUlELmNhbm9uaWNhbDtcbiAgICAgICAgY29uc3Qgc2NhbGUgPSB0aGlzLndvcmxkU2l6ZSAvIHRoaXMuem9vbVNjYWxlKGNhbm9uaWNhbC56KTtcbiAgICAgICAgY29uc3QgdW53cmFwcGVkWCA9IGNhbm9uaWNhbC54ICsgTWF0aC5wb3coMiwgY2Fub25pY2FsLnopICogdW53cmFwcGVkVGlsZUlELndyYXA7XG5cbiAgICAgICAgY29uc3QgcG9zTWF0cml4ID0gbWF0NC5pZGVudGl0eShuZXcgRmxvYXQ2NEFycmF5KDE2KSk7XG4gICAgICAgIG1hdDQudHJhbnNsYXRlKHBvc01hdHJpeCwgcG9zTWF0cml4LCBbdW53cmFwcGVkWCAqIHNjYWxlLCBjYW5vbmljYWwueSAqIHNjYWxlLCAwXSk7XG4gICAgICAgIG1hdDQuc2NhbGUocG9zTWF0cml4LCBwb3NNYXRyaXgsIFtzY2FsZSAvIEVYVEVOVCwgc2NhbGUgLyBFWFRFTlQsIDFdKTtcbiAgICAgICAgbWF0NC5tdWx0aXBseShwb3NNYXRyaXgsIGFsaWduZWQgPyB0aGlzLmFsaWduZWRQcm9qTWF0cml4IDogdGhpcy5wcm9qTWF0cml4LCBwb3NNYXRyaXgpO1xuXG4gICAgICAgIGNhY2hlW3Bvc01hdHJpeEtleV0gPSBuZXcgRmxvYXQzMkFycmF5KHBvc01hdHJpeCk7XG4gICAgICAgIHJldHVybiBjYWNoZVtwb3NNYXRyaXhLZXldO1xuICAgIH1cblxuICAgIGN1c3RvbUxheWVyTWF0cml4KCk6IEFycmF5PG51bWJlcj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5tZXJjYXRvck1hdHJpeC5zbGljZSgpO1xuICAgIH1cblxuICAgIF9jb25zdHJhaW4oKSB7XG4gICAgICAgIGlmICghdGhpcy5jZW50ZXIgfHwgIXRoaXMud2lkdGggfHwgIXRoaXMuaGVpZ2h0IHx8IHRoaXMuX2NvbnN0cmFpbmluZykgcmV0dXJuO1xuXG4gICAgICAgIHRoaXMuX2NvbnN0cmFpbmluZyA9IHRydWU7XG5cbiAgICAgICAgbGV0IG1pblkgPSAtOTA7XG4gICAgICAgIGxldCBtYXhZID0gOTA7XG4gICAgICAgIGxldCBtaW5YID0gLTE4MDtcbiAgICAgICAgbGV0IG1heFggPSAxODA7XG4gICAgICAgIGxldCBzeSwgc3gsIHgyLCB5MjtcbiAgICAgICAgY29uc3Qgc2l6ZSA9IHRoaXMuc2l6ZSxcbiAgICAgICAgICAgIHVubW9kaWZpZWQgPSB0aGlzLl91bm1vZGlmaWVkO1xuXG4gICAgICAgIGlmICh0aGlzLmxhdFJhbmdlKSB7XG4gICAgICAgICAgICBjb25zdCBsYXRSYW5nZSA9IHRoaXMubGF0UmFuZ2U7XG4gICAgICAgICAgICBtaW5ZID0gbWVyY2F0b3JZZnJvbUxhdChsYXRSYW5nZVsxXSkgKiB0aGlzLndvcmxkU2l6ZTtcbiAgICAgICAgICAgIG1heFkgPSBtZXJjYXRvcllmcm9tTGF0KGxhdFJhbmdlWzBdKSAqIHRoaXMud29ybGRTaXplO1xuICAgICAgICAgICAgc3kgPSBtYXhZIC0gbWluWSA8IHNpemUueSA/IHNpemUueSAvIChtYXhZIC0gbWluWSkgOiAwO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMubG5nUmFuZ2UpIHtcbiAgICAgICAgICAgIGNvbnN0IGxuZ1JhbmdlID0gdGhpcy5sbmdSYW5nZTtcbiAgICAgICAgICAgIG1pblggPSBtZXJjYXRvclhmcm9tTG5nKGxuZ1JhbmdlWzBdKSAqIHRoaXMud29ybGRTaXplO1xuICAgICAgICAgICAgbWF4WCA9IG1lcmNhdG9yWGZyb21MbmcobG5nUmFuZ2VbMV0pICogdGhpcy53b3JsZFNpemU7XG4gICAgICAgICAgICBzeCA9IG1heFggLSBtaW5YIDwgc2l6ZS54ID8gc2l6ZS54IC8gKG1heFggLSBtaW5YKSA6IDA7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwb2ludCA9IHRoaXMucG9pbnQ7XG5cbiAgICAgICAgLy8gaG93IG11Y2ggdGhlIG1hcCBzaG91bGQgc2NhbGUgdG8gZml0IHRoZSBzY3JlZW4gaW50byBnaXZlbiBsYXRpdHVkZS9sb25naXR1ZGUgcmFuZ2VzXG4gICAgICAgIGNvbnN0IHMgPSBNYXRoLm1heChzeCB8fCAwLCBzeSB8fCAwKTtcblxuICAgICAgICBpZiAocykge1xuICAgICAgICAgICAgdGhpcy5jZW50ZXIgPSB0aGlzLnVucHJvamVjdChuZXcgUG9pbnQoXG4gICAgICAgICAgICAgICAgc3ggPyAobWF4WCArIG1pblgpIC8gMiA6IHBvaW50LngsXG4gICAgICAgICAgICAgICAgc3kgPyAobWF4WSArIG1pblkpIC8gMiA6IHBvaW50LnkpKTtcbiAgICAgICAgICAgIHRoaXMuem9vbSArPSB0aGlzLnNjYWxlWm9vbShzKTtcbiAgICAgICAgICAgIHRoaXMuX3VubW9kaWZpZWQgPSB1bm1vZGlmaWVkO1xuICAgICAgICAgICAgdGhpcy5fY29uc3RyYWluaW5nID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5sYXRSYW5nZSkge1xuICAgICAgICAgICAgY29uc3QgeSA9IHBvaW50LnksXG4gICAgICAgICAgICAgICAgaDIgPSBzaXplLnkgLyAyO1xuXG4gICAgICAgICAgICBpZiAoeSAtIGgyIDwgbWluWSkgeTIgPSBtaW5ZICsgaDI7XG4gICAgICAgICAgICBpZiAoeSArIGgyID4gbWF4WSkgeTIgPSBtYXhZIC0gaDI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5sbmdSYW5nZSkge1xuICAgICAgICAgICAgY29uc3QgeCA9IHBvaW50LngsXG4gICAgICAgICAgICAgICAgdzIgPSBzaXplLnggLyAyO1xuXG4gICAgICAgICAgICBpZiAoeCAtIHcyIDwgbWluWCkgeDIgPSBtaW5YICsgdzI7XG4gICAgICAgICAgICBpZiAoeCArIHcyID4gbWF4WCkgeDIgPSBtYXhYIC0gdzI7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBwYW4gdGhlIG1hcCBpZiB0aGUgc2NyZWVuIGdvZXMgb2ZmIHRoZSByYW5nZVxuICAgICAgICBpZiAoeDIgIT09IHVuZGVmaW5lZCB8fCB5MiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLmNlbnRlciA9IHRoaXMudW5wcm9qZWN0KG5ldyBQb2ludChcbiAgICAgICAgICAgICAgICB4MiAhPT0gdW5kZWZpbmVkID8geDIgOiBwb2ludC54LFxuICAgICAgICAgICAgICAgIHkyICE9PSB1bmRlZmluZWQgPyB5MiA6IHBvaW50LnkpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3VubW9kaWZpZWQgPSB1bm1vZGlmaWVkO1xuICAgICAgICB0aGlzLl9jb25zdHJhaW5pbmcgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBfY2FsY01hdHJpY2VzKCkge1xuICAgICAgICBpZiAoIXRoaXMuaGVpZ2h0KSByZXR1cm47XG5cbiAgICAgICAgdGhpcy5jYW1lcmFUb0NlbnRlckRpc3RhbmNlID0gMC41IC8gTWF0aC50YW4odGhpcy5fZm92IC8gMikgKiB0aGlzLmhlaWdodDtcblxuICAgICAgICAvLyBGaW5kIHRoZSBkaXN0YW5jZSBmcm9tIHRoZSBjZW50ZXIgcG9pbnQgW3dpZHRoLzIsIGhlaWdodC8yXSB0byB0aGVcbiAgICAgICAgLy8gY2VudGVyIHRvcCBwb2ludCBbd2lkdGgvMiwgMF0gaW4gWiB1bml0cywgdXNpbmcgdGhlIGxhdyBvZiBzaW5lcy5cbiAgICAgICAgLy8gMSBaIHVuaXQgaXMgZXF1aXZhbGVudCB0byAxIGhvcml6b250YWwgcHggYXQgdGhlIGNlbnRlciBvZiB0aGUgbWFwXG4gICAgICAgIC8vICh0aGUgZGlzdGFuY2UgYmV0d2Vlblt3aWR0aC8yLCBoZWlnaHQvMl0gYW5kIFt3aWR0aC8yICsgMSwgaGVpZ2h0LzJdKVxuICAgICAgICBjb25zdCBoYWxmRm92ID0gdGhpcy5fZm92IC8gMjtcbiAgICAgICAgY29uc3QgZ3JvdW5kQW5nbGUgPSBNYXRoLlBJIC8gMiArIHRoaXMuX3BpdGNoO1xuICAgICAgICBjb25zdCB0b3BIYWxmU3VyZmFjZURpc3RhbmNlID0gTWF0aC5zaW4oaGFsZkZvdikgKiB0aGlzLmNhbWVyYVRvQ2VudGVyRGlzdGFuY2UgLyBNYXRoLnNpbihNYXRoLlBJIC0gZ3JvdW5kQW5nbGUgLSBoYWxmRm92KTtcbiAgICAgICAgY29uc3QgcG9pbnQgPSB0aGlzLnBvaW50O1xuICAgICAgICBjb25zdCB4ID0gcG9pbnQueCwgeSA9IHBvaW50Lnk7XG5cbiAgICAgICAgLy8gQ2FsY3VsYXRlIHogZGlzdGFuY2Ugb2YgdGhlIGZhcnRoZXN0IGZyYWdtZW50IHRoYXQgc2hvdWxkIGJlIHJlbmRlcmVkLlxuICAgICAgICBjb25zdCBmdXJ0aGVzdERpc3RhbmNlID0gTWF0aC5jb3MoTWF0aC5QSSAvIDIgLSB0aGlzLl9waXRjaCkgKiB0b3BIYWxmU3VyZmFjZURpc3RhbmNlICsgdGhpcy5jYW1lcmFUb0NlbnRlckRpc3RhbmNlO1xuICAgICAgICAvLyBBZGQgYSBiaXQgZXh0cmEgdG8gYXZvaWQgcHJlY2lzaW9uIHByb2JsZW1zIHdoZW4gYSBmcmFnbWVudCdzIGRpc3RhbmNlIGlzIGV4YWN0bHkgYGZ1cnRoZXN0RGlzdGFuY2VgXG4gICAgICAgIGNvbnN0IGZhclogPSBmdXJ0aGVzdERpc3RhbmNlICogMS4wMTtcblxuICAgICAgICAvLyBtYXRyaXggZm9yIGNvbnZlcnNpb24gZnJvbSBsb2NhdGlvbiB0byBHTCBjb29yZGluYXRlcyAoLTEgLi4gMSlcbiAgICAgICAgbGV0IG0gPSBuZXcgRmxvYXQ2NEFycmF5KDE2KTtcbiAgICAgICAgbWF0NC5wZXJzcGVjdGl2ZShtLCB0aGlzLl9mb3YsIHRoaXMud2lkdGggLyB0aGlzLmhlaWdodCwgMSwgZmFyWik7XG5cbiAgICAgICAgbWF0NC5zY2FsZShtLCBtLCBbMSwgLTEsIDFdKTtcbiAgICAgICAgbWF0NC50cmFuc2xhdGUobSwgbSwgWzAsIDAsIC10aGlzLmNhbWVyYVRvQ2VudGVyRGlzdGFuY2VdKTtcbiAgICAgICAgbWF0NC5yb3RhdGVYKG0sIG0sIHRoaXMuX3BpdGNoKTtcbiAgICAgICAgbWF0NC5yb3RhdGVaKG0sIG0sIHRoaXMuYW5nbGUpO1xuICAgICAgICBtYXQ0LnRyYW5zbGF0ZShtLCBtLCBbLXgsIC15LCAwXSk7XG5cbiAgICAgICAgLy8gVGhlIG1lcmNhdG9yTWF0cml4IGNhbiBiZSB1c2VkIHRvIHRyYW5zZm9ybSBwb2ludHMgZnJvbSBtZXJjYXRvciBjb29yZGluYXRlc1xuICAgICAgICAvLyAoWzAsIDBdIG53LCBbMSwgMV0gc2UpIHRvIEdMIGNvb3JkaW5hdGVzLlxuICAgICAgICB0aGlzLm1lcmNhdG9yTWF0cml4ID0gbWF0NC5zY2FsZShbXSwgbSwgW3RoaXMud29ybGRTaXplLCB0aGlzLndvcmxkU2l6ZSwgdGhpcy53b3JsZFNpemVdKTtcblxuICAgICAgICAvLyBzY2FsZSB2ZXJ0aWNhbGx5IHRvIG1ldGVycyBwZXIgcGl4ZWwgKGludmVyc2Ugb2YgZ3JvdW5kIHJlc29sdXRpb24pOlxuICAgICAgICBtYXQ0LnNjYWxlKG0sIG0sIFsxLCAxLCBtZXJjYXRvclpmcm9tQWx0aXR1ZGUoMSwgdGhpcy5jZW50ZXIubGF0KSAqIHRoaXMud29ybGRTaXplLCAxXSk7XG5cbiAgICAgICAgdGhpcy5wcm9qTWF0cml4ID0gbTtcblxuICAgICAgICAvLyBNYWtlIGEgc2Vjb25kIHByb2plY3Rpb24gbWF0cml4IHRoYXQgaXMgYWxpZ25lZCB0byBhIHBpeGVsIGdyaWQgZm9yIHJlbmRlcmluZyByYXN0ZXIgdGlsZXMuXG4gICAgICAgIC8vIFdlJ3JlIHJvdW5kaW5nIHRoZSAoZmxvYXRpbmcgcG9pbnQpIHgveSB2YWx1ZXMgdG8gYWNoaWV2ZSB0byBhdm9pZCByZW5kZXJpbmcgcmFzdGVyIGltYWdlcyB0byBmcmFjdGlvbmFsXG4gICAgICAgIC8vIGNvb3JkaW5hdGVzLiBBZGRpdGlvbmFsbHksIHdlIGFkanVzdCBieSBoYWxmIGEgcGl4ZWwgaW4gZWl0aGVyIGRpcmVjdGlvbiBpbiBjYXNlIHRoYXQgdmlld3BvcnQgZGltZW5zaW9uXG4gICAgICAgIC8vIGlzIGFuIG9kZCBpbnRlZ2VyIHRvIHByZXNlcnZlIHJlbmRlcmluZyB0byB0aGUgcGl4ZWwgZ3JpZC4gV2UncmUgcm90YXRpbmcgdGhpcyBzaGlmdCBiYXNlZCBvbiB0aGUgYW5nbGVcbiAgICAgICAgLy8gb2YgdGhlIHRyYW5zZm9ybWF0aW9uIHNvIHRoYXQgMMOCwrAsIDkww4LCsCwgMTgww4LCsCwgYW5kIDI3MMOCwrAgcmFzdGVycyBhcmUgY3Jpc3AsIGFuZCBhZGp1c3QgdGhlIHNoaWZ0IHNvIHRoYXRcbiAgICAgICAgLy8gaXQgaXMgYWx3YXlzIDw9IDAuNSBwaXhlbHMuXG4gICAgICAgIGNvbnN0IHhTaGlmdCA9ICh0aGlzLndpZHRoICUgMikgLyAyLCB5U2hpZnQgPSAodGhpcy5oZWlnaHQgJSAyKSAvIDIsXG4gICAgICAgICAgICBhbmdsZUNvcyA9IE1hdGguY29zKHRoaXMuYW5nbGUpLCBhbmdsZVNpbiA9IE1hdGguc2luKHRoaXMuYW5nbGUpLFxuICAgICAgICAgICAgZHggPSB4IC0gTWF0aC5yb3VuZCh4KSArIGFuZ2xlQ29zICogeFNoaWZ0ICsgYW5nbGVTaW4gKiB5U2hpZnQsXG4gICAgICAgICAgICBkeSA9IHkgLSBNYXRoLnJvdW5kKHkpICsgYW5nbGVDb3MgKiB5U2hpZnQgKyBhbmdsZVNpbiAqIHhTaGlmdDtcbiAgICAgICAgY29uc3QgYWxpZ25lZE0gPSBuZXcgRmxvYXQ2NEFycmF5KG0pO1xuICAgICAgICBtYXQ0LnRyYW5zbGF0ZShhbGlnbmVkTSwgYWxpZ25lZE0sIFsgZHggPiAwLjUgPyBkeCAtIDEgOiBkeCwgZHkgPiAwLjUgPyBkeSAtIDEgOiBkeSwgMCBdKTtcbiAgICAgICAgdGhpcy5hbGlnbmVkUHJvak1hdHJpeCA9IGFsaWduZWRNO1xuXG4gICAgICAgIG0gPSBtYXQ0LmNyZWF0ZSgpO1xuICAgICAgICBtYXQ0LnNjYWxlKG0sIG0sIFt0aGlzLndpZHRoIC8gMiwgLXRoaXMuaGVpZ2h0IC8gMiwgMV0pO1xuICAgICAgICBtYXQ0LnRyYW5zbGF0ZShtLCBtLCBbMSwgLTEsIDBdKTtcbiAgICAgICAgdGhpcy5sYWJlbFBsYW5lTWF0cml4ID0gbTtcblxuICAgICAgICBtID0gbWF0NC5jcmVhdGUoKTtcbiAgICAgICAgbWF0NC5zY2FsZShtLCBtLCBbMSwgLTEsIDFdKTtcbiAgICAgICAgbWF0NC50cmFuc2xhdGUobSwgbSwgWy0xLCAtMSwgMF0pO1xuICAgICAgICBtYXQ0LnNjYWxlKG0sIG0sIFsyIC8gdGhpcy53aWR0aCwgMiAvIHRoaXMuaGVpZ2h0LCAxXSk7XG4gICAgICAgIHRoaXMuZ2xDb29yZE1hdHJpeCA9IG07XG5cbiAgICAgICAgLy8gbWF0cml4IGZvciBjb252ZXJzaW9uIGZyb20gbG9jYXRpb24gdG8gc2NyZWVuIGNvb3JkaW5hdGVzXG4gICAgICAgIHRoaXMucGl4ZWxNYXRyaXggPSBtYXQ0Lm11bHRpcGx5KG5ldyBGbG9hdDY0QXJyYXkoMTYpLCB0aGlzLmxhYmVsUGxhbmVNYXRyaXgsIHRoaXMucHJvak1hdHJpeCk7XG5cbiAgICAgICAgLy8gaW52ZXJzZSBtYXRyaXggZm9yIGNvbnZlcnNpb24gZnJvbSBzY3JlZW4gY29vcmRpbmFlcyB0byBsb2NhdGlvblxuICAgICAgICBtID0gbWF0NC5pbnZlcnQobmV3IEZsb2F0NjRBcnJheSgxNiksIHRoaXMucGl4ZWxNYXRyaXgpO1xuICAgICAgICBpZiAoIW0pIHRocm93IG5ldyBFcnJvcihcImZhaWxlZCB0byBpbnZlcnQgbWF0cml4XCIpO1xuICAgICAgICB0aGlzLnBpeGVsTWF0cml4SW52ZXJzZSA9IG07XG5cbiAgICAgICAgdGhpcy5fcG9zTWF0cml4Q2FjaGUgPSB7fTtcbiAgICAgICAgdGhpcy5fYWxpZ25lZFBvc01hdHJpeENhY2hlID0ge307XG4gICAgfVxuXG4gICAgbWF4UGl0Y2hTY2FsZUZhY3RvcigpIHtcbiAgICAgICAgLy8gY2FsY01hdHJpY2VzIGhhc24ndCBydW4geWV0XG4gICAgICAgIGlmICghdGhpcy5waXhlbE1hdHJpeEludmVyc2UpIHJldHVybiAxO1xuXG4gICAgICAgIGNvbnN0IGNvb3JkID0gdGhpcy5wb2ludENvb3JkaW5hdGUobmV3IFBvaW50KDAsIDApKTtcbiAgICAgICAgY29uc3QgcCA9IFtjb29yZC54ICogdGhpcy53b3JsZFNpemUsIGNvb3JkLnkgKiB0aGlzLndvcmxkU2l6ZSwgMCwgMV07XG4gICAgICAgIGNvbnN0IHRvcFBvaW50ID0gdmVjNC50cmFuc2Zvcm1NYXQ0KHAsIHAsIHRoaXMucGl4ZWxNYXRyaXgpO1xuICAgICAgICByZXR1cm4gdG9wUG9pbnRbM10gLyB0aGlzLmNhbWVyYVRvQ2VudGVyRGlzdGFuY2U7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBUaGUgY2FtZXJhIGxvb2tzIGF0IHRoZSBtYXAgZnJvbSBhIDNEIChsbmcsIGxhdCwgYWx0aXR1ZGUpIGxvY2F0aW9uLiBMZXQncyB1c2UgYGNhbWVyYUxvY2F0aW9uYFxuICAgICAqIGFzIHRoZSBuYW1lIGZvciB0aGUgbG9jYXRpb24gdW5kZXIgdGhlIGNhbWVyYSBhbmQgb24gdGhlIHN1cmZhY2Ugb2YgdGhlIGVhcnRoIChsbmcsIGxhdCwgMCkuXG4gICAgICogYGNhbWVyYVBvaW50YCBpcyB0aGUgcHJvamVjdGVkIHBvc2l0aW9uIG9mIHRoZSBgY2FtZXJhTG9jYXRpb25gLlxuICAgICAqXG4gICAgICogVGhpcyBwb2ludCBpcyB1c2VmdWwgdG8gdXMgYmVjYXVzZSBvbmx5IGZpbGwtZXh0cnVzaW9ucyB0aGF0IGFyZSBiZXR3ZWVuIGBjYW1lcmFQb2ludGAgYW5kXG4gICAgICogdGhlIHF1ZXJ5IHBvaW50IG9uIHRoZSBzdXJmYWNlIG9mIHRoZSBlYXJ0aCBjYW4gZXh0ZW5kIGFuZCBpbnRlcnNlY3QgdGhlIHF1ZXJ5LlxuICAgICAqXG4gICAgICogV2hlbiB0aGUgbWFwIGlzIG5vdCBwaXRjaGVkIHRoZSBgY2FtZXJhUG9pbnRgIGlzIGVxdWl2YWxlbnQgdG8gdGhlIGNlbnRlciBvZiB0aGUgbWFwIGJlY2F1c2VcbiAgICAgKiB0aGUgY2FtZXJhIGlzIHJpZ2h0IGFib3ZlIHRoZSBjZW50ZXIgb2YgdGhlIG1hcC5cbiAgICAgKi9cbiAgICBnZXRDYW1lcmFQb2ludCgpIHtcbiAgICAgICAgY29uc3QgcGl0Y2ggPSB0aGlzLl9waXRjaDtcbiAgICAgICAgY29uc3QgeU9mZnNldCA9IE1hdGgudGFuKHBpdGNoKSAqICh0aGlzLmNhbWVyYVRvQ2VudGVyRGlzdGFuY2UgfHwgMSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNlbnRlclBvaW50LmFkZChuZXcgUG9pbnQoMCwgeU9mZnNldCkpO1xuICAgIH1cblxuICAgIC8qXG4gICAgICogV2hlbiB0aGUgbWFwIGlzIHBpdGNoZWQsIHNvbWUgb2YgdGhlIDNEIGZlYXR1cmVzIHRoYXQgaW50ZXJzZWN0IGEgcXVlcnkgd2lsbCBub3QgaW50ZXJzZWN0XG4gICAgICogdGhlIHF1ZXJ5IGF0IHRoZSBzdXJmYWNlIG9mIHRoZSBlYXJ0aC4gSW5zdGVhZCB0aGUgZmVhdHVyZSBtYXkgYmUgY2xvc2VyIGFuZCBvbmx5IGludGVyc2VjdFxuICAgICAqIHRoZSBxdWVyeSBiZWNhdXNlIGl0IGV4dHJ1ZGVzIGludG8gdGhlIGFpci5cbiAgICAgKlxuICAgICAqIFRoaXMgcmV0dXJucyBhIGdlb21ldHJ5IHRoYXQgaW5jbHVkZXMgYWxsIG9mIHRoZSBvcmlnaW5hbCBxdWVyeSBhcyB3ZWxsIGFzIGFsbCBwb3NzaWJsZSBhcmVzIG9mIHRoZVxuICAgICAqIHNjcmVlbiB3aGVyZSB0aGUgKmJhc2UqIG9mIGEgdmlzaWJsZSBleHRydXNpb24gY291bGQgYmUuXG4gICAgICogIC0gRm9yIHBvaW50IHF1ZXJpZXMsIHRoZSBsaW5lIGZyb20gdGhlIHF1ZXJ5IHBvaW50IHRvIHRoZSBcImNhbWVyYSBwb2ludFwiXG4gICAgICogIC0gRm9yIG90aGVyIGdlb21ldHJpZXMsIHRoZSBlbnZlbG9wZSBvZiB0aGUgcXVlcnkgZ2VvbWV0cnkgYW5kIHRoZSBcImNhbWVyYSBwb2ludFwiXG4gICAgICovXG4gICAgZ2V0Q2FtZXJhUXVlcnlHZW9tZXRyeShxdWVyeUdlb21ldHJ5OiBBcnJheTxQb2ludD4pOiBBcnJheTxQb2ludD4ge1xuICAgICAgICBjb25zdCBjID0gdGhpcy5nZXRDYW1lcmFQb2ludCgpO1xuXG4gICAgICAgIGlmIChxdWVyeUdlb21ldHJ5Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgcmV0dXJuIFtxdWVyeUdlb21ldHJ5WzBdLCBjXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBtaW5YID0gYy54O1xuICAgICAgICAgICAgbGV0IG1pblkgPSBjLnk7XG4gICAgICAgICAgICBsZXQgbWF4WCA9IGMueDtcbiAgICAgICAgICAgIGxldCBtYXhZID0gYy55O1xuICAgICAgICAgICAgZm9yIChjb25zdCBwIG9mIHF1ZXJ5R2VvbWV0cnkpIHtcbiAgICAgICAgICAgICAgICBtaW5YID0gTWF0aC5taW4obWluWCwgcC54KTtcbiAgICAgICAgICAgICAgICBtaW5ZID0gTWF0aC5taW4obWluWSwgcC55KTtcbiAgICAgICAgICAgICAgICBtYXhYID0gTWF0aC5tYXgobWF4WCwgcC54KTtcbiAgICAgICAgICAgICAgICBtYXhZID0gTWF0aC5tYXgobWF4WSwgcC55KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgbmV3IFBvaW50KG1pblgsIG1pblkpLFxuICAgICAgICAgICAgICAgIG5ldyBQb2ludChtYXhYLCBtaW5ZKSxcbiAgICAgICAgICAgICAgICBuZXcgUG9pbnQobWF4WCwgbWF4WSksXG4gICAgICAgICAgICAgICAgbmV3IFBvaW50KG1pblgsIG1heFkpLFxuICAgICAgICAgICAgICAgIG5ldyBQb2ludChtaW5YLCBtaW5ZKVxuICAgICAgICAgICAgXTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgVHJhbnNmb3JtO1xuIiwiLy8gQGZsb3dcblxuLyoqXG4gKiBUaHJvdHRsZSB0aGUgZ2l2ZW4gZnVuY3Rpb24gdG8gcnVuIGF0IG1vc3QgZXZlcnkgYHBlcmlvZGAgbWlsbGlzZWNvbmRzLlxuIFRocm90dGxlIHRoZSBnaXZlbiBmdW5jdGlvbiB0byBydW4gYXQgbW9zdCBldmVyeSBwZXJpb2QgbWlsbGlzZWNvbmRzLlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdGhyb3R0bGUoZm46ICgpID0+IHZvaWQsIHRpbWU6IG51bWJlcik6ICgpID0+IFRpbWVvdXRJRCB7XG4gICAgbGV0IHBlbmRpbmcgPSBmYWxzZTtcbiAgICBsZXQgdGltZXJJZDogVGltZW91dElEID0gKDA6IGFueSk7XG5cbiAgICBjb25zdCBsYXRlciA9ICgpID0+IHtcbiAgICAgICAgdGltZXJJZCA9ICgwOiBhbnkpO1xuICAgICAgICBpZiAocGVuZGluZykge1xuICAgICAgICAgICAgZm4oKTtcbiAgICAgICAgICAgIHRpbWVySWQgPSBzZXRUaW1lb3V0KGxhdGVyLCB0aW1lKTtcbiAgICAgICAgICAgIHBlbmRpbmcgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBwZW5kaW5nID0gdHJ1ZTtcbiAgICAgICAgaWYgKCF0aW1lcklkKSB7XG4gICAgICAgICAgICBsYXRlcigpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aW1lcklkO1xuICAgIH07XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgeyBiaW5kQWxsIH0gZnJvbSAnLi4vdXRpbC91dGlsJztcbmltcG9ydCB3aW5kb3cgZnJvbSAnLi4vdXRpbC93aW5kb3cnO1xuaW1wb3J0IHRocm90dGxlIGZyb20gJy4uL3V0aWwvdGhyb3R0bGUnO1xuXG5pbXBvcnQgdHlwZSBNYXAgZnJvbSAnLi9tYXAnO1xuXG4vKlxuICogQWRkcyB0aGUgbWFwJ3MgcG9zaXRpb24gdG8gaXRzIHBhZ2UncyBsb2NhdGlvbiBoYXNoLlxuICogUGFzc2VkIGFzIGFuIG9wdGlvbiB0byB0aGUgbWFwIG9iamVjdC5cbiAqXG4gKiBAcmV0dXJucyB7SGFzaH0gYHRoaXNgXG4gKi9cbmNsYXNzIEhhc2gge1xuICAgIF9tYXA6IE1hcDtcbiAgICBfdXBkYXRlSGFzaDogKCkgPT4gVGltZW91dElEO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIGJpbmRBbGwoW1xuICAgICAgICAgICAgJ19vbkhhc2hDaGFuZ2UnLFxuICAgICAgICAgICAgJ191cGRhdGVIYXNoJ1xuICAgICAgICBdLCB0aGlzKTtcblxuICAgICAgICAvLyBNb2JpbGUgU2FmYXJpIGRvZXNuJ3QgYWxsb3cgdXBkYXRpbmcgdGhlIGhhc2ggbW9yZSB0aGFuIDEwMCB0aW1lcyBwZXIgMzAgc2Vjb25kcy5cbiAgICAgICAgdGhpcy5fdXBkYXRlSGFzaCA9IHRocm90dGxlKHRoaXMuX3VwZGF0ZUhhc2hVbnRocm90dGxlZC5iaW5kKHRoaXMpLCAzMCAqIDEwMDAgLyAxMDApO1xuICAgIH1cblxuICAgIC8qXG4gICAgICogTWFwIGVsZW1lbnQgdG8gbGlzdGVuIGZvciBjb29yZGluYXRlIGNoYW5nZXNcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBtYXBcbiAgICAgKiBAcmV0dXJucyB7SGFzaH0gYHRoaXNgXG4gICAgICovXG4gICAgYWRkVG8obWFwOiBNYXApIHtcbiAgICAgICAgdGhpcy5fbWFwID0gbWFwO1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignaGFzaGNoYW5nZScsIHRoaXMuX29uSGFzaENoYW5nZSwgZmFsc2UpO1xuICAgICAgICB0aGlzLl9tYXAub24oJ21vdmVlbmQnLCB0aGlzLl91cGRhdGVIYXNoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBSZW1vdmVzIGhhc2hcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtQb3B1cH0gYHRoaXNgXG4gICAgICovXG4gICAgcmVtb3ZlKCkge1xuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignaGFzaGNoYW5nZScsIHRoaXMuX29uSGFzaENoYW5nZSwgZmFsc2UpO1xuICAgICAgICB0aGlzLl9tYXAub2ZmKCdtb3ZlZW5kJywgdGhpcy5fdXBkYXRlSGFzaCk7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl91cGRhdGVIYXNoKCkpO1xuXG4gICAgICAgIGRlbGV0ZSB0aGlzLl9tYXA7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGdldEhhc2hTdHJpbmcobWFwRmVlZGJhY2s/OiBib29sZWFuKSB7XG4gICAgICAgIGNvbnN0IGNlbnRlciA9IHRoaXMuX21hcC5nZXRDZW50ZXIoKSxcbiAgICAgICAgICAgIHpvb20gPSBNYXRoLnJvdW5kKHRoaXMuX21hcC5nZXRab29tKCkgKiAxMDApIC8gMTAwLFxuICAgICAgICAgICAgLy8gZGVyaXZlZCBmcm9tIGVxdWF0aW9uOiA1MTJweCAqIDJeeiAvIDM2MCAvIDEwXmQgPCAwLjVweFxuICAgICAgICAgICAgcHJlY2lzaW9uID0gTWF0aC5jZWlsKCh6b29tICogTWF0aC5MTjIgKyBNYXRoLmxvZyg1MTIgLyAzNjAgLyAwLjUpKSAvIE1hdGguTE4xMCksXG4gICAgICAgICAgICBtID0gTWF0aC5wb3coMTAsIHByZWNpc2lvbiksXG4gICAgICAgICAgICBsbmcgPSBNYXRoLnJvdW5kKGNlbnRlci5sbmcgKiBtKSAvIG0sXG4gICAgICAgICAgICBsYXQgPSBNYXRoLnJvdW5kKGNlbnRlci5sYXQgKiBtKSAvIG0sXG4gICAgICAgICAgICBiZWFyaW5nID0gdGhpcy5fbWFwLmdldEJlYXJpbmcoKSxcbiAgICAgICAgICAgIHBpdGNoID0gdGhpcy5fbWFwLmdldFBpdGNoKCk7XG4gICAgICAgIGxldCBoYXNoID0gJyc7XG4gICAgICAgIGlmIChtYXBGZWVkYmFjaykge1xuICAgICAgICAgICAgLy8gbmV3IG1hcCBmZWVkYmFjayBzaXRlIGhhcyBzb21lIGNvbnN0cmFpbnRzIHRoYXQgZG9uJ3QgYWxsb3dcbiAgICAgICAgICAgIC8vIHVzIHRvIHVzZSB0aGUgc2FtZSBoYXNoIGZvcm1hdCBhcyB3ZSBkbyBmb3IgdGhlIE1hcCBoYXNoIG9wdGlvbi5cbiAgICAgICAgICAgIGhhc2ggKz0gYCMvJHtsbmd9LyR7bGF0fS8ke3pvb219YDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGhhc2ggKz0gYCMke3pvb219LyR7bGF0fS8ke2xuZ31gO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGJlYXJpbmcgfHwgcGl0Y2gpIGhhc2ggKz0gKGAvJHtNYXRoLnJvdW5kKGJlYXJpbmcgKiAxMCkgLyAxMH1gKTtcbiAgICAgICAgaWYgKHBpdGNoKSBoYXNoICs9IChgLyR7TWF0aC5yb3VuZChwaXRjaCl9YCk7XG4gICAgICAgIHJldHVybiBoYXNoO1xuICAgIH1cblxuICAgIF9vbkhhc2hDaGFuZ2UoKSB7XG4gICAgICAgIGNvbnN0IGxvYyA9IHdpbmRvdy5sb2NhdGlvbi5oYXNoLnJlcGxhY2UoJyMnLCAnJykuc3BsaXQoJy8nKTtcbiAgICAgICAgaWYgKGxvYy5sZW5ndGggPj0gMykge1xuICAgICAgICAgICAgdGhpcy5fbWFwLmp1bXBUbyh7XG4gICAgICAgICAgICAgICAgY2VudGVyOiBbK2xvY1syXSwgK2xvY1sxXV0sXG4gICAgICAgICAgICAgICAgem9vbTogK2xvY1swXSxcbiAgICAgICAgICAgICAgICBiZWFyaW5nOiArKGxvY1szXSB8fCAwKSxcbiAgICAgICAgICAgICAgICBwaXRjaDogKyhsb2NbNF0gfHwgMClcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIF91cGRhdGVIYXNoVW50aHJvdHRsZWQoKSB7XG4gICAgICAgIGNvbnN0IGhhc2ggPSB0aGlzLmdldEhhc2hTdHJpbmcoKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHdpbmRvdy5oaXN0b3J5LnJlcGxhY2VTdGF0ZSh3aW5kb3cuaGlzdG9yeS5zdGF0ZSwgJycsIGhhc2gpO1xuICAgICAgICB9IGNhdGNoIChTZWN1cml0eUVycm9yKSB7XG4gICAgICAgICAgICAvLyBJRTExIGRvZXMgbm90IGFsbG93IHRoaXMgaWYgdGhlIHBhZ2UgaXMgd2l0aGluIGFuIGlmcmFtZSBjcmVhdGVkXG4gICAgICAgICAgICAvLyB3aXRoIGlmcmFtZS5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKC4uLikuXG4gICAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L21hcGJveC1nbC1qcy9pc3N1ZXMvNzQxMFxuICAgICAgICB9XG4gICAgfVxuXG59XG5cbmV4cG9ydCBkZWZhdWx0IEhhc2g7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgeyBFdmVudCB9IGZyb20gJy4uL3V0aWwvZXZlbnRlZCc7XG5cbmltcG9ydCBET00gZnJvbSAnLi4vdXRpbC9kb20nO1xuaW1wb3J0IFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuaW1wb3J0IHsgZXh0ZW5kIH0gZnJvbSAnLi4vdXRpbC91dGlsJztcblxuaW1wb3J0IHR5cGUgTWFwIGZyb20gJy4vbWFwJztcbmltcG9ydCB0eXBlIExuZ0xhdCBmcm9tICcuLi9nZW8vbG5nX2xhdCc7XG5cbi8qKlxuICogYE1hcE1vdXNlRXZlbnRgIGlzIHRoZSBldmVudCB0eXBlIGZvciBtb3VzZS1yZWxhdGVkIG1hcCBldmVudHMuXG4gKiBAZXh0ZW5kcyB7T2JqZWN0fVxuICovXG5leHBvcnQgY2xhc3MgTWFwTW91c2VFdmVudCBleHRlbmRzIEV2ZW50IHtcbiAgICAvKipcbiAgICAgKiBUaGUgZXZlbnQgdHlwZS5cbiAgICAgKi9cbiAgICB0eXBlOiAnbW91c2Vkb3duJ1xuICAgICAgICB8ICdtb3VzZXVwJ1xuICAgICAgICB8ICdjbGljaydcbiAgICAgICAgfCAnZGJsY2xpY2snXG4gICAgICAgIHwgJ21vdXNlbW92ZSdcbiAgICAgICAgfCAnbW91c2VvdmVyJ1xuICAgICAgICB8ICdtb3VzZWVudGVyJ1xuICAgICAgICB8ICdtb3VzZWxlYXZlJ1xuICAgICAgICB8ICdtb3VzZW91dCdcbiAgICAgICAgfCAnY29udGV4dG1lbnUnO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGBNYXBgIG9iamVjdCB0aGF0IGZpcmVkIHRoZSBldmVudC5cbiAgICAgKi9cbiAgICB0YXJnZXQ6IE1hcDtcblxuICAgIC8qKlxuICAgICAqIFRoZSBET00gZXZlbnQgd2hpY2ggY2F1c2VkIHRoZSBtYXAgZXZlbnQuXG4gICAgICovXG4gICAgb3JpZ2luYWxFdmVudDogTW91c2VFdmVudDtcblxuICAgIC8qKlxuICAgICAqIFRoZSBwaXhlbCBjb29yZGluYXRlcyBvZiB0aGUgbW91c2UgY3Vyc29yLCByZWxhdGl2ZSB0byB0aGUgbWFwIGFuZCBtZWFzdXJlZCBmcm9tIHRoZSB0b3AgbGVmdCBjb3JuZXIuXG4gICAgICovXG4gICAgcG9pbnQ6IFBvaW50O1xuXG4gICAgLyoqXG4gICAgICogVGhlIGdlb2dyYXBoaWMgbG9jYXRpb24gb24gdGhlIG1hcCBvZiB0aGUgbW91c2UgY3Vyc29yLlxuICAgICAqL1xuICAgIGxuZ0xhdDogTG5nTGF0O1xuXG4gICAgLyoqXG4gICAgICogUHJldmVudHMgc3Vic2VxdWVudCBkZWZhdWx0IHByb2Nlc3Npbmcgb2YgdGhlIGV2ZW50IGJ5IHRoZSBtYXAuXG4gICAgICpcbiAgICAgKiBDYWxsaW5nIHRoaXMgbWV0aG9kIHdpbGwgcHJldmVudCB0aGUgZm9sbG93aW5nIGRlZmF1bHQgbWFwIGJlaGF2aW9yczpcbiAgICAgKlxuICAgICAqICAgKiBPbiBgbW91c2Vkb3duYCBldmVudHMsIHRoZSBiZWhhdmlvciBvZiB7QGxpbmsgRHJhZ1BhbkhhbmRsZXJ9XG4gICAgICogICAqIE9uIGBtb3VzZWRvd25gIGV2ZW50cywgdGhlIGJlaGF2aW9yIG9mIHtAbGluayBEcmFnUm90YXRlSGFuZGxlcn1cbiAgICAgKiAgICogT24gYG1vdXNlZG93bmAgZXZlbnRzLCB0aGUgYmVoYXZpb3Igb2Yge0BsaW5rIEJveFpvb21IYW5kbGVyfVxuICAgICAqICAgKiBPbiBgZGJsY2xpY2tgIGV2ZW50cywgdGhlIGJlaGF2aW9yIG9mIHtAbGluayBEb3VibGVDbGlja1pvb21IYW5kbGVyfVxuICAgICAqXG4gICAgICovXG4gICAgcHJldmVudERlZmF1bHQoKSB7XG4gICAgICAgIHRoaXMuX2RlZmF1bHRQcmV2ZW50ZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGB0cnVlYCBpZiBgcHJldmVudERlZmF1bHRgIGhhcyBiZWVuIGNhbGxlZC5cbiAgICAgKi9cbiAgICBnZXQgZGVmYXVsdFByZXZlbnRlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZmF1bHRQcmV2ZW50ZWQ7XG4gICAgfVxuXG4gICAgX2RlZmF1bHRQcmV2ZW50ZWQ6IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHR5cGU6IHN0cmluZywgbWFwOiBNYXAsIG9yaWdpbmFsRXZlbnQ6IE1vdXNlRXZlbnQsIGRhdGE6IE9iamVjdCA9IHt9KSB7XG4gICAgICAgIGNvbnN0IHBvaW50ID0gRE9NLm1vdXNlUG9zKG1hcC5nZXRDYW52YXNDb250YWluZXIoKSwgb3JpZ2luYWxFdmVudCk7XG4gICAgICAgIGNvbnN0IGxuZ0xhdCA9IG1hcC51bnByb2plY3QocG9pbnQpO1xuICAgICAgICBzdXBlcih0eXBlLCBleHRlbmQoeyBwb2ludCwgbG5nTGF0LCBvcmlnaW5hbEV2ZW50IH0sIGRhdGEpKTtcbiAgICAgICAgdGhpcy5fZGVmYXVsdFByZXZlbnRlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnRhcmdldCA9IG1hcDtcbiAgICB9XG59XG5cbi8qKlxuICogYE1hcFRvdWNoRXZlbnRgIGlzIHRoZSBldmVudCB0eXBlIGZvciB0b3VjaC1yZWxhdGVkIG1hcCBldmVudHMuXG4gKiBAZXh0ZW5kcyB7T2JqZWN0fVxuICovXG5leHBvcnQgY2xhc3MgTWFwVG91Y2hFdmVudCBleHRlbmRzIEV2ZW50IHtcbiAgICAvKipcbiAgICAgKiBUaGUgZXZlbnQgdHlwZS5cbiAgICAgKi9cbiAgICB0eXBlOiAndG91Y2hzdGFydCdcbiAgICAgICAgfCAndG91Y2hlbmQnXG4gICAgICAgIHwgJ3RvdWNoY2FuY2VsJztcblxuICAgIC8qKlxuICAgICAqIFRoZSBgTWFwYCBvYmplY3QgdGhhdCBmaXJlZCB0aGUgZXZlbnQuXG4gICAgICovXG4gICAgdGFyZ2V0OiBNYXA7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgRE9NIGV2ZW50IHdoaWNoIGNhdXNlZCB0aGUgbWFwIGV2ZW50LlxuICAgICAqL1xuICAgIG9yaWdpbmFsRXZlbnQ6IFRvdWNoRXZlbnQ7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZ2VvZ3JhcGhpYyBsb2NhdGlvbiBvbiB0aGUgbWFwIG9mIHRoZSBjZW50ZXIgb2YgdGhlIHRvdWNoIGV2ZW50IHBvaW50cy5cbiAgICAgKi9cbiAgICBsbmdMYXQ6IExuZ0xhdDtcblxuICAgIC8qKlxuICAgICAqIFRoZSBwaXhlbCBjb29yZGluYXRlcyBvZiB0aGUgY2VudGVyIG9mIHRoZSB0b3VjaCBldmVudCBwb2ludHMsIHJlbGF0aXZlIHRvIHRoZSBtYXAgYW5kIG1lYXN1cmVkIGZyb20gdGhlIHRvcCBsZWZ0XG4gICAgICogY29ybmVyLlxuICAgICAqL1xuICAgIHBvaW50OiBQb2ludDtcblxuICAgIC8qKlxuICAgICAqIFRoZSBhcnJheSBvZiBwaXhlbCBjb29yZGluYXRlcyBjb3JyZXNwb25kaW5nIHRvIGFcbiAgICAgKiBbdG91Y2ggZXZlbnQncyBgdG91Y2hlc2BdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9Ub3VjaEV2ZW50L3RvdWNoZXMpIHByb3BlcnR5LlxuICAgICAqL1xuICAgIHBvaW50czogQXJyYXk8UG9pbnQ+O1xuXG4gICAgLyoqXG4gICAgICogVGhlIGdlb2dyYXBoaWNhbCBsb2NhdGlvbnMgb24gdGhlIG1hcCBjb3JyZXNwb25kaW5nIHRvIGFcbiAgICAgKiBbdG91Y2ggZXZlbnQncyBgdG91Y2hlc2BdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9Ub3VjaEV2ZW50L3RvdWNoZXMpIHByb3BlcnR5LlxuICAgICAqL1xuICAgIGxuZ0xhdHM6IEFycmF5PExuZ0xhdD47XG5cbiAgICAvKipcbiAgICAgKiBQcmV2ZW50cyBzdWJzZXF1ZW50IGRlZmF1bHQgcHJvY2Vzc2luZyBvZiB0aGUgZXZlbnQgYnkgdGhlIG1hcC5cbiAgICAgKlxuICAgICAqIENhbGxpbmcgdGhpcyBtZXRob2Qgd2lsbCBwcmV2ZW50IHRoZSBmb2xsb3dpbmcgZGVmYXVsdCBtYXAgYmVoYXZpb3JzOlxuICAgICAqXG4gICAgICogICAqIE9uIGB0b3VjaHN0YXJ0YCBldmVudHMsIHRoZSBiZWhhdmlvciBvZiB7QGxpbmsgRHJhZ1BhbkhhbmRsZXJ9XG4gICAgICogICAqIE9uIGB0b3VjaHN0YXJ0YCBldmVudHMsIHRoZSBiZWhhdmlvciBvZiB7QGxpbmsgVG91Y2hab29tUm90YXRlSGFuZGxlcn1cbiAgICAgKlxuICAgICAqL1xuICAgIHByZXZlbnREZWZhdWx0KCkge1xuICAgICAgICB0aGlzLl9kZWZhdWx0UHJldmVudGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgdHJ1ZWAgaWYgYHByZXZlbnREZWZhdWx0YCBoYXMgYmVlbiBjYWxsZWQuXG4gICAgICovXG4gICAgZ2V0IGRlZmF1bHRQcmV2ZW50ZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWZhdWx0UHJldmVudGVkO1xuICAgIH1cblxuICAgIF9kZWZhdWx0UHJldmVudGVkOiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcih0eXBlOiBzdHJpbmcsIG1hcDogTWFwLCBvcmlnaW5hbEV2ZW50OiBUb3VjaEV2ZW50KSB7XG4gICAgICAgIGNvbnN0IHBvaW50cyA9IERPTS50b3VjaFBvcyhtYXAuZ2V0Q2FudmFzQ29udGFpbmVyKCksIG9yaWdpbmFsRXZlbnQpO1xuICAgICAgICBjb25zdCBsbmdMYXRzID0gcG9pbnRzLm1hcCgodCkgPT4gbWFwLnVucHJvamVjdCh0KSk7XG4gICAgICAgIGNvbnN0IHBvaW50ID0gcG9pbnRzLnJlZHVjZSgocHJldiwgY3VyciwgaSwgYXJyKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gcHJldi5hZGQoY3Vyci5kaXYoYXJyLmxlbmd0aCkpO1xuICAgICAgICB9LCBuZXcgUG9pbnQoMCwgMCkpO1xuICAgICAgICBjb25zdCBsbmdMYXQgPSBtYXAudW5wcm9qZWN0KHBvaW50KTtcbiAgICAgICAgc3VwZXIodHlwZSwgeyBwb2ludHMsIHBvaW50LCBsbmdMYXRzLCBsbmdMYXQsIG9yaWdpbmFsRXZlbnQgfSk7XG4gICAgICAgIHRoaXMuX2RlZmF1bHRQcmV2ZW50ZWQgPSBmYWxzZTtcbiAgICB9XG59XG5cblxuLyoqXG4gKiBgTWFwV2hlZWxFdmVudGAgaXMgdGhlIGV2ZW50IHR5cGUgZm9yIHRoZSBgd2hlZWxgIG1hcCBldmVudC5cbiAqIEBleHRlbmRzIHtPYmplY3R9XG4gKi9cbmV4cG9ydCBjbGFzcyBNYXBXaGVlbEV2ZW50IGV4dGVuZHMgRXZlbnQge1xuICAgIC8qKlxuICAgICAqIFRoZSBldmVudCB0eXBlLlxuICAgICAqL1xuICAgIHR5cGU6ICd3aGVlbCc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYE1hcGAgb2JqZWN0IHRoYXQgZmlyZWQgdGhlIGV2ZW50LlxuICAgICAqL1xuICAgIHRhcmdldDogTWFwO1xuXG4gICAgLyoqXG4gICAgICogVGhlIERPTSBldmVudCB3aGljaCBjYXVzZWQgdGhlIG1hcCBldmVudC5cbiAgICAgKi9cbiAgICBvcmlnaW5hbEV2ZW50OiBXaGVlbEV2ZW50O1xuXG4gICAgLyoqXG4gICAgICogUHJldmVudHMgc3Vic2VxdWVudCBkZWZhdWx0IHByb2Nlc3Npbmcgb2YgdGhlIGV2ZW50IGJ5IHRoZSBtYXAuXG4gICAgICpcbiAgICAgKiBDYWxsaW5nIHRoaXMgbWV0aG9kIHdpbGwgcHJldmVudCB0aGUgdGhlIGJlaGF2aW9yIG9mIHtAbGluayBTY3JvbGxab29tSGFuZGxlcn0uXG4gICAgICovXG4gICAgcHJldmVudERlZmF1bHQoKSB7XG4gICAgICAgIHRoaXMuX2RlZmF1bHRQcmV2ZW50ZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGB0cnVlYCBpZiBgcHJldmVudERlZmF1bHRgIGhhcyBiZWVuIGNhbGxlZC5cbiAgICAgKi9cbiAgICBnZXQgZGVmYXVsdFByZXZlbnRlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZmF1bHRQcmV2ZW50ZWQ7XG4gICAgfVxuXG4gICAgX2RlZmF1bHRQcmV2ZW50ZWQ6IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHR5cGU6IHN0cmluZywgbWFwOiBNYXAsIG9yaWdpbmFsRXZlbnQ6IFdoZWVsRXZlbnQpIHtcbiAgICAgICAgc3VwZXIodHlwZSwgeyBvcmlnaW5hbEV2ZW50IH0pO1xuICAgICAgICB0aGlzLl9kZWZhdWx0UHJldmVudGVkID0gZmFsc2U7XG4gICAgfVxufVxuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IE1hcEJveFpvb21FdmVudFxuICogQHByb3BlcnR5IHtNb3VzZUV2ZW50fSBvcmlnaW5hbEV2ZW50XG4gKi9cbmV4cG9ydCB0eXBlIE1hcEJveFpvb21FdmVudCA9IHtcbiAgICB0eXBlOiAnYm94em9vbXN0YXJ0J1xuICAgICAgICB8ICdib3h6b29tZW5kJ1xuICAgICAgICB8ICdib3h6b29tY2FuY2VsJyxcbiAgICBtYXA6IE1hcCxcbiAgICBvcmlnaW5hbEV2ZW50OiBNb3VzZUV2ZW50XG59O1xuXG4vKipcbiAqIEEgYE1hcERhdGFFdmVudGAgb2JqZWN0IGlzIGVtaXR0ZWQgd2l0aCB0aGUge0BsaW5rIE1hcC5ldmVudDpkYXRhfVxuICogYW5kIHtAbGluayBNYXAuZXZlbnQ6ZGF0YWxvYWRpbmd9IGV2ZW50cy4gUG9zc2libGUgdmFsdWVzIGZvclxuICogYGRhdGFUeXBlYHMgYXJlOlxuICpcbiAqIC0gYCdzb3VyY2UnYDogVGhlIG5vbi10aWxlIGRhdGEgYXNzb2NpYXRlZCB3aXRoIGFueSBzb3VyY2VcbiAqIC0gYCdzdHlsZSdgOiBUaGUgW3N0eWxlXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1zdHlsZS1zcGVjLykgdXNlZCBieSB0aGUgbWFwXG4gKlxuICogQHR5cGVkZWYge09iamVjdH0gTWFwRGF0YUV2ZW50XG4gKiBAcHJvcGVydHkge3N0cmluZ30gdHlwZSBUaGUgZXZlbnQgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkYXRhVHlwZSBUaGUgdHlwZSBvZiBkYXRhIHRoYXQgaGFzIGNoYW5nZWQuIE9uZSBvZiBgJ3NvdXJjZSdgLCBgJ3N0eWxlJ2AuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtpc1NvdXJjZUxvYWRlZF0gVHJ1ZSBpZiB0aGUgZXZlbnQgaGFzIGEgYGRhdGFUeXBlYCBvZiBgc291cmNlYCBhbmQgdGhlIHNvdXJjZSBoYXMgbm8gb3V0c3RhbmRpbmcgbmV0d29yayByZXF1ZXN0cy5cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBbc291cmNlXSBUaGUgW3N0eWxlIHNwZWMgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNvdXJjZV0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtc3R5bGUtc3BlYy8jc291cmNlcykgaWYgdGhlIGV2ZW50IGhhcyBhIGBkYXRhVHlwZWAgb2YgYHNvdXJjZWAuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3NvdXJjZURhdGFUeXBlXSBJbmNsdWRlZCBpZiB0aGUgZXZlbnQgaGFzIGEgYGRhdGFUeXBlYCBvZiBgc291cmNlYCBhbmQgdGhlIGV2ZW50IHNpZ25hbHNcbiAqIHRoYXQgaW50ZXJuYWwgZGF0YSBoYXMgYmVlbiByZWNlaXZlZCBvciBjaGFuZ2VkLiBQb3NzaWJsZSB2YWx1ZXMgYXJlIGBtZXRhZGF0YWAgYW5kIGBjb250ZW50YC5cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBbdGlsZV0gVGhlIHRpbGUgYmVpbmcgbG9hZGVkIG9yIGNoYW5nZWQsIGlmIHRoZSBldmVudCBoYXMgYSBgZGF0YVR5cGVgIG9mIGBzb3VyY2VgIGFuZFxuICogdGhlIGV2ZW50IGlzIHJlbGF0ZWQgdG8gbG9hZGluZyBvZiBhIHRpbGUuXG4gKiBAcHJvcGVydHkge0Nvb3JkaW5hdGV9IFtjb29yZF0gVGhlIGNvb3JkaW5hdGUgb2YgdGhlIHRpbGUgaWYgdGhlIGV2ZW50IGhhcyBhIGBkYXRhVHlwZWAgb2YgYHNvdXJjZWAgYW5kXG4gKiB0aGUgZXZlbnQgaXMgcmVsYXRlZCB0byBsb2FkaW5nIG9mIGEgdGlsZS5cbiAqL1xuZXhwb3J0IHR5cGUgTWFwRGF0YUV2ZW50ID0ge1xuICAgIHR5cGU6IHN0cmluZyxcbiAgICBkYXRhVHlwZTogc3RyaW5nXG59O1xuXG5leHBvcnQgdHlwZSBNYXBDb250ZXh0RXZlbnQgPSB7XG4gICAgdHlwZTogJ3dlYmdsY29udGV4dGxvc3QnIHwgJ3dlYmdsY29udGV4dHJlc3RvcmVkJyxcbiAgICBvcmlnaW5hbEV2ZW50OiBXZWJHTENvbnRleHRFdmVudFxufVxuXG5leHBvcnQgdHlwZSBNYXBFdmVudCA9XG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiBhIHBvaW50aW5nIGRldmljZSAodXN1YWxseSBhIG1vdXNlKSBpcyBwcmVzc2VkIHdpdGhpbiB0aGUgbWFwLlxuICAgICAqXG4gICAgICogQGV2ZW50IG1vdXNlZG93blxuICAgICAqIEBtZW1iZXJvZiBNYXBcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcHJvcGVydHkge01hcE1vdXNlRXZlbnR9IGRhdGFcbiAgICAgKiBAc2VlIFtIaWdobGlnaHQgZmVhdHVyZXMgd2l0aGluIGEgYm91bmRpbmcgYm94XShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3VzaW5nLWJveC1xdWVyeXJlbmRlcmVkZmVhdHVyZXMvKVxuICAgICAqIEBzZWUgW0NyZWF0ZSBhIGRyYWdnYWJsZSBwb2ludF0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9kcmFnLWEtcG9pbnQvKVxuICAgICAqL1xuICAgIHwgJ21vdXNlZG93bidcblxuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gYSBwb2ludGluZyBkZXZpY2UgKHVzdWFsbHkgYSBtb3VzZSkgaXMgcmVsZWFzZWQgd2l0aGluIHRoZSBtYXAuXG4gICAgICpcbiAgICAgKiBAZXZlbnQgbW91c2V1cFxuICAgICAqIEBtZW1iZXJvZiBNYXBcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcHJvcGVydHkge01hcE1vdXNlRXZlbnR9IGRhdGFcbiAgICAgKiBAc2VlIFtIaWdobGlnaHQgZmVhdHVyZXMgd2l0aGluIGEgYm91bmRpbmcgYm94XShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3VzaW5nLWJveC1xdWVyeXJlbmRlcmVkZmVhdHVyZXMvKVxuICAgICAqIEBzZWUgW0NyZWF0ZSBhIGRyYWdnYWJsZSBwb2ludF0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9kcmFnLWEtcG9pbnQvKVxuICAgICAqL1xuICAgIHwgJ21vdXNldXAnXG5cbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIGEgcG9pbnRpbmcgZGV2aWNlICh1c3VhbGx5IGEgbW91c2UpIGlzIG1vdmVkIHdpdGhpbiB0aGUgbWFwLlxuICAgICAqXG4gICAgICogQGV2ZW50IG1vdXNlb3ZlclxuICAgICAqIEBtZW1iZXJvZiBNYXBcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcHJvcGVydHkge01hcE1vdXNlRXZlbnR9IGRhdGFcbiAgICAgKiBAc2VlIFtHZXQgY29vcmRpbmF0ZXMgb2YgdGhlIG1vdXNlIHBvaW50ZXJdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvbW91c2UtcG9zaXRpb24vKVxuICAgICAqIEBzZWUgW0hpZ2hsaWdodCBmZWF0dXJlcyB1bmRlciB0aGUgbW91c2UgcG9pbnRlcl0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9ob3Zlci1zdHlsZXMvKVxuICAgICAqIEBzZWUgW0Rpc3BsYXkgYSBwb3B1cCBvbiBob3Zlcl0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9wb3B1cC1vbi1ob3Zlci8pXG4gICAgICovXG4gICAgfCAnbW91c2VvdmVyJ1xuXG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiBhIHBvaW50aW5nIGRldmljZSAodXN1YWxseSBhIG1vdXNlKSBpcyBtb3ZlZCB3aXRoaW4gdGhlIG1hcC5cbiAgICAgKlxuICAgICAqIEBldmVudCBtb3VzZW1vdmVcbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHByb3BlcnR5IHtNYXBNb3VzZUV2ZW50fSBkYXRhXG4gICAgICogQHNlZSBbR2V0IGNvb3JkaW5hdGVzIG9mIHRoZSBtb3VzZSBwb2ludGVyXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL21vdXNlLXBvc2l0aW9uLylcbiAgICAgKiBAc2VlIFtIaWdobGlnaHQgZmVhdHVyZXMgdW5kZXIgdGhlIG1vdXNlIHBvaW50ZXJdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvaG92ZXItc3R5bGVzLylcbiAgICAgKiBAc2VlIFtEaXNwbGF5IGEgcG9wdXAgb24gb3Zlcl0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9wb3B1cC1vbi1ob3Zlci8pXG4gICAgICovXG4gICAgfCAnbW91c2Vtb3ZlJ1xuXG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiBhIHBvaW50aW5nIGRldmljZSAodXN1YWxseSBhIG1vdXNlKSBpcyBwcmVzc2VkIGFuZCByZWxlYXNlZCBhdCB0aGUgc2FtZSBwb2ludCBvbiB0aGUgbWFwLlxuICAgICAqXG4gICAgICogQGV2ZW50IGNsaWNrXG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBwcm9wZXJ0eSB7TWFwTW91c2VFdmVudH0gZGF0YVxuICAgICAqIEBzZWUgW01lYXN1cmUgZGlzdGFuY2VzXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL21lYXN1cmUvKVxuICAgICAqIEBzZWUgW0NlbnRlciB0aGUgbWFwIG9uIGEgY2xpY2tlZCBzeW1ib2xdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvY2VudGVyLW9uLXN5bWJvbC8pXG4gICAgICovXG4gICAgfCAnY2xpY2snXG5cbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIGEgcG9pbnRpbmcgZGV2aWNlICh1c3VhbGx5IGEgbW91c2UpIGlzIGNsaWNrZWQgdHdpY2UgYXQgdGhlIHNhbWUgcG9pbnQgb24gdGhlIG1hcC5cbiAgICAgKlxuICAgICAqIEBldmVudCBkYmxjbGlja1xuICAgICAqIEBtZW1iZXJvZiBNYXBcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcHJvcGVydHkge01hcE1vdXNlRXZlbnR9IGRhdGFcbiAgICAgKi9cbiAgICB8ICdkYmxjbGljaydcblxuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gYSBwb2ludGluZyBkZXZpY2UgKHVzdWFsbHkgYSBtb3VzZSkgZW50ZXJzIGEgdmlzaWJsZSBwb3J0aW9uIG9mIGEgc3BlY2lmaWVkIGxheWVyIGZyb21cbiAgICAgKiBvdXRzaWRlIHRoYXQgbGF5ZXIgb3Igb3V0c2lkZSB0aGUgbWFwIGNhbnZhcy4gVGhpcyBldmVudCBjYW4gb25seSBiZSBsaXN0ZW5lZCBmb3IgdmlhIHRoZSB0aHJlZS1hcmd1bWVudFxuICAgICAqIHZlcnNpb24gb2Yge0BsaW5rIE1hcCNvbn0sIHdoZXJlIHRoZSBzZWNvbmQgYXJndW1lbnQgc3BlY2lmaWVzIHRoZSBkZXNpcmVkIGxheWVyLlxuICAgICAqXG4gICAgICogQGV2ZW50IG1vdXNlZW50ZXJcbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHByb3BlcnR5IHtNYXBNb3VzZUV2ZW50fSBkYXRhXG4gICAgICovXG4gICAgfCAnbW91c2VlbnRlcidcblxuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gYSBwb2ludGluZyBkZXZpY2UgKHVzdWFsbHkgYSBtb3VzZSkgbGVhdmVzIGEgdmlzaWJsZSBwb3J0aW9uIG9mIGEgc3BlY2lmaWVkIGxheWVyLCBvciBsZWF2ZXNcbiAgICAgKiB0aGUgbWFwIGNhbnZhcy4gVGhpcyBldmVudCBjYW4gb25seSBiZSBsaXN0ZW5lZCBmb3IgdmlhIHRoZSB0aHJlZS1hcmd1bWVudCB2ZXJzaW9uIG9mIHtAbGluayBNYXAjb259LFxuICAgICAqIHdoZXJlIHRoZSBzZWNvbmQgYXJndW1lbnQgc3BlY2lmaWVzIHRoZSBkZXNpcmVkIGxheWVyLlxuICAgICAqXG4gICAgICogQGV2ZW50IG1vdXNlbGVhdmVcbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHByb3BlcnR5IHtNYXBNb3VzZUV2ZW50fSBkYXRhXG4gICAgICogQHNlZSBbSGlnaGxpZ2h0IGZlYXR1cmVzIHVuZGVyIHRoZSBtb3VzZSBwb2ludGVyXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2hvdmVyLXN0eWxlcy8pXG4gICAgICovXG4gICAgfCAnbW91c2VsZWF2ZSdcblxuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gYSBwb2ludCBkZXZpY2UgKHVzdWFsbHkgYSBtb3VzZSkgbGVhdmVzIHRoZSBtYXAncyBjYW52YXMuXG4gICAgICpcbiAgICAgKiBAZXZlbnQgbW91c2VvdXRcbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHByb3BlcnR5IHtNYXBNb3VzZUV2ZW50fSBkYXRhXG4gICAgICovXG4gICAgfCAnbW91c2VvdXQnXG5cbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIHRoZSByaWdodCBidXR0b24gb2YgdGhlIG1vdXNlIGlzIGNsaWNrZWQgb3IgdGhlIGNvbnRleHQgbWVudSBrZXkgaXMgcHJlc3NlZCB3aXRoaW4gdGhlIG1hcC5cbiAgICAgKlxuICAgICAqIEBldmVudCBjb250ZXh0bWVudVxuICAgICAqIEBtZW1iZXJvZiBNYXBcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcHJvcGVydHkge01hcE1vdXNlRXZlbnR9IGRhdGFcbiAgICAgKi9cbiAgICB8ICdjb250ZXh0bWVudSdcblxuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gYSBbYHdoZWVsYF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvRXZlbnRzL3doZWVsKSBldmVudCBvY2N1cnMgd2l0aGluIHRoZSBtYXAuXG4gICAgICpcbiAgICAgKiBAZXZlbnQgd2hlZWxcbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHByb3BlcnR5IHtNYXBXaGVlbEV2ZW50fSBkYXRhXG4gICAgICovXG4gICAgfCAnd2hlZWwnXG5cbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIGEgW2B0b3VjaHN0YXJ0YF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvRXZlbnRzL3RvdWNoc3RhcnQpIGV2ZW50IG9jY3VycyB3aXRoaW4gdGhlIG1hcC5cbiAgICAgKlxuICAgICAqIEBldmVudCB0b3VjaHN0YXJ0XG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBwcm9wZXJ0eSB7TWFwVG91Y2hFdmVudH0gZGF0YVxuICAgICAqL1xuICAgIHwgJ3RvdWNoc3RhcnQnXG5cbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIGEgW2B0b3VjaGVuZGBdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0V2ZW50cy90b3VjaGVuZCkgZXZlbnQgb2NjdXJzIHdpdGhpbiB0aGUgbWFwLlxuICAgICAqXG4gICAgICogQGV2ZW50IHRvdWNoZW5kXG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBwcm9wZXJ0eSB7TWFwVG91Y2hFdmVudH0gZGF0YVxuICAgICAqL1xuICAgIHwgJ3RvdWNoZW5kJ1xuXG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiBhIFtgdG91Y2htb3ZlYF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvRXZlbnRzL3RvdWNobW92ZSkgZXZlbnQgb2NjdXJzIHdpdGhpbiB0aGUgbWFwLlxuICAgICAqXG4gICAgICogQGV2ZW50IHRvdWNobW92ZVxuICAgICAqIEBtZW1iZXJvZiBNYXBcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcHJvcGVydHkge01hcFRvdWNoRXZlbnR9IGRhdGFcbiAgICAgKi9cbiAgICB8ICd0b3VjaG1vdmUnXG5cbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIGEgW2B0b3VjaGNhbmNlbGBdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0V2ZW50cy90b3VjaGNhbmNlbCkgZXZlbnQgb2NjdXJzIHdpdGhpbiB0aGUgbWFwLlxuICAgICAqXG4gICAgICogQGV2ZW50IHRvdWNoY2FuY2VsXG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBwcm9wZXJ0eSB7TWFwVG91Y2hFdmVudH0gZGF0YVxuICAgICAqL1xuICAgIHwgJ3RvdWNoY2FuY2VsJ1xuXG4gICAgLyoqXG4gICAgICogRmlyZWQganVzdCBiZWZvcmUgdGhlIG1hcCBiZWdpbnMgYSB0cmFuc2l0aW9uIGZyb20gb25lXG4gICAgICogdmlldyB0byBhbm90aGVyLCBhcyB0aGUgcmVzdWx0IG9mIGVpdGhlciB1c2VyIGludGVyYWN0aW9uIG9yIG1ldGhvZHMgc3VjaCBhcyB7QGxpbmsgTWFwI2p1bXBUb30uXG4gICAgICpcbiAgICAgKiBAZXZlbnQgbW92ZXN0YXJ0XG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBwcm9wZXJ0eSB7e29yaWdpbmFsRXZlbnQ6IERyYWdFdmVudH19IGRhdGFcbiAgICAgKi9cbiAgICB8ICdtb3Zlc3RhcnQnXG5cbiAgICAvKipcbiAgICAgKiBGaXJlZCByZXBlYXRlZGx5IGR1cmluZyBhbiBhbmltYXRlZCB0cmFuc2l0aW9uIGZyb20gb25lIHZpZXcgdG9cbiAgICAgKiBhbm90aGVyLCBhcyB0aGUgcmVzdWx0IG9mIGVpdGhlciB1c2VyIGludGVyYWN0aW9uIG9yIG1ldGhvZHMgc3VjaCBhcyB7QGxpbmsgTWFwI2ZseVRvfS5cbiAgICAgKlxuICAgICAqIEBldmVudCBtb3ZlXG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBwcm9wZXJ0eSB7TWFwTW91c2VFdmVudCB8IE1hcFRvdWNoRXZlbnR9IGRhdGFcbiAgICAgKi9cbiAgICB8ICdtb3ZlJ1xuXG4gICAgLyoqXG4gICAgICogRmlyZWQganVzdCBhZnRlciB0aGUgbWFwIGNvbXBsZXRlcyBhIHRyYW5zaXRpb24gZnJvbSBvbmVcbiAgICAgKiB2aWV3IHRvIGFub3RoZXIsIGFzIHRoZSByZXN1bHQgb2YgZWl0aGVyIHVzZXIgaW50ZXJhY3Rpb24gb3IgbWV0aG9kcyBzdWNoIGFzIHtAbGluayBNYXAjanVtcFRvfS5cbiAgICAgKlxuICAgICAqIEBldmVudCBtb3ZlZW5kXG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBwcm9wZXJ0eSB7e29yaWdpbmFsRXZlbnQ6IERyYWdFdmVudH19IGRhdGFcbiAgICAgKiBAc2VlIFtQbGF5IG1hcCBsb2NhdGlvbnMgYXMgYSBzbGlkZXNob3ddKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvcGxheWJhY2stbG9jYXRpb25zLylcbiAgICAgKiBAc2VlIFtGaWx0ZXIgZmVhdHVyZXMgd2l0aGluIG1hcCB2aWV3XShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2ZpbHRlci1mZWF0dXJlcy13aXRoaW4tbWFwLXZpZXcvKVxuICAgICAqL1xuICAgIHwgJ21vdmVlbmQnXG5cbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIGEgXCJkcmFnIHRvIHBhblwiIGludGVyYWN0aW9uIHN0YXJ0cy4gU2VlIHtAbGluayBEcmFnUGFuSGFuZGxlcn0uXG4gICAgICpcbiAgICAgKiBAZXZlbnQgZHJhZ3N0YXJ0XG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBwcm9wZXJ0eSB7e29yaWdpbmFsRXZlbnQ6IERyYWdFdmVudH19IGRhdGFcbiAgICAgKi9cbiAgICB8ICdkcmFnc3RhcnQnXG5cbiAgICAvKipcbiAgICAgKiBGaXJlZCByZXBlYXRlZGx5IGR1cmluZyBhIFwiZHJhZyB0byBwYW5cIiBpbnRlcmFjdGlvbi4gU2VlIHtAbGluayBEcmFnUGFuSGFuZGxlcn0uXG4gICAgICpcbiAgICAgKiBAZXZlbnQgZHJhZ1xuICAgICAqIEBtZW1iZXJvZiBNYXBcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcHJvcGVydHkge01hcE1vdXNlRXZlbnQgfCBNYXBUb3VjaEV2ZW50fSBkYXRhXG4gICAgICovXG4gICAgfCAnZHJhZydcblxuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gYSBcImRyYWcgdG8gcGFuXCIgaW50ZXJhY3Rpb24gZW5kcy4gU2VlIHtAbGluayBEcmFnUGFuSGFuZGxlcn0uXG4gICAgICpcbiAgICAgKiBAZXZlbnQgZHJhZ2VuZFxuICAgICAqIEBtZW1iZXJvZiBNYXBcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcHJvcGVydHkge3tvcmlnaW5hbEV2ZW50OiBEcmFnRXZlbnR9fSBkYXRhXG4gICAgICovXG4gICAgfCAnZHJhZ2VuZCdcblxuICAgIC8qKlxuICAgICAqIEZpcmVkIGp1c3QgYmVmb3JlIHRoZSBtYXAgYmVnaW5zIGEgdHJhbnNpdGlvbiBmcm9tIG9uZSB6b29tIGxldmVsIHRvIGFub3RoZXIsXG4gICAgICogYXMgdGhlIHJlc3VsdCBvZiBlaXRoZXIgdXNlciBpbnRlcmFjdGlvbiBvciBtZXRob2RzIHN1Y2ggYXMge0BsaW5rIE1hcCNmbHlUb30uXG4gICAgICpcbiAgICAgKiBAZXZlbnQgem9vbXN0YXJ0XG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBwcm9wZXJ0eSB7TWFwTW91c2VFdmVudCB8IE1hcFRvdWNoRXZlbnR9IGRhdGFcbiAgICAgKi9cbiAgICB8ICd6b29tc3RhcnQnXG5cbiAgICAvKipcbiAgICAgKiBGaXJlZCByZXBlYXRlZGx5IGR1cmluZyBhbiBhbmltYXRlZCB0cmFuc2l0aW9uIGZyb20gb25lIHpvb20gbGV2ZWwgdG8gYW5vdGhlcixcbiAgICAgKiBhcyB0aGUgcmVzdWx0IG9mIGVpdGhlciB1c2VyIGludGVyYWN0aW9uIG9yIG1ldGhvZHMgc3VjaCBhcyB7QGxpbmsgTWFwI2ZseVRvfS5cbiAgICAgKlxuICAgICAqIEBldmVudCB6b29tXG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBwcm9wZXJ0eSB7TWFwTW91c2VFdmVudCB8IE1hcFRvdWNoRXZlbnR9IGRhdGFcbiAgICAgKiBAc2VlIFtVcGRhdGUgYSBjaG9yb3BsZXRoIGxheWVyIGJ5IHpvb20gbGV2ZWxdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvdXBkYXRpbmctY2hvcm9wbGV0aC8pXG4gICAgICovXG4gICAgfCAnem9vbSdcblxuICAgIC8qKlxuICAgICAqIEZpcmVkIGp1c3QgYWZ0ZXIgdGhlIG1hcCBjb21wbGV0ZXMgYSB0cmFuc2l0aW9uIGZyb20gb25lIHpvb20gbGV2ZWwgdG8gYW5vdGhlcixcbiAgICAgKiBhcyB0aGUgcmVzdWx0IG9mIGVpdGhlciB1c2VyIGludGVyYWN0aW9uIG9yIG1ldGhvZHMgc3VjaCBhcyB7QGxpbmsgTWFwI2ZseVRvfS5cbiAgICAgKlxuICAgICAqIEBldmVudCB6b29tZW5kXG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBwcm9wZXJ0eSB7TWFwTW91c2VFdmVudCB8IE1hcFRvdWNoRXZlbnR9IGRhdGFcbiAgICAgKi9cbiAgICB8ICd6b29tZW5kJ1xuXG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiBhIFwiZHJhZyB0byByb3RhdGVcIiBpbnRlcmFjdGlvbiBzdGFydHMuIFNlZSB7QGxpbmsgRHJhZ1JvdGF0ZUhhbmRsZXJ9LlxuICAgICAqXG4gICAgICogQGV2ZW50IHJvdGF0ZXN0YXJ0XG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBwcm9wZXJ0eSB7TWFwTW91c2VFdmVudCB8IE1hcFRvdWNoRXZlbnR9IGRhdGFcbiAgICAgKi9cbiAgICB8ICdyb3RhdGVzdGFydCdcblxuICAgIC8qKlxuICAgICAqIEZpcmVkIHJlcGVhdGVkbHkgZHVyaW5nIGEgXCJkcmFnIHRvIHJvdGF0ZVwiIGludGVyYWN0aW9uLiBTZWUge0BsaW5rIERyYWdSb3RhdGVIYW5kbGVyfS5cbiAgICAgKlxuICAgICAqIEBldmVudCByb3RhdGVcbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHByb3BlcnR5IHtNYXBNb3VzZUV2ZW50IHwgTWFwVG91Y2hFdmVudH0gZGF0YVxuICAgICAqL1xuICAgIHwgJ3JvdGF0ZSdcblxuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gYSBcImRyYWcgdG8gcm90YXRlXCIgaW50ZXJhY3Rpb24gZW5kcy4gU2VlIHtAbGluayBEcmFnUm90YXRlSGFuZGxlcn0uXG4gICAgICpcbiAgICAgKiBAZXZlbnQgcm90YXRlZW5kXG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBwcm9wZXJ0eSB7TWFwTW91c2VFdmVudCB8IE1hcFRvdWNoRXZlbnR9IGRhdGFcbiAgICAgKi9cbiAgICB8ICdyb3RhdGVlbmQnXG5cbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuZXZlciB0aGUgbWFwJ3MgcGl0Y2ggKHRpbHQpIGJlZ2lucyBhIGNoYW5nZSBhc1xuICAgICAqIHRoZSByZXN1bHQgb2YgZWl0aGVyIHVzZXIgaW50ZXJhY3Rpb24gb3IgbWV0aG9kcyBzdWNoIGFzIHtAbGluayBNYXAjZmx5VG99IC5cbiAgICAgKlxuICAgICAqIEBldmVudCBwaXRjaHN0YXJ0XG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBwcm9wZXJ0eSB7TWFwRXZlbnREYXRhfSBkYXRhXG4gICAgICovXG4gICAgfCAncGl0Y2hzdGFydCdcblxuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW5ldmVyIHRoZSBtYXAncyBwaXRjaCAodGlsdCkgY2hhbmdlcyBhcy5cbiAgICAgKiB0aGUgcmVzdWx0IG9mIGVpdGhlciB1c2VyIGludGVyYWN0aW9uIG9yIG1ldGhvZHMgc3VjaCBhcyB7QGxpbmsgTWFwI2ZseVRvfS5cbiAgICAgKlxuICAgICAqIEBldmVudCBwaXRjaFxuICAgICAqIEBtZW1iZXJvZiBNYXBcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcHJvcGVydHkge01hcEV2ZW50RGF0YX0gZGF0YVxuICAgICAqL1xuICAgIHwgJ3BpdGNoJ1xuXG4gICAgLyoqXG4gICAgICogRmlyZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIG1hcCdzIHBpdGNoICh0aWx0KSBmaW5pc2hlcyBjaGFuZ2luZyBhc1xuICAgICAqIHRoZSByZXN1bHQgb2YgZWl0aGVyIHVzZXIgaW50ZXJhY3Rpb24gb3IgbWV0aG9kcyBzdWNoIGFzIHtAbGluayBNYXAjZmx5VG99LlxuICAgICAqXG4gICAgICogQGV2ZW50IHBpdGNoZW5kXG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBwcm9wZXJ0eSB7TWFwRXZlbnREYXRhfSBkYXRhXG4gICAgICovXG4gICAgfCAncGl0Y2hlbmQnXG5cbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIGEgXCJib3ggem9vbVwiIGludGVyYWN0aW9uIHN0YXJ0cy4gU2VlIHtAbGluayBCb3hab29tSGFuZGxlcn0uXG4gICAgICpcbiAgICAgKiBAZXZlbnQgYm94em9vbXN0YXJ0XG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBwcm9wZXJ0eSB7TWFwQm94Wm9vbUV2ZW50fSBkYXRhXG4gICAgICovXG4gICAgfCAnYm94em9vbXN0YXJ0J1xuXG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiBhIFwiYm94IHpvb21cIiBpbnRlcmFjdGlvbiBlbmRzLiAgU2VlIHtAbGluayBCb3hab29tSGFuZGxlcn0uXG4gICAgICpcbiAgICAgKiBAZXZlbnQgYm94em9vbWVuZFxuICAgICAqIEBtZW1iZXJvZiBNYXBcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgICAqIEBwcm9wZXJ0eSB7TWFwQm94Wm9vbUV2ZW50fSBkYXRhXG4gICAgICovXG4gICAgfCAnYm94em9vbWVuZCdcblxuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gdGhlIHVzZXIgY2FuY2VscyBhIFwiYm94IHpvb21cIiBpbnRlcmFjdGlvbiwgb3Igd2hlbiB0aGUgYm91bmRpbmcgYm94IGRvZXMgbm90IG1lZXQgdGhlIG1pbmltdW0gc2l6ZSB0aHJlc2hvbGQuXG4gICAgICogU2VlIHtAbGluayBCb3hab29tSGFuZGxlcn0uXG4gICAgICpcbiAgICAgKiBAZXZlbnQgYm94em9vbWNhbmNlbFxuICAgICAqIEBtZW1iZXJvZiBNYXBcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcHJvcGVydHkge01hcEJveFpvb21FdmVudH0gZGF0YVxuICAgICAqL1xuICAgIHwgJ2JveHpvb21jYW5jZWwnXG5cbiAgICAvKipcbiAgICAgKiBGaXJlZCBpbW1lZGlhdGVseSBhZnRlciB0aGUgbWFwIGhhcyBiZWVuIHJlc2l6ZWQuXG4gICAgICpcbiAgICAgKiBAZXZlbnQgcmVzaXplXG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqL1xuICAgIHwgJ3Jlc2l6ZSdcblxuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gdGhlIFdlYkdMIGNvbnRleHQgaXMgbG9zdC5cbiAgICAgKlxuICAgICAqIEBldmVudCB3ZWJnbGNvbnRleHRsb3N0XG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqL1xuICAgIHwgJ3dlYmdsY29udGV4dGxvc3QnXG5cbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIHRoZSBXZWJHTCBjb250ZXh0IGlzIHJlc3RvcmVkLlxuICAgICAqXG4gICAgICogQGV2ZW50IHdlYmdsY29udGV4dHJlc3RvcmVkXG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqL1xuICAgIHwgJ3dlYmdsY29udGV4dHJlc3RvcmVkJ1xuXG4gICAgLyoqXG4gICAgICogRmlyZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgYWxsIG5lY2Vzc2FyeSByZXNvdXJjZXMgaGF2ZSBiZWVuIGRvd25sb2FkZWRcbiAgICAgKiBhbmQgdGhlIGZpcnN0IHZpc3VhbGx5IGNvbXBsZXRlIHJlbmRlcmluZyBvZiB0aGUgbWFwIGhhcyBvY2N1cnJlZC5cbiAgICAgKlxuICAgICAqIEBldmVudCBsb2FkXG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEB0eXBlIHtPYmplY3R9XG4gICAgICogQHNlZSBbRHJhdyBHZW9KU09OIHBvaW50c10oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9nZW9qc29uLW1hcmtlcnMvKVxuICAgICAqIEBzZWUgW0FkZCBsaXZlIHJlYWx0aW1lIGRhdGFdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvbGl2ZS1nZW9qc29uLylcbiAgICAgKiBAc2VlIFtBbmltYXRlIGEgcG9pbnRdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvYW5pbWF0ZS1wb2ludC1hbG9uZy1saW5lLylcbiAgICAgKi9cbiAgICB8ICdsb2FkJ1xuXG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbmV2ZXIgdGhlIG1hcCBpcyBkcmF3biB0byB0aGUgc2NyZWVuLCBhcyB0aGUgcmVzdWx0IG9mXG4gICAgICpcbiAgICAgKiAtIGEgY2hhbmdlIHRvIHRoZSBtYXAncyBwb3NpdGlvbiwgem9vbSwgcGl0Y2gsIG9yIGJlYXJpbmdcbiAgICAgKiAtIGEgY2hhbmdlIHRvIHRoZSBtYXAncyBzdHlsZVxuICAgICAqIC0gYSBjaGFuZ2UgdG8gYSBHZW9KU09OIHNvdXJjZVxuICAgICAqIC0gdGhlIGxvYWRpbmcgb2YgYSB2ZWN0b3IgdGlsZSwgR2VvSlNPTiBmaWxlLCBnbHlwaCwgb3Igc3ByaXRlXG4gICAgICpcbiAgICAgKiBAZXZlbnQgcmVuZGVyXG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqL1xuICAgIHwgJ3JlbmRlcidcblxuICAgIC8qKlxuICAgICAqIEZpcmVkIGFmdGVyIHRoZSBsYXN0IGZyYW1lIHJlbmRlcmVkIGJlZm9yZSB0aGUgbWFwIGVudGVycyBhblxuICAgICAqIFwiaWRsZVwiIHN0YXRlOlxuICAgICAqXG4gICAgICogLSBObyBjYW1lcmEgdHJhbnNpdGlvbnMgYXJlIGluIHByb2dyZXNzXG4gICAgICogLSBBbGwgY3VycmVudGx5IHJlcXVlc3RlZCB0aWxlcyBoYXZlIGxvYWRlZFxuICAgICAqIC0gQWxsIGZhZGUvdHJhbnNpdGlvbiBhbmltYXRpb25zIGhhdmUgY29tcGxldGVkXG4gICAgICpcbiAgICAgKiBAZXZlbnQgaWRsZVxuICAgICAqIEBtZW1iZXJvZiBNYXBcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKi9cbiAgICB8ICdpZGxlJ1xuXG4gICAgLyoqXG4gICAgICogRmlyZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIG1hcCBoYXMgYmVlbiByZW1vdmVkIHdpdGgge0BsaW5rIE1hcC5ldmVudDpyZW1vdmV9LlxuICAgICAqXG4gICAgICogQGV2ZW50IHJlbW92ZVxuICAgICAqIEBtZW1iZXJvZiBNYXBcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKi9cbiAgICB8ICdyZW1vdmUnXG5cbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIGFuIGVycm9yIG9jY3Vycy4gVGhpcyBpcyBHTCBKUydzIHByaW1hcnkgZXJyb3IgcmVwb3J0aW5nXG4gICAgICogbWVjaGFuaXNtLiBXZSB1c2UgYW4gZXZlbnQgaW5zdGVhZCBvZiBgdGhyb3dgIHRvIGJldHRlciBhY2NvbW1vZGF0ZVxuICAgICAqIGFzeW5jcm9ub3VzIG9wZXJhdGlvbnMuIElmIG5vIGxpc3RlbmVycyBhcmUgYm91bmQgdG8gdGhlIGBlcnJvcmAgZXZlbnQsIHRoZVxuICAgICAqIGVycm9yIHdpbGwgYmUgcHJpbnRlZCB0byB0aGUgY29uc29sZS5cbiAgICAgKlxuICAgICAqIEBldmVudCBlcnJvclxuICAgICAqIEBtZW1iZXJvZiBNYXBcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcHJvcGVydHkge3tlcnJvcjoge21lc3NhZ2U6IHN0cmluZ319fSBkYXRhXG4gICAgICovXG4gICAgfCAnZXJyb3InXG5cbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIGFueSBtYXAgZGF0YSBsb2FkcyBvciBjaGFuZ2VzLiBTZWUge0BsaW5rIE1hcERhdGFFdmVudH1cbiAgICAgKiBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAgICAgKlxuICAgICAqIEBldmVudCBkYXRhXG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBwcm9wZXJ0eSB7TWFwRGF0YUV2ZW50fSBkYXRhXG4gICAgICovXG4gICAgfCAnZGF0YSdcblxuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gdGhlIG1hcCdzIHN0eWxlIGxvYWRzIG9yIGNoYW5nZXMuIFNlZVxuICAgICAqIHtAbGluayBNYXBEYXRhRXZlbnR9IGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgICAqXG4gICAgICogQGV2ZW50IHN0eWxlZGF0YVxuICAgICAqIEBtZW1iZXJvZiBNYXBcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcHJvcGVydHkge01hcERhdGFFdmVudH0gZGF0YVxuICAgICAqL1xuICAgIHwgJ3N0eWxlZGF0YSdcblxuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gb25lIG9mIHRoZSBtYXAncyBzb3VyY2VzIGxvYWRzIG9yIGNoYW5nZXMsIGluY2x1ZGluZyBpZiBhIHRpbGUgYmVsb25naW5nXG4gICAgICogdG8gYSBzb3VyY2UgbG9hZHMgb3IgY2hhbmdlcy4gU2VlIHtAbGluayBNYXBEYXRhRXZlbnR9IGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgICAqXG4gICAgICogQGV2ZW50IHNvdXJjZWRhdGFcbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHByb3BlcnR5IHtNYXBEYXRhRXZlbnR9IGRhdGFcbiAgICAgKi9cbiAgICB8ICdzb3VyY2VkYXRhJ1xuXG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiBhbnkgbWFwIGRhdGEgKHN0eWxlLCBzb3VyY2UsIHRpbGUsIGV0YykgYmVnaW5zIGxvYWRpbmcgb3JcbiAgICAgKiBjaGFuZ2luZyBhc3luY3Jvbm91c2x5LiBBbGwgYGRhdGFsb2FkaW5nYCBldmVudHMgYXJlIGZvbGxvd2VkIGJ5IGEgYGRhdGFgXG4gICAgICogb3IgYGVycm9yYCBldmVudC4gU2VlIHtAbGluayBNYXBEYXRhRXZlbnR9IGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgICAqXG4gICAgICogQGV2ZW50IGRhdGFsb2FkaW5nXG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBwcm9wZXJ0eSB7TWFwRGF0YUV2ZW50fSBkYXRhXG4gICAgICovXG4gICAgfCAnZGF0YWxvYWRpbmcnXG5cbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIHRoZSBtYXAncyBzdHlsZSBiZWdpbnMgbG9hZGluZyBvciBjaGFuZ2luZyBhc3luY3Jvbm91c2x5LlxuICAgICAqIEFsbCBgc3R5bGVkYXRhbG9hZGluZ2AgZXZlbnRzIGFyZSBmb2xsb3dlZCBieSBhIGBzdHlsZWRhdGFgXG4gICAgICogb3IgYGVycm9yYCBldmVudC4gU2VlIHtAbGluayBNYXBEYXRhRXZlbnR9IGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgICAqXG4gICAgICogQGV2ZW50IHN0eWxlZGF0YWxvYWRpbmdcbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHByb3BlcnR5IHtNYXBEYXRhRXZlbnR9IGRhdGFcbiAgICAgKi9cbiAgICB8ICdzdHlsZWRhdGFsb2FkaW5nJ1xuXG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiBvbmUgb2YgdGhlIG1hcCdzIHNvdXJjZXMgYmVnaW5zIGxvYWRpbmcgb3IgY2hhbmdpbmcgYXN5bmNyb25vdXNseS5cbiAgICAgKiBBbGwgYHNvdXJjZWRhdGFsb2FkaW5nYCBldmVudHMgYXJlIGZvbGxvd2VkIGJ5IGEgYHNvdXJjZWRhdGFgIG9yIGBlcnJvcmAgZXZlbnQuXG4gICAgICogU2VlIHtAbGluayBNYXBEYXRhRXZlbnR9IGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgICAqXG4gICAgICogQGV2ZW50IHNvdXJjZWRhdGFsb2FkaW5nXG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBwcm9wZXJ0eSB7TWFwRGF0YUV2ZW50fSBkYXRhXG4gICAgICovXG4gICAgfCAnc291cmNlZGF0YWxvYWRpbmcnXG5cbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIGFuIGljb24gb3IgcGF0dGVybiBuZWVkZWQgYnkgdGhlIHN0eWxlIGlzIG1pc3NpbmcuIFRoZSBtaXNzaW5nIGltYWdlIGNhblxuICAgICAqIGJlIGFkZGVkIHdpdGgge0BsaW5rIE1hcCNhZGRJbWFnZX0gd2l0aGluIHRoaXMgZXZlbnQgbGlzdGVuZXIgY2FsbGJhY2sgdG8gcHJldmVudCB0aGUgaW1hZ2UgZnJvbVxuICAgICAqIGJlaW5nIHNraXBwZWQuIFRoaXMgZXZlbnQgY2FuIGJlIHVzZWQgdG8gZHluYW1pY2FsbHkgZ2VuZXJhdGUgaWNvbnMgYW5kIHBhdHRlcm5zLlxuICAgICAqXG4gICAgICogQGV2ZW50IHN0eWxlaW1hZ2VtaXNzaW5nXG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpZCBUaGUgaWQgb2YgdGhlIG1pc3NpbmcgaW1hZ2UuXG4gICAgICpcbiAgICAgKiBAc2VlIFtHZW5lcmF0ZSBhbmQgYWRkIGEgbWlzc2luZyBpY29uIHRvIHRoZSBtYXBdKGh0dHBzOi8vbWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9hZGQtaW1hZ2UtbWlzc2luZy1nZW5lcmF0ZWQvKVxuICAgICAqL1xuICAgIHwgJ3N0eWxlaW1hZ2VtaXNzaW5nJ1xuXG4gICAgLyoqXG4gICAgICogQGV2ZW50IHN0eWxlLmxvYWRcbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICB8ICdzdHlsZS5sb2FkJztcbiIsIi8vIEBmbG93XG5cbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCBET00gZnJvbSAnLi4vLi4vdXRpbC9kb20nO1xuXG5pbXBvcnQgeyBlYXNlIGFzIF9lYXNlLCBiaW5kQWxsLCBiZXppZXIgfSBmcm9tICcuLi8uLi91dGlsL3V0aWwnO1xuaW1wb3J0IGJyb3dzZXIgZnJvbSAnLi4vLi4vdXRpbC9icm93c2VyJztcbmltcG9ydCB3aW5kb3cgZnJvbSAnLi4vLi4vdXRpbC93aW5kb3cnO1xuaW1wb3J0IHsgbnVtYmVyIGFzIGludGVycG9sYXRlIH0gZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy91dGlsL2ludGVycG9sYXRlJztcbmltcG9ydCBMbmdMYXQgZnJvbSAnLi4vLi4vZ2VvL2xuZ19sYXQnO1xuaW1wb3J0IHsgRXZlbnQgfSBmcm9tICcuLi8uLi91dGlsL2V2ZW50ZWQnO1xuXG5pbXBvcnQgdHlwZSBNYXAgZnJvbSAnLi4vbWFwJztcbmltcG9ydCB0eXBlIFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuaW1wb3J0IHR5cGUge1Rhc2tJRH0gZnJvbSAnLi4vLi4vdXRpbC90YXNrX3F1ZXVlJztcblxuLy8gZGVsdGFZIHZhbHVlIGZvciBtb3VzZSBzY3JvbGwgd2hlZWwgaWRlbnRpZmljYXRpb25cbmNvbnN0IHdoZWVsWm9vbURlbHRhID0gNC4wMDAyNDQxNDA2MjU7XG4vLyBUaGVzZSBtYWdpYyBudW1iZXJzIGNvbnRyb2wgdGhlIHJhdGUgb2Ygem9vbS4gVHJhY2twYWQgZXZlbnRzIGZpcmUgYXQgYSBncmVhdGVyXG4vLyBmcmVxdWVuY3kgdGhhbiBtb3VzZSBzY3JvbGwgd2hlZWwsIHNvIHJlZHVjZSB0aGUgem9vbSByYXRlIHBlciB3aGVlbCB0aWNrXG5jb25zdCBkZWZhdWx0Wm9vbVJhdGUgPSAxIC8gMTAwO1xuY29uc3Qgd2hlZWxab29tUmF0ZSA9IDEgLyA0NTA7XG5cbi8vIHVwcGVyIGJvdW5kIG9uIGhvdyBtdWNoIHdlIHNjYWxlIHRoZSBtYXAgaW4gYW55IHNpbmdsZSByZW5kZXIgZnJhbWU7IHRoaXNcbi8vIGlzIHVzZWQgdG8gbGltaXQgem9vbSByYXRlIGluIHRoZSBjYXNlIG9mIHZlcnkgZmFzdCBzY3JvbGxpbmdcbmNvbnN0IG1heFNjYWxlUGVyRnJhbWUgPSAyO1xuXG4vKipcbiAqIFRoZSBgU2Nyb2xsWm9vbUhhbmRsZXJgIGFsbG93cyB0aGUgdXNlciB0byB6b29tIHRoZSBtYXAgYnkgc2Nyb2xsaW5nLlxuICovXG5jbGFzcyBTY3JvbGxab29tSGFuZGxlciB7XG4gICAgX21hcDogTWFwO1xuICAgIF9lbDogSFRNTEVsZW1lbnQ7XG4gICAgX2VuYWJsZWQ6IGJvb2xlYW47XG4gICAgX2FjdGl2ZTogYm9vbGVhbjtcbiAgICBfem9vbWluZzogYm9vbGVhbjtcbiAgICBfYXJvdW5kQ2VudGVyOiBib29sZWFuO1xuICAgIF9hcm91bmQ6IFBvaW50O1xuICAgIF9hcm91bmRQb2ludDogUG9pbnQ7XG4gICAgX3R5cGU6ICd3aGVlbCcgfCAndHJhY2twYWQnIHwgbnVsbDtcbiAgICBfbGFzdFZhbHVlOiBudW1iZXI7XG4gICAgX3RpbWVvdXQ6ID9UaW1lb3V0SUQ7IC8vIHVzZWQgZm9yIGRlbGF5ZWQtaGFuZGxpbmcgb2YgYSBzaW5nbGUgd2hlZWwgbW92ZW1lbnRcbiAgICBfZmluaXNoVGltZW91dDogP1RpbWVvdXRJRDsgLy8gdXNlZCB0byBkZWxheSBmaW5hbCAne21vdmUsem9vbX1lbmQnIGV2ZW50c1xuXG4gICAgX2xhc3RXaGVlbEV2ZW50OiBhbnk7XG4gICAgX2xhc3RXaGVlbEV2ZW50VGltZTogbnVtYmVyO1xuXG4gICAgX3N0YXJ0Wm9vbTogP251bWJlcjtcbiAgICBfdGFyZ2V0Wm9vbTogP251bWJlcjtcbiAgICBfZGVsdGE6IG51bWJlcjtcbiAgICBfZWFzaW5nOiA/KChudW1iZXIpID0+IG51bWJlcik7XG4gICAgX3ByZXZFYXNlOiA/e3N0YXJ0OiBudW1iZXIsIGR1cmF0aW9uOiBudW1iZXIsIGVhc2luZzogKG51bWJlcikgPT4gbnVtYmVyfTtcblxuICAgIF9mcmFtZUlkOiA/VGFza0lEO1xuXG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihtYXA6IE1hcCkge1xuICAgICAgICB0aGlzLl9tYXAgPSBtYXA7XG4gICAgICAgIHRoaXMuX2VsID0gbWFwLmdldENhbnZhc0NvbnRhaW5lcigpO1xuXG4gICAgICAgIHRoaXMuX2RlbHRhID0gMDtcblxuICAgICAgICBiaW5kQWxsKFtcbiAgICAgICAgICAgICdfb25XaGVlbCcsXG4gICAgICAgICAgICAnX29uVGltZW91dCcsXG4gICAgICAgICAgICAnX29uU2Nyb2xsRnJhbWUnLFxuICAgICAgICAgICAgJ19vblNjcm9sbEZpbmlzaGVkJ1xuICAgICAgICBdLCB0aGlzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgQm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIFwic2Nyb2xsIHRvIHpvb21cIiBpbnRlcmFjdGlvbiBpcyBlbmFibGVkLlxuICAgICAqXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgXCJzY3JvbGwgdG8gem9vbVwiIGludGVyYWN0aW9uIGlzIGVuYWJsZWQuXG4gICAgICovXG4gICAgaXNFbmFibGVkKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLl9lbmFibGVkO1xuICAgIH1cblxuICAgIC8qXG4gICAgKiBBY3RpdmUgc3RhdGUgaXMgdHVybmVkIG9uIGFuZCBvZmYgd2l0aCBldmVyeSBzY3JvbGwgd2hlZWwgZXZlbnQgYW5kIGlzIHNldCBiYWNrIHRvIGZhbHNlIGJlZm9yZSB0aGUgbWFwXG4gICAgKiByZW5kZXIgaXMgY2FsbGVkLCBzbyBfYWN0aXZlIGlzIG5vdCBhIGdvb2QgY2FuZGlkYXRlIGZvciBkZXRlcm1pbmluZyBpZiBhIHNjcm9sbCB6b29tIGFuaW1hdGlvbiBpcyBpblxuICAgICogcHJvZ3Jlc3MuXG4gICAgKi9cbiAgICBpc0FjdGl2ZSgpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5fYWN0aXZlO1xuICAgIH1cblxuXG4gICAgaXNab29taW5nKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLl96b29taW5nO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFbmFibGVzIHRoZSBcInNjcm9sbCB0byB6b29tXCIgaW50ZXJhY3Rpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmFyb3VuZF0gSWYgXCJjZW50ZXJcIiBpcyBwYXNzZWQsIG1hcCB3aWxsIHpvb20gYXJvdW5kIGNlbnRlciBvZiBtYXBcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogICBtYXAuc2Nyb2xsWm9vbS5lbmFibGUoKTtcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqICBtYXAuc2Nyb2xsWm9vbS5lbmFibGUoeyBhcm91bmQ6ICdjZW50ZXInIH0pXG4gICAgICovXG4gICAgZW5hYmxlKG9wdGlvbnM6IGFueSkge1xuICAgICAgICBpZiAodGhpcy5pc0VuYWJsZWQoKSkgcmV0dXJuO1xuICAgICAgICB0aGlzLl9lbmFibGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fYXJvdW5kQ2VudGVyID0gb3B0aW9ucyAmJiBvcHRpb25zLmFyb3VuZCA9PT0gJ2NlbnRlcic7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGlzYWJsZXMgdGhlIFwic2Nyb2xsIHRvIHpvb21cIiBpbnRlcmFjdGlvbi5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogICBtYXAuc2Nyb2xsWm9vbS5kaXNhYmxlKCk7XG4gICAgICovXG4gICAgZGlzYWJsZSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzRW5hYmxlZCgpKSByZXR1cm47XG4gICAgICAgIHRoaXMuX2VuYWJsZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBvbldoZWVsKGU6IFdoZWVsRXZlbnQpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzRW5hYmxlZCgpKSByZXR1cm47XG5cbiAgICAgICAgLy8gUmVtb3ZlIGBhbnlgIGNhc3Qgd2hlbiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svZmxvdy9pc3N1ZXMvNDg3OSBpcyBmaXhlZC5cbiAgICAgICAgbGV0IHZhbHVlID0gZS5kZWx0YU1vZGUgPT09ICh3aW5kb3cuV2hlZWxFdmVudDogYW55KS5ET01fREVMVEFfTElORSA/IGUuZGVsdGFZICogNDAgOiBlLmRlbHRhWTtcbiAgICAgICAgY29uc3Qgbm93ID0gYnJvd3Nlci5ub3coKSxcbiAgICAgICAgICAgIHRpbWVEZWx0YSA9IG5vdyAtICh0aGlzLl9sYXN0V2hlZWxFdmVudFRpbWUgfHwgMCk7XG5cbiAgICAgICAgdGhpcy5fbGFzdFdoZWVsRXZlbnRUaW1lID0gbm93O1xuXG4gICAgICAgIGlmICh2YWx1ZSAhPT0gMCAmJiAodmFsdWUgJSB3aGVlbFpvb21EZWx0YSkgPT09IDApIHtcbiAgICAgICAgICAgIC8vIFRoaXMgb25lIGlzIGRlZmluaXRlbHkgYSBtb3VzZSB3aGVlbCBldmVudC5cbiAgICAgICAgICAgIHRoaXMuX3R5cGUgPSAnd2hlZWwnO1xuXG4gICAgICAgIH0gZWxzZSBpZiAodmFsdWUgIT09IDAgJiYgTWF0aC5hYnModmFsdWUpIDwgNCkge1xuICAgICAgICAgICAgLy8gVGhpcyBvbmUgaXMgZGVmaW5pdGVseSBhIHRyYWNrcGFkIGV2ZW50IGJlY2F1c2UgaXQgaXMgc28gc21hbGwuXG4gICAgICAgICAgICB0aGlzLl90eXBlID0gJ3RyYWNrcGFkJztcblxuICAgICAgICB9IGVsc2UgaWYgKHRpbWVEZWx0YSA+IDQwMCkge1xuICAgICAgICAgICAgLy8gVGhpcyBpcyBsaWtlbHkgYSBuZXcgc2Nyb2xsIGFjdGlvbi5cbiAgICAgICAgICAgIHRoaXMuX3R5cGUgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5fbGFzdFZhbHVlID0gdmFsdWU7XG5cbiAgICAgICAgICAgIC8vIFN0YXJ0IGEgdGltZW91dCBpbiBjYXNlIHRoaXMgd2FzIGEgc2luZ3VsYXIgZXZlbnQsIGFuZCBkZWx5IGl0IGJ5IHVwIHRvIDQwbXMuXG4gICAgICAgICAgICB0aGlzLl90aW1lb3V0ID0gc2V0VGltZW91dCh0aGlzLl9vblRpbWVvdXQsIDQwLCBlKTtcblxuICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLl90eXBlKSB7XG4gICAgICAgICAgICAvLyBUaGlzIGlzIGEgcmVwZWF0aW5nIGV2ZW50LCBidXQgd2UgZG9uJ3Qga25vdyB0aGUgdHlwZSBvZiBldmVudCBqdXN0IHlldC5cbiAgICAgICAgICAgIC8vIElmIHRoZSBkZWx0YSBwZXIgdGltZSBpcyBzbWFsbCwgd2UgYXNzdW1lIGl0J3MgYSBmYXN0IHRyYWNrcGFkOyBvdGhlcndpc2Ugd2Ugc3dpdGNoIGludG8gd2hlZWwgbW9kZS5cbiAgICAgICAgICAgIHRoaXMuX3R5cGUgPSAoTWF0aC5hYnModGltZURlbHRhICogdmFsdWUpIDwgMjAwKSA/ICd0cmFja3BhZCcgOiAnd2hlZWwnO1xuXG4gICAgICAgICAgICAvLyBNYWtlIHN1cmUgb3VyIGRlbGF5ZWQgZXZlbnQgaXNuJ3QgZmlyZWQgYWdhaW4sIGJlY2F1c2Ugd2UgYWNjdW11bGF0ZVxuICAgICAgICAgICAgLy8gdGhlIHByZXZpb3VzIGV2ZW50ICh3aGljaCB3YXMgbGVzcyB0aGFuIDQwbXMgYWdvKSBpbnRvIHRoaXMgZXZlbnQuXG4gICAgICAgICAgICBpZiAodGhpcy5fdGltZW91dCkge1xuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl90aW1lb3V0KTtcbiAgICAgICAgICAgICAgICB0aGlzLl90aW1lb3V0ID0gbnVsbDtcbiAgICAgICAgICAgICAgICB2YWx1ZSArPSB0aGlzLl9sYXN0VmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTbG93IGRvd24gem9vbSBpZiBzaGlmdCBrZXkgaXMgaGVsZCBmb3IgbW9yZSBwcmVjaXNlIHpvb21pbmdcbiAgICAgICAgaWYgKGUuc2hpZnRLZXkgJiYgdmFsdWUpIHZhbHVlID0gdmFsdWUgLyA0O1xuXG4gICAgICAgIC8vIE9ubHkgZmlyZSB0aGUgY2FsbGJhY2sgaWYgd2UgYWN0dWFsbHkga25vdyB3aGF0IHR5cGUgb2Ygc2Nyb2xsaW5nIGRldmljZSB0aGUgdXNlciB1c2VzLlxuICAgICAgICBpZiAodGhpcy5fdHlwZSkge1xuICAgICAgICAgICAgdGhpcy5fbGFzdFdoZWVsRXZlbnQgPSBlO1xuICAgICAgICAgICAgdGhpcy5fZGVsdGEgLT0gdmFsdWU7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNBY3RpdmUoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3N0YXJ0KGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cblxuICAgIF9vblRpbWVvdXQoaW5pdGlhbEV2ZW50OiBhbnkpIHtcbiAgICAgICAgdGhpcy5fdHlwZSA9ICd3aGVlbCc7XG4gICAgICAgIHRoaXMuX2RlbHRhIC09IHRoaXMuX2xhc3RWYWx1ZTtcbiAgICAgICAgaWYgKCF0aGlzLmlzQWN0aXZlKCkpIHtcbiAgICAgICAgICAgIHRoaXMuX3N0YXJ0KGluaXRpYWxFdmVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfc3RhcnQoZTogYW55KSB7XG4gICAgICAgIGlmICghdGhpcy5fZGVsdGEpIHJldHVybjtcblxuICAgICAgICBpZiAodGhpcy5fZnJhbWVJZCkge1xuICAgICAgICAgICAgdGhpcy5fbWFwLl9jYW5jZWxSZW5kZXJGcmFtZSh0aGlzLl9mcmFtZUlkKTtcbiAgICAgICAgICAgIHRoaXMuX2ZyYW1lSWQgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fYWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fem9vbWluZyA9IHRydWU7XG4gICAgICAgIHRoaXMuX21hcC5maXJlKG5ldyBFdmVudCgnbW92ZXN0YXJ0Jywge29yaWdpbmFsRXZlbnQ6IGV9KSk7XG4gICAgICAgIHRoaXMuX21hcC5maXJlKG5ldyBFdmVudCgnem9vbXN0YXJ0Jywge29yaWdpbmFsRXZlbnQ6IGV9KSk7XG4gICAgICAgIGlmICh0aGlzLl9maW5pc2hUaW1lb3V0KSB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fZmluaXNoVGltZW91dCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwb3MgPSBET00ubW91c2VQb3ModGhpcy5fZWwsIGUpO1xuXG4gICAgICAgIHRoaXMuX2Fyb3VuZCA9IExuZ0xhdC5jb252ZXJ0KHRoaXMuX2Fyb3VuZENlbnRlciA/IHRoaXMuX21hcC5nZXRDZW50ZXIoKSA6IHRoaXMuX21hcC51bnByb2plY3QocG9zKSk7XG4gICAgICAgIHRoaXMuX2Fyb3VuZFBvaW50ID0gdGhpcy5fbWFwLnRyYW5zZm9ybS5sb2NhdGlvblBvaW50KHRoaXMuX2Fyb3VuZCk7XG4gICAgICAgIGlmICghdGhpcy5fZnJhbWVJZCkge1xuICAgICAgICAgICAgdGhpcy5fZnJhbWVJZCA9IHRoaXMuX21hcC5fcmVxdWVzdFJlbmRlckZyYW1lKHRoaXMuX29uU2Nyb2xsRnJhbWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX29uU2Nyb2xsRnJhbWUoKSB7XG4gICAgICAgIHRoaXMuX2ZyYW1lSWQgPSBudWxsO1xuXG4gICAgICAgIGlmICghdGhpcy5pc0FjdGl2ZSgpKSByZXR1cm47XG4gICAgICAgIGNvbnN0IHRyID0gdGhpcy5fbWFwLnRyYW5zZm9ybTtcblxuICAgICAgICAvLyBpZiB3ZSd2ZSBoYWQgc2Nyb2xsIGV2ZW50cyBzaW5jZSB0aGUgbGFzdCByZW5kZXIgZnJhbWUsIGNvbnN1bWUgdGhlXG4gICAgICAgIC8vIGFjY3VtdWxhdGVkIGRlbHRhLCBhbmQgdXBkYXRlIHRoZSB0YXJnZXQgem9vbSBsZXZlbCBhY2NvcmRpbmdseVxuICAgICAgICBpZiAodGhpcy5fZGVsdGEgIT09IDApIHtcbiAgICAgICAgICAgIC8vIEZvciB0cmFja3BhZCBldmVudHMgYW5kIHNpbmdsZSBtb3VzZSB3aGVlbCB0aWNrcywgdXNlIHRoZSBkZWZhdWx0IHpvb20gcmF0ZVxuICAgICAgICAgICAgY29uc3Qgem9vbVJhdGUgPSAodGhpcy5fdHlwZSA9PT0gJ3doZWVsJyAmJiBNYXRoLmFicyh0aGlzLl9kZWx0YSkgPiB3aGVlbFpvb21EZWx0YSkgPyB3aGVlbFpvb21SYXRlIDogZGVmYXVsdFpvb21SYXRlO1xuICAgICAgICAgICAgLy8gU2NhbGUgYnkgc2lnbW9pZCBvZiBzY3JvbGwgd2hlZWwgZGVsdGEuXG4gICAgICAgICAgICBsZXQgc2NhbGUgPSBtYXhTY2FsZVBlckZyYW1lIC8gKDEgKyBNYXRoLmV4cCgtTWF0aC5hYnModGhpcy5fZGVsdGEgKiB6b29tUmF0ZSkpKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuX2RlbHRhIDwgMCAmJiBzY2FsZSAhPT0gMCkge1xuICAgICAgICAgICAgICAgIHNjYWxlID0gMSAvIHNjYWxlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBmcm9tU2NhbGUgPSB0eXBlb2YgdGhpcy5fdGFyZ2V0Wm9vbSA9PT0gJ251bWJlcicgPyB0ci56b29tU2NhbGUodGhpcy5fdGFyZ2V0Wm9vbSkgOiB0ci5zY2FsZTtcbiAgICAgICAgICAgIHRoaXMuX3RhcmdldFpvb20gPSBNYXRoLm1pbih0ci5tYXhab29tLCBNYXRoLm1heCh0ci5taW5ab29tLCB0ci5zY2FsZVpvb20oZnJvbVNjYWxlICogc2NhbGUpKSk7XG5cbiAgICAgICAgICAgIC8vIGlmIHRoaXMgaXMgYSBtb3VzZSB3aGVlbCwgcmVmcmVzaCB0aGUgc3RhcnRpbmcgem9vbSBhbmQgZWFzaW5nXG4gICAgICAgICAgICAvLyBmdW5jdGlvbiB3ZSdyZSB1c2luZyB0byBzbW9vdGggb3V0IHRoZSB6b29taW5nIGJldHdlZW4gd2hlZWxcbiAgICAgICAgICAgIC8vIGV2ZW50c1xuICAgICAgICAgICAgaWYgKHRoaXMuX3R5cGUgPT09ICd3aGVlbCcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zdGFydFpvb20gPSB0ci56b29tO1xuICAgICAgICAgICAgICAgIHRoaXMuX2Vhc2luZyA9IHRoaXMuX3Ntb290aE91dEVhc2luZygyMDApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLl9kZWx0YSA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0YXJnZXRab29tID0gdHlwZW9mIHRoaXMuX3RhcmdldFpvb20gPT09ICdudW1iZXInID9cbiAgICAgICAgICAgIHRoaXMuX3RhcmdldFpvb20gOiB0ci56b29tO1xuICAgICAgICBjb25zdCBzdGFydFpvb20gPSB0aGlzLl9zdGFydFpvb207XG4gICAgICAgIGNvbnN0IGVhc2luZyA9IHRoaXMuX2Vhc2luZztcblxuICAgICAgICBsZXQgZmluaXNoZWQgPSBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMuX3R5cGUgPT09ICd3aGVlbCcgJiYgc3RhcnRab29tICYmIGVhc2luZykge1xuICAgICAgICAgICAgYXNzZXJ0KGVhc2luZyAmJiB0eXBlb2Ygc3RhcnRab29tID09PSAnbnVtYmVyJyk7XG5cbiAgICAgICAgICAgIGNvbnN0IHQgPSBNYXRoLm1pbigoYnJvd3Nlci5ub3coKSAtIHRoaXMuX2xhc3RXaGVlbEV2ZW50VGltZSkgLyAyMDAsIDEpO1xuICAgICAgICAgICAgY29uc3QgayA9IGVhc2luZyh0KTtcbiAgICAgICAgICAgIHRyLnpvb20gPSBpbnRlcnBvbGF0ZShzdGFydFpvb20sIHRhcmdldFpvb20sIGspO1xuICAgICAgICAgICAgaWYgKHQgPCAxKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLl9mcmFtZUlkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2ZyYW1lSWQgPSB0aGlzLl9tYXAuX3JlcXVlc3RSZW5kZXJGcmFtZSh0aGlzLl9vblNjcm9sbEZyYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZpbmlzaGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRyLnpvb20gPSB0YXJnZXRab29tO1xuICAgICAgICAgICAgZmluaXNoZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdHIuc2V0TG9jYXRpb25BdFBvaW50KHRoaXMuX2Fyb3VuZCwgdGhpcy5fYXJvdW5kUG9pbnQpO1xuXG4gICAgICAgIHRoaXMuX21hcC5maXJlKG5ldyBFdmVudCgnbW92ZScsIHtvcmlnaW5hbEV2ZW50OiB0aGlzLl9sYXN0V2hlZWxFdmVudH0pKTtcbiAgICAgICAgdGhpcy5fbWFwLmZpcmUobmV3IEV2ZW50KCd6b29tJywge29yaWdpbmFsRXZlbnQ6IHRoaXMuX2xhc3RXaGVlbEV2ZW50fSkpO1xuXG4gICAgICAgIGlmIChmaW5pc2hlZCkge1xuICAgICAgICAgICAgdGhpcy5fYWN0aXZlID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLl9maW5pc2hUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fem9vbWluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuX21hcC5maXJlKG5ldyBFdmVudCgnem9vbWVuZCcsIHtvcmlnaW5hbEV2ZW50OiB0aGlzLl9sYXN0V2hlZWxFdmVudH0pKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXAuZmlyZShuZXcgRXZlbnQoJ21vdmVlbmQnLCB7b3JpZ2luYWxFdmVudDogdGhpcy5fbGFzdFdoZWVsRXZlbnR9KSk7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuX3RhcmdldFpvb207XG4gICAgICAgICAgICB9LCAyMDApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX3Ntb290aE91dEVhc2luZyhkdXJhdGlvbjogbnVtYmVyKSB7XG4gICAgICAgIGxldCBlYXNpbmcgPSBfZWFzZTtcblxuICAgICAgICBpZiAodGhpcy5fcHJldkVhc2UpIHtcbiAgICAgICAgICAgIGNvbnN0IGVhc2UgPSB0aGlzLl9wcmV2RWFzZSxcbiAgICAgICAgICAgICAgICB0ID0gKGJyb3dzZXIubm93KCkgLSBlYXNlLnN0YXJ0KSAvIGVhc2UuZHVyYXRpb24sXG4gICAgICAgICAgICAgICAgc3BlZWQgPSBlYXNlLmVhc2luZyh0ICsgMC4wMSkgLSBlYXNlLmVhc2luZyh0KSxcblxuICAgICAgICAgICAgICAgIC8vIFF1aWNrIGhhY2sgdG8gbWFrZSBuZXcgYmV6aWVyIHRoYXQgaXMgY29udGludW91cyB3aXRoIGxhc3RcbiAgICAgICAgICAgICAgICB4ID0gMC4yNyAvIE1hdGguc3FydChzcGVlZCAqIHNwZWVkICsgMC4wMDAxKSAqIDAuMDEsXG4gICAgICAgICAgICAgICAgeSA9IE1hdGguc3FydCgwLjI3ICogMC4yNyAtIHggKiB4KTtcblxuICAgICAgICAgICAgZWFzaW5nID0gYmV6aWVyKHgsIHksIDAuMjUsIDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fcHJldkVhc2UgPSB7XG4gICAgICAgICAgICBzdGFydDogYnJvd3Nlci5ub3coKSxcbiAgICAgICAgICAgIGR1cmF0aW9uLFxuICAgICAgICAgICAgZWFzaW5nXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIGVhc2luZztcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFNjcm9sbFpvb21IYW5kbGVyO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IERPTSBmcm9tICcuLi8uLi91dGlsL2RvbSc7XG5cbmltcG9ydCB7IGJpbmRBbGwgfSBmcm9tICcuLi8uLi91dGlsL3V0aWwnO1xuaW1wb3J0IHdpbmRvdyBmcm9tICcuLi8uLi91dGlsL3dpbmRvdyc7XG5pbXBvcnQgeyBFdmVudCB9IGZyb20gJy4uLy4uL3V0aWwvZXZlbnRlZCc7XG5cbmltcG9ydCB0eXBlIE1hcCBmcm9tICcuLi9tYXAnO1xuXG4vKipcbiAqIFRoZSBgQm94Wm9vbUhhbmRsZXJgIGFsbG93cyB0aGUgdXNlciB0byB6b29tIHRoZSBtYXAgdG8gZml0IHdpdGhpbiBhIGJvdW5kaW5nIGJveC5cbiAqIFRoZSBib3VuZGluZyBib3ggaXMgZGVmaW5lZCBieSBjbGlja2luZyBhbmQgaG9sZGluZyBgc2hpZnRgIHdoaWxlIGRyYWdnaW5nIHRoZSBjdXJzb3IuXG4gKi9cbmNsYXNzIEJveFpvb21IYW5kbGVyIHtcbiAgICBfbWFwOiBNYXA7XG4gICAgX2VsOiBIVE1MRWxlbWVudDtcbiAgICBfY29udGFpbmVyOiBIVE1MRWxlbWVudDtcbiAgICBfZW5hYmxlZDogYm9vbGVhbjtcbiAgICBfYWN0aXZlOiBib29sZWFuO1xuICAgIF9zdGFydFBvczogUG9pbnQ7XG4gICAgX2xhc3RQb3M6IFBvaW50O1xuICAgIF9ib3g6IEhUTUxFbGVtZW50O1xuICAgIF9jbGlja1RvbGVyYW5jZTogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihtYXA6IE1hcCwgb3B0aW9uczoge1xuICAgICAgICBjbGlja1RvbGVyYW5jZT86IG51bWJlclxuICAgIH0pIHtcbiAgICAgICAgdGhpcy5fbWFwID0gbWFwO1xuICAgICAgICB0aGlzLl9lbCA9IG1hcC5nZXRDYW52YXNDb250YWluZXIoKTtcbiAgICAgICAgdGhpcy5fY29udGFpbmVyID0gbWFwLmdldENvbnRhaW5lcigpO1xuICAgICAgICB0aGlzLl9jbGlja1RvbGVyYW5jZSA9IG9wdGlvbnMuY2xpY2tUb2xlcmFuY2UgfHwgMTtcblxuICAgICAgICBiaW5kQWxsKFtcbiAgICAgICAgICAgICdfb25Nb3VzZU1vdmUnLFxuICAgICAgICAgICAgJ19vbk1vdXNlVXAnLFxuICAgICAgICAgICAgJ19vbktleURvd24nXG4gICAgICAgIF0sIHRoaXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBCb29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgXCJib3ggem9vbVwiIGludGVyYWN0aW9uIGlzIGVuYWJsZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSBcImJveCB6b29tXCIgaW50ZXJhY3Rpb24gaXMgZW5hYmxlZC5cbiAgICAgKi9cbiAgICBpc0VuYWJsZWQoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX2VuYWJsZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIEJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBcImJveCB6b29tXCIgaW50ZXJhY3Rpb24gaXMgYWN0aXZlLCBpLmUuIGN1cnJlbnRseSBiZWluZyB1c2VkLlxuICAgICAqXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgXCJib3ggem9vbVwiIGludGVyYWN0aW9uIGlzIGFjdGl2ZS5cbiAgICAgKi9cbiAgICBpc0FjdGl2ZSgpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5fYWN0aXZlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVuYWJsZXMgdGhlIFwiYm94IHpvb21cIiBpbnRlcmFjdGlvbi5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogICBtYXAuYm94Wm9vbS5lbmFibGUoKTtcbiAgICAgKi9cbiAgICBlbmFibGUoKSB7XG4gICAgICAgIGlmICh0aGlzLmlzRW5hYmxlZCgpKSByZXR1cm47XG4gICAgICAgIHRoaXMuX2VuYWJsZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERpc2FibGVzIHRoZSBcImJveCB6b29tXCIgaW50ZXJhY3Rpb24uXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqICAgbWFwLmJveFpvb20uZGlzYWJsZSgpO1xuICAgICAqL1xuICAgIGRpc2FibGUoKSB7XG4gICAgICAgIGlmICghdGhpcy5pc0VuYWJsZWQoKSkgcmV0dXJuO1xuICAgICAgICB0aGlzLl9lbmFibGVkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgb25Nb3VzZURvd24oZTogTW91c2VFdmVudCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNFbmFibGVkKCkpIHJldHVybjtcbiAgICAgICAgaWYgKCEoZS5zaGlmdEtleSAmJiBlLmJ1dHRvbiA9PT0gMCkpIHJldHVybjtcblxuICAgICAgICB3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5fb25Nb3VzZU1vdmUsIGZhbHNlKTtcbiAgICAgICAgd2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLl9vbktleURvd24sIGZhbHNlKTtcbiAgICAgICAgd2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLl9vbk1vdXNlVXAsIGZhbHNlKTtcblxuICAgICAgICBET00uZGlzYWJsZURyYWcoKTtcbiAgICAgICAgdGhpcy5fc3RhcnRQb3MgPSB0aGlzLl9sYXN0UG9zID0gRE9NLm1vdXNlUG9zKHRoaXMuX2VsLCBlKTtcbiAgICAgICAgdGhpcy5fYWN0aXZlID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBfb25Nb3VzZU1vdmUoZTogTW91c2VFdmVudCkge1xuICAgICAgICBjb25zdCBwb3MgPSBET00ubW91c2VQb3ModGhpcy5fZWwsIGUpO1xuXG4gICAgICAgIGlmICh0aGlzLl9sYXN0UG9zLmVxdWFscyhwb3MpIHx8ICghdGhpcy5fYm94ICYmIHBvcy5kaXN0KHRoaXMuX3N0YXJ0UG9zKSA8IHRoaXMuX2NsaWNrVG9sZXJhbmNlKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcDAgPSB0aGlzLl9zdGFydFBvcztcbiAgICAgICAgdGhpcy5fbGFzdFBvcyA9IHBvcztcblxuICAgICAgICBpZiAoIXRoaXMuX2JveCkge1xuICAgICAgICAgICAgdGhpcy5fYm94ID0gRE9NLmNyZWF0ZSgnZGl2JywgJ21hcGJveGdsLWJveHpvb20nLCB0aGlzLl9jb250YWluZXIpO1xuICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ21hcGJveGdsLWNyb3NzaGFpcicpO1xuICAgICAgICAgICAgdGhpcy5fZmlyZUV2ZW50KCdib3h6b29tc3RhcnQnLCBlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG1pblggPSBNYXRoLm1pbihwMC54LCBwb3MueCksXG4gICAgICAgICAgICBtYXhYID0gTWF0aC5tYXgocDAueCwgcG9zLngpLFxuICAgICAgICAgICAgbWluWSA9IE1hdGgubWluKHAwLnksIHBvcy55KSxcbiAgICAgICAgICAgIG1heFkgPSBNYXRoLm1heChwMC55LCBwb3MueSk7XG5cbiAgICAgICAgRE9NLnNldFRyYW5zZm9ybSh0aGlzLl9ib3gsIGB0cmFuc2xhdGUoJHttaW5YfXB4LCR7bWluWX1weClgKTtcblxuICAgICAgICB0aGlzLl9ib3guc3R5bGUud2lkdGggPSBgJHttYXhYIC0gbWluWH1weGA7XG4gICAgICAgIHRoaXMuX2JveC5zdHlsZS5oZWlnaHQgPSBgJHttYXhZIC0gbWluWX1weGA7XG4gICAgfVxuXG4gICAgX29uTW91c2VVcChlOiBNb3VzZUV2ZW50KSB7XG4gICAgICAgIGlmIChlLmJ1dHRvbiAhPT0gMCkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IHAwID0gdGhpcy5fc3RhcnRQb3MsXG4gICAgICAgICAgICBwMSA9IERPTS5tb3VzZVBvcyh0aGlzLl9lbCwgZSk7XG5cbiAgICAgICAgdGhpcy5fZmluaXNoKCk7XG5cbiAgICAgICAgRE9NLnN1cHByZXNzQ2xpY2soKTtcblxuICAgICAgICBpZiAocDAueCA9PT0gcDEueCAmJiBwMC55ID09PSBwMS55KSB7XG4gICAgICAgICAgICB0aGlzLl9maXJlRXZlbnQoJ2JveHpvb21jYW5jZWwnLCBlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX21hcFxuICAgICAgICAgICAgICAgIC5maXRTY3JlZW5Db29yZGluYXRlcyhwMCwgcDEsIHRoaXMuX21hcC5nZXRCZWFyaW5nKCksIHtsaW5lYXI6IHRydWV9KVxuICAgICAgICAgICAgICAgIC5maXJlKG5ldyBFdmVudCgnYm94em9vbWVuZCcsIHsgb3JpZ2luYWxFdmVudDogZX0pKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9vbktleURvd24oZTogS2V5Ym9hcmRFdmVudCkge1xuICAgICAgICBpZiAoZS5rZXlDb2RlID09PSAyNykge1xuICAgICAgICAgICAgdGhpcy5fZmluaXNoKCk7XG4gICAgICAgICAgICB0aGlzLl9maXJlRXZlbnQoJ2JveHpvb21jYW5jZWwnLCBlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9maW5pc2goKSB7XG4gICAgICAgIHRoaXMuX2FjdGl2ZSA9IGZhbHNlO1xuXG4gICAgICAgIHdpbmRvdy5kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLl9vbk1vdXNlTW92ZSwgZmFsc2UpO1xuICAgICAgICB3aW5kb3cuZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMuX29uS2V5RG93biwgZmFsc2UpO1xuICAgICAgICB3aW5kb3cuZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuX29uTW91c2VVcCwgZmFsc2UpO1xuXG4gICAgICAgIHRoaXMuX2NvbnRhaW5lci5jbGFzc0xpc3QucmVtb3ZlKCdtYXBib3hnbC1jcm9zc2hhaXInKTtcblxuICAgICAgICBpZiAodGhpcy5fYm94KSB7XG4gICAgICAgICAgICBET00ucmVtb3ZlKHRoaXMuX2JveCk7XG4gICAgICAgICAgICB0aGlzLl9ib3ggPSAobnVsbDogYW55KTtcbiAgICAgICAgfVxuXG4gICAgICAgIERPTS5lbmFibGVEcmFnKCk7XG5cbiAgICAgICAgZGVsZXRlIHRoaXMuX3N0YXJ0UG9zO1xuICAgICAgICBkZWxldGUgdGhpcy5fbGFzdFBvcztcbiAgICB9XG5cbiAgICBfZmlyZUV2ZW50KHR5cGU6IHN0cmluZywgZTogKikge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWFwLmZpcmUobmV3IEV2ZW50KHR5cGUsIHsgb3JpZ2luYWxFdmVudDogZSB9KSk7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBCb3hab29tSGFuZGxlcjtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCBET00gZnJvbSAnLi4vLi4vdXRpbC9kb20nO1xuXG5pbXBvcnQgeyBiZXppZXIsIGJpbmRBbGwgfSBmcm9tICcuLi8uLi91dGlsL3V0aWwnO1xuaW1wb3J0IHdpbmRvdyBmcm9tICcuLi8uLi91dGlsL3dpbmRvdyc7XG5pbXBvcnQgYnJvd3NlciBmcm9tICcuLi8uLi91dGlsL2Jyb3dzZXInO1xuaW1wb3J0IHsgRXZlbnQgfSBmcm9tICcuLi8uLi91dGlsL2V2ZW50ZWQnO1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5pbXBvcnQgdHlwZSBNYXAgZnJvbSAnLi4vbWFwJztcbmltcG9ydCB0eXBlIFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuaW1wb3J0IHR5cGUge1Rhc2tJRH0gZnJvbSAnLi4vLi4vdXRpbC90YXNrX3F1ZXVlJztcblxuY29uc3QgaW5lcnRpYUxpbmVhcml0eSA9IDAuMjUsXG4gICAgaW5lcnRpYUVhc2luZyA9IGJlemllcigwLCAwLCBpbmVydGlhTGluZWFyaXR5LCAxKSxcbiAgICBpbmVydGlhTWF4U3BlZWQgPSAxODAsIC8vIGRlZy9zXG4gICAgaW5lcnRpYURlY2VsZXJhdGlvbiA9IDcyMDsgLy8gZGVnL3NeMlxuXG4vKipcbiAqIFRoZSBgRHJhZ1JvdGF0ZUhhbmRsZXJgIGFsbG93cyB0aGUgdXNlciB0byByb3RhdGUgdGhlIG1hcCBieSBjbGlja2luZyBhbmRcbiAqIGRyYWdnaW5nIHRoZSBjdXJzb3Igd2hpbGUgaG9sZGluZyB0aGUgcmlnaHQgbW91c2UgYnV0dG9uIG9yIGBjdHJsYCBrZXkuXG4gKi9cbmNsYXNzIERyYWdSb3RhdGVIYW5kbGVyIHtcbiAgICBfbWFwOiBNYXA7XG4gICAgX2VsOiBIVE1MRWxlbWVudDtcbiAgICBfc3RhdGU6ICdkaXNhYmxlZCcgfCAnZW5hYmxlZCcgfCAncGVuZGluZycgfCAnYWN0aXZlJztcbiAgICBfYnV0dG9uOiAncmlnaHQnIHwgJ2xlZnQnO1xuICAgIF9ldmVudEJ1dHRvbjogbnVtYmVyO1xuICAgIF9iZWFyaW5nU25hcDogbnVtYmVyO1xuICAgIF9waXRjaFdpdGhSb3RhdGU6IGJvb2xlYW47XG5cbiAgICBfc3RhcnRQb3M6IFBvaW50O1xuICAgIF9sYXN0UG9zOiBQb2ludDtcbiAgICBfbGFzdE1vdmVFdmVudDogTW91c2VFdmVudDtcbiAgICBfaW5lcnRpYTogQXJyYXk8W251bWJlciwgbnVtYmVyXT47XG4gICAgX2NlbnRlcjogUG9pbnQ7XG4gICAgX2ZyYW1lSWQ6ID9UYXNrSUQ7XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge01hcH0gbWFwIFRoZSBNYXBib3ggR0wgSlMgbWFwIHRvIGFkZCB0aGUgaGFuZGxlciB0by5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLmJlYXJpbmdTbmFwXSBUaGUgdGhyZXNob2xkLCBtZWFzdXJlZCBpbiBkZWdyZWVzLCB0aGF0IGRldGVybWluZXMgd2hlbiB0aGUgbWFwJ3NcbiAgICAgKiAgIGJlYXJpbmcgd2lsbCBzbmFwIHRvIG5vcnRoLlxuICAgICAqIEBwYXJhbSB7Ym9vbH0gW29wdGlvbnMucGl0Y2hXaXRoUm90YXRlPXRydWVdIENvbnRyb2wgdGhlIG1hcCBwaXRjaCBpbiBhZGRpdGlvbiB0byB0aGUgYmVhcmluZ1xuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgY29uc3RydWN0b3IobWFwOiBNYXAsIG9wdGlvbnM6IHtcbiAgICAgICAgYnV0dG9uPzogJ3JpZ2h0JyB8ICdsZWZ0JyxcbiAgICAgICAgZWxlbWVudD86IEhUTUxFbGVtZW50LFxuICAgICAgICBiZWFyaW5nU25hcD86IG51bWJlcixcbiAgICAgICAgcGl0Y2hXaXRoUm90YXRlPzogYm9vbGVhblxuICAgIH0pIHtcbiAgICAgICAgdGhpcy5fbWFwID0gbWFwO1xuICAgICAgICB0aGlzLl9lbCA9IG9wdGlvbnMuZWxlbWVudCB8fCBtYXAuZ2V0Q2FudmFzQ29udGFpbmVyKCk7XG4gICAgICAgIHRoaXMuX3N0YXRlID0gJ2Rpc2FibGVkJztcbiAgICAgICAgdGhpcy5fYnV0dG9uID0gb3B0aW9ucy5idXR0b24gfHwgJ3JpZ2h0JztcbiAgICAgICAgdGhpcy5fYmVhcmluZ1NuYXAgPSBvcHRpb25zLmJlYXJpbmdTbmFwIHx8IDA7XG4gICAgICAgIHRoaXMuX3BpdGNoV2l0aFJvdGF0ZSA9IG9wdGlvbnMucGl0Y2hXaXRoUm90YXRlICE9PSBmYWxzZTtcblxuICAgICAgICBiaW5kQWxsKFtcbiAgICAgICAgICAgICdvbk1vdXNlRG93bicsXG4gICAgICAgICAgICAnX29uTW91c2VNb3ZlJyxcbiAgICAgICAgICAgICdfb25Nb3VzZVVwJyxcbiAgICAgICAgICAgICdfb25CbHVyJyxcbiAgICAgICAgICAgICdfb25EcmFnRnJhbWUnXG4gICAgICAgIF0sIHRoaXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBCb29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgXCJkcmFnIHRvIHJvdGF0ZVwiIGludGVyYWN0aW9uIGlzIGVuYWJsZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSBcImRyYWcgdG8gcm90YXRlXCIgaW50ZXJhY3Rpb24gaXMgZW5hYmxlZC5cbiAgICAgKi9cbiAgICBpc0VuYWJsZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdGF0ZSAhPT0gJ2Rpc2FibGVkJztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgQm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIFwiZHJhZyB0byByb3RhdGVcIiBpbnRlcmFjdGlvbiBpcyBhY3RpdmUsIGkuZS4gY3VycmVudGx5IGJlaW5nIHVzZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSBcImRyYWcgdG8gcm90YXRlXCIgaW50ZXJhY3Rpb24gaXMgYWN0aXZlLlxuICAgICAqL1xuICAgIGlzQWN0aXZlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3RhdGUgPT09ICdhY3RpdmUnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVuYWJsZXMgdGhlIFwiZHJhZyB0byByb3RhdGVcIiBpbnRlcmFjdGlvbi5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogbWFwLmRyYWdSb3RhdGUuZW5hYmxlKCk7XG4gICAgICovXG4gICAgZW5hYmxlKCkge1xuICAgICAgICBpZiAodGhpcy5pc0VuYWJsZWQoKSkgcmV0dXJuO1xuICAgICAgICB0aGlzLl9zdGF0ZSA9ICdlbmFibGVkJztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaXNhYmxlcyB0aGUgXCJkcmFnIHRvIHJvdGF0ZVwiIGludGVyYWN0aW9uLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBtYXAuZHJhZ1JvdGF0ZS5kaXNhYmxlKCk7XG4gICAgICovXG4gICAgZGlzYWJsZSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzRW5hYmxlZCgpKSByZXR1cm47XG4gICAgICAgIHN3aXRjaCAodGhpcy5fc3RhdGUpIHtcbiAgICAgICAgY2FzZSAnYWN0aXZlJzpcbiAgICAgICAgICAgIHRoaXMuX3N0YXRlID0gJ2Rpc2FibGVkJztcbiAgICAgICAgICAgIHRoaXMuX3VuYmluZCgpO1xuICAgICAgICAgICAgdGhpcy5fZGVhY3RpdmF0ZSgpO1xuICAgICAgICAgICAgdGhpcy5fZmlyZUV2ZW50KCdyb3RhdGVlbmQnKTtcbiAgICAgICAgICAgIGlmICh0aGlzLl9waXRjaFdpdGhSb3RhdGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9maXJlRXZlbnQoJ3BpdGNoZW5kJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9maXJlRXZlbnQoJ21vdmVlbmQnKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdwZW5kaW5nJzpcbiAgICAgICAgICAgIHRoaXMuX3N0YXRlID0gJ2Rpc2FibGVkJztcbiAgICAgICAgICAgIHRoaXMuX3VuYmluZCgpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB0aGlzLl9zdGF0ZSA9ICdkaXNhYmxlZCc7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uTW91c2VEb3duKGU6IE1vdXNlRXZlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuX3N0YXRlICE9PSAnZW5hYmxlZCcpIHJldHVybjtcblxuICAgICAgICBpZiAodGhpcy5fYnV0dG9uID09PSAncmlnaHQnKSB7XG4gICAgICAgICAgICB0aGlzLl9ldmVudEJ1dHRvbiA9IERPTS5tb3VzZUJ1dHRvbihlKTtcbiAgICAgICAgICAgIGlmICh0aGlzLl9ldmVudEJ1dHRvbiAhPT0gKGUuY3RybEtleSA/IDAgOiAyKSkgcmV0dXJuO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGUuY3RybEtleSB8fCBET00ubW91c2VCdXR0b24oZSkgIT09IDApIHJldHVybjtcbiAgICAgICAgICAgIHRoaXMuX2V2ZW50QnV0dG9uID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIERPTS5kaXNhYmxlRHJhZygpO1xuXG4gICAgICAgIC8vIEJpbmQgd2luZG93LWxldmVsIGV2ZW50IGxpc3RlbmVycyBmb3IgbW92ZSBhbmQgdXAvZW5kIGV2ZW50cy4gSW4gdGhlIGFic2VuY2Ugb2ZcbiAgICAgICAgLy8gdGhlIHBvaW50ZXIgY2FwdHVyZSBBUEksIHdoaWNoIGlzIG5vdCBzdXBwb3J0ZWQgYnkgYWxsIG5lY2Vzc2FyeSBwbGF0Zm9ybXMsXG4gICAgICAgIC8vIHdpbmRvdy1sZXZlbCBldmVudCBsaXN0ZW5lcnMgZ2l2ZSB1cyB0aGUgYmVzdCBzaG90IGF0IGNhcHR1cmluZyBldmVudHMgdGhhdFxuICAgICAgICAvLyBmYWxsIG91dHNpZGUgdGhlIG1hcCBjYW52YXMgZWxlbWVudC4gVXNlIGB7Y2FwdHVyZTogdHJ1ZX1gIGZvciB0aGUgbW92ZSBldmVudFxuICAgICAgICAvLyB0byBwcmV2ZW50IG1hcCBtb3ZlIGV2ZW50cyBmcm9tIGJlaW5nIGZpcmVkIGR1cmluZyBhIGRyYWcuXG4gICAgICAgIHdpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLl9vbk1vdXNlTW92ZSwge2NhcHR1cmU6IHRydWV9KTtcbiAgICAgICAgd2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLl9vbk1vdXNlVXApO1xuXG4gICAgICAgIC8vIERlYWN0aXZhdGUgd2hlbiB0aGUgd2luZG93IGxvc2VzIGZvY3VzLiBPdGhlcndpc2UgaWYgYSBtb3VzZXVwIG9jY3VycyB3aGVuIHRoZSB3aW5kb3dcbiAgICAgICAgLy8gaXNuJ3QgaW4gZm9jdXMsIGRyYWdnaW5nIHdpbGwgY29udGludWUgZXZlbiB0aG91Z2ggdGhlIG1vdXNlIGlzIG5vIGxvbmdlciBwcmVzc2VkLlxuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsIHRoaXMuX29uQmx1cik7XG5cbiAgICAgICAgdGhpcy5fc3RhdGUgPSAncGVuZGluZyc7XG4gICAgICAgIHRoaXMuX2luZXJ0aWEgPSBbW2Jyb3dzZXIubm93KCksIHRoaXMuX21hcC5nZXRCZWFyaW5nKCldXTtcbiAgICAgICAgdGhpcy5fc3RhcnRQb3MgPSB0aGlzLl9sYXN0UG9zID0gRE9NLm1vdXNlUG9zKHRoaXMuX2VsLCBlKTtcbiAgICAgICAgdGhpcy5fY2VudGVyID0gdGhpcy5fbWFwLnRyYW5zZm9ybS5jZW50ZXJQb2ludDsgIC8vIENlbnRlciBvZiByb3RhdGlvblxuXG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG5cbiAgICBfb25Nb3VzZU1vdmUoZTogTW91c2VFdmVudCkge1xuICAgICAgICBjb25zdCBwb3MgPSBET00ubW91c2VQb3ModGhpcy5fZWwsIGUpO1xuICAgICAgICBpZiAodGhpcy5fbGFzdFBvcy5lcXVhbHMocG9zKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fbGFzdE1vdmVFdmVudCA9IGU7XG4gICAgICAgIHRoaXMuX2xhc3RQb3MgPSBwb3M7XG5cbiAgICAgICAgaWYgKHRoaXMuX3N0YXRlID09PSAncGVuZGluZycpIHtcbiAgICAgICAgICAgIHRoaXMuX3N0YXRlID0gJ2FjdGl2ZSc7XG4gICAgICAgICAgICB0aGlzLl9maXJlRXZlbnQoJ3JvdGF0ZXN0YXJ0JywgZSk7XG4gICAgICAgICAgICB0aGlzLl9maXJlRXZlbnQoJ21vdmVzdGFydCcsIGUpO1xuICAgICAgICAgICAgaWYgKHRoaXMuX3BpdGNoV2l0aFJvdGF0ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2ZpcmVFdmVudCgncGl0Y2hzdGFydCcsIGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLl9mcmFtZUlkKSB7XG4gICAgICAgICAgICB0aGlzLl9mcmFtZUlkID0gdGhpcy5fbWFwLl9yZXF1ZXN0UmVuZGVyRnJhbWUodGhpcy5fb25EcmFnRnJhbWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX29uRHJhZ0ZyYW1lKCkge1xuICAgICAgICB0aGlzLl9mcmFtZUlkID0gbnVsbDtcblxuICAgICAgICBjb25zdCBlID0gdGhpcy5fbGFzdE1vdmVFdmVudDtcbiAgICAgICAgaWYgKCFlKSByZXR1cm47XG4gICAgICAgIGNvbnN0IHRyID0gdGhpcy5fbWFwLnRyYW5zZm9ybTtcblxuICAgICAgICBjb25zdCBwMSA9IHRoaXMuX3N0YXJ0UG9zLFxuICAgICAgICAgICAgcDIgPSB0aGlzLl9sYXN0UG9zLFxuICAgICAgICAgICAgYmVhcmluZ0RpZmYgPSAocDEueCAtIHAyLngpICogMC44LFxuICAgICAgICAgICAgcGl0Y2hEaWZmID0gKHAxLnkgLSBwMi55KSAqIC0wLjUsXG4gICAgICAgICAgICBiZWFyaW5nID0gdHIuYmVhcmluZyAtIGJlYXJpbmdEaWZmLFxuICAgICAgICAgICAgcGl0Y2ggPSB0ci5waXRjaCAtIHBpdGNoRGlmZixcbiAgICAgICAgICAgIGluZXJ0aWEgPSB0aGlzLl9pbmVydGlhLFxuICAgICAgICAgICAgbGFzdCA9IGluZXJ0aWFbaW5lcnRpYS5sZW5ndGggLSAxXTtcblxuICAgICAgICB0aGlzLl9kcmFpbkluZXJ0aWFCdWZmZXIoKTtcbiAgICAgICAgaW5lcnRpYS5wdXNoKFticm93c2VyLm5vdygpLCB0aGlzLl9tYXAuX25vcm1hbGl6ZUJlYXJpbmcoYmVhcmluZywgbGFzdFsxXSldKTtcblxuICAgICAgICB0ci5iZWFyaW5nID0gYmVhcmluZztcbiAgICAgICAgaWYgKHRoaXMuX3BpdGNoV2l0aFJvdGF0ZSkge1xuICAgICAgICAgICAgdGhpcy5fZmlyZUV2ZW50KCdwaXRjaCcsIGUpO1xuICAgICAgICAgICAgdHIucGl0Y2ggPSBwaXRjaDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2ZpcmVFdmVudCgncm90YXRlJywgZSk7XG4gICAgICAgIHRoaXMuX2ZpcmVFdmVudCgnbW92ZScsIGUpO1xuXG4gICAgICAgIGRlbGV0ZSB0aGlzLl9sYXN0TW92ZUV2ZW50O1xuICAgICAgICB0aGlzLl9zdGFydFBvcyA9IHRoaXMuX2xhc3RQb3M7XG4gICAgfVxuXG4gICAgX29uTW91c2VVcChlOiBNb3VzZUV2ZW50KSB7XG4gICAgICAgIGlmIChET00ubW91c2VCdXR0b24oZSkgIT09IHRoaXMuX2V2ZW50QnV0dG9uKSByZXR1cm47XG4gICAgICAgIHN3aXRjaCAodGhpcy5fc3RhdGUpIHtcbiAgICAgICAgY2FzZSAnYWN0aXZlJzpcbiAgICAgICAgICAgIHRoaXMuX3N0YXRlID0gJ2VuYWJsZWQnO1xuICAgICAgICAgICAgRE9NLnN1cHByZXNzQ2xpY2soKTtcbiAgICAgICAgICAgIHRoaXMuX3VuYmluZCgpO1xuICAgICAgICAgICAgdGhpcy5fZGVhY3RpdmF0ZSgpO1xuICAgICAgICAgICAgdGhpcy5faW5lcnRpYWxSb3RhdGUoZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAncGVuZGluZyc6XG4gICAgICAgICAgICB0aGlzLl9zdGF0ZSA9ICdlbmFibGVkJztcbiAgICAgICAgICAgIHRoaXMuX3VuYmluZCgpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBhc3NlcnQoZmFsc2UpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfb25CbHVyKGU6IEZvY3VzRXZlbnQpIHtcbiAgICAgICAgc3dpdGNoICh0aGlzLl9zdGF0ZSkge1xuICAgICAgICBjYXNlICdhY3RpdmUnOlxuICAgICAgICAgICAgdGhpcy5fc3RhdGUgPSAnZW5hYmxlZCc7XG4gICAgICAgICAgICB0aGlzLl91bmJpbmQoKTtcbiAgICAgICAgICAgIHRoaXMuX2RlYWN0aXZhdGUoKTtcbiAgICAgICAgICAgIHRoaXMuX2ZpcmVFdmVudCgncm90YXRlZW5kJywgZSk7XG4gICAgICAgICAgICBpZiAodGhpcy5fcGl0Y2hXaXRoUm90YXRlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZmlyZUV2ZW50KCdwaXRjaGVuZCcsIGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fZmlyZUV2ZW50KCdtb3ZlZW5kJywgZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAncGVuZGluZyc6XG4gICAgICAgICAgICB0aGlzLl9zdGF0ZSA9ICdlbmFibGVkJztcbiAgICAgICAgICAgIHRoaXMuX3VuYmluZCgpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBhc3NlcnQoZmFsc2UpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfdW5iaW5kKCkge1xuICAgICAgICB3aW5kb3cuZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5fb25Nb3VzZU1vdmUsIHtjYXB0dXJlOiB0cnVlfSk7XG4gICAgICAgIHdpbmRvdy5kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5fb25Nb3VzZVVwKTtcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2JsdXInLCB0aGlzLl9vbkJsdXIpO1xuICAgICAgICBET00uZW5hYmxlRHJhZygpO1xuICAgIH1cblxuICAgIF9kZWFjdGl2YXRlKCkge1xuICAgICAgICBpZiAodGhpcy5fZnJhbWVJZCkge1xuICAgICAgICAgICAgdGhpcy5fbWFwLl9jYW5jZWxSZW5kZXJGcmFtZSh0aGlzLl9mcmFtZUlkKTtcbiAgICAgICAgICAgIHRoaXMuX2ZyYW1lSWQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGRlbGV0ZSB0aGlzLl9sYXN0TW92ZUV2ZW50O1xuICAgICAgICBkZWxldGUgdGhpcy5fc3RhcnRQb3M7XG4gICAgICAgIGRlbGV0ZSB0aGlzLl9sYXN0UG9zO1xuICAgIH1cblxuICAgIF9pbmVydGlhbFJvdGF0ZShlOiBNb3VzZUV2ZW50KSB7XG4gICAgICAgIHRoaXMuX2ZpcmVFdmVudCgncm90YXRlZW5kJywgZSk7XG4gICAgICAgIHRoaXMuX2RyYWluSW5lcnRpYUJ1ZmZlcigpO1xuXG4gICAgICAgIGNvbnN0IG1hcCA9IHRoaXMuX21hcCxcbiAgICAgICAgICAgIG1hcEJlYXJpbmcgPSBtYXAuZ2V0QmVhcmluZygpLFxuICAgICAgICAgICAgaW5lcnRpYSA9IHRoaXMuX2luZXJ0aWE7XG5cbiAgICAgICAgY29uc3QgZmluaXNoID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKE1hdGguYWJzKG1hcEJlYXJpbmcpIDwgdGhpcy5fYmVhcmluZ1NuYXApIHtcbiAgICAgICAgICAgICAgICBtYXAucmVzZXROb3J0aCh7bm9Nb3ZlU3RhcnQ6IHRydWV9LCB7IG9yaWdpbmFsRXZlbnQ6IGUgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX2ZpcmVFdmVudCgnbW92ZWVuZCcsIGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuX3BpdGNoV2l0aFJvdGF0ZSkgdGhpcy5fZmlyZUV2ZW50KCdwaXRjaGVuZCcsIGUpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChpbmVydGlhLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICAgIGZpbmlzaCgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmlyc3QgPSBpbmVydGlhWzBdLFxuICAgICAgICAgICAgbGFzdCA9IGluZXJ0aWFbaW5lcnRpYS5sZW5ndGggLSAxXSxcbiAgICAgICAgICAgIHByZXZpb3VzID0gaW5lcnRpYVtpbmVydGlhLmxlbmd0aCAtIDJdO1xuICAgICAgICBsZXQgYmVhcmluZyA9IG1hcC5fbm9ybWFsaXplQmVhcmluZyhtYXBCZWFyaW5nLCBwcmV2aW91c1sxXSk7XG4gICAgICAgIGNvbnN0IGZsaW5nRGlmZiA9IGxhc3RbMV0gLSBmaXJzdFsxXSxcbiAgICAgICAgICAgIHNpZ24gPSBmbGluZ0RpZmYgPCAwID8gLTEgOiAxLFxuICAgICAgICAgICAgZmxpbmdEdXJhdGlvbiA9IChsYXN0WzBdIC0gZmlyc3RbMF0pIC8gMTAwMDtcblxuICAgICAgICBpZiAoZmxpbmdEaWZmID09PSAwIHx8IGZsaW5nRHVyYXRpb24gPT09IDApIHtcbiAgICAgICAgICAgIGZpbmlzaCgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHNwZWVkID0gTWF0aC5hYnMoZmxpbmdEaWZmICogKGluZXJ0aWFMaW5lYXJpdHkgLyBmbGluZ0R1cmF0aW9uKSk7ICAvLyBkZWcvc1xuICAgICAgICBpZiAoc3BlZWQgPiBpbmVydGlhTWF4U3BlZWQpIHtcbiAgICAgICAgICAgIHNwZWVkID0gaW5lcnRpYU1heFNwZWVkO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZHVyYXRpb24gPSBzcGVlZCAvIChpbmVydGlhRGVjZWxlcmF0aW9uICogaW5lcnRpYUxpbmVhcml0eSksXG4gICAgICAgICAgICBvZmZzZXQgPSBzaWduICogc3BlZWQgKiAoZHVyYXRpb24gLyAyKTtcblxuICAgICAgICBiZWFyaW5nICs9IG9mZnNldDtcblxuICAgICAgICBpZiAoTWF0aC5hYnMobWFwLl9ub3JtYWxpemVCZWFyaW5nKGJlYXJpbmcsIDApKSA8IHRoaXMuX2JlYXJpbmdTbmFwKSB7XG4gICAgICAgICAgICBiZWFyaW5nID0gbWFwLl9ub3JtYWxpemVCZWFyaW5nKDAsIGJlYXJpbmcpO1xuICAgICAgICB9XG5cbiAgICAgICAgbWFwLnJvdGF0ZVRvKGJlYXJpbmcsIHtcbiAgICAgICAgICAgIGR1cmF0aW9uOiBkdXJhdGlvbiAqIDEwMDAsXG4gICAgICAgICAgICBlYXNpbmc6IGluZXJ0aWFFYXNpbmcsXG4gICAgICAgICAgICBub01vdmVTdGFydDogdHJ1ZVxuICAgICAgICB9LCB7IG9yaWdpbmFsRXZlbnQ6IGUgfSk7XG4gICAgfVxuXG4gICAgX2ZpcmVFdmVudCh0eXBlOiBzdHJpbmcsIGU6ICopIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21hcC5maXJlKG5ldyBFdmVudCh0eXBlLCBlID8geyBvcmlnaW5hbEV2ZW50OiBlIH0gOiB7fSkpO1xuICAgIH1cblxuICAgIF9kcmFpbkluZXJ0aWFCdWZmZXIoKSB7XG4gICAgICAgIGNvbnN0IGluZXJ0aWEgPSB0aGlzLl9pbmVydGlhLFxuICAgICAgICAgICAgbm93ID0gYnJvd3Nlci5ub3coKSxcbiAgICAgICAgICAgIGN1dG9mZiA9IDE2MDsgICAvL21zZWNcblxuICAgICAgICB3aGlsZSAoaW5lcnRpYS5sZW5ndGggPiAwICYmIG5vdyAtIGluZXJ0aWFbMF1bMF0gPiBjdXRvZmYpXG4gICAgICAgICAgICBpbmVydGlhLnNoaWZ0KCk7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBEcmFnUm90YXRlSGFuZGxlcjtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCBET00gZnJvbSAnLi4vLi4vdXRpbC9kb20nO1xuaW1wb3J0IHsgYmV6aWVyLCBiaW5kQWxsIH0gZnJvbSAnLi4vLi4vdXRpbC91dGlsJztcbmltcG9ydCB3aW5kb3cgZnJvbSAnLi4vLi4vdXRpbC93aW5kb3cnO1xuaW1wb3J0IGJyb3dzZXIgZnJvbSAnLi4vLi4vdXRpbC9icm93c2VyJztcbmltcG9ydCB7IEV2ZW50IH0gZnJvbSAnLi4vLi4vdXRpbC9ldmVudGVkJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcblxuaW1wb3J0IHR5cGUgTWFwIGZyb20gJy4uL21hcCc7XG5pbXBvcnQgdHlwZSBQb2ludCBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcbmltcG9ydCB0eXBlIHtUYXNrSUR9IGZyb20gJy4uLy4uL3V0aWwvdGFza19xdWV1ZSc7XG5cbmNvbnN0IGluZXJ0aWFMaW5lYXJpdHkgPSAwLjMsXG4gICAgaW5lcnRpYUVhc2luZyA9IGJlemllcigwLCAwLCBpbmVydGlhTGluZWFyaXR5LCAxKSxcbiAgICBpbmVydGlhTWF4U3BlZWQgPSAxNDAwLCAvLyBweC9zXG4gICAgaW5lcnRpYURlY2VsZXJhdGlvbiA9IDI1MDA7IC8vIHB4L3NeMlxuXG4vKipcbiAqIFRoZSBgRHJhZ1BhbkhhbmRsZXJgIGFsbG93cyB0aGUgdXNlciB0byBwYW4gdGhlIG1hcCBieSBjbGlja2luZyBhbmQgZHJhZ2dpbmdcbiAqIHRoZSBjdXJzb3IuXG4gKi9cbmNsYXNzIERyYWdQYW5IYW5kbGVyIHtcbiAgICBfbWFwOiBNYXA7XG4gICAgX2VsOiBIVE1MRWxlbWVudDtcbiAgICBfc3RhdGU6ICdkaXNhYmxlZCcgfCAnZW5hYmxlZCcgfCAncGVuZGluZycgfCAnYWN0aXZlJztcbiAgICBfc3RhcnRQb3M6IFBvaW50O1xuICAgIF9tb3VzZURvd25Qb3M6IFBvaW50O1xuICAgIF9sYXN0UG9zOiBQb2ludDtcbiAgICBfbGFzdE1vdmVFdmVudDogTW91c2VFdmVudCB8IFRvdWNoRXZlbnQgfCB2b2lkO1xuICAgIF9pbmVydGlhOiBBcnJheTxbbnVtYmVyLCBQb2ludF0+O1xuICAgIF9mcmFtZUlkOiA/VGFza0lEO1xuICAgIF9jbGlja1RvbGVyYW5jZTogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihtYXA6IE1hcCwgb3B0aW9uczoge1xuICAgICAgICBjbGlja1RvbGVyYW5jZT86IG51bWJlclxuICAgIH0pIHtcbiAgICAgICAgdGhpcy5fbWFwID0gbWFwO1xuICAgICAgICB0aGlzLl9lbCA9IG1hcC5nZXRDYW52YXNDb250YWluZXIoKTtcbiAgICAgICAgdGhpcy5fc3RhdGUgPSAnZGlzYWJsZWQnO1xuICAgICAgICB0aGlzLl9jbGlja1RvbGVyYW5jZSA9IG9wdGlvbnMuY2xpY2tUb2xlcmFuY2UgfHwgMTtcblxuICAgICAgICBiaW5kQWxsKFtcbiAgICAgICAgICAgICdfb25Nb3ZlJyxcbiAgICAgICAgICAgICdfb25Nb3VzZVVwJyxcbiAgICAgICAgICAgICdfb25Ub3VjaEVuZCcsXG4gICAgICAgICAgICAnX29uQmx1cicsXG4gICAgICAgICAgICAnX29uRHJhZ0ZyYW1lJ1xuICAgICAgICBdLCB0aGlzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgQm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIFwiZHJhZyB0byBwYW5cIiBpbnRlcmFjdGlvbiBpcyBlbmFibGVkLlxuICAgICAqXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgXCJkcmFnIHRvIHBhblwiIGludGVyYWN0aW9uIGlzIGVuYWJsZWQuXG4gICAgICovXG4gICAgaXNFbmFibGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3RhdGUgIT09ICdkaXNhYmxlZCc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIEJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBcImRyYWcgdG8gcGFuXCIgaW50ZXJhY3Rpb24gaXMgYWN0aXZlLCBpLmUuIGN1cnJlbnRseSBiZWluZyB1c2VkLlxuICAgICAqXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgXCJkcmFnIHRvIHBhblwiIGludGVyYWN0aW9uIGlzIGFjdGl2ZS5cbiAgICAgKi9cbiAgICBpc0FjdGl2ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0YXRlID09PSAnYWN0aXZlJztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbmFibGVzIHRoZSBcImRyYWcgdG8gcGFuXCIgaW50ZXJhY3Rpb24uXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIG1hcC5kcmFnUGFuLmVuYWJsZSgpO1xuICAgICAqL1xuICAgIGVuYWJsZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNFbmFibGVkKCkpIHJldHVybjtcbiAgICAgICAgdGhpcy5fZWwuY2xhc3NMaXN0LmFkZCgnbWFwYm94Z2wtdG91Y2gtZHJhZy1wYW4nKTtcbiAgICAgICAgdGhpcy5fc3RhdGUgPSAnZW5hYmxlZCc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGlzYWJsZXMgdGhlIFwiZHJhZyB0byBwYW5cIiBpbnRlcmFjdGlvbi5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogbWFwLmRyYWdQYW4uZGlzYWJsZSgpO1xuICAgICAqL1xuICAgIGRpc2FibGUoKSB7XG4gICAgICAgIGlmICghdGhpcy5pc0VuYWJsZWQoKSkgcmV0dXJuO1xuICAgICAgICB0aGlzLl9lbC5jbGFzc0xpc3QucmVtb3ZlKCdtYXBib3hnbC10b3VjaC1kcmFnLXBhbicpO1xuICAgICAgICBzd2l0Y2ggKHRoaXMuX3N0YXRlKSB7XG4gICAgICAgIGNhc2UgJ2FjdGl2ZSc6XG4gICAgICAgICAgICB0aGlzLl9zdGF0ZSA9ICdkaXNhYmxlZCc7XG4gICAgICAgICAgICB0aGlzLl91bmJpbmQoKTtcbiAgICAgICAgICAgIHRoaXMuX2RlYWN0aXZhdGUoKTtcbiAgICAgICAgICAgIHRoaXMuX2ZpcmVFdmVudCgnZHJhZ2VuZCcpO1xuICAgICAgICAgICAgdGhpcy5fZmlyZUV2ZW50KCdtb3ZlZW5kJyk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAncGVuZGluZyc6XG4gICAgICAgICAgICB0aGlzLl9zdGF0ZSA9ICdkaXNhYmxlZCc7XG4gICAgICAgICAgICB0aGlzLl91bmJpbmQoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhpcy5fc3RhdGUgPSAnZGlzYWJsZWQnO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbk1vdXNlRG93bihlOiBNb3VzZUV2ZW50KSB7XG4gICAgICAgIGlmICh0aGlzLl9zdGF0ZSAhPT0gJ2VuYWJsZWQnKSByZXR1cm47XG4gICAgICAgIGlmIChlLmN0cmxLZXkgfHwgRE9NLm1vdXNlQnV0dG9uKGUpICE9PSAwKSByZXR1cm47XG5cbiAgICAgICAgLy8gQmluZCB3aW5kb3ctbGV2ZWwgZXZlbnQgbGlzdGVuZXJzIGZvciBtb3VzZW1vdmUvdXAgZXZlbnRzLiBJbiB0aGUgYWJzZW5jZSBvZlxuICAgICAgICAvLyB0aGUgcG9pbnRlciBjYXB0dXJlIEFQSSwgd2hpY2ggaXMgbm90IHN1cHBvcnRlZCBieSBhbGwgbmVjZXNzYXJ5IHBsYXRmb3JtcyxcbiAgICAgICAgLy8gd2luZG93LWxldmVsIGV2ZW50IGxpc3RlbmVycyBnaXZlIHVzIHRoZSBiZXN0IHNob3QgYXQgY2FwdHVyaW5nIGV2ZW50cyB0aGF0XG4gICAgICAgIC8vIGZhbGwgb3V0c2lkZSB0aGUgbWFwIGNhbnZhcyBlbGVtZW50LiBVc2UgYHtjYXB0dXJlOiB0cnVlfWAgZm9yIHRoZSBtb3ZlIGV2ZW50XG4gICAgICAgIC8vIHRvIHByZXZlbnQgbWFwIG1vdmUgZXZlbnRzIGZyb20gYmVpbmcgZmlyZWQgZHVyaW5nIGEgZHJhZy5cbiAgICAgICAgRE9NLmFkZEV2ZW50TGlzdGVuZXIod2luZG93LmRvY3VtZW50LCAnbW91c2Vtb3ZlJywgdGhpcy5fb25Nb3ZlLCB7Y2FwdHVyZTogdHJ1ZX0pO1xuICAgICAgICBET00uYWRkRXZlbnRMaXN0ZW5lcih3aW5kb3cuZG9jdW1lbnQsICdtb3VzZXVwJywgdGhpcy5fb25Nb3VzZVVwKTtcblxuICAgICAgICB0aGlzLl9zdGFydChlKTtcbiAgICB9XG5cbiAgICBvblRvdWNoU3RhcnQoZTogVG91Y2hFdmVudCkge1xuICAgICAgICBpZiAodGhpcy5fc3RhdGUgIT09ICdlbmFibGVkJykgcmV0dXJuO1xuICAgICAgICBpZiAoZS50b3VjaGVzLmxlbmd0aCA+IDEpIHJldHVybjtcblxuICAgICAgICAvLyBCaW5kIHdpbmRvdy1sZXZlbCBldmVudCBsaXN0ZW5lcnMgZm9yIHRvdWNobW92ZS9lbmQgZXZlbnRzLiBJbiB0aGUgYWJzZW5jZSBvZlxuICAgICAgICAvLyB0aGUgcG9pbnRlciBjYXB0dXJlIEFQSSwgd2hpY2ggaXMgbm90IHN1cHBvcnRlZCBieSBhbGwgbmVjZXNzYXJ5IHBsYXRmb3JtcyxcbiAgICAgICAgLy8gd2luZG93LWxldmVsIGV2ZW50IGxpc3RlbmVycyBnaXZlIHVzIHRoZSBiZXN0IHNob3QgYXQgY2FwdHVyaW5nIGV2ZW50cyB0aGF0XG4gICAgICAgIC8vIGZhbGwgb3V0c2lkZSB0aGUgbWFwIGNhbnZhcyBlbGVtZW50LiBVc2UgYHtjYXB0dXJlOiB0cnVlfWAgZm9yIHRoZSBtb3ZlIGV2ZW50XG4gICAgICAgIC8vIHRvIHByZXZlbnQgbWFwIG1vdmUgZXZlbnRzIGZyb20gYmVpbmcgZmlyZWQgZHVyaW5nIGEgZHJhZy5cbiAgICAgICAgRE9NLmFkZEV2ZW50TGlzdGVuZXIod2luZG93LmRvY3VtZW50LCAndG91Y2htb3ZlJywgdGhpcy5fb25Nb3ZlLCB7Y2FwdHVyZTogdHJ1ZSwgcGFzc2l2ZTogZmFsc2V9KTtcbiAgICAgICAgRE9NLmFkZEV2ZW50TGlzdGVuZXIod2luZG93LmRvY3VtZW50LCAndG91Y2hlbmQnLCB0aGlzLl9vblRvdWNoRW5kKTtcblxuICAgICAgICB0aGlzLl9zdGFydChlKTtcbiAgICB9XG5cbiAgICBfc3RhcnQoZTogTW91c2VFdmVudCB8IFRvdWNoRXZlbnQpIHtcbiAgICAgICAgLy8gRGVhY3RpdmF0ZSB3aGVuIHRoZSB3aW5kb3cgbG9zZXMgZm9jdXMuIE90aGVyd2lzZSBpZiBhIG1vdXNldXAgb2NjdXJzIHdoZW4gdGhlIHdpbmRvd1xuICAgICAgICAvLyBpc24ndCBpbiBmb2N1cywgZHJhZ2dpbmcgd2lsbCBjb250aW51ZSBldmVuIHRob3VnaCB0aGUgbW91c2UgaXMgbm8gbG9uZ2VyIHByZXNzZWQuXG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdibHVyJywgdGhpcy5fb25CbHVyKTtcblxuICAgICAgICB0aGlzLl9zdGF0ZSA9ICdwZW5kaW5nJztcbiAgICAgICAgdGhpcy5fc3RhcnRQb3MgPSB0aGlzLl9tb3VzZURvd25Qb3MgPSB0aGlzLl9sYXN0UG9zID0gRE9NLm1vdXNlUG9zKHRoaXMuX2VsLCBlKTtcbiAgICAgICAgdGhpcy5faW5lcnRpYSA9IFtbYnJvd3Nlci5ub3coKSwgdGhpcy5fc3RhcnRQb3NdXTtcbiAgICB9XG5cbiAgICBfb25Nb3ZlKGU6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50KSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICBjb25zdCBwb3MgPSBET00ubW91c2VQb3ModGhpcy5fZWwsIGUpO1xuICAgICAgICBpZiAodGhpcy5fbGFzdFBvcy5lcXVhbHMocG9zKSB8fCAodGhpcy5fc3RhdGUgPT09ICdwZW5kaW5nJyAmJiBwb3MuZGlzdCh0aGlzLl9tb3VzZURvd25Qb3MpIDwgdGhpcy5fY2xpY2tUb2xlcmFuY2UpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9sYXN0TW92ZUV2ZW50ID0gZTtcbiAgICAgICAgdGhpcy5fbGFzdFBvcyA9IHBvcztcbiAgICAgICAgdGhpcy5fZHJhaW5JbmVydGlhQnVmZmVyKCk7XG4gICAgICAgIHRoaXMuX2luZXJ0aWEucHVzaChbYnJvd3Nlci5ub3coKSwgdGhpcy5fbGFzdFBvc10pO1xuXG4gICAgICAgIGlmICh0aGlzLl9zdGF0ZSA9PT0gJ3BlbmRpbmcnKSB7XG4gICAgICAgICAgICAvLyB3ZSB0cmVhdCB0aGUgZmlyc3QgbW92ZSBldmVudCAocmF0aGVyIHRoYW4gdGhlIG1vdXNlZG93biBldmVudClcbiAgICAgICAgICAgIC8vIGFzIHRoZSBzdGFydCBvZiB0aGUgZHJhZ1xuICAgICAgICAgICAgdGhpcy5fc3RhdGUgPSAnYWN0aXZlJztcbiAgICAgICAgICAgIHRoaXMuX2ZpcmVFdmVudCgnZHJhZ3N0YXJ0JywgZSk7XG4gICAgICAgICAgICB0aGlzLl9maXJlRXZlbnQoJ21vdmVzdGFydCcsIGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLl9mcmFtZUlkKSB7XG4gICAgICAgICAgICB0aGlzLl9mcmFtZUlkID0gdGhpcy5fbWFwLl9yZXF1ZXN0UmVuZGVyRnJhbWUodGhpcy5fb25EcmFnRnJhbWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FsbGVkIGluIGVhY2ggcmVuZGVyIGZyYW1lIHdoaWxlIGRyYWdnaW5nIGlzIGhhcHBlbmluZy5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9vbkRyYWdGcmFtZSgpIHtcbiAgICAgICAgdGhpcy5fZnJhbWVJZCA9IG51bGw7XG5cbiAgICAgICAgY29uc3QgZSA9IHRoaXMuX2xhc3RNb3ZlRXZlbnQ7XG4gICAgICAgIGlmICghZSkgcmV0dXJuO1xuICAgICAgICBjb25zdCB0ciA9IHRoaXMuX21hcC50cmFuc2Zvcm07XG4gICAgICAgIHRyLnNldExvY2F0aW9uQXRQb2ludCh0ci5wb2ludExvY2F0aW9uKHRoaXMuX3N0YXJ0UG9zKSwgdGhpcy5fbGFzdFBvcyk7XG4gICAgICAgIHRoaXMuX2ZpcmVFdmVudCgnZHJhZycsIGUpO1xuICAgICAgICB0aGlzLl9maXJlRXZlbnQoJ21vdmUnLCBlKTtcblxuICAgICAgICB0aGlzLl9zdGFydFBvcyA9IHRoaXMuX2xhc3RQb3M7XG4gICAgICAgIGRlbGV0ZSB0aGlzLl9sYXN0TW92ZUV2ZW50O1xuICAgIH1cblxuICAgIF9vbk1vdXNlVXAoZTogTW91c2VFdmVudCkge1xuICAgICAgICBpZiAoRE9NLm1vdXNlQnV0dG9uKGUpICE9PSAwKSByZXR1cm47XG4gICAgICAgIHN3aXRjaCAodGhpcy5fc3RhdGUpIHtcbiAgICAgICAgY2FzZSAnYWN0aXZlJzpcbiAgICAgICAgICAgIHRoaXMuX3N0YXRlID0gJ2VuYWJsZWQnO1xuICAgICAgICAgICAgRE9NLnN1cHByZXNzQ2xpY2soKTtcbiAgICAgICAgICAgIHRoaXMuX3VuYmluZCgpO1xuICAgICAgICAgICAgdGhpcy5fZGVhY3RpdmF0ZSgpO1xuICAgICAgICAgICAgdGhpcy5faW5lcnRpYWxQYW4oZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAncGVuZGluZyc6XG4gICAgICAgICAgICB0aGlzLl9zdGF0ZSA9ICdlbmFibGVkJztcbiAgICAgICAgICAgIHRoaXMuX3VuYmluZCgpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBhc3NlcnQoZmFsc2UpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfb25Ub3VjaEVuZChlOiBUb3VjaEV2ZW50KSB7XG4gICAgICAgIHN3aXRjaCAodGhpcy5fc3RhdGUpIHtcbiAgICAgICAgY2FzZSAnYWN0aXZlJzpcbiAgICAgICAgICAgIHRoaXMuX3N0YXRlID0gJ2VuYWJsZWQnO1xuICAgICAgICAgICAgdGhpcy5fdW5iaW5kKCk7XG4gICAgICAgICAgICB0aGlzLl9kZWFjdGl2YXRlKCk7XG4gICAgICAgICAgICB0aGlzLl9pbmVydGlhbFBhbihlKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdwZW5kaW5nJzpcbiAgICAgICAgICAgIHRoaXMuX3N0YXRlID0gJ2VuYWJsZWQnO1xuICAgICAgICAgICAgdGhpcy5fdW5iaW5kKCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGFzc2VydChmYWxzZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9vbkJsdXIoZTogRm9jdXNFdmVudCkge1xuICAgICAgICBzd2l0Y2ggKHRoaXMuX3N0YXRlKSB7XG4gICAgICAgIGNhc2UgJ2FjdGl2ZSc6XG4gICAgICAgICAgICB0aGlzLl9zdGF0ZSA9ICdlbmFibGVkJztcbiAgICAgICAgICAgIHRoaXMuX3VuYmluZCgpO1xuICAgICAgICAgICAgdGhpcy5fZGVhY3RpdmF0ZSgpO1xuICAgICAgICAgICAgdGhpcy5fZmlyZUV2ZW50KCdkcmFnZW5kJywgZSk7XG4gICAgICAgICAgICB0aGlzLl9maXJlRXZlbnQoJ21vdmVlbmQnLCBlKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdwZW5kaW5nJzpcbiAgICAgICAgICAgIHRoaXMuX3N0YXRlID0gJ2VuYWJsZWQnO1xuICAgICAgICAgICAgdGhpcy5fdW5iaW5kKCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGFzc2VydChmYWxzZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF91bmJpbmQoKSB7XG4gICAgICAgIERPTS5yZW1vdmVFdmVudExpc3RlbmVyKHdpbmRvdy5kb2N1bWVudCwgJ3RvdWNobW92ZScsIHRoaXMuX29uTW92ZSwge2NhcHR1cmU6IHRydWUsIHBhc3NpdmU6IGZhbHNlfSk7XG4gICAgICAgIERPTS5yZW1vdmVFdmVudExpc3RlbmVyKHdpbmRvdy5kb2N1bWVudCwgJ3RvdWNoZW5kJywgdGhpcy5fb25Ub3VjaEVuZCk7XG4gICAgICAgIERPTS5yZW1vdmVFdmVudExpc3RlbmVyKHdpbmRvdy5kb2N1bWVudCwgJ21vdXNlbW92ZScsIHRoaXMuX29uTW92ZSwge2NhcHR1cmU6IHRydWV9KTtcbiAgICAgICAgRE9NLnJlbW92ZUV2ZW50TGlzdGVuZXIod2luZG93LmRvY3VtZW50LCAnbW91c2V1cCcsIHRoaXMuX29uTW91c2VVcCk7XG4gICAgICAgIERPTS5yZW1vdmVFdmVudExpc3RlbmVyKHdpbmRvdywgJ2JsdXInLCB0aGlzLl9vbkJsdXIpO1xuICAgIH1cblxuICAgIF9kZWFjdGl2YXRlKCkge1xuICAgICAgICBpZiAodGhpcy5fZnJhbWVJZCkge1xuICAgICAgICAgICAgdGhpcy5fbWFwLl9jYW5jZWxSZW5kZXJGcmFtZSh0aGlzLl9mcmFtZUlkKTtcbiAgICAgICAgICAgIHRoaXMuX2ZyYW1lSWQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGRlbGV0ZSB0aGlzLl9sYXN0TW92ZUV2ZW50O1xuICAgICAgICBkZWxldGUgdGhpcy5fc3RhcnRQb3M7XG4gICAgICAgIGRlbGV0ZSB0aGlzLl9tb3VzZURvd25Qb3M7XG4gICAgICAgIGRlbGV0ZSB0aGlzLl9sYXN0UG9zO1xuICAgIH1cblxuICAgIF9pbmVydGlhbFBhbihlOiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCkge1xuICAgICAgICB0aGlzLl9maXJlRXZlbnQoJ2RyYWdlbmQnLCBlKTtcblxuICAgICAgICB0aGlzLl9kcmFpbkluZXJ0aWFCdWZmZXIoKTtcbiAgICAgICAgY29uc3QgaW5lcnRpYSA9IHRoaXMuX2luZXJ0aWE7XG4gICAgICAgIGlmIChpbmVydGlhLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICAgIHRoaXMuX2ZpcmVFdmVudCgnbW92ZWVuZCcsIGUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbGFzdCA9IGluZXJ0aWFbaW5lcnRpYS5sZW5ndGggLSAxXSxcbiAgICAgICAgICAgIGZpcnN0ID0gaW5lcnRpYVswXSxcbiAgICAgICAgICAgIGZsaW5nT2Zmc2V0ID0gbGFzdFsxXS5zdWIoZmlyc3RbMV0pLFxuICAgICAgICAgICAgZmxpbmdEdXJhdGlvbiA9IChsYXN0WzBdIC0gZmlyc3RbMF0pIC8gMTAwMDtcblxuICAgICAgICBpZiAoZmxpbmdEdXJhdGlvbiA9PT0gMCB8fCBsYXN0WzFdLmVxdWFscyhmaXJzdFsxXSkpIHtcbiAgICAgICAgICAgIHRoaXMuX2ZpcmVFdmVudCgnbW92ZWVuZCcsIGUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY2FsY3VsYXRlIHB4L3MgdmVsb2NpdHkgJiBhZGp1c3QgZm9yIGluY3JlYXNlZCBpbml0aWFsIGFuaW1hdGlvbiBzcGVlZCB3aGVuIGVhc2luZyBvdXRcbiAgICAgICAgY29uc3QgdmVsb2NpdHkgPSBmbGluZ09mZnNldC5tdWx0KGluZXJ0aWFMaW5lYXJpdHkgLyBmbGluZ0R1cmF0aW9uKTtcbiAgICAgICAgbGV0IHNwZWVkID0gdmVsb2NpdHkubWFnKCk7IC8vIHB4L3NcblxuICAgICAgICBpZiAoc3BlZWQgPiBpbmVydGlhTWF4U3BlZWQpIHtcbiAgICAgICAgICAgIHNwZWVkID0gaW5lcnRpYU1heFNwZWVkO1xuICAgICAgICAgICAgdmVsb2NpdHkuX3VuaXQoKS5fbXVsdChzcGVlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkdXJhdGlvbiA9IHNwZWVkIC8gKGluZXJ0aWFEZWNlbGVyYXRpb24gKiBpbmVydGlhTGluZWFyaXR5KSxcbiAgICAgICAgICAgIG9mZnNldCA9IHZlbG9jaXR5Lm11bHQoLWR1cmF0aW9uIC8gMik7XG5cbiAgICAgICAgdGhpcy5fbWFwLnBhbkJ5KG9mZnNldCwge1xuICAgICAgICAgICAgZHVyYXRpb246IGR1cmF0aW9uICogMTAwMCxcbiAgICAgICAgICAgIGVhc2luZzogaW5lcnRpYUVhc2luZyxcbiAgICAgICAgICAgIG5vTW92ZVN0YXJ0OiB0cnVlXG4gICAgICAgIH0sIHsgb3JpZ2luYWxFdmVudDogZSB9KTtcbiAgICB9XG5cbiAgICBfZmlyZUV2ZW50KHR5cGU6IHN0cmluZywgZTogKikge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWFwLmZpcmUobmV3IEV2ZW50KHR5cGUsIGUgPyB7IG9yaWdpbmFsRXZlbnQ6IGUgfSA6IHt9KSk7XG4gICAgfVxuXG4gICAgX2RyYWluSW5lcnRpYUJ1ZmZlcigpIHtcbiAgICAgICAgY29uc3QgaW5lcnRpYSA9IHRoaXMuX2luZXJ0aWEsXG4gICAgICAgICAgICBub3cgPSBicm93c2VyLm5vdygpLFxuICAgICAgICAgICAgY3V0b2ZmID0gMTYwOyAgIC8vIG1zZWNcblxuICAgICAgICB3aGlsZSAoaW5lcnRpYS5sZW5ndGggPiAwICYmIG5vdyAtIGluZXJ0aWFbMF1bMF0gPiBjdXRvZmYpIGluZXJ0aWEuc2hpZnQoKTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IERyYWdQYW5IYW5kbGVyO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHsgYmluZEFsbCB9IGZyb20gJy4uLy4uL3V0aWwvdXRpbCc7XG5cbmltcG9ydCB0eXBlIE1hcCBmcm9tICcuLi9tYXAnO1xuXG5jb25zdCBwYW5TdGVwID0gMTAwLFxuICAgIGJlYXJpbmdTdGVwID0gMTUsXG4gICAgcGl0Y2hTdGVwID0gMTA7XG5cbi8qKlxuICogVGhlIGBLZXlib2FyZEhhbmRsZXJgIGFsbG93cyB0aGUgdXNlciB0byB6b29tLCByb3RhdGUsIGFuZCBwYW4gdGhlIG1hcCB1c2luZ1xuICogdGhlIGZvbGxvd2luZyBrZXlib2FyZCBzaG9ydGN1dHM6XG4gKlxuICogLSBgPWAgLyBgK2A6IEluY3JlYXNlIHRoZSB6b29tIGxldmVsIGJ5IDEuXG4gKiAtIGBTaGlmdC09YCAvIGBTaGlmdC0rYDogSW5jcmVhc2UgdGhlIHpvb20gbGV2ZWwgYnkgMi5cbiAqIC0gYC1gOiBEZWNyZWFzZSB0aGUgem9vbSBsZXZlbCBieSAxLlxuICogLSBgU2hpZnQtLWA6IERlY3JlYXNlIHRoZSB6b29tIGxldmVsIGJ5IDIuXG4gKiAtIEFycm93IGtleXM6IFBhbiBieSAxMDAgcGl4ZWxzLlxuICogLSBgU2hpZnQrw6LCh8KiYDogSW5jcmVhc2UgdGhlIHJvdGF0aW9uIGJ5IDE1IGRlZ3JlZXMuXG4gKiAtIGBTaGlmdCvDosKHwqBgOiBEZWNyZWFzZSB0aGUgcm90YXRpb24gYnkgMTUgZGVncmVlcy5cbiAqIC0gYFNoaWZ0K8OiwofCoWA6IEluY3JlYXNlIHRoZSBwaXRjaCBieSAxMCBkZWdyZWVzLlxuICogLSBgU2hpZnQrw6LCh8KjYDogRGVjcmVhc2UgdGhlIHBpdGNoIGJ5IDEwIGRlZ3JlZXMuXG4gKi9cbmNsYXNzIEtleWJvYXJkSGFuZGxlciB7XG4gICAgX21hcDogTWFwO1xuICAgIF9lbDogSFRNTEVsZW1lbnQ7XG4gICAgX2VuYWJsZWQ6IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG1hcDogTWFwKSB7XG4gICAgICAgIHRoaXMuX21hcCA9IG1hcDtcbiAgICAgICAgdGhpcy5fZWwgPSBtYXAuZ2V0Q2FudmFzQ29udGFpbmVyKCk7XG5cbiAgICAgICAgYmluZEFsbChbXG4gICAgICAgICAgICAnX29uS2V5RG93bidcbiAgICAgICAgXSwgdGhpcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIEJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIGtleWJvYXJkIGludGVyYWN0aW9uIGlzIGVuYWJsZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIGtleWJvYXJkIGludGVyYWN0aW9uIGlzIGVuYWJsZWQuXG4gICAgICovXG4gICAgaXNFbmFibGVkKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLl9lbmFibGVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVuYWJsZXMga2V5Ym9hcmQgaW50ZXJhY3Rpb24uXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIG1hcC5rZXlib2FyZC5lbmFibGUoKTtcbiAgICAgKi9cbiAgICBlbmFibGUoKSB7XG4gICAgICAgIGlmICh0aGlzLmlzRW5hYmxlZCgpKSByZXR1cm47XG4gICAgICAgIHRoaXMuX2VsLmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLl9vbktleURvd24sIGZhbHNlKTtcbiAgICAgICAgdGhpcy5fZW5hYmxlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGlzYWJsZXMga2V5Ym9hcmQgaW50ZXJhY3Rpb24uXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIG1hcC5rZXlib2FyZC5kaXNhYmxlKCk7XG4gICAgICovXG4gICAgZGlzYWJsZSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzRW5hYmxlZCgpKSByZXR1cm47XG4gICAgICAgIHRoaXMuX2VsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLl9vbktleURvd24pO1xuICAgICAgICB0aGlzLl9lbmFibGVkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgX29uS2V5RG93bihlOiBLZXlib2FyZEV2ZW50KSB7XG4gICAgICAgIGlmIChlLmFsdEtleSB8fCBlLmN0cmxLZXkgfHwgZS5tZXRhS2V5KSByZXR1cm47XG5cbiAgICAgICAgbGV0IHpvb21EaXIgPSAwO1xuICAgICAgICBsZXQgYmVhcmluZ0RpciA9IDA7XG4gICAgICAgIGxldCBwaXRjaERpciA9IDA7XG4gICAgICAgIGxldCB4RGlyID0gMDtcbiAgICAgICAgbGV0IHlEaXIgPSAwO1xuXG4gICAgICAgIHN3aXRjaCAoZS5rZXlDb2RlKSB7XG4gICAgICAgIGNhc2UgNjE6XG4gICAgICAgIGNhc2UgMTA3OlxuICAgICAgICBjYXNlIDE3MTpcbiAgICAgICAgY2FzZSAxODc6XG4gICAgICAgICAgICB6b29tRGlyID0gMTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgMTg5OlxuICAgICAgICBjYXNlIDEwOTpcbiAgICAgICAgY2FzZSAxNzM6XG4gICAgICAgICAgICB6b29tRGlyID0gLTE7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIDM3OlxuICAgICAgICAgICAgaWYgKGUuc2hpZnRLZXkpIHtcbiAgICAgICAgICAgICAgICBiZWFyaW5nRGlyID0gLTE7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICB4RGlyID0gLTE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIDM5OlxuICAgICAgICAgICAgaWYgKGUuc2hpZnRLZXkpIHtcbiAgICAgICAgICAgICAgICBiZWFyaW5nRGlyID0gMTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIHhEaXIgPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAzODpcbiAgICAgICAgICAgIGlmIChlLnNoaWZ0S2V5KSB7XG4gICAgICAgICAgICAgICAgcGl0Y2hEaXIgPSAxO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgeURpciA9IC0xO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSA0MDpcbiAgICAgICAgICAgIGlmIChlLnNoaWZ0S2V5KSB7XG4gICAgICAgICAgICAgICAgcGl0Y2hEaXIgPSAtMTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgeURpciA9IDE7XG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG1hcCA9IHRoaXMuX21hcDtcbiAgICAgICAgY29uc3Qgem9vbSA9IG1hcC5nZXRab29tKCk7XG5cbiAgICAgICAgY29uc3QgZWFzZU9wdGlvbnMgPSB7XG4gICAgICAgICAgICBkdXJhdGlvbjogMzAwLFxuICAgICAgICAgICAgZGVsYXlFbmRFdmVudHM6IDUwMCxcbiAgICAgICAgICAgIGVhc2luZzogZWFzZU91dCxcblxuICAgICAgICAgICAgem9vbTogem9vbURpciA/IE1hdGgucm91bmQoem9vbSkgKyB6b29tRGlyICogKGUuc2hpZnRLZXkgPyAyIDogMSkgOiB6b29tLFxuICAgICAgICAgICAgYmVhcmluZzogbWFwLmdldEJlYXJpbmcoKSArIGJlYXJpbmdEaXIgKiBiZWFyaW5nU3RlcCxcbiAgICAgICAgICAgIHBpdGNoOiBtYXAuZ2V0UGl0Y2goKSArIHBpdGNoRGlyICogcGl0Y2hTdGVwLFxuICAgICAgICAgICAgb2Zmc2V0OiBbLXhEaXIgKiBwYW5TdGVwLCAteURpciAqIHBhblN0ZXBdLFxuICAgICAgICAgICAgY2VudGVyOiBtYXAuZ2V0Q2VudGVyKClcbiAgICAgICAgfTtcblxuICAgICAgICBtYXAuZWFzZVRvKGVhc2VPcHRpb25zLCB7b3JpZ2luYWxFdmVudDogZX0pO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZWFzZU91dCh0KSB7XG4gICAgcmV0dXJuIHQgKiAoMiAtIHQpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBLZXlib2FyZEhhbmRsZXI7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgeyBiaW5kQWxsIH0gZnJvbSAnLi4vLi4vdXRpbC91dGlsJztcblxuaW1wb3J0IHR5cGUgTWFwIGZyb20gJy4uL21hcCc7XG5pbXBvcnQgdHlwZSB7TWFwTW91c2VFdmVudCwgTWFwVG91Y2hFdmVudH0gZnJvbSAnLi4vZXZlbnRzJztcblxuLyoqXG4gKiBUaGUgYERvdWJsZUNsaWNrWm9vbUhhbmRsZXJgIGFsbG93cyB0aGUgdXNlciB0byB6b29tIHRoZSBtYXAgYXQgYSBwb2ludCBieVxuICogZG91YmxlIGNsaWNraW5nIG9yIGRvdWJsZSB0YXBwaW5nLlxuICovXG5jbGFzcyBEb3VibGVDbGlja1pvb21IYW5kbGVyIHtcbiAgICBfbWFwOiBNYXA7XG4gICAgX2VuYWJsZWQ6IGJvb2xlYW47XG4gICAgX2FjdGl2ZTogYm9vbGVhbjtcbiAgICBfdGFwcGVkOiA/VGltZW91dElEO1xuXG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihtYXA6IE1hcCkge1xuICAgICAgICB0aGlzLl9tYXAgPSBtYXA7XG5cbiAgICAgICAgYmluZEFsbChbXG4gICAgICAgICAgICAnX29uRGJsQ2xpY2snLFxuICAgICAgICAgICAgJ19vblpvb21FbmQnXG4gICAgICAgIF0sIHRoaXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBCb29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgXCJkb3VibGUgY2xpY2sgdG8gem9vbVwiIGludGVyYWN0aW9uIGlzIGVuYWJsZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSBcImRvdWJsZSBjbGljayB0byB6b29tXCIgaW50ZXJhY3Rpb24gaXMgZW5hYmxlZC5cbiAgICAgKi9cbiAgICBpc0VuYWJsZWQoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX2VuYWJsZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIEJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBcImRvdWJsZSBjbGljayB0byB6b29tXCIgaW50ZXJhY3Rpb24gaXMgYWN0aXZlLCBpLmUuIGN1cnJlbnRseSBiZWluZyB1c2VkLlxuICAgICAqXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgXCJkb3VibGUgY2xpY2sgdG8gem9vbVwiIGludGVyYWN0aW9uIGlzIGFjdGl2ZS5cbiAgICAgKi9cbiAgICBpc0FjdGl2ZSgpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5fYWN0aXZlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVuYWJsZXMgdGhlIFwiZG91YmxlIGNsaWNrIHRvIHpvb21cIiBpbnRlcmFjdGlvbi5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogbWFwLmRvdWJsZUNsaWNrWm9vbS5lbmFibGUoKTtcbiAgICAgKi9cbiAgICBlbmFibGUoKSB7XG4gICAgICAgIGlmICh0aGlzLmlzRW5hYmxlZCgpKSByZXR1cm47XG4gICAgICAgIHRoaXMuX2VuYWJsZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERpc2FibGVzIHRoZSBcImRvdWJsZSBjbGljayB0byB6b29tXCIgaW50ZXJhY3Rpb24uXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIG1hcC5kb3VibGVDbGlja1pvb20uZGlzYWJsZSgpO1xuICAgICAqL1xuICAgIGRpc2FibGUoKSB7XG4gICAgICAgIGlmICghdGhpcy5pc0VuYWJsZWQoKSkgcmV0dXJuO1xuICAgICAgICB0aGlzLl9lbmFibGVkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgb25Ub3VjaFN0YXJ0KGU6IE1hcFRvdWNoRXZlbnQpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzRW5hYmxlZCgpKSByZXR1cm47XG4gICAgICAgIGlmIChlLnBvaW50cy5sZW5ndGggPiAxKSByZXR1cm47XG5cbiAgICAgICAgaWYgKCF0aGlzLl90YXBwZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX3RhcHBlZCA9IHNldFRpbWVvdXQoKCkgPT4geyB0aGlzLl90YXBwZWQgPSBudWxsOyB9LCAzMDApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3RhcHBlZCk7XG4gICAgICAgICAgICB0aGlzLl90YXBwZWQgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5fem9vbShlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uRGJsQ2xpY2soZTogTWFwTW91c2VFdmVudCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNFbmFibGVkKCkpIHJldHVybjtcbiAgICAgICAgZS5vcmlnaW5hbEV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuX3pvb20oZSk7XG4gICAgfVxuXG4gICAgX3pvb20oZTogTWFwTW91c2VFdmVudCB8IE1hcFRvdWNoRXZlbnQpIHtcbiAgICAgICAgdGhpcy5fYWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fbWFwLm9uKCd6b29tZW5kJywgdGhpcy5fb25ab29tRW5kKTtcbiAgICAgICAgdGhpcy5fbWFwLnpvb21UbyhcbiAgICAgICAgICAgIHRoaXMuX21hcC5nZXRab29tKCkgKyAoZS5vcmlnaW5hbEV2ZW50LnNoaWZ0S2V5ID8gLTEgOiAxKSxcbiAgICAgICAgICAgIHthcm91bmQ6IGUubG5nTGF0fSxcbiAgICAgICAgICAgIGVcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBfb25ab29tRW5kKCkge1xuICAgICAgICB0aGlzLl9hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fbWFwLm9mZignem9vbWVuZCcsIHRoaXMuX29uWm9vbUVuZCk7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBEb3VibGVDbGlja1pvb21IYW5kbGVyO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IERPTSBmcm9tICcuLi8uLi91dGlsL2RvbSc7XG5pbXBvcnQgeyBiZXppZXIsIGJpbmRBbGwgfSBmcm9tICcuLi8uLi91dGlsL3V0aWwnO1xuaW1wb3J0IHdpbmRvdyBmcm9tICcuLi8uLi91dGlsL3dpbmRvdyc7XG5pbXBvcnQgYnJvd3NlciBmcm9tICcuLi8uLi91dGlsL2Jyb3dzZXInO1xuaW1wb3J0IHsgRXZlbnQgfSBmcm9tICcuLi8uLi91dGlsL2V2ZW50ZWQnO1xuXG5pbXBvcnQgdHlwZSBNYXAgZnJvbSAnLi4vbWFwJztcbmltcG9ydCB0eXBlIFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuaW1wb3J0IHR5cGUgTG5nTGF0IGZyb20gJy4uLy4uL2dlby9sbmdfbGF0JztcbmltcG9ydCB0eXBlIHtUYXNrSUR9IGZyb20gJy4uLy4uL3V0aWwvdGFza19xdWV1ZSc7XG5cbmNvbnN0IGluZXJ0aWFMaW5lYXJpdHkgPSAwLjE1LFxuICAgIGluZXJ0aWFFYXNpbmcgPSBiZXppZXIoMCwgMCwgaW5lcnRpYUxpbmVhcml0eSwgMSksXG4gICAgaW5lcnRpYURlY2VsZXJhdGlvbiA9IDEyLCAvLyBzY2FsZSAvIHNeMlxuICAgIGluZXJ0aWFNYXhTcGVlZCA9IDIuNSwgLy8gc2NhbGUgLyBzXG4gICAgc2lnbmlmaWNhbnRTY2FsZVRocmVzaG9sZCA9IDAuMTUsXG4gICAgc2lnbmlmaWNhbnRSb3RhdGVUaHJlc2hvbGQgPSAxMDtcblxuLyoqXG4gKiBUaGUgYFRvdWNoWm9vbVJvdGF0ZUhhbmRsZXJgIGFsbG93cyB0aGUgdXNlciB0byB6b29tIGFuZCByb3RhdGUgdGhlIG1hcCBieVxuICogcGluY2hpbmcgb24gYSB0b3VjaHNjcmVlbi5cbiAqL1xuY2xhc3MgVG91Y2hab29tUm90YXRlSGFuZGxlciB7XG4gICAgX21hcDogTWFwO1xuICAgIF9lbDogSFRNTEVsZW1lbnQ7XG4gICAgX2VuYWJsZWQ6IGJvb2xlYW47XG4gICAgX2Fyb3VuZENlbnRlcjogYm9vbGVhbjtcbiAgICBfcm90YXRpb25EaXNhYmxlZDogYm9vbGVhbjtcbiAgICBfc3RhcnRWZWM6IFBvaW50O1xuICAgIF9zdGFydEFyb3VuZDogTG5nTGF0O1xuICAgIF9zdGFydFNjYWxlOiBudW1iZXI7XG4gICAgX3N0YXJ0QmVhcmluZzogbnVtYmVyO1xuICAgIF9nZXN0dXJlSW50ZW50OiAncm90YXRlJyB8ICd6b29tJyB8IHZvaWQ7XG4gICAgX2luZXJ0aWE6IEFycmF5PFtudW1iZXIsIG51bWJlciwgUG9pbnRdPjtcbiAgICBfbGFzdFRvdWNoRXZlbnQ6IFRvdWNoRXZlbnQ7XG4gICAgX2ZyYW1lSWQ6ID9UYXNrSUQ7XG5cbiAgICAvKipcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG1hcDogTWFwKSB7XG4gICAgICAgIHRoaXMuX21hcCA9IG1hcDtcbiAgICAgICAgdGhpcy5fZWwgPSBtYXAuZ2V0Q2FudmFzQ29udGFpbmVyKCk7XG5cbiAgICAgICAgYmluZEFsbChbXG4gICAgICAgICAgICAnX29uTW92ZScsXG4gICAgICAgICAgICAnX29uRW5kJyxcbiAgICAgICAgICAgICdfb25Ub3VjaEZyYW1lJ1xuICAgICAgICBdLCB0aGlzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgQm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIFwicGluY2ggdG8gcm90YXRlIGFuZCB6b29tXCIgaW50ZXJhY3Rpb24gaXMgZW5hYmxlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIFwicGluY2ggdG8gcm90YXRlIGFuZCB6b29tXCIgaW50ZXJhY3Rpb24gaXMgZW5hYmxlZC5cbiAgICAgKi9cbiAgICBpc0VuYWJsZWQoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX2VuYWJsZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW5hYmxlcyB0aGUgXCJwaW5jaCB0byByb3RhdGUgYW5kIHpvb21cIiBpbnRlcmFjdGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuYXJvdW5kXSBJZiBcImNlbnRlclwiIGlzIHBhc3NlZCwgbWFwIHdpbGwgem9vbSBhcm91bmQgdGhlIGNlbnRlclxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAgIG1hcC50b3VjaFpvb21Sb3RhdGUuZW5hYmxlKCk7XG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAgIG1hcC50b3VjaFpvb21Sb3RhdGUuZW5hYmxlKHsgYXJvdW5kOiAnY2VudGVyJyB9KTtcbiAgICAgKi9cbiAgICBlbmFibGUob3B0aW9uczogP3thcm91bmQ/OiAnY2VudGVyJ30pIHtcbiAgICAgICAgaWYgKHRoaXMuaXNFbmFibGVkKCkpIHJldHVybjtcbiAgICAgICAgdGhpcy5fZWwuY2xhc3NMaXN0LmFkZCgnbWFwYm94Z2wtdG91Y2gtem9vbS1yb3RhdGUnKTtcbiAgICAgICAgdGhpcy5fZW5hYmxlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuX2Fyb3VuZENlbnRlciA9ICEhb3B0aW9ucyAmJiBvcHRpb25zLmFyb3VuZCA9PT0gJ2NlbnRlcic7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGlzYWJsZXMgdGhlIFwicGluY2ggdG8gcm90YXRlIGFuZCB6b29tXCIgaW50ZXJhY3Rpb24uXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqICAgbWFwLnRvdWNoWm9vbVJvdGF0ZS5kaXNhYmxlKCk7XG4gICAgICovXG4gICAgZGlzYWJsZSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzRW5hYmxlZCgpKSByZXR1cm47XG4gICAgICAgIHRoaXMuX2VsLmNsYXNzTGlzdC5yZW1vdmUoJ21hcGJveGdsLXRvdWNoLXpvb20tcm90YXRlJyk7XG4gICAgICAgIHRoaXMuX2VuYWJsZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaXNhYmxlcyB0aGUgXCJwaW5jaCB0byByb3RhdGVcIiBpbnRlcmFjdGlvbiwgbGVhdmluZyB0aGUgXCJwaW5jaCB0byB6b29tXCJcbiAgICAgKiBpbnRlcmFjdGlvbiBlbmFibGVkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAgIG1hcC50b3VjaFpvb21Sb3RhdGUuZGlzYWJsZVJvdGF0aW9uKCk7XG4gICAgICovXG4gICAgZGlzYWJsZVJvdGF0aW9uKCkge1xuICAgICAgICB0aGlzLl9yb3RhdGlvbkRpc2FibGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbmFibGVzIHRoZSBcInBpbmNoIHRvIHJvdGF0ZVwiIGludGVyYWN0aW9uLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAgIG1hcC50b3VjaFpvb21Sb3RhdGUuZW5hYmxlKCk7XG4gICAgICogICBtYXAudG91Y2hab29tUm90YXRlLmVuYWJsZVJvdGF0aW9uKCk7XG4gICAgICovXG4gICAgZW5hYmxlUm90YXRpb24oKSB7XG4gICAgICAgIHRoaXMuX3JvdGF0aW9uRGlzYWJsZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBvblN0YXJ0KGU6IFRvdWNoRXZlbnQpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzRW5hYmxlZCgpKSByZXR1cm47XG4gICAgICAgIGlmIChlLnRvdWNoZXMubGVuZ3RoICE9PSAyKSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgcDAgPSBET00ubW91c2VQb3ModGhpcy5fZWwsIGUudG91Y2hlc1swXSksXG4gICAgICAgICAgICBwMSA9IERPTS5tb3VzZVBvcyh0aGlzLl9lbCwgZS50b3VjaGVzWzFdKSxcbiAgICAgICAgICAgIGNlbnRlciA9IHAwLmFkZChwMSkuZGl2KDIpO1xuXG4gICAgICAgIHRoaXMuX3N0YXJ0VmVjID0gcDAuc3ViKHAxKTtcbiAgICAgICAgdGhpcy5fc3RhcnRBcm91bmQgPSB0aGlzLl9tYXAudHJhbnNmb3JtLnBvaW50TG9jYXRpb24oY2VudGVyKTtcbiAgICAgICAgdGhpcy5fZ2VzdHVyZUludGVudCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5faW5lcnRpYSA9IFtdO1xuXG4gICAgICAgIERPTS5hZGRFdmVudExpc3RlbmVyKHdpbmRvdy5kb2N1bWVudCwgJ3RvdWNobW92ZScsIHRoaXMuX29uTW92ZSwge3Bhc3NpdmU6IGZhbHNlfSk7XG4gICAgICAgIERPTS5hZGRFdmVudExpc3RlbmVyKHdpbmRvdy5kb2N1bWVudCwgJ3RvdWNoZW5kJywgdGhpcy5fb25FbmQpO1xuICAgIH1cblxuICAgIF9nZXRUb3VjaEV2ZW50RGF0YShlOiBUb3VjaEV2ZW50KSB7XG4gICAgICAgIGNvbnN0IHAwID0gRE9NLm1vdXNlUG9zKHRoaXMuX2VsLCBlLnRvdWNoZXNbMF0pLFxuICAgICAgICAgICAgcDEgPSBET00ubW91c2VQb3ModGhpcy5fZWwsIGUudG91Y2hlc1sxXSk7XG5cbiAgICAgICAgY29uc3QgdmVjID0gcDAuc3ViKHAxKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHZlYyxcbiAgICAgICAgICAgIGNlbnRlcjogcDAuYWRkKHAxKS5kaXYoMiksXG4gICAgICAgICAgICBzY2FsZTogdmVjLm1hZygpIC8gdGhpcy5fc3RhcnRWZWMubWFnKCksXG4gICAgICAgICAgICBiZWFyaW5nOiB0aGlzLl9yb3RhdGlvbkRpc2FibGVkID8gMCA6IHZlYy5hbmdsZVdpdGgodGhpcy5fc3RhcnRWZWMpICogMTgwIC8gTWF0aC5QSVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIF9vbk1vdmUoZTogVG91Y2hFdmVudCkge1xuICAgICAgICBpZiAoZS50b3VjaGVzLmxlbmd0aCAhPT0gMikgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IHt2ZWMsIHNjYWxlLCBiZWFyaW5nfSA9IHRoaXMuX2dldFRvdWNoRXZlbnREYXRhKGUpO1xuXG4gICAgICAgIC8vIERldGVybWluZSAnaW50ZW50JyBieSB3aGljaGV2ZXIgdGhyZXNob2xkIGlzIHN1cnBhc3NlZCBmaXJzdCxcbiAgICAgICAgLy8gdGhlbiBrZWVwIHRoYXQgc3RhdGUgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGlzIGdlc3R1cmUuXG4gICAgICAgIGlmICghdGhpcy5fZ2VzdHVyZUludGVudCkge1xuICAgICAgICAgICAgLy8gd2hlbiByb3RhdGlvbiBpcyBkaXNhYmxlZCwgYW55IHNjYWxlIGNoYW5nZSB0cmlnZ2VycyB0aGUgem9vbSBnZXN0dXJlIHRvIHN0YXJ0XG4gICAgICAgICAgICBjb25zdCBzY2FsaW5nU2lnbmlmaWNhbnRseSA9ICh0aGlzLl9yb3RhdGlvbkRpc2FibGVkICYmIHNjYWxlICE9PSAxKSB8fCAoTWF0aC5hYnMoMSAtIHNjYWxlKSA+IHNpZ25pZmljYW50U2NhbGVUaHJlc2hvbGQpLFxuICAgICAgICAgICAgICAgIHJvdGF0aW5nU2lnbmlmaWNhbnRseSA9IChNYXRoLmFicyhiZWFyaW5nKSA+IHNpZ25pZmljYW50Um90YXRlVGhyZXNob2xkKTtcblxuICAgICAgICAgICAgaWYgKHJvdGF0aW5nU2lnbmlmaWNhbnRseSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2dlc3R1cmVJbnRlbnQgPSAncm90YXRlJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2NhbGluZ1NpZ25pZmljYW50bHkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9nZXN0dXJlSW50ZW50ID0gJ3pvb20nO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5fZ2VzdHVyZUludGVudCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX21hcC5maXJlKG5ldyBFdmVudChgJHt0aGlzLl9nZXN0dXJlSW50ZW50fXN0YXJ0YCwgeyBvcmlnaW5hbEV2ZW50OiBlIH0pKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXAuZmlyZShuZXcgRXZlbnQoJ21vdmVzdGFydCcsIHsgb3JpZ2luYWxFdmVudDogZSB9KSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fc3RhcnRWZWMgPSB2ZWM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9sYXN0VG91Y2hFdmVudCA9IGU7XG4gICAgICAgIGlmICghdGhpcy5fZnJhbWVJZCkge1xuICAgICAgICAgICAgdGhpcy5fZnJhbWVJZCA9IHRoaXMuX21hcC5fcmVxdWVzdFJlbmRlckZyYW1lKHRoaXMuX29uVG91Y2hGcmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuXG4gICAgX29uVG91Y2hGcmFtZSgpIHtcbiAgICAgICAgdGhpcy5fZnJhbWVJZCA9IG51bGw7XG5cbiAgICAgICAgY29uc3QgZ2VzdHVyZUludGVudCA9IHRoaXMuX2dlc3R1cmVJbnRlbnQ7XG4gICAgICAgIGlmICghZ2VzdHVyZUludGVudCkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IHRyID0gdGhpcy5fbWFwLnRyYW5zZm9ybTtcblxuICAgICAgICBpZiAoIXRoaXMuX3N0YXJ0U2NhbGUpIHtcbiAgICAgICAgICAgIHRoaXMuX3N0YXJ0U2NhbGUgPSB0ci5zY2FsZTtcbiAgICAgICAgICAgIHRoaXMuX3N0YXJ0QmVhcmluZyA9IHRyLmJlYXJpbmc7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7Y2VudGVyLCBiZWFyaW5nLCBzY2FsZX0gPSB0aGlzLl9nZXRUb3VjaEV2ZW50RGF0YSh0aGlzLl9sYXN0VG91Y2hFdmVudCk7XG4gICAgICAgIGNvbnN0IGFyb3VuZCA9IHRyLnBvaW50TG9jYXRpb24oY2VudGVyKTtcbiAgICAgICAgY29uc3QgYXJvdW5kUG9pbnQgPSB0ci5sb2NhdGlvblBvaW50KGFyb3VuZCk7XG5cbiAgICAgICAgaWYgKGdlc3R1cmVJbnRlbnQgPT09ICdyb3RhdGUnKSB7XG4gICAgICAgICAgICB0ci5iZWFyaW5nID0gdGhpcy5fc3RhcnRCZWFyaW5nICsgYmVhcmluZztcbiAgICAgICAgfVxuXG4gICAgICAgIHRyLnpvb20gPSB0ci5zY2FsZVpvb20odGhpcy5fc3RhcnRTY2FsZSAqIHNjYWxlKTtcblxuICAgICAgICB0ci5zZXRMb2NhdGlvbkF0UG9pbnQodGhpcy5fc3RhcnRBcm91bmQsIGFyb3VuZFBvaW50KTtcblxuICAgICAgICB0aGlzLl9tYXAuZmlyZShuZXcgRXZlbnQoZ2VzdHVyZUludGVudCwge29yaWdpbmFsRXZlbnQ6IHRoaXMuX2xhc3RUb3VjaEV2ZW50fSkpO1xuICAgICAgICB0aGlzLl9tYXAuZmlyZShuZXcgRXZlbnQoJ21vdmUnLCB7b3JpZ2luYWxFdmVudDogdGhpcy5fbGFzdFRvdWNoRXZlbnR9KSk7XG5cbiAgICAgICAgdGhpcy5fZHJhaW5JbmVydGlhQnVmZmVyKCk7XG4gICAgICAgIHRoaXMuX2luZXJ0aWEucHVzaChbYnJvd3Nlci5ub3coKSwgc2NhbGUsIGNlbnRlcl0pO1xuICAgIH1cblxuICAgIF9vbkVuZChlOiBUb3VjaEV2ZW50KSB7XG4gICAgICAgIERPTS5yZW1vdmVFdmVudExpc3RlbmVyKHdpbmRvdy5kb2N1bWVudCwgJ3RvdWNobW92ZScsIHRoaXMuX29uTW92ZSwge3Bhc3NpdmU6IGZhbHNlfSk7XG4gICAgICAgIERPTS5yZW1vdmVFdmVudExpc3RlbmVyKHdpbmRvdy5kb2N1bWVudCwgJ3RvdWNoZW5kJywgdGhpcy5fb25FbmQpO1xuXG4gICAgICAgIGNvbnN0IGdlc3R1cmVJbnRlbnQgPSB0aGlzLl9nZXN0dXJlSW50ZW50O1xuICAgICAgICBjb25zdCBzdGFydFNjYWxlID0gdGhpcy5fc3RhcnRTY2FsZTtcblxuICAgICAgICBpZiAodGhpcy5fZnJhbWVJZCkge1xuICAgICAgICAgICAgdGhpcy5fbWFwLl9jYW5jZWxSZW5kZXJGcmFtZSh0aGlzLl9mcmFtZUlkKTtcbiAgICAgICAgICAgIHRoaXMuX2ZyYW1lSWQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGRlbGV0ZSB0aGlzLl9nZXN0dXJlSW50ZW50O1xuICAgICAgICBkZWxldGUgdGhpcy5fc3RhcnRTY2FsZTtcbiAgICAgICAgZGVsZXRlIHRoaXMuX3N0YXJ0QmVhcmluZztcbiAgICAgICAgZGVsZXRlIHRoaXMuX2xhc3RUb3VjaEV2ZW50O1xuXG4gICAgICAgIGlmICghZ2VzdHVyZUludGVudCkgcmV0dXJuO1xuXG4gICAgICAgIHRoaXMuX21hcC5maXJlKG5ldyBFdmVudChgJHtnZXN0dXJlSW50ZW50fWVuZGAsIHsgb3JpZ2luYWxFdmVudDogZSB9KSk7XG5cbiAgICAgICAgdGhpcy5fZHJhaW5JbmVydGlhQnVmZmVyKCk7XG5cbiAgICAgICAgY29uc3QgaW5lcnRpYSA9IHRoaXMuX2luZXJ0aWEsXG4gICAgICAgICAgICBtYXAgPSB0aGlzLl9tYXA7XG5cbiAgICAgICAgaWYgKGluZXJ0aWEubGVuZ3RoIDwgMikge1xuICAgICAgICAgICAgbWFwLnNuYXBUb05vcnRoKHt9LCB7IG9yaWdpbmFsRXZlbnQ6IGUgfSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsYXN0ID0gaW5lcnRpYVtpbmVydGlhLmxlbmd0aCAtIDFdLFxuICAgICAgICAgICAgZmlyc3QgPSBpbmVydGlhWzBdLFxuICAgICAgICAgICAgbGFzdFNjYWxlID0gbWFwLnRyYW5zZm9ybS5zY2FsZVpvb20oc3RhcnRTY2FsZSAqIGxhc3RbMV0pLFxuICAgICAgICAgICAgZmlyc3RTY2FsZSA9IG1hcC50cmFuc2Zvcm0uc2NhbGVab29tKHN0YXJ0U2NhbGUgKiBmaXJzdFsxXSksXG4gICAgICAgICAgICBzY2FsZU9mZnNldCA9IGxhc3RTY2FsZSAtIGZpcnN0U2NhbGUsXG4gICAgICAgICAgICBzY2FsZUR1cmF0aW9uID0gKGxhc3RbMF0gLSBmaXJzdFswXSkgLyAxMDAwLFxuICAgICAgICAgICAgcCA9IGxhc3RbMl07XG5cbiAgICAgICAgaWYgKHNjYWxlRHVyYXRpb24gPT09IDAgfHwgbGFzdFNjYWxlID09PSBmaXJzdFNjYWxlKSB7XG4gICAgICAgICAgICBtYXAuc25hcFRvTm9ydGgoe30sIHsgb3JpZ2luYWxFdmVudDogZSB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNhbGN1bGF0ZSBzY2FsZS9zIHNwZWVkIGFuZCBhZGp1c3QgZm9yIGluY3JlYXNlZCBpbml0aWFsIGFuaW1hdGlvbiBzcGVlZCB3aGVuIGVhc2luZ1xuICAgICAgICBsZXQgc3BlZWQgPSBzY2FsZU9mZnNldCAqIGluZXJ0aWFMaW5lYXJpdHkgLyBzY2FsZUR1cmF0aW9uOyAvLyBzY2FsZS9zXG5cbiAgICAgICAgaWYgKE1hdGguYWJzKHNwZWVkKSA+IGluZXJ0aWFNYXhTcGVlZCkge1xuICAgICAgICAgICAgaWYgKHNwZWVkID4gMCkge1xuICAgICAgICAgICAgICAgIHNwZWVkID0gaW5lcnRpYU1heFNwZWVkO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzcGVlZCA9IC1pbmVydGlhTWF4U3BlZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkdXJhdGlvbiA9IE1hdGguYWJzKHNwZWVkIC8gKGluZXJ0aWFEZWNlbGVyYXRpb24gKiBpbmVydGlhTGluZWFyaXR5KSkgKiAxMDAwO1xuICAgICAgICBsZXQgdGFyZ2V0U2NhbGUgPSBsYXN0U2NhbGUgKyBzcGVlZCAqIGR1cmF0aW9uIC8gMjAwMDtcblxuICAgICAgICBpZiAodGFyZ2V0U2NhbGUgPCAwKSB7XG4gICAgICAgICAgICB0YXJnZXRTY2FsZSA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICBtYXAuZWFzZVRvKHtcbiAgICAgICAgICAgIHpvb206IHRhcmdldFNjYWxlLFxuICAgICAgICAgICAgZHVyYXRpb24sXG4gICAgICAgICAgICBlYXNpbmc6IGluZXJ0aWFFYXNpbmcsXG4gICAgICAgICAgICBhcm91bmQ6IHRoaXMuX2Fyb3VuZENlbnRlciA/IG1hcC5nZXRDZW50ZXIoKSA6IG1hcC51bnByb2plY3QocCksXG4gICAgICAgICAgICBub01vdmVTdGFydDogdHJ1ZVxuICAgICAgICB9LCB7IG9yaWdpbmFsRXZlbnQ6IGUgfSk7XG4gICAgfVxuXG4gICAgX2RyYWluSW5lcnRpYUJ1ZmZlcigpIHtcbiAgICAgICAgY29uc3QgaW5lcnRpYSA9IHRoaXMuX2luZXJ0aWEsXG4gICAgICAgICAgICBub3cgPSBicm93c2VyLm5vdygpLFxuICAgICAgICAgICAgY3V0b2ZmID0gMTYwOyAvLyBtc2VjXG5cbiAgICAgICAgd2hpbGUgKGluZXJ0aWEubGVuZ3RoID4gMiAmJiBub3cgLSBpbmVydGlhWzBdWzBdID4gY3V0b2ZmKSBpbmVydGlhLnNoaWZ0KCk7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBUb3VjaFpvb21Sb3RhdGVIYW5kbGVyO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHsgTWFwTW91c2VFdmVudCwgTWFwVG91Y2hFdmVudCwgTWFwV2hlZWxFdmVudCB9IGZyb20gJy4uL3VpL2V2ZW50cyc7XG5pbXBvcnQgRE9NIGZyb20gJy4uL3V0aWwvZG9tJztcbmltcG9ydCB0eXBlIE1hcCBmcm9tICcuL21hcCc7XG5pbXBvcnQgc2Nyb2xsWm9vbSBmcm9tICcuL2hhbmRsZXIvc2Nyb2xsX3pvb20nO1xuaW1wb3J0IGJveFpvb20gZnJvbSAnLi9oYW5kbGVyL2JveF96b29tJztcbmltcG9ydCBkcmFnUm90YXRlIGZyb20gJy4vaGFuZGxlci9kcmFnX3JvdGF0ZSc7XG5pbXBvcnQgZHJhZ1BhbiBmcm9tICcuL2hhbmRsZXIvZHJhZ19wYW4nO1xuaW1wb3J0IGtleWJvYXJkIGZyb20gJy4vaGFuZGxlci9rZXlib2FyZCc7XG5pbXBvcnQgZG91YmxlQ2xpY2tab29tIGZyb20gJy4vaGFuZGxlci9kYmxjbGlja196b29tJztcbmltcG9ydCB0b3VjaFpvb21Sb3RhdGUgZnJvbSAnLi9oYW5kbGVyL3RvdWNoX3pvb21fcm90YXRlJztcblxuY29uc3QgaGFuZGxlcnMgPSB7XG4gICAgc2Nyb2xsWm9vbSxcbiAgICBib3hab29tLFxuICAgIGRyYWdSb3RhdGUsXG4gICAgZHJhZ1BhbixcbiAgICBrZXlib2FyZCxcbiAgICBkb3VibGVDbGlja1pvb20sXG4gICAgdG91Y2hab29tUm90YXRlXG59O1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBiaW5kSGFuZGxlcnMobWFwOiBNYXAsIG9wdGlvbnM6IHtpbnRlcmFjdGl2ZTogYm9vbGVhbiwgY2xpY2tUb2xlcmFuY2U6IG51bWJlcn0pIHtcbiAgICBjb25zdCBlbCA9IG1hcC5nZXRDYW52YXNDb250YWluZXIoKTtcbiAgICBsZXQgY29udGV4dE1lbnVFdmVudCA9IG51bGw7XG4gICAgbGV0IG1vdXNlRG93biA9IGZhbHNlO1xuICAgIGxldCBzdGFydFBvcyA9IG51bGw7XG5cbiAgICBmb3IgKGNvbnN0IG5hbWUgaW4gaGFuZGxlcnMpIHtcbiAgICAgICAgKG1hcDogYW55KVtuYW1lXSA9IG5ldyBoYW5kbGVyc1tuYW1lXShtYXAsIG9wdGlvbnMpO1xuICAgICAgICBpZiAob3B0aW9ucy5pbnRlcmFjdGl2ZSAmJiBvcHRpb25zW25hbWVdKSB7XG4gICAgICAgICAgICAobWFwOiBhbnkpW25hbWVdLmVuYWJsZShvcHRpb25zW25hbWVdKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIERPTS5hZGRFdmVudExpc3RlbmVyKGVsLCAnbW91c2VvdXQnLCBvbk1vdXNlT3V0KTtcbiAgICBET00uYWRkRXZlbnRMaXN0ZW5lcihlbCwgJ21vdXNlZG93bicsIG9uTW91c2VEb3duKTtcbiAgICBET00uYWRkRXZlbnRMaXN0ZW5lcihlbCwgJ21vdXNldXAnLCBvbk1vdXNlVXApO1xuICAgIERPTS5hZGRFdmVudExpc3RlbmVyKGVsLCAnbW91c2Vtb3ZlJywgb25Nb3VzZU1vdmUpO1xuICAgIERPTS5hZGRFdmVudExpc3RlbmVyKGVsLCAnbW91c2VvdmVyJywgb25Nb3VzZU92ZXIpO1xuXG4gICAgLy8gQmluZCB0b3VjaHN0YXJ0IGFuZCB0b3VjaG1vdmUgd2l0aCBwYXNzaXZlOiBmYWxzZSBiZWNhdXNlLCBldmVuIHRob3VnaFxuICAgIC8vIHRoZXkgb25seSBmaXJlIGEgbWFwIGV2ZW50cyBhbmQgdGhlcmVmb3JlIGNvdWxkIHRoZW9yZXRpY2FsbHkgYmVcbiAgICAvLyBwYXNzaXZlLCBiaW5kaW5nIHdpdGggcGFzc2l2ZTogdHJ1ZSBjYXVzZXMgaU9TIG5vdCB0byByZXNwZWN0XG4gICAgLy8gZS5wcmV2ZW50RGVmYXVsdCgpIGluIF9vdGhlcl8gaGFuZGxlcnMsIGV2ZW4gaWYgdGhleSBhcmUgbm9uLXBhc3NpdmVcbiAgICAvLyAoc2VlIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xODQyNTEpXG4gICAgRE9NLmFkZEV2ZW50TGlzdGVuZXIoZWwsICd0b3VjaHN0YXJ0Jywgb25Ub3VjaFN0YXJ0LCB7cGFzc2l2ZTogZmFsc2V9KTtcbiAgICBET00uYWRkRXZlbnRMaXN0ZW5lcihlbCwgJ3RvdWNobW92ZScsIG9uVG91Y2hNb3ZlLCB7cGFzc2l2ZTogZmFsc2V9KTtcblxuICAgIERPTS5hZGRFdmVudExpc3RlbmVyKGVsLCAndG91Y2hlbmQnLCBvblRvdWNoRW5kKTtcbiAgICBET00uYWRkRXZlbnRMaXN0ZW5lcihlbCwgJ3RvdWNoY2FuY2VsJywgb25Ub3VjaENhbmNlbCk7XG4gICAgRE9NLmFkZEV2ZW50TGlzdGVuZXIoZWwsICdjbGljaycsIG9uQ2xpY2spO1xuICAgIERPTS5hZGRFdmVudExpc3RlbmVyKGVsLCAnZGJsY2xpY2snLCBvbkRibENsaWNrKTtcbiAgICBET00uYWRkRXZlbnRMaXN0ZW5lcihlbCwgJ2NvbnRleHRtZW51Jywgb25Db250ZXh0TWVudSk7XG4gICAgRE9NLmFkZEV2ZW50TGlzdGVuZXIoZWwsICd3aGVlbCcsIG9uV2hlZWwsIHtwYXNzaXZlOiBmYWxzZX0pO1xuXG4gICAgZnVuY3Rpb24gb25Nb3VzZURvd24oZTogTW91c2VFdmVudCkge1xuICAgICAgICBtb3VzZURvd24gPSB0cnVlO1xuICAgICAgICBzdGFydFBvcyA9IERPTS5tb3VzZVBvcyhlbCwgZSk7XG5cbiAgICAgICAgY29uc3QgbWFwRXZlbnQgPSBuZXcgTWFwTW91c2VFdmVudCgnbW91c2Vkb3duJywgbWFwLCBlKTtcbiAgICAgICAgbWFwLmZpcmUobWFwRXZlbnQpO1xuXG4gICAgICAgIGlmIChtYXBFdmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucy5pbnRlcmFjdGl2ZSAmJiAhbWFwLmRvdWJsZUNsaWNrWm9vbS5pc0FjdGl2ZSgpKSB7XG4gICAgICAgICAgICBtYXAuc3RvcCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgbWFwLmJveFpvb20ub25Nb3VzZURvd24oZSk7XG5cbiAgICAgICAgaWYgKCFtYXAuYm94Wm9vbS5pc0FjdGl2ZSgpICYmICFtYXAuZHJhZ1Bhbi5pc0FjdGl2ZSgpKSB7XG4gICAgICAgICAgICBtYXAuZHJhZ1JvdGF0ZS5vbk1vdXNlRG93bihlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghbWFwLmJveFpvb20uaXNBY3RpdmUoKSAmJiAhbWFwLmRyYWdSb3RhdGUuaXNBY3RpdmUoKSkge1xuICAgICAgICAgICAgbWFwLmRyYWdQYW4ub25Nb3VzZURvd24oZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvbk1vdXNlVXAoZTogTW91c2VFdmVudCkge1xuICAgICAgICBjb25zdCByb3RhdGluZyA9IG1hcC5kcmFnUm90YXRlLmlzQWN0aXZlKCk7XG5cbiAgICAgICAgaWYgKGNvbnRleHRNZW51RXZlbnQgJiYgIXJvdGF0aW5nKSB7XG4gICAgICAgICAgICAvLyBUaGlzIHdpbGwgYmUgdGhlIGNhc2UgZm9yIE1hY1xuICAgICAgICAgICAgbWFwLmZpcmUobmV3IE1hcE1vdXNlRXZlbnQoJ2NvbnRleHRtZW51JywgbWFwLCBjb250ZXh0TWVudUV2ZW50KSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb250ZXh0TWVudUV2ZW50ID0gbnVsbDtcbiAgICAgICAgbW91c2VEb3duID0gZmFsc2U7XG5cbiAgICAgICAgbWFwLmZpcmUobmV3IE1hcE1vdXNlRXZlbnQoJ21vdXNldXAnLCBtYXAsIGUpKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvbk1vdXNlTW92ZShlOiBNb3VzZUV2ZW50KSB7XG4gICAgICAgIGlmIChtYXAuZHJhZ1Bhbi5pc0FjdGl2ZSgpKSByZXR1cm47XG4gICAgICAgIGlmIChtYXAuZHJhZ1JvdGF0ZS5pc0FjdGl2ZSgpKSByZXR1cm47XG5cbiAgICAgICAgbGV0IHRhcmdldDogP05vZGUgPSAoZS50YXJnZXQ6IGFueSk7XG4gICAgICAgIHdoaWxlICh0YXJnZXQgJiYgdGFyZ2V0ICE9PSBlbCkgdGFyZ2V0ID0gdGFyZ2V0LnBhcmVudE5vZGU7XG4gICAgICAgIGlmICh0YXJnZXQgIT09IGVsKSByZXR1cm47XG5cbiAgICAgICAgbWFwLmZpcmUobmV3IE1hcE1vdXNlRXZlbnQoJ21vdXNlbW92ZScsIG1hcCwgZSkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9uTW91c2VPdmVyKGU6IE1vdXNlRXZlbnQpIHtcbiAgICAgICAgbGV0IHRhcmdldDogP05vZGUgPSAoZS50YXJnZXQ6IGFueSk7XG4gICAgICAgIHdoaWxlICh0YXJnZXQgJiYgdGFyZ2V0ICE9PSBlbCkgdGFyZ2V0ID0gdGFyZ2V0LnBhcmVudE5vZGU7XG4gICAgICAgIGlmICh0YXJnZXQgIT09IGVsKSByZXR1cm47XG5cbiAgICAgICAgbWFwLmZpcmUobmV3IE1hcE1vdXNlRXZlbnQoJ21vdXNlb3ZlcicsIG1hcCwgZSkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9uTW91c2VPdXQoZTogTW91c2VFdmVudCkge1xuICAgICAgICBtYXAuZmlyZShuZXcgTWFwTW91c2VFdmVudCgnbW91c2VvdXQnLCBtYXAsIGUpKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvblRvdWNoU3RhcnQoZTogVG91Y2hFdmVudCkge1xuICAgICAgICBjb25zdCBtYXBFdmVudCA9IG5ldyBNYXBUb3VjaEV2ZW50KCd0b3VjaHN0YXJ0JywgbWFwLCBlKTtcbiAgICAgICAgbWFwLmZpcmUobWFwRXZlbnQpO1xuXG4gICAgICAgIGlmIChtYXBFdmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucy5pbnRlcmFjdGl2ZSkge1xuICAgICAgICAgICAgbWFwLnN0b3AoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghbWFwLmJveFpvb20uaXNBY3RpdmUoKSAmJiAhbWFwLmRyYWdSb3RhdGUuaXNBY3RpdmUoKSkge1xuICAgICAgICAgICAgbWFwLmRyYWdQYW4ub25Ub3VjaFN0YXJ0KGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgbWFwLnRvdWNoWm9vbVJvdGF0ZS5vblN0YXJ0KGUpO1xuICAgICAgICBtYXAuZG91YmxlQ2xpY2tab29tLm9uVG91Y2hTdGFydChtYXBFdmVudCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gb25Ub3VjaE1vdmUoZTogVG91Y2hFdmVudCkge1xuICAgICAgICBtYXAuZmlyZShuZXcgTWFwVG91Y2hFdmVudCgndG91Y2htb3ZlJywgbWFwLCBlKSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gb25Ub3VjaEVuZChlOiBUb3VjaEV2ZW50KSB7XG4gICAgICAgIG1hcC5maXJlKG5ldyBNYXBUb3VjaEV2ZW50KCd0b3VjaGVuZCcsIG1hcCwgZSkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9uVG91Y2hDYW5jZWwoZTogVG91Y2hFdmVudCkge1xuICAgICAgICBtYXAuZmlyZShuZXcgTWFwVG91Y2hFdmVudCgndG91Y2hjYW5jZWwnLCBtYXAsIGUpKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvbkNsaWNrKGU6IE1vdXNlRXZlbnQpIHtcbiAgICAgICAgY29uc3QgcG9zID0gRE9NLm1vdXNlUG9zKGVsLCBlKTtcbiAgICAgICAgaWYgKHBvcy5lcXVhbHMoc3RhcnRQb3MpIHx8IHBvcy5kaXN0KHN0YXJ0UG9zKSA8IG9wdGlvbnMuY2xpY2tUb2xlcmFuY2UpIHtcbiAgICAgICAgICAgIG1hcC5maXJlKG5ldyBNYXBNb3VzZUV2ZW50KCdjbGljaycsIG1hcCwgZSkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gb25EYmxDbGljayhlOiBNb3VzZUV2ZW50KSB7XG4gICAgICAgIGNvbnN0IG1hcEV2ZW50ID0gbmV3IE1hcE1vdXNlRXZlbnQoJ2RibGNsaWNrJywgbWFwLCBlKTtcbiAgICAgICAgbWFwLmZpcmUobWFwRXZlbnQpO1xuXG4gICAgICAgIGlmIChtYXBFdmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBtYXAuZG91YmxlQ2xpY2tab29tLm9uRGJsQ2xpY2sobWFwRXZlbnQpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9uQ29udGV4dE1lbnUoZTogTW91c2VFdmVudCkge1xuICAgICAgICBjb25zdCByb3RhdGluZyA9IG1hcC5kcmFnUm90YXRlLmlzQWN0aXZlKCk7XG4gICAgICAgIGlmICghbW91c2VEb3duICYmICFyb3RhdGluZykge1xuICAgICAgICAgICAgLy8gV2luZG93czogY29udGV4dG1lbnUgZmlyZWQgb24gbW91c2V1cCwgc28gZmlyZSBldmVudCBub3dcbiAgICAgICAgICAgIG1hcC5maXJlKG5ldyBNYXBNb3VzZUV2ZW50KCdjb250ZXh0bWVudScsIG1hcCwgZSkpO1xuICAgICAgICB9IGVsc2UgaWYgKG1vdXNlRG93bikge1xuICAgICAgICAgICAgLy8gTWFjOiBjb250ZXh0bWVudSBmaXJlZCBvbiBtb3VzZWRvd247IHdlIHNhdmUgaXQgdW50aWwgbW91c2V1cCBmb3IgY29uc2lzdGVuY3kncyBzYWtlXG4gICAgICAgICAgICBjb250ZXh0TWVudUV2ZW50ID0gZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHByZXZlbnQgYnJvd3NlciBjb250ZXh0IG1lbnUgd2hlbiBuZWNlc3Nhcnk7IHdlIGRvbid0IGFsbG93IGl0IHdpdGggcm90YXRpb25cbiAgICAgICAgLy8gYmVjYXVzZSB3ZSBjYW4ndCBkaXNjZXJuIHJvdGF0aW9uIGdlc3R1cmUgc3RhcnQgZnJvbSBjb250ZXh0bWVudSBvbiBNYWNcbiAgICAgICAgaWYgKG1hcC5kcmFnUm90YXRlLmlzRW5hYmxlZCgpIHx8IG1hcC5saXN0ZW5zKCdjb250ZXh0bWVudScpKSB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvbldoZWVsKGU6IFdoZWVsRXZlbnQpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMuaW50ZXJhY3RpdmUpIHtcbiAgICAgICAgICAgIG1hcC5zdG9wKCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtYXBFdmVudCA9IG5ldyBNYXBXaGVlbEV2ZW50KCd3aGVlbCcsIG1hcCwgZSk7XG4gICAgICAgIG1hcC5maXJlKG1hcEV2ZW50KTtcblxuICAgICAgICBpZiAobWFwRXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbWFwLnNjcm9sbFpvb20ub25XaGVlbChlKTtcbiAgICB9XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge1xuICAgIGJpbmRBbGwsXG4gICAgZXh0ZW5kLFxuICAgIGRlZXBFcXVhbCxcbiAgICB3YXJuT25jZSxcbiAgICBjbGFtcCxcbiAgICB3cmFwLFxuICAgIGVhc2UgYXMgZGVmYXVsdEVhc2luZ1xufSBmcm9tICcuLi91dGlsL3V0aWwnO1xuaW1wb3J0IHsgbnVtYmVyIGFzIGludGVycG9sYXRlIH0gZnJvbSAnLi4vc3R5bGUtc3BlYy91dGlsL2ludGVycG9sYXRlJztcbmltcG9ydCBicm93c2VyIGZyb20gJy4uL3V0aWwvYnJvd3Nlcic7XG5pbXBvcnQgTG5nTGF0IGZyb20gJy4uL2dlby9sbmdfbGF0JztcbmltcG9ydCBMbmdMYXRCb3VuZHMgZnJvbSAnLi4vZ2VvL2xuZ19sYXRfYm91bmRzJztcbmltcG9ydCBQb2ludCBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcbmltcG9ydCB7IEV2ZW50LCBFdmVudGVkIH0gZnJvbSAnLi4vdXRpbC9ldmVudGVkJztcblxuaW1wb3J0IHR5cGUgVHJhbnNmb3JtIGZyb20gJy4uL2dlby90cmFuc2Zvcm0nO1xuaW1wb3J0IHR5cGUge0xuZ0xhdExpa2V9IGZyb20gJy4uL2dlby9sbmdfbGF0JztcbmltcG9ydCB0eXBlIHtMbmdMYXRCb3VuZHNMaWtlfSBmcm9tICcuLi9nZW8vbG5nX2xhdF9ib3VuZHMnO1xuaW1wb3J0IHR5cGUge1Rhc2tJRH0gZnJvbSAnLi4vdXRpbC90YXNrX3F1ZXVlJztcbmltcG9ydCB0eXBlIHtQb2ludExpa2V9IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuXG4vKipcbiAqIE9wdGlvbnMgY29tbW9uIHRvIHtAbGluayBNYXAjanVtcFRvfSwge0BsaW5rIE1hcCNlYXNlVG99LCBhbmQge0BsaW5rIE1hcCNmbHlUb30sIGNvbnRyb2xsaW5nIHRoZSBkZXNpcmVkIGxvY2F0aW9uLFxuICogem9vbSwgYmVhcmluZywgYW5kIHBpdGNoIG9mIHRoZSBjYW1lcmEuIEFsbCBwcm9wZXJ0aWVzIGFyZSBvcHRpb25hbCwgYW5kIHdoZW4gYSBwcm9wZXJ0eSBpcyBvbWl0dGVkLCB0aGUgY3VycmVudFxuICogY2FtZXJhIHZhbHVlIGZvciB0aGF0IHByb3BlcnR5IHdpbGwgcmVtYWluIHVuY2hhbmdlZC5cbiAqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBDYW1lcmFPcHRpb25zXG4gKiBAcHJvcGVydHkge0xuZ0xhdExpa2V9IGNlbnRlciBUaGUgZGVzaXJlZCBjZW50ZXIuXG4gKiBAcHJvcGVydHkge251bWJlcn0gem9vbSBUaGUgZGVzaXJlZCB6b29tIGxldmVsLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IGJlYXJpbmcgVGhlIGRlc2lyZWQgYmVhcmluZywgaW4gZGVncmVlcy4gVGhlIGJlYXJpbmcgaXMgdGhlIGNvbXBhc3MgZGlyZWN0aW9uIHRoYXRcbiAqIGlzIFwidXBcIjsgZm9yIGV4YW1wbGUsIGEgYmVhcmluZyBvZiA5MMOCwrAgb3JpZW50cyB0aGUgbWFwIHNvIHRoYXQgZWFzdCBpcyB1cC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBwaXRjaCBUaGUgZGVzaXJlZCBwaXRjaCwgaW4gZGVncmVlcy5cbiAqIEBwcm9wZXJ0eSB7TG5nTGF0TGlrZX0gYXJvdW5kIElmIGB6b29tYCBpcyBzcGVjaWZpZWQsIGBhcm91bmRgIGRldGVybWluZXMgdGhlIHBvaW50IGFyb3VuZCB3aGljaCB0aGUgem9vbSBpcyBjZW50ZXJlZC5cbiAqL1xuZXhwb3J0IHR5cGUgQ2FtZXJhT3B0aW9ucyA9IHtcbiAgICBjZW50ZXI/OiBMbmdMYXRMaWtlLFxuICAgIHpvb20/OiBudW1iZXIsXG4gICAgYmVhcmluZz86IG51bWJlcixcbiAgICBwaXRjaD86IG51bWJlcixcbiAgICBhcm91bmQ/OiBMbmdMYXRMaWtlXG59O1xuXG4vKipcbiAqIE9wdGlvbnMgY29tbW9uIHRvIG1hcCBtb3ZlbWVudCBtZXRob2RzIHRoYXQgaW52b2x2ZSBhbmltYXRpb24sIHN1Y2ggYXMge0BsaW5rIE1hcCNwYW5CeX0gYW5kXG4gKiB7QGxpbmsgTWFwI2Vhc2VUb30sIGNvbnRyb2xsaW5nIHRoZSBkdXJhdGlvbiBhbmQgZWFzaW5nIGZ1bmN0aW9uIG9mIHRoZSBhbmltYXRpb24uIEFsbCBwcm9wZXJ0aWVzXG4gKiBhcmUgb3B0aW9uYWwuXG4gKlxuICogQHR5cGVkZWYge09iamVjdH0gQW5pbWF0aW9uT3B0aW9uc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IGR1cmF0aW9uIFRoZSBhbmltYXRpb24ncyBkdXJhdGlvbiwgbWVhc3VyZWQgaW4gbWlsbGlzZWNvbmRzLlxuICogQHByb3BlcnR5IHtGdW5jdGlvbn0gZWFzaW5nIEEgZnVuY3Rpb24gdGFraW5nIGEgdGltZSBpbiB0aGUgcmFuZ2UgMC4uMSBhbmQgcmV0dXJuaW5nIGEgbnVtYmVyIHdoZXJlIDAgaXNcbiAqICAgdGhlIGluaXRpYWwgc3RhdGUgYW5kIDEgaXMgdGhlIGZpbmFsIHN0YXRlLlxuICogQHByb3BlcnR5IHtQb2ludExpa2V9IG9mZnNldCBvZiB0aGUgdGFyZ2V0IGNlbnRlciByZWxhdGl2ZSB0byByZWFsIG1hcCBjb250YWluZXIgY2VudGVyIGF0IHRoZSBlbmQgb2YgYW5pbWF0aW9uLlxuICogQHByb3BlcnR5IHtib29sZWFufSBhbmltYXRlIElmIGBmYWxzZWAsIG5vIGFuaW1hdGlvbiB3aWxsIG9jY3VyLlxuICovXG5leHBvcnQgdHlwZSBBbmltYXRpb25PcHRpb25zID0ge1xuICAgIGR1cmF0aW9uPzogbnVtYmVyLFxuICAgIGVhc2luZz86IChudW1iZXIpID0+IG51bWJlcixcbiAgICBvZmZzZXQ/OiBQb2ludExpa2UsXG4gICAgYW5pbWF0ZT86IGJvb2xlYW5cbn07XG5cbi8qKlxuICogT3B0aW9ucyBmb3Igc2V0dGluZyBwYWRkaW5nIG9uIGEgY2FsbCB0byB7QGxpbmsgTWFwI2ZpdEJvdW5kc30uIEFsbCBwcm9wZXJ0aWVzIG9mIHRoaXMgb2JqZWN0IG11c3QgYmVcbiAqIG5vbi1uZWdhdGl2ZSBpbnRlZ2Vycy5cbiAqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBQYWRkaW5nT3B0aW9uc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IHRvcCBQYWRkaW5nIGluIHBpeGVscyBmcm9tIHRoZSB0b3Agb2YgdGhlIG1hcCBjYW52YXMuXG4gKiBAcHJvcGVydHkge251bWJlcn0gYm90dG9tIFBhZGRpbmcgaW4gcGl4ZWxzIGZyb20gdGhlIGJvdHRvbSBvZiB0aGUgbWFwIGNhbnZhcy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBsZWZ0IFBhZGRpbmcgaW4gcGl4ZWxzIGZyb20gdGhlIGxlZnQgb2YgdGhlIG1hcCBjYW52YXMuXG4gKiBAcHJvcGVydHkge251bWJlcn0gcmlnaHQgUGFkZGluZyBpbiBwaXhlbHMgZnJvbSB0aGUgcmlnaHQgb2YgdGhlIG1hcCBjYW52YXMuXG4gKi9cblxuY2xhc3MgQ2FtZXJhIGV4dGVuZHMgRXZlbnRlZCB7XG4gICAgdHJhbnNmb3JtOiBUcmFuc2Zvcm07XG4gICAgX21vdmluZzogYm9vbGVhbjtcbiAgICBfem9vbWluZzogYm9vbGVhbjtcbiAgICBfcm90YXRpbmc6IGJvb2xlYW47XG4gICAgX3BpdGNoaW5nOiBib29sZWFuO1xuXG4gICAgX2JlYXJpbmdTbmFwOiBudW1iZXI7XG4gICAgX2Vhc2VFbmRUaW1lb3V0SUQ6IFRpbWVvdXRJRDtcbiAgICBfZWFzZVN0YXJ0OiBudW1iZXI7XG4gICAgX2Vhc2VPcHRpb25zOiB7ZHVyYXRpb246IG51bWJlciwgZWFzaW5nOiAobnVtYmVyKSA9PiBudW1iZXJ9O1xuXG4gICAgX29uRWFzZUZyYW1lOiAobnVtYmVyKSA9PiB2b2lkO1xuICAgIF9vbkVhc2VFbmQ6ICgpID0+IHZvaWQ7XG4gICAgX2Vhc2VGcmFtZUlkOiA/VGFza0lEO1xuXG4gICAgK19yZXF1ZXN0UmVuZGVyRnJhbWU6ICgoKSA9PiB2b2lkKSA9PiBUYXNrSUQ7XG4gICAgK19jYW5jZWxSZW5kZXJGcmFtZTogKFRhc2tJRCkgPT4gdm9pZDtcblxuICAgIGNvbnN0cnVjdG9yKHRyYW5zZm9ybTogVHJhbnNmb3JtLCBvcHRpb25zOiB7YmVhcmluZ1NuYXA6IG51bWJlcn0pIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5fbW92aW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX3pvb21pbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy50cmFuc2Zvcm0gPSB0cmFuc2Zvcm07XG4gICAgICAgIHRoaXMuX2JlYXJpbmdTbmFwID0gb3B0aW9ucy5iZWFyaW5nU25hcDtcblxuICAgICAgICBiaW5kQWxsKFsnX3JlbmRlckZyYW1lQ2FsbGJhY2snXSwgdGhpcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgbWFwJ3MgZ2VvZ3JhcGhpY2FsIGNlbnRlcnBvaW50LlxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIE1hcCNcbiAgICAgKiBAcmV0dXJucyBUaGUgbWFwJ3MgZ2VvZ3JhcGhpY2FsIGNlbnRlcnBvaW50LlxuICAgICAqL1xuICAgIGdldENlbnRlcigpOiBMbmdMYXQgeyByZXR1cm4gbmV3IExuZ0xhdCh0aGlzLnRyYW5zZm9ybS5jZW50ZXIubG5nLCB0aGlzLnRyYW5zZm9ybS5jZW50ZXIubGF0KTsgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgbWFwJ3MgZ2VvZ3JhcGhpY2FsIGNlbnRlcnBvaW50LiBFcXVpdmFsZW50IHRvIGBqdW1wVG8oe2NlbnRlcjogY2VudGVyfSlgLlxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIE1hcCNcbiAgICAgKiBAcGFyYW0gY2VudGVyIFRoZSBjZW50ZXJwb2ludCB0byBzZXQuXG4gICAgICogQHBhcmFtIGV2ZW50RGF0YSBBZGRpdGlvbmFsIHByb3BlcnRpZXMgdG8gYmUgYWRkZWQgdG8gZXZlbnQgb2JqZWN0cyBvZiBldmVudHMgdHJpZ2dlcmVkIGJ5IHRoaXMgbWV0aG9kLlxuICAgICAqIEBmaXJlcyBtb3Zlc3RhcnRcbiAgICAgKiBAZmlyZXMgbW92ZWVuZFxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxuICAgICAqIEBleGFtcGxlXG4gICAgICogbWFwLnNldENlbnRlcihbLTc0LCAzOF0pO1xuICAgICAqL1xuICAgIHNldENlbnRlcihjZW50ZXI6IExuZ0xhdExpa2UsIGV2ZW50RGF0YT86IE9iamVjdCkge1xuICAgICAgICByZXR1cm4gdGhpcy5qdW1wVG8oe2NlbnRlcn0sIGV2ZW50RGF0YSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGFucyB0aGUgbWFwIGJ5IHRoZSBzcGVjaWZpZWQgb2Zmc2V0LlxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIE1hcCNcbiAgICAgKiBAcGFyYW0gb2Zmc2V0IGB4YCBhbmQgYHlgIGNvb3JkaW5hdGVzIGJ5IHdoaWNoIHRvIHBhbiB0aGUgbWFwLlxuICAgICAqIEBwYXJhbSBvcHRpb25zXG4gICAgICogQHBhcmFtIGV2ZW50RGF0YSBBZGRpdGlvbmFsIHByb3BlcnRpZXMgdG8gYmUgYWRkZWQgdG8gZXZlbnQgb2JqZWN0cyBvZiBldmVudHMgdHJpZ2dlcmVkIGJ5IHRoaXMgbWV0aG9kLlxuICAgICAqIEBmaXJlcyBtb3Zlc3RhcnRcbiAgICAgKiBAZmlyZXMgbW92ZWVuZFxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxuICAgICAqIEBzZWUgW05hdmlnYXRlIHRoZSBtYXAgd2l0aCBnYW1lLWxpa2UgY29udHJvbHNdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvZ2FtZS1jb250cm9scy8pXG4gICAgICovXG4gICAgcGFuQnkob2Zmc2V0OiBQb2ludExpa2UsIG9wdGlvbnM/OiBBbmltYXRpb25PcHRpb25zLCBldmVudERhdGE/OiBPYmplY3QpIHtcbiAgICAgICAgb2Zmc2V0ID0gUG9pbnQuY29udmVydChvZmZzZXQpLm11bHQoLTEpO1xuICAgICAgICByZXR1cm4gdGhpcy5wYW5Ubyh0aGlzLnRyYW5zZm9ybS5jZW50ZXIsIGV4dGVuZCh7b2Zmc2V0fSwgb3B0aW9ucyksIGV2ZW50RGF0YSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGFucyB0aGUgbWFwIHRvIHRoZSBzcGVjaWZpZWQgbG9jYXRpb24sIHdpdGggYW4gYW5pbWF0ZWQgdHJhbnNpdGlvbi5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBNYXAjXG4gICAgICogQHBhcmFtIGxuZ2xhdCBUaGUgbG9jYXRpb24gdG8gcGFuIHRoZSBtYXAgdG8uXG4gICAgICogQHBhcmFtIG9wdGlvbnNcbiAgICAgKiBAcGFyYW0gZXZlbnREYXRhIEFkZGl0aW9uYWwgcHJvcGVydGllcyB0byBiZSBhZGRlZCB0byBldmVudCBvYmplY3RzIG9mIGV2ZW50cyB0cmlnZ2VyZWQgYnkgdGhpcyBtZXRob2QuXG4gICAgICogQGZpcmVzIG1vdmVzdGFydFxuICAgICAqIEBmaXJlcyBtb3ZlZW5kXG4gICAgICogQHJldHVybnMge01hcH0gYHRoaXNgXG4gICAgICovXG4gICAgcGFuVG8obG5nbGF0OiBMbmdMYXRMaWtlLCBvcHRpb25zPzogQW5pbWF0aW9uT3B0aW9ucywgZXZlbnREYXRhPzogT2JqZWN0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVhc2VUbyhleHRlbmQoe1xuICAgICAgICAgICAgY2VudGVyOiBsbmdsYXRcbiAgICAgICAgfSwgb3B0aW9ucyksIGV2ZW50RGF0YSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgbWFwJ3MgY3VycmVudCB6b29tIGxldmVsLlxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIE1hcCNcbiAgICAgKiBAcmV0dXJucyBUaGUgbWFwJ3MgY3VycmVudCB6b29tIGxldmVsLlxuICAgICAqL1xuICAgIGdldFpvb20oKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMudHJhbnNmb3JtLnpvb207IH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIG1hcCdzIHpvb20gbGV2ZWwuIEVxdWl2YWxlbnQgdG8gYGp1bXBUbyh7em9vbTogem9vbX0pYC5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBNYXAjXG4gICAgICogQHBhcmFtIHpvb20gVGhlIHpvb20gbGV2ZWwgdG8gc2V0ICgwLTIwKS5cbiAgICAgKiBAcGFyYW0gZXZlbnREYXRhIEFkZGl0aW9uYWwgcHJvcGVydGllcyB0byBiZSBhZGRlZCB0byBldmVudCBvYmplY3RzIG9mIGV2ZW50cyB0cmlnZ2VyZWQgYnkgdGhpcyBtZXRob2QuXG4gICAgICogQGZpcmVzIG1vdmVzdGFydFxuICAgICAqIEBmaXJlcyB6b29tc3RhcnRcbiAgICAgKiBAZmlyZXMgbW92ZVxuICAgICAqIEBmaXJlcyB6b29tXG4gICAgICogQGZpcmVzIG1vdmVlbmRcbiAgICAgKiBAZmlyZXMgem9vbWVuZFxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gem9vbSB0aGUgbWFwIHRvIDVcbiAgICAgKiBtYXAuc2V0Wm9vbSg1KTtcbiAgICAgKi9cbiAgICBzZXRab29tKHpvb206IG51bWJlciwgZXZlbnREYXRhPzogT2JqZWN0KSB7XG4gICAgICAgIHRoaXMuanVtcFRvKHt6b29tfSwgZXZlbnREYXRhKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogWm9vbXMgdGhlIG1hcCB0byB0aGUgc3BlY2lmaWVkIHpvb20gbGV2ZWwsIHdpdGggYW4gYW5pbWF0ZWQgdHJhbnNpdGlvbi5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBNYXAjXG4gICAgICogQHBhcmFtIHpvb20gVGhlIHpvb20gbGV2ZWwgdG8gdHJhbnNpdGlvbiB0by5cbiAgICAgKiBAcGFyYW0gb3B0aW9uc1xuICAgICAqIEBwYXJhbSBldmVudERhdGEgQWRkaXRpb25hbCBwcm9wZXJ0aWVzIHRvIGJlIGFkZGVkIHRvIGV2ZW50IG9iamVjdHMgb2YgZXZlbnRzIHRyaWdnZXJlZCBieSB0aGlzIG1ldGhvZC5cbiAgICAgKiBAZmlyZXMgbW92ZXN0YXJ0XG4gICAgICogQGZpcmVzIHpvb21zdGFydFxuICAgICAqIEBmaXJlcyBtb3ZlXG4gICAgICogQGZpcmVzIHpvb21cbiAgICAgKiBAZmlyZXMgbW92ZWVuZFxuICAgICAqIEBmaXJlcyB6b29tZW5kXG4gICAgICogQHJldHVybnMge01hcH0gYHRoaXNgXG4gICAgICovXG4gICAgem9vbVRvKHpvb206IG51bWJlciwgb3B0aW9uczogPyBBbmltYXRpb25PcHRpb25zLCBldmVudERhdGE/OiBPYmplY3QpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWFzZVRvKGV4dGVuZCh7XG4gICAgICAgICAgICB6b29tXG4gICAgICAgIH0sIG9wdGlvbnMpLCBldmVudERhdGEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluY3JlYXNlcyB0aGUgbWFwJ3Mgem9vbSBsZXZlbCBieSAxLlxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIE1hcCNcbiAgICAgKiBAcGFyYW0gb3B0aW9uc1xuICAgICAqIEBwYXJhbSBldmVudERhdGEgQWRkaXRpb25hbCBwcm9wZXJ0aWVzIHRvIGJlIGFkZGVkIHRvIGV2ZW50IG9iamVjdHMgb2YgZXZlbnRzIHRyaWdnZXJlZCBieSB0aGlzIG1ldGhvZC5cbiAgICAgKiBAZmlyZXMgbW92ZXN0YXJ0XG4gICAgICogQGZpcmVzIHpvb21zdGFydFxuICAgICAqIEBmaXJlcyBtb3ZlXG4gICAgICogQGZpcmVzIHpvb21cbiAgICAgKiBAZmlyZXMgbW92ZWVuZFxuICAgICAqIEBmaXJlcyB6b29tZW5kXG4gICAgICogQHJldHVybnMge01hcH0gYHRoaXNgXG4gICAgICovXG4gICAgem9vbUluKG9wdGlvbnM/OiBBbmltYXRpb25PcHRpb25zLCBldmVudERhdGE/OiBPYmplY3QpIHtcbiAgICAgICAgdGhpcy56b29tVG8odGhpcy5nZXRab29tKCkgKyAxLCBvcHRpb25zLCBldmVudERhdGEpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWNyZWFzZXMgdGhlIG1hcCdzIHpvb20gbGV2ZWwgYnkgMS5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBNYXAjXG4gICAgICogQHBhcmFtIG9wdGlvbnNcbiAgICAgKiBAcGFyYW0gZXZlbnREYXRhIEFkZGl0aW9uYWwgcHJvcGVydGllcyB0byBiZSBhZGRlZCB0byBldmVudCBvYmplY3RzIG9mIGV2ZW50cyB0cmlnZ2VyZWQgYnkgdGhpcyBtZXRob2QuXG4gICAgICogQGZpcmVzIG1vdmVzdGFydFxuICAgICAqIEBmaXJlcyB6b29tc3RhcnRcbiAgICAgKiBAZmlyZXMgbW92ZVxuICAgICAqIEBmaXJlcyB6b29tXG4gICAgICogQGZpcmVzIG1vdmVlbmRcbiAgICAgKiBAZmlyZXMgem9vbWVuZFxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxuICAgICAqL1xuICAgIHpvb21PdXQob3B0aW9ucz86IEFuaW1hdGlvbk9wdGlvbnMsIGV2ZW50RGF0YT86IE9iamVjdCkge1xuICAgICAgICB0aGlzLnpvb21Ubyh0aGlzLmdldFpvb20oKSAtIDEsIG9wdGlvbnMsIGV2ZW50RGF0YSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIG1hcCdzIGN1cnJlbnQgYmVhcmluZy4gVGhlIGJlYXJpbmcgaXMgdGhlIGNvbXBhc3MgZGlyZWN0aW9uIHRoYXQgaXMgXFxcInVwXFxcIjsgZm9yIGV4YW1wbGUsIGEgYmVhcmluZ1xuICAgICAqIG9mIDkww4LCsCBvcmllbnRzIHRoZSBtYXAgc28gdGhhdCBlYXN0IGlzIHVwLlxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIE1hcCNcbiAgICAgKiBAcmV0dXJucyBUaGUgbWFwJ3MgY3VycmVudCBiZWFyaW5nLlxuICAgICAqIEBzZWUgW05hdmlnYXRlIHRoZSBtYXAgd2l0aCBnYW1lLWxpa2UgY29udHJvbHNdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvZ2FtZS1jb250cm9scy8pXG4gICAgICovXG4gICAgZ2V0QmVhcmluZygpOiBudW1iZXIgeyByZXR1cm4gdGhpcy50cmFuc2Zvcm0uYmVhcmluZzsgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgbWFwJ3MgYmVhcmluZyAocm90YXRpb24pLiBUaGUgYmVhcmluZyBpcyB0aGUgY29tcGFzcyBkaXJlY3Rpb24gdGhhdCBpcyBcXFwidXBcXFwiOyBmb3IgZXhhbXBsZSwgYSBiZWFyaW5nXG4gICAgICogb2YgOTDDgsKwIG9yaWVudHMgdGhlIG1hcCBzbyB0aGF0IGVhc3QgaXMgdXAuXG4gICAgICpcbiAgICAgKiBFcXVpdmFsZW50IHRvIGBqdW1wVG8oe2JlYXJpbmc6IGJlYXJpbmd9KWAuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgTWFwI1xuICAgICAqIEBwYXJhbSBiZWFyaW5nIFRoZSBkZXNpcmVkIGJlYXJpbmcuXG4gICAgICogQHBhcmFtIGV2ZW50RGF0YSBBZGRpdGlvbmFsIHByb3BlcnRpZXMgdG8gYmUgYWRkZWQgdG8gZXZlbnQgb2JqZWN0cyBvZiBldmVudHMgdHJpZ2dlcmVkIGJ5IHRoaXMgbWV0aG9kLlxuICAgICAqIEBmaXJlcyBtb3Zlc3RhcnRcbiAgICAgKiBAZmlyZXMgbW92ZWVuZFxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gcm90YXRlIHRoZSBtYXAgdG8gOTAgZGVncmVlc1xuICAgICAqIG1hcC5zZXRCZWFyaW5nKDkwKTtcbiAgICAgKi9cbiAgICBzZXRCZWFyaW5nKGJlYXJpbmc6IG51bWJlciwgZXZlbnREYXRhPzogT2JqZWN0KSB7XG4gICAgICAgIHRoaXMuanVtcFRvKHtiZWFyaW5nfSwgZXZlbnREYXRhKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUm90YXRlcyB0aGUgbWFwIHRvIHRoZSBzcGVjaWZpZWQgYmVhcmluZywgd2l0aCBhbiBhbmltYXRlZCB0cmFuc2l0aW9uLiBUaGUgYmVhcmluZyBpcyB0aGUgY29tcGFzcyBkaXJlY3Rpb25cbiAgICAgKiB0aGF0IGlzIFxcXCJ1cFxcXCI7IGZvciBleGFtcGxlLCBhIGJlYXJpbmcgb2YgOTDDgsKwIG9yaWVudHMgdGhlIG1hcCBzbyB0aGF0IGVhc3QgaXMgdXAuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgTWFwI1xuICAgICAqIEBwYXJhbSBiZWFyaW5nIFRoZSBkZXNpcmVkIGJlYXJpbmcuXG4gICAgICogQHBhcmFtIG9wdGlvbnNcbiAgICAgKiBAcGFyYW0gZXZlbnREYXRhIEFkZGl0aW9uYWwgcHJvcGVydGllcyB0byBiZSBhZGRlZCB0byBldmVudCBvYmplY3RzIG9mIGV2ZW50cyB0cmlnZ2VyZWQgYnkgdGhpcyBtZXRob2QuXG4gICAgICogQGZpcmVzIG1vdmVzdGFydFxuICAgICAqIEBmaXJlcyBtb3ZlZW5kXG4gICAgICogQHJldHVybnMge01hcH0gYHRoaXNgXG4gICAgICovXG4gICAgcm90YXRlVG8oYmVhcmluZzogbnVtYmVyLCBvcHRpb25zPzogQW5pbWF0aW9uT3B0aW9ucywgZXZlbnREYXRhPzogT2JqZWN0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVhc2VUbyhleHRlbmQoe1xuICAgICAgICAgICAgYmVhcmluZ1xuICAgICAgICB9LCBvcHRpb25zKSwgZXZlbnREYXRhKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSb3RhdGVzIHRoZSBtYXAgc28gdGhhdCBub3J0aCBpcyB1cCAoMMOCwrAgYmVhcmluZyksIHdpdGggYW4gYW5pbWF0ZWQgdHJhbnNpdGlvbi5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBNYXAjXG4gICAgICogQHBhcmFtIG9wdGlvbnNcbiAgICAgKiBAcGFyYW0gZXZlbnREYXRhIEFkZGl0aW9uYWwgcHJvcGVydGllcyB0byBiZSBhZGRlZCB0byBldmVudCBvYmplY3RzIG9mIGV2ZW50cyB0cmlnZ2VyZWQgYnkgdGhpcyBtZXRob2QuXG4gICAgICogQGZpcmVzIG1vdmVzdGFydFxuICAgICAqIEBmaXJlcyBtb3ZlZW5kXG4gICAgICogQHJldHVybnMge01hcH0gYHRoaXNgXG4gICAgICovXG4gICAgcmVzZXROb3J0aChvcHRpb25zPzogQW5pbWF0aW9uT3B0aW9ucywgZXZlbnREYXRhPzogT2JqZWN0KSB7XG4gICAgICAgIHRoaXMucm90YXRlVG8oMCwgZXh0ZW5kKHtkdXJhdGlvbjogMTAwMH0sIG9wdGlvbnMpLCBldmVudERhdGEpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTbmFwcyB0aGUgbWFwIHNvIHRoYXQgbm9ydGggaXMgdXAgKDDDgsKwIGJlYXJpbmcpLCBpZiB0aGUgY3VycmVudCBiZWFyaW5nIGlzIGNsb3NlIGVub3VnaCB0byBpdCAoaS5lLiB3aXRoaW4gdGhlXG4gICAgICogYGJlYXJpbmdTbmFwYCB0aHJlc2hvbGQpLlxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIE1hcCNcbiAgICAgKiBAcGFyYW0gb3B0aW9uc1xuICAgICAqIEBwYXJhbSBldmVudERhdGEgQWRkaXRpb25hbCBwcm9wZXJ0aWVzIHRvIGJlIGFkZGVkIHRvIGV2ZW50IG9iamVjdHMgb2YgZXZlbnRzIHRyaWdnZXJlZCBieSB0aGlzIG1ldGhvZC5cbiAgICAgKiBAZmlyZXMgbW92ZXN0YXJ0XG4gICAgICogQGZpcmVzIG1vdmVlbmRcbiAgICAgKiBAcmV0dXJucyB7TWFwfSBgdGhpc2BcbiAgICAgKi9cbiAgICBzbmFwVG9Ob3J0aChvcHRpb25zPzogQW5pbWF0aW9uT3B0aW9ucywgZXZlbnREYXRhPzogT2JqZWN0KSB7XG4gICAgICAgIGlmIChNYXRoLmFicyh0aGlzLmdldEJlYXJpbmcoKSkgPCB0aGlzLl9iZWFyaW5nU25hcCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVzZXROb3J0aChvcHRpb25zLCBldmVudERhdGEpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIG1hcCdzIGN1cnJlbnQgcGl0Y2ggKHRpbHQpLlxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIE1hcCNcbiAgICAgKiBAcmV0dXJucyBUaGUgbWFwJ3MgY3VycmVudCBwaXRjaCwgbWVhc3VyZWQgaW4gZGVncmVlcyBhd2F5IGZyb20gdGhlIHBsYW5lIG9mIHRoZSBzY3JlZW4uXG4gICAgICovXG4gICAgZ2V0UGl0Y2goKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMudHJhbnNmb3JtLnBpdGNoOyB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBtYXAncyBwaXRjaCAodGlsdCkuIEVxdWl2YWxlbnQgdG8gYGp1bXBUbyh7cGl0Y2g6IHBpdGNofSlgLlxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIE1hcCNcbiAgICAgKiBAcGFyYW0gcGl0Y2ggVGhlIHBpdGNoIHRvIHNldCwgbWVhc3VyZWQgaW4gZGVncmVlcyBhd2F5IGZyb20gdGhlIHBsYW5lIG9mIHRoZSBzY3JlZW4gKDAtNjApLlxuICAgICAqIEBwYXJhbSBldmVudERhdGEgQWRkaXRpb25hbCBwcm9wZXJ0aWVzIHRvIGJlIGFkZGVkIHRvIGV2ZW50IG9iamVjdHMgb2YgZXZlbnRzIHRyaWdnZXJlZCBieSB0aGlzIG1ldGhvZC5cbiAgICAgKiBAZmlyZXMgcGl0Y2hzdGFydFxuICAgICAqIEBmaXJlcyBtb3Zlc3RhcnRcbiAgICAgKiBAZmlyZXMgbW92ZWVuZFxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxuICAgICAqL1xuICAgIHNldFBpdGNoKHBpdGNoOiBudW1iZXIsIGV2ZW50RGF0YT86IE9iamVjdCkge1xuICAgICAgICB0aGlzLmp1bXBUbyh7cGl0Y2h9LCBldmVudERhdGEpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAbWVtYmVyb2YgTWFwI1xuICAgICAqIEBwYXJhbSB7TGF0TG5nQm91bmRzTGlrZX0gYm91bmRzIENhbGN1bGF0ZSB0aGUgY2VudGVyIGZvciB0aGVzZSBib3VuZHMgaW4gdGhlIHZpZXdwb3J0IGFuZCB1c2VcbiAgICAgKiAgICAgIHRoZSBoaWdoZXN0IHpvb20gbGV2ZWwgdXAgdG8gYW5kIGluY2x1ZGluZyBgTWFwI2dldE1heFpvb20oKWAgdGhhdCBmaXRzXG4gICAgICogICAgICBpbiB0aGUgdmlld3BvcnQuIExhdExuZ0JvdW5kcyByZXByZXNlbnQgYSBib3ggdGhhdCBpcyBhbHdheXMgYXhpcy1hbGlnbmVkIHdpdGggYmVhcmluZyAwLlxuICAgICAqIEBwYXJhbSBvcHRpb25zXG4gICAgICogQHBhcmFtIHtudW1iZXIgfCBQYWRkaW5nT3B0aW9uc30gW29wdGlvbnMucGFkZGluZ10gVGhlIGFtb3VudCBvZiBwYWRkaW5nIGluIHBpeGVscyB0byBhZGQgdG8gdGhlIGdpdmVuIGJvdW5kcy5cbiAgICAgKiBAcGFyYW0ge1BvaW50TGlrZX0gW29wdGlvbnMub2Zmc2V0PVswLCAwXV0gVGhlIGNlbnRlciBvZiB0aGUgZ2l2ZW4gYm91bmRzIHJlbGF0aXZlIHRvIHRoZSBtYXAncyBjZW50ZXIsIG1lYXN1cmVkIGluIHBpeGVscy5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMubWF4Wm9vbV0gVGhlIG1heGltdW0gem9vbSBsZXZlbCB0byBhbGxvdyB3aGVuIHRoZSBjYW1lcmEgd291bGQgdHJhbnNpdGlvbiB0byB0aGUgc3BlY2lmaWVkIGJvdW5kcy5cbiAgICAgKiBAcmV0dXJucyB7Q2FtZXJhT3B0aW9ucyB8IHZvaWR9IElmIG1hcCBpcyBhYmxlIHRvIGZpdCB0byBwcm92aWRlZCBib3VuZHMsIHJldHVybnMgYENhbWVyYU9wdGlvbnNgIHdpdGhcbiAgICAgKiAgICAgIGBjZW50ZXJgLCBgem9vbWAsIGFuZCBgYmVhcmluZ2AuIElmIG1hcCBpcyB1bmFibGUgdG8gZml0LCBtZXRob2Qgd2lsbCB3YXJuIGFuZCByZXR1cm4gdW5kZWZpbmVkLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogdmFyIGJib3ggPSBbWy03OSwgNDNdLCBbLTczLCA0NV1dO1xuICAgICAqIHZhciBuZXdDYW1lcmFUcmFuc2Zvcm0gPSBtYXAuY2FtZXJhRm9yQm91bmRzKGJib3gsIHtcbiAgICAgKiAgIHBhZGRpbmc6IHt0b3A6IDEwLCBib3R0b206MjUsIGxlZnQ6IDE1LCByaWdodDogNX1cbiAgICAgKiB9KTtcbiAgICAgKi9cbiAgICBjYW1lcmFGb3JCb3VuZHMoYm91bmRzOiBMbmdMYXRCb3VuZHNMaWtlLCBvcHRpb25zPzogQ2FtZXJhT3B0aW9ucyk6IHZvaWQgfCBDYW1lcmFPcHRpb25zICYgQW5pbWF0aW9uT3B0aW9ucyB7XG4gICAgICAgIGJvdW5kcyA9IExuZ0xhdEJvdW5kcy5jb252ZXJ0KGJvdW5kcyk7XG4gICAgICAgIHJldHVybiB0aGlzLl9jYW1lcmFGb3JCb3hBbmRCZWFyaW5nKGJvdW5kcy5nZXROb3J0aFdlc3QoKSwgYm91bmRzLmdldFNvdXRoRWFzdCgpLCAwLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYWxjdWxhdGUgdGhlIGNlbnRlciBvZiB0aGVzZSB0d28gcG9pbnRzIGluIHRoZSB2aWV3cG9ydCBhbmQgdXNlXG4gICAgICogdGhlIGhpZ2hlc3Qgem9vbSBsZXZlbCB1cCB0byBhbmQgaW5jbHVkaW5nIGBNYXAjZ2V0TWF4Wm9vbSgpYCB0aGF0IGZpdHNcbiAgICAgKiB0aGUgcG9pbnRzIGluIHRoZSB2aWV3cG9ydCBhdCB0aGUgc3BlY2lmaWVkIGJlYXJpbmcuXG4gICAgICogQG1lbWJlcm9mIE1hcCNcbiAgICAgKiBAcGFyYW0ge0xuZ0xhdExpa2V9IHAwIEZpcnN0IHBvaW50XG4gICAgICogQHBhcmFtIHtMbmdMYXRMaWtlfSBwMSBTZWNvbmQgcG9pbnRcbiAgICAgKiBAcGFyYW0gYmVhcmluZyBEZXNpcmVkIG1hcCBiZWFyaW5nIGF0IGVuZCBvZiBhbmltYXRpb24sIGluIGRlZ3JlZXNcbiAgICAgKiBAcGFyYW0gb3B0aW9uc1xuICAgICAqIEBwYXJhbSB7bnVtYmVyIHwgUGFkZGluZ09wdGlvbnN9IFtvcHRpb25zLnBhZGRpbmddIFRoZSBhbW91bnQgb2YgcGFkZGluZyBpbiBwaXhlbHMgdG8gYWRkIHRvIHRoZSBnaXZlbiBib3VuZHMuXG4gICAgICogQHBhcmFtIHtQb2ludExpa2V9IFtvcHRpb25zLm9mZnNldD1bMCwgMF1dIFRoZSBjZW50ZXIgb2YgdGhlIGdpdmVuIGJvdW5kcyByZWxhdGl2ZSB0byB0aGUgbWFwJ3MgY2VudGVyLCBtZWFzdXJlZCBpbiBwaXhlbHMuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLm1heFpvb21dIFRoZSBtYXhpbXVtIHpvb20gbGV2ZWwgdG8gYWxsb3cgd2hlbiB0aGUgY2FtZXJhIHdvdWxkIHRyYW5zaXRpb24gdG8gdGhlIHNwZWNpZmllZCBib3VuZHMuXG4gICAgICogQHJldHVybnMge0NhbWVyYU9wdGlvbnMgfCB2b2lkfSBJZiBtYXAgaXMgYWJsZSB0byBmaXQgdG8gcHJvdmlkZWQgYm91bmRzLCByZXR1cm5zIGBDYW1lcmFPcHRpb25zYCB3aXRoXG4gICAgICogICAgICBgY2VudGVyYCwgYHpvb21gLCBhbmQgYGJlYXJpbmdgLiBJZiBtYXAgaXMgdW5hYmxlIHRvIGZpdCwgbWV0aG9kIHdpbGwgd2FybiBhbmQgcmV0dXJuIHVuZGVmaW5lZC5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBleGFtcGxlXG4gICAgICogdmFyIHAwID0gWy03OSwgNDNdO1xuICAgICAqIHZhciBwMSA9IFstNzMsIDQ1XTtcbiAgICAgKiB2YXIgYmVhcmluZyA9IDkwO1xuICAgICAqIHZhciBuZXdDYW1lcmFUcmFuc2Zvcm0gPSBtYXAuX2NhbWVyYUZvckJveEFuZEJlYXJpbmcocDAsIHAxLCBiZWFyaW5nLCB7XG4gICAgICogICBwYWRkaW5nOiB7dG9wOiAxMCwgYm90dG9tOjI1LCBsZWZ0OiAxNSwgcmlnaHQ6IDV9XG4gICAgICogfSk7XG4gICAgICovXG4gICAgX2NhbWVyYUZvckJveEFuZEJlYXJpbmcocDA6IExuZ0xhdExpa2UsIHAxOiBMbmdMYXRMaWtlLCBiZWFyaW5nOiBudW1iZXIsIG9wdGlvbnM/OiBDYW1lcmFPcHRpb25zKTogdm9pZCB8IENhbWVyYU9wdGlvbnMgJiBBbmltYXRpb25PcHRpb25zIHtcbiAgICAgICAgb3B0aW9ucyA9IGV4dGVuZCh7XG4gICAgICAgICAgICBwYWRkaW5nOiB7XG4gICAgICAgICAgICAgICAgdG9wOiAwLFxuICAgICAgICAgICAgICAgIGJvdHRvbTogMCxcbiAgICAgICAgICAgICAgICByaWdodDogMCxcbiAgICAgICAgICAgICAgICBsZWZ0OiAwXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb2Zmc2V0OiBbMCwgMF0sXG4gICAgICAgICAgICBtYXhab29tOiB0aGlzLnRyYW5zZm9ybS5tYXhab29tXG4gICAgICAgIH0sIG9wdGlvbnMpO1xuXG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5wYWRkaW5nID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgY29uc3QgcCA9IG9wdGlvbnMucGFkZGluZztcbiAgICAgICAgICAgIG9wdGlvbnMucGFkZGluZyA9IHtcbiAgICAgICAgICAgICAgICB0b3A6IHAsXG4gICAgICAgICAgICAgICAgYm90dG9tOiBwLFxuICAgICAgICAgICAgICAgIHJpZ2h0OiBwLFxuICAgICAgICAgICAgICAgIGxlZnQ6IHBcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFkZWVwRXF1YWwoT2JqZWN0LmtleXMob3B0aW9ucy5wYWRkaW5nKS5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgICAgICBpZiAoYSA8IGIpIHJldHVybiAtMTtcbiAgICAgICAgICAgIGlmIChhID4gYikgcmV0dXJuIDE7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfSksIFtcImJvdHRvbVwiLCBcImxlZnRcIiwgXCJyaWdodFwiLCBcInRvcFwiXSkpIHtcbiAgICAgICAgICAgIHdhcm5PbmNlKFxuICAgICAgICAgICAgICAgIFwib3B0aW9ucy5wYWRkaW5nIG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXIsIG9yIGFuIE9iamVjdCB3aXRoIGtleXMgJ2JvdHRvbScsICdsZWZ0JywgJ3JpZ2h0JywgJ3RvcCdcIlxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRyID0gdGhpcy50cmFuc2Zvcm07XG5cbiAgICAgICAgLy8gV2Ugd2FudCB0byBjYWxjdWxhdGUgdGhlIHVwcGVyIHJpZ2h0IGFuZCBsb3dlciBsZWZ0IG9mIHRoZSBib3ggZGVmaW5lZCBieSBwMCBhbmQgcDFcbiAgICAgICAgLy8gaW4gYSBjb29yZGluYXRlIHN5c3RlbSByb3RhdGUgdG8gbWF0Y2ggdGhlIGRlc3RpbmF0aW9uIGJlYXJpbmcuXG4gICAgICAgIGNvbnN0IHAwd29ybGQgPSB0ci5wcm9qZWN0KExuZ0xhdC5jb252ZXJ0KHAwKSk7XG4gICAgICAgIGNvbnN0IHAxd29ybGQgPSB0ci5wcm9qZWN0KExuZ0xhdC5jb252ZXJ0KHAxKSk7XG4gICAgICAgIGNvbnN0IHAwcm90YXRlZCA9IHAwd29ybGQucm90YXRlKC1iZWFyaW5nICogTWF0aC5QSSAvIDE4MCk7XG4gICAgICAgIGNvbnN0IHAxcm90YXRlZCA9IHAxd29ybGQucm90YXRlKC1iZWFyaW5nICogTWF0aC5QSSAvIDE4MCk7XG5cbiAgICAgICAgY29uc3QgdXBwZXJSaWdodCA9IG5ldyBQb2ludChNYXRoLm1heChwMHJvdGF0ZWQueCwgcDFyb3RhdGVkLngpLCBNYXRoLm1heChwMHJvdGF0ZWQueSwgcDFyb3RhdGVkLnkpKTtcbiAgICAgICAgY29uc3QgbG93ZXJMZWZ0ID0gbmV3IFBvaW50KE1hdGgubWluKHAwcm90YXRlZC54LCBwMXJvdGF0ZWQueCksIE1hdGgubWluKHAwcm90YXRlZC55LCBwMXJvdGF0ZWQueSkpO1xuXG4gICAgICAgIC8vIENhbGN1bGF0ZSB6b29tOiBjb25zaWRlciB0aGUgb3JpZ2luYWwgYmJveCBhbmQgcGFkZGluZy5cbiAgICAgICAgY29uc3Qgc2l6ZSA9IHVwcGVyUmlnaHQuc3ViKGxvd2VyTGVmdCk7XG4gICAgICAgIGNvbnN0IHNjYWxlWCA9ICh0ci53aWR0aCAtIG9wdGlvbnMucGFkZGluZy5sZWZ0IC0gb3B0aW9ucy5wYWRkaW5nLnJpZ2h0KSAvIHNpemUueDtcbiAgICAgICAgY29uc3Qgc2NhbGVZID0gKHRyLmhlaWdodCAtIG9wdGlvbnMucGFkZGluZy50b3AgLSBvcHRpb25zLnBhZGRpbmcuYm90dG9tKSAvIHNpemUueTtcblxuICAgICAgICBpZiAoc2NhbGVZIDwgMCB8fCBzY2FsZVggPCAwKSB7XG4gICAgICAgICAgICB3YXJuT25jZShcbiAgICAgICAgICAgICAgICAnTWFwIGNhbm5vdCBmaXQgd2l0aGluIGNhbnZhcyB3aXRoIHRoZSBnaXZlbiBib3VuZHMsIHBhZGRpbmcsIGFuZC9vciBvZmZzZXQuJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHpvb20gPSBNYXRoLm1pbih0ci5zY2FsZVpvb20odHIuc2NhbGUgKiBNYXRoLm1pbihzY2FsZVgsIHNjYWxlWSkpLCBvcHRpb25zLm1heFpvb20pO1xuXG4gICAgICAgIC8vIENhbGN1bGF0ZSBjZW50ZXI6IGFwcGx5IHRoZSB6b29tLCB0aGUgY29uZmlndXJlZCBvZmZzZXQsIGFzIHdlbGwgYXMgb2Zmc2V0IHRoYXQgZXhpc3RzIGFzIGEgcmVzdWx0IG9mIHBhZGRpbmcuXG4gICAgICAgIGNvbnN0IG9mZnNldCA9IFBvaW50LmNvbnZlcnQob3B0aW9ucy5vZmZzZXQpO1xuICAgICAgICBjb25zdCBwYWRkaW5nT2Zmc2V0WCA9IChvcHRpb25zLnBhZGRpbmcubGVmdCAtIG9wdGlvbnMucGFkZGluZy5yaWdodCkgLyAyO1xuICAgICAgICBjb25zdCBwYWRkaW5nT2Zmc2V0WSA9IChvcHRpb25zLnBhZGRpbmcudG9wIC0gb3B0aW9ucy5wYWRkaW5nLmJvdHRvbSkgLyAyO1xuICAgICAgICBjb25zdCBvZmZzZXRBdEluaXRpYWxab29tID0gbmV3IFBvaW50KG9mZnNldC54ICsgcGFkZGluZ09mZnNldFgsIG9mZnNldC55ICsgcGFkZGluZ09mZnNldFkpO1xuICAgICAgICBjb25zdCBvZmZzZXRBdEZpbmFsWm9vbSA9IG9mZnNldEF0SW5pdGlhbFpvb20ubXVsdCh0ci5zY2FsZSAvIHRyLnpvb21TY2FsZSh6b29tKSk7XG5cbiAgICAgICAgY29uc3QgY2VudGVyID0gIHRyLnVucHJvamVjdChwMHdvcmxkLmFkZChwMXdvcmxkKS5kaXYoMikuc3ViKG9mZnNldEF0RmluYWxab29tKSk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNlbnRlcixcbiAgICAgICAgICAgIHpvb20sXG4gICAgICAgICAgICBiZWFyaW5nXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGFucyBhbmQgem9vbXMgdGhlIG1hcCB0byBjb250YWluIGl0cyB2aXNpYmxlIGFyZWEgd2l0aGluIHRoZSBzcGVjaWZpZWQgZ2VvZ3JhcGhpY2FsIGJvdW5kcy5cbiAgICAgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgYWxzbyByZXNldCB0aGUgbWFwJ3MgYmVhcmluZyB0byAwIGlmIGJlYXJpbmcgaXMgbm9uemVyby5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBNYXAjXG4gICAgICogQHBhcmFtIGJvdW5kcyBDZW50ZXIgdGhlc2UgYm91bmRzIGluIHRoZSB2aWV3cG9ydCBhbmQgdXNlIHRoZSBoaWdoZXN0XG4gICAgICogICAgICB6b29tIGxldmVsIHVwIHRvIGFuZCBpbmNsdWRpbmcgYE1hcCNnZXRNYXhab29tKClgIHRoYXQgZml0cyB0aGVtIGluIHRoZSB2aWV3cG9ydC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIE9wdGlvbnMgc3VwcG9ydHMgYWxsIHByb3BlcnRpZXMgZnJvbSB7QGxpbmsgQW5pbWF0aW9uT3B0aW9uc30gYW5kIHtAbGluayBDYW1lcmFPcHRpb25zfSBpbiBhZGRpdGlvbiB0byB0aGUgZmllbGRzIGJlbG93LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyIHwgUGFkZGluZ09wdGlvbnN9IFtvcHRpb25zLnBhZGRpbmddIFRoZSBhbW91bnQgb2YgcGFkZGluZyBpbiBwaXhlbHMgdG8gYWRkIHRvIHRoZSBnaXZlbiBib3VuZHMuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5saW5lYXI9ZmFsc2VdIElmIGB0cnVlYCwgdGhlIG1hcCB0cmFuc2l0aW9ucyB1c2luZ1xuICAgICAqICAgICB7QGxpbmsgTWFwI2Vhc2VUb30uIElmIGBmYWxzZWAsIHRoZSBtYXAgdHJhbnNpdGlvbnMgdXNpbmcge0BsaW5rIE1hcCNmbHlUb30uIFNlZVxuICAgICAqICAgICB0aG9zZSBmdW5jdGlvbnMgYW5kIHtAbGluayBBbmltYXRpb25PcHRpb25zfSBmb3IgaW5mb3JtYXRpb24gYWJvdXQgb3B0aW9ucyBhdmFpbGFibGUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbnMuZWFzaW5nXSBBbiBlYXNpbmcgZnVuY3Rpb24gZm9yIHRoZSBhbmltYXRlZCB0cmFuc2l0aW9uLiBTZWUge0BsaW5rIEFuaW1hdGlvbk9wdGlvbnN9LlxuICAgICAqIEBwYXJhbSB7UG9pbnRMaWtlfSBbb3B0aW9ucy5vZmZzZXQ9WzAsIDBdXSBUaGUgY2VudGVyIG9mIHRoZSBnaXZlbiBib3VuZHMgcmVsYXRpdmUgdG8gdGhlIG1hcCdzIGNlbnRlciwgbWVhc3VyZWQgaW4gcGl4ZWxzLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5tYXhab29tXSBUaGUgbWF4aW11bSB6b29tIGxldmVsIHRvIGFsbG93IHdoZW4gdGhlIG1hcCB2aWV3IHRyYW5zaXRpb25zIHRvIHRoZSBzcGVjaWZpZWQgYm91bmRzLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbZXZlbnREYXRhXSBBZGRpdGlvbmFsIHByb3BlcnRpZXMgdG8gYmUgYWRkZWQgdG8gZXZlbnQgb2JqZWN0cyBvZiBldmVudHMgdHJpZ2dlcmVkIGJ5IHRoaXMgbWV0aG9kLlxuICAgICAqIEBmaXJlcyBtb3Zlc3RhcnRcbiAgICAgKiBAZmlyZXMgbW92ZWVuZFxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxuXHQgKiBAZXhhbXBsZVxuICAgICAqIHZhciBiYm94ID0gW1stNzksIDQzXSwgWy03MywgNDVdXTtcbiAgICAgKiBtYXAuZml0Qm91bmRzKGJib3gsIHtcbiAgICAgKiAgIHBhZGRpbmc6IHt0b3A6IDEwLCBib3R0b206MjUsIGxlZnQ6IDE1LCByaWdodDogNX1cbiAgICAgKiB9KTtcbiAgICAgKiBAc2VlIFtGaXQgYSBtYXAgdG8gYSBib3VuZGluZyBib3hdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvZml0Ym91bmRzLylcbiAgICAgKi9cbiAgICBmaXRCb3VuZHMoYm91bmRzOiBMbmdMYXRCb3VuZHNMaWtlLCBvcHRpb25zPzogQW5pbWF0aW9uT3B0aW9ucyAmIENhbWVyYU9wdGlvbnMsIGV2ZW50RGF0YT86IE9iamVjdCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZml0SW50ZXJuYWwoXG4gICAgICAgICAgICB0aGlzLmNhbWVyYUZvckJvdW5kcyhib3VuZHMsIG9wdGlvbnMpLFxuICAgICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICAgIGV2ZW50RGF0YSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGFucywgcm90YXRlcyBhbmQgem9vbXMgdGhlIG1hcCB0byB0byBmaXQgdGhlIGJveCBtYWRlIGJ5IHBvaW50cyBwMCBhbmQgcDFcbiAgICAgKiBvbmNlIHRoZSBtYXAgaXMgcm90YXRlZCB0byB0aGUgc3BlY2lmaWVkIGJlYXJpbmcuIFRvIHpvb20gd2l0aG91dCByb3RhdGluZyxcbiAgICAgKiBwYXNzIGluIHRoZSBjdXJyZW50IG1hcCBiZWFyaW5nLlxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIE1hcCNcbiAgICAgKiBAcGFyYW0gcDAgRmlyc3QgcG9pbnQgb24gc2NyZWVuLCBpbiBwaXhlbCBjb29yZGluYXRlc1xuICAgICAqIEBwYXJhbSBwMSBTZWNvbmQgcG9pbnQgb24gc2NyZWVuLCBpbiBwaXhlbCBjb29yZGluYXRlc1xuICAgICAqIEBwYXJhbSBiZWFyaW5nIERlc2lyZWQgbWFwIGJlYXJpbmcgYXQgZW5kIG9mIGFuaW1hdGlvbiwgaW4gZGVncmVlc1xuICAgICAqIEBwYXJhbSBvcHRpb25zXG4gICAgICogQHBhcmFtIHtudW1iZXIgfCBQYWRkaW5nT3B0aW9uc30gW29wdGlvbnMucGFkZGluZ10gVGhlIGFtb3VudCBvZiBwYWRkaW5nIGluIHBpeGVscyB0byBhZGQgdG8gdGhlIGdpdmVuIGJvdW5kcy5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmxpbmVhcj1mYWxzZV0gSWYgYHRydWVgLCB0aGUgbWFwIHRyYW5zaXRpb25zIHVzaW5nXG4gICAgICogICAgIHtAbGluayBNYXAjZWFzZVRvfS4gSWYgYGZhbHNlYCwgdGhlIG1hcCB0cmFuc2l0aW9ucyB1c2luZyB7QGxpbmsgTWFwI2ZseVRvfS4gU2VlXG4gICAgICogICAgIHRob3NlIGZ1bmN0aW9ucyBhbmQge0BsaW5rIEFuaW1hdGlvbk9wdGlvbnN9IGZvciBpbmZvcm1hdGlvbiBhYm91dCBvcHRpb25zIGF2YWlsYWJsZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy5lYXNpbmddIEFuIGVhc2luZyBmdW5jdGlvbiBmb3IgdGhlIGFuaW1hdGVkIHRyYW5zaXRpb24uIFNlZSB7QGxpbmsgQW5pbWF0aW9uT3B0aW9uc30uXG4gICAgICogQHBhcmFtIHtQb2ludExpa2V9IFtvcHRpb25zLm9mZnNldD1bMCwgMF1dIFRoZSBjZW50ZXIgb2YgdGhlIGdpdmVuIGJvdW5kcyByZWxhdGl2ZSB0byB0aGUgbWFwJ3MgY2VudGVyLCBtZWFzdXJlZCBpbiBwaXhlbHMuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLm1heFpvb21dIFRoZSBtYXhpbXVtIHpvb20gbGV2ZWwgdG8gYWxsb3cgd2hlbiB0aGUgbWFwIHZpZXcgdHJhbnNpdGlvbnMgdG8gdGhlIHNwZWNpZmllZCBib3VuZHMuXG4gICAgICogQHBhcmFtIGV2ZW50RGF0YSBBZGRpdGlvbmFsIHByb3BlcnRpZXMgdG8gYmUgYWRkZWQgdG8gZXZlbnQgb2JqZWN0cyBvZiBldmVudHMgdHJpZ2dlcmVkIGJ5IHRoaXMgbWV0aG9kLlxuICAgICAqIEBmaXJlcyBtb3Zlc3RhcnRcbiAgICAgKiBAZmlyZXMgbW92ZWVuZFxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxuXHQgKiBAZXhhbXBsZVxuICAgICAqIHZhciBwMCA9IFsyMjAsIDQwMF07XG4gICAgICogdmFyIHAxID0gWzUwMCwgOTAwXTtcbiAgICAgKiBtYXAuZml0U2NyZWVuQ29vcmRpbmF0ZXMocDAsIHAxLCBtYXAuZ2V0QmVhcmluZygpLCB7XG4gICAgICogICBwYWRkaW5nOiB7dG9wOiAxMCwgYm90dG9tOjI1LCBsZWZ0OiAxNSwgcmlnaHQ6IDV9XG4gICAgICogfSk7XG4gICAgICogQHNlZSBbVXNlZCBieSBCb3hab29tSGFuZGxlcl0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvYXBpLyNib3h6b29taGFuZGxlcilcbiAgICAgKi9cbiAgICBmaXRTY3JlZW5Db29yZGluYXRlcyhwMDogUG9pbnRMaWtlLCBwMTogUG9pbnRMaWtlLCBiZWFyaW5nOiBudW1iZXIsIG9wdGlvbnM/OiBBbmltYXRpb25PcHRpb25zICYgQ2FtZXJhT3B0aW9ucywgZXZlbnREYXRhPzogT2JqZWN0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9maXRJbnRlcm5hbChcbiAgICAgICAgICAgIHRoaXMuX2NhbWVyYUZvckJveEFuZEJlYXJpbmcoXG4gICAgICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm0ucG9pbnRMb2NhdGlvbihQb2ludC5jb252ZXJ0KHAwKSksXG4gICAgICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm0ucG9pbnRMb2NhdGlvbihQb2ludC5jb252ZXJ0KHAxKSksXG4gICAgICAgICAgICAgICAgYmVhcmluZyxcbiAgICAgICAgICAgICAgICBvcHRpb25zKSxcbiAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgICBldmVudERhdGEpO1xuICAgIH1cblxuICAgIF9maXRJbnRlcm5hbChjYWxjdWxhdGVkT3B0aW9ucz86IENhbWVyYU9wdGlvbnMgJiBBbmltYXRpb25PcHRpb25zLCBvcHRpb25zPzogQW5pbWF0aW9uT3B0aW9ucyAmIENhbWVyYU9wdGlvbnMsIGV2ZW50RGF0YT86IE9iamVjdCkge1xuICAgICAgICAvLyBjYW1lcmFGb3JCb3VuZHMgd2FybnMgKyByZXR1cm5zIHVuZGVmaW5lZCBpZiB1bmFibGUgdG8gZml0OlxuICAgICAgICBpZiAoIWNhbGN1bGF0ZWRPcHRpb25zKSByZXR1cm4gdGhpcztcblxuICAgICAgICBvcHRpb25zID0gZXh0ZW5kKGNhbGN1bGF0ZWRPcHRpb25zLCBvcHRpb25zKTtcblxuICAgICAgICByZXR1cm4gb3B0aW9ucy5saW5lYXIgP1xuICAgICAgICAgICAgdGhpcy5lYXNlVG8ob3B0aW9ucywgZXZlbnREYXRhKSA6XG4gICAgICAgICAgICB0aGlzLmZseVRvKG9wdGlvbnMsIGV2ZW50RGF0YSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hhbmdlcyBhbnkgY29tYmluYXRpb24gb2YgY2VudGVyLCB6b29tLCBiZWFyaW5nLCBhbmQgcGl0Y2gsIHdpdGhvdXRcbiAgICAgKiBhbiBhbmltYXRlZCB0cmFuc2l0aW9uLiBUaGUgbWFwIHdpbGwgcmV0YWluIGl0cyBjdXJyZW50IHZhbHVlcyBmb3IgYW55XG4gICAgICogZGV0YWlscyBub3Qgc3BlY2lmaWVkIGluIGBvcHRpb25zYC5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBNYXAjXG4gICAgICogQHBhcmFtIG9wdGlvbnNcbiAgICAgKiBAcGFyYW0gZXZlbnREYXRhIEFkZGl0aW9uYWwgcHJvcGVydGllcyB0byBiZSBhZGRlZCB0byBldmVudCBvYmplY3RzIG9mIGV2ZW50cyB0cmlnZ2VyZWQgYnkgdGhpcyBtZXRob2QuXG4gICAgICogQGZpcmVzIG1vdmVzdGFydFxuICAgICAqIEBmaXJlcyB6b29tc3RhcnRcbiAgICAgKiBAZmlyZXMgcGl0Y2hzdGFydFxuICAgICAqIEBmaXJlcyByb3RhdGVcbiAgICAgKiBAZmlyZXMgbW92ZVxuICAgICAqIEBmaXJlcyB6b29tXG4gICAgICogQGZpcmVzIHBpdGNoXG4gICAgICogQGZpcmVzIG1vdmVlbmRcbiAgICAgKiBAZmlyZXMgem9vbWVuZFxuICAgICAqIEBmaXJlcyBwaXRjaGVuZFxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxuICAgICAqL1xuICAgIGp1bXBUbyhvcHRpb25zOiBDYW1lcmFPcHRpb25zLCBldmVudERhdGE/OiBPYmplY3QpIHtcbiAgICAgICAgdGhpcy5zdG9wKCk7XG5cbiAgICAgICAgY29uc3QgdHIgPSB0aGlzLnRyYW5zZm9ybTtcbiAgICAgICAgbGV0IHpvb21DaGFuZ2VkID0gZmFsc2UsXG4gICAgICAgICAgICBiZWFyaW5nQ2hhbmdlZCA9IGZhbHNlLFxuICAgICAgICAgICAgcGl0Y2hDaGFuZ2VkID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKCd6b29tJyBpbiBvcHRpb25zICYmIHRyLnpvb20gIT09ICtvcHRpb25zLnpvb20pIHtcbiAgICAgICAgICAgIHpvb21DaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIHRyLnpvb20gPSArb3B0aW9ucy56b29tO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuY2VudGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRyLmNlbnRlciA9IExuZ0xhdC5jb252ZXJ0KG9wdGlvbnMuY2VudGVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgnYmVhcmluZycgaW4gb3B0aW9ucyAmJiB0ci5iZWFyaW5nICE9PSArb3B0aW9ucy5iZWFyaW5nKSB7XG4gICAgICAgICAgICBiZWFyaW5nQ2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgICB0ci5iZWFyaW5nID0gK29wdGlvbnMuYmVhcmluZztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgncGl0Y2gnIGluIG9wdGlvbnMgJiYgdHIucGl0Y2ggIT09ICtvcHRpb25zLnBpdGNoKSB7XG4gICAgICAgICAgICBwaXRjaENoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgdHIucGl0Y2ggPSArb3B0aW9ucy5waXRjaDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ21vdmVzdGFydCcsIGV2ZW50RGF0YSkpXG4gICAgICAgICAgICAuZmlyZShuZXcgRXZlbnQoJ21vdmUnLCBldmVudERhdGEpKTtcblxuICAgICAgICBpZiAoem9vbUNoYW5nZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ3pvb21zdGFydCcsIGV2ZW50RGF0YSkpXG4gICAgICAgICAgICAgICAgLmZpcmUobmV3IEV2ZW50KCd6b29tJywgZXZlbnREYXRhKSlcbiAgICAgICAgICAgICAgICAuZmlyZShuZXcgRXZlbnQoJ3pvb21lbmQnLCBldmVudERhdGEpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChiZWFyaW5nQ2hhbmdlZCkge1xuICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgncm90YXRlc3RhcnQnLCBldmVudERhdGEpKVxuICAgICAgICAgICAgICAgIC5maXJlKG5ldyBFdmVudCgncm90YXRlJywgZXZlbnREYXRhKSlcbiAgICAgICAgICAgICAgICAuZmlyZShuZXcgRXZlbnQoJ3JvdGF0ZWVuZCcsIGV2ZW50RGF0YSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBpdGNoQ2hhbmdlZCkge1xuICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgncGl0Y2hzdGFydCcsIGV2ZW50RGF0YSkpXG4gICAgICAgICAgICAgICAgLmZpcmUobmV3IEV2ZW50KCdwaXRjaCcsIGV2ZW50RGF0YSkpXG4gICAgICAgICAgICAgICAgLmZpcmUobmV3IEV2ZW50KCdwaXRjaGVuZCcsIGV2ZW50RGF0YSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZmlyZShuZXcgRXZlbnQoJ21vdmVlbmQnLCBldmVudERhdGEpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGFuZ2VzIGFueSBjb21iaW5hdGlvbiBvZiBjZW50ZXIsIHpvb20sIGJlYXJpbmcsIGFuZCBwaXRjaCwgd2l0aCBhbiBhbmltYXRlZCB0cmFuc2l0aW9uXG4gICAgICogYmV0d2VlbiBvbGQgYW5kIG5ldyB2YWx1ZXMuIFRoZSBtYXAgd2lsbCByZXRhaW4gaXRzIGN1cnJlbnQgdmFsdWVzIGZvciBhbnlcbiAgICAgKiBkZXRhaWxzIG5vdCBzcGVjaWZpZWQgaW4gYG9wdGlvbnNgLlxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIE1hcCNcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIGRlc2NyaWJpbmcgdGhlIGRlc3RpbmF0aW9uIGFuZCBhbmltYXRpb24gb2YgdGhlIHRyYW5zaXRpb24uXG4gICAgICogICAgICAgICAgICBBY2NlcHRzIHtAbGluayBDYW1lcmFPcHRpb25zfSBhbmQge0BsaW5rIEFuaW1hdGlvbk9wdGlvbnN9LlxuICAgICAqIEBwYXJhbSBldmVudERhdGEgQWRkaXRpb25hbCBwcm9wZXJ0aWVzIHRvIGJlIGFkZGVkIHRvIGV2ZW50IG9iamVjdHMgb2YgZXZlbnRzIHRyaWdnZXJlZCBieSB0aGlzIG1ldGhvZC5cbiAgICAgKiBAZmlyZXMgbW92ZXN0YXJ0XG4gICAgICogQGZpcmVzIHpvb21zdGFydFxuICAgICAqIEBmaXJlcyBwaXRjaHN0YXJ0XG4gICAgICogQGZpcmVzIHJvdGF0ZVxuICAgICAqIEBmaXJlcyBtb3ZlXG4gICAgICogQGZpcmVzIHpvb21cbiAgICAgKiBAZmlyZXMgcGl0Y2hcbiAgICAgKiBAZmlyZXMgbW92ZWVuZFxuICAgICAqIEBmaXJlcyB6b29tZW5kXG4gICAgICogQGZpcmVzIHBpdGNoZW5kXG4gICAgICogQHJldHVybnMge01hcH0gYHRoaXNgXG4gICAgICogQHNlZSBbTmF2aWdhdGUgdGhlIG1hcCB3aXRoIGdhbWUtbGlrZSBjb250cm9sc10oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9nYW1lLWNvbnRyb2xzLylcbiAgICAgKi9cbiAgICBlYXNlVG8ob3B0aW9uczogQ2FtZXJhT3B0aW9ucyAmIEFuaW1hdGlvbk9wdGlvbnMgJiB7ZGVsYXlFbmRFdmVudHM/OiBudW1iZXJ9LCBldmVudERhdGE/OiBPYmplY3QpIHtcbiAgICAgICAgdGhpcy5zdG9wKCk7XG5cbiAgICAgICAgb3B0aW9ucyA9IGV4dGVuZCh7XG4gICAgICAgICAgICBvZmZzZXQ6IFswLCAwXSxcbiAgICAgICAgICAgIGR1cmF0aW9uOiA1MDAsXG4gICAgICAgICAgICBlYXNpbmc6IGRlZmF1bHRFYXNpbmdcbiAgICAgICAgfSwgb3B0aW9ucyk7XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuYW5pbWF0ZSA9PT0gZmFsc2UpIG9wdGlvbnMuZHVyYXRpb24gPSAwO1xuXG4gICAgICAgIGNvbnN0IHRyID0gdGhpcy50cmFuc2Zvcm0sXG4gICAgICAgICAgICBzdGFydFpvb20gPSB0aGlzLmdldFpvb20oKSxcbiAgICAgICAgICAgIHN0YXJ0QmVhcmluZyA9IHRoaXMuZ2V0QmVhcmluZygpLFxuICAgICAgICAgICAgc3RhcnRQaXRjaCA9IHRoaXMuZ2V0UGl0Y2goKSxcblxuICAgICAgICAgICAgem9vbSA9ICd6b29tJyBpbiBvcHRpb25zID8gK29wdGlvbnMuem9vbSA6IHN0YXJ0Wm9vbSxcbiAgICAgICAgICAgIGJlYXJpbmcgPSAnYmVhcmluZycgaW4gb3B0aW9ucyA/IHRoaXMuX25vcm1hbGl6ZUJlYXJpbmcob3B0aW9ucy5iZWFyaW5nLCBzdGFydEJlYXJpbmcpIDogc3RhcnRCZWFyaW5nLFxuICAgICAgICAgICAgcGl0Y2ggPSAncGl0Y2gnIGluIG9wdGlvbnMgPyArb3B0aW9ucy5waXRjaCA6IHN0YXJ0UGl0Y2g7XG5cbiAgICAgICAgY29uc3QgcG9pbnRBdE9mZnNldCA9IHRyLmNlbnRlclBvaW50LmFkZChQb2ludC5jb252ZXJ0KG9wdGlvbnMub2Zmc2V0KSk7XG4gICAgICAgIGNvbnN0IGxvY2F0aW9uQXRPZmZzZXQgPSB0ci5wb2ludExvY2F0aW9uKHBvaW50QXRPZmZzZXQpO1xuICAgICAgICBjb25zdCBjZW50ZXIgPSBMbmdMYXQuY29udmVydChvcHRpb25zLmNlbnRlciB8fCBsb2NhdGlvbkF0T2Zmc2V0KTtcbiAgICAgICAgdGhpcy5fbm9ybWFsaXplQ2VudGVyKGNlbnRlcik7XG5cbiAgICAgICAgY29uc3QgZnJvbSA9IHRyLnByb2plY3QobG9jYXRpb25BdE9mZnNldCk7XG4gICAgICAgIGNvbnN0IGRlbHRhID0gdHIucHJvamVjdChjZW50ZXIpLnN1Yihmcm9tKTtcbiAgICAgICAgY29uc3QgZmluYWxTY2FsZSA9IHRyLnpvb21TY2FsZSh6b29tIC0gc3RhcnRab29tKTtcblxuICAgICAgICBsZXQgYXJvdW5kLCBhcm91bmRQb2ludDtcblxuICAgICAgICBpZiAob3B0aW9ucy5hcm91bmQpIHtcbiAgICAgICAgICAgIGFyb3VuZCA9IExuZ0xhdC5jb252ZXJ0KG9wdGlvbnMuYXJvdW5kKTtcbiAgICAgICAgICAgIGFyb3VuZFBvaW50ID0gdHIubG9jYXRpb25Qb2ludChhcm91bmQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fem9vbWluZyA9ICh6b29tICE9PSBzdGFydFpvb20pO1xuICAgICAgICB0aGlzLl9yb3RhdGluZyA9IChzdGFydEJlYXJpbmcgIT09IGJlYXJpbmcpO1xuICAgICAgICB0aGlzLl9waXRjaGluZyA9IChwaXRjaCAhPT0gc3RhcnRQaXRjaCk7XG5cbiAgICAgICAgdGhpcy5fcHJlcGFyZUVhc2UoZXZlbnREYXRhLCBvcHRpb25zLm5vTW92ZVN0YXJ0KTtcblxuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fZWFzZUVuZFRpbWVvdXRJRCk7XG5cbiAgICAgICAgdGhpcy5fZWFzZSgoaykgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3pvb21pbmcpIHtcbiAgICAgICAgICAgICAgICB0ci56b29tID0gaW50ZXJwb2xhdGUoc3RhcnRab29tLCB6b29tLCBrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLl9yb3RhdGluZykge1xuICAgICAgICAgICAgICAgIHRyLmJlYXJpbmcgPSBpbnRlcnBvbGF0ZShzdGFydEJlYXJpbmcsIGJlYXJpbmcsIGspO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuX3BpdGNoaW5nKSB7XG4gICAgICAgICAgICAgICAgdHIucGl0Y2ggPSBpbnRlcnBvbGF0ZShzdGFydFBpdGNoLCBwaXRjaCwgayk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChhcm91bmQpIHtcbiAgICAgICAgICAgICAgICB0ci5zZXRMb2NhdGlvbkF0UG9pbnQoYXJvdW5kLCBhcm91bmRQb2ludCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNjYWxlID0gdHIuem9vbVNjYWxlKHRyLnpvb20gLSBzdGFydFpvb20pO1xuICAgICAgICAgICAgICAgIGNvbnN0IGJhc2UgPSB6b29tID4gc3RhcnRab29tID9cbiAgICAgICAgICAgICAgICAgICAgTWF0aC5taW4oMiwgZmluYWxTY2FsZSkgOlxuICAgICAgICAgICAgICAgICAgICBNYXRoLm1heCgwLjUsIGZpbmFsU2NhbGUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNwZWVkdXAgPSBNYXRoLnBvdyhiYXNlLCAxIC0gayk7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV3Q2VudGVyID0gdHIudW5wcm9qZWN0KGZyb20uYWRkKGRlbHRhLm11bHQoayAqIHNwZWVkdXApKS5tdWx0KHNjYWxlKSk7XG4gICAgICAgICAgICAgICAgdHIuc2V0TG9jYXRpb25BdFBvaW50KHRyLnJlbmRlcldvcmxkQ29waWVzID8gbmV3Q2VudGVyLndyYXAoKSA6IG5ld0NlbnRlciwgcG9pbnRBdE9mZnNldCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuX2ZpcmVNb3ZlRXZlbnRzKGV2ZW50RGF0YSk7XG5cbiAgICAgICAgfSwgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMuZGVsYXlFbmRFdmVudHMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9lYXNlRW5kVGltZW91dElEID0gc2V0VGltZW91dCgoKSA9PiB0aGlzLl9hZnRlckVhc2UoZXZlbnREYXRhKSwgb3B0aW9ucy5kZWxheUVuZEV2ZW50cyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX2FmdGVyRWFzZShldmVudERhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCBvcHRpb25zKTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBfcHJlcGFyZUVhc2UoZXZlbnREYXRhPzogT2JqZWN0LCBub01vdmVTdGFydDogYm9vbGVhbikge1xuICAgICAgICB0aGlzLl9tb3ZpbmcgPSB0cnVlO1xuXG4gICAgICAgIGlmICghbm9Nb3ZlU3RhcnQpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ21vdmVzdGFydCcsIGV2ZW50RGF0YSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl96b29taW5nKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEV2ZW50KCd6b29tc3RhcnQnLCBldmVudERhdGEpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fcm90YXRpbmcpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ3JvdGF0ZXN0YXJ0JywgZXZlbnREYXRhKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX3BpdGNoaW5nKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEV2ZW50KCdwaXRjaHN0YXJ0JywgZXZlbnREYXRhKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfZmlyZU1vdmVFdmVudHMoZXZlbnREYXRhPzogT2JqZWN0KSB7XG4gICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ21vdmUnLCBldmVudERhdGEpKTtcbiAgICAgICAgaWYgKHRoaXMuX3pvb21pbmcpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ3pvb20nLCBldmVudERhdGEpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fcm90YXRpbmcpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ3JvdGF0ZScsIGV2ZW50RGF0YSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9waXRjaGluZykge1xuICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgncGl0Y2gnLCBldmVudERhdGEpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9hZnRlckVhc2UoZXZlbnREYXRhPzogT2JqZWN0KSB7XG4gICAgICAgIGNvbnN0IHdhc1pvb21pbmcgPSB0aGlzLl96b29taW5nO1xuICAgICAgICBjb25zdCB3YXNSb3RhdGluZyA9IHRoaXMuX3JvdGF0aW5nO1xuICAgICAgICBjb25zdCB3YXNQaXRjaGluZyA9IHRoaXMuX3BpdGNoaW5nO1xuICAgICAgICB0aGlzLl9tb3ZpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fem9vbWluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9yb3RhdGluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9waXRjaGluZyA9IGZhbHNlO1xuXG4gICAgICAgIGlmICh3YXNab29taW5nKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEV2ZW50KCd6b29tZW5kJywgZXZlbnREYXRhKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHdhc1JvdGF0aW5nKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEV2ZW50KCdyb3RhdGVlbmQnLCBldmVudERhdGEpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAod2FzUGl0Y2hpbmcpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ3BpdGNoZW5kJywgZXZlbnREYXRhKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgnbW92ZWVuZCcsIGV2ZW50RGF0YSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoYW5nZXMgYW55IGNvbWJpbmF0aW9uIG9mIGNlbnRlciwgem9vbSwgYmVhcmluZywgYW5kIHBpdGNoLCBhbmltYXRpbmcgdGhlIHRyYW5zaXRpb24gYWxvbmcgYSBjdXJ2ZSB0aGF0XG4gICAgICogZXZva2VzIGZsaWdodC4gVGhlIGFuaW1hdGlvbiBzZWFtbGVzc2x5IGluY29ycG9yYXRlcyB6b29taW5nIGFuZCBwYW5uaW5nIHRvIGhlbHBcbiAgICAgKiB0aGUgdXNlciBtYWludGFpbiBoZXIgYmVhcmluZ3MgZXZlbiBhZnRlciB0cmF2ZXJzaW5nIGEgZ3JlYXQgZGlzdGFuY2UuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgTWFwI1xuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIE9wdGlvbnMgZGVzY3JpYmluZyB0aGUgZGVzdGluYXRpb24gYW5kIGFuaW1hdGlvbiBvZiB0aGUgdHJhbnNpdGlvbi5cbiAgICAgKiAgICAgQWNjZXB0cyB7QGxpbmsgQ2FtZXJhT3B0aW9uc30sIHtAbGluayBBbmltYXRpb25PcHRpb25zfSxcbiAgICAgKiAgICAgYW5kIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBvcHRpb25zLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5jdXJ2ZT0xLjQyXSBUaGUgem9vbWluZyBcImN1cnZlXCIgdGhhdCB3aWxsIG9jY3VyIGFsb25nIHRoZVxuICAgICAqICAgICBmbGlnaHQgcGF0aC4gQSBoaWdoIHZhbHVlIG1heGltaXplcyB6b29taW5nIGZvciBhbiBleGFnZ2VyYXRlZCBhbmltYXRpb24sIHdoaWxlIGEgbG93XG4gICAgICogICAgIHZhbHVlIG1pbmltaXplcyB6b29taW5nIGZvciBhbiBlZmZlY3QgY2xvc2VyIHRvIHtAbGluayBNYXAjZWFzZVRvfS4gMS40MiBpcyB0aGUgYXZlcmFnZVxuICAgICAqICAgICB2YWx1ZSBzZWxlY3RlZCBieSBwYXJ0aWNpcGFudHMgaW4gdGhlIHVzZXIgc3R1ZHkgZGlzY3Vzc2VkIGluXG4gICAgICogICAgIFt2YW4gV2lqayAoMjAwMyldKGh0dHBzOi8vd3d3Lndpbi50dWUubmwvfnZhbndpamsvem9vbXBhbi5wZGYpLiBBIHZhbHVlIG9mXG4gICAgICogICAgIGBNYXRoLnBvdyg2LCAwLjI1KWAgd291bGQgYmUgZXF1aXZhbGVudCB0byB0aGUgcm9vdCBtZWFuIHNxdWFyZWQgYXZlcmFnZSB2ZWxvY2l0eS4gQVxuICAgICAqICAgICB2YWx1ZSBvZiAxIHdvdWxkIHByb2R1Y2UgYSBjaXJjdWxhciBtb3Rpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLm1pblpvb21dIFRoZSB6ZXJvLWJhc2VkIHpvb20gbGV2ZWwgYXQgdGhlIHBlYWsgb2YgdGhlIGZsaWdodCBwYXRoLiBJZlxuICAgICAqICAgICBgb3B0aW9ucy5jdXJ2ZWAgaXMgc3BlY2lmaWVkLCB0aGlzIG9wdGlvbiBpcyBpZ25vcmVkLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5zcGVlZD0xLjJdIFRoZSBhdmVyYWdlIHNwZWVkIG9mIHRoZSBhbmltYXRpb24gZGVmaW5lZCBpbiByZWxhdGlvbiB0b1xuICAgICAqICAgICBgb3B0aW9ucy5jdXJ2ZWAuIEEgc3BlZWQgb2YgMS4yIG1lYW5zIHRoYXQgdGhlIG1hcCBhcHBlYXJzIHRvIG1vdmUgYWxvbmcgdGhlIGZsaWdodCBwYXRoXG4gICAgICogICAgIGJ5IDEuMiB0aW1lcyBgb3B0aW9ucy5jdXJ2ZWAgc2NyZWVuZnVscyBldmVyeSBzZWNvbmQuIEEgX3NjcmVlbmZ1bF8gaXMgdGhlIG1hcCdzIHZpc2libGUgc3Bhbi5cbiAgICAgKiAgICAgSXQgZG9lcyBub3QgY29ycmVzcG9uZCB0byBhIGZpeGVkIHBoeXNpY2FsIGRpc3RhbmNlLCBidXQgdmFyaWVzIGJ5IHpvb20gbGV2ZWwuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLnNjcmVlblNwZWVkXSBUaGUgYXZlcmFnZSBzcGVlZCBvZiB0aGUgYW5pbWF0aW9uIG1lYXN1cmVkIGluIHNjcmVlbmZ1bHNcbiAgICAgKiAgICAgcGVyIHNlY29uZCwgYXNzdW1pbmcgYSBsaW5lYXIgdGltaW5nIGN1cnZlLiBJZiBgb3B0aW9ucy5zcGVlZGAgaXMgc3BlY2lmaWVkLCB0aGlzIG9wdGlvbiBpcyBpZ25vcmVkLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5tYXhEdXJhdGlvbl0gVGhlIGFuaW1hdGlvbidzIG1heGltdW0gZHVyYXRpb24sIG1lYXN1cmVkIGluIG1pbGxpc2Vjb25kcy5cbiAgICAgKiAgICAgSWYgZHVyYXRpb24gZXhjZWVkcyBtYXhpbXVtIGR1cmF0aW9uLCBpdCByZXNldHMgdG8gMC5cbiAgICAgKiBAcGFyYW0gZXZlbnREYXRhIEFkZGl0aW9uYWwgcHJvcGVydGllcyB0byBiZSBhZGRlZCB0byBldmVudCBvYmplY3RzIG9mIGV2ZW50cyB0cmlnZ2VyZWQgYnkgdGhpcyBtZXRob2QuXG4gICAgICogQGZpcmVzIG1vdmVzdGFydFxuICAgICAqIEBmaXJlcyB6b29tc3RhcnRcbiAgICAgKiBAZmlyZXMgcGl0Y2hzdGFydFxuICAgICAqIEBmaXJlcyBtb3ZlXG4gICAgICogQGZpcmVzIHpvb21cbiAgICAgKiBAZmlyZXMgcm90YXRlXG4gICAgICogQGZpcmVzIHBpdGNoXG4gICAgICogQGZpcmVzIG1vdmVlbmRcbiAgICAgKiBAZmlyZXMgem9vbWVuZFxuICAgICAqIEBmaXJlcyBwaXRjaGVuZFxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gZmx5IHdpdGggZGVmYXVsdCBvcHRpb25zIHRvIG51bGwgaXNsYW5kXG4gICAgICogbWFwLmZseVRvKHtjZW50ZXI6IFswLCAwXSwgem9vbTogOX0pO1xuICAgICAqIC8vIHVzaW5nIGZseVRvIG9wdGlvbnNcbiAgICAgKiBtYXAuZmx5VG8oe1xuICAgICAqICAgY2VudGVyOiBbMCwgMF0sXG4gICAgICogICB6b29tOiA5LFxuICAgICAqICAgc3BlZWQ6IDAuMixcbiAgICAgKiAgIGN1cnZlOiAxLFxuICAgICAqICAgZWFzaW5nKHQpIHtcbiAgICAgKiAgICAgcmV0dXJuIHQ7XG4gICAgICogICB9XG4gICAgICogfSk7XG4gICAgICogQHNlZSBbRmx5IHRvIGEgbG9jYXRpb25dKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvZmx5dG8vKVxuICAgICAqIEBzZWUgW1Nsb3dseSBmbHkgdG8gYSBsb2NhdGlvbl0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9mbHl0by1vcHRpb25zLylcbiAgICAgKiBAc2VlIFtGbHkgdG8gYSBsb2NhdGlvbiBiYXNlZCBvbiBzY3JvbGwgcG9zaXRpb25dKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvc2Nyb2xsLWZseS10by8pXG4gICAgICovXG4gICAgZmx5VG8ob3B0aW9uczogT2JqZWN0LCBldmVudERhdGE/OiBPYmplY3QpIHtcbiAgICAgICAgLy8gVGhpcyBtZXRob2QgaW1wbGVtZW50cyBhbiDDosKAwpxvcHRpbWFsIHBhdGjDosKAwp0gYW5pbWF0aW9uLCBhcyBkZXRhaWxlZCBpbjpcbiAgICAgICAgLy9cbiAgICAgICAgLy8gVmFuIFdpamssIEphcmtlIEouOyBOdWlqLCBXaW0gQS4gQS4gw6LCgMKcU21vb3RoIGFuZCBlZmZpY2llbnQgem9vbWluZyBhbmQgcGFubmluZy7DosKAwp0gSU5GT1ZJU1xuICAgICAgICAvLyAgIMOiwoDCmTAzLiBwcC4gMTXDosKAwpMyMi4gPGh0dHBzOi8vd3d3Lndpbi50dWUubmwvfnZhbndpamsvem9vbXBhbi5wZGYjcGFnZT01Pi5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gV2hlcmUgYXBwbGljYWJsZSwgbG9jYWwgdmFyaWFibGUgZG9jdW1lbnRhdGlvbiBiZWdpbnMgd2l0aCB0aGUgYXNzb2NpYXRlZCB2YXJpYWJsZSBvclxuICAgICAgICAvLyBmdW5jdGlvbiBpbiB2YW4gV2lqayAoMjAwMykuXG5cbiAgICAgICAgdGhpcy5zdG9wKCk7XG5cbiAgICAgICAgb3B0aW9ucyA9IGV4dGVuZCh7XG4gICAgICAgICAgICBvZmZzZXQ6IFswLCAwXSxcbiAgICAgICAgICAgIHNwZWVkOiAxLjIsXG4gICAgICAgICAgICBjdXJ2ZTogMS40MixcbiAgICAgICAgICAgIGVhc2luZzogZGVmYXVsdEVhc2luZ1xuICAgICAgICB9LCBvcHRpb25zKTtcblxuICAgICAgICBjb25zdCB0ciA9IHRoaXMudHJhbnNmb3JtLFxuICAgICAgICAgICAgc3RhcnRab29tID0gdGhpcy5nZXRab29tKCksXG4gICAgICAgICAgICBzdGFydEJlYXJpbmcgPSB0aGlzLmdldEJlYXJpbmcoKSxcbiAgICAgICAgICAgIHN0YXJ0UGl0Y2ggPSB0aGlzLmdldFBpdGNoKCk7XG5cbiAgICAgICAgY29uc3Qgem9vbSA9ICd6b29tJyBpbiBvcHRpb25zID8gY2xhbXAoK29wdGlvbnMuem9vbSwgdHIubWluWm9vbSwgdHIubWF4Wm9vbSkgOiBzdGFydFpvb207XG4gICAgICAgIGNvbnN0IGJlYXJpbmcgPSAnYmVhcmluZycgaW4gb3B0aW9ucyA/IHRoaXMuX25vcm1hbGl6ZUJlYXJpbmcob3B0aW9ucy5iZWFyaW5nLCBzdGFydEJlYXJpbmcpIDogc3RhcnRCZWFyaW5nO1xuICAgICAgICBjb25zdCBwaXRjaCA9ICdwaXRjaCcgaW4gb3B0aW9ucyA/ICtvcHRpb25zLnBpdGNoIDogc3RhcnRQaXRjaDtcblxuICAgICAgICBjb25zdCBzY2FsZSA9IHRyLnpvb21TY2FsZSh6b29tIC0gc3RhcnRab29tKTtcbiAgICAgICAgY29uc3QgcG9pbnRBdE9mZnNldCA9IHRyLmNlbnRlclBvaW50LmFkZChQb2ludC5jb252ZXJ0KG9wdGlvbnMub2Zmc2V0KSk7XG4gICAgICAgIGNvbnN0IGxvY2F0aW9uQXRPZmZzZXQgPSB0ci5wb2ludExvY2F0aW9uKHBvaW50QXRPZmZzZXQpO1xuICAgICAgICBjb25zdCBjZW50ZXIgPSBMbmdMYXQuY29udmVydChvcHRpb25zLmNlbnRlciB8fCBsb2NhdGlvbkF0T2Zmc2V0KTtcbiAgICAgICAgdGhpcy5fbm9ybWFsaXplQ2VudGVyKGNlbnRlcik7XG5cbiAgICAgICAgY29uc3QgZnJvbSA9IHRyLnByb2plY3QobG9jYXRpb25BdE9mZnNldCk7XG4gICAgICAgIGNvbnN0IGRlbHRhID0gdHIucHJvamVjdChjZW50ZXIpLnN1Yihmcm9tKTtcblxuICAgICAgICBsZXQgcmhvID0gb3B0aW9ucy5jdXJ2ZTtcblxuICAgICAgICAvLyB3w6LCgsKAOiBJbml0aWFsIHZpc2libGUgc3BhbiwgbWVhc3VyZWQgaW4gcGl4ZWxzIGF0IHRoZSBpbml0aWFsIHNjYWxlLlxuICAgICAgICBjb25zdCB3MCA9IE1hdGgubWF4KHRyLndpZHRoLCB0ci5oZWlnaHQpLFxuICAgICAgICAgICAgLy8gd8OiwoLCgTogRmluYWwgdmlzaWJsZSBzcGFuLCBtZWFzdXJlZCBpbiBwaXhlbHMgd2l0aCByZXNwZWN0IHRvIHRoZSBpbml0aWFsIHNjYWxlLlxuICAgICAgICAgICAgdzEgPSB3MCAvIHNjYWxlLFxuICAgICAgICAgICAgLy8gTGVuZ3RoIG9mIHRoZSBmbGlnaHQgcGF0aCBhcyBwcm9qZWN0ZWQgb250byB0aGUgZ3JvdW5kIHBsYW5lLCBtZWFzdXJlZCBpbiBwaXhlbHMgZnJvbVxuICAgICAgICAgICAgLy8gdGhlIHdvcmxkIGltYWdlIG9yaWdpbiBhdCB0aGUgaW5pdGlhbCBzY2FsZS5cbiAgICAgICAgICAgIHUxID0gZGVsdGEubWFnKCk7XG5cbiAgICAgICAgaWYgKCdtaW5ab29tJyBpbiBvcHRpb25zKSB7XG4gICAgICAgICAgICBjb25zdCBtaW5ab29tID0gY2xhbXAoTWF0aC5taW4ob3B0aW9ucy5taW5ab29tLCBzdGFydFpvb20sIHpvb20pLCB0ci5taW5ab29tLCB0ci5tYXhab29tKTtcbiAgICAgICAgICAgIC8vIHc8c3ViPm08L3N1Yj46IE1heGltdW0gdmlzaWJsZSBzcGFuLCBtZWFzdXJlZCBpbiBwaXhlbHMgd2l0aCByZXNwZWN0IHRvIHRoZSBpbml0aWFsXG4gICAgICAgICAgICAvLyBzY2FsZS5cbiAgICAgICAgICAgIGNvbnN0IHdNYXggPSB3MCAvIHRyLnpvb21TY2FsZShtaW5ab29tIC0gc3RhcnRab29tKTtcbiAgICAgICAgICAgIHJobyA9IE1hdGguc3FydCh3TWF4IC8gdTEgKiAyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIMOPwoHDgsKyXG4gICAgICAgIGNvbnN0IHJobzIgPSByaG8gKiByaG87XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIHLDocK1wqI6IFJldHVybnMgdGhlIHpvb20tb3V0IGZhY3RvciBhdCBvbmUgZW5kIG9mIHRoZSBhbmltYXRpb24uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBpIDAgZm9yIHRoZSBhc2NlbnQgb3IgMSBmb3IgdGhlIGRlc2NlbnQuXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiByKGkpIHtcbiAgICAgICAgICAgIGNvbnN0IGIgPSAodzEgKiB3MSAtIHcwICogdzAgKyAoaSA/IC0xIDogMSkgKiByaG8yICogcmhvMiAqIHUxICogdTEpIC8gKDIgKiAoaSA/IHcxIDogdzApICogcmhvMiAqIHUxKTtcbiAgICAgICAgICAgIHJldHVybiBNYXRoLmxvZyhNYXRoLnNxcnQoYiAqIGIgKyAxKSAtIGIpO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gc2luaChuKSB7IHJldHVybiAoTWF0aC5leHAobikgLSBNYXRoLmV4cCgtbikpIC8gMjsgfVxuICAgICAgICBmdW5jdGlvbiBjb3NoKG4pIHsgcmV0dXJuIChNYXRoLmV4cChuKSArIE1hdGguZXhwKC1uKSkgLyAyOyB9XG4gICAgICAgIGZ1bmN0aW9uIHRhbmgobikgeyByZXR1cm4gc2luaChuKSAvIGNvc2gobik7IH1cblxuICAgICAgICAvLyByw6LCgsKAOiBab29tLW91dCBmYWN0b3IgZHVyaW5nIGFzY2VudC5cbiAgICAgICAgY29uc3QgcjAgPSByKDApO1xuXG4gICAgICAgIC8vIHcocyk6IFJldHVybnMgdGhlIHZpc2libGUgc3BhbiBvbiB0aGUgZ3JvdW5kLCBtZWFzdXJlZCBpbiBwaXhlbHMgd2l0aCByZXNwZWN0IHRvIHRoZVxuICAgICAgICAvLyBpbml0aWFsIHNjYWxlLiBBc3N1bWVzIGFuIGFuZ3VsYXIgZmllbGQgb2YgdmlldyBvZiAyIGFyY3RhbiDDgsK9IMOiwonCiCA1M8OCwrAuXG4gICAgICAgIGxldCB3OiAobnVtYmVyKSA9PiBudW1iZXIgPSBmdW5jdGlvbiAocykge1xuICAgICAgICAgICAgcmV0dXJuIChjb3NoKHIwKSAvIGNvc2gocjAgKyByaG8gKiBzKSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gdShzKTogUmV0dXJucyB0aGUgZGlzdGFuY2UgYWxvbmcgdGhlIGZsaWdodCBwYXRoIGFzIHByb2plY3RlZCBvbnRvIHRoZSBncm91bmQgcGxhbmUsXG4gICAgICAgIC8vIG1lYXN1cmVkIGluIHBpeGVscyBmcm9tIHRoZSB3b3JsZCBpbWFnZSBvcmlnaW4gYXQgdGhlIGluaXRpYWwgc2NhbGUuXG4gICAgICAgIGxldCB1OiAobnVtYmVyKSA9PiBudW1iZXIgPSBmdW5jdGlvbiAocykge1xuICAgICAgICAgICAgcmV0dXJuIHcwICogKChjb3NoKHIwKSAqIHRhbmgocjAgKyByaG8gKiBzKSAtIHNpbmgocjApKSAvIHJobzIpIC8gdTE7XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gUzogVG90YWwgbGVuZ3RoIG9mIHRoZSBmbGlnaHQgcGF0aCwgbWVhc3VyZWQgaW4gw4/CgS1zY3JlZW5mdWxzLlxuICAgICAgICBsZXQgUyA9IChyKDEpIC0gcjApIC8gcmhvO1xuXG4gICAgICAgIC8vIFdoZW4gdcOiwoLCgCA9IHXDosKCwoEsIHRoZSBvcHRpbWFsIHBhdGggZG9lc27DosKAwpl0IHJlcXVpcmUgYm90aCBhc2NlbnQgYW5kIGRlc2NlbnQuXG4gICAgICAgIGlmIChNYXRoLmFicyh1MSkgPCAwLjAwMDAwMSB8fCAhaXNGaW5pdGUoUykpIHtcbiAgICAgICAgICAgIC8vIFBlcmZvcm0gYSBtb3JlIG9yIGxlc3MgaW5zdGFudGFuZW91cyB0cmFuc2l0aW9uIGlmIHRoZSBwYXRoIGlzIHRvbyBzaG9ydC5cbiAgICAgICAgICAgIGlmIChNYXRoLmFicyh3MCAtIHcxKSA8IDAuMDAwMDAxKSByZXR1cm4gdGhpcy5lYXNlVG8ob3B0aW9ucywgZXZlbnREYXRhKTtcblxuICAgICAgICAgICAgY29uc3QgayA9IHcxIDwgdzAgPyAtMSA6IDE7XG4gICAgICAgICAgICBTID0gTWF0aC5hYnMoTWF0aC5sb2codzEgLyB3MCkpIC8gcmhvO1xuXG4gICAgICAgICAgICB1ID0gZnVuY3Rpb24oKSB7IHJldHVybiAwOyB9O1xuICAgICAgICAgICAgdyA9IGZ1bmN0aW9uKHMpIHsgcmV0dXJuIE1hdGguZXhwKGsgKiByaG8gKiBzKTsgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgnZHVyYXRpb24nIGluIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIG9wdGlvbnMuZHVyYXRpb24gPSArb3B0aW9ucy5kdXJhdGlvbjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IFYgPSAnc2NyZWVuU3BlZWQnIGluIG9wdGlvbnMgPyArb3B0aW9ucy5zY3JlZW5TcGVlZCAvIHJobyA6ICtvcHRpb25zLnNwZWVkO1xuICAgICAgICAgICAgb3B0aW9ucy5kdXJhdGlvbiA9IDEwMDAgKiBTIC8gVjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zLm1heER1cmF0aW9uICYmIG9wdGlvbnMuZHVyYXRpb24gPiBvcHRpb25zLm1heER1cmF0aW9uKSB7XG4gICAgICAgICAgICBvcHRpb25zLmR1cmF0aW9uID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3pvb21pbmcgPSB0cnVlO1xuICAgICAgICB0aGlzLl9yb3RhdGluZyA9IChzdGFydEJlYXJpbmcgIT09IGJlYXJpbmcpO1xuICAgICAgICB0aGlzLl9waXRjaGluZyA9IChwaXRjaCAhPT0gc3RhcnRQaXRjaCk7XG5cbiAgICAgICAgdGhpcy5fcHJlcGFyZUVhc2UoZXZlbnREYXRhLCBmYWxzZSk7XG5cbiAgICAgICAgdGhpcy5fZWFzZSgoaykgPT4ge1xuICAgICAgICAgICAgLy8gczogVGhlIGRpc3RhbmNlIHRyYXZlbGVkIGFsb25nIHRoZSBmbGlnaHQgcGF0aCwgbWVhc3VyZWQgaW4gw4/CgS1zY3JlZW5mdWxzLlxuICAgICAgICAgICAgY29uc3QgcyA9IGsgKiBTO1xuICAgICAgICAgICAgY29uc3Qgc2NhbGUgPSAxIC8gdyhzKTtcbiAgICAgICAgICAgIHRyLnpvb20gPSBrID09PSAxID8gem9vbSA6IHN0YXJ0Wm9vbSArIHRyLnNjYWxlWm9vbShzY2FsZSk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLl9yb3RhdGluZykge1xuICAgICAgICAgICAgICAgIHRyLmJlYXJpbmcgPSBpbnRlcnBvbGF0ZShzdGFydEJlYXJpbmcsIGJlYXJpbmcsIGspO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuX3BpdGNoaW5nKSB7XG4gICAgICAgICAgICAgICAgdHIucGl0Y2ggPSBpbnRlcnBvbGF0ZShzdGFydFBpdGNoLCBwaXRjaCwgayk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IG5ld0NlbnRlciA9IGsgPT09IDEgPyBjZW50ZXIgOiB0ci51bnByb2plY3QoZnJvbS5hZGQoZGVsdGEubXVsdCh1KHMpKSkubXVsdChzY2FsZSkpO1xuICAgICAgICAgICAgdHIuc2V0TG9jYXRpb25BdFBvaW50KHRyLnJlbmRlcldvcmxkQ29waWVzID8gbmV3Q2VudGVyLndyYXAoKSA6IG5ld0NlbnRlciwgcG9pbnRBdE9mZnNldCk7XG5cbiAgICAgICAgICAgIHRoaXMuX2ZpcmVNb3ZlRXZlbnRzKGV2ZW50RGF0YSk7XG5cbiAgICAgICAgfSwgKCkgPT4gdGhpcy5fYWZ0ZXJFYXNlKGV2ZW50RGF0YSksIG9wdGlvbnMpO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGlzRWFzaW5nKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLl9lYXNlRnJhbWVJZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTdG9wcyBhbnkgYW5pbWF0ZWQgdHJhbnNpdGlvbiB1bmRlcndheS5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBNYXAjXG4gICAgICogQHJldHVybnMge01hcH0gYHRoaXNgXG4gICAgICovXG4gICAgc3RvcCgpOiB0aGlzIHtcbiAgICAgICAgaWYgKHRoaXMuX2Vhc2VGcmFtZUlkKSB7XG4gICAgICAgICAgICB0aGlzLl9jYW5jZWxSZW5kZXJGcmFtZSh0aGlzLl9lYXNlRnJhbWVJZCk7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5fZWFzZUZyYW1lSWQ7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5fb25FYXNlRnJhbWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fb25FYXNlRW5kKSB7XG4gICAgICAgICAgICAvLyBUaGUgX29uRWFzZUVuZCBmdW5jdGlvbiBtaWdodCBlbWl0IGV2ZW50cyB3aGljaCB0cmlnZ2VyIG5ld1xuICAgICAgICAgICAgLy8gYW5pbWF0aW9uLCB3aGljaCBzZXRzIGEgbmV3IF9vbkVhc2VFbmQuIEVuc3VyZSB3ZSBkb24ndCBkZWxldGVcbiAgICAgICAgICAgIC8vIGl0IHVuaW50ZW50aW9uYWxseS5cbiAgICAgICAgICAgIGNvbnN0IG9uRWFzZUVuZCA9IHRoaXMuX29uRWFzZUVuZDtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9vbkVhc2VFbmQ7XG4gICAgICAgICAgICBvbkVhc2VFbmQuY2FsbCh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBfZWFzZShmcmFtZTogKG51bWJlcikgPT4gdm9pZCxcbiAgICAgICAgICBmaW5pc2g6ICgpID0+IHZvaWQsXG4gICAgICAgICAgb3B0aW9uczoge2FuaW1hdGU6IGJvb2xlYW4sIGR1cmF0aW9uOiBudW1iZXIsIGVhc2luZzogKG51bWJlcikgPT4gbnVtYmVyfSkge1xuICAgICAgICBpZiAob3B0aW9ucy5hbmltYXRlID09PSBmYWxzZSB8fCBvcHRpb25zLmR1cmF0aW9uID09PSAwKSB7XG4gICAgICAgICAgICBmcmFtZSgxKTtcbiAgICAgICAgICAgIGZpbmlzaCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fZWFzZVN0YXJ0ID0gYnJvd3Nlci5ub3coKTtcbiAgICAgICAgICAgIHRoaXMuX2Vhc2VPcHRpb25zID0gb3B0aW9ucztcbiAgICAgICAgICAgIHRoaXMuX29uRWFzZUZyYW1lID0gZnJhbWU7XG4gICAgICAgICAgICB0aGlzLl9vbkVhc2VFbmQgPSBmaW5pc2g7XG4gICAgICAgICAgICB0aGlzLl9lYXNlRnJhbWVJZCA9IHRoaXMuX3JlcXVlc3RSZW5kZXJGcmFtZSh0aGlzLl9yZW5kZXJGcmFtZUNhbGxiYWNrKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIENhbGxiYWNrIGZvciBtYXAuX3JlcXVlc3RSZW5kZXJGcmFtZVxuICAgIF9yZW5kZXJGcmFtZUNhbGxiYWNrKCkge1xuICAgICAgICBjb25zdCB0ID0gTWF0aC5taW4oKGJyb3dzZXIubm93KCkgLSB0aGlzLl9lYXNlU3RhcnQpIC8gdGhpcy5fZWFzZU9wdGlvbnMuZHVyYXRpb24sIDEpO1xuICAgICAgICB0aGlzLl9vbkVhc2VGcmFtZSh0aGlzLl9lYXNlT3B0aW9ucy5lYXNpbmcodCkpO1xuICAgICAgICBpZiAodCA8IDEpIHtcbiAgICAgICAgICAgIHRoaXMuX2Vhc2VGcmFtZUlkID0gdGhpcy5fcmVxdWVzdFJlbmRlckZyYW1lKHRoaXMuX3JlbmRlckZyYW1lQ2FsbGJhY2spO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zdG9wKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBjb252ZXJ0IGJlYXJpbmcgc28gdGhhdCBpdCdzIG51bWVyaWNhbGx5IGNsb3NlIHRvIHRoZSBjdXJyZW50IG9uZSBzbyB0aGF0IGl0IGludGVycG9sYXRlcyBwcm9wZXJseVxuICAgIF9ub3JtYWxpemVCZWFyaW5nKGJlYXJpbmc6IG51bWJlciwgY3VycmVudEJlYXJpbmc6IG51bWJlcikge1xuICAgICAgICBiZWFyaW5nID0gd3JhcChiZWFyaW5nLCAtMTgwLCAxODApO1xuICAgICAgICBjb25zdCBkaWZmID0gTWF0aC5hYnMoYmVhcmluZyAtIGN1cnJlbnRCZWFyaW5nKTtcbiAgICAgICAgaWYgKE1hdGguYWJzKGJlYXJpbmcgLSAzNjAgLSBjdXJyZW50QmVhcmluZykgPCBkaWZmKSBiZWFyaW5nIC09IDM2MDtcbiAgICAgICAgaWYgKE1hdGguYWJzKGJlYXJpbmcgKyAzNjAgLSBjdXJyZW50QmVhcmluZykgPCBkaWZmKSBiZWFyaW5nICs9IDM2MDtcbiAgICAgICAgcmV0dXJuIGJlYXJpbmc7XG4gICAgfVxuXG4gICAgLy8gSWYgYSBwYXRoIGNyb3NzaW5nIHRoZSBhbnRpbWVyaWRpYW4gd291bGQgYmUgc2hvcnRlciwgZXh0ZW5kIHRoZSBmaW5hbCBjb29yZGluYXRlIHNvIHRoYXRcbiAgICAvLyBpbnRlcnBvbGF0aW5nIGJldHdlZW4gdGhlIHR3byBlbmRwb2ludHMgd2lsbCBjcm9zcyBpdC5cbiAgICBfbm9ybWFsaXplQ2VudGVyKGNlbnRlcjogTG5nTGF0KSB7XG4gICAgICAgIGNvbnN0IHRyID0gdGhpcy50cmFuc2Zvcm07XG4gICAgICAgIGlmICghdHIucmVuZGVyV29ybGRDb3BpZXMgfHwgdHIubG5nUmFuZ2UpIHJldHVybjtcblxuICAgICAgICBjb25zdCBkZWx0YSA9IGNlbnRlci5sbmcgLSB0ci5jZW50ZXIubG5nO1xuICAgICAgICBjZW50ZXIubG5nICs9XG4gICAgICAgICAgICBkZWx0YSA+IDE4MCA/IC0zNjAgOlxuICAgICAgICAgICAgZGVsdGEgPCAtMTgwID8gMzYwIDogMDtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IENhbWVyYTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCBET00gZnJvbSAnLi4vLi4vdXRpbC9kb20nO1xuaW1wb3J0IHsgYmluZEFsbCB9IGZyb20gJy4uLy4uL3V0aWwvdXRpbCc7XG5pbXBvcnQgY29uZmlnIGZyb20gJy4uLy4uL3V0aWwvY29uZmlnJztcblxuaW1wb3J0IHR5cGUgTWFwIGZyb20gJy4uL21hcCc7XG5cbnR5cGUgT3B0aW9ucyA9IHtcbiAgICBjb21wYWN0PzogYm9vbGVhbixcbiAgICBjdXN0b21BdHRyaWJ1dGlvbj86IHN0cmluZyB8IEFycmF5PHN0cmluZz5cbn07XG5cbi8qKlxuICogQW4gYEF0dHJpYnV0aW9uQ29udHJvbGAgY29udHJvbCBwcmVzZW50cyB0aGUgbWFwJ3MgW2F0dHJpYnV0aW9uIGluZm9ybWF0aW9uXShodHRwczovL3d3dy5tYXBib3guY29tL2hlbHAvYXR0cmlidXRpb24vKS5cbiAqXG4gKiBAaW1wbGVtZW50cyB7SUNvbnRyb2x9XG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmNvbXBhY3RdIElmIGB0cnVlYCBmb3JjZSBhIGNvbXBhY3QgYXR0cmlidXRpb24gdGhhdCBzaG93cyB0aGUgZnVsbCBhdHRyaWJ1dGlvbiBvbiBtb3VzZSBob3Zlciwgb3IgaWYgYGZhbHNlYCBmb3JjZSB0aGUgZnVsbCBhdHRyaWJ1dGlvbiBjb250cm9sLiBUaGUgZGVmYXVsdCBpcyBhIHJlc3BvbnNpdmUgYXR0cmlidXRpb24gdGhhdCBjb2xsYXBzZXMgd2hlbiB0aGUgbWFwIGlzIGxlc3MgdGhhbiA2NDAgcGl4ZWxzIHdpZGUuXG4gKiBAcGFyYW0ge3N0cmluZyB8IEFycmF5PHN0cmluZz59IFtvcHRpb25zLmN1c3RvbUF0dHJpYnV0aW9uXSBTdHJpbmcgb3Igc3RyaW5ncyB0byBzaG93IGluIGFkZGl0aW9uIHRvIGFueSBvdGhlciBhdHRyaWJ1dGlvbnMuXG4gKiBAZXhhbXBsZVxuICogdmFyIG1hcCA9IG5ldyBtYXBib3hnbC5NYXAoe2F0dHJpYnV0aW9uQ29udHJvbDogZmFsc2V9KVxuICogICAgIC5hZGRDb250cm9sKG5ldyBtYXBib3hnbC5BdHRyaWJ1dGlvbkNvbnRyb2woe1xuICogICAgICAgICBjb21wYWN0OiB0cnVlXG4gKiAgICAgfSkpO1xuICovXG5jbGFzcyBBdHRyaWJ1dGlvbkNvbnRyb2wge1xuICAgIG9wdGlvbnM6IE9wdGlvbnM7XG4gICAgX21hcDogTWFwO1xuICAgIF9jb250YWluZXI6IEhUTUxFbGVtZW50O1xuICAgIF9pbm5lckNvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XG4gICAgX2VkaXRMaW5rOiA/SFRNTEFuY2hvckVsZW1lbnQ7XG4gICAgc3R5bGVJZDogc3RyaW5nO1xuICAgIHN0eWxlT3duZXI6IHN0cmluZztcblxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM6IE9wdGlvbnMgPSB7fSkge1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuXG4gICAgICAgIGJpbmRBbGwoW1xuICAgICAgICAgICAgJ191cGRhdGVFZGl0TGluaycsXG4gICAgICAgICAgICAnX3VwZGF0ZURhdGEnLFxuICAgICAgICAgICAgJ191cGRhdGVDb21wYWN0J1xuICAgICAgICBdLCB0aGlzKTtcbiAgICB9XG5cbiAgICBnZXREZWZhdWx0UG9zaXRpb24oKSB7XG4gICAgICAgIHJldHVybiAnYm90dG9tLXJpZ2h0JztcbiAgICB9XG5cbiAgICBvbkFkZChtYXA6IE1hcCkge1xuICAgICAgICBjb25zdCBjb21wYWN0ID0gdGhpcy5vcHRpb25zICYmIHRoaXMub3B0aW9ucy5jb21wYWN0O1xuXG4gICAgICAgIHRoaXMuX21hcCA9IG1hcDtcbiAgICAgICAgdGhpcy5fY29udGFpbmVyID0gRE9NLmNyZWF0ZSgnZGl2JywgJ21hcGJveGdsLWN0cmwgbWFwYm94Z2wtY3RybC1hdHRyaWInKTtcbiAgICAgICAgdGhpcy5faW5uZXJDb250YWluZXIgPSBET00uY3JlYXRlKCdkaXYnLCAnbWFwYm94Z2wtY3RybC1hdHRyaWItaW5uZXInLCB0aGlzLl9jb250YWluZXIpO1xuXG4gICAgICAgIGlmIChjb21wYWN0KSB7XG4gICAgICAgICAgICB0aGlzLl9jb250YWluZXIuY2xhc3NMaXN0LmFkZCgnbWFwYm94Z2wtY29tcGFjdCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fdXBkYXRlQXR0cmlidXRpb25zKCk7XG4gICAgICAgIHRoaXMuX3VwZGF0ZUVkaXRMaW5rKCk7XG5cbiAgICAgICAgdGhpcy5fbWFwLm9uKCdzdHlsZWRhdGEnLCB0aGlzLl91cGRhdGVEYXRhKTtcbiAgICAgICAgdGhpcy5fbWFwLm9uKCdzb3VyY2VkYXRhJywgdGhpcy5fdXBkYXRlRGF0YSk7XG4gICAgICAgIHRoaXMuX21hcC5vbignbW92ZWVuZCcsIHRoaXMuX3VwZGF0ZUVkaXRMaW5rKTtcblxuICAgICAgICBpZiAoY29tcGFjdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLl9tYXAub24oJ3Jlc2l6ZScsIHRoaXMuX3VwZGF0ZUNvbXBhY3QpO1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlQ29tcGFjdCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnRhaW5lcjtcbiAgICB9XG5cbiAgICBvblJlbW92ZSgpIHtcbiAgICAgICAgRE9NLnJlbW92ZSh0aGlzLl9jb250YWluZXIpO1xuXG4gICAgICAgIHRoaXMuX21hcC5vZmYoJ3N0eWxlZGF0YScsIHRoaXMuX3VwZGF0ZURhdGEpO1xuICAgICAgICB0aGlzLl9tYXAub2ZmKCdzb3VyY2VkYXRhJywgdGhpcy5fdXBkYXRlRGF0YSk7XG4gICAgICAgIHRoaXMuX21hcC5vZmYoJ21vdmVlbmQnLCB0aGlzLl91cGRhdGVFZGl0TGluayk7XG4gICAgICAgIHRoaXMuX21hcC5vZmYoJ3Jlc2l6ZScsIHRoaXMuX3VwZGF0ZUNvbXBhY3QpO1xuXG4gICAgICAgIHRoaXMuX21hcCA9ICh1bmRlZmluZWQ6IGFueSk7XG4gICAgfVxuXG4gICAgX3VwZGF0ZUVkaXRMaW5rKCkge1xuICAgICAgICBsZXQgZWRpdExpbmsgPSB0aGlzLl9lZGl0TGluaztcbiAgICAgICAgaWYgKCFlZGl0TGluaykge1xuICAgICAgICAgICAgZWRpdExpbmsgPSB0aGlzLl9lZGl0TGluayA9ICh0aGlzLl9jb250YWluZXIucXVlcnlTZWxlY3RvcignLm1hcGJveC1pbXByb3ZlLW1hcCcpOiBhbnkpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGFyYW1zID0gW1xuICAgICAgICAgICAge2tleTogXCJvd25lclwiLCB2YWx1ZTogdGhpcy5zdHlsZU93bmVyfSxcbiAgICAgICAgICAgIHtrZXk6IFwiaWRcIiwgdmFsdWU6IHRoaXMuc3R5bGVJZH0sXG4gICAgICAgICAgICB7a2V5OiBcImFjY2Vzc190b2tlblwiLCB2YWx1ZTogY29uZmlnLkFDQ0VTU19UT0tFTn1cbiAgICAgICAgXTtcblxuICAgICAgICBpZiAoZWRpdExpbmspIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmFtU3RyaW5nID0gcGFyYW1zLnJlZHVjZSgoYWNjLCBuZXh0LCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG5leHQudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgYWNjICs9IGAke25leHQua2V5fT0ke25leHQudmFsdWV9JHtpIDwgcGFyYW1zLmxlbmd0aCAtIDEgPyAnJicgOiAnJ31gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICAgICAgfSwgYD9gKTtcbiAgICAgICAgICAgIGVkaXRMaW5rLmhyZWYgPSBgJHtjb25maWcuRkVFREJBQ0tfVVJMfS8ke3BhcmFtU3RyaW5nfSR7dGhpcy5fbWFwLl9oYXNoID8gdGhpcy5fbWFwLl9oYXNoLmdldEhhc2hTdHJpbmcodHJ1ZSkgOiAnJ31gO1xuICAgICAgICAgICAgZWRpdExpbmsucmVsID0gXCJub29wZW5lclwiO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX3VwZGF0ZURhdGEoZTogYW55KSB7XG4gICAgICAgIGlmIChlICYmIChlLnNvdXJjZURhdGFUeXBlID09PSAnbWV0YWRhdGEnIHx8IGUuZGF0YVR5cGUgPT09ICdzdHlsZScpKSB7XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVBdHRyaWJ1dGlvbnMoKTtcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUVkaXRMaW5rKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfdXBkYXRlQXR0cmlidXRpb25zKCkge1xuICAgICAgICBpZiAoIXRoaXMuX21hcC5zdHlsZSkgcmV0dXJuO1xuICAgICAgICBsZXQgYXR0cmlidXRpb25zOiBBcnJheTxzdHJpbmc+ID0gW107XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuY3VzdG9tQXR0cmlidXRpb24pIHtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMub3B0aW9ucy5jdXN0b21BdHRyaWJ1dGlvbikpIHtcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGlvbnMgPSBhdHRyaWJ1dGlvbnMuY29uY2F0KFxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuY3VzdG9tQXR0cmlidXRpb24ubWFwKGF0dHJpYnV0aW9uID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgYXR0cmlidXRpb24gIT09ICdzdHJpbmcnKSByZXR1cm4gJyc7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXR0cmlidXRpb247XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHRoaXMub3B0aW9ucy5jdXN0b21BdHRyaWJ1dGlvbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGlvbnMucHVzaCh0aGlzLm9wdGlvbnMuY3VzdG9tQXR0cmlidXRpb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX21hcC5zdHlsZS5zdHlsZXNoZWV0KSB7XG4gICAgICAgICAgICBjb25zdCBzdHlsZXNoZWV0OiBhbnkgPSB0aGlzLl9tYXAuc3R5bGUuc3R5bGVzaGVldDtcbiAgICAgICAgICAgIHRoaXMuc3R5bGVPd25lciA9IHN0eWxlc2hlZXQub3duZXI7XG4gICAgICAgICAgICB0aGlzLnN0eWxlSWQgPSBzdHlsZXNoZWV0LmlkO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc291cmNlQ2FjaGVzID0gdGhpcy5fbWFwLnN0eWxlLnNvdXJjZUNhY2hlcztcbiAgICAgICAgZm9yIChjb25zdCBpZCBpbiBzb3VyY2VDYWNoZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZUNhY2hlID0gc291cmNlQ2FjaGVzW2lkXTtcbiAgICAgICAgICAgIGlmIChzb3VyY2VDYWNoZS51c2VkKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc291cmNlID0gc291cmNlQ2FjaGUuZ2V0U291cmNlKCk7XG4gICAgICAgICAgICAgICAgaWYgKHNvdXJjZS5hdHRyaWJ1dGlvbiAmJiBhdHRyaWJ1dGlvbnMuaW5kZXhPZihzb3VyY2UuYXR0cmlidXRpb24pIDwgMCkge1xuICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGlvbnMucHVzaChzb3VyY2UuYXR0cmlidXRpb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHJlbW92ZSBhbnkgZW50cmllcyB0aGF0IGFyZSBzdWJzdHJpbmdzIG9mIGFub3RoZXIgZW50cnkuXG4gICAgICAgIC8vIGZpcnN0IHNvcnQgYnkgbGVuZ3RoIHNvIHRoYXQgc3Vic3RyaW5ncyBjb21lIGZpcnN0XG4gICAgICAgIGF0dHJpYnV0aW9ucy5zb3J0KChhLCBiKSA9PiBhLmxlbmd0aCAtIGIubGVuZ3RoKTtcbiAgICAgICAgYXR0cmlidXRpb25zID0gYXR0cmlidXRpb25zLmZpbHRlcigoYXR0cmliLCBpKSA9PiB7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gaSArIDE7IGogPCBhdHRyaWJ1dGlvbnMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRpb25zW2pdLmluZGV4T2YoYXR0cmliKSA+PSAwKSB7IHJldHVybiBmYWxzZTsgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoYXR0cmlidXRpb25zLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5faW5uZXJDb250YWluZXIuaW5uZXJIVE1MID0gYXR0cmlidXRpb25zLmpvaW4oJyB8ICcpO1xuICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyLmNsYXNzTGlzdC5yZW1vdmUoJ21hcGJveGdsLWF0dHJpYi1lbXB0eScpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ21hcGJveGdsLWF0dHJpYi1lbXB0eScpO1xuICAgICAgICB9XG4gICAgICAgIC8vIHJlbW92ZSBvbGQgRE9NIG5vZGUgZnJvbSBfZWRpdExpbmtcbiAgICAgICAgdGhpcy5fZWRpdExpbmsgPSBudWxsO1xuICAgIH1cblxuICAgIF91cGRhdGVDb21wYWN0KCkge1xuICAgICAgICBpZiAodGhpcy5fbWFwLmdldENhbnZhc0NvbnRhaW5lcigpLm9mZnNldFdpZHRoIDw9IDY0MCkge1xuICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ21hcGJveGdsLWNvbXBhY3QnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lci5jbGFzc0xpc3QucmVtb3ZlKCdtYXBib3hnbC1jb21wYWN0Jyk7XG4gICAgICAgIH1cbiAgICB9XG5cbn1cblxuZXhwb3J0IGRlZmF1bHQgQXR0cmlidXRpb25Db250cm9sO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IERPTSBmcm9tICcuLi8uLi91dGlsL2RvbSc7XG5cbmltcG9ydCB7IGJpbmRBbGwgfSBmcm9tICcuLi8uLi91dGlsL3V0aWwnO1xuXG5pbXBvcnQgdHlwZSBNYXAgZnJvbSAnLi4vbWFwJztcblxuLyoqXG4gKiBBIGBMb2dvQ29udHJvbGAgaXMgYSBjb250cm9sIHRoYXQgYWRkcyB0aGUgTWFwYm94IHdhdGVybWFya1xuICogdG8gdGhlIG1hcCBhcyByZXF1aXJlZCBieSB0aGUgW3Rlcm1zIG9mIHNlcnZpY2VdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vdG9zLykgZm9yIE1hcGJveFxuICogdmVjdG9yIHRpbGVzIGFuZCBjb3JlIHN0eWxlcy5cbiAqXG4gKiBAaW1wbGVtZW50cyB7SUNvbnRyb2x9XG4gKiBAcHJpdmF0ZVxuKiovXG5cbmNsYXNzIExvZ29Db250cm9sIHtcbiAgICBfbWFwOiBNYXA7XG4gICAgX2NvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgYmluZEFsbChbJ191cGRhdGVMb2dvJ10sIHRoaXMpO1xuICAgICAgICBiaW5kQWxsKFsnX3VwZGF0ZUNvbXBhY3QnXSwgdGhpcyk7XG4gICAgfVxuXG4gICAgb25BZGQobWFwOiBNYXApIHtcbiAgICAgICAgdGhpcy5fbWFwID0gbWFwO1xuICAgICAgICB0aGlzLl9jb250YWluZXIgPSBET00uY3JlYXRlKCdkaXYnLCAnbWFwYm94Z2wtY3RybCcpO1xuICAgICAgICBjb25zdCBhbmNob3IgPSBET00uY3JlYXRlKCdhJywgJ21hcGJveGdsLWN0cmwtbG9nbycpO1xuICAgICAgICBhbmNob3IudGFyZ2V0ID0gXCJfYmxhbmtcIjtcbiAgICAgICAgYW5jaG9yLnJlbCA9IFwibm9vcGVuZXJcIjtcbiAgICAgICAgYW5jaG9yLmhyZWYgPSBcImh0dHBzOi8vd3d3Lm1hcGJveC5jb20vXCI7XG4gICAgICAgIGFuY2hvci5zZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIsIFwiTWFwYm94IGxvZ29cIik7XG4gICAgICAgIGFuY2hvci5zZXRBdHRyaWJ1dGUoXCJyZWxcIiwgXCJub29wZW5lclwiKTtcbiAgICAgICAgdGhpcy5fY29udGFpbmVyLmFwcGVuZENoaWxkKGFuY2hvcik7XG4gICAgICAgIHRoaXMuX2NvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXG4gICAgICAgIHRoaXMuX21hcC5vbignc291cmNlZGF0YScsIHRoaXMuX3VwZGF0ZUxvZ28pO1xuICAgICAgICB0aGlzLl91cGRhdGVMb2dvKCk7XG5cbiAgICAgICAgdGhpcy5fbWFwLm9uKCdyZXNpemUnLCB0aGlzLl91cGRhdGVDb21wYWN0KTtcbiAgICAgICAgdGhpcy5fdXBkYXRlQ29tcGFjdCgpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLl9jb250YWluZXI7XG4gICAgfVxuXG4gICAgb25SZW1vdmUoKSB7XG4gICAgICAgIERPTS5yZW1vdmUodGhpcy5fY29udGFpbmVyKTtcbiAgICAgICAgdGhpcy5fbWFwLm9mZignc291cmNlZGF0YScsIHRoaXMuX3VwZGF0ZUxvZ28pO1xuICAgICAgICB0aGlzLl9tYXAub2ZmKCdyZXNpemUnLCB0aGlzLl91cGRhdGVDb21wYWN0KTtcbiAgICB9XG5cbiAgICBnZXREZWZhdWx0UG9zaXRpb24oKSB7XG4gICAgICAgIHJldHVybiAnYm90dG9tLWxlZnQnO1xuICAgIH1cblxuICAgIF91cGRhdGVMb2dvKGU6IGFueSkge1xuICAgICAgICBpZiAoIWUgfHwgZS5zb3VyY2VEYXRhVHlwZSA9PT0gJ21ldGFkYXRhJykge1xuICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSB0aGlzLl9sb2dvUmVxdWlyZWQoKSA/ICdibG9jaycgOiAnbm9uZSc7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfbG9nb1JlcXVpcmVkKCkge1xuICAgICAgICBpZiAoIXRoaXMuX21hcC5zdHlsZSkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IHNvdXJjZUNhY2hlcyA9IHRoaXMuX21hcC5zdHlsZS5zb3VyY2VDYWNoZXM7XG4gICAgICAgIGZvciAoY29uc3QgaWQgaW4gc291cmNlQ2FjaGVzKSB7XG4gICAgICAgICAgICBjb25zdCBzb3VyY2UgPSBzb3VyY2VDYWNoZXNbaWRdLmdldFNvdXJjZSgpO1xuICAgICAgICAgICAgaWYgKHNvdXJjZS5tYXBib3hfbG9nbykge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIF91cGRhdGVDb21wYWN0KCkge1xuICAgICAgICBjb25zdCBjb250YWluZXJDaGlsZHJlbiA9IHRoaXMuX2NvbnRhaW5lci5jaGlsZHJlbjtcbiAgICAgICAgaWYgKGNvbnRhaW5lckNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgYW5jaG9yID0gY29udGFpbmVyQ2hpbGRyZW5bMF07XG4gICAgICAgICAgICBpZiAodGhpcy5fbWFwLmdldENhbnZhc0NvbnRhaW5lcigpLm9mZnNldFdpZHRoIDwgMjUwKSB7XG4gICAgICAgICAgICAgICAgYW5jaG9yLmNsYXNzTGlzdC5hZGQoJ21hcGJveGdsLWNvbXBhY3QnKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYW5jaG9yLmNsYXNzTGlzdC5yZW1vdmUoJ21hcGJveGdsLWNvbXBhY3QnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxufVxuXG5cbmV4cG9ydCBkZWZhdWx0IExvZ29Db250cm9sO1xuIiwiLy8gQGZsb3dcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcblxuZXhwb3J0IHR5cGUgVGFza0lEID0gbnVtYmVyOyAvLyBjYW4ndCBtYXJrIG9wYXF1ZSBkdWUgdG8gaHR0cHM6Ly9naXRodWIuY29tL2Zsb3d0eXBlL2Zsb3ctcmVtb3ZlLXR5cGVzL3B1bGwvNjFcbnR5cGUgVGFzayA9IHtcbiAgICBjYWxsYmFjazogKCkgPT4gdm9pZDtcbiAgICBpZDogVGFza0lEO1xuICAgIGNhbmNlbGxlZDogYm9vbGVhbjtcbn07XG5cbmNsYXNzIFRhc2tRdWV1ZSB7XG4gICAgX3F1ZXVlOiBBcnJheTxUYXNrPjtcbiAgICBfaWQ6IFRhc2tJRDtcbiAgICBfY2xlYXJlZDogYm9vbGVhbjtcbiAgICBfY3VycmVudGx5UnVubmluZzogQXJyYXk8VGFzaz4gfCBmYWxzZTtcblxuICAgIGNvbnN0cnVjdG9yKCkgIHtcbiAgICAgICAgdGhpcy5fcXVldWUgPSBbXTtcbiAgICAgICAgdGhpcy5faWQgPSAwO1xuICAgICAgICB0aGlzLl9jbGVhcmVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRseVJ1bm5pbmcgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBhZGQoY2FsbGJhY2s6ICgpID0+IHZvaWQpOiBUYXNrSUQge1xuICAgICAgICBjb25zdCBpZCA9ICsrdGhpcy5faWQ7XG4gICAgICAgIGNvbnN0IHF1ZXVlID0gdGhpcy5fcXVldWU7XG4gICAgICAgIHF1ZXVlLnB1c2goe2NhbGxiYWNrLCBpZCwgY2FuY2VsbGVkOiBmYWxzZX0pO1xuICAgICAgICByZXR1cm4gaWQ7XG4gICAgfVxuXG4gICAgcmVtb3ZlKGlkOiBUYXNrSUQpIHtcbiAgICAgICAgY29uc3QgcnVubmluZyA9IHRoaXMuX2N1cnJlbnRseVJ1bm5pbmc7XG4gICAgICAgIGNvbnN0IHF1ZXVlID0gcnVubmluZyA/IHRoaXMuX3F1ZXVlLmNvbmNhdChydW5uaW5nKSA6IHRoaXMuX3F1ZXVlO1xuICAgICAgICBmb3IgKGNvbnN0IHRhc2sgb2YgcXVldWUpIHtcbiAgICAgICAgICAgIGlmICh0YXNrLmlkID09PSBpZCkge1xuICAgICAgICAgICAgICAgIHRhc2suY2FuY2VsbGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBydW4oKSB7XG4gICAgICAgIGFzc2VydCghdGhpcy5fY3VycmVudGx5UnVubmluZyk7XG4gICAgICAgIGNvbnN0IHF1ZXVlID0gdGhpcy5fY3VycmVudGx5UnVubmluZyA9IHRoaXMuX3F1ZXVlO1xuXG4gICAgICAgIC8vIFRhc2tzIHF1ZXVlZCBieSBjYWxsYmFja3MgaW4gdGhlIGN1cnJlbnQgcXVldWUgc2hvdWxkIGJlIGV4ZWN1dGVkXG4gICAgICAgIC8vIG9uIHRoZSBuZXh0IHJ1biwgbm90IHRoZSBjdXJyZW50IHJ1bi5cbiAgICAgICAgdGhpcy5fcXVldWUgPSBbXTtcblxuICAgICAgICBmb3IgKGNvbnN0IHRhc2sgb2YgcXVldWUpIHtcbiAgICAgICAgICAgIGlmICh0YXNrLmNhbmNlbGxlZCkgY29udGludWU7XG4gICAgICAgICAgICB0YXNrLmNhbGxiYWNrKCk7XG4gICAgICAgICAgICBpZiAodGhpcy5fY2xlYXJlZCkgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9jbGVhcmVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRseVJ1bm5pbmcgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBjbGVhcigpIHtcbiAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnRseVJ1bm5pbmcpIHtcbiAgICAgICAgICAgIHRoaXMuX2NsZWFyZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3F1ZXVlID0gW107XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBUYXNrUXVldWU7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgeyBleHRlbmQsIGJpbmRBbGwsIHdhcm5PbmNlLCB1bmlxdWVJZCB9IGZyb20gJy4uL3V0aWwvdXRpbCc7XG5pbXBvcnQgYnJvd3NlciBmcm9tICcuLi91dGlsL2Jyb3dzZXInO1xuaW1wb3J0IHdpbmRvdyBmcm9tICcuLi91dGlsL3dpbmRvdyc7XG5jb25zdCB7IEhUTUxJbWFnZUVsZW1lbnQsIEhUTUxFbGVtZW50IH0gPSB3aW5kb3c7XG5pbXBvcnQgRE9NIGZyb20gJy4uL3V0aWwvZG9tJztcbmltcG9ydCB7IGdldEltYWdlLCBnZXRKU09OLCBSZXNvdXJjZVR5cGUgfSBmcm9tICcuLi91dGlsL2FqYXgnO1xuaW1wb3J0IHsgUmVxdWVzdE1hbmFnZXIgfSBmcm9tICcuLi91dGlsL21hcGJveCc7XG5pbXBvcnQgU3R5bGUgZnJvbSAnLi4vc3R5bGUvc3R5bGUnO1xuaW1wb3J0IEV2YWx1YXRpb25QYXJhbWV0ZXJzIGZyb20gJy4uL3N0eWxlL2V2YWx1YXRpb25fcGFyYW1ldGVycyc7XG5pbXBvcnQgUGFpbnRlciBmcm9tICcuLi9yZW5kZXIvcGFpbnRlcic7XG5pbXBvcnQgVHJhbnNmb3JtIGZyb20gJy4uL2dlby90cmFuc2Zvcm0nO1xuaW1wb3J0IEhhc2ggZnJvbSAnLi9oYXNoJztcbmltcG9ydCBiaW5kSGFuZGxlcnMgZnJvbSAnLi9iaW5kX2hhbmRsZXJzJztcbmltcG9ydCBDYW1lcmEgZnJvbSAnLi9jYW1lcmEnO1xuaW1wb3J0IExuZ0xhdCBmcm9tICcuLi9nZW8vbG5nX2xhdCc7XG5pbXBvcnQgTG5nTGF0Qm91bmRzIGZyb20gJy4uL2dlby9sbmdfbGF0X2JvdW5kcyc7XG5pbXBvcnQgUG9pbnQgZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XG5pbXBvcnQgQXR0cmlidXRpb25Db250cm9sIGZyb20gJy4vY29udHJvbC9hdHRyaWJ1dGlvbl9jb250cm9sJztcbmltcG9ydCBMb2dvQ29udHJvbCBmcm9tICcuL2NvbnRyb2wvbG9nb19jb250cm9sJztcbmltcG9ydCBpc1N1cHBvcnRlZCBmcm9tICdAbWFwYm94L21hcGJveC1nbC1zdXBwb3J0ZWQnO1xuaW1wb3J0IHsgUkdCQUltYWdlIH0gZnJvbSAnLi4vdXRpbC9pbWFnZSc7XG5pbXBvcnQgeyBFdmVudCwgRXJyb3JFdmVudCB9IGZyb20gJy4uL3V0aWwvZXZlbnRlZCc7XG5pbXBvcnQgeyBNYXBNb3VzZUV2ZW50IH0gZnJvbSAnLi9ldmVudHMnO1xuaW1wb3J0IFRhc2tRdWV1ZSBmcm9tICcuLi91dGlsL3Rhc2tfcXVldWUnO1xuaW1wb3J0IHdlYnBTdXBwb3J0ZWQgZnJvbSAnLi4vdXRpbC93ZWJwX3N1cHBvcnRlZCc7XG5cbmltcG9ydCB0eXBlIHtQb2ludExpa2V9IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuaW1wb3J0IHR5cGUgeyBSZXF1ZXN0VHJhbnNmb3JtRnVuY3Rpb24gfSBmcm9tICcuLi91dGlsL21hcGJveCc7XG5pbXBvcnQgdHlwZSB7TG5nTGF0TGlrZX0gZnJvbSAnLi4vZ2VvL2xuZ19sYXQnO1xuaW1wb3J0IHR5cGUge0xuZ0xhdEJvdW5kc0xpa2V9IGZyb20gJy4uL2dlby9sbmdfbGF0X2JvdW5kcyc7XG5pbXBvcnQgdHlwZSB7U3R5bGVPcHRpb25zLCBTdHlsZVNldHRlck9wdGlvbnN9IGZyb20gJy4uL3N0eWxlL3N0eWxlJztcbmltcG9ydCB0eXBlIHtNYXBFdmVudCwgTWFwRGF0YUV2ZW50fSBmcm9tICcuL2V2ZW50cyc7XG5pbXBvcnQgdHlwZSB7Q3VzdG9tTGF5ZXJJbnRlcmZhY2V9IGZyb20gJy4uL3N0eWxlL3N0eWxlX2xheWVyL2N1c3RvbV9zdHlsZV9sYXllcic7XG5pbXBvcnQgdHlwZSB7U3R5bGVJbWFnZUludGVyZmFjZX0gZnJvbSAnLi4vc3R5bGUvc3R5bGVfaW1hZ2UnO1xuXG5pbXBvcnQgdHlwZSBTY3JvbGxab29tSGFuZGxlciBmcm9tICcuL2hhbmRsZXIvc2Nyb2xsX3pvb20nO1xuaW1wb3J0IHR5cGUgQm94Wm9vbUhhbmRsZXIgZnJvbSAnLi9oYW5kbGVyL2JveF96b29tJztcbmltcG9ydCB0eXBlIERyYWdSb3RhdGVIYW5kbGVyIGZyb20gJy4vaGFuZGxlci9kcmFnX3JvdGF0ZSc7XG5pbXBvcnQgdHlwZSBEcmFnUGFuSGFuZGxlciBmcm9tICcuL2hhbmRsZXIvZHJhZ19wYW4nO1xuaW1wb3J0IHR5cGUgS2V5Ym9hcmRIYW5kbGVyIGZyb20gJy4vaGFuZGxlci9rZXlib2FyZCc7XG5pbXBvcnQgdHlwZSBEb3VibGVDbGlja1pvb21IYW5kbGVyIGZyb20gJy4vaGFuZGxlci9kYmxjbGlja196b29tJztcbmltcG9ydCB0eXBlIFRvdWNoWm9vbVJvdGF0ZUhhbmRsZXIgZnJvbSAnLi9oYW5kbGVyL3RvdWNoX3pvb21fcm90YXRlJztcbmltcG9ydCB0eXBlIHtUYXNrSUR9IGZyb20gJy4uL3V0aWwvdGFza19xdWV1ZSc7XG5pbXBvcnQgdHlwZSB7Q2FuY2VsYWJsZX0gZnJvbSAnLi4vdHlwZXMvY2FuY2VsYWJsZSc7XG5pbXBvcnQgdHlwZSB7XG4gICAgTGF5ZXJTcGVjaWZpY2F0aW9uLFxuICAgIEZpbHRlclNwZWNpZmljYXRpb24sXG4gICAgU3R5bGVTcGVjaWZpY2F0aW9uLFxuICAgIExpZ2h0U3BlY2lmaWNhdGlvbixcbiAgICBTb3VyY2VTcGVjaWZpY2F0aW9uXG59IGZyb20gJy4uL3N0eWxlLXNwZWMvdHlwZXMnO1xuXG50eXBlIENvbnRyb2xQb3NpdGlvbiA9ICd0b3AtbGVmdCcgfCAndG9wLXJpZ2h0JyB8ICdib3R0b20tbGVmdCcgfCAnYm90dG9tLXJpZ2h0Jztcbi8qIGVzbGludC1kaXNhYmxlIG5vLXVzZS1iZWZvcmUtZGVmaW5lICovXG50eXBlIElDb250cm9sID0ge1xuICAgIG9uQWRkKG1hcDogTWFwKTogSFRNTEVsZW1lbnQ7XG4gICAgb25SZW1vdmUobWFwOiBNYXApOiB2b2lkO1xuXG4gICAgK2dldERlZmF1bHRQb3NpdGlvbj86ICgpID0+IENvbnRyb2xQb3NpdGlvbjtcbn1cbi8qIGVzbGludC1lbmFibGUgbm8tdXNlLWJlZm9yZS1kZWZpbmUgKi9cblxudHlwZSBNYXBPcHRpb25zID0ge1xuICAgIGhhc2g/OiBib29sZWFuLFxuICAgIGludGVyYWN0aXZlPzogYm9vbGVhbixcbiAgICBjb250YWluZXI6IEhUTUxFbGVtZW50IHwgc3RyaW5nLFxuICAgIGJlYXJpbmdTbmFwPzogbnVtYmVyLFxuICAgIGF0dHJpYnV0aW9uQ29udHJvbD86IGJvb2xlYW4sXG4gICAgY3VzdG9tQXR0cmlidXRpb24/OiBzdHJpbmcgfCBBcnJheTxzdHJpbmc+LFxuICAgIGxvZ29Qb3NpdGlvbj86IENvbnRyb2xQb3NpdGlvbixcbiAgICBmYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0PzogYm9vbGVhbixcbiAgICBwcmVzZXJ2ZURyYXdpbmdCdWZmZXI/OiBib29sZWFuLFxuICAgIGFudGlhbGlhcz86IGJvb2xlYW4sXG4gICAgcmVmcmVzaEV4cGlyZWRUaWxlcz86IGJvb2xlYW4sXG4gICAgbWF4Qm91bmRzPzogTG5nTGF0Qm91bmRzTGlrZSxcbiAgICBzY3JvbGxab29tPzogYm9vbGVhbixcbiAgICBtaW5ab29tPzogP251bWJlcixcbiAgICBtYXhab29tPzogP251bWJlcixcbiAgICBib3hab29tPzogYm9vbGVhbixcbiAgICBkcmFnUm90YXRlPzogYm9vbGVhbixcbiAgICBkcmFnUGFuPzogYm9vbGVhbixcbiAgICBrZXlib2FyZD86IGJvb2xlYW4sXG4gICAgZG91YmxlQ2xpY2tab29tPzogYm9vbGVhbixcbiAgICB0b3VjaFpvb21Sb3RhdGU/OiBib29sZWFuLFxuICAgIHRyYWNrUmVzaXplPzogYm9vbGVhbixcbiAgICBjZW50ZXI/OiBMbmdMYXRMaWtlLFxuICAgIHpvb20/OiBudW1iZXIsXG4gICAgYmVhcmluZz86IG51bWJlcixcbiAgICBwaXRjaD86IG51bWJlcixcbiAgICByZW5kZXJXb3JsZENvcGllcz86IGJvb2xlYW4sXG4gICAgbWF4VGlsZUNhY2hlU2l6ZT86IG51bWJlcixcbiAgICB0cmFuc2Zvcm1SZXF1ZXN0PzogUmVxdWVzdFRyYW5zZm9ybUZ1bmN0aW9uXG59O1xuXG5jb25zdCBkZWZhdWx0TWluWm9vbSA9IDA7XG5jb25zdCBkZWZhdWx0TWF4Wm9vbSA9IDIyO1xuY29uc3QgZGVmYXVsdE9wdGlvbnMgPSB7XG4gICAgY2VudGVyOiBbMCwgMF0sXG4gICAgem9vbTogMCxcbiAgICBiZWFyaW5nOiAwLFxuICAgIHBpdGNoOiAwLFxuXG4gICAgbWluWm9vbTogZGVmYXVsdE1pblpvb20sXG4gICAgbWF4Wm9vbTogZGVmYXVsdE1heFpvb20sXG5cbiAgICBpbnRlcmFjdGl2ZTogdHJ1ZSxcbiAgICBzY3JvbGxab29tOiB0cnVlLFxuICAgIGJveFpvb206IHRydWUsXG4gICAgZHJhZ1JvdGF0ZTogdHJ1ZSxcbiAgICBkcmFnUGFuOiB0cnVlLFxuICAgIGtleWJvYXJkOiB0cnVlLFxuICAgIGRvdWJsZUNsaWNrWm9vbTogdHJ1ZSxcbiAgICB0b3VjaFpvb21Sb3RhdGU6IHRydWUsXG5cbiAgICBiZWFyaW5nU25hcDogNyxcbiAgICBjbGlja1RvbGVyYW5jZTogMyxcblxuICAgIGhhc2g6IGZhbHNlLFxuICAgIGF0dHJpYnV0aW9uQ29udHJvbDogdHJ1ZSxcblxuICAgIGZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQ6IGZhbHNlLFxuICAgIHByZXNlcnZlRHJhd2luZ0J1ZmZlcjogZmFsc2UsXG4gICAgdHJhY2tSZXNpemU6IHRydWUsXG4gICAgcmVuZGVyV29ybGRDb3BpZXM6IHRydWUsXG4gICAgcmVmcmVzaEV4cGlyZWRUaWxlczogdHJ1ZSxcbiAgICBtYXhUaWxlQ2FjaGVTaXplOiBudWxsLFxuICAgIGxvY2FsSWRlb2dyYXBoRm9udEZhbWlseTogJ3NhbnMtc2VyaWYnLFxuICAgIHRyYW5zZm9ybVJlcXVlc3Q6IG51bGwsXG4gICAgZmFkZUR1cmF0aW9uOiAzMDAsXG4gICAgY3Jvc3NTb3VyY2VDb2xsaXNpb25zOiB0cnVlXG59O1xuXG4vKipcbiAqIFRoZSBgTWFwYCBvYmplY3QgcmVwcmVzZW50cyB0aGUgbWFwIG9uIHlvdXIgcGFnZS4gSXQgZXhwb3NlcyBtZXRob2RzXG4gKiBhbmQgcHJvcGVydGllcyB0aGF0IGVuYWJsZSB5b3UgdG8gcHJvZ3JhbW1hdGljYWxseSBjaGFuZ2UgdGhlIG1hcCxcbiAqIGFuZCBmaXJlcyBldmVudHMgYXMgdXNlcnMgaW50ZXJhY3Qgd2l0aCBpdC5cbiAqXG4gKiBZb3UgY3JlYXRlIGEgYE1hcGAgYnkgc3BlY2lmeWluZyBhIGBjb250YWluZXJgIGFuZCBvdGhlciBvcHRpb25zLlxuICogVGhlbiBNYXBib3ggR0wgSlMgaW5pdGlhbGl6ZXMgdGhlIG1hcCBvbiB0aGUgcGFnZSBhbmQgcmV0dXJucyB5b3VyIGBNYXBgXG4gKiBvYmplY3QuXG4gKlxuICogQGV4dGVuZHMgRXZlbnRlZFxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR8c3RyaW5nfSBvcHRpb25zLmNvbnRhaW5lciBUaGUgSFRNTCBlbGVtZW50IGluIHdoaWNoIE1hcGJveCBHTCBKUyB3aWxsIHJlbmRlciB0aGUgbWFwLCBvciB0aGUgZWxlbWVudCdzIHN0cmluZyBgaWRgLiBUaGUgc3BlY2lmaWVkIGVsZW1lbnQgbXVzdCBoYXZlIG5vIGNoaWxkcmVuLlxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLm1pblpvb209MF0gVGhlIG1pbmltdW0gem9vbSBsZXZlbCBvZiB0aGUgbWFwICgwLTI0KS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5tYXhab29tPTIyXSBUaGUgbWF4aW11bSB6b29tIGxldmVsIG9mIHRoZSBtYXAgKDAtMjQpLlxuICogQHBhcmFtIHtPYmplY3R8c3RyaW5nfSBbb3B0aW9ucy5zdHlsZV0gVGhlIG1hcCdzIE1hcGJveCBzdHlsZS4gVGhpcyBtdXN0IGJlIGFuIGEgSlNPTiBvYmplY3QgY29uZm9ybWluZyB0b1xuICogdGhlIHNjaGVtYSBkZXNjcmliZWQgaW4gdGhlIFtNYXBib3ggU3R5bGUgU3BlY2lmaWNhdGlvbl0oaHR0cHM6Ly9tYXBib3guY29tL21hcGJveC1nbC1zdHlsZS1zcGVjLyksIG9yIGEgVVJMIHRvXG4gKiBzdWNoIEpTT04uXG4gKlxuICogVG8gbG9hZCBhIHN0eWxlIGZyb20gdGhlIE1hcGJveCBBUEksIHlvdSBjYW4gdXNlIGEgVVJMIG9mIHRoZSBmb3JtIGBtYXBib3g6Ly9zdHlsZXMvOm93bmVyLzpzdHlsZWAsXG4gKiB3aGVyZSBgOm93bmVyYCBpcyB5b3VyIE1hcGJveCBhY2NvdW50IG5hbWUgYW5kIGA6c3R5bGVgIGlzIHRoZSBzdHlsZSBJRC4gT3IgeW91IGNhbiB1c2Ugb25lIG9mIHRoZSBmb2xsb3dpbmdcbiAqIFt0aGUgcHJlZGVmaW5lZCBNYXBib3ggc3R5bGVzXShodHRwczovL3d3dy5tYXBib3guY29tL21hcHMvKTpcbiAqXG4gKiAgKiBgbWFwYm94Oi8vc3R5bGVzL21hcGJveC9zdHJlZXRzLXYxMGBcbiAqICAqIGBtYXBib3g6Ly9zdHlsZXMvbWFwYm94L291dGRvb3JzLXYxMGBcbiAqICAqIGBtYXBib3g6Ly9zdHlsZXMvbWFwYm94L2xpZ2h0LXY5YFxuICogICogYG1hcGJveDovL3N0eWxlcy9tYXBib3gvZGFyay12OWBcbiAqICAqIGBtYXBib3g6Ly9zdHlsZXMvbWFwYm94L3NhdGVsbGl0ZS12OWBcbiAqICAqIGBtYXBib3g6Ly9zdHlsZXMvbWFwYm94L3NhdGVsbGl0ZS1zdHJlZXRzLXYxMGBcbiAqICAqIGBtYXBib3g6Ly9zdHlsZXMvbWFwYm94L25hdmlnYXRpb24tcHJldmlldy1kYXktdjJgXG4gKiAgKiBgbWFwYm94Oi8vc3R5bGVzL21hcGJveC9uYXZpZ2F0aW9uLXByZXZpZXctbmlnaHQtdjJgXG4gKiAgKiBgbWFwYm94Oi8vc3R5bGVzL21hcGJveC9uYXZpZ2F0aW9uLWd1aWRhbmNlLWRheS12MmBcbiAqICAqIGBtYXBib3g6Ly9zdHlsZXMvbWFwYm94L25hdmlnYXRpb24tZ3VpZGFuY2UtbmlnaHQtdjJgXG4gKlxuICogVGlsZXNldHMgaG9zdGVkIHdpdGggTWFwYm94IGNhbiBiZSBzdHlsZS1vcHRpbWl6ZWQgaWYgeW91IGFwcGVuZCBgP29wdGltaXplPXRydWVgIHRvIHRoZSBlbmQgb2YgeW91ciBzdHlsZSBVUkwsIGxpa2UgYG1hcGJveDovL3N0eWxlcy9tYXBib3gvc3RyZWV0cy12OT9vcHRpbWl6ZT10cnVlYC5cbiAqIExlYXJuIG1vcmUgYWJvdXQgc3R5bGUtb3B0aW1pemVkIHZlY3RvciB0aWxlcyBpbiBvdXIgW0FQSSBkb2N1bWVudGF0aW9uXShodHRwczovL3d3dy5tYXBib3guY29tL2FwaS1kb2N1bWVudGF0aW9uL21hcHMvI3JldHJpZXZlLXRpbGVzKS5cbiAqXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmhhc2g9ZmFsc2VdIElmIGB0cnVlYCwgdGhlIG1hcCdzIHBvc2l0aW9uICh6b29tLCBjZW50ZXIgbGF0aXR1ZGUsIGNlbnRlciBsb25naXR1ZGUsIGJlYXJpbmcsIGFuZCBwaXRjaCkgd2lsbCBiZSBzeW5jZWQgd2l0aCB0aGUgaGFzaCBmcmFnbWVudCBvZiB0aGUgcGFnZSdzIFVSTC5cbiAqICAgRm9yIGV4YW1wbGUsIGBodHRwOi8vcGF0aC90by9teS9wYWdlLmh0bWwjMi41OS8zOS4yNi81My4wNy8tMjQuMS82MGAuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmludGVyYWN0aXZlPXRydWVdIElmIGBmYWxzZWAsIG5vIG1vdXNlLCB0b3VjaCwgb3Iga2V5Ym9hcmQgbGlzdGVuZXJzIHdpbGwgYmUgYXR0YWNoZWQgdG8gdGhlIG1hcCwgc28gaXQgd2lsbCBub3QgcmVzcG9uZCB0byBpbnRlcmFjdGlvbi5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5iZWFyaW5nU25hcD03XSBUaGUgdGhyZXNob2xkLCBtZWFzdXJlZCBpbiBkZWdyZWVzLCB0aGF0IGRldGVybWluZXMgd2hlbiB0aGUgbWFwJ3NcbiAqICAgYmVhcmluZyB3aWxsIHNuYXAgdG8gbm9ydGguIEZvciBleGFtcGxlLCB3aXRoIGEgYGJlYXJpbmdTbmFwYCBvZiA3LCBpZiB0aGUgdXNlciByb3RhdGVzXG4gKiAgIHRoZSBtYXAgd2l0aGluIDcgZGVncmVlcyBvZiBub3J0aCwgdGhlIG1hcCB3aWxsIGF1dG9tYXRpY2FsbHkgc25hcCB0byBleGFjdCBub3J0aC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMucGl0Y2hXaXRoUm90YXRlPXRydWVdIElmIGBmYWxzZWAsIHRoZSBtYXAncyBwaXRjaCAodGlsdCkgY29udHJvbCB3aXRoIFwiZHJhZyB0byByb3RhdGVcIiBpbnRlcmFjdGlvbiB3aWxsIGJlIGRpc2FibGVkLlxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLmNsaWNrVG9sZXJhbmNlPTNdIFRoZSBtYXggbnVtYmVyIG9mIHBpeGVscyBhIHVzZXIgY2FuIHNoaWZ0IHRoZSBtb3VzZSBwb2ludGVyIGR1cmluZyBhIGNsaWNrIGZvciBpdCB0byBiZSBjb25zaWRlcmVkIGEgdmFsaWQgY2xpY2sgKGFzIG9wcG9zZWQgdG8gYSBtb3VzZSBkcmFnKS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuYXR0cmlidXRpb25Db250cm9sPXRydWVdIElmIGB0cnVlYCwgYW4ge0BsaW5rIEF0dHJpYnV0aW9uQ29udHJvbH0gd2lsbCBiZSBhZGRlZCB0byB0aGUgbWFwLlxuICogQHBhcmFtIHtzdHJpbmcgfCBBcnJheTxzdHJpbmc+fSBbb3B0aW9ucy5jdXN0b21BdHRyaWJ1dGlvbl0gU3RyaW5nIG9yIHN0cmluZ3MgdG8gc2hvdyBpbiBhbiB7QGxpbmsgQXR0cmlidXRpb25Db250cm9sfS4gT25seSBhcHBsaWNhYmxlIGlmIGBvcHRpb25zLmF0dHJpYnV0aW9uQ29udHJvbGAgaXMgYHRydWVgLlxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmxvZ29Qb3NpdGlvbj0nYm90dG9tLWxlZnQnXSBBIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHBvc2l0aW9uIG9mIHRoZSBNYXBib3ggd29yZG1hcmsgb24gdGhlIG1hcC4gVmFsaWQgb3B0aW9ucyBhcmUgYHRvcC1sZWZ0YCxgdG9wLXJpZ2h0YCwgYGJvdHRvbS1sZWZ0YCwgYGJvdHRvbS1yaWdodGAuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQ9ZmFsc2VdIElmIGB0cnVlYCwgbWFwIGNyZWF0aW9uIHdpbGwgZmFpbCBpZiB0aGUgcGVyZm9ybWFuY2Ugb2YgTWFwYm94XG4gKiAgIEdMIEpTIHdvdWxkIGJlIGRyYW1hdGljYWxseSB3b3JzZSB0aGFuIGV4cGVjdGVkIChpLmUuIGEgc29mdHdhcmUgcmVuZGVyZXIgd291bGQgYmUgdXNlZCkuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnByZXNlcnZlRHJhd2luZ0J1ZmZlcj1mYWxzZV0gSWYgYHRydWVgLCB0aGUgbWFwJ3MgY2FudmFzIGNhbiBiZSBleHBvcnRlZCB0byBhIFBORyB1c2luZyBgbWFwLmdldENhbnZhcygpLnRvRGF0YVVSTCgpYC4gVGhpcyBpcyBgZmFsc2VgIGJ5IGRlZmF1bHQgYXMgYSBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24uXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmFudGlhbGlhc10gSWYgYHRydWVgLCB0aGUgZ2wgY29udGV4dCB3aWxsIGJlIGNyZWF0ZWQgd2l0aCBNU0FBIGFudGlhbGlhc2luZywgd2hpY2ggY2FuIGJlIHVzZWZ1bCBmb3IgYW50aWFsaWFzaW5nIGN1c3RvbSBsYXllcnMuIHRoaXMgaXMgYGZhbHNlYCBieSBkZWZhdWx0IGFzIGEgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uLlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5yZWZyZXNoRXhwaXJlZFRpbGVzPXRydWVdIElmIGBmYWxzZWAsIHRoZSBtYXAgd29uJ3QgYXR0ZW1wdCB0byByZS1yZXF1ZXN0IHRpbGVzIG9uY2UgdGhleSBleHBpcmUgcGVyIHRoZWlyIEhUVFAgYGNhY2hlQ29udHJvbGAvYGV4cGlyZXNgIGhlYWRlcnMuXG4gKiBAcGFyYW0ge0xuZ0xhdEJvdW5kc0xpa2V9IFtvcHRpb25zLm1heEJvdW5kc10gSWYgc2V0LCB0aGUgbWFwIHdpbGwgYmUgY29uc3RyYWluZWQgdG8gdGhlIGdpdmVuIGJvdW5kcy5cbiAqIEBwYXJhbSB7Ym9vbGVhbnxPYmplY3R9IFtvcHRpb25zLnNjcm9sbFpvb209dHJ1ZV0gSWYgYHRydWVgLCB0aGUgXCJzY3JvbGwgdG8gem9vbVwiIGludGVyYWN0aW9uIGlzIGVuYWJsZWQuIEFuIGBPYmplY3RgIHZhbHVlIGlzIHBhc3NlZCBhcyBvcHRpb25zIHRvIHtAbGluayBTY3JvbGxab29tSGFuZGxlciNlbmFibGV9LlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5ib3hab29tPXRydWVdIElmIGB0cnVlYCwgdGhlIFwiYm94IHpvb21cIiBpbnRlcmFjdGlvbiBpcyBlbmFibGVkIChzZWUge0BsaW5rIEJveFpvb21IYW5kbGVyfSkuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmRyYWdSb3RhdGU9dHJ1ZV0gSWYgYHRydWVgLCB0aGUgXCJkcmFnIHRvIHJvdGF0ZVwiIGludGVyYWN0aW9uIGlzIGVuYWJsZWQgKHNlZSB7QGxpbmsgRHJhZ1JvdGF0ZUhhbmRsZXJ9KS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuZHJhZ1Bhbj10cnVlXSBJZiBgdHJ1ZWAsIHRoZSBcImRyYWcgdG8gcGFuXCIgaW50ZXJhY3Rpb24gaXMgZW5hYmxlZCAoc2VlIHtAbGluayBEcmFnUGFuSGFuZGxlcn0pLlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5rZXlib2FyZD10cnVlXSBJZiBgdHJ1ZWAsIGtleWJvYXJkIHNob3J0Y3V0cyBhcmUgZW5hYmxlZCAoc2VlIHtAbGluayBLZXlib2FyZEhhbmRsZXJ9KS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuZG91YmxlQ2xpY2tab29tPXRydWVdIElmIGB0cnVlYCwgdGhlIFwiZG91YmxlIGNsaWNrIHRvIHpvb21cIiBpbnRlcmFjdGlvbiBpcyBlbmFibGVkIChzZWUge0BsaW5rIERvdWJsZUNsaWNrWm9vbUhhbmRsZXJ9KS5cbiAqIEBwYXJhbSB7Ym9vbGVhbnxPYmplY3R9IFtvcHRpb25zLnRvdWNoWm9vbVJvdGF0ZT10cnVlXSBJZiBgdHJ1ZWAsIHRoZSBcInBpbmNoIHRvIHJvdGF0ZSBhbmQgem9vbVwiIGludGVyYWN0aW9uIGlzIGVuYWJsZWQuIEFuIGBPYmplY3RgIHZhbHVlIGlzIHBhc3NlZCBhcyBvcHRpb25zIHRvIHtAbGluayBUb3VjaFpvb21Sb3RhdGVIYW5kbGVyI2VuYWJsZX0uXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnRyYWNrUmVzaXplPXRydWVdICBJZiBgdHJ1ZWAsIHRoZSBtYXAgd2lsbCBhdXRvbWF0aWNhbGx5IHJlc2l6ZSB3aGVuIHRoZSBicm93c2VyIHdpbmRvdyByZXNpemVzLlxuICogQHBhcmFtIHtMbmdMYXRMaWtlfSBbb3B0aW9ucy5jZW50ZXI9WzAsIDBdXSBUaGUgaW5pdGFsIGdlb2dyYXBoaWNhbCBjZW50ZXJwb2ludCBvZiB0aGUgbWFwLiBJZiBgY2VudGVyYCBpcyBub3Qgc3BlY2lmaWVkIGluIHRoZSBjb25zdHJ1Y3RvciBvcHRpb25zLCBNYXBib3ggR0wgSlMgd2lsbCBsb29rIGZvciBpdCBpbiB0aGUgbWFwJ3Mgc3R5bGUgb2JqZWN0LiBJZiBpdCBpcyBub3Qgc3BlY2lmaWVkIGluIHRoZSBzdHlsZSwgZWl0aGVyLCBpdCB3aWxsIGRlZmF1bHQgdG8gYFswLCAwXWAgTm90ZTogTWFwYm94IEdMIHVzZXMgbG9uZ2l0dWRlLCBsYXRpdHVkZSBjb29yZGluYXRlIG9yZGVyIChhcyBvcHBvc2VkIHRvIGxhdGl0dWRlLCBsb25naXR1ZGUpIHRvIG1hdGNoIEdlb0pTT04uXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMuem9vbT0wXSBUaGUgaW5pdGlhbCB6b29tIGxldmVsIG9mIHRoZSBtYXAuIElmIGB6b29tYCBpcyBub3Qgc3BlY2lmaWVkIGluIHRoZSBjb25zdHJ1Y3RvciBvcHRpb25zLCBNYXBib3ggR0wgSlMgd2lsbCBsb29rIGZvciBpdCBpbiB0aGUgbWFwJ3Mgc3R5bGUgb2JqZWN0LiBJZiBpdCBpcyBub3Qgc3BlY2lmaWVkIGluIHRoZSBzdHlsZSwgZWl0aGVyLCBpdCB3aWxsIGRlZmF1bHQgdG8gYDBgLlxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLmJlYXJpbmc9MF0gVGhlIGluaXRpYWwgYmVhcmluZyAocm90YXRpb24pIG9mIHRoZSBtYXAsIG1lYXN1cmVkIGluIGRlZ3JlZXMgY291bnRlci1jbG9ja3dpc2UgZnJvbSBub3J0aC4gSWYgYGJlYXJpbmdgIGlzIG5vdCBzcGVjaWZpZWQgaW4gdGhlIGNvbnN0cnVjdG9yIG9wdGlvbnMsIE1hcGJveCBHTCBKUyB3aWxsIGxvb2sgZm9yIGl0IGluIHRoZSBtYXAncyBzdHlsZSBvYmplY3QuIElmIGl0IGlzIG5vdCBzcGVjaWZpZWQgaW4gdGhlIHN0eWxlLCBlaXRoZXIsIGl0IHdpbGwgZGVmYXVsdCB0byBgMGAuXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMucGl0Y2g9MF0gVGhlIGluaXRpYWwgcGl0Y2ggKHRpbHQpIG9mIHRoZSBtYXAsIG1lYXN1cmVkIGluIGRlZ3JlZXMgYXdheSBmcm9tIHRoZSBwbGFuZSBvZiB0aGUgc2NyZWVuICgwLTYwKS4gSWYgYHBpdGNoYCBpcyBub3Qgc3BlY2lmaWVkIGluIHRoZSBjb25zdHJ1Y3RvciBvcHRpb25zLCBNYXBib3ggR0wgSlMgd2lsbCBsb29rIGZvciBpdCBpbiB0aGUgbWFwJ3Mgc3R5bGUgb2JqZWN0LiBJZiBpdCBpcyBub3Qgc3BlY2lmaWVkIGluIHRoZSBzdHlsZSwgZWl0aGVyLCBpdCB3aWxsIGRlZmF1bHQgdG8gYDBgLlxuICogQHBhcmFtIHtMbmdMYXRCb3VuZHNMaWtlfSBbb3B0aW9ucy5ib3VuZHNdIFRoZSBpbml0aWFsIGJvdW5kcyBvZiB0aGUgbWFwLiBJZiBgYm91bmRzYCBpcyBzcGVjaWZpZWQsIGl0IG92ZXJyaWRlcyBgY2VudGVyYCBhbmQgYHpvb21gIGNvbnN0cnVjdG9yIG9wdGlvbnMuXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMuZml0Qm91bmRzT3B0aW9uc10gQSBbYGZpdEJvdW5kc2BdKCNtYXAjZml0Ym91bmRzKSBvcHRpb25zIG9iamVjdCB0byB1c2UgX29ubHlfIHdoZW4gZml0dGluZyB0aGUgaW5pdGlhbCBgYm91bmRzYCBwcm92aWRlZCBhYm92ZS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMucmVuZGVyV29ybGRDb3BpZXM9dHJ1ZV0gIElmIGB0cnVlYCwgbXVsdGlwbGUgY29waWVzIG9mIHRoZSB3b3JsZCB3aWxsIGJlIHJlbmRlcmVkLCB3aGVuIHpvb21lZCBvdXQuXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMubWF4VGlsZUNhY2hlU2l6ZT1udWxsXSAgVGhlIG1heGltdW0gbnVtYmVyIG9mIHRpbGVzIHN0b3JlZCBpbiB0aGUgdGlsZSBjYWNoZSBmb3IgYSBnaXZlbiBzb3VyY2UuIElmIG9taXR0ZWQsIHRoZSBjYWNoZSB3aWxsIGJlIGR5bmFtaWNhbGx5IHNpemVkIGJhc2VkIG9uIHRoZSBjdXJyZW50IHZpZXdwb3J0LlxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmxvY2FsSWRlb2dyYXBoRm9udEZhbWlseT0nc2Fucy1zZXJpZiddIERlZmluZXMgYSBDU1NcbiAqICAgZm9udC1mYW1pbHkgZm9yIGxvY2FsbHkgb3ZlcnJpZGluZyBnZW5lcmF0aW9uIG9mIGdseXBocyBpbiB0aGUgJ0NKSyBVbmlmaWVkIElkZW9ncmFwaHMnIGFuZCAnSGFuZ3VsIFN5bGxhYmxlcycgcmFuZ2VzLlxuICogICBJbiB0aGVzZSByYW5nZXMsIGZvbnQgc2V0dGluZ3MgZnJvbSB0aGUgbWFwJ3Mgc3R5bGUgd2lsbCBiZSBpZ25vcmVkLCBleGNlcHQgZm9yIGZvbnQtd2VpZ2h0IGtleXdvcmRzIChsaWdodC9yZWd1bGFyL21lZGl1bS9ib2xkKS5cbiAqICAgU2V0IHRvIGBmYWxzZWAsIHRvIGVuYWJsZSBmb250IHNldHRpbmdzIGZyb20gdGhlIG1hcCdzIHN0eWxlIGZvciB0aGVzZSBnbHlwaCByYW5nZXMuXG4gKiAgIFRoZSBwdXJwb3NlIG9mIHRoaXMgb3B0aW9uIGlzIHRvIGF2b2lkIGJhbmR3aWR0aC1pbnRlbnNpdmUgZ2x5cGggc2VydmVyIHJlcXVlc3RzLiAoc2VlIFtVc2UgbG9jYWxseSBnZW5lcmF0ZWQgaWRlb2dyYXBoc10oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9sb2NhbC1pZGVvZ3JhcGhzKSlcbiAqIEBwYXJhbSB7UmVxdWVzdFRyYW5zZm9ybUZ1bmN0aW9ufSBbb3B0aW9ucy50cmFuc2Zvcm1SZXF1ZXN0PW51bGxdIEEgY2FsbGJhY2sgcnVuIGJlZm9yZSB0aGUgTWFwIG1ha2VzIGEgcmVxdWVzdCBmb3IgYW4gZXh0ZXJuYWwgVVJMLiBUaGUgY2FsbGJhY2sgY2FuIGJlIHVzZWQgdG8gbW9kaWZ5IHRoZSB1cmwsIHNldCBoZWFkZXJzLCBvciBzZXQgdGhlIGNyZWRlbnRpYWxzIHByb3BlcnR5IGZvciBjcm9zcy1vcmlnaW4gcmVxdWVzdHMuXG4gKiAgIEV4cGVjdGVkIHRvIHJldHVybiBhbiBvYmplY3Qgd2l0aCBhIGB1cmxgIHByb3BlcnR5IGFuZCBvcHRpb25hbGx5IGBoZWFkZXJzYCBhbmQgYGNyZWRlbnRpYWxzYCBwcm9wZXJ0aWVzLlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5jb2xsZWN0UmVzb3VyY2VUaW1pbmc9ZmFsc2VdIElmIGB0cnVlYCwgUmVzb3VyY2UgVGltaW5nIEFQSSBpbmZvcm1hdGlvbiB3aWxsIGJlIGNvbGxlY3RlZCBmb3IgcmVxdWVzdHMgbWFkZSBieSBHZW9KU09OIGFuZCBWZWN0b3IgVGlsZSB3ZWIgd29ya2VycyAodGhpcyBpbmZvcm1hdGlvbiBpcyBub3JtYWxseSBpbmFjY2Vzc2libGUgZnJvbSB0aGUgbWFpbiBKYXZhc2NyaXB0IHRocmVhZCkuIEluZm9ybWF0aW9uIHdpbGwgYmUgcmV0dXJuZWQgaW4gYSBgcmVzb3VyY2VUaW1pbmdgIHByb3BlcnR5IG9mIHJlbGV2YW50IGBkYXRhYCBldmVudHMuXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMuZmFkZUR1cmF0aW9uPTMwMF0gQ29udHJvbHMgdGhlIGR1cmF0aW9uIG9mIHRoZSBmYWRlLWluL2ZhZGUtb3V0IGFuaW1hdGlvbiBmb3IgbGFiZWwgY29sbGlzaW9ucywgaW4gbWlsbGlzZWNvbmRzLiBUaGlzIHNldHRpbmcgYWZmZWN0cyBhbGwgc3ltYm9sIGxheWVycy4gVGhpcyBzZXR0aW5nIGRvZXMgbm90IGFmZmVjdCB0aGUgZHVyYXRpb24gb2YgcnVudGltZSBzdHlsaW5nIHRyYW5zaXRpb25zIG9yIHJhc3RlciB0aWxlIGNyb3NzLWZhZGluZy5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuY3Jvc3NTb3VyY2VDb2xsaXNpb25zPXRydWVdIElmIGB0cnVlYCwgc3ltYm9scyBmcm9tIG11bHRpcGxlIHNvdXJjZXMgY2FuIGNvbGxpZGUgd2l0aCBlYWNoIG90aGVyIGR1cmluZyBjb2xsaXNpb24gZGV0ZWN0aW9uLiBJZiBgZmFsc2VgLCBjb2xsaXNpb24gZGV0ZWN0aW9uIGlzIHJ1biBzZXBhcmF0ZWx5IGZvciB0aGUgc3ltYm9scyBpbiBlYWNoIHNvdXJjZS5cbiAqIEBleGFtcGxlXG4gKiB2YXIgbWFwID0gbmV3IG1hcGJveGdsLk1hcCh7XG4gKiAgIGNvbnRhaW5lcjogJ21hcCcsXG4gKiAgIGNlbnRlcjogWy0xMjIuNDIwNjc5LCAzNy43NzI1MzddLFxuICogICB6b29tOiAxMyxcbiAqICAgc3R5bGU6IHN0eWxlX29iamVjdCxcbiAqICAgaGFzaDogdHJ1ZSxcbiAqICAgdHJhbnNmb3JtUmVxdWVzdDogKHVybCwgcmVzb3VyY2VUeXBlKT0+IHtcbiAqICAgICBpZihyZXNvdXJjZVR5cGUgPT09ICdTb3VyY2UnICYmIHVybC5zdGFydHNXaXRoKCdodHRwOi8vbXlIb3N0JykpIHtcbiAqICAgICAgIHJldHVybiB7XG4gKiAgICAgICAgdXJsOiB1cmwucmVwbGFjZSgnaHR0cCcsICdodHRwcycpLFxuICogICAgICAgIGhlYWRlcnM6IHsgJ215LWN1c3RvbS1oZWFkZXInOiB0cnVlfSxcbiAqICAgICAgICBjcmVkZW50aWFsczogJ2luY2x1ZGUnICAvLyBJbmNsdWRlIGNvb2tpZXMgZm9yIGNyb3NzLW9yaWdpbiByZXF1ZXN0c1xuICogICAgICB9XG4gKiAgICAgfVxuICogICB9XG4gKiB9KTtcbiAqIEBzZWUgW0Rpc3BsYXkgYSBtYXBdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGVzLylcbiAqL1xuY2xhc3MgTWFwIGV4dGVuZHMgQ2FtZXJhIHtcbiAgICBzdHlsZTogU3R5bGU7XG4gICAgcGFpbnRlcjogUGFpbnRlcjtcblxuICAgIF9jb250YWluZXI6IEhUTUxFbGVtZW50O1xuICAgIF9taXNzaW5nQ1NTQ2FuYXJ5OiBIVE1MRWxlbWVudDtcbiAgICBfY2FudmFzQ29udGFpbmVyOiBIVE1MRWxlbWVudDtcbiAgICBfY29udHJvbENvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XG4gICAgX2NvbnRyb2xQb3NpdGlvbnM6IHtbc3RyaW5nXTogSFRNTEVsZW1lbnR9O1xuICAgIF9pbnRlcmFjdGl2ZTogP2Jvb2xlYW47XG4gICAgX3Nob3dUaWxlQm91bmRhcmllczogP2Jvb2xlYW47XG4gICAgX3Nob3dDb2xsaXNpb25Cb3hlczogP2Jvb2xlYW47XG4gICAgX3Nob3dPdmVyZHJhd0luc3BlY3RvcjogYm9vbGVhbjtcbiAgICBfcmVwYWludDogP2Jvb2xlYW47XG4gICAgX3ZlcnRpY2VzOiA/Ym9vbGVhbjtcbiAgICBfY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudDtcbiAgICBfbWF4VGlsZUNhY2hlU2l6ZTogbnVtYmVyO1xuICAgIF9mcmFtZTogP0NhbmNlbGFibGU7XG4gICAgX3N0eWxlRGlydHk6ID9ib29sZWFuO1xuICAgIF9zb3VyY2VzRGlydHk6ID9ib29sZWFuO1xuICAgIF9wbGFjZW1lbnREaXJ0eTogP2Jvb2xlYW47XG4gICAgX2xvYWRlZDogYm9vbGVhbjtcbiAgICBfdHJhY2tSZXNpemU6IGJvb2xlYW47XG4gICAgX3ByZXNlcnZlRHJhd2luZ0J1ZmZlcjogYm9vbGVhbjtcbiAgICBfZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdDogYm9vbGVhbjtcbiAgICBfYW50aWFsaWFzOiBib29sZWFuO1xuICAgIF9yZWZyZXNoRXhwaXJlZFRpbGVzOiBib29sZWFuO1xuICAgIF9oYXNoOiBIYXNoO1xuICAgIF9kZWxlZ2F0ZWRMaXN0ZW5lcnM6IGFueTtcbiAgICBfZmFkZUR1cmF0aW9uOiBudW1iZXI7XG4gICAgX2Nyb3NzU291cmNlQ29sbGlzaW9uczogYm9vbGVhbjtcbiAgICBfY3Jvc3NGYWRpbmdGYWN0b3I6IG51bWJlcjtcbiAgICBfY29sbGVjdFJlc291cmNlVGltaW5nOiBib29sZWFuO1xuICAgIF9yZW5kZXJUYXNrUXVldWU6IFRhc2tRdWV1ZTtcbiAgICBfY29udHJvbHM6IEFycmF5PElDb250cm9sPjtcbiAgICBfbWFwSWQ6IG51bWJlcjtcbiAgICBfbG9jYWxJZGVvZ3JhcGhGb250RmFtaWx5OiBzdHJpbmc7XG4gICAgX3JlcXVlc3RNYW5hZ2VyOiBSZXF1ZXN0TWFuYWdlcjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBtYXAncyB7QGxpbmsgU2Nyb2xsWm9vbUhhbmRsZXJ9LCB3aGljaCBpbXBsZW1lbnRzIHpvb21pbmcgaW4gYW5kIG91dCB3aXRoIGEgc2Nyb2xsIHdoZWVsIG9yIHRyYWNrcGFkLlxuICAgICAqL1xuICAgIHNjcm9sbFpvb206IFNjcm9sbFpvb21IYW5kbGVyO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG1hcCdzIHtAbGluayBCb3hab29tSGFuZGxlcn0sIHdoaWNoIGltcGxlbWVudHMgem9vbWluZyB1c2luZyBhIGRyYWcgZ2VzdHVyZSB3aXRoIHRoZSBTaGlmdCBrZXkgcHJlc3NlZC5cbiAgICAgKi9cbiAgICBib3hab29tOiBCb3hab29tSGFuZGxlcjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBtYXAncyB7QGxpbmsgRHJhZ1JvdGF0ZUhhbmRsZXJ9LCB3aGljaCBpbXBsZW1lbnRzIHJvdGF0aW5nIHRoZSBtYXAgd2hpbGUgZHJhZ2dpbmcgd2l0aCB0aGUgcmlnaHRcbiAgICAgKiBtb3VzZSBidXR0b24gb3Igd2l0aCB0aGUgQ29udHJvbCBrZXkgcHJlc3NlZC5cbiAgICAgKi9cbiAgICBkcmFnUm90YXRlOiBEcmFnUm90YXRlSGFuZGxlcjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBtYXAncyB7QGxpbmsgRHJhZ1BhbkhhbmRsZXJ9LCB3aGljaCBpbXBsZW1lbnRzIGRyYWdnaW5nIHRoZSBtYXAgd2l0aCBhIG1vdXNlIG9yIHRvdWNoIGdlc3R1cmUuXG4gICAgICovXG4gICAgZHJhZ1BhbjogRHJhZ1BhbkhhbmRsZXI7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbWFwJ3Mge0BsaW5rIEtleWJvYXJkSGFuZGxlcn0sIHdoaWNoIGFsbG93cyB0aGUgdXNlciB0byB6b29tLCByb3RhdGUsIGFuZCBwYW4gdGhlIG1hcCB1c2luZyBrZXlib2FyZFxuICAgICAqIHNob3J0Y3V0cy5cbiAgICAgKi9cbiAgICBrZXlib2FyZDogS2V5Ym9hcmRIYW5kbGVyO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG1hcCdzIHtAbGluayBEb3VibGVDbGlja1pvb21IYW5kbGVyfSwgd2hpY2ggYWxsb3dzIHRoZSB1c2VyIHRvIHpvb20gYnkgZG91YmxlIGNsaWNraW5nLlxuICAgICAqL1xuICAgIGRvdWJsZUNsaWNrWm9vbTogRG91YmxlQ2xpY2tab29tSGFuZGxlcjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBtYXAncyB7QGxpbmsgVG91Y2hab29tUm90YXRlSGFuZGxlcn0sIHdoaWNoIGFsbG93cyB0aGUgdXNlciB0byB6b29tIG9yIHJvdGF0ZSB0aGUgbWFwIHdpdGggdG91Y2ggZ2VzdHVyZXMuXG4gICAgICovXG4gICAgdG91Y2hab29tUm90YXRlOiBUb3VjaFpvb21Sb3RhdGVIYW5kbGVyO1xuXG4gICAgY29uc3RydWN0b3Iob3B0aW9uczogTWFwT3B0aW9ucykge1xuICAgICAgICBvcHRpb25zID0gZXh0ZW5kKHt9LCBkZWZhdWx0T3B0aW9ucywgb3B0aW9ucyk7XG5cbiAgICAgICAgaWYgKG9wdGlvbnMubWluWm9vbSAhPSBudWxsICYmIG9wdGlvbnMubWF4Wm9vbSAhPSBudWxsICYmIG9wdGlvbnMubWluWm9vbSA+IG9wdGlvbnMubWF4Wm9vbSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBtYXhab29tIG11c3QgYmUgZ3JlYXRlciB0aGFuIG1pblpvb21gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybSA9IG5ldyBUcmFuc2Zvcm0ob3B0aW9ucy5taW5ab29tLCBvcHRpb25zLm1heFpvb20sIG9wdGlvbnMucmVuZGVyV29ybGRDb3BpZXMpO1xuICAgICAgICBzdXBlcih0cmFuc2Zvcm0sIG9wdGlvbnMpO1xuXG4gICAgICAgIHRoaXMuX2ludGVyYWN0aXZlID0gb3B0aW9ucy5pbnRlcmFjdGl2ZTtcbiAgICAgICAgdGhpcy5fbWF4VGlsZUNhY2hlU2l6ZSA9IG9wdGlvbnMubWF4VGlsZUNhY2hlU2l6ZTtcbiAgICAgICAgdGhpcy5fZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdCA9IG9wdGlvbnMuZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdDtcbiAgICAgICAgdGhpcy5fcHJlc2VydmVEcmF3aW5nQnVmZmVyID0gb3B0aW9ucy5wcmVzZXJ2ZURyYXdpbmdCdWZmZXI7XG4gICAgICAgIHRoaXMuX2FudGlhbGlhcyA9IG9wdGlvbnMuYW50aWFsaWFzO1xuICAgICAgICB0aGlzLl90cmFja1Jlc2l6ZSA9IG9wdGlvbnMudHJhY2tSZXNpemU7XG4gICAgICAgIHRoaXMuX2JlYXJpbmdTbmFwID0gb3B0aW9ucy5iZWFyaW5nU25hcDtcbiAgICAgICAgdGhpcy5fcmVmcmVzaEV4cGlyZWRUaWxlcyA9IG9wdGlvbnMucmVmcmVzaEV4cGlyZWRUaWxlcztcbiAgICAgICAgdGhpcy5fZmFkZUR1cmF0aW9uID0gb3B0aW9ucy5mYWRlRHVyYXRpb247XG4gICAgICAgIHRoaXMuX2Nyb3NzU291cmNlQ29sbGlzaW9ucyA9IG9wdGlvbnMuY3Jvc3NTb3VyY2VDb2xsaXNpb25zO1xuICAgICAgICB0aGlzLl9jcm9zc0ZhZGluZ0ZhY3RvciA9IDE7XG4gICAgICAgIHRoaXMuX2NvbGxlY3RSZXNvdXJjZVRpbWluZyA9IG9wdGlvbnMuY29sbGVjdFJlc291cmNlVGltaW5nO1xuICAgICAgICB0aGlzLl9yZW5kZXJUYXNrUXVldWUgPSBuZXcgVGFza1F1ZXVlKCk7XG4gICAgICAgIHRoaXMuX2NvbnRyb2xzID0gW107XG4gICAgICAgIHRoaXMuX21hcElkID0gdW5pcXVlSWQoKTtcbiAgICAgICAgdGhpcy5fcmVxdWVzdE1hbmFnZXIgPSBuZXcgUmVxdWVzdE1hbmFnZXIob3B0aW9ucy50cmFuc2Zvcm1SZXF1ZXN0KTtcblxuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMuY29udGFpbmVyID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyID0gd2luZG93LmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKG9wdGlvbnMuY29udGFpbmVyKTtcbiAgICAgICAgICAgIGlmICghdGhpcy5fY29udGFpbmVyKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb250YWluZXIgJyR7b3B0aW9ucy5jb250YWluZXJ9JyBub3QgZm91bmQuYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAob3B0aW9ucy5jb250YWluZXIgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyID0gb3B0aW9ucy5jb250YWluZXI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgdHlwZTogJ2NvbnRhaW5lcicgbXVzdCBiZSBhIFN0cmluZyBvciBIVE1MRWxlbWVudC5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zLm1heEJvdW5kcykge1xuICAgICAgICAgICAgdGhpcy5zZXRNYXhCb3VuZHMob3B0aW9ucy5tYXhCb3VuZHMpO1xuICAgICAgICB9XG5cbiAgICAgICAgYmluZEFsbChbXG4gICAgICAgICAgICAnX29uV2luZG93T25saW5lJyxcbiAgICAgICAgICAgICdfb25XaW5kb3dSZXNpemUnLFxuICAgICAgICAgICAgJ19jb250ZXh0TG9zdCcsXG4gICAgICAgICAgICAnX2NvbnRleHRSZXN0b3JlZCdcbiAgICAgICAgXSwgdGhpcyk7XG5cbiAgICAgICAgdGhpcy5fc2V0dXBDb250YWluZXIoKTtcbiAgICAgICAgdGhpcy5fc2V0dXBQYWludGVyKCk7XG4gICAgICAgIGlmICh0aGlzLnBhaW50ZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gaW5pdGlhbGl6ZSBXZWJHTC5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMub24oJ21vdmUnLCAoKSA9PiB0aGlzLl91cGRhdGUoZmFsc2UpKTtcbiAgICAgICAgdGhpcy5vbignbW92ZWVuZCcsICgpID0+IHRoaXMuX3VwZGF0ZShmYWxzZSkpO1xuICAgICAgICB0aGlzLm9uKCd6b29tJywgKCkgPT4gdGhpcy5fdXBkYXRlKHRydWUpKTtcblxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdvbmxpbmUnLCB0aGlzLl9vbldpbmRvd09ubGluZSwgZmFsc2UpO1xuICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMuX29uV2luZG93UmVzaXplLCBmYWxzZSk7XG4gICAgICAgIH1cblxuICAgICAgICBiaW5kSGFuZGxlcnModGhpcywgb3B0aW9ucyk7XG5cbiAgICAgICAgdGhpcy5faGFzaCA9IG9wdGlvbnMuaGFzaCAmJiAobmV3IEhhc2goKSkuYWRkVG8odGhpcyk7XG4gICAgICAgIC8vIGRvbid0IHNldCBwb3NpdGlvbiBmcm9tIG9wdGlvbnMgaWYgc2V0IHRocm91Z2ggaGFzaFxuICAgICAgICBpZiAoIXRoaXMuX2hhc2ggfHwgIXRoaXMuX2hhc2guX29uSGFzaENoYW5nZSgpKSB7XG4gICAgICAgICAgICB0aGlzLmp1bXBUbyh7XG4gICAgICAgICAgICAgICAgY2VudGVyOiBvcHRpb25zLmNlbnRlcixcbiAgICAgICAgICAgICAgICB6b29tOiBvcHRpb25zLnpvb20sXG4gICAgICAgICAgICAgICAgYmVhcmluZzogb3B0aW9ucy5iZWFyaW5nLFxuICAgICAgICAgICAgICAgIHBpdGNoOiBvcHRpb25zLnBpdGNoXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuYm91bmRzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXNpemUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmZpdEJvdW5kcyhvcHRpb25zLmJvdW5kcywgZXh0ZW5kKHt9LCBvcHRpb25zLmZpdEJvdW5kc09wdGlvbnMsIHsgZHVyYXRpb246IDAgfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZXNpemUoKTtcblxuICAgICAgICB0aGlzLl9sb2NhbElkZW9ncmFwaEZvbnRGYW1pbHkgPSBvcHRpb25zLmxvY2FsSWRlb2dyYXBoRm9udEZhbWlseTtcbiAgICAgICAgaWYgKG9wdGlvbnMuc3R5bGUpIHRoaXMuc2V0U3R5bGUob3B0aW9ucy5zdHlsZSwgeyBsb2NhbElkZW9ncmFwaEZvbnRGYW1pbHk6IG9wdGlvbnMubG9jYWxJZGVvZ3JhcGhGb250RmFtaWx5IH0pO1xuXG4gICAgICAgIGlmIChvcHRpb25zLmF0dHJpYnV0aW9uQ29udHJvbClcbiAgICAgICAgICAgIHRoaXMuYWRkQ29udHJvbChuZXcgQXR0cmlidXRpb25Db250cm9sKHsgY3VzdG9tQXR0cmlidXRpb246IG9wdGlvbnMuY3VzdG9tQXR0cmlidXRpb24gfSkpO1xuXG4gICAgICAgIHRoaXMuYWRkQ29udHJvbChuZXcgTG9nb0NvbnRyb2woKSwgb3B0aW9ucy5sb2dvUG9zaXRpb24pO1xuXG4gICAgICAgIHRoaXMub24oJ3N0eWxlLmxvYWQnLCAoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy50cmFuc2Zvcm0udW5tb2RpZmllZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuanVtcFRvKCh0aGlzLnN0eWxlLnN0eWxlc2hlZXQ6IGFueSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5vbignZGF0YScsIChldmVudDogTWFwRGF0YUV2ZW50KSA9PiB7XG4gICAgICAgICAgICB0aGlzLl91cGRhdGUoZXZlbnQuZGF0YVR5cGUgPT09ICdzdHlsZScpO1xuICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudChgJHtldmVudC5kYXRhVHlwZX1kYXRhYCwgZXZlbnQpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMub24oJ2RhdGFsb2FkaW5nJywgKGV2ZW50OiBNYXBEYXRhRXZlbnQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoYCR7ZXZlbnQuZGF0YVR5cGV9ZGF0YWxvYWRpbmdgLCBldmVudCkpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKlxuICAgICogUmV0dXJucyBhIHVuaXF1ZSBudW1iZXIgZm9yIHRoaXMgbWFwIGluc3RhbmNlIHdoaWNoIGlzIHVzZWQgZm9yIHRoZSBNYXBMb2FkRXZlbnRcbiAgICAqIHRvIG1ha2Ugc3VyZSB3ZSBvbmx5IGZpcmUgb25lIGV2ZW50IHBlciBpbnN0YW50aWF0ZWQgbWFwIG9iamVjdC5cbiAgICAqIEBwcml2YXRlXG4gICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgICovXG4gICAgX2dldE1hcElkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWFwSWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBhIHtAbGluayBJQ29udHJvbH0gdG8gdGhlIG1hcCwgY2FsbGluZyBgY29udHJvbC5vbkFkZCh0aGlzKWAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0lDb250cm9sfSBjb250cm9sIFRoZSB7QGxpbmsgSUNvbnRyb2x9IHRvIGFkZC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3Bvc2l0aW9uXSBwb3NpdGlvbiBvbiB0aGUgbWFwIHRvIHdoaWNoIHRoZSBjb250cm9sIHdpbGwgYmUgYWRkZWQuXG4gICAgICogVmFsaWQgdmFsdWVzIGFyZSBgJ3RvcC1sZWZ0J2AsIGAndG9wLXJpZ2h0J2AsIGAnYm90dG9tLWxlZnQnYCwgYW5kIGAnYm90dG9tLXJpZ2h0J2AuIERlZmF1bHRzIHRvIGAndG9wLXJpZ2h0J2AuXG4gICAgICogQHJldHVybnMge01hcH0gYHRoaXNgXG4gICAgICogQHNlZSBbRGlzcGxheSBtYXAgbmF2aWdhdGlvbiBjb250cm9sc10oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9uYXZpZ2F0aW9uLylcbiAgICAgKi9cbiAgICBhZGRDb250cm9sKGNvbnRyb2w6IElDb250cm9sLCBwb3NpdGlvbj86IENvbnRyb2xQb3NpdGlvbikge1xuICAgICAgICBpZiAocG9zaXRpb24gPT09IHVuZGVmaW5lZCAmJiBjb250cm9sLmdldERlZmF1bHRQb3NpdGlvbikge1xuICAgICAgICAgICAgcG9zaXRpb24gPSBjb250cm9sLmdldERlZmF1bHRQb3NpdGlvbigpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwb3NpdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBwb3NpdGlvbiA9ICd0b3AtcmlnaHQnO1xuICAgICAgICB9XG4gICAgICAgIGlmICghY29udHJvbCB8fCAhY29udHJvbC5vbkFkZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmlyZShuZXcgRXJyb3JFdmVudChuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgJ0ludmFsaWQgYXJndW1lbnQgdG8gbWFwLmFkZENvbnRyb2woKS4gQXJndW1lbnQgbXVzdCBiZSBhIGNvbnRyb2wgd2l0aCBvbkFkZCBhbmQgb25SZW1vdmUgbWV0aG9kcy4nKSkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbnRyb2xFbGVtZW50ID0gY29udHJvbC5vbkFkZCh0aGlzKTtcbiAgICAgICAgdGhpcy5fY29udHJvbHMucHVzaChjb250cm9sKTtcblxuICAgICAgICBjb25zdCBwb3NpdGlvbkNvbnRhaW5lciA9IHRoaXMuX2NvbnRyb2xQb3NpdGlvbnNbcG9zaXRpb25dO1xuICAgICAgICBpZiAocG9zaXRpb24uaW5kZXhPZignYm90dG9tJykgIT09IC0xKSB7XG4gICAgICAgICAgICBwb3NpdGlvbkNvbnRhaW5lci5pbnNlcnRCZWZvcmUoY29udHJvbEVsZW1lbnQsIHBvc2l0aW9uQ29udGFpbmVyLmZpcnN0Q2hpbGQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcG9zaXRpb25Db250YWluZXIuYXBwZW5kQ2hpbGQoY29udHJvbEVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgdGhlIGNvbnRyb2wgZnJvbSB0aGUgbWFwLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtJQ29udHJvbH0gY29udHJvbCBUaGUge0BsaW5rIElDb250cm9sfSB0byByZW1vdmUuXG4gICAgICogQHJldHVybnMge01hcH0gYHRoaXNgXG4gICAgICovXG4gICAgcmVtb3ZlQ29udHJvbChjb250cm9sOiBJQ29udHJvbCkge1xuICAgICAgICBpZiAoIWNvbnRyb2wgfHwgIWNvbnRyb2wub25SZW1vdmUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZpcmUobmV3IEVycm9yRXZlbnQobmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICdJbnZhbGlkIGFyZ3VtZW50IHRvIG1hcC5yZW1vdmVDb250cm9sKCkuIEFyZ3VtZW50IG11c3QgYmUgYSBjb250cm9sIHdpdGggb25BZGQgYW5kIG9uUmVtb3ZlIG1ldGhvZHMuJykpKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjaSA9IHRoaXMuX2NvbnRyb2xzLmluZGV4T2YoY29udHJvbCk7XG4gICAgICAgIGlmIChjaSA+IC0xKSB0aGlzLl9jb250cm9scy5zcGxpY2UoY2ksIDEpO1xuICAgICAgICBjb250cm9sLm9uUmVtb3ZlKHRoaXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNpemVzIHRoZSBtYXAgYWNjb3JkaW5nIHRvIHRoZSBkaW1lbnNpb25zIG9mIGl0c1xuICAgICAqIGBjb250YWluZXJgIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCBtdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgbWFwJ3MgYGNvbnRhaW5lcmAgaXMgcmVzaXplZCBieSBhbm90aGVyIHNjcmlwdCxcbiAgICAgKiBvciB3aGVuIHRoZSBtYXAgaXMgc2hvd24gYWZ0ZXIgYmVpbmcgaW5pdGlhbGx5IGhpZGRlbiB3aXRoIENTUy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBldmVudERhdGEgQWRkaXRpb25hbCBwcm9wZXJ0aWVzIHRvIGJlIGFkZGVkIHRvIGV2ZW50IG9iamVjdHMgb2YgZXZlbnRzIHRyaWdnZXJlZCBieSB0aGlzIG1ldGhvZC5cbiAgICAgKiBAcmV0dXJucyB7TWFwfSBgdGhpc2BcbiAgICAgKi9cbiAgICByZXNpemUoZXZlbnREYXRhPzogT2JqZWN0KSB7XG4gICAgICAgIGNvbnN0IGRpbWVuc2lvbnMgPSB0aGlzLl9jb250YWluZXJEaW1lbnNpb25zKCk7XG4gICAgICAgIGNvbnN0IHdpZHRoID0gZGltZW5zaW9uc1swXTtcbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gZGltZW5zaW9uc1sxXTtcblxuICAgICAgICB0aGlzLl9yZXNpemVDYW52YXMod2lkdGgsIGhlaWdodCk7XG4gICAgICAgIHRoaXMudHJhbnNmb3JtLnJlc2l6ZSh3aWR0aCwgaGVpZ2h0KTtcbiAgICAgICAgdGhpcy5wYWludGVyLnJlc2l6ZSh3aWR0aCwgaGVpZ2h0KTtcblxuICAgICAgICB0aGlzLmZpcmUobmV3IEV2ZW50KCdtb3Zlc3RhcnQnLCBldmVudERhdGEpKVxuICAgICAgICAgICAgLmZpcmUobmV3IEV2ZW50KCdtb3ZlJywgZXZlbnREYXRhKSlcbiAgICAgICAgICAgIC5maXJlKG5ldyBFdmVudCgncmVzaXplJywgZXZlbnREYXRhKSlcbiAgICAgICAgICAgIC5maXJlKG5ldyBFdmVudCgnbW92ZWVuZCcsIGV2ZW50RGF0YSkpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBtYXAncyBnZW9ncmFwaGljYWwgYm91bmRzLiBXaGVuIHRoZSBiZWFyaW5nIG9yIHBpdGNoIGlzIG5vbi16ZXJvLCB0aGUgdmlzaWJsZSByZWdpb24gaXMgbm90XG4gICAgICogYW4gYXhpcy1hbGlnbmVkIHJlY3RhbmdsZSwgYW5kIHRoZSByZXN1bHQgaXMgdGhlIHNtYWxsZXN0IGJvdW5kcyB0aGF0IGVuY29tcGFzc2VzIHRoZSB2aXNpYmxlIHJlZ2lvbi5cbiAgICAgKi9cbiAgICBnZXRCb3VuZHMoKTogTG5nTGF0Qm91bmRzIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtLmdldEJvdW5kcygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIG1heGltdW0gZ2VvZ3JhcGhpY2FsIGJvdW5kcyB0aGUgbWFwIGlzIGNvbnN0cmFpbmVkIHRvLCBvciBgbnVsbGAgaWYgbm9uZSBzZXQuXG4gICAgICovXG4gICAgZ2V0TWF4Qm91bmRzKCk6IExuZ0xhdEJvdW5kcyB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm0uZ2V0TWF4Qm91bmRzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBvciBjbGVhcnMgdGhlIG1hcCdzIGdlb2dyYXBoaWNhbCBib3VuZHMuXG4gICAgICpcbiAgICAgKiBQYW4gYW5kIHpvb20gb3BlcmF0aW9ucyBhcmUgY29uc3RyYWluZWQgd2l0aGluIHRoZXNlIGJvdW5kcy5cbiAgICAgKiBJZiBhIHBhbiBvciB6b29tIGlzIHBlcmZvcm1lZCB0aGF0IHdvdWxkXG4gICAgICogZGlzcGxheSByZWdpb25zIG91dHNpZGUgdGhlc2UgYm91bmRzLCB0aGUgbWFwIHdpbGxcbiAgICAgKiBpbnN0ZWFkIGRpc3BsYXkgYSBwb3NpdGlvbiBhbmQgem9vbSBsZXZlbFxuICAgICAqIGFzIGNsb3NlIGFzIHBvc3NpYmxlIHRvIHRoZSBvcGVyYXRpb24ncyByZXF1ZXN0IHdoaWxlIHN0aWxsXG4gICAgICogcmVtYWluaW5nIHdpdGhpbiB0aGUgYm91bmRzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtMbmdMYXRCb3VuZHNMaWtlIHwgbnVsbCB8IHVuZGVmaW5lZH0gYm91bmRzIFRoZSBtYXhpbXVtIGJvdW5kcyB0byBzZXQuIElmIGBudWxsYCBvciBgdW5kZWZpbmVkYCBpcyBwcm92aWRlZCwgdGhlIGZ1bmN0aW9uIHJlbW92ZXMgdGhlIG1hcCdzIG1heGltdW0gYm91bmRzLlxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxuICAgICAqL1xuICAgIHNldE1heEJvdW5kcyhib3VuZHM6IExuZ0xhdEJvdW5kc0xpa2UpIHtcbiAgICAgICAgdGhpcy50cmFuc2Zvcm0uc2V0TWF4Qm91bmRzKExuZ0xhdEJvdW5kcy5jb252ZXJ0KGJvdW5kcykpO1xuICAgICAgICByZXR1cm4gdGhpcy5fdXBkYXRlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBvciBjbGVhcnMgdGhlIG1hcCdzIG1pbmltdW0gem9vbSBsZXZlbC5cbiAgICAgKiBJZiB0aGUgbWFwJ3MgY3VycmVudCB6b29tIGxldmVsIGlzIGxvd2VyIHRoYW4gdGhlIG5ldyBtaW5pbXVtLFxuICAgICAqIHRoZSBtYXAgd2lsbCB6b29tIHRvIHRoZSBuZXcgbWluaW11bS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZH0gbWluWm9vbSBUaGUgbWluaW11bSB6b29tIGxldmVsIHRvIHNldCAoMC0yNCkuXG4gICAgICogICBJZiBgbnVsbGAgb3IgYHVuZGVmaW5lZGAgaXMgcHJvdmlkZWQsIHRoZSBmdW5jdGlvbiByZW1vdmVzIHRoZSBjdXJyZW50IG1pbmltdW0gem9vbSAoaS5lLiBzZXRzIGl0IHRvIDApLlxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxuICAgICAqL1xuICAgIHNldE1pblpvb20obWluWm9vbT86ID9udW1iZXIpIHtcblxuICAgICAgICBtaW5ab29tID0gbWluWm9vbSA9PT0gbnVsbCB8fCBtaW5ab29tID09PSB1bmRlZmluZWQgPyBkZWZhdWx0TWluWm9vbSA6IG1pblpvb207XG5cbiAgICAgICAgaWYgKG1pblpvb20gPj0gZGVmYXVsdE1pblpvb20gJiYgbWluWm9vbSA8PSB0aGlzLnRyYW5zZm9ybS5tYXhab29tKSB7XG4gICAgICAgICAgICB0aGlzLnRyYW5zZm9ybS5taW5ab29tID0gbWluWm9vbTtcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZSgpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5nZXRab29tKCkgPCBtaW5ab29tKSB0aGlzLnNldFpvb20obWluWm9vbSk7XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuXG4gICAgICAgIH0gZWxzZSB0aHJvdyBuZXcgRXJyb3IoYG1pblpvb20gbXVzdCBiZSBiZXR3ZWVuICR7ZGVmYXVsdE1pblpvb219IGFuZCB0aGUgY3VycmVudCBtYXhab29tLCBpbmNsdXNpdmVgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBtYXAncyBtaW5pbXVtIGFsbG93YWJsZSB6b29tIGxldmVsLlxuICAgICAqXG4gICAgICogQHJldHVybnMge251bWJlcn0gbWluWm9vbVxuICAgICAqL1xuICAgIGdldE1pblpvb20oKSB7IHJldHVybiB0aGlzLnRyYW5zZm9ybS5taW5ab29tOyB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIG9yIGNsZWFycyB0aGUgbWFwJ3MgbWF4aW11bSB6b29tIGxldmVsLlxuICAgICAqIElmIHRoZSBtYXAncyBjdXJyZW50IHpvb20gbGV2ZWwgaXMgaGlnaGVyIHRoYW4gdGhlIG5ldyBtYXhpbXVtLFxuICAgICAqIHRoZSBtYXAgd2lsbCB6b29tIHRvIHRoZSBuZXcgbWF4aW11bS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZH0gbWF4Wm9vbSBUaGUgbWF4aW11bSB6b29tIGxldmVsIHRvIHNldC5cbiAgICAgKiAgIElmIGBudWxsYCBvciBgdW5kZWZpbmVkYCBpcyBwcm92aWRlZCwgdGhlIGZ1bmN0aW9uIHJlbW92ZXMgdGhlIGN1cnJlbnQgbWF4aW11bSB6b29tIChzZXRzIGl0IHRvIDIyKS5cbiAgICAgKiBAcmV0dXJucyB7TWFwfSBgdGhpc2BcbiAgICAgKi9cbiAgICBzZXRNYXhab29tKG1heFpvb20/OiA/bnVtYmVyKSB7XG5cbiAgICAgICAgbWF4Wm9vbSA9IG1heFpvb20gPT09IG51bGwgfHwgbWF4Wm9vbSA9PT0gdW5kZWZpbmVkID8gZGVmYXVsdE1heFpvb20gOiBtYXhab29tO1xuXG4gICAgICAgIGlmIChtYXhab29tID49IHRoaXMudHJhbnNmb3JtLm1pblpvb20pIHtcbiAgICAgICAgICAgIHRoaXMudHJhbnNmb3JtLm1heFpvb20gPSBtYXhab29tO1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlKCk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmdldFpvb20oKSA+IG1heFpvb20pIHRoaXMuc2V0Wm9vbShtYXhab29tKTtcblxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG5cbiAgICAgICAgfSBlbHNlIHRocm93IG5ldyBFcnJvcihgbWF4Wm9vbSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB0aGUgY3VycmVudCBtaW5ab29tYCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgc3RhdGUgb2YgcmVuZGVyV29ybGRDb3BpZXMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gcmVuZGVyV29ybGRDb3BpZXNcbiAgICAgKi9cbiAgICBnZXRSZW5kZXJXb3JsZENvcGllcygpIHsgcmV0dXJuIHRoaXMudHJhbnNmb3JtLnJlbmRlcldvcmxkQ29waWVzOyB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBzdGF0ZSBvZiByZW5kZXJXb3JsZENvcGllcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gcmVuZGVyV29ybGRDb3BpZXMgSWYgYHRydWVgLCBtdWx0aXBsZSBjb3BpZXMgb2YgdGhlIHdvcmxkIHdpbGwgYmUgcmVuZGVyZWQsIHdoZW4gem9vbWVkIG91dC4gYHVuZGVmaW5lZGAgaXMgdHJlYXRlZCBhcyBgdHJ1ZWAsIGBudWxsYCBpcyB0cmVhdGVkIGFzIGBmYWxzZWAuXG4gICAgICogQHJldHVybnMge01hcH0gYHRoaXNgXG4gICAgICovXG4gICAgc2V0UmVuZGVyV29ybGRDb3BpZXMocmVuZGVyV29ybGRDb3BpZXM/OiA/Ym9vbGVhbikge1xuICAgICAgICB0aGlzLnRyYW5zZm9ybS5yZW5kZXJXb3JsZENvcGllcyA9IHJlbmRlcldvcmxkQ29waWVzO1xuICAgICAgICByZXR1cm4gdGhpcy5fdXBkYXRlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgbWFwJ3MgbWF4aW11bSBhbGxvd2FibGUgem9vbSBsZXZlbC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IG1heFpvb21cbiAgICAgKi9cbiAgICBnZXRNYXhab29tKCkgeyByZXR1cm4gdGhpcy50cmFuc2Zvcm0ubWF4Wm9vbTsgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHtAbGluayBQb2ludH0gcmVwcmVzZW50aW5nIHBpeGVsIGNvb3JkaW5hdGVzLCByZWxhdGl2ZSB0byB0aGUgbWFwJ3MgYGNvbnRhaW5lcmAsXG4gICAgICogdGhhdCBjb3JyZXNwb25kIHRvIHRoZSBzcGVjaWZpZWQgZ2VvZ3JhcGhpY2FsIGxvY2F0aW9uLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtMbmdMYXRMaWtlfSBsbmdsYXQgVGhlIGdlb2dyYXBoaWNhbCBsb2NhdGlvbiB0byBwcm9qZWN0LlxuICAgICAqIEByZXR1cm5zIHtQb2ludH0gVGhlIHtAbGluayBQb2ludH0gY29ycmVzcG9uZGluZyB0byBgbG5nbGF0YCwgcmVsYXRpdmUgdG8gdGhlIG1hcCdzIGBjb250YWluZXJgLlxuICAgICAqL1xuICAgIHByb2plY3QobG5nbGF0OiBMbmdMYXRMaWtlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybS5sb2NhdGlvblBvaW50KExuZ0xhdC5jb252ZXJ0KGxuZ2xhdCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSB7QGxpbmsgTG5nTGF0fSByZXByZXNlbnRpbmcgZ2VvZ3JhcGhpY2FsIGNvb3JkaW5hdGVzIHRoYXQgY29ycmVzcG9uZFxuICAgICAqIHRvIHRoZSBzcGVjaWZpZWQgcGl4ZWwgY29vcmRpbmF0ZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1BvaW50TGlrZX0gcG9pbnQgVGhlIHBpeGVsIGNvb3JkaW5hdGVzIHRvIHVucHJvamVjdC5cbiAgICAgKiBAcmV0dXJucyB7TG5nTGF0fSBUaGUge0BsaW5rIExuZ0xhdH0gY29ycmVzcG9uZGluZyB0byBgcG9pbnRgLlxuICAgICAqIEBzZWUgW1Nob3cgcG9seWdvbiBpbmZvcm1hdGlvbiBvbiBjbGlja10oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9wb2x5Z29uLXBvcHVwLW9uLWNsaWNrLylcbiAgICAgKi9cbiAgICB1bnByb2plY3QocG9pbnQ6IFBvaW50TGlrZSkge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm0ucG9pbnRMb2NhdGlvbihQb2ludC5jb252ZXJ0KHBvaW50KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBtYXAgaXMgcGFubmluZywgem9vbWluZywgcm90YXRpbmcsIG9yIHBpdGNoaW5nIGR1ZSB0byBhIGNhbWVyYSBhbmltYXRpb24gb3IgdXNlciBnZXN0dXJlLlxuICAgICAqL1xuICAgIGlzTW92aW5nKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fbW92aW5nIHx8XG4gICAgICAgICAgICB0aGlzLmRyYWdQYW4uaXNBY3RpdmUoKSB8fFxuICAgICAgICAgICAgdGhpcy5kcmFnUm90YXRlLmlzQWN0aXZlKCkgfHxcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsWm9vbS5pc0FjdGl2ZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgbWFwIGlzIHpvb21pbmcgZHVlIHRvIGEgY2FtZXJhIGFuaW1hdGlvbiBvciB1c2VyIGdlc3R1cmUuXG4gICAgICovXG4gICAgaXNab29taW5nKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fem9vbWluZyB8fFxuICAgICAgICAgICAgdGhpcy5zY3JvbGxab29tLmlzWm9vbWluZygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgbWFwIGlzIHJvdGF0aW5nIGR1ZSB0byBhIGNhbWVyYSBhbmltYXRpb24gb3IgdXNlciBnZXN0dXJlLlxuICAgICAqL1xuICAgIGlzUm90YXRpbmcoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yb3RhdGluZyB8fFxuICAgICAgICAgICAgdGhpcy5kcmFnUm90YXRlLmlzQWN0aXZlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBhIGxpc3RlbmVyIGZvciBldmVudHMgb2YgYSBzcGVjaWZpZWQgdHlwZS5cbiAgICAgKlxuICAgICAqIEBtZXRob2RcbiAgICAgKiBAbmFtZSBvblxuICAgICAqIEBtZW1iZXJvZiBNYXBcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSBUaGUgZXZlbnQgdHlwZSB0byBhZGQgYSBsaXN0ZW4gZm9yLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGxpc3RlbmVyIFRoZSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgd2hlbiB0aGUgZXZlbnQgaXMgZmlyZWQuXG4gICAgICogICBUaGUgbGlzdGVuZXIgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGggdGhlIGRhdGEgb2JqZWN0IHBhc3NlZCB0byBgZmlyZWAsXG4gICAgICogICBleHRlbmRlZCB3aXRoIGB0YXJnZXRgIGFuZCBgdHlwZWAgcHJvcGVydGllcy5cbiAgICAgKiBAcmV0dXJucyB7TWFwfSBgdGhpc2BcbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBsaXN0ZW5lciBmb3IgZXZlbnRzIG9mIGEgc3BlY2lmaWVkIHR5cGUgb2NjdXJyaW5nIG9uIGZlYXR1cmVzIGluIGEgc3BlY2lmaWVkIHN0eWxlIGxheWVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgVGhlIGV2ZW50IHR5cGUgdG8gbGlzdGVuIGZvcjsgb25lIG9mIGAnbW91c2Vkb3duJ2AsIGAnbW91c2V1cCdgLCBgJ2NsaWNrJ2AsIGAnZGJsY2xpY2snYCxcbiAgICAgKiBgJ21vdXNlbW92ZSdgLCBgJ21vdXNlZW50ZXInYCwgYCdtb3VzZWxlYXZlJ2AsIGAnbW91c2VvdmVyJ2AsIGAnbW91c2VvdXQnYCwgYCdjb250ZXh0bWVudSdgLCBgJ3RvdWNoc3RhcnQnYCxcbiAgICAgKiBgJ3RvdWNoZW5kJ2AsIG9yIGAndG91Y2hjYW5jZWwnYC4gYG1vdXNlZW50ZXJgIGFuZCBgbW91c2VvdmVyYCBldmVudHMgYXJlIHRyaWdnZXJlZCB3aGVuIHRoZSBjdXJzb3IgZW50ZXJzXG4gICAgICogYSB2aXNpYmxlIHBvcnRpb24gb2YgdGhlIHNwZWNpZmllZCBsYXllciBmcm9tIG91dHNpZGUgdGhhdCBsYXllciBvciBvdXRzaWRlIHRoZSBtYXAgY2FudmFzLiBgbW91c2VsZWF2ZWBcbiAgICAgKiBhbmQgYG1vdXNlb3V0YCBldmVudHMgYXJlIHRyaWdnZXJlZCB3aGVuIHRoZSBjdXJzb3IgbGVhdmVzIGEgdmlzaWJsZSBwb3J0aW9uIG9mIHRoZSBzcGVjaWZpZWQgbGF5ZXIsIG9yIGxlYXZlc1xuICAgICAqIHRoZSBtYXAgY2FudmFzLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBsYXllcklkIFRoZSBJRCBvZiBhIHN0eWxlIGxheWVyLiBPbmx5IGV2ZW50cyB3aG9zZSBsb2NhdGlvbiBpcyB3aXRoaW4gYSB2aXNpYmxlXG4gICAgICogZmVhdHVyZSBpbiB0aGlzIGxheWVyIHdpbGwgdHJpZ2dlciB0aGUgbGlzdGVuZXIuIFRoZSBldmVudCB3aWxsIGhhdmUgYSBgZmVhdHVyZXNgIHByb3BlcnR5IGNvbnRhaW5pbmdcbiAgICAgKiBhbiBhcnJheSBvZiB0aGUgbWF0Y2hpbmcgZmVhdHVyZXMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gbGlzdGVuZXIgVGhlIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBldmVudCBpcyBmaXJlZC5cbiAgICAgKiBAcmV0dXJucyB7TWFwfSBgdGhpc2BcbiAgICAgKi9cbiAgICBvbih0eXBlOiBNYXBFdmVudCwgbGF5ZXJJZDogYW55LCBsaXN0ZW5lcjogYW55KSB7XG4gICAgICAgIGlmIChsaXN0ZW5lciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gc3VwZXIub24odHlwZSwgbGF5ZXJJZCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkZWxlZ2F0ZWRMaXN0ZW5lciA9ICgoKSA9PiB7XG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gJ21vdXNlZW50ZXInIHx8IHR5cGUgPT09ICdtb3VzZW92ZXInKSB7XG4gICAgICAgICAgICAgICAgbGV0IG1vdXNlaW4gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBjb25zdCBtb3VzZW1vdmUgPSAoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmZWF0dXJlcyA9IHRoaXMuZ2V0TGF5ZXIobGF5ZXJJZCkgPyB0aGlzLnF1ZXJ5UmVuZGVyZWRGZWF0dXJlcyhlLnBvaW50LCB7bGF5ZXJzOiBbbGF5ZXJJZF19KSA6IFtdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWZlYXR1cmVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbW91c2VpbiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFtb3VzZWluKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtb3VzZWluID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLmNhbGwodGhpcywgbmV3IE1hcE1vdXNlRXZlbnQodHlwZSwgdGhpcywgZS5vcmlnaW5hbEV2ZW50LCB7ZmVhdHVyZXN9KSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGNvbnN0IG1vdXNlb3V0ID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBtb3VzZWluID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICByZXR1cm4ge2xheWVyOiBsYXllcklkLCBsaXN0ZW5lciwgZGVsZWdhdGVzOiB7bW91c2Vtb3ZlLCBtb3VzZW91dH19O1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnbW91c2VsZWF2ZScgfHwgdHlwZSA9PT0gJ21vdXNlb3V0Jykge1xuICAgICAgICAgICAgICAgIGxldCBtb3VzZWluID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgY29uc3QgbW91c2Vtb3ZlID0gKGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmVhdHVyZXMgPSB0aGlzLmdldExheWVyKGxheWVySWQpID8gdGhpcy5xdWVyeVJlbmRlcmVkRmVhdHVyZXMoZS5wb2ludCwge2xheWVyczogW2xheWVySWRdfSkgOiBbXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZlYXR1cmVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbW91c2VpbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobW91c2Vpbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbW91c2VpbiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIuY2FsbCh0aGlzLCBuZXcgTWFwTW91c2VFdmVudCh0eXBlLCB0aGlzLCBlLm9yaWdpbmFsRXZlbnQpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgY29uc3QgbW91c2VvdXQgPSAoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAobW91c2Vpbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbW91c2VpbiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIuY2FsbCh0aGlzLCBuZXcgTWFwTW91c2VFdmVudCh0eXBlLCB0aGlzLCBlLm9yaWdpbmFsRXZlbnQpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtsYXllcjogbGF5ZXJJZCwgbGlzdGVuZXIsIGRlbGVnYXRlczoge21vdXNlbW92ZSwgbW91c2VvdXR9fTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGVsZWdhdGUgPSAoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmZWF0dXJlcyA9IHRoaXMuZ2V0TGF5ZXIobGF5ZXJJZCkgPyB0aGlzLnF1ZXJ5UmVuZGVyZWRGZWF0dXJlcyhlLnBvaW50LCB7bGF5ZXJzOiBbbGF5ZXJJZF19KSA6IFtdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZmVhdHVyZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBIZXJlIHdlIG5lZWQgdG8gbXV0YXRlIHRoZSBvcmlnaW5hbCBldmVudCwgc28gdGhhdCBwcmV2ZW50RGVmYXVsdCB3b3JrcyBhcyBleHBlY3RlZC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGUuZmVhdHVyZXMgPSBmZWF0dXJlcztcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLmNhbGwodGhpcywgZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgZS5mZWF0dXJlcztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtsYXllcjogbGF5ZXJJZCwgbGlzdGVuZXIsIGRlbGVnYXRlczoge1t0eXBlXTogZGVsZWdhdGV9fTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkoKTtcblxuICAgICAgICB0aGlzLl9kZWxlZ2F0ZWRMaXN0ZW5lcnMgPSB0aGlzLl9kZWxlZ2F0ZWRMaXN0ZW5lcnMgfHwge307XG4gICAgICAgIHRoaXMuX2RlbGVnYXRlZExpc3RlbmVyc1t0eXBlXSA9IHRoaXMuX2RlbGVnYXRlZExpc3RlbmVyc1t0eXBlXSB8fCBbXTtcbiAgICAgICAgdGhpcy5fZGVsZWdhdGVkTGlzdGVuZXJzW3R5cGVdLnB1c2goZGVsZWdhdGVkTGlzdGVuZXIpO1xuXG4gICAgICAgIGZvciAoY29uc3QgZXZlbnQgaW4gZGVsZWdhdGVkTGlzdGVuZXIuZGVsZWdhdGVzKSB7XG4gICAgICAgICAgICB0aGlzLm9uKChldmVudDogYW55KSwgZGVsZWdhdGVkTGlzdGVuZXIuZGVsZWdhdGVzW2V2ZW50XSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGFuIGV2ZW50IGxpc3RlbmVyIHByZXZpb3VzbHkgYWRkZWQgd2l0aCBgTWFwI29uYC5cbiAgICAgKlxuICAgICAqIEBtZXRob2RcbiAgICAgKiBAbmFtZSBvZmZcbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgVGhlIGV2ZW50IHR5cGUgcHJldmlvdXNseSB1c2VkIHRvIGluc3RhbGwgdGhlIGxpc3RlbmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGxpc3RlbmVyIFRoZSBmdW5jdGlvbiBwcmV2aW91c2x5IGluc3RhbGxlZCBhcyBhIGxpc3RlbmVyLlxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhbiBldmVudCBsaXN0ZW5lciBmb3IgbGF5ZXItc3BlY2lmaWMgZXZlbnRzIHByZXZpb3VzbHkgYWRkZWQgd2l0aCBgTWFwI29uYC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIFRoZSBldmVudCB0eXBlIHByZXZpb3VzbHkgdXNlZCB0byBpbnN0YWxsIHRoZSBsaXN0ZW5lci5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbGF5ZXJJZCBUaGUgbGF5ZXIgSUQgcHJldmlvdXNseSB1c2VkIHRvIGluc3RhbGwgdGhlIGxpc3RlbmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGxpc3RlbmVyIFRoZSBmdW5jdGlvbiBwcmV2aW91c2x5IGluc3RhbGxlZCBhcyBhIGxpc3RlbmVyLlxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxuICAgICAqL1xuICAgIG9mZih0eXBlOiBNYXBFdmVudCwgbGF5ZXJJZDogYW55LCBsaXN0ZW5lcjogYW55KSB7XG4gICAgICAgIGlmIChsaXN0ZW5lciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gc3VwZXIub2ZmKHR5cGUsIGxheWVySWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX2RlbGVnYXRlZExpc3RlbmVycyAmJiB0aGlzLl9kZWxlZ2F0ZWRMaXN0ZW5lcnNbdHlwZV0pIHtcbiAgICAgICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IHRoaXMuX2RlbGVnYXRlZExpc3RlbmVyc1t0eXBlXTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGVsZWdhdGVkTGlzdGVuZXIgPSBsaXN0ZW5lcnNbaV07XG4gICAgICAgICAgICAgICAgaWYgKGRlbGVnYXRlZExpc3RlbmVyLmxheWVyID09PSBsYXllcklkICYmIGRlbGVnYXRlZExpc3RlbmVyLmxpc3RlbmVyID09PSBsaXN0ZW5lcikge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGV2ZW50IGluIGRlbGVnYXRlZExpc3RlbmVyLmRlbGVnYXRlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vZmYoKGV2ZW50OiBhbnkpLCBkZWxlZ2F0ZWRMaXN0ZW5lci5kZWxlZ2F0ZXNbZXZlbnRdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcnMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIFtHZW9KU09OXShodHRwOi8vZ2VvanNvbi5vcmcvKVxuICAgICAqIFtGZWF0dXJlIG9iamVjdHNdKGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3OTQ2I3NlY3Rpb24tMy4yKVxuICAgICAqIHJlcHJlc2VudGluZyB2aXNpYmxlIGZlYXR1cmVzIHRoYXQgc2F0aXNmeSB0aGUgcXVlcnkgcGFyYW1ldGVycy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UG9pbnRMaWtlfEFycmF5PFBvaW50TGlrZT59IFtnZW9tZXRyeV0gLSBUaGUgZ2VvbWV0cnkgb2YgdGhlIHF1ZXJ5IHJlZ2lvbjpcbiAgICAgKiBlaXRoZXIgYSBzaW5nbGUgcG9pbnQgb3Igc291dGh3ZXN0IGFuZCBub3J0aGVhc3QgcG9pbnRzIGRlc2NyaWJpbmcgYSBib3VuZGluZyBib3guXG4gICAgICogT21pdHRpbmcgdGhpcyBwYXJhbWV0ZXIgKGkuZS4gY2FsbGluZyB7QGxpbmsgTWFwI3F1ZXJ5UmVuZGVyZWRGZWF0dXJlc30gd2l0aCB6ZXJvIGFyZ3VtZW50cyxcbiAgICAgKiBvciB3aXRoIG9ubHkgYSBgb3B0aW9uc2AgYXJndW1lbnQpIGlzIGVxdWl2YWxlbnQgdG8gcGFzc2luZyBhIGJvdW5kaW5nIGJveCBlbmNvbXBhc3NpbmcgdGhlIGVudGlyZVxuICAgICAqIG1hcCB2aWV3cG9ydC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAgICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBbb3B0aW9ucy5sYXllcnNdIEFuIGFycmF5IG9mIHN0eWxlIGxheWVyIElEcyBmb3IgdGhlIHF1ZXJ5IHRvIGluc3BlY3QuXG4gICAgICogICBPbmx5IGZlYXR1cmVzIHdpdGhpbiB0aGVzZSBsYXllcnMgd2lsbCBiZSByZXR1cm5lZC4gSWYgdGhpcyBwYXJhbWV0ZXIgaXMgdW5kZWZpbmVkLCBhbGwgbGF5ZXJzIHdpbGwgYmUgY2hlY2tlZC5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbb3B0aW9ucy5maWx0ZXJdIEEgW2ZpbHRlcl0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvc3R5bGUtc3BlYy8jb3RoZXItZmlsdGVyKVxuICAgICAqICAgdG8gbGltaXQgcXVlcnkgcmVzdWx0cy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtBcnJheTxPYmplY3Q+fSBBbiBhcnJheSBvZiBbR2VvSlNPTl0oaHR0cDovL2dlb2pzb24ub3JnLylcbiAgICAgKiBbZmVhdHVyZSBvYmplY3RzXShodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzk0NiNzZWN0aW9uLTMuMikuXG4gICAgICpcbiAgICAgKiBUaGUgYHByb3BlcnRpZXNgIHZhbHVlIG9mIGVhY2ggcmV0dXJuZWQgZmVhdHVyZSBvYmplY3QgY29udGFpbnMgdGhlIHByb3BlcnRpZXMgb2YgaXRzIHNvdXJjZSBmZWF0dXJlLiBGb3IgR2VvSlNPTiBzb3VyY2VzLCBvbmx5XG4gICAgICogc3RyaW5nIGFuZCBudW1lcmljIHByb3BlcnR5IHZhbHVlcyBhcmUgc3VwcG9ydGVkIChpLmUuIGBudWxsYCwgYEFycmF5YCwgYW5kIGBPYmplY3RgIHZhbHVlcyBhcmUgbm90IHN1cHBvcnRlZCkuXG4gICAgICpcbiAgICAgKiBFYWNoIGZlYXR1cmUgaW5jbHVkZXMgdG9wLWxldmVsIGBsYXllcmAsIGBzb3VyY2VgLCBhbmQgYHNvdXJjZUxheWVyYCBwcm9wZXJ0aWVzLiBUaGUgYGxheWVyYCBwcm9wZXJ0eSBpcyBhbiBvYmplY3RcbiAgICAgKiByZXByZXNlbnRpbmcgdGhlIHN0eWxlIGxheWVyIHRvICB3aGljaCB0aGUgZmVhdHVyZSBiZWxvbmdzLiBMYXlvdXQgYW5kIHBhaW50IHByb3BlcnRpZXMgaW4gdGhpcyBvYmplY3QgY29udGFpbiB2YWx1ZXNcbiAgICAgKiB3aGljaCBhcmUgZnVsbHkgZXZhbHVhdGVkIGZvciB0aGUgZ2l2ZW4gem9vbSBsZXZlbCBhbmQgZmVhdHVyZS5cbiAgICAgKlxuICAgICAqIEZlYXR1cmVzIGZyb20gbGF5ZXJzIHdob3NlIGB2aXNpYmlsaXR5YCBwcm9wZXJ0eSBpcyBgXCJub25lXCJgLCBvciBmcm9tIGxheWVycyB3aG9zZSB6b29tIHJhbmdlIGV4Y2x1ZGVzIHRoZVxuICAgICAqIGN1cnJlbnQgem9vbSBsZXZlbCBhcmUgbm90IGluY2x1ZGVkLiBTeW1ib2wgZmVhdHVyZXMgdGhhdCBoYXZlIGJlZW4gaGlkZGVuIGR1ZSB0byB0ZXh0IG9yIGljb24gY29sbGlzaW9uIGFyZVxuICAgICAqIG5vdCBpbmNsdWRlZC4gRmVhdHVyZXMgZnJvbSBhbGwgb3RoZXIgbGF5ZXJzIGFyZSBpbmNsdWRlZCwgaW5jbHVkaW5nIGZlYXR1cmVzIHRoYXQgbWF5IGhhdmUgbm8gdmlzaWJsZVxuICAgICAqIGNvbnRyaWJ1dGlvbiB0byB0aGUgcmVuZGVyZWQgcmVzdWx0OyBmb3IgZXhhbXBsZSwgYmVjYXVzZSB0aGUgbGF5ZXIncyBvcGFjaXR5IG9yIGNvbG9yIGFscGhhIGNvbXBvbmVudCBpcyBzZXQgdG9cbiAgICAgKiAwLlxuICAgICAqXG4gICAgICogVGhlIHRvcG1vc3QgcmVuZGVyZWQgZmVhdHVyZSBhcHBlYXJzIGZpcnN0IGluIHRoZSByZXR1cm5lZCBhcnJheSwgYW5kIHN1YnNlcXVlbnQgZmVhdHVyZXMgYXJlIHNvcnRlZCBieVxuICAgICAqIGRlc2NlbmRpbmcgei1vcmRlci4gRmVhdHVyZXMgdGhhdCBhcmUgcmVuZGVyZWQgbXVsdGlwbGUgdGltZXMgKGR1ZSB0byB3cmFwcGluZyBhY3Jvc3MgdGhlIGFudGltZXJpZGlhbiBhdCBsb3dcbiAgICAgKiB6b29tIGxldmVscykgYXJlIHJldHVybmVkIG9ubHkgb25jZSAodGhvdWdoIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjYXZlYXQpLlxuICAgICAqXG4gICAgICogQmVjYXVzZSBmZWF0dXJlcyBjb21lIGZyb20gdGlsZWQgdmVjdG9yIGRhdGEgb3IgR2VvSlNPTiBkYXRhIHRoYXQgaXMgY29udmVydGVkIHRvIHRpbGVzIGludGVybmFsbHksIGZlYXR1cmVcbiAgICAgKiBnZW9tZXRyaWVzIG1heSBiZSBzcGxpdCBvciBkdXBsaWNhdGVkIGFjcm9zcyB0aWxlIGJvdW5kYXJpZXMgYW5kLCBhcyBhIHJlc3VsdCwgZmVhdHVyZXMgbWF5IGFwcGVhciBtdWx0aXBsZVxuICAgICAqIHRpbWVzIGluIHF1ZXJ5IHJlc3VsdHMuIEZvciBleGFtcGxlLCBzdXBwb3NlIHRoZXJlIGlzIGEgaGlnaHdheSBydW5uaW5nIHRocm91Z2ggdGhlIGJvdW5kaW5nIHJlY3RhbmdsZSBvZiBhIHF1ZXJ5LlxuICAgICAqIFRoZSByZXN1bHRzIG9mIHRoZSBxdWVyeSB3aWxsIGJlIHRob3NlIHBhcnRzIG9mIHRoZSBoaWdod2F5IHRoYXQgbGllIHdpdGhpbiB0aGUgbWFwIHRpbGVzIGNvdmVyaW5nIHRoZSBib3VuZGluZ1xuICAgICAqIHJlY3RhbmdsZSwgZXZlbiBpZiB0aGUgaGlnaHdheSBleHRlbmRzIGludG8gb3RoZXIgdGlsZXMsIGFuZCB0aGUgcG9ydGlvbiBvZiB0aGUgaGlnaHdheSB3aXRoaW4gZWFjaCBtYXAgdGlsZVxuICAgICAqIHdpbGwgYmUgcmV0dXJuZWQgYXMgYSBzZXBhcmF0ZSBmZWF0dXJlLiBTaW1pbGFybHksIGEgcG9pbnQgZmVhdHVyZSBuZWFyIGEgdGlsZSBib3VuZGFyeSBtYXkgYXBwZWFyIGluIG11bHRpcGxlXG4gICAgICogdGlsZXMgZHVlIHRvIHRpbGUgYnVmZmVyaW5nLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBGaW5kIGFsbCBmZWF0dXJlcyBhdCBhIHBvaW50XG4gICAgICogdmFyIGZlYXR1cmVzID0gbWFwLnF1ZXJ5UmVuZGVyZWRGZWF0dXJlcyhcbiAgICAgKiAgIFsyMCwgMzVdLFxuICAgICAqICAgeyBsYXllcnM6IFsnbXktbGF5ZXItbmFtZSddIH1cbiAgICAgKiApO1xuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBGaW5kIGFsbCBmZWF0dXJlcyB3aXRoaW4gYSBzdGF0aWMgYm91bmRpbmcgYm94XG4gICAgICogdmFyIGZlYXR1cmVzID0gbWFwLnF1ZXJ5UmVuZGVyZWRGZWF0dXJlcyhcbiAgICAgKiAgIFtbMTAsIDIwXSwgWzMwLCA1MF1dLFxuICAgICAqICAgeyBsYXllcnM6IFsnbXktbGF5ZXItbmFtZSddIH1cbiAgICAgKiApO1xuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBGaW5kIGFsbCBmZWF0dXJlcyB3aXRoaW4gYSBib3VuZGluZyBib3ggYXJvdW5kIGEgcG9pbnRcbiAgICAgKiB2YXIgd2lkdGggPSAxMDtcbiAgICAgKiB2YXIgaGVpZ2h0ID0gMjA7XG4gICAgICogdmFyIGZlYXR1cmVzID0gbWFwLnF1ZXJ5UmVuZGVyZWRGZWF0dXJlcyhbXG4gICAgICogICBbcG9pbnQueCAtIHdpZHRoIC8gMiwgcG9pbnQueSAtIGhlaWdodCAvIDJdLFxuICAgICAqICAgW3BvaW50LnggKyB3aWR0aCAvIDIsIHBvaW50LnkgKyBoZWlnaHQgLyAyXVxuICAgICAqIF0sIHsgbGF5ZXJzOiBbJ215LWxheWVyLW5hbWUnXSB9KTtcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gUXVlcnkgYWxsIHJlbmRlcmVkIGZlYXR1cmVzIGZyb20gYSBzaW5nbGUgbGF5ZXJcbiAgICAgKiB2YXIgZmVhdHVyZXMgPSBtYXAucXVlcnlSZW5kZXJlZEZlYXR1cmVzKHsgbGF5ZXJzOiBbJ215LWxheWVyLW5hbWUnXSB9KTtcbiAgICAgKiBAc2VlIFtHZXQgZmVhdHVyZXMgdW5kZXIgdGhlIG1vdXNlIHBvaW50ZXJdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvcXVlcnlyZW5kZXJlZGZlYXR1cmVzLylcbiAgICAgKiBAc2VlIFtIaWdobGlnaHQgZmVhdHVyZXMgd2l0aGluIGEgYm91bmRpbmcgYm94XShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3VzaW5nLWJveC1xdWVyeXJlbmRlcmVkZmVhdHVyZXMvKVxuICAgICAqIEBzZWUgW0NlbnRlciB0aGUgbWFwIG9uIGEgY2xpY2tlZCBzeW1ib2xdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvY2VudGVyLW9uLXN5bWJvbC8pXG4gICAgICovXG4gICAgcXVlcnlSZW5kZXJlZEZlYXR1cmVzKGdlb21ldHJ5PzogUG9pbnRMaWtlIHwgW1BvaW50TGlrZSwgUG9pbnRMaWtlXSwgb3B0aW9ucz86IE9iamVjdCkge1xuICAgICAgICAvLyBUaGUgZmlyc3QgcGFyYW1ldGVyIGNhbiBiZSBvbWl0dGVkIGVudGlyZWx5LCBtYWtpbmcgdGhpcyBlZmZlY3RpdmVseSBhbiBvdmVybG9hZGVkIG1ldGhvZFxuICAgICAgICAvLyB3aXRoIHR3byBzaWduYXR1cmVzOlxuICAgICAgICAvL1xuICAgICAgICAvLyAgICAgcXVlcnlSZW5kZXJlZEZlYXR1cmVzKGdlb21ldHJ5OiBQb2ludExpa2UgfCBbUG9pbnRMaWtlLCBQb2ludExpa2VdLCBvcHRpb25zPzogT2JqZWN0KVxuICAgICAgICAvLyAgICAgcXVlcnlSZW5kZXJlZEZlYXR1cmVzKG9wdGlvbnM/OiBPYmplY3QpXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFRoZXJlIG5vIHdheSB0byBleHByZXNzIHRoYXQgaW4gYSB3YXkgdGhhdCdzIGNvbXBhdGlibGUgd2l0aCBib3RoIGZsb3cgYW5kIGRvY3VtZW50YXRpb24uanMuXG4gICAgICAgIC8vIFJlbGF0ZWQ6IGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9mbG93L2lzc3Vlcy8xNTU2XG5cbiAgICAgICAgaWYgKCF0aGlzLnN0eWxlKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdW5kZWZpbmVkICYmIGdlb21ldHJ5ICE9PSB1bmRlZmluZWQgJiYgIShnZW9tZXRyeSBpbnN0YW5jZW9mIFBvaW50KSAmJiAhQXJyYXkuaXNBcnJheShnZW9tZXRyeSkpIHtcbiAgICAgICAgICAgIG9wdGlvbnMgPSAoZ2VvbWV0cnk6IE9iamVjdCk7XG4gICAgICAgICAgICBnZW9tZXRyeSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgICAgICBnZW9tZXRyeSA9IGdlb21ldHJ5IHx8IFtbMCwgMF0sIFt0aGlzLnRyYW5zZm9ybS53aWR0aCwgdGhpcy50cmFuc2Zvcm0uaGVpZ2h0XV07XG5cbiAgICAgICAgbGV0IHF1ZXJ5R2VvbWV0cnk7XG4gICAgICAgIGlmIChnZW9tZXRyeSBpbnN0YW5jZW9mIFBvaW50IHx8IHR5cGVvZiBnZW9tZXRyeVswXSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHF1ZXJ5R2VvbWV0cnkgPSBbUG9pbnQuY29udmVydChnZW9tZXRyeSldO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgdGwgPSBQb2ludC5jb252ZXJ0KGdlb21ldHJ5WzBdKTtcbiAgICAgICAgICAgIGNvbnN0IGJyID0gUG9pbnQuY29udmVydChnZW9tZXRyeVsxXSk7XG4gICAgICAgICAgICBxdWVyeUdlb21ldHJ5ID0gW3RsLCBuZXcgUG9pbnQoYnIueCwgdGwueSksIGJyLCBuZXcgUG9pbnQodGwueCwgYnIueSksIHRsXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLnN0eWxlLnF1ZXJ5UmVuZGVyZWRGZWF0dXJlcyhxdWVyeUdlb21ldHJ5LCBvcHRpb25zLCB0aGlzLnRyYW5zZm9ybSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBhcnJheSBvZiBbR2VvSlNPTl0oaHR0cDovL2dlb2pzb24ub3JnLylcbiAgICAgKiBbRmVhdHVyZSBvYmplY3RzXShodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzk0NiNzZWN0aW9uLTMuMilcbiAgICAgKiByZXByZXNlbnRpbmcgZmVhdHVyZXMgd2l0aGluIHRoZSBzcGVjaWZpZWQgdmVjdG9yIHRpbGUgb3IgR2VvSlNPTiBzb3VyY2UgdGhhdCBzYXRpc2Z5IHRoZSBxdWVyeSBwYXJhbWV0ZXJzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZUlkIFRoZSBJRCBvZiB0aGUgdmVjdG9yIHRpbGUgb3IgR2VvSlNPTiBzb3VyY2UgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbWV0ZXJzXVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbcGFyYW1ldGVycy5zb3VyY2VMYXllcl0gVGhlIG5hbWUgb2YgdGhlIHZlY3RvciB0aWxlIGxheWVyIHRvIHF1ZXJ5LiAqRm9yIHZlY3RvciB0aWxlXG4gICAgICogICBzb3VyY2VzLCB0aGlzIHBhcmFtZXRlciBpcyByZXF1aXJlZC4qIEZvciBHZW9KU09OIHNvdXJjZXMsIGl0IGlzIGlnbm9yZWQuXG4gICAgICogQHBhcmFtIHtBcnJheX0gW3BhcmFtZXRlcnMuZmlsdGVyXSBBIFtmaWx0ZXJdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL3N0eWxlLXNwZWMvI290aGVyLWZpbHRlcilcbiAgICAgKiAgIHRvIGxpbWl0IHF1ZXJ5IHJlc3VsdHMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7QXJyYXk8T2JqZWN0Pn0gQW4gYXJyYXkgb2YgW0dlb0pTT05dKGh0dHA6Ly9nZW9qc29uLm9yZy8pXG4gICAgICogW0ZlYXR1cmUgb2JqZWN0c10oaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzc5NDYjc2VjdGlvbi0zLjIpLlxuICAgICAqXG4gICAgICogSW4gY29udHJhc3QgdG8ge0BsaW5rIE1hcCNxdWVyeVJlbmRlcmVkRmVhdHVyZXN9LCB0aGlzIGZ1bmN0aW9uXG4gICAgICogcmV0dXJucyBhbGwgZmVhdHVyZXMgbWF0Y2hpbmcgdGhlIHF1ZXJ5IHBhcmFtZXRlcnMsXG4gICAgICogd2hldGhlciBvciBub3QgdGhleSBhcmUgcmVuZGVyZWQgYnkgdGhlIGN1cnJlbnQgc3R5bGUgKGkuZS4gdmlzaWJsZSkuIFRoZSBkb21haW4gb2YgdGhlIHF1ZXJ5IGluY2x1ZGVzIGFsbCBjdXJyZW50bHktbG9hZGVkXG4gICAgICogdmVjdG9yIHRpbGVzIGFuZCBHZW9KU09OIHNvdXJjZSB0aWxlczogdGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBjaGVjayB0aWxlcyBvdXRzaWRlIHRoZSBjdXJyZW50bHlcbiAgICAgKiB2aXNpYmxlIHZpZXdwb3J0LlxuICAgICAqXG4gICAgICogQmVjYXVzZSBmZWF0dXJlcyBjb21lIGZyb20gdGlsZWQgdmVjdG9yIGRhdGEgb3IgR2VvSlNPTiBkYXRhIHRoYXQgaXMgY29udmVydGVkIHRvIHRpbGVzIGludGVybmFsbHksIGZlYXR1cmVcbiAgICAgKiBnZW9tZXRyaWVzIG1heSBiZSBzcGxpdCBvciBkdXBsaWNhdGVkIGFjcm9zcyB0aWxlIGJvdW5kYXJpZXMgYW5kLCBhcyBhIHJlc3VsdCwgZmVhdHVyZXMgbWF5IGFwcGVhciBtdWx0aXBsZVxuICAgICAqIHRpbWVzIGluIHF1ZXJ5IHJlc3VsdHMuIEZvciBleGFtcGxlLCBzdXBwb3NlIHRoZXJlIGlzIGEgaGlnaHdheSBydW5uaW5nIHRocm91Z2ggdGhlIGJvdW5kaW5nIHJlY3RhbmdsZSBvZiBhIHF1ZXJ5LlxuICAgICAqIFRoZSByZXN1bHRzIG9mIHRoZSBxdWVyeSB3aWxsIGJlIHRob3NlIHBhcnRzIG9mIHRoZSBoaWdod2F5IHRoYXQgbGllIHdpdGhpbiB0aGUgbWFwIHRpbGVzIGNvdmVyaW5nIHRoZSBib3VuZGluZ1xuICAgICAqIHJlY3RhbmdsZSwgZXZlbiBpZiB0aGUgaGlnaHdheSBleHRlbmRzIGludG8gb3RoZXIgdGlsZXMsIGFuZCB0aGUgcG9ydGlvbiBvZiB0aGUgaGlnaHdheSB3aXRoaW4gZWFjaCBtYXAgdGlsZVxuICAgICAqIHdpbGwgYmUgcmV0dXJuZWQgYXMgYSBzZXBhcmF0ZSBmZWF0dXJlLiBTaW1pbGFybHksIGEgcG9pbnQgZmVhdHVyZSBuZWFyIGEgdGlsZSBib3VuZGFyeSBtYXkgYXBwZWFyIGluIG11bHRpcGxlXG4gICAgICogdGlsZXMgZHVlIHRvIHRpbGUgYnVmZmVyaW5nLlxuICAgICAqIEBzZWUgW0ZpbHRlciBmZWF0dXJlcyB3aXRoaW4gbWFwIHZpZXddKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvZmlsdGVyLWZlYXR1cmVzLXdpdGhpbi1tYXAtdmlldy8pXG4gICAgICogQHNlZSBbSGlnaGxpZ2h0IGZlYXR1cmVzIGNvbnRhaW5pbmcgc2ltaWxhciBkYXRhXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3F1ZXJ5LXNpbWlsYXItZmVhdHVyZXMvKVxuICAgICAqL1xuICAgIHF1ZXJ5U291cmNlRmVhdHVyZXMoc291cmNlSWQ6IHN0cmluZywgcGFyYW1ldGVyczogP3tzb3VyY2VMYXllcjogP3N0cmluZywgZmlsdGVyOiA/QXJyYXk8YW55Pn0pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3R5bGUucXVlcnlTb3VyY2VGZWF0dXJlcyhzb3VyY2VJZCwgcGFyYW1ldGVycyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlcyB0aGUgbWFwJ3MgTWFwYm94IHN0eWxlIG9iamVjdCB3aXRoIGEgbmV3IHZhbHVlLiBJZiBhIHN0eWxlIGFscmVhZHkgaXMgc2V0IGFuZCBvcHRpb25zLmRpZmYgaXMgdHJ1ZSxcbiAgICAgKiB0aGlzIGNvbXBhcmVzIHRoZSBzdHlsZSBhZ2FpbnN0IHRoZSBtYXAncyBjdXJyZW50IHN0YXRlIGFuZCBwZXJmb3JtcyBvbmx5IHRoZSBjaGFuZ2VzIG5lY2Vzc2FyeSB0byBtYWtlXG4gICAgICogdGhlIG1hcCBzdHlsZSBtYXRjaCB0aGUgZGVzaXJlZCBzdGF0ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzdHlsZSBBIEpTT04gb2JqZWN0IGNvbmZvcm1pbmcgdG8gdGhlIHNjaGVtYSBkZXNjcmliZWQgaW4gdGhlXG4gICAgICogICBbTWFwYm94IFN0eWxlIFNwZWNpZmljYXRpb25dKGh0dHBzOi8vbWFwYm94LmNvbS9tYXBib3gtZ2wtc3R5bGUtc3BlYy8pLCBvciBhIFVSTCB0byBzdWNoIEpTT04uXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuZGlmZj10cnVlXSBJZiBmYWxzZSwgZm9yY2UgYSAnZnVsbCcgdXBkYXRlLCByZW1vdmluZyB0aGUgY3VycmVudCBzdHlsZVxuICAgICAqICAgYW5kIGJ1aWxkaW5nIHRoZSBnaXZlbiBvbmUgaW5zdGVhZCBvZiBhdHRlbXB0aW5nIGEgZGlmZi1iYXNlZCB1cGRhdGUuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmxvY2FsSWRlb2dyYXBoRm9udEZhbWlseT0nc2Fucy1zZXJpZiddIERlZmluZXMgYSBDU1NcbiAgICAgKiAgIGZvbnQtZmFtaWx5IGZvciBsb2NhbGx5IG92ZXJyaWRpbmcgZ2VuZXJhdGlvbiBvZiBnbHlwaHMgaW4gdGhlICdDSksgVW5pZmllZCBJZGVvZ3JhcGhzJyBhbmQgJ0hhbmd1bCBTeWxsYWJsZXMnIHJhbmdlcy5cbiAgICAgKiAgIEluIHRoZXNlIHJhbmdlcywgZm9udCBzZXR0aW5ncyBmcm9tIHRoZSBtYXAncyBzdHlsZSB3aWxsIGJlIGlnbm9yZWQsIGV4Y2VwdCBmb3IgZm9udC13ZWlnaHQga2V5d29yZHMgKGxpZ2h0L3JlZ3VsYXIvbWVkaXVtL2JvbGQpLlxuICAgICAqICAgU2V0IHRvIGBmYWxzZWAsIHRvIGVuYWJsZSBmb250IHNldHRpbmdzIGZyb20gdGhlIG1hcCdzIHN0eWxlIGZvciB0aGVzZSBnbHlwaCByYW5nZXMuXG4gICAgICogICBGb3JjZXMgYSBmdWxsIHVwZGF0ZS5cbiAgICAgKiBAcmV0dXJucyB7TWFwfSBgdGhpc2BcbiAgICAgKiBAc2VlIFtDaGFuZ2UgYSBtYXAncyBzdHlsZV0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9zZXRzdHlsZS8pXG4gICAgICovXG4gICAgc2V0U3R5bGUoc3R5bGU6IFN0eWxlU3BlY2lmaWNhdGlvbiB8IHN0cmluZyB8IG51bGwsIG9wdGlvbnM/OiB7ZGlmZj86IGJvb2xlYW59ICYgU3R5bGVPcHRpb25zKSB7XG4gICAgICAgIG9wdGlvbnMgPSBleHRlbmQoe30sIHsgbG9jYWxJZGVvZ3JhcGhGb250RmFtaWx5OiBkZWZhdWx0T3B0aW9ucy5sb2NhbElkZW9ncmFwaEZvbnRGYW1pbHl9LCBvcHRpb25zKTtcblxuICAgICAgICBpZiAoKG9wdGlvbnMuZGlmZiAhPT0gZmFsc2UgJiYgb3B0aW9ucy5sb2NhbElkZW9ncmFwaEZvbnRGYW1pbHkgPT09IHRoaXMuX2xvY2FsSWRlb2dyYXBoRm9udEZhbWlseSkgJiYgdGhpcy5zdHlsZSAmJiBzdHlsZSkge1xuICAgICAgICAgICAgdGhpcy5fZGlmZlN0eWxlKHN0eWxlLCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fbG9jYWxJZGVvZ3JhcGhGb250RmFtaWx5ID0gb3B0aW9ucy5sb2NhbElkZW9ncmFwaEZvbnRGYW1pbHk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fdXBkYXRlU3R5bGUoc3R5bGUsIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX3VwZGF0ZVN0eWxlKHN0eWxlOiBTdHlsZVNwZWNpZmljYXRpb24gfCBzdHJpbmcgfCBudWxsLCAgb3B0aW9ucz86IHtkaWZmPzogYm9vbGVhbn0gJiBTdHlsZU9wdGlvbnMpIHtcbiAgICAgICAgaWYgKHRoaXMuc3R5bGUpIHtcbiAgICAgICAgICAgIHRoaXMuc3R5bGUuc2V0RXZlbnRlZFBhcmVudChudWxsKTtcbiAgICAgICAgICAgIHRoaXMuc3R5bGUuX3JlbW92ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFzdHlsZSkge1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuc3R5bGU7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc3R5bGUgPSBuZXcgU3R5bGUodGhpcywgb3B0aW9ucyB8fCB7fSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnN0eWxlLnNldEV2ZW50ZWRQYXJlbnQodGhpcywge3N0eWxlOiB0aGlzLnN0eWxlfSk7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBzdHlsZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRoaXMuc3R5bGUubG9hZFVSTChzdHlsZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnN0eWxlLmxvYWRKU09OKHN0eWxlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIF9kaWZmU3R5bGUoc3R5bGU6IFN0eWxlU3BlY2lmaWNhdGlvbiB8IHN0cmluZywgIG9wdGlvbnM/OiB7ZGlmZj86IGJvb2xlYW59ICYgU3R5bGVPcHRpb25zKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc3R5bGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBjb25zdCB1cmwgPSB0aGlzLl9yZXF1ZXN0TWFuYWdlci5ub3JtYWxpemVTdHlsZVVSTChzdHlsZSk7XG4gICAgICAgICAgICBjb25zdCByZXF1ZXN0ID0gdGhpcy5fcmVxdWVzdE1hbmFnZXIudHJhbnNmb3JtUmVxdWVzdCh1cmwsIFJlc291cmNlVHlwZS5TdHlsZSk7XG4gICAgICAgICAgICBnZXRKU09OKHJlcXVlc3QsIChlcnJvcjogP0Vycm9yLCBqc29uOiA/T2JqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXJyb3JFdmVudChlcnJvcikpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoanNvbikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVEaWZmKGpzb24sIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBzdHlsZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZURpZmYoc3R5bGUsIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX3VwZGF0ZURpZmYoc3R5bGU6IFN0eWxlU3BlY2lmaWNhdGlvbiwgIG9wdGlvbnM/OiB7ZGlmZj86IGJvb2xlYW59ICYgU3R5bGVPcHRpb25zKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAodGhpcy5zdHlsZS5zZXRTdGF0ZShzdHlsZSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGUodHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHdhcm5PbmNlKFxuICAgICAgICAgICAgICAgIGBVbmFibGUgdG8gcGVyZm9ybSBzdHlsZSBkaWZmOiAke2UubWVzc2FnZSB8fCBlLmVycm9yIHx8IGV9LiAgUmVidWlsZGluZyB0aGUgc3R5bGUgZnJvbSBzY3JhdGNoLmBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVTdHlsZShzdHlsZSwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBtYXAncyBNYXBib3ggc3R5bGUgb2JqZWN0LCB3aGljaCBjYW4gYmUgdXNlZCB0byByZWNyZWF0ZSB0aGUgbWFwJ3Mgc3R5bGUuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgbWFwJ3Mgc3R5bGUgb2JqZWN0LlxuICAgICAqL1xuICAgIGdldFN0eWxlKCkge1xuICAgICAgICBpZiAodGhpcy5zdHlsZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3R5bGUuc2VyaWFsaXplKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgQm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIG1hcCdzIHN0eWxlIGlzIGZ1bGx5IGxvYWRlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBBIEJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBzdHlsZSBpcyBmdWxseSBsb2FkZWQuXG4gICAgICovXG4gICAgaXNTdHlsZUxvYWRlZCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLnN0eWxlKSByZXR1cm4gd2Fybk9uY2UoJ1RoZXJlIGlzIG5vIHN0eWxlIGFkZGVkIHRvIHRoZSBtYXAuJyk7XG4gICAgICAgIHJldHVybiB0aGlzLnN0eWxlLmxvYWRlZCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBzb3VyY2UgdG8gdGhlIG1hcCdzIHN0eWxlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGlkIFRoZSBJRCBvZiB0aGUgc291cmNlIHRvIGFkZC4gTXVzdCBub3QgY29uZmxpY3Qgd2l0aCBleGlzdGluZyBzb3VyY2VzLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIHNvdXJjZSBvYmplY3QsIGNvbmZvcm1pbmcgdG8gdGhlXG4gICAgICogTWFwYm94IFN0eWxlIFNwZWNpZmljYXRpb24ncyBbc291cmNlIGRlZmluaXRpb25dKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLXN0eWxlLXNwZWMvI3NvdXJjZXMpIG9yXG4gICAgICoge0BsaW5rIENhbnZhc1NvdXJjZU9wdGlvbnN9LlxuICAgICAqIEBmaXJlcyBzb3VyY2UuYWRkXG4gICAgICogQHJldHVybnMge01hcH0gYHRoaXNgXG4gICAgICogQHNlZSBbRHJhdyBHZW9KU09OIHBvaW50c10oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9nZW9qc29uLW1hcmtlcnMvKVxuICAgICAqIEBzZWUgW1N0eWxlIGNpcmNsZXMgdXNpbmcgZGF0YS1kcml2ZW4gc3R5bGluZ10oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9kYXRhLWRyaXZlbi1jaXJjbGUtY29sb3JzLylcbiAgICAgKiBAc2VlIFtTZXQgYSBwb2ludCBhZnRlciBHZW9jb2RlciByZXN1bHRdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvcG9pbnQtZnJvbS1nZW9jb2Rlci1yZXN1bHQvKVxuICAgICAqL1xuICAgIGFkZFNvdXJjZShpZDogc3RyaW5nLCBzb3VyY2U6IFNvdXJjZVNwZWNpZmljYXRpb24pIHtcbiAgICAgICAgdGhpcy5zdHlsZS5hZGRTb3VyY2UoaWQsIHNvdXJjZSk7XG4gICAgICAgIHJldHVybiB0aGlzLl91cGRhdGUodHJ1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIEJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBzb3VyY2UgaXMgbG9hZGVkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGlkIFRoZSBJRCBvZiB0aGUgc291cmNlIHRvIGJlIGNoZWNrZWQuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IEEgQm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHNvdXJjZSBpcyBsb2FkZWQuXG4gICAgICovXG4gICAgaXNTb3VyY2VMb2FkZWQoaWQ6IHN0cmluZykge1xuICAgICAgICBjb25zdCBzb3VyY2UgPSB0aGlzLnN0eWxlICYmIHRoaXMuc3R5bGUuc291cmNlQ2FjaGVzW2lkXTtcbiAgICAgICAgaWYgKHNvdXJjZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEVycm9yRXZlbnQobmV3IEVycm9yKGBUaGVyZSBpcyBubyBzb3VyY2Ugd2l0aCBJRCAnJHtpZH0nYCkpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc291cmNlLmxvYWRlZCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBCb29sZWFuIGluZGljYXRpbmcgd2hldGhlciBhbGwgdGlsZXMgaW4gdGhlIHZpZXdwb3J0IGZyb20gYWxsIHNvdXJjZXMgb25cbiAgICAgKiB0aGUgc3R5bGUgYXJlIGxvYWRlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBBIEJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIGFsbCB0aWxlcyBhcmUgbG9hZGVkLlxuICAgICAqL1xuXG4gICAgYXJlVGlsZXNMb2FkZWQoKSB7XG4gICAgICAgIGNvbnN0IHNvdXJjZXMgPSB0aGlzLnN0eWxlICYmIHRoaXMuc3R5bGUuc291cmNlQ2FjaGVzO1xuICAgICAgICBmb3IgKGNvbnN0IGlkIGluIHNvdXJjZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZSA9IHNvdXJjZXNbaWRdO1xuICAgICAgICAgICAgY29uc3QgdGlsZXMgPSBzb3VyY2UuX3RpbGVzO1xuICAgICAgICAgICAgZm9yIChjb25zdCB0IGluIHRpbGVzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGlsZSA9IHRpbGVzW3RdO1xuICAgICAgICAgICAgICAgIGlmICghKHRpbGUuc3RhdGUgPT09ICdsb2FkZWQnIHx8IHRpbGUuc3RhdGUgPT09ICdlcnJvcmVkJykpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgW2N1c3RvbSBzb3VyY2UgdHlwZV0oI0N1c3RvbSBTb3VyY2VzKSwgbWFraW5nIGl0IGF2YWlsYWJsZSBmb3IgdXNlIHdpdGhcbiAgICAgKiB7QGxpbmsgTWFwI2FkZFNvdXJjZX0uXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0aGUgc291cmNlIHR5cGU7IHNvdXJjZSBkZWZpbml0aW9uIG9iamVjdHMgdXNlIHRoaXMgbmFtZSBpbiB0aGUgYHt0eXBlOiAuLi59YCBmaWVsZC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBTb3VyY2VUeXBlIEEge0BsaW5rIFNvdXJjZX0gY29uc3RydWN0b3IuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGVkIHdoZW4gdGhlIHNvdXJjZSB0eXBlIGlzIHJlYWR5IG9yIHdpdGggYW4gZXJyb3IgYXJndW1lbnQgaWYgdGhlcmUgaXMgYW4gZXJyb3IuXG4gICAgICovXG4gICAgYWRkU291cmNlVHlwZShuYW1lOiBzdHJpbmcsIFNvdXJjZVR5cGU6IGFueSwgY2FsbGJhY2s6IEZ1bmN0aW9uKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0eWxlLmFkZFNvdXJjZVR5cGUobmFtZSwgU291cmNlVHlwZSwgY2FsbGJhY2spO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYSBzb3VyY2UgZnJvbSB0aGUgbWFwJ3Mgc3R5bGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaWQgVGhlIElEIG9mIHRoZSBzb3VyY2UgdG8gcmVtb3ZlLlxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxuICAgICAqL1xuICAgIHJlbW92ZVNvdXJjZShpZDogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuc3R5bGUucmVtb3ZlU291cmNlKGlkKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VwZGF0ZSh0cnVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBzb3VyY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIElEIGluIHRoZSBtYXAncyBzdHlsZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBpZCBUaGUgSUQgb2YgdGhlIHNvdXJjZSB0byBnZXQuXG4gICAgICogQHJldHVybnMgez9PYmplY3R9IFRoZSBzdHlsZSBzb3VyY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIElELCBvciBgdW5kZWZpbmVkYFxuICAgICAqICAgaWYgdGhlIElEIGNvcnJlc3BvbmRzIHRvIG5vIGV4aXN0aW5nIHNvdXJjZXMuXG4gICAgICogQHNlZSBbQ3JlYXRlIGEgZHJhZ2dhYmxlIHBvaW50XShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2RyYWctYS1wb2ludC8pXG4gICAgICogQHNlZSBbQW5pbWF0ZSBhIHBvaW50XShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2FuaW1hdGUtcG9pbnQtYWxvbmctbGluZS8pXG4gICAgICogQHNlZSBbQWRkIGxpdmUgcmVhbHRpbWUgZGF0YV0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9saXZlLWdlb2pzb24vKVxuICAgICAqL1xuICAgIGdldFNvdXJjZShpZDogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0eWxlLmdldFNvdXJjZShpZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkIGFuIGltYWdlIHRvIHRoZSBzdHlsZS4gVGhpcyBpbWFnZSBjYW4gYmUgdXNlZCBpbiBgaWNvbi1pbWFnZWAsXG4gICAgICogYGJhY2tncm91bmQtcGF0dGVybmAsIGBmaWxsLXBhdHRlcm5gLCBhbmQgYGxpbmUtcGF0dGVybmAuIEFuXG4gICAgICoge0BsaW5rIE1hcCNlcnJvcn0gZXZlbnQgd2lsbCBiZSBmaXJlZCBpZiB0aGVyZSBpcyBub3QgZW5vdWdoIHNwYWNlIGluIHRoZVxuICAgICAqIHNwcml0ZSB0byBhZGQgdGhpcyBpbWFnZS5cbiAgICAgKlxuICAgICAqIEBzZWUgW0FkZCBhbiBpY29uIHRvIHRoZSBtYXBdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvYWRkLWltYWdlLylcbiAgICAgKiBAc2VlIFtBZGQgYSBnZW5lcmF0ZWQgaWNvbiB0byB0aGUgbWFwXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2FkZC1pbWFnZS1nZW5lcmF0ZWQvKVxuICAgICAqIEBwYXJhbSBpZCBUaGUgSUQgb2YgdGhlIGltYWdlLlxuICAgICAqIEBwYXJhbSBpbWFnZSBUaGUgaW1hZ2UgYXMgYW4gYEhUTUxJbWFnZUVsZW1lbnRgLCBgSW1hZ2VEYXRhYCwgb3Igb2JqZWN0IHdpdGggYHdpZHRoYCwgYGhlaWdodGAsIGFuZCBgZGF0YWBcbiAgICAgKiBwcm9wZXJ0aWVzIHdpdGggdGhlIHNhbWUgZm9ybWF0IGFzIGBJbWFnZURhdGFgLlxuICAgICAqIEBwYXJhbSBvcHRpb25zXG4gICAgICogQHBhcmFtIG9wdGlvbnMucGl4ZWxSYXRpbyBUaGUgcmF0aW8gb2YgcGl4ZWxzIGluIHRoZSBpbWFnZSB0byBwaHlzaWNhbCBwaXhlbHMgb24gdGhlIHNjcmVlblxuICAgICAqIEBwYXJhbSBvcHRpb25zLnNkZiBXaGV0aGVyIHRoZSBpbWFnZSBzaG91bGQgYmUgaW50ZXJwcmV0ZWQgYXMgYW4gU0RGIGltYWdlXG4gICAgICovXG4gICAgYWRkSW1hZ2UoaWQ6IHN0cmluZyxcbiAgICAgICAgICAgICBpbWFnZTogSFRNTEltYWdlRWxlbWVudCB8IEltYWdlRGF0YSB8IHt3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlciwgZGF0YTogVWludDhBcnJheSB8IFVpbnQ4Q2xhbXBlZEFycmF5fSB8IFN0eWxlSW1hZ2VJbnRlcmZhY2UsXG4gICAgICAgICAgICAge3BpeGVsUmF0aW8gPSAxLCBzZGYgPSBmYWxzZX06IHtwaXhlbFJhdGlvPzogbnVtYmVyLCBzZGY/OiBib29sZWFufSA9IHt9KSB7XG5cbiAgICAgICAgY29uc3QgdmVyc2lvbiA9IDA7XG5cbiAgICAgICAgaWYgKGltYWdlIGluc3RhbmNlb2YgSFRNTEltYWdlRWxlbWVudCkge1xuICAgICAgICAgICAgY29uc3Qge3dpZHRoLCBoZWlnaHQsIGRhdGF9ID0gYnJvd3Nlci5nZXRJbWFnZURhdGEoaW1hZ2UpO1xuICAgICAgICAgICAgdGhpcy5zdHlsZS5hZGRJbWFnZShpZCwgeyBkYXRhOiBuZXcgUkdCQUltYWdlKHt3aWR0aCwgaGVpZ2h0fSwgZGF0YSksIHBpeGVsUmF0aW8sIHNkZiwgdmVyc2lvbiB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChpbWFnZS53aWR0aCA9PT0gdW5kZWZpbmVkIHx8IGltYWdlLmhlaWdodCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5maXJlKG5ldyBFcnJvckV2ZW50KG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAnSW52YWxpZCBhcmd1bWVudHMgdG8gbWFwLmFkZEltYWdlKCkuIFRoZSBzZWNvbmQgYXJndW1lbnQgbXVzdCBiZSBhbiBgSFRNTEltYWdlRWxlbWVudGAsIGBJbWFnZURhdGFgLCAnICtcbiAgICAgICAgICAgICAgICAnb3Igb2JqZWN0IHdpdGggYHdpZHRoYCwgYGhlaWdodGAsIGFuZCBgZGF0YWAgcHJvcGVydGllcyB3aXRoIHRoZSBzYW1lIGZvcm1hdCBhcyBgSW1hZ2VEYXRhYCcpKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB7d2lkdGgsIGhlaWdodCwgZGF0YX0gPSBpbWFnZTtcbiAgICAgICAgICAgIGNvbnN0IHVzZXJJbWFnZSA9ICgoaW1hZ2U6IGFueSk6IFN0eWxlSW1hZ2VJbnRlcmZhY2UpO1xuXG4gICAgICAgICAgICB0aGlzLnN0eWxlLmFkZEltYWdlKGlkLCB7XG4gICAgICAgICAgICAgICAgZGF0YTogbmV3IFJHQkFJbWFnZSh7d2lkdGgsIGhlaWdodH0sIG5ldyBVaW50OEFycmF5KGRhdGEpKSxcbiAgICAgICAgICAgICAgICBwaXhlbFJhdGlvLFxuICAgICAgICAgICAgICAgIHNkZixcbiAgICAgICAgICAgICAgICB2ZXJzaW9uLFxuICAgICAgICAgICAgICAgIHVzZXJJbWFnZVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmICh1c2VySW1hZ2Uub25BZGQpIHtcbiAgICAgICAgICAgICAgICB1c2VySW1hZ2Uub25BZGQodGhpcywgaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlIGFuIGV4aXN0aW5nIHN0eWxlIGltYWdlLiBUaGlzIGltYWdlIGNhbiBiZSB1c2VkIGluIGBpY29uLWltYWdlYCxcbiAgICAgKiBgYmFja2dyb3VuZC1wYXR0ZXJuYCwgYGZpbGwtcGF0dGVybmAsIGFuZCBgbGluZS1wYXR0ZXJuYC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBpZCBUaGUgSUQgb2YgdGhlIGltYWdlLlxuICAgICAqIEBwYXJhbSBpbWFnZSBUaGUgaW1hZ2UgYXMgYW4gYEhUTUxJbWFnZUVsZW1lbnRgLCBgSW1hZ2VEYXRhYCwgb3Igb2JqZWN0IHdpdGggYHdpZHRoYCwgYGhlaWdodGAsIGFuZCBgZGF0YWBcbiAgICAgKiBwcm9wZXJ0aWVzIHdpdGggdGhlIHNhbWUgZm9ybWF0IGFzIGBJbWFnZURhdGFgLlxuICAgICAqL1xuICAgIHVwZGF0ZUltYWdlKGlkOiBzdHJpbmcsXG4gICAgICAgIGltYWdlOiBIVE1MSW1hZ2VFbGVtZW50IHwgSW1hZ2VEYXRhIHwge3dpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyLCBkYXRhOiBVaW50OEFycmF5IHwgVWludDhDbGFtcGVkQXJyYXl9IHwgU3R5bGVJbWFnZUludGVyZmFjZSkge1xuXG4gICAgICAgIGNvbnN0IGV4aXN0aW5nSW1hZ2UgPSB0aGlzLnN0eWxlLmdldEltYWdlKGlkKTtcbiAgICAgICAgaWYgKCFleGlzdGluZ0ltYWdlKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5maXJlKG5ldyBFcnJvckV2ZW50KG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAnVGhlIG1hcCBoYXMgbm8gaW1hZ2Ugd2l0aCB0aGF0IGlkLiBJZiB5b3UgYXJlIGFkZGluZyBhIG5ldyBpbWFnZSB1c2UgYG1hcC5hZGRJbWFnZSguLi4pYCBpbnN0ZWFkLicpKSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpbWFnZURhdGEgPSBpbWFnZSBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnQgPyBicm93c2VyLmdldEltYWdlRGF0YShpbWFnZSkgOiBpbWFnZTtcbiAgICAgICAgY29uc3Qge3dpZHRoLCBoZWlnaHQsIGRhdGF9ID0gaW1hZ2VEYXRhO1xuXG4gICAgICAgIGlmICh3aWR0aCA9PT0gdW5kZWZpbmVkIHx8IGhlaWdodCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5maXJlKG5ldyBFcnJvckV2ZW50KG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAnSW52YWxpZCBhcmd1bWVudHMgdG8gbWFwLnVwZGF0ZUltYWdlKCkuIFRoZSBzZWNvbmQgYXJndW1lbnQgbXVzdCBiZSBhbiBgSFRNTEltYWdlRWxlbWVudGAsIGBJbWFnZURhdGFgLCAnICtcbiAgICAgICAgICAgICAgICAnb3Igb2JqZWN0IHdpdGggYHdpZHRoYCwgYGhlaWdodGAsIGFuZCBgZGF0YWAgcHJvcGVydGllcyB3aXRoIHRoZSBzYW1lIGZvcm1hdCBhcyBgSW1hZ2VEYXRhYCcpKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAod2lkdGggIT09IGV4aXN0aW5nSW1hZ2UuZGF0YS53aWR0aCB8fCBoZWlnaHQgIT09IGV4aXN0aW5nSW1hZ2UuZGF0YS5oZWlnaHQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZpcmUobmV3IEVycm9yRXZlbnQobmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICdUaGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgdXBkYXRlZCBpbWFnZSBtdXN0IGJlIHRoYXQgc2FtZSBhcyB0aGUgcHJldmlvdXMgdmVyc2lvbiBvZiB0aGUgaW1hZ2UnKSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29weSA9ICEoaW1hZ2UgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50KTtcbiAgICAgICAgZXhpc3RpbmdJbWFnZS5kYXRhLnJlcGxhY2UoZGF0YSwgY29weSk7XG5cbiAgICAgICAgdGhpcy5zdHlsZS51cGRhdGVJbWFnZShpZCwgZXhpc3RpbmdJbWFnZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVmaW5lIHdoZXRoZXIgdGhlIGltYWdlIGhhcyBiZWVuIGFkZGVkIG9yIG5vdFxuICAgICAqXG4gICAgICogQHBhcmFtIGlkIFRoZSBJRCBvZiB0aGUgaW1hZ2UuXG4gICAgICovXG4gICAgaGFzSW1hZ2UoaWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIWlkKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEVycm9yRXZlbnQobmV3IEVycm9yKCdNaXNzaW5nIHJlcXVpcmVkIGltYWdlIGlkJykpKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAhIXRoaXMuc3R5bGUuZ2V0SW1hZ2UoaWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBhbiBpbWFnZSBmcm9tIHRoZSBzdHlsZSAoc3VjaCBhcyBvbmUgdXNlZCBieSBgaWNvbi1pbWFnZWAgb3IgYGJhY2tncm91bmQtcGF0dGVybmApLlxuICAgICAqXG4gICAgICogQHBhcmFtIGlkIFRoZSBJRCBvZiB0aGUgaW1hZ2UuXG4gICAgICovXG4gICAgcmVtb3ZlSW1hZ2UoaWQ6IHN0cmluZykge1xuICAgICAgICB0aGlzLnN0eWxlLnJlbW92ZUltYWdlKGlkKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2FkIGFuIGltYWdlIGZyb20gYW4gZXh0ZXJuYWwgVVJMIGZvciB1c2Ugd2l0aCBgTWFwI2FkZEltYWdlYC4gRXh0ZXJuYWxcbiAgICAgKiBkb21haW5zIG11c3Qgc3VwcG9ydCBbQ09SU10oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSFRUUC9BY2Nlc3NfY29udHJvbF9DT1JTKS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgVGhlIFVSTCBvZiB0aGUgaW1hZ2UgZmlsZS4gSW1hZ2UgZmlsZSBtdXN0IGJlIGluIHBuZywgd2VicCwgb3IganBnIGZvcm1hdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBFeHBlY3RpbmcgYGNhbGxiYWNrKGVycm9yLCBkYXRhKWAuIENhbGxlZCB3aGVuIHRoZSBpbWFnZSBoYXMgbG9hZGVkIG9yIHdpdGggYW4gZXJyb3IgYXJndW1lbnQgaWYgdGhlcmUgaXMgYW4gZXJyb3IuXG4gICAgICogQHNlZSBbQWRkIGFuIGljb24gdG8gdGhlIG1hcF0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9hZGQtaW1hZ2UvKVxuICAgICAqL1xuICAgIGxvYWRJbWFnZSh1cmw6IHN0cmluZywgY2FsbGJhY2s6IEZ1bmN0aW9uKSB7XG4gICAgICAgIGdldEltYWdlKHRoaXMuX3JlcXVlc3RNYW5hZ2VyLnRyYW5zZm9ybVJlcXVlc3QodXJsLCBSZXNvdXJjZVR5cGUuSW1hZ2UpLCBjYWxsYmFjayk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBSZXR1cm5zIGFuIEFycmF5IG9mIHN0cmluZ3MgY29udGFpbmluZyB0aGUgbmFtZXMgb2YgYWxsIHNwcml0ZXMvaW1hZ2VzIGN1cnJlbnRseSBhdmFpbGFibGUgaW4gdGhlIG1hcFxuICAgICpcbiAgICAqIEByZXR1cm5zIHtBcnJheTxzdHJpbmc+fSBBbiBBcnJheSBvZiBzdHJpbmdzIGNvbnRhaW5pbmcgdGhlIG5hbWVzIG9mIGFsbCBzcHJpdGVzL2ltYWdlcyBjdXJyZW50bHkgYXZhaWxhYmxlIGluIHRoZSBtYXBcbiAgICAqXG4gICAgKi9cbiAgICBsaXN0SW1hZ2VzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdHlsZS5saXN0SW1hZ2VzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBhIFtNYXBib3ggc3R5bGUgbGF5ZXJdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLXN0eWxlLXNwZWMvI2xheWVycylcbiAgICAgKiB0byB0aGUgbWFwJ3Mgc3R5bGUuXG4gICAgICpcbiAgICAgKiBBIGxheWVyIGRlZmluZXMgc3R5bGluZyBmb3IgZGF0YSBmcm9tIGEgc3BlY2lmaWVkIHNvdXJjZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0IHwgQ3VzdG9tTGF5ZXJJbnRlcmZhY2V9IGxheWVyIFRoZSBzdHlsZSBsYXllciB0byBhZGQsIGNvbmZvcm1pbmcgdG8gdGhlIE1hcGJveCBTdHlsZSBTcGVjaWZpY2F0aW9uJ3NcbiAgICAgKiAgIFtsYXllciBkZWZpbml0aW9uXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1zdHlsZS1zcGVjLyNsYXllcnMpLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbYmVmb3JlSWRdIFRoZSBJRCBvZiBhbiBleGlzdGluZyBsYXllciB0byBpbnNlcnQgdGhlIG5ldyBsYXllciBiZWZvcmUuXG4gICAgICogICBJZiB0aGlzIGFyZ3VtZW50IGlzIG9taXR0ZWQsIHRoZSBsYXllciB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZSBlbmQgb2YgdGhlIGxheWVycyBhcnJheS5cbiAgICAgKiBAcmV0dXJucyB7TWFwfSBgdGhpc2BcbiAgICAgKiBAc2VlIFtDcmVhdGUgYW5kIHN0eWxlIGNsdXN0ZXJzXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2NsdXN0ZXIvKVxuICAgICAqIEBzZWUgW0FkZCBhIHZlY3RvciB0aWxlIHNvdXJjZV0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS92ZWN0b3Itc291cmNlLylcbiAgICAgKiBAc2VlIFtBZGQgYSBXTVMgc291cmNlXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3dtcy8pXG4gICAgICovXG4gICAgYWRkTGF5ZXIobGF5ZXI6IExheWVyU3BlY2lmaWNhdGlvbiB8IEN1c3RvbUxheWVySW50ZXJmYWNlLCBiZWZvcmVJZD86IHN0cmluZykge1xuICAgICAgICB0aGlzLnN0eWxlLmFkZExheWVyKGxheWVyLCBiZWZvcmVJZCk7XG4gICAgICAgIHJldHVybiB0aGlzLl91cGRhdGUodHJ1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTW92ZXMgYSBsYXllciB0byBhIGRpZmZlcmVudCB6LXBvc2l0aW9uLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGlkIFRoZSBJRCBvZiB0aGUgbGF5ZXIgdG8gbW92ZS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2JlZm9yZUlkXSBUaGUgSUQgb2YgYW4gZXhpc3RpbmcgbGF5ZXIgdG8gaW5zZXJ0IHRoZSBuZXcgbGF5ZXIgYmVmb3JlLlxuICAgICAqICAgSWYgdGhpcyBhcmd1bWVudCBpcyBvbWl0dGVkLCB0aGUgbGF5ZXIgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgZW5kIG9mIHRoZSBsYXllcnMgYXJyYXkuXG4gICAgICogQHJldHVybnMge01hcH0gYHRoaXNgXG4gICAgICovXG4gICAgbW92ZUxheWVyKGlkOiBzdHJpbmcsIGJlZm9yZUlkPzogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuc3R5bGUubW92ZUxheWVyKGlkLCBiZWZvcmVJZCk7XG4gICAgICAgIHJldHVybiB0aGlzLl91cGRhdGUodHJ1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyB0aGUgbGF5ZXIgd2l0aCB0aGUgZ2l2ZW4gaWQgZnJvbSB0aGUgbWFwJ3Mgc3R5bGUuXG4gICAgICpcbiAgICAgKiBJZiBubyBzdWNoIGxheWVyIGV4aXN0cywgYW4gYGVycm9yYCBldmVudCBpcyBmaXJlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBpZCBpZCBvZiB0aGUgbGF5ZXIgdG8gcmVtb3ZlXG4gICAgICogQGZpcmVzIGVycm9yXG4gICAgICovXG4gICAgcmVtb3ZlTGF5ZXIoaWQ6IHN0cmluZykge1xuICAgICAgICB0aGlzLnN0eWxlLnJlbW92ZUxheWVyKGlkKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VwZGF0ZSh0cnVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBsYXllciB3aXRoIHRoZSBzcGVjaWZpZWQgSUQgaW4gdGhlIG1hcCdzIHN0eWxlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGlkIFRoZSBJRCBvZiB0aGUgbGF5ZXIgdG8gZ2V0LlxuICAgICAqIEByZXR1cm5zIHs/T2JqZWN0fSBUaGUgbGF5ZXIgd2l0aCB0aGUgc3BlY2lmaWVkIElELCBvciBgdW5kZWZpbmVkYFxuICAgICAqICAgaWYgdGhlIElEIGNvcnJlc3BvbmRzIHRvIG5vIGV4aXN0aW5nIGxheWVycy5cbiAgICAgKiBAc2VlIFtGaWx0ZXIgc3ltYm9scyBieSB0b2dnbGluZyBhIGxpc3RdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvZmlsdGVyLW1hcmtlcnMvKVxuICAgICAqIEBzZWUgW0ZpbHRlciBzeW1ib2xzIGJ5IHRleHQgaW5wdXRdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvZmlsdGVyLW1hcmtlcnMtYnktaW5wdXQvKVxuICAgICAqL1xuICAgIGdldExheWVyKGlkOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3R5bGUuZ2V0TGF5ZXIoaWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGZpbHRlciBmb3IgdGhlIHNwZWNpZmllZCBzdHlsZSBsYXllci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBsYXllcklkIFRoZSBJRCBvZiB0aGUgbGF5ZXIgdG8gd2hpY2ggdGhlIGZpbHRlciB3aWxsIGJlIGFwcGxpZWQuXG4gICAgICogQHBhcmFtIHtBcnJheSB8IG51bGwgfCB1bmRlZmluZWR9IGZpbHRlciBUaGUgZmlsdGVyLCBjb25mb3JtaW5nIHRvIHRoZSBNYXBib3ggU3R5bGUgU3BlY2lmaWNhdGlvbidzXG4gICAgICogICBbZmlsdGVyIGRlZmluaXRpb25dKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL3N0eWxlLXNwZWMvI290aGVyLWZpbHRlcikuICBJZiBgbnVsbGAgb3IgYHVuZGVmaW5lZGAgaXMgcHJvdmlkZWQsIHRoZSBmdW5jdGlvbiByZW1vdmVzIGFueSBleGlzdGluZyBmaWx0ZXIgZnJvbSB0aGUgbGF5ZXIuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMudmFsaWRhdGU9dHJ1ZV0gV2hldGhlciB0byBjaGVjayBpZiB0aGUgZmlsdGVyIGNvbmZvcm1zIHRvIHRoZSBNYXBib3ggR0wgU3R5bGUgU3BlY2lmaWNhdGlvbi4gRGlzYWJsaW5nIHZhbGlkYXRpb24gaXMgYSBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24gdGhhdCBzaG91bGQgb25seSBiZSB1c2VkIGlmIHlvdSBoYXZlIHByZXZpb3VzbHkgdmFsaWRhdGVkIHRoZSB2YWx1ZXMgeW91IHdpbGwgYmUgcGFzc2luZyB0byB0aGlzIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHJldHVybnMge01hcH0gYHRoaXNgXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBtYXAuc2V0RmlsdGVyKCdteS1sYXllcicsIFsnPT0nLCAnbmFtZScsICdVU0EnXSk7XG4gICAgICogQHNlZSBbRmlsdGVyIGZlYXR1cmVzIHdpdGhpbiBtYXAgdmlld10oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9maWx0ZXItZmVhdHVyZXMtd2l0aGluLW1hcC12aWV3LylcbiAgICAgKiBAc2VlIFtIaWdobGlnaHQgZmVhdHVyZXMgY29udGFpbmluZyBzaW1pbGFyIGRhdGFdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvcXVlcnktc2ltaWxhci1mZWF0dXJlcy8pXG4gICAgICogQHNlZSBbQ3JlYXRlIGEgdGltZWxpbmUgYW5pbWF0aW9uXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3RpbWVsaW5lLWFuaW1hdGlvbi8pXG4gICAgICovXG4gICAgc2V0RmlsdGVyKGxheWVySWQ6IHN0cmluZywgZmlsdGVyOiA/RmlsdGVyU3BlY2lmaWNhdGlvbiwgIG9wdGlvbnM6IFN0eWxlU2V0dGVyT3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHRoaXMuc3R5bGUuc2V0RmlsdGVyKGxheWVySWQsIGZpbHRlciwgb3B0aW9ucyk7XG4gICAgICAgIHJldHVybiB0aGlzLl91cGRhdGUodHJ1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgem9vbSBleHRlbnQgZm9yIHRoZSBzcGVjaWZpZWQgc3R5bGUgbGF5ZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbGF5ZXJJZCBUaGUgSUQgb2YgdGhlIGxheWVyIHRvIHdoaWNoIHRoZSB6b29tIGV4dGVudCB3aWxsIGJlIGFwcGxpZWQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG1pbnpvb20gVGhlIG1pbmltdW0gem9vbSB0byBzZXQgKDAtMjQpLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBtYXh6b29tIFRoZSBtYXhpbXVtIHpvb20gdG8gc2V0ICgwLTI0KS5cbiAgICAgKiBAcmV0dXJucyB7TWFwfSBgdGhpc2BcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIG1hcC5zZXRMYXllclpvb21SYW5nZSgnbXktbGF5ZXInLCAyLCA1KTtcbiAgICAgKi9cbiAgICBzZXRMYXllclpvb21SYW5nZShsYXllcklkOiBzdHJpbmcsIG1pbnpvb206IG51bWJlciwgbWF4em9vbTogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuc3R5bGUuc2V0TGF5ZXJab29tUmFuZ2UobGF5ZXJJZCwgbWluem9vbSwgbWF4em9vbSk7XG4gICAgICAgIHJldHVybiB0aGlzLl91cGRhdGUodHJ1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgZmlsdGVyIGFwcGxpZWQgdG8gdGhlIHNwZWNpZmllZCBzdHlsZSBsYXllci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBsYXllcklkIFRoZSBJRCBvZiB0aGUgc3R5bGUgbGF5ZXIgd2hvc2UgZmlsdGVyIHRvIGdldC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFRoZSBsYXllcidzIGZpbHRlci5cbiAgICAgKi9cbiAgICBnZXRGaWx0ZXIobGF5ZXJJZDogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0eWxlLmdldEZpbHRlcihsYXllcklkKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiBhIHBhaW50IHByb3BlcnR5IGluIHRoZSBzcGVjaWZpZWQgc3R5bGUgbGF5ZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbGF5ZXJJZCBUaGUgSUQgb2YgdGhlIGxheWVyIHRvIHNldCB0aGUgcGFpbnQgcHJvcGVydHkgaW4uXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIHBhaW50IHByb3BlcnR5IHRvIHNldC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgcGFpbnQgcHJvcGVydHkgdG8gc2V0LlxuICAgICAqICAgTXVzdCBiZSBvZiBhIHR5cGUgYXBwcm9wcmlhdGUgZm9yIHRoZSBwcm9wZXJ0eSwgYXMgZGVmaW5lZCBpbiB0aGUgW01hcGJveCBTdHlsZSBTcGVjaWZpY2F0aW9uXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1zdHlsZS1zcGVjLykuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMudmFsaWRhdGU9dHJ1ZV0gV2hldGhlciB0byBjaGVjayBpZiBgdmFsdWVgIGNvbmZvcm1zIHRvIHRoZSBNYXBib3ggR0wgU3R5bGUgU3BlY2lmaWNhdGlvbi4gRGlzYWJsaW5nIHZhbGlkYXRpb24gaXMgYSBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24gdGhhdCBzaG91bGQgb25seSBiZSB1c2VkIGlmIHlvdSBoYXZlIHByZXZpb3VzbHkgdmFsaWRhdGVkIHRoZSB2YWx1ZXMgeW91IHdpbGwgYmUgcGFzc2luZyB0byB0aGlzIGZ1bmN0aW9uLlxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxuICAgICAqIEBleGFtcGxlXG4gICAgICogbWFwLnNldFBhaW50UHJvcGVydHkoJ215LWxheWVyJywgJ2ZpbGwtY29sb3InLCAnI2ZhYWZlZScpO1xuICAgICAqIEBzZWUgW0NoYW5nZSBhIGxheWVyJ3MgY29sb3Igd2l0aCBidXR0b25zXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2NvbG9yLXN3aXRjaGVyLylcbiAgICAgKiBAc2VlIFtBZGp1c3QgYSBsYXllcidzIG9wYWNpdHldKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvYWRqdXN0LWxheWVyLW9wYWNpdHkvKVxuICAgICAqIEBzZWUgW0NyZWF0ZSBhIGRyYWdnYWJsZSBwb2ludF0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9kcmFnLWEtcG9pbnQvKVxuICAgICAqL1xuICAgIHNldFBhaW50UHJvcGVydHkobGF5ZXJJZDogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnksIG9wdGlvbnM6IFN0eWxlU2V0dGVyT3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHRoaXMuc3R5bGUuc2V0UGFpbnRQcm9wZXJ0eShsYXllcklkLCBuYW1lLCB2YWx1ZSwgb3B0aW9ucyk7XG4gICAgICAgIHJldHVybiB0aGlzLl91cGRhdGUodHJ1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgYSBwYWludCBwcm9wZXJ0eSBpbiB0aGUgc3BlY2lmaWVkIHN0eWxlIGxheWVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGxheWVySWQgVGhlIElEIG9mIHRoZSBsYXllciB0byBnZXQgdGhlIHBhaW50IHByb3BlcnR5IGZyb20uXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgYSBwYWludCBwcm9wZXJ0eSB0byBnZXQuXG4gICAgICogQHJldHVybnMgeyp9IFRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHBhaW50IHByb3BlcnR5LlxuICAgICAqL1xuICAgIGdldFBhaW50UHJvcGVydHkobGF5ZXJJZDogc3RyaW5nLCBuYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3R5bGUuZ2V0UGFpbnRQcm9wZXJ0eShsYXllcklkLCBuYW1lKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiBhIGxheW91dCBwcm9wZXJ0eSBpbiB0aGUgc3BlY2lmaWVkIHN0eWxlIGxheWVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGxheWVySWQgVGhlIElEIG9mIHRoZSBsYXllciB0byBzZXQgdGhlIGxheW91dCBwcm9wZXJ0eSBpbi5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0aGUgbGF5b3V0IHByb3BlcnR5IHRvIHNldC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgbGF5b3V0IHByb3BlcnR5LiBNdXN0IGJlIG9mIGEgdHlwZSBhcHByb3ByaWF0ZSBmb3IgdGhlIHByb3BlcnR5LCBhcyBkZWZpbmVkIGluIHRoZSBbTWFwYm94IFN0eWxlIFNwZWNpZmljYXRpb25dKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLXN0eWxlLXNwZWMvKS5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy52YWxpZGF0ZT10cnVlXSBXaGV0aGVyIHRvIGNoZWNrIGlmIGB2YWx1ZWAgY29uZm9ybXMgdG8gdGhlIE1hcGJveCBHTCBTdHlsZSBTcGVjaWZpY2F0aW9uLiBEaXNhYmxpbmcgdmFsaWRhdGlvbiBpcyBhIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbiB0aGF0IHNob3VsZCBvbmx5IGJlIHVzZWQgaWYgeW91IGhhdmUgcHJldmlvdXNseSB2YWxpZGF0ZWQgdGhlIHZhbHVlcyB5b3Ugd2lsbCBiZSBwYXNzaW5nIHRvIHRoaXMgZnVuY3Rpb24uXG4gICAgICogQHJldHVybnMge01hcH0gYHRoaXNgXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBtYXAuc2V0TGF5b3V0UHJvcGVydHkoJ215LWxheWVyJywgJ3Zpc2liaWxpdHknLCAnbm9uZScpO1xuICAgICAqL1xuICAgIHNldExheW91dFByb3BlcnR5KGxheWVySWQ6IHN0cmluZywgbmFtZTogc3RyaW5nLCB2YWx1ZTogYW55LCBvcHRpb25zOiBTdHlsZVNldHRlck9wdGlvbnMgPSB7fSkge1xuICAgICAgICB0aGlzLnN0eWxlLnNldExheW91dFByb3BlcnR5KGxheWVySWQsIG5hbWUsIHZhbHVlLCBvcHRpb25zKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VwZGF0ZSh0cnVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiBhIGxheW91dCBwcm9wZXJ0eSBpbiB0aGUgc3BlY2lmaWVkIHN0eWxlIGxheWVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGxheWVySWQgVGhlIElEIG9mIHRoZSBsYXllciB0byBnZXQgdGhlIGxheW91dCBwcm9wZXJ0eSBmcm9tLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBsYXlvdXQgcHJvcGVydHkgdG8gZ2V0LlxuICAgICAqIEByZXR1cm5zIHsqfSBUaGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBsYXlvdXQgcHJvcGVydHkuXG4gICAgICovXG4gICAgZ2V0TGF5b3V0UHJvcGVydHkobGF5ZXJJZDogc3RyaW5nLCBuYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3R5bGUuZ2V0TGF5b3V0UHJvcGVydHkobGF5ZXJJZCwgbmFtZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgYW55IGNvbWJpbmF0aW9uIG9mIGxpZ2h0IHZhbHVlcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBsaWdodCBMaWdodCBwcm9wZXJ0aWVzIHRvIHNldC4gTXVzdCBjb25mb3JtIHRvIHRoZSBbTWFwYm94IFN0eWxlIFNwZWNpZmljYXRpb25dKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLXN0eWxlLXNwZWMvI2xpZ2h0KS5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy52YWxpZGF0ZT10cnVlXSBXaGV0aGVyIHRvIGNoZWNrIGlmIHRoZSBmaWx0ZXIgY29uZm9ybXMgdG8gdGhlIE1hcGJveCBHTCBTdHlsZSBTcGVjaWZpY2F0aW9uLiBEaXNhYmxpbmcgdmFsaWRhdGlvbiBpcyBhIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbiB0aGF0IHNob3VsZCBvbmx5IGJlIHVzZWQgaWYgeW91IGhhdmUgcHJldmlvdXNseSB2YWxpZGF0ZWQgdGhlIHZhbHVlcyB5b3Ugd2lsbCBiZSBwYXNzaW5nIHRvIHRoaXMgZnVuY3Rpb24uXG4gICAgICogQHJldHVybnMge01hcH0gYHRoaXNgXG4gICAgICovXG4gICAgc2V0TGlnaHQobGlnaHQ6IExpZ2h0U3BlY2lmaWNhdGlvbiwgb3B0aW9uczogU3R5bGVTZXR0ZXJPcHRpb25zID0ge30pIHtcbiAgICAgICAgdGhpcy5zdHlsZS5zZXRMaWdodChsaWdodCwgb3B0aW9ucyk7XG4gICAgICAgIHJldHVybiB0aGlzLl91cGRhdGUodHJ1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGxpZ2h0IG9iamVjdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IGxpZ2h0IExpZ2h0IHByb3BlcnRpZXMgb2YgdGhlIHN0eWxlLlxuICAgICAqL1xuICAgIGdldExpZ2h0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdHlsZS5nZXRMaWdodCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHN0YXRlIG9mIGEgZmVhdHVyZS4gVGhlIGBzdGF0ZWAgb2JqZWN0IGlzIG1lcmdlZCBpbiB3aXRoIHRoZSBleGlzdGluZyBzdGF0ZSBvZiB0aGUgZmVhdHVyZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBmZWF0dXJlIEZlYXR1cmUgaWRlbnRpZmllci4gRmVhdHVyZSBvYmplY3RzIHJldHVybmVkIGZyb21cbiAgICAgKiB7QGxpbmsgTWFwI3F1ZXJ5UmVuZGVyZWRGZWF0dXJlc30gb3IgZXZlbnQgaGFuZGxlcnMgY2FuIGJlIHVzZWQgYXMgZmVhdHVyZSBpZGVudGlmaWVycy5cbiAgICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlcn0gZmVhdHVyZS5pZCBVbmlxdWUgaWQgb2YgdGhlIGZlYXR1cmUuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGZlYXR1cmUuc291cmNlIFRoZSBJZCBvZiB0aGUgdmVjdG9yIHNvdXJjZSBvciBHZW9KU09OIHNvdXJjZSBmb3IgdGhlIGZlYXR1cmUuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtmZWF0dXJlLnNvdXJjZUxheWVyXSAob3B0aW9uYWwpICAqRm9yIHZlY3RvciB0aWxlIHNvdXJjZXMsIHRoZSBzb3VyY2VMYXllciBpc1xuICAgICAqICByZXF1aXJlZC4qXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHN0YXRlIEEgc2V0IG9mIGtleS12YWx1ZSBwYWlycy4gVGhlIHZhbHVlcyBzaG91bGQgYmUgdmFsaWQgSlNPTiB0eXBlcy5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIHJlcXVpcmVzIHRoZSBgZmVhdHVyZS5pZGAgYXR0cmlidXRlIG9uIGRhdGEgc2V0cy4gRm9yIEdlb0pTT04gc291cmNlcyB3aXRob3V0XG4gICAgICogZmVhdHVyZSBpZHMsIHNldCB0aGUgYGdlbmVyYXRlSWRzYCBvcHRpb24gaW4gdGhlIGBHZW9KU09OU291cmNlU3BlY2lmaWNhdGlvbmAgdG8gYXV0by1hc3NpZ24gdGhlbS4gVGhpc1xuICAgICAqIG9wdGlvbiBhc3NpZ25zIGlkcyBiYXNlZCBvbiBhIGZlYXR1cmUncyBpbmRleCBpbiB0aGUgc291cmNlIGRhdGEuIElmIHlvdSBjaGFuZ2UgZmVhdHVyZSBkYXRhIHVzaW5nXG4gICAgICogYG1hcC5nZXRTb3VyY2UoJ3NvbWUgaWQnKS5zZXREYXRhKC4uKWAsIHlvdSBtYXkgbmVlZCB0byByZS1hcHBseSBzdGF0ZSB0YWtpbmcgaW50byBhY2NvdW50IHVwZGF0ZWQgYGlkYCB2YWx1ZXMuXG4gICAgICovXG4gICAgc2V0RmVhdHVyZVN0YXRlKGZlYXR1cmU6IHsgc291cmNlOiBzdHJpbmc7IHNvdXJjZUxheWVyPzogc3RyaW5nOyBpZDogc3RyaW5nIHwgbnVtYmVyOyB9LCBzdGF0ZTogT2JqZWN0KSB7XG4gICAgICAgIHRoaXMuc3R5bGUuc2V0RmVhdHVyZVN0YXRlKGZlYXR1cmUsIHN0YXRlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VwZGF0ZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgZmVhdHVyZSBzdGF0ZSwgc2V0dGluZyBpdCBiYWNrIHRvIHRoZSBkZWZhdWx0IGJlaGF2aW9yLiBJZiBvbmx5XG4gICAgICogc291cmNlIGlzIHNwZWNpZmllZCwgcmVtb3ZlcyBhbGwgc3RhdGVzIG9mIHRoYXQgc291cmNlLiBJZlxuICAgICAqIHRhcmdldC5pZCBpcyBhbHNvIHNwZWNpZmllZCwgcmVtb3ZlcyBhbGwga2V5cyBmb3IgdGhhdCBmZWF0dXJlJ3Mgc3RhdGUuXG4gICAgICogSWYga2V5IGlzIGFsc28gc3BlY2lmaWVkLCByZW1vdmVzIHRoYXQga2V5IGZyb20gdGhhdCBmZWF0dXJlJ3Mgc3RhdGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gdGFyZ2V0IElkZW50aWZpZXIgb2Ygd2hlcmUgdG8gc2V0IHN0YXRlOiBjYW4gYmUgYSBzb3VyY2UsIGEgZmVhdHVyZSwgb3IgYSBzcGVjaWZpYyBrZXkgb2YgZmVhdHVyZS5cbiAgICAgKiBGZWF0dXJlIG9iamVjdHMgcmV0dXJuZWQgZnJvbSB7QGxpbmsgTWFwI3F1ZXJ5UmVuZGVyZWRGZWF0dXJlc30gb3IgZXZlbnQgaGFuZGxlcnMgY2FuIGJlIHVzZWQgYXMgZmVhdHVyZSBpZGVudGlmaWVycy5cbiAgICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlcn0gdGFyZ2V0LmlkIChvcHRpb25hbCkgVW5pcXVlIGlkIG9mIHRoZSBmZWF0dXJlLiBPcHRpb25hbCBpZiBrZXkgaXMgbm90IHNwZWNpZmllZC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGFyZ2V0LnNvdXJjZSBUaGUgSWQgb2YgdGhlIHZlY3RvciBzb3VyY2Ugb3IgR2VvSlNPTiBzb3VyY2UgZm9yIHRoZSBmZWF0dXJlLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbdGFyZ2V0LnNvdXJjZUxheWVyXSAob3B0aW9uYWwpICAqRm9yIHZlY3RvciB0aWxlIHNvdXJjZXMsIHRoZSBzb3VyY2VMYXllciBpc1xuICAgICAqICByZXF1aXJlZC4qXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAob3B0aW9uYWwpIFRoZSBrZXkgaW4gdGhlIGZlYXR1cmUgc3RhdGUgdG8gcmVzZXQuXG4gICAgKi9cbiAgICByZW1vdmVGZWF0dXJlU3RhdGUodGFyZ2V0OiB7IHNvdXJjZTogc3RyaW5nOyBzb3VyY2VMYXllcj86IHN0cmluZzsgaWQ/OiBzdHJpbmcgfCBudW1iZXI7IH0sIGtleT86IHN0cmluZykge1xuICAgICAgICB0aGlzLnN0eWxlLnJlbW92ZUZlYXR1cmVTdGF0ZSh0YXJnZXQsIGtleSk7XG4gICAgICAgIHJldHVybiB0aGlzLl91cGRhdGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBzdGF0ZSBvZiBhIGZlYXR1cmUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZmVhdHVyZSBGZWF0dXJlIGlkZW50aWZpZXIuIEZlYXR1cmUgb2JqZWN0cyByZXR1cm5lZCBmcm9tXG4gICAgICoge0BsaW5rIE1hcCNxdWVyeVJlbmRlcmVkRmVhdHVyZXN9IG9yIGV2ZW50IGhhbmRsZXJzIGNhbiBiZSB1c2VkIGFzIGZlYXR1cmUgaWRlbnRpZmllcnMuXG4gICAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IGZlYXR1cmUuaWQgVW5pcXVlIGlkIG9mIHRoZSBmZWF0dXJlLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBmZWF0dXJlLnNvdXJjZSBUaGUgSWQgb2YgdGhlIHZlY3RvciBzb3VyY2Ugb3IgR2VvSlNPTiBzb3VyY2UgZm9yIHRoZSBmZWF0dXJlLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbZmVhdHVyZS5zb3VyY2VMYXllcl0gKG9wdGlvbmFsKSAgKkZvciB2ZWN0b3IgdGlsZSBzb3VyY2VzLCB0aGUgc291cmNlTGF5ZXIgaXNcbiAgICAgKiAgcmVxdWlyZWQuKlxuICAgICAqXG4gICAgICogQHJldHVybnMge09iamVjdH0gVGhlIHN0YXRlIG9mIHRoZSBmZWF0dXJlLlxuICAgICAqL1xuICAgIGdldEZlYXR1cmVTdGF0ZShmZWF0dXJlOiB7IHNvdXJjZTogc3RyaW5nOyBzb3VyY2VMYXllcj86IHN0cmluZzsgaWQ6IHN0cmluZyB8IG51bWJlcjsgfSk6IGFueSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0eWxlLmdldEZlYXR1cmVTdGF0ZShmZWF0dXJlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBtYXAncyBjb250YWluaW5nIEhUTUwgZWxlbWVudC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtIVE1MRWxlbWVudH0gVGhlIG1hcCdzIGNvbnRhaW5lci5cbiAgICAgKi9cbiAgICBnZXRDb250YWluZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb250YWluZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgSFRNTCBlbGVtZW50IGNvbnRhaW5pbmcgdGhlIG1hcCdzIGA8Y2FudmFzPmAgZWxlbWVudC5cbiAgICAgKlxuICAgICAqIElmIHlvdSB3YW50IHRvIGFkZCBub24tR0wgb3ZlcmxheXMgdG8gdGhlIG1hcCwgeW91IHNob3VsZCBhcHBlbmQgdGhlbSB0byB0aGlzIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBUaGlzIGlzIHRoZSBlbGVtZW50IHRvIHdoaWNoIGV2ZW50IGJpbmRpbmdzIGZvciBtYXAgaW50ZXJhY3Rpdml0eSAoc3VjaCBhcyBwYW5uaW5nIGFuZCB6b29taW5nKSBhcmVcbiAgICAgKiBhdHRhY2hlZC4gSXQgd2lsbCByZWNlaXZlIGJ1YmJsZWQgZXZlbnRzIGZyb20gY2hpbGQgZWxlbWVudHMgc3VjaCBhcyB0aGUgYDxjYW52YXM+YCwgYnV0IG5vdCBmcm9tXG4gICAgICogbWFwIGNvbnRyb2xzLlxuICAgICAqXG4gICAgICogQHJldHVybnMge0hUTUxFbGVtZW50fSBUaGUgY29udGFpbmVyIG9mIHRoZSBtYXAncyBgPGNhbnZhcz5gLlxuICAgICAqIEBzZWUgW0NyZWF0ZSBhIGRyYWdnYWJsZSBwb2ludF0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9kcmFnLWEtcG9pbnQvKVxuICAgICAqIEBzZWUgW0hpZ2hsaWdodCBmZWF0dXJlcyB3aXRoaW4gYSBib3VuZGluZyBib3hdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvdXNpbmctYm94LXF1ZXJ5cmVuZGVyZWRmZWF0dXJlcy8pXG4gICAgICovXG4gICAgZ2V0Q2FudmFzQ29udGFpbmVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2FudmFzQ29udGFpbmVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIG1hcCdzIGA8Y2FudmFzPmAgZWxlbWVudC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtIVE1MQ2FudmFzRWxlbWVudH0gVGhlIG1hcCdzIGA8Y2FudmFzPmAgZWxlbWVudC5cbiAgICAgKiBAc2VlIFtNZWFzdXJlIGRpc3RhbmNlc10oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9tZWFzdXJlLylcbiAgICAgKiBAc2VlIFtEaXNwbGF5IGEgcG9wdXAgb24gaG92ZXJdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvcG9wdXAtb24taG92ZXIvKVxuICAgICAqIEBzZWUgW0NlbnRlciB0aGUgbWFwIG9uIGEgY2xpY2tlZCBzeW1ib2xdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvY2VudGVyLW9uLXN5bWJvbC8pXG4gICAgICovXG4gICAgZ2V0Q2FudmFzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2FudmFzO1xuICAgIH1cblxuICAgIF9jb250YWluZXJEaW1lbnNpb25zKCkge1xuICAgICAgICBsZXQgd2lkdGggPSAwO1xuICAgICAgICBsZXQgaGVpZ2h0ID0gMDtcblxuICAgICAgICBpZiAodGhpcy5fY29udGFpbmVyKSB7XG4gICAgICAgICAgICB3aWR0aCA9IHRoaXMuX2NvbnRhaW5lci5jbGllbnRXaWR0aCB8fCA0MDA7XG4gICAgICAgICAgICBoZWlnaHQgPSB0aGlzLl9jb250YWluZXIuY2xpZW50SGVpZ2h0IHx8IDMwMDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBbd2lkdGgsIGhlaWdodF07XG4gICAgfVxuXG4gICAgX2RldGVjdE1pc3NpbmdDU1MoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGNvbXB1dGVkQ29sb3IgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLl9taXNzaW5nQ1NTQ2FuYXJ5KS5nZXRQcm9wZXJ0eVZhbHVlKCdiYWNrZ3JvdW5kLWNvbG9yJyk7XG4gICAgICAgIGlmIChjb21wdXRlZENvbG9yICE9PSAncmdiKDI1MCwgMTI4LCAxMTQpJykge1xuICAgICAgICAgICAgd2Fybk9uY2UoJ1RoaXMgcGFnZSBhcHBlYXJzIHRvIGJlIG1pc3NpbmcgQ1NTIGRlY2xhcmF0aW9ucyBmb3IgJyArXG4gICAgICAgICAgICAgICAgJ01hcGJveCBHTCBKUywgd2hpY2ggbWF5IGNhdXNlIHRoZSBtYXAgdG8gZGlzcGxheSBpbmNvcnJlY3RseS4gJyArXG4gICAgICAgICAgICAgICAgJ1BsZWFzZSBlbnN1cmUgeW91ciBwYWdlIGluY2x1ZGVzIG1hcGJveC1nbC5jc3MsIGFzIGRlc2NyaWJlZCAnICtcbiAgICAgICAgICAgICAgICAnaW4gaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvYXBpLy4nKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9zZXR1cENvbnRhaW5lcigpIHtcbiAgICAgICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5fY29udGFpbmVyO1xuICAgICAgICBjb250YWluZXIuY2xhc3NMaXN0LmFkZCgnbWFwYm94Z2wtbWFwJyk7XG5cbiAgICAgICAgY29uc3QgbWlzc2luZ0NTU0NhbmFyeSA9IHRoaXMuX21pc3NpbmdDU1NDYW5hcnkgPSBET00uY3JlYXRlKCdkaXYnLCAnbWFwYm94Z2wtY2FuYXJ5JywgY29udGFpbmVyKTtcbiAgICAgICAgbWlzc2luZ0NTU0NhbmFyeS5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgICAgIHRoaXMuX2RldGVjdE1pc3NpbmdDU1MoKTtcblxuICAgICAgICBjb25zdCBjYW52YXNDb250YWluZXIgPSB0aGlzLl9jYW52YXNDb250YWluZXIgPSBET00uY3JlYXRlKCdkaXYnLCAnbWFwYm94Z2wtY2FudmFzLWNvbnRhaW5lcicsIGNvbnRhaW5lcik7XG4gICAgICAgIGlmICh0aGlzLl9pbnRlcmFjdGl2ZSkge1xuICAgICAgICAgICAgY2FudmFzQ29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ21hcGJveGdsLWludGVyYWN0aXZlJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9jYW52YXMgPSBET00uY3JlYXRlKCdjYW52YXMnLCAnbWFwYm94Z2wtY2FudmFzJywgY2FudmFzQ29udGFpbmVyKTtcbiAgICAgICAgdGhpcy5fY2FudmFzLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgICAgICAgdGhpcy5fY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoJ3dlYmdsY29udGV4dGxvc3QnLCB0aGlzLl9jb250ZXh0TG9zdCwgZmFsc2UpO1xuICAgICAgICB0aGlzLl9jYW52YXMuYWRkRXZlbnRMaXN0ZW5lcignd2ViZ2xjb250ZXh0cmVzdG9yZWQnLCB0aGlzLl9jb250ZXh0UmVzdG9yZWQsIGZhbHNlKTtcbiAgICAgICAgdGhpcy5fY2FudmFzLnNldEF0dHJpYnV0ZSgndGFiaW5kZXgnLCAnMCcpO1xuICAgICAgICB0aGlzLl9jYW52YXMuc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgJ01hcCcpO1xuXG4gICAgICAgIGNvbnN0IGRpbWVuc2lvbnMgPSB0aGlzLl9jb250YWluZXJEaW1lbnNpb25zKCk7XG4gICAgICAgIHRoaXMuX3Jlc2l6ZUNhbnZhcyhkaW1lbnNpb25zWzBdLCBkaW1lbnNpb25zWzFdKTtcblxuICAgICAgICBjb25zdCBjb250cm9sQ29udGFpbmVyID0gdGhpcy5fY29udHJvbENvbnRhaW5lciA9IERPTS5jcmVhdGUoJ2RpdicsICdtYXBib3hnbC1jb250cm9sLWNvbnRhaW5lcicsIGNvbnRhaW5lcik7XG4gICAgICAgIGNvbnN0IHBvc2l0aW9ucyA9IHRoaXMuX2NvbnRyb2xQb3NpdGlvbnMgPSB7fTtcbiAgICAgICAgWyd0b3AtbGVmdCcsICd0b3AtcmlnaHQnLCAnYm90dG9tLWxlZnQnLCAnYm90dG9tLXJpZ2h0J10uZm9yRWFjaCgocG9zaXRpb25OYW1lKSA9PiB7XG4gICAgICAgICAgICBwb3NpdGlvbnNbcG9zaXRpb25OYW1lXSA9IERPTS5jcmVhdGUoJ2RpdicsIGBtYXBib3hnbC1jdHJsLSR7cG9zaXRpb25OYW1lfWAsIGNvbnRyb2xDb250YWluZXIpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBfcmVzaXplQ2FudmFzKHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IHBpeGVsUmF0aW8gPSB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyB8fCAxO1xuXG4gICAgICAgIC8vIFJlcXVlc3QgdGhlIHJlcXVpcmVkIGNhbnZhcyBzaXplIHRha2luZyB0aGUgcGl4ZWxyYXRpbyBpbnRvIGFjY291bnQuXG4gICAgICAgIHRoaXMuX2NhbnZhcy53aWR0aCA9IHBpeGVsUmF0aW8gKiB3aWR0aDtcbiAgICAgICAgdGhpcy5fY2FudmFzLmhlaWdodCA9IHBpeGVsUmF0aW8gKiBoZWlnaHQ7XG5cbiAgICAgICAgLy8gTWFpbnRhaW4gdGhlIHNhbWUgY2FudmFzIHNpemUsIHBvdGVudGlhbGx5IGRvd25zY2FsaW5nIGl0IGZvciBIaURQSSBkaXNwbGF5c1xuICAgICAgICB0aGlzLl9jYW52YXMuc3R5bGUud2lkdGggPSBgJHt3aWR0aH1weGA7XG4gICAgICAgIHRoaXMuX2NhbnZhcy5zdHlsZS5oZWlnaHQgPSBgJHtoZWlnaHR9cHhgO1xuICAgIH1cblxuICAgIF9zZXR1cFBhaW50ZXIoKSB7XG4gICAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBleHRlbmQoe30sIGlzU3VwcG9ydGVkLndlYkdMQ29udGV4dEF0dHJpYnV0ZXMsIHtcbiAgICAgICAgICAgIGZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQ6IHRoaXMuX2ZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQsXG4gICAgICAgICAgICBwcmVzZXJ2ZURyYXdpbmdCdWZmZXI6IHRoaXMuX3ByZXNlcnZlRHJhd2luZ0J1ZmZlcixcbiAgICAgICAgICAgIGFudGlhbGlhczogdGhpcy5fYW50aWFsaWFzIHx8IGZhbHNlXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGdsID0gdGhpcy5fY2FudmFzLmdldENvbnRleHQoJ3dlYmdsJywgYXR0cmlidXRlcykgfHxcbiAgICAgICAgICAgIHRoaXMuX2NhbnZhcy5nZXRDb250ZXh0KCdleHBlcmltZW50YWwtd2ViZ2wnLCBhdHRyaWJ1dGVzKTtcblxuICAgICAgICBpZiAoIWdsKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEVycm9yRXZlbnQobmV3IEVycm9yKCdGYWlsZWQgdG8gaW5pdGlhbGl6ZSBXZWJHTCcpKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnBhaW50ZXIgPSBuZXcgUGFpbnRlcihnbCwgdGhpcy50cmFuc2Zvcm0pO1xuXG4gICAgICAgIHdlYnBTdXBwb3J0ZWQudGVzdFN1cHBvcnQoZ2wpO1xuICAgIH1cblxuICAgIF9jb250ZXh0TG9zdChldmVudDogKikge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBpZiAodGhpcy5fZnJhbWUpIHtcbiAgICAgICAgICAgIHRoaXMuX2ZyYW1lLmNhbmNlbCgpO1xuICAgICAgICAgICAgdGhpcy5fZnJhbWUgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ3dlYmdsY29udGV4dGxvc3QnLCB7b3JpZ2luYWxFdmVudDogZXZlbnR9KSk7XG4gICAgfVxuXG4gICAgX2NvbnRleHRSZXN0b3JlZChldmVudDogKikge1xuICAgICAgICB0aGlzLl9zZXR1cFBhaW50ZXIoKTtcbiAgICAgICAgdGhpcy5yZXNpemUoKTtcbiAgICAgICAgdGhpcy5fdXBkYXRlKCk7XG4gICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ3dlYmdsY29udGV4dHJlc3RvcmVkJywge29yaWdpbmFsRXZlbnQ6IGV2ZW50fSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBCb29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgbWFwIGlzIGZ1bGx5IGxvYWRlZC5cbiAgICAgKlxuICAgICAqIFJldHVybnMgYGZhbHNlYCBpZiB0aGUgc3R5bGUgaXMgbm90IHlldCBmdWxseSBsb2FkZWQsXG4gICAgICogb3IgaWYgdGhlcmUgaGFzIGJlZW4gYSBjaGFuZ2UgdG8gdGhlIHNvdXJjZXMgb3Igc3R5bGUgdGhhdFxuICAgICAqIGhhcyBub3QgeWV0IGZ1bGx5IGxvYWRlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBBIEJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBtYXAgaXMgZnVsbHkgbG9hZGVkLlxuICAgICAqL1xuICAgIGxvYWRlZCgpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLl9zdHlsZURpcnR5ICYmICF0aGlzLl9zb3VyY2VzRGlydHkgJiYgISF0aGlzLnN0eWxlICYmIHRoaXMuc3R5bGUubG9hZGVkKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlIHRoaXMgbWFwJ3Mgc3R5bGUgYW5kIHNvdXJjZXMsIGFuZCByZS1yZW5kZXIgdGhlIG1hcC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gdXBkYXRlU3R5bGUgbWFyayB0aGUgbWFwJ3Mgc3R5bGUgZm9yIHJlcHJvY2Vzc2luZyBhc1xuICAgICAqIHdlbGwgYXMgaXRzIHNvdXJjZXNcbiAgICAgKiBAcmV0dXJucyB7TWFwfSB0aGlzXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfdXBkYXRlKHVwZGF0ZVN0eWxlPzogYm9vbGVhbikge1xuICAgICAgICBpZiAoIXRoaXMuc3R5bGUpIHJldHVybiB0aGlzO1xuXG4gICAgICAgIHRoaXMuX3N0eWxlRGlydHkgPSB0aGlzLl9zdHlsZURpcnR5IHx8IHVwZGF0ZVN0eWxlO1xuICAgICAgICB0aGlzLl9zb3VyY2VzRGlydHkgPSB0cnVlO1xuICAgICAgICB0aGlzLnRyaWdnZXJSZXBhaW50KCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVxdWVzdCB0aGF0IHRoZSBnaXZlbiBjYWxsYmFjayBiZSBleGVjdXRlZCBkdXJpbmcgdGhlIG5leHQgcmVuZGVyXG4gICAgICogZnJhbWUuICBTY2hlZHVsZSBhIHJlbmRlciBmcmFtZSBpZiBvbmUgaXMgbm90IGFscmVhZHkgc2NoZWR1bGVkLlxuICAgICAqIEByZXR1cm5zIEFuIGlkIHRoYXQgY2FuIGJlIHVzZWQgdG8gY2FuY2VsIHRoZSBjYWxsYmFja1xuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX3JlcXVlc3RSZW5kZXJGcmFtZShjYWxsYmFjazogKCkgPT4gdm9pZCk6IFRhc2tJRCB7XG4gICAgICAgIHRoaXMuX3VwZGF0ZSgpO1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVuZGVyVGFza1F1ZXVlLmFkZChjYWxsYmFjayk7XG4gICAgfVxuXG4gICAgX2NhbmNlbFJlbmRlckZyYW1lKGlkOiBUYXNrSUQpIHtcbiAgICAgICAgdGhpcy5fcmVuZGVyVGFza1F1ZXVlLnJlbW92ZShpZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FsbCB3aGVuIGEgKHJlLSlyZW5kZXIgb2YgdGhlIG1hcCBpcyByZXF1aXJlZDpcbiAgICAgKiAtIFRoZSBzdHlsZSBoYXMgY2hhbmdlZCAoYHNldFBhaW50UHJvcGVydHkoKWAsIGV0Yy4pXG4gICAgICogLSBTb3VyY2UgZGF0YSBoYXMgY2hhbmdlZCAoZS5nLiB0aWxlcyBoYXZlIGZpbmlzaGVkIGxvYWRpbmcpXG4gICAgICogLSBUaGUgbWFwIGhhcyBpcyBtb3ZpbmcgKG9yIGp1c3QgZmluaXNoZWQgbW92aW5nKVxuICAgICAqIC0gQSB0cmFuc2l0aW9uIGlzIGluIHByb2dyZXNzXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7TWFwfSB0aGlzXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfcmVuZGVyKCkge1xuICAgICAgICAvLyBBIGN1c3RvbSBsYXllciBtYXkgaGF2ZSB1c2VkIHRoZSBjb250ZXh0IGFzeW5jaHJvbm91c2x5LiBNYXJrIHRoZSBzdGF0ZSBhcyBkaXJ0eS5cbiAgICAgICAgdGhpcy5wYWludGVyLmNvbnRleHQuc2V0RGlydHkoKTtcbiAgICAgICAgdGhpcy5wYWludGVyLnNldEJhc2VTdGF0ZSgpO1xuXG4gICAgICAgIHRoaXMuX3JlbmRlclRhc2tRdWV1ZS5ydW4oKTtcblxuICAgICAgICBsZXQgY3Jvc3NGYWRpbmcgPSBmYWxzZTtcblxuICAgICAgICAvLyBJZiB0aGUgc3R5bGUgaGFzIGNoYW5nZWQsIHRoZSBtYXAgaXMgYmVpbmcgem9vbWVkLCBvciBhIHRyYW5zaXRpb24gb3IgZmFkZSBpcyBpbiBwcm9ncmVzczpcbiAgICAgICAgLy8gIC0gQXBwbHkgc3R5bGUgY2hhbmdlcyAoaW4gYSBiYXRjaClcbiAgICAgICAgLy8gIC0gUmVjYWxjdWxhdGUgcGFpbnQgcHJvcGVydGllcy5cbiAgICAgICAgaWYgKHRoaXMuc3R5bGUgJiYgdGhpcy5fc3R5bGVEaXJ0eSkge1xuICAgICAgICAgICAgdGhpcy5fc3R5bGVEaXJ0eSA9IGZhbHNlO1xuXG4gICAgICAgICAgICBjb25zdCB6b29tID0gdGhpcy50cmFuc2Zvcm0uem9vbTtcbiAgICAgICAgICAgIGNvbnN0IG5vdyA9IGJyb3dzZXIubm93KCk7XG4gICAgICAgICAgICB0aGlzLnN0eWxlLnpvb21IaXN0b3J5LnVwZGF0ZSh6b29tLCBub3cpO1xuXG4gICAgICAgICAgICBjb25zdCBwYXJhbWV0ZXJzID0gbmV3IEV2YWx1YXRpb25QYXJhbWV0ZXJzKHpvb20sIHtcbiAgICAgICAgICAgICAgICBub3csXG4gICAgICAgICAgICAgICAgZmFkZUR1cmF0aW9uOiB0aGlzLl9mYWRlRHVyYXRpb24sXG4gICAgICAgICAgICAgICAgem9vbUhpc3Rvcnk6IHRoaXMuc3R5bGUuem9vbUhpc3RvcnksXG4gICAgICAgICAgICAgICAgdHJhbnNpdGlvbjogdGhpcy5zdHlsZS5nZXRUcmFuc2l0aW9uKClcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBjb25zdCBmYWN0b3IgPSBwYXJhbWV0ZXJzLmNyb3NzRmFkaW5nRmFjdG9yKCk7XG4gICAgICAgICAgICBpZiAoZmFjdG9yICE9PSAxIHx8IGZhY3RvciAhPT0gdGhpcy5fY3Jvc3NGYWRpbmdGYWN0b3IpIHtcbiAgICAgICAgICAgICAgICBjcm9zc0ZhZGluZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5fY3Jvc3NGYWRpbmdGYWN0b3IgPSBmYWN0b3I7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuc3R5bGUudXBkYXRlKHBhcmFtZXRlcnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgd2UgYXJlIGluIF9yZW5kZXIgZm9yIGFueSByZWFzb24gb3RoZXIgdGhhbiBhbiBpbi1wcm9ncmVzcyBwYWludFxuICAgICAgICAvLyB0cmFuc2l0aW9uLCB1cGRhdGUgc291cmNlIGNhY2hlcyB0byBjaGVjayBmb3IgYW5kIGxvYWQgYW55IHRpbGVzIHdlXG4gICAgICAgIC8vIG5lZWQgZm9yIHRoZSBjdXJyZW50IHRyYW5zZm9ybVxuICAgICAgICBpZiAodGhpcy5zdHlsZSAmJiB0aGlzLl9zb3VyY2VzRGlydHkpIHtcbiAgICAgICAgICAgIHRoaXMuX3NvdXJjZXNEaXJ0eSA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5zdHlsZS5fdXBkYXRlU291cmNlcyh0aGlzLnRyYW5zZm9ybSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9wbGFjZW1lbnREaXJ0eSA9IHRoaXMuc3R5bGUgJiYgdGhpcy5zdHlsZS5fdXBkYXRlUGxhY2VtZW50KHRoaXMucGFpbnRlci50cmFuc2Zvcm0sIHRoaXMuc2hvd0NvbGxpc2lvbkJveGVzLCB0aGlzLl9mYWRlRHVyYXRpb24sIHRoaXMuX2Nyb3NzU291cmNlQ29sbGlzaW9ucyk7XG5cbiAgICAgICAgLy8gQWN0dWFsbHkgZHJhd1xuICAgICAgICB0aGlzLnBhaW50ZXIucmVuZGVyKHRoaXMuc3R5bGUsIHtcbiAgICAgICAgICAgIHNob3dUaWxlQm91bmRhcmllczogdGhpcy5zaG93VGlsZUJvdW5kYXJpZXMsXG4gICAgICAgICAgICBzaG93T3ZlcmRyYXdJbnNwZWN0b3I6IHRoaXMuX3Nob3dPdmVyZHJhd0luc3BlY3RvcixcbiAgICAgICAgICAgIHJvdGF0aW5nOiB0aGlzLmlzUm90YXRpbmcoKSxcbiAgICAgICAgICAgIHpvb21pbmc6IHRoaXMuaXNab29taW5nKCksXG4gICAgICAgICAgICBtb3Zpbmc6IHRoaXMuaXNNb3ZpbmcoKSxcbiAgICAgICAgICAgIGZhZGVEdXJhdGlvbjogdGhpcy5fZmFkZUR1cmF0aW9uXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ3JlbmRlcicpKTtcblxuICAgICAgICBpZiAodGhpcy5sb2FkZWQoKSAmJiAhdGhpcy5fbG9hZGVkKSB7XG4gICAgICAgICAgICB0aGlzLl9sb2FkZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgnbG9hZCcpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnN0eWxlICYmICh0aGlzLnN0eWxlLmhhc1RyYW5zaXRpb25zKCkgfHwgY3Jvc3NGYWRpbmcpKSB7XG4gICAgICAgICAgICB0aGlzLl9zdHlsZURpcnR5ID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnN0eWxlICYmICF0aGlzLl9wbGFjZW1lbnREaXJ0eSkge1xuICAgICAgICAgICAgLy8gU2luY2Ugbm8gZmFkZSBvcGVyYXRpb25zIGFyZSBpbiBwcm9ncmVzcywgd2UgY2FuIHJlbGVhc2VcbiAgICAgICAgICAgIC8vIGFsbCB0aWxlcyBoZWxkIGZvciBmYWRpbmcuIElmIHdlIGRpZG4ndCBkbyB0aGlzLCB0aGUgdGlsZXNcbiAgICAgICAgICAgIC8vIHdvdWxkIGp1c3Qgc2l0IGluIHRoZSBTb3VyY2VDYWNoZXMgdW50aWwgdGhlIG5leHQgcmVuZGVyXG4gICAgICAgICAgICB0aGlzLnN0eWxlLl9yZWxlYXNlU3ltYm9sRmFkZVRpbGVzKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTY2hlZHVsZSBhbm90aGVyIHJlbmRlciBmcmFtZSBpZiBpdCdzIG5lZWRlZC5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gRXZlbiB0aG91Z2ggYF9zdHlsZURpcnR5YCBhbmQgYF9zb3VyY2VzRGlydHlgIGFyZSByZXNldCBpbiB0aGlzXG4gICAgICAgIC8vIG1ldGhvZCwgc3luY2hyb25vdXMgZXZlbnRzIGZpcmVkIGR1cmluZyBTdHlsZSN1cGRhdGUgb3JcbiAgICAgICAgLy8gU3R5bGUjX3VwZGF0ZVNvdXJjZXMgY291bGQgaGF2ZSBjYXVzZWQgdGhlbSB0byBiZSBzZXQgYWdhaW4uXG4gICAgICAgIGlmICh0aGlzLl9zb3VyY2VzRGlydHkgfHwgdGhpcy5fcmVwYWludCB8fCB0aGlzLl9zdHlsZURpcnR5IHx8IHRoaXMuX3BsYWNlbWVudERpcnR5KSB7XG4gICAgICAgICAgICB0aGlzLnRyaWdnZXJSZXBhaW50KCk7XG4gICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuaXNNb3ZpbmcoKSAmJiB0aGlzLmxvYWRlZCgpKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEV2ZW50KCdpZGxlJykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsZWFuIHVwIGFuZCByZWxlYXNlIGFsbCBpbnRlcm5hbCByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbWFwLlxuICAgICAqXG4gICAgICogVGhpcyBpbmNsdWRlcyBET00gZWxlbWVudHMsIGV2ZW50IGJpbmRpbmdzLCB3ZWIgd29ya2VycywgYW5kIFdlYkdMIHJlc291cmNlcy5cbiAgICAgKlxuICAgICAqIFVzZSB0aGlzIG1ldGhvZCB3aGVuIHlvdSBhcmUgZG9uZSB1c2luZyB0aGUgbWFwIGFuZCB3aXNoIHRvIGVuc3VyZSB0aGF0IGl0IG5vXG4gICAgICogbG9uZ2VyIGNvbnN1bWVzIGJyb3dzZXIgcmVzb3VyY2VzLiBBZnRlcndhcmRzLCB5b3UgbXVzdCBub3QgY2FsbCBhbnkgb3RoZXJcbiAgICAgKiBtZXRob2RzIG9uIHRoZSBtYXAuXG4gICAgICovXG4gICAgcmVtb3ZlKCkge1xuICAgICAgICBpZiAodGhpcy5faGFzaCkgdGhpcy5faGFzaC5yZW1vdmUoKTtcblxuICAgICAgICBmb3IgKGNvbnN0IGNvbnRyb2wgb2YgdGhpcy5fY29udHJvbHMpIGNvbnRyb2wub25SZW1vdmUodGhpcyk7XG4gICAgICAgIHRoaXMuX2NvbnRyb2xzID0gW107XG5cbiAgICAgICAgaWYgKHRoaXMuX2ZyYW1lKSB7XG4gICAgICAgICAgICB0aGlzLl9mcmFtZS5jYW5jZWwoKTtcbiAgICAgICAgICAgIHRoaXMuX2ZyYW1lID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9yZW5kZXJUYXNrUXVldWUuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5zZXRTdHlsZShudWxsKTtcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy5fb25XaW5kb3dSZXNpemUsIGZhbHNlKTtcbiAgICAgICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdvbmxpbmUnLCB0aGlzLl9vbldpbmRvd09ubGluZSwgZmFsc2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZXh0ZW5zaW9uID0gdGhpcy5wYWludGVyLmNvbnRleHQuZ2wuZ2V0RXh0ZW5zaW9uKCdXRUJHTF9sb3NlX2NvbnRleHQnKTtcbiAgICAgICAgaWYgKGV4dGVuc2lvbikgZXh0ZW5zaW9uLmxvc2VDb250ZXh0KCk7XG4gICAgICAgIHJlbW92ZU5vZGUodGhpcy5fY2FudmFzQ29udGFpbmVyKTtcbiAgICAgICAgcmVtb3ZlTm9kZSh0aGlzLl9jb250cm9sQ29udGFpbmVyKTtcbiAgICAgICAgcmVtb3ZlTm9kZSh0aGlzLl9taXNzaW5nQ1NTQ2FuYXJ5KTtcbiAgICAgICAgdGhpcy5fY29udGFpbmVyLmNsYXNzTGlzdC5yZW1vdmUoJ21hcGJveGdsLW1hcCcpO1xuICAgICAgICB0aGlzLmZpcmUobmV3IEV2ZW50KCdyZW1vdmUnKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVHJpZ2dlciB0aGUgcmVuZGVyaW5nIG9mIGEgc2luZ2xlIGZyYW1lLiBVc2UgdGhpcyBtZXRob2Qgd2l0aCBjdXN0b20gbGF5ZXJzIHRvXG4gICAgICogcmVwYWludCB0aGUgbWFwIHdoZW4gdGhlIGxheWVyIGNoYW5nZXMuIENhbGxpbmcgdGhpcyBtdWx0aXBsZSB0aW1lcyBiZWZvcmUgdGhlXG4gICAgICogbmV4dCBmcmFtZSBpcyByZW5kZXJlZCB3aWxsIHN0aWxsIHJlc3VsdCBpbiBvbmx5IGEgc2luZ2xlIGZyYW1lIGJlaW5nIHJlbmRlcmVkLlxuICAgICAqL1xuICAgIHRyaWdnZXJSZXBhaW50KCkge1xuICAgICAgICBpZiAodGhpcy5zdHlsZSAmJiAhdGhpcy5fZnJhbWUpIHtcbiAgICAgICAgICAgIHRoaXMuX2ZyYW1lID0gYnJvd3Nlci5mcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZnJhbWUgPSBudWxsO1xuICAgICAgICAgICAgICAgIHRoaXMuX3JlbmRlcigpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfb25XaW5kb3dPbmxpbmUoKSB7XG4gICAgICAgIHRoaXMuX3VwZGF0ZSgpO1xuICAgIH1cblxuICAgIF9vbldpbmRvd1Jlc2l6ZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3RyYWNrUmVzaXplKSB7XG4gICAgICAgICAgICB0aGlzLnJlc2l6ZSgpLl91cGRhdGUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgYW5kIHNldHMgYSBCb29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgbWFwIHdpbGwgcmVuZGVyIGFuIG91dGxpbmVcbiAgICAgKiBhcm91bmQgZWFjaCB0aWxlLiBUaGVzZSB0aWxlIGJvdW5kYXJpZXMgYXJlIHVzZWZ1bCBmb3IgZGVidWdnaW5nLlxuICAgICAqXG4gICAgICogQG5hbWUgc2hvd1RpbGVCb3VuZGFyaWVzXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQGluc3RhbmNlXG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqL1xuICAgIGdldCBzaG93VGlsZUJvdW5kYXJpZXMoKTogYm9vbGVhbiB7IHJldHVybiAhIXRoaXMuX3Nob3dUaWxlQm91bmRhcmllczsgfVxuICAgIHNldCBzaG93VGlsZUJvdW5kYXJpZXModmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKHRoaXMuX3Nob3dUaWxlQm91bmRhcmllcyA9PT0gdmFsdWUpIHJldHVybjtcbiAgICAgICAgdGhpcy5fc2hvd1RpbGVCb3VuZGFyaWVzID0gdmFsdWU7XG4gICAgICAgIHRoaXMuX3VwZGF0ZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgYW5kIHNldHMgYSBCb29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgbWFwIHdpbGwgcmVuZGVyIGJveGVzXG4gICAgICogYXJvdW5kIGFsbCBzeW1ib2xzIGluIHRoZSBkYXRhIHNvdXJjZSwgcmV2ZWFsaW5nIHdoaWNoIHN5bWJvbHNcbiAgICAgKiB3ZXJlIHJlbmRlcmVkIG9yIHdoaWNoIHdlcmUgaGlkZGVuIGR1ZSB0byBjb2xsaXNpb25zLlxuICAgICAqIFRoaXMgaW5mb3JtYXRpb24gaXMgdXNlZnVsIGZvciBkZWJ1Z2dpbmcuXG4gICAgICpcbiAgICAgKiBAbmFtZSBzaG93Q29sbGlzaW9uQm94ZXNcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICovXG4gICAgZ2V0IHNob3dDb2xsaXNpb25Cb3hlcygpOiBib29sZWFuIHsgcmV0dXJuICEhdGhpcy5fc2hvd0NvbGxpc2lvbkJveGVzOyB9XG4gICAgc2V0IHNob3dDb2xsaXNpb25Cb3hlcyh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICBpZiAodGhpcy5fc2hvd0NvbGxpc2lvbkJveGVzID09PSB2YWx1ZSkgcmV0dXJuO1xuICAgICAgICB0aGlzLl9zaG93Q29sbGlzaW9uQm94ZXMgPSB2YWx1ZTtcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIHR1cm4gY29sbGlzaW9uIGJveGVzIG9uIHdlIGhhdmUgdG8gZ2VuZXJhdGUgdGhlbSBmb3IgZXhpc3RpbmcgdGlsZXNcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgdHVybiB0aGVtIG9mZiwgdGhlcmUncyBubyBjb3N0IHRvIGxlYXZpbmcgZXhpc3RpbmcgYm94ZXMgaW4gcGxhY2VcbiAgICAgICAgICAgIHRoaXMuc3R5bGUuX2dlbmVyYXRlQ29sbGlzaW9uQm94ZXMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgY2FsbCBhbiB1cGRhdGUgdG8gcmVtb3ZlIGNvbGxpc2lvbiBib3hlc1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKlxuICAgICAqIEdldHMgYW5kIHNldHMgYSBCb29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgbWFwIHNob3VsZCBjb2xvci1jb2RlXG4gICAgICogZWFjaCBmcmFnbWVudCB0byBzaG93IGhvdyBtYW55IHRpbWVzIGl0IGhhcyBiZWVuIHNoYWRlZC5cbiAgICAgKiBXaGl0ZSBmcmFnbWVudHMgaGF2ZSBiZWVuIHNoYWRlZCA4IG9yIG1vcmUgdGltZXMuXG4gICAgICogQmxhY2sgZnJhZ21lbnRzIGhhdmUgYmVlbiBzaGFkZWQgMCB0aW1lcy5cbiAgICAgKiBUaGlzIGluZm9ybWF0aW9uIGlzIHVzZWZ1bCBmb3IgZGVidWdnaW5nLlxuICAgICAqXG4gICAgICogQG5hbWUgc2hvd092ZXJkcmF3XG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQGluc3RhbmNlXG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqL1xuICAgIGdldCBzaG93T3ZlcmRyYXdJbnNwZWN0b3IoKTogYm9vbGVhbiB7IHJldHVybiAhIXRoaXMuX3Nob3dPdmVyZHJhd0luc3BlY3RvcjsgfVxuICAgIHNldCBzaG93T3ZlcmRyYXdJbnNwZWN0b3IodmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKHRoaXMuX3Nob3dPdmVyZHJhd0luc3BlY3RvciA9PT0gdmFsdWUpIHJldHVybjtcbiAgICAgICAgdGhpcy5fc2hvd092ZXJkcmF3SW5zcGVjdG9yID0gdmFsdWU7XG4gICAgICAgIHRoaXMuX3VwZGF0ZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgYW5kIHNldHMgYSBCb29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgbWFwIHdpbGxcbiAgICAgKiBjb250aW51b3VzbHkgcmVwYWludC4gVGhpcyBpbmZvcm1hdGlvbiBpcyB1c2VmdWwgZm9yIGFuYWx5emluZyBwZXJmb3JtYW5jZS5cbiAgICAgKlxuICAgICAqIEBuYW1lIHJlcGFpbnRcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICovXG4gICAgZ2V0IHJlcGFpbnQoKTogYm9vbGVhbiB7IHJldHVybiAhIXRoaXMuX3JlcGFpbnQ7IH1cbiAgICBzZXQgcmVwYWludCh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICBpZiAodGhpcy5fcmVwYWludCAhPT0gdmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuX3JlcGFpbnQgPSB2YWx1ZTtcbiAgICAgICAgICAgIHRoaXMudHJpZ2dlclJlcGFpbnQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBzaG93IHZlcnRpY2VzXG4gICAgZ2V0IHZlcnRpY2VzKCk6IGJvb2xlYW4geyByZXR1cm4gISF0aGlzLl92ZXJ0aWNlczsgfVxuICAgIHNldCB2ZXJ0aWNlcyh2YWx1ZTogYm9vbGVhbikgeyB0aGlzLl92ZXJ0aWNlcyA9IHZhbHVlOyB0aGlzLl91cGRhdGUoKTsgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBNYXA7XG5cbmZ1bmN0aW9uIHJlbW92ZU5vZGUobm9kZSkge1xuICAgIGlmIChub2RlLnBhcmVudE5vZGUpIHtcbiAgICAgICAgbm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG5vZGUpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBJbnRlcmZhY2UgZm9yIGludGVyYWN0aXZlIGNvbnRyb2xzIGFkZGVkIHRvIHRoZSBtYXAuIFRoaXMgaXMgYW5cbiAqIHNwZWNpZmljYXRpb24gZm9yIGltcGxlbWVudGVycyB0byBtb2RlbDogaXQgaXMgbm90XG4gKiBhbiBleHBvcnRlZCBtZXRob2Qgb3IgY2xhc3MuXG4gKlxuICogQ29udHJvbHMgbXVzdCBpbXBsZW1lbnQgYG9uQWRkYCBhbmQgYG9uUmVtb3ZlYCwgYW5kIG11c3Qgb3duIGFuXG4gKiBlbGVtZW50LCB3aGljaCBpcyBvZnRlbiBhIGBkaXZgIGVsZW1lbnQuIFRvIHVzZSBNYXBib3ggR0wgSlMnc1xuICogZGVmYXVsdCBjb250cm9sIHN0eWxpbmcsIGFkZCB0aGUgYG1hcGJveGdsLWN0cmxgIGNsYXNzIHRvIHlvdXIgY29udHJvbCdzXG4gKiBub2RlLlxuICpcbiAqIEBpbnRlcmZhY2UgSUNvbnRyb2xcbiAqIEBleGFtcGxlXG4gKiAvLyBDb250cm9sIGltcGxlbWVudGVkIGFzIEVTNiBjbGFzc1xuICogY2xhc3MgSGVsbG9Xb3JsZENvbnRyb2wge1xuICogICAgIG9uQWRkKG1hcCkge1xuICogICAgICAgICB0aGlzLl9tYXAgPSBtYXA7XG4gKiAgICAgICAgIHRoaXMuX2NvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICogICAgICAgICB0aGlzLl9jb250YWluZXIuY2xhc3NOYW1lID0gJ21hcGJveGdsLWN0cmwnO1xuICogICAgICAgICB0aGlzLl9jb250YWluZXIudGV4dENvbnRlbnQgPSAnSGVsbG8sIHdvcmxkJztcbiAqICAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnRhaW5lcjtcbiAqICAgICB9XG4gKlxuICogICAgIG9uUmVtb3ZlKCkge1xuICogICAgICAgICB0aGlzLl9jb250YWluZXIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLl9jb250YWluZXIpO1xuICogICAgICAgICB0aGlzLl9tYXAgPSB1bmRlZmluZWQ7XG4gKiAgICAgfVxuICogfVxuICpcbiAqIC8vIENvbnRyb2wgaW1wbGVtZW50ZWQgYXMgRVM1IHByb3RvdHlwaWNhbCBjbGFzc1xuICogZnVuY3Rpb24gSGVsbG9Xb3JsZENvbnRyb2woKSB7IH1cbiAqXG4gKiBIZWxsb1dvcmxkQ29udHJvbC5wcm90b3R5cGUub25BZGQgPSBmdW5jdGlvbihtYXApIHtcbiAqICAgICB0aGlzLl9tYXAgPSBtYXA7XG4gKiAgICAgdGhpcy5fY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gKiAgICAgdGhpcy5fY29udGFpbmVyLmNsYXNzTmFtZSA9ICdtYXBib3hnbC1jdHJsJztcbiAqICAgICB0aGlzLl9jb250YWluZXIudGV4dENvbnRlbnQgPSAnSGVsbG8sIHdvcmxkJztcbiAqICAgICByZXR1cm4gdGhpcy5fY29udGFpbmVyO1xuICogfTtcbiAqXG4gKiBIZWxsb1dvcmxkQ29udHJvbC5wcm90b3R5cGUub25SZW1vdmUgPSBmdW5jdGlvbiAoKSB7XG4gKiAgICAgIHRoaXMuX2NvbnRhaW5lci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuX2NvbnRhaW5lcik7XG4gKiAgICAgIHRoaXMuX21hcCA9IHVuZGVmaW5lZDtcbiAqIH07XG4gKi9cblxuLyoqXG4gKiBSZWdpc3RlciBhIGNvbnRyb2wgb24gdGhlIG1hcCBhbmQgZ2l2ZSBpdCBhIGNoYW5jZSB0byByZWdpc3RlciBldmVudCBsaXN0ZW5lcnNcbiAqIGFuZCByZXNvdXJjZXMuIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB7QGxpbmsgTWFwI2FkZENvbnRyb2x9XG4gKiBpbnRlcm5hbGx5LlxuICpcbiAqIEBmdW5jdGlvblxuICogQG1lbWJlcm9mIElDb250cm9sXG4gKiBAaW5zdGFuY2VcbiAqIEBuYW1lIG9uQWRkXG4gKiBAcGFyYW0ge01hcH0gbWFwIHRoZSBNYXAgdGhpcyBjb250cm9sIHdpbGwgYmUgYWRkZWQgdG9cbiAqIEByZXR1cm5zIHtIVE1MRWxlbWVudH0gVGhlIGNvbnRyb2wncyBjb250YWluZXIgZWxlbWVudC4gVGhpcyBzaG91bGRcbiAqIGJlIGNyZWF0ZWQgYnkgdGhlIGNvbnRyb2wgYW5kIHJldHVybmVkIGJ5IG9uQWRkIHdpdGhvdXQgYmVpbmcgYXR0YWNoZWRcbiAqIHRvIHRoZSBET006IHRoZSBtYXAgd2lsbCBpbnNlcnQgdGhlIGNvbnRyb2wncyBlbGVtZW50IGludG8gdGhlIERPTVxuICogYXMgbmVjZXNzYXJ5LlxuICovXG5cbi8qKlxuICogVW5yZWdpc3RlciBhIGNvbnRyb2wgb24gdGhlIG1hcCBhbmQgZ2l2ZSBpdCBhIGNoYW5jZSB0byBkZXRhY2ggZXZlbnQgbGlzdGVuZXJzXG4gKiBhbmQgcmVzb3VyY2VzLiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkge0BsaW5rIE1hcCNyZW1vdmVDb250cm9sfVxuICogaW50ZXJuYWxseS5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBtZW1iZXJvZiBJQ29udHJvbFxuICogQGluc3RhbmNlXG4gKiBAbmFtZSBvblJlbW92ZVxuICogQHBhcmFtIHtNYXB9IG1hcCB0aGUgTWFwIHRoaXMgY29udHJvbCB3aWxsIGJlIHJlbW92ZWQgZnJvbVxuICogQHJldHVybnMge3VuZGVmaW5lZH0gdGhlcmUgaXMgbm8gcmVxdWlyZWQgcmV0dXJuIHZhbHVlIGZvciB0aGlzIG1ldGhvZFxuICovXG5cbi8qKlxuICogT3B0aW9uYWxseSBwcm92aWRlIGEgZGVmYXVsdCBwb3NpdGlvbiBmb3IgdGhpcyBjb250cm9sLiBJZiB0aGlzIG1ldGhvZFxuICogaXMgaW1wbGVtZW50ZWQgYW5kIHtAbGluayBNYXAjYWRkQ29udHJvbH0gaXMgY2FsbGVkIHdpdGhvdXQgdGhlIGBwb3NpdGlvbmBcbiAqIHBhcmFtZXRlciwgdGhlIHZhbHVlIHJldHVybmVkIGJ5IGdldERlZmF1bHRQb3NpdGlvbiB3aWxsIGJlIHVzZWQgYXMgdGhlXG4gKiBjb250cm9sJ3MgcG9zaXRpb24uXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAbWVtYmVyb2YgSUNvbnRyb2xcbiAqIEBpbnN0YW5jZVxuICogQG5hbWUgZ2V0RGVmYXVsdFBvc2l0aW9uXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBhIGNvbnRyb2wgcG9zaXRpb24sIG9uZSBvZiB0aGUgdmFsdWVzIHZhbGlkIGluIGFkZENvbnRyb2wuXG4gKi9cblxuLyoqXG4gKiBBIFtgUG9pbnRgIGdlb21ldHJ5XShodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L3BvaW50LWdlb21ldHJ5KSBvYmplY3QsIHdoaWNoIGhhc1xuICogYHhgIGFuZCBgeWAgcHJvcGVydGllcyByZXByZXNlbnRpbmcgc2NyZWVuIGNvb3JkaW5hdGVzIGluIHBpeGVscy5cbiAqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBQb2ludFxuICovXG5cbi8qKlxuICogQSB7QGxpbmsgUG9pbnR9IG9yIGFuIGFycmF5IG9mIHR3byBudW1iZXJzIHJlcHJlc2VudGluZyBgeGAgYW5kIGB5YCBzY3JlZW4gY29vcmRpbmF0ZXMgaW4gcGl4ZWxzLlxuICpcbiAqIEB0eXBlZGVmIHsoUG9pbnQgfCBBcnJheTxudW1iZXI+KX0gUG9pbnRMaWtlXG4gKi9cbiIsIi8vIEBmbG93XG5cbmltcG9ydCBET00gZnJvbSAnLi4vLi4vdXRpbC9kb20nO1xuaW1wb3J0IHsgZXh0ZW5kLCBiaW5kQWxsIH0gZnJvbSAnLi4vLi4vdXRpbC91dGlsJztcbmltcG9ydCBEcmFnUm90YXRlSGFuZGxlciBmcm9tICcuLi9oYW5kbGVyL2RyYWdfcm90YXRlJztcblxuaW1wb3J0IHR5cGUgTWFwIGZyb20gJy4uL21hcCc7XG5cbnR5cGUgT3B0aW9ucyA9IHtcbiAgICBzaG93Q29tcGFzcz86IGJvb2xlYW4sXG4gICAgc2hvd1pvb20/OiBib29sZWFuXG59O1xuXG5jb25zdCBkZWZhdWx0T3B0aW9uczogT3B0aW9ucyA9IHtcbiAgICBzaG93Q29tcGFzczogdHJ1ZSxcbiAgICBzaG93Wm9vbTogdHJ1ZVxufTtcblxuLyoqXG4gKiBBIGBOYXZpZ2F0aW9uQ29udHJvbGAgY29udHJvbCBjb250YWlucyB6b29tIGJ1dHRvbnMgYW5kIGEgY29tcGFzcy5cbiAqXG4gKiBAaW1wbGVtZW50cyB7SUNvbnRyb2x9XG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnNob3dDb21wYXNzPXRydWVdIElmIGB0cnVlYCB0aGUgY29tcGFzcyBidXR0b24gaXMgaW5jbHVkZWQuXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnNob3dab29tPXRydWVdIElmIGB0cnVlYCB0aGUgem9vbS1pbiBhbmQgem9vbS1vdXQgYnV0dG9ucyBhcmUgaW5jbHVkZWQuXG4gKiBAZXhhbXBsZVxuICogdmFyIG5hdiA9IG5ldyBtYXBib3hnbC5OYXZpZ2F0aW9uQ29udHJvbCgpO1xuICogbWFwLmFkZENvbnRyb2wobmF2LCAndG9wLWxlZnQnKTtcbiAqIEBzZWUgW0Rpc3BsYXkgbWFwIG5hdmlnYXRpb24gY29udHJvbHNdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvbmF2aWdhdGlvbi8pXG4gKiBAc2VlIFtBZGQgYSB0aGlyZCBwYXJ0eSB2ZWN0b3IgdGlsZSBzb3VyY2VdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvdGhpcmQtcGFydHkvKVxuICovXG5jbGFzcyBOYXZpZ2F0aW9uQ29udHJvbCB7XG4gICAgX21hcDogTWFwO1xuICAgIG9wdGlvbnM6IE9wdGlvbnM7XG4gICAgX2NvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XG4gICAgX3pvb21JbkJ1dHRvbjogSFRNTEVsZW1lbnQ7XG4gICAgX3pvb21PdXRCdXR0b246IEhUTUxFbGVtZW50O1xuICAgIF9jb21wYXNzOiBIVE1MRWxlbWVudDtcbiAgICBfY29tcGFzc0Fycm93OiBIVE1MRWxlbWVudDtcbiAgICBfaGFuZGxlcjogRHJhZ1JvdGF0ZUhhbmRsZXI7XG5cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOiBPcHRpb25zKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IGV4dGVuZCh7fSwgZGVmYXVsdE9wdGlvbnMsIG9wdGlvbnMpO1xuXG4gICAgICAgIHRoaXMuX2NvbnRhaW5lciA9IERPTS5jcmVhdGUoJ2RpdicsICdtYXBib3hnbC1jdHJsIG1hcGJveGdsLWN0cmwtZ3JvdXAnKTtcbiAgICAgICAgdGhpcy5fY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51JywgKGUpID0+IGUucHJldmVudERlZmF1bHQoKSk7XG5cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zaG93Wm9vbSkge1xuICAgICAgICAgICAgYmluZEFsbChbXG4gICAgICAgICAgICAgICAgJ191cGRhdGVab29tQnV0dG9ucydcbiAgICAgICAgICAgIF0sIHRoaXMpO1xuICAgICAgICAgICAgdGhpcy5fem9vbUluQnV0dG9uID0gdGhpcy5fY3JlYXRlQnV0dG9uKCdtYXBib3hnbC1jdHJsLWljb24gbWFwYm94Z2wtY3RybC16b29tLWluJywgJ1pvb20gaW4nLCAoKSA9PiB0aGlzLl9tYXAuem9vbUluKCkpO1xuICAgICAgICAgICAgdGhpcy5fem9vbU91dEJ1dHRvbiA9IHRoaXMuX2NyZWF0ZUJ1dHRvbignbWFwYm94Z2wtY3RybC1pY29uIG1hcGJveGdsLWN0cmwtem9vbS1vdXQnLCAnWm9vbSBvdXQnLCAoKSA9PiB0aGlzLl9tYXAuem9vbU91dCgpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnNob3dDb21wYXNzKSB7XG4gICAgICAgICAgICBiaW5kQWxsKFtcbiAgICAgICAgICAgICAgICAnX3JvdGF0ZUNvbXBhc3NBcnJvdydcbiAgICAgICAgICAgIF0sIHRoaXMpO1xuICAgICAgICAgICAgdGhpcy5fY29tcGFzcyA9IHRoaXMuX2NyZWF0ZUJ1dHRvbignbWFwYm94Z2wtY3RybC1pY29uIG1hcGJveGdsLWN0cmwtY29tcGFzcycsICdSZXNldCBiZWFyaW5nIHRvIG5vcnRoJywgKCkgPT4gdGhpcy5fbWFwLnJlc2V0Tm9ydGgoKSk7XG4gICAgICAgICAgICB0aGlzLl9jb21wYXNzQXJyb3cgPSBET00uY3JlYXRlKCdzcGFuJywgJ21hcGJveGdsLWN0cmwtY29tcGFzcy1hcnJvdycsIHRoaXMuX2NvbXBhc3MpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX3VwZGF0ZVpvb21CdXR0b25zKCkge1xuICAgICAgICBjb25zdCB6b29tID0gdGhpcy5fbWFwLmdldFpvb20oKTtcbiAgICAgICAgdGhpcy5fem9vbUluQnV0dG9uLmNsYXNzTGlzdC50b2dnbGUoJ21hcGJveGdsLWN0cmwtaWNvbi1kaXNhYmxlZCcsIHpvb20gPT09IHRoaXMuX21hcC5nZXRNYXhab29tKCkpO1xuICAgICAgICB0aGlzLl96b29tT3V0QnV0dG9uLmNsYXNzTGlzdC50b2dnbGUoJ21hcGJveGdsLWN0cmwtaWNvbi1kaXNhYmxlZCcsIHpvb20gPT09IHRoaXMuX21hcC5nZXRNaW5ab29tKCkpO1xuICAgIH1cblxuICAgIF9yb3RhdGVDb21wYXNzQXJyb3coKSB7XG4gICAgICAgIGNvbnN0IHJvdGF0ZSA9IGByb3RhdGUoJHt0aGlzLl9tYXAudHJhbnNmb3JtLmFuZ2xlICogKDE4MCAvIE1hdGguUEkpfWRlZylgO1xuICAgICAgICB0aGlzLl9jb21wYXNzQXJyb3cuc3R5bGUudHJhbnNmb3JtID0gcm90YXRlO1xuICAgIH1cblxuICAgIG9uQWRkKG1hcDogTWFwKSB7XG4gICAgICAgIHRoaXMuX21hcCA9IG1hcDtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zaG93Wm9vbSkge1xuICAgICAgICAgICAgdGhpcy5fbWFwLm9uKCd6b29tJywgdGhpcy5fdXBkYXRlWm9vbUJ1dHRvbnMpO1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlWm9vbUJ1dHRvbnMoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnNob3dDb21wYXNzKSB7XG4gICAgICAgICAgICB0aGlzLl9tYXAub24oJ3JvdGF0ZScsIHRoaXMuX3JvdGF0ZUNvbXBhc3NBcnJvdyk7XG4gICAgICAgICAgICB0aGlzLl9yb3RhdGVDb21wYXNzQXJyb3coKTtcbiAgICAgICAgICAgIHRoaXMuX2hhbmRsZXIgPSBuZXcgRHJhZ1JvdGF0ZUhhbmRsZXIobWFwLCB7YnV0dG9uOiAnbGVmdCcsIGVsZW1lbnQ6IHRoaXMuX2NvbXBhc3N9KTtcbiAgICAgICAgICAgIERPTS5hZGRFdmVudExpc3RlbmVyKHRoaXMuX2NvbXBhc3MsICdtb3VzZWRvd24nLCB0aGlzLl9oYW5kbGVyLm9uTW91c2VEb3duKTtcbiAgICAgICAgICAgIHRoaXMuX2hhbmRsZXIuZW5hYmxlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnRhaW5lcjtcbiAgICB9XG5cbiAgICBvblJlbW92ZSgpIHtcbiAgICAgICAgRE9NLnJlbW92ZSh0aGlzLl9jb250YWluZXIpO1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnNob3dab29tKSB7XG4gICAgICAgICAgICB0aGlzLl9tYXAub2ZmKCd6b29tJywgdGhpcy5fdXBkYXRlWm9vbUJ1dHRvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2hvd0NvbXBhc3MpIHtcbiAgICAgICAgICAgIHRoaXMuX21hcC5vZmYoJ3JvdGF0ZScsIHRoaXMuX3JvdGF0ZUNvbXBhc3NBcnJvdyk7XG4gICAgICAgICAgICBET00ucmVtb3ZlRXZlbnRMaXN0ZW5lcih0aGlzLl9jb21wYXNzLCAnbW91c2Vkb3duJywgdGhpcy5faGFuZGxlci5vbk1vdXNlRG93bik7XG4gICAgICAgICAgICB0aGlzLl9oYW5kbGVyLmRpc2FibGUoKTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9oYW5kbGVyO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVsZXRlIHRoaXMuX21hcDtcbiAgICB9XG5cbiAgICBfY3JlYXRlQnV0dG9uKGNsYXNzTmFtZTogc3RyaW5nLCBhcmlhTGFiZWw6IHN0cmluZywgZm46ICgpID0+IG1peGVkKSB7XG4gICAgICAgIGNvbnN0IGEgPSBET00uY3JlYXRlKCdidXR0b24nLCBjbGFzc05hbWUsIHRoaXMuX2NvbnRhaW5lcik7XG4gICAgICAgIGEudHlwZSA9ICdidXR0b24nO1xuICAgICAgICBhLnRpdGxlID0gYXJpYUxhYmVsO1xuICAgICAgICBhLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsIGFyaWFMYWJlbCk7XG4gICAgICAgIGEuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmbik7XG4gICAgICAgIHJldHVybiBhO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgTmF2aWdhdGlvbkNvbnRyb2w7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgTG5nTGF0IGZyb20gJy4uL2dlby9sbmdfbGF0JztcblxuaW1wb3J0IHR5cGUgUG9pbnQgZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XG5pbXBvcnQgdHlwZSBUcmFuc2Zvcm0gZnJvbSAnLi4vZ2VvL3RyYW5zZm9ybSc7XG5cbi8qKlxuICogR2l2ZW4gYSBMbmdMYXQsIHByaW9yIHByb2plY3RlZCBwb3NpdGlvbiwgYW5kIGEgdHJhbnNmb3JtLCByZXR1cm4gYSBuZXcgTG5nTGF0IHNoaWZ0ZWRcbiAqIG4gw4PClyAzNjDDgsKwIGVhc3Qgb3Igd2VzdCBmb3Igc29tZSBuIMOiwonCpSAwIHN1Y2ggdGhhdDpcbiAqXG4gKiAqIHRoZSBwcm9qZWN0ZWQgbG9jYXRpb24gb2YgdGhlIHJlc3VsdCBpcyBvbiBzY3JlZW4sIGlmIHBvc3NpYmxlLCBhbmQgc2Vjb25kYXJpbHk6XG4gKiAqIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHByb2plY3RlZCBsb2NhdGlvbiBvZiB0aGUgcmVzdWx0IGFuZCB0aGUgcHJpb3IgcG9zaXRpb25cbiAqICAgaXMgbWluaW1pemVkLlxuICpcbiAqIFRoZSBvYmplY3QgaXMgdG8gcHJlc2VydmUgcGVyY2VpdmVkIG9iamVjdCBjb25zdGFuY3kgZm9yIFBvcHVwcyBhbmQgTWFya2VycyBhcyBtdWNoIGFzXG4gKiBwb3NzaWJsZTsgdGhleSBzaG91bGQgYXZvaWQgc2hpZnRpbmcgbGFyZ2UgZGlzdGFuY2VzIGFjcm9zcyB0aGUgc2NyZWVuLCBldmVuIHdoZW4gdGhlXG4gKiBtYXAgY2VudGVyIGNoYW5nZXMgYnkgw4LCsTM2MMOCwrAgZHVlIHRvIGF1dG9tYXRpYyB3cmFwcGluZywgYW5kIHdoZW4gYWJvdXQgdG8gZ28gb2ZmIHNjcmVlbixcbiAqIHNob3VsZCB3cmFwIGp1c3QgZW5vdWdoIHRvIGF2b2lkIGRvaW5nIHNvLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGxuZ0xhdDogTG5nTGF0LCBwcmlvclBvczogP1BvaW50LCB0cmFuc2Zvcm06IFRyYW5zZm9ybSk6IExuZ0xhdCB7XG4gICAgbG5nTGF0ID0gbmV3IExuZ0xhdChsbmdMYXQubG5nLCBsbmdMYXQubGF0KTtcblxuICAgIC8vIEZpcnN0LCB0cnkgc2hpZnRpbmcgb25lIHdvcmxkIGluIGVpdGhlciBkaXJlY3Rpb24sIGFuZCBzZWUgaWYgZWl0aGVyIGlzIGNsb3NlciB0byB0aGVcbiAgICAvLyBwcmlvciBwb3NpdGlvbi4gVGhpcyBwcmVzZXJ2ZXMgb2JqZWN0IGNvbnN0YW5jeSB3aGVuIHRoZSBtYXAgY2VudGVyIGlzIGF1dG8td3JhcHBlZFxuICAgIC8vIGR1cmluZyBhbmltYXRpb25zLlxuICAgIGlmIChwcmlvclBvcykge1xuICAgICAgICBjb25zdCBsZWZ0ICA9IG5ldyBMbmdMYXQobG5nTGF0LmxuZyAtIDM2MCwgbG5nTGF0LmxhdCk7XG4gICAgICAgIGNvbnN0IHJpZ2h0ID0gbmV3IExuZ0xhdChsbmdMYXQubG5nICsgMzYwLCBsbmdMYXQubGF0KTtcbiAgICAgICAgY29uc3QgZGVsdGEgPSB0cmFuc2Zvcm0ubG9jYXRpb25Qb2ludChsbmdMYXQpLmRpc3RTcXIocHJpb3JQb3MpO1xuICAgICAgICBpZiAodHJhbnNmb3JtLmxvY2F0aW9uUG9pbnQobGVmdCkuZGlzdFNxcihwcmlvclBvcykgPCBkZWx0YSkge1xuICAgICAgICAgICAgbG5nTGF0ID0gbGVmdDtcbiAgICAgICAgfSBlbHNlIGlmICh0cmFuc2Zvcm0ubG9jYXRpb25Qb2ludChyaWdodCkuZGlzdFNxcihwcmlvclBvcykgPCBkZWx0YSkge1xuICAgICAgICAgICAgbG5nTGF0ID0gcmlnaHQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTZWNvbmQsIHdyYXAgdG93YXJkIHRoZSBjZW50ZXIgdW50aWwgdGhlIG5ldyBwb3NpdGlvbiBpcyBvbiBzY3JlZW4sIG9yIHdlIGNhbid0IGdldFxuICAgIC8vIGFueSBjbG9zZXIuXG4gICAgd2hpbGUgKE1hdGguYWJzKGxuZ0xhdC5sbmcgLSB0cmFuc2Zvcm0uY2VudGVyLmxuZykgPiAxODApIHtcbiAgICAgICAgY29uc3QgcG9zID0gdHJhbnNmb3JtLmxvY2F0aW9uUG9pbnQobG5nTGF0KTtcbiAgICAgICAgaWYgKHBvcy54ID49IDAgJiYgcG9zLnkgPj0gMCAmJiBwb3MueCA8PSB0cmFuc2Zvcm0ud2lkdGggJiYgcG9zLnkgPD0gdHJhbnNmb3JtLmhlaWdodCkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxuZ0xhdC5sbmcgPiB0cmFuc2Zvcm0uY2VudGVyLmxuZykge1xuICAgICAgICAgICAgbG5nTGF0LmxuZyAtPSAzNjA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsbmdMYXQubG5nICs9IDM2MDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBsbmdMYXQ7XG59XG4iLCIvLyBAZmxvd1xuXG5leHBvcnQgdHlwZSBBbmNob3IgPVxuICAgIHwgJ2NlbnRlcidcbiAgICB8ICd0b3AnXG4gICAgfCAnYm90dG9tJ1xuICAgIHwgJ2xlZnQnXG4gICAgfCAncmlnaHQnXG4gICAgfCAndG9wLWxlZnQnXG4gICAgfCAndG9wLXJpZ2h0J1xuICAgIHwgJ2JvdHRvbS1sZWZ0J1xuICAgIHwgJ2JvdHRvbS1yaWdodCc7XG5cbmV4cG9ydCBjb25zdCBhbmNob3JUcmFuc2xhdGU6IHtbQW5jaG9yXTogc3RyaW5nfSA9IHtcbiAgICAnY2VudGVyJzogJ3RyYW5zbGF0ZSgtNTAlLC01MCUpJyxcbiAgICAndG9wJzogJ3RyYW5zbGF0ZSgtNTAlLDApJyxcbiAgICAndG9wLWxlZnQnOiAndHJhbnNsYXRlKDAsMCknLFxuICAgICd0b3AtcmlnaHQnOiAndHJhbnNsYXRlKC0xMDAlLDApJyxcbiAgICAnYm90dG9tJzogJ3RyYW5zbGF0ZSgtNTAlLC0xMDAlKScsXG4gICAgJ2JvdHRvbS1sZWZ0JzogJ3RyYW5zbGF0ZSgwLC0xMDAlKScsXG4gICAgJ2JvdHRvbS1yaWdodCc6ICd0cmFuc2xhdGUoLTEwMCUsLTEwMCUpJyxcbiAgICAnbGVmdCc6ICd0cmFuc2xhdGUoMCwtNTAlKScsXG4gICAgJ3JpZ2h0JzogJ3RyYW5zbGF0ZSgtMTAwJSwtNTAlKSdcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBseUFuY2hvckNsYXNzKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBhbmNob3I6IEFuY2hvciwgcHJlZml4OiBzdHJpbmcpIHtcbiAgICBjb25zdCBjbGFzc0xpc3QgPSBlbGVtZW50LmNsYXNzTGlzdDtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBhbmNob3JUcmFuc2xhdGUpIHtcbiAgICAgICAgY2xhc3NMaXN0LnJlbW92ZShgbWFwYm94Z2wtJHtwcmVmaXh9LWFuY2hvci0ke2tleX1gKTtcbiAgICB9XG4gICAgY2xhc3NMaXN0LmFkZChgbWFwYm94Z2wtJHtwcmVmaXh9LWFuY2hvci0ke2FuY2hvcn1gKTtcbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCBET00gZnJvbSAnLi4vdXRpbC9kb20nO1xuaW1wb3J0IHdpbmRvdyBmcm9tICcuLi91dGlsL3dpbmRvdyc7XG5pbXBvcnQgTG5nTGF0IGZyb20gJy4uL2dlby9sbmdfbGF0JztcbmltcG9ydCBQb2ludCBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcbmltcG9ydCBzbWFydFdyYXAgZnJvbSAnLi4vdXRpbC9zbWFydF93cmFwJztcbmltcG9ydCB7IGJpbmRBbGwsIGV4dGVuZCB9IGZyb20gJy4uL3V0aWwvdXRpbCc7XG5pbXBvcnQgeyB0eXBlIEFuY2hvciwgYW5jaG9yVHJhbnNsYXRlLCBhcHBseUFuY2hvckNsYXNzIH0gZnJvbSAnLi9hbmNob3InO1xuaW1wb3J0IHsgRXZlbnQsIEV2ZW50ZWQgfSBmcm9tICcuLi91dGlsL2V2ZW50ZWQnO1xuaW1wb3J0IHR5cGUgTWFwIGZyb20gJy4vbWFwJztcbmltcG9ydCB0eXBlIFBvcHVwIGZyb20gJy4vcG9wdXAnO1xuaW1wb3J0IHR5cGUge0xuZ0xhdExpa2V9IGZyb20gXCIuLi9nZW8vbG5nX2xhdFwiO1xuaW1wb3J0IHR5cGUge01hcE1vdXNlRXZlbnQsIE1hcFRvdWNoRXZlbnR9IGZyb20gJy4vZXZlbnRzJztcbmltcG9ydCB0eXBlIHtQb2ludExpa2V9IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuXG50eXBlIE9wdGlvbnMgPSB7XG4gICAgZWxlbWVudD86IEhUTUxFbGVtZW50LFxuICAgIG9mZnNldD86IFBvaW50TGlrZSxcbiAgICBhbmNob3I/OiBBbmNob3IsXG4gICAgY29sb3I/OiBzdHJpbmcsXG4gICAgZHJhZ2dhYmxlPzogYm9vbGVhblxufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbWFya2VyIGNvbXBvbmVudFxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gW29wdGlvbnMuZWxlbWVudF0gRE9NIGVsZW1lbnQgdG8gdXNlIGFzIGEgbWFya2VyLiBUaGUgZGVmYXVsdCBpcyBhIGxpZ2h0IGJsdWUsIGRyb3BsZXQtc2hhcGVkIFNWRyBtYXJrZXIuXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuYW5jaG9yPSdjZW50ZXInXSBBIHN0cmluZyBpbmRpY2F0aW5nIHRoZSBwYXJ0IG9mIHRoZSBNYXJrZXIgdGhhdCBzaG91bGQgYmUgcG9zaXRpb25lZCBjbG9zZXN0IHRvIHRoZSBjb29yZGluYXRlIHNldCB2aWEge0BsaW5rIE1hcmtlciNzZXRMbmdMYXR9LlxuICogICBPcHRpb25zIGFyZSBgJ2NlbnRlcidgLCBgJ3RvcCdgLCBgJ2JvdHRvbSdgLCBgJ2xlZnQnYCwgYCdyaWdodCdgLCBgJ3RvcC1sZWZ0J2AsIGAndG9wLXJpZ2h0J2AsIGAnYm90dG9tLWxlZnQnYCwgYW5kIGAnYm90dG9tLXJpZ2h0J2AuXG4gKiBAcGFyYW0ge1BvaW50TGlrZX0gW29wdGlvbnMub2Zmc2V0XSBUaGUgb2Zmc2V0IGluIHBpeGVscyBhcyBhIHtAbGluayBQb2ludExpa2V9IG9iamVjdCB0byBhcHBseSByZWxhdGl2ZSB0byB0aGUgZWxlbWVudCdzIGNlbnRlci4gTmVnYXRpdmVzIGluZGljYXRlIGxlZnQgYW5kIHVwLlxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmNvbG9yPScjM0ZCMUNFJ10gVGhlIGNvbG9yIHRvIHVzZSBmb3IgdGhlIGRlZmF1bHQgbWFya2VyIGlmIG9wdGlvbnMuZWxlbWVudCBpcyBub3QgcHJvdmlkZWQuIFRoZSBkZWZhdWx0IGlzIGxpZ2h0IGJsdWUuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmRyYWdnYWJsZT1mYWxzZV0gQSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBvciBub3QgYSBtYXJrZXIgaXMgYWJsZSB0byBiZSBkcmFnZ2VkIHRvIGEgbmV3IHBvc2l0aW9uIG9uIHRoZSBtYXAuXG4gKiBAZXhhbXBsZVxuICogdmFyIG1hcmtlciA9IG5ldyBtYXBib3hnbC5NYXJrZXIoKVxuICogICAuc2V0TG5nTGF0KFszMC41LCA1MC41XSlcbiAqICAgLmFkZFRvKG1hcCk7XG4gKiBAc2VlIFtBZGQgY3VzdG9tIGljb25zIHdpdGggTWFya2Vyc10oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9jdXN0b20tbWFya2VyLWljb25zLylcbiAqIEBzZWUgW0NyZWF0ZSBhIGRyYWdnYWJsZSBNYXJrZXJdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvZHJhZy1hLW1hcmtlci8pXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1hcmtlciBleHRlbmRzIEV2ZW50ZWQge1xuICAgIF9tYXA6IE1hcDtcbiAgICBfYW5jaG9yOiBBbmNob3I7XG4gICAgX29mZnNldDogUG9pbnQ7XG4gICAgX2VsZW1lbnQ6IEhUTUxFbGVtZW50O1xuICAgIF9wb3B1cDogP1BvcHVwO1xuICAgIF9sbmdMYXQ6IExuZ0xhdDtcbiAgICBfcG9zOiA/UG9pbnQ7XG4gICAgX2NvbG9yOiA/c3RyaW5nO1xuICAgIF9kZWZhdWx0TWFya2VyOiBib29sZWFuO1xuICAgIF9kcmFnZ2FibGU6IGJvb2xlYW47XG4gICAgX3N0YXRlOiAnaW5hY3RpdmUnIHwgJ3BlbmRpbmcnIHwgJ2FjdGl2ZSc7IC8vIHVzZWQgZm9yIGhhbmRsaW5nIGRyYWcgZXZlbnRzXG4gICAgX3Bvc2l0aW9uRGVsdGE6ID9udW1iZXI7XG5cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zPzogT3B0aW9ucywgbGVnYWN5T3B0aW9ucz86IE9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgLy8gRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgLS0gdGhlIGNvbnN0cnVjdG9yIHVzZWQgdG8gYWNjZXB0IHRoZSBlbGVtZW50IGFzIGFcbiAgICAgICAgLy8gcmVxdWlyZWQgZmlyc3QgYXJndW1lbnQsIGJlZm9yZSBpdCB3YXMgbWFkZSBvcHRpb25hbC5cbiAgICAgICAgaWYgKG9wdGlvbnMgaW5zdGFuY2VvZiB3aW5kb3cuSFRNTEVsZW1lbnQgfHwgbGVnYWN5T3B0aW9ucykge1xuICAgICAgICAgICAgb3B0aW9ucyA9IGV4dGVuZCh7ZWxlbWVudDogb3B0aW9uc30sIGxlZ2FjeU9wdGlvbnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgYmluZEFsbChbXG4gICAgICAgICAgICAnX3VwZGF0ZScsXG4gICAgICAgICAgICAnX29uTW92ZScsXG4gICAgICAgICAgICAnX29uVXAnLFxuICAgICAgICAgICAgJ19hZGREcmFnSGFuZGxlcicsXG4gICAgICAgICAgICAnX29uTWFwQ2xpY2snXG4gICAgICAgIF0sIHRoaXMpO1xuXG4gICAgICAgIHRoaXMuX2FuY2hvciA9IG9wdGlvbnMgJiYgb3B0aW9ucy5hbmNob3IgfHwgJ2NlbnRlcic7XG4gICAgICAgIHRoaXMuX2NvbG9yID0gb3B0aW9ucyAmJiBvcHRpb25zLmNvbG9yIHx8ICcjM0ZCMUNFJztcbiAgICAgICAgdGhpcy5fZHJhZ2dhYmxlID0gb3B0aW9ucyAmJiBvcHRpb25zLmRyYWdnYWJsZSB8fCBmYWxzZTtcbiAgICAgICAgdGhpcy5fc3RhdGUgPSAnaW5hY3RpdmUnO1xuXG4gICAgICAgIGlmICghb3B0aW9ucyB8fCAhb3B0aW9ucy5lbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLl9kZWZhdWx0TWFya2VyID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuX2VsZW1lbnQgPSBET00uY3JlYXRlKCdkaXYnKTtcblxuICAgICAgICAgICAgLy8gY3JlYXRlIGRlZmF1bHQgbWFwIG1hcmtlciBTVkdcbiAgICAgICAgICAgIGNvbnN0IHN2ZyA9IERPTS5jcmVhdGVOUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAnc3ZnJyk7XG4gICAgICAgICAgICBzdmcuc2V0QXR0cmlidXRlTlMobnVsbCwgJ2Rpc3BsYXknLCAnYmxvY2snKTtcbiAgICAgICAgICAgIHN2Zy5zZXRBdHRyaWJ1dGVOUyhudWxsLCAnaGVpZ2h0JywgJzQxcHgnKTtcbiAgICAgICAgICAgIHN2Zy5zZXRBdHRyaWJ1dGVOUyhudWxsLCAnd2lkdGgnLCAnMjdweCcpO1xuICAgICAgICAgICAgc3ZnLnNldEF0dHJpYnV0ZU5TKG51bGwsICd2aWV3Qm94JywgJzAgMCAyNyA0MScpO1xuXG4gICAgICAgICAgICBjb25zdCBtYXJrZXJMYXJnZSA9IERPTS5jcmVhdGVOUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAnZycpO1xuICAgICAgICAgICAgbWFya2VyTGFyZ2Uuc2V0QXR0cmlidXRlTlMobnVsbCwgJ3N0cm9rZScsICdub25lJyk7XG4gICAgICAgICAgICBtYXJrZXJMYXJnZS5zZXRBdHRyaWJ1dGVOUyhudWxsLCAnc3Ryb2tlLXdpZHRoJywgJzEnKTtcbiAgICAgICAgICAgIG1hcmtlckxhcmdlLnNldEF0dHJpYnV0ZU5TKG51bGwsICdmaWxsJywgJ25vbmUnKTtcbiAgICAgICAgICAgIG1hcmtlckxhcmdlLnNldEF0dHJpYnV0ZU5TKG51bGwsICdmaWxsLXJ1bGUnLCAnZXZlbm9kZCcpO1xuXG4gICAgICAgICAgICBjb25zdCBwYWdlMSA9IERPTS5jcmVhdGVOUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAnZycpO1xuICAgICAgICAgICAgcGFnZTEuc2V0QXR0cmlidXRlTlMobnVsbCwgJ2ZpbGwtcnVsZScsICdub256ZXJvJyk7XG5cbiAgICAgICAgICAgIGNvbnN0IHNoYWRvdyA9IERPTS5jcmVhdGVOUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAnZycpO1xuICAgICAgICAgICAgc2hhZG93LnNldEF0dHJpYnV0ZU5TKG51bGwsICd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKDMuMCwgMjkuMCknKTtcbiAgICAgICAgICAgIHNoYWRvdy5zZXRBdHRyaWJ1dGVOUyhudWxsLCAnZmlsbCcsICcjMDAwMDAwJyk7XG5cbiAgICAgICAgICAgIGNvbnN0IGVsbGlwc2VzID0gW1xuICAgICAgICAgICAgICAgIHsncngnOiAnMTAuNScsICdyeSc6ICc1LjI1MDAyMjczJ30sXG4gICAgICAgICAgICAgICAgeydyeCc6ICcxMC41JywgJ3J5JzogJzUuMjUwMDIyNzMnfSxcbiAgICAgICAgICAgICAgICB7J3J4JzogJzkuNScsICdyeSc6ICc0Ljc3Mjc1MDA3J30sXG4gICAgICAgICAgICAgICAgeydyeCc6ICc4LjUnLCAncnknOiAnNC4yOTU0OTkzNid9LFxuICAgICAgICAgICAgICAgIHsncngnOiAnNy41JywgJ3J5JzogJzMuODE4MjIzMDgnfSxcbiAgICAgICAgICAgICAgICB7J3J4JzogJzYuNScsICdyeSc6ICczLjM0MDk0Njc5J30sXG4gICAgICAgICAgICAgICAgeydyeCc6ICc1LjUnLCAncnknOiAnMi44NjM2NzA1MSd9LFxuICAgICAgICAgICAgICAgIHsncngnOiAnNC41JywgJ3J5JzogJzIuMzg2MzY4NjQnfVxuICAgICAgICAgICAgXTtcblxuICAgICAgICAgICAgZm9yIChjb25zdCBkYXRhIG9mIGVsbGlwc2VzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZWxsaXBzZSA9IERPTS5jcmVhdGVOUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAnZWxsaXBzZScpO1xuICAgICAgICAgICAgICAgIGVsbGlwc2Uuc2V0QXR0cmlidXRlTlMobnVsbCwgJ29wYWNpdHknLCAnMC4wNCcpO1xuICAgICAgICAgICAgICAgIGVsbGlwc2Uuc2V0QXR0cmlidXRlTlMobnVsbCwgJ2N4JywgJzEwLjUnKTtcbiAgICAgICAgICAgICAgICBlbGxpcHNlLnNldEF0dHJpYnV0ZU5TKG51bGwsICdjeScsICc1LjgwMDI5MDA4Jyk7XG4gICAgICAgICAgICAgICAgZWxsaXBzZS5zZXRBdHRyaWJ1dGVOUyhudWxsLCAncngnLCBkYXRhWydyeCddKTtcbiAgICAgICAgICAgICAgICBlbGxpcHNlLnNldEF0dHJpYnV0ZU5TKG51bGwsICdyeScsIGRhdGFbJ3J5J10pO1xuICAgICAgICAgICAgICAgIHNoYWRvdy5hcHBlbmRDaGlsZChlbGxpcHNlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgYmFja2dyb3VuZCA9IERPTS5jcmVhdGVOUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAnZycpO1xuICAgICAgICAgICAgYmFja2dyb3VuZC5zZXRBdHRyaWJ1dGVOUyhudWxsLCAnZmlsbCcsIHRoaXMuX2NvbG9yKTtcblxuICAgICAgICAgICAgY29uc3QgYmdQYXRoID0gRE9NLmNyZWF0ZU5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdwYXRoJyk7XG4gICAgICAgICAgICBiZ1BhdGguc2V0QXR0cmlidXRlTlMobnVsbCwgJ2QnLCAnTTI3LDEzLjUgQzI3LDE5LjA3NDY0NCAyMC4yNTAwMDEsMjcuMDAwMDAyIDE0Ljc1LDM0LjUwMDAwMiBDMTQuMDE2NjY1LDM1LjUwMDAwNCAxMi45ODMzMzUsMzUuNTAwMDA0IDEyLjI1LDM0LjUwMDAwMiBDNi43NDk5OTkzLDI3LjAwMDAwMiAwLDE5LjIyMjU2MiAwLDEzLjUgQzAsNi4wNDQxNTU5IDYuMDQ0MTU1OSwwIDEzLjUsMCBDMjAuOTU1ODQ0LDAgMjcsNi4wNDQxNTU5IDI3LDEzLjUgWicpO1xuXG4gICAgICAgICAgICBiYWNrZ3JvdW5kLmFwcGVuZENoaWxkKGJnUGF0aCk7XG5cbiAgICAgICAgICAgIGNvbnN0IGJvcmRlciA9IERPTS5jcmVhdGVOUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAnZycpO1xuICAgICAgICAgICAgYm9yZGVyLnNldEF0dHJpYnV0ZU5TKG51bGwsICdvcGFjaXR5JywgJzAuMjUnKTtcbiAgICAgICAgICAgIGJvcmRlci5zZXRBdHRyaWJ1dGVOUyhudWxsLCAnZmlsbCcsICcjMDAwMDAwJyk7XG5cbiAgICAgICAgICAgIGNvbnN0IGJvcmRlclBhdGggPSBET00uY3JlYXRlTlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgJ3BhdGgnKTtcbiAgICAgICAgICAgIGJvcmRlclBhdGguc2V0QXR0cmlidXRlTlMobnVsbCwgJ2QnLCAnTTEzLjUsMCBDNi4wNDQxNTU5LDAgMCw2LjA0NDE1NTkgMCwxMy41IEMwLDE5LjIyMjU2MiA2Ljc0OTk5OTMsMjcgMTIuMjUsMzQuNSBDMTMsMzUuNTIyNzI3IDE0LjAxNjY2NCwzNS41MDAwMDQgMTQuNzUsMzQuNSBDMjAuMjUwMDAxLDI3IDI3LDE5LjA3NDY0NCAyNywxMy41IEMyNyw2LjA0NDE1NTkgMjAuOTU1ODQ0LDAgMTMuNSwwIFogTTEzLjUsMSBDMjAuNDE1NDA0LDEgMjYsNi41ODQ1OTYgMjYsMTMuNSBDMjYsMTUuODk4NjU3IDI0LjQ5NTU4NCwxOS4xODE0MzEgMjIuMjIwNzAzLDIyLjczODI4MSBDMTkuOTQ1ODIzLDI2LjI5NTEzMiAxNi43MDUxMTksMzAuMTQyMTY3IDEzLjk0MzM1OSwzMy45MDgyMDMgQzEzLjc0MzQ0NSwzNC4xODA4MTQgMTMuNjEyNzE1LDM0LjMyMjczOCAxMy41LDM0LjQ0MTQwNiBDMTMuMzg3Mjg1LDM0LjMyMjczOCAxMy4yNTY1NTUsMzQuMTgwODE0IDEzLjA1NjY0MSwzMy45MDgyMDMgQzEwLjI4NDQ4MSwzMC4xMjc5ODUgNy40MTQ4Njg0LDI2LjMxNDE1OSA1LjAxNTYyNSwyMi43NzM0MzggQzIuNjE2MzgxNiwxOS4yMzI3MTUgMSwxNS45NTM1MzggMSwxMy41IEMxLDYuNTg0NTk2IDYuNTg0NTk2LDEgMTMuNSwxIFonKTtcblxuICAgICAgICAgICAgYm9yZGVyLmFwcGVuZENoaWxkKGJvcmRlclBhdGgpO1xuXG4gICAgICAgICAgICBjb25zdCBtYWtpID0gRE9NLmNyZWF0ZU5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdnJyk7XG4gICAgICAgICAgICBtYWtpLnNldEF0dHJpYnV0ZU5TKG51bGwsICd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKDYuMCwgNy4wKScpO1xuICAgICAgICAgICAgbWFraS5zZXRBdHRyaWJ1dGVOUyhudWxsLCAnZmlsbCcsICcjRkZGRkZGJyk7XG5cbiAgICAgICAgICAgIGNvbnN0IGNpcmNsZUNvbnRhaW5lciA9IERPTS5jcmVhdGVOUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAnZycpO1xuICAgICAgICAgICAgY2lyY2xlQ29udGFpbmVyLnNldEF0dHJpYnV0ZU5TKG51bGwsICd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKDguMCwgOC4wKScpO1xuXG4gICAgICAgICAgICBjb25zdCBjaXJjbGUxID0gRE9NLmNyZWF0ZU5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdjaXJjbGUnKTtcbiAgICAgICAgICAgIGNpcmNsZTEuc2V0QXR0cmlidXRlTlMobnVsbCwgJ2ZpbGwnLCAnIzAwMDAwMCcpO1xuICAgICAgICAgICAgY2lyY2xlMS5zZXRBdHRyaWJ1dGVOUyhudWxsLCAnb3BhY2l0eScsICcwLjI1Jyk7XG4gICAgICAgICAgICBjaXJjbGUxLnNldEF0dHJpYnV0ZU5TKG51bGwsICdjeCcsICc1LjUnKTtcbiAgICAgICAgICAgIGNpcmNsZTEuc2V0QXR0cmlidXRlTlMobnVsbCwgJ2N5JywgJzUuNScpO1xuICAgICAgICAgICAgY2lyY2xlMS5zZXRBdHRyaWJ1dGVOUyhudWxsLCAncicsICc1LjQ5OTk5NjInKTtcblxuICAgICAgICAgICAgY29uc3QgY2lyY2xlMiA9IERPTS5jcmVhdGVOUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAnY2lyY2xlJyk7XG4gICAgICAgICAgICBjaXJjbGUyLnNldEF0dHJpYnV0ZU5TKG51bGwsICdmaWxsJywgJyNGRkZGRkYnKTtcbiAgICAgICAgICAgIGNpcmNsZTIuc2V0QXR0cmlidXRlTlMobnVsbCwgJ2N4JywgJzUuNScpO1xuICAgICAgICAgICAgY2lyY2xlMi5zZXRBdHRyaWJ1dGVOUyhudWxsLCAnY3knLCAnNS41Jyk7XG4gICAgICAgICAgICBjaXJjbGUyLnNldEF0dHJpYnV0ZU5TKG51bGwsICdyJywgJzUuNDk5OTk2MicpO1xuXG4gICAgICAgICAgICBjaXJjbGVDb250YWluZXIuYXBwZW5kQ2hpbGQoY2lyY2xlMSk7XG4gICAgICAgICAgICBjaXJjbGVDb250YWluZXIuYXBwZW5kQ2hpbGQoY2lyY2xlMik7XG5cbiAgICAgICAgICAgIHBhZ2UxLmFwcGVuZENoaWxkKHNoYWRvdyk7XG4gICAgICAgICAgICBwYWdlMS5hcHBlbmRDaGlsZChiYWNrZ3JvdW5kKTtcbiAgICAgICAgICAgIHBhZ2UxLmFwcGVuZENoaWxkKGJvcmRlcik7XG4gICAgICAgICAgICBwYWdlMS5hcHBlbmRDaGlsZChtYWtpKTtcbiAgICAgICAgICAgIHBhZ2UxLmFwcGVuZENoaWxkKGNpcmNsZUNvbnRhaW5lcik7XG5cbiAgICAgICAgICAgIHN2Zy5hcHBlbmRDaGlsZChwYWdlMSk7XG5cbiAgICAgICAgICAgIHRoaXMuX2VsZW1lbnQuYXBwZW5kQ2hpbGQoc3ZnKTtcblxuICAgICAgICAgICAgLy8gaWYgbm8gZWxlbWVudCBhbmQgbm8gb2Zmc2V0IG9wdGlvbiBnaXZlbiBhcHBseSBhbiBvZmZzZXQgZm9yIHRoZSBkZWZhdWx0IG1hcmtlclxuICAgICAgICAgICAgLy8gdGhlIC0xNCBhcyB0aGUgeSB2YWx1ZSBvZiB0aGUgZGVmYXVsdCBtYXJrZXIgb2Zmc2V0IHdhcyBkZXRlcm1pbmVkIGFzIGZvbGxvd3NcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyB0aGUgbWFya2VyIHRpcCBpcyBhdCB0aGUgY2VudGVyIG9mIHRoZSBzaGFkb3cgZWxsaXBzZSBmcm9tIHRoZSBkZWZhdWx0IHN2Z1xuICAgICAgICAgICAgLy8gdGhlIHkgdmFsdWUgb2YgdGhlIGNlbnRlciBvZiB0aGUgc2hhZG93IGVsbGlwc2UgcmVsYXRpdmUgdG8gdGhlIHN2ZyB0b3AgbGVmdCBpcyBcInNoYWRvdyB0cmFuc2Zvcm0gdHJhbnNsYXRlLXkgKDI5LjApICsgZWxsaXBzZSBjeSAoNS44MDAyOTAwOClcIlxuICAgICAgICAgICAgLy8gb2Zmc2V0IHRvIHRoZSBzdmcgY2VudGVyIFwiaGVpZ2h0ICg0MSAvIDIpXCIgZ2l2ZXMgKDI5LjAgKyA1LjgwMDI5MDA4KSAtICg0MSAvIDIpIGFuZCByb3VuZGVkIGZvciBhbiBpbnRlZ2VyIHBpeGVsIG9mZnNldCBnaXZlcyAxNFxuICAgICAgICAgICAgLy8gbmVnYXRpdmUgaXMgdXNlZCB0byBtb3ZlIHRoZSBtYXJrZXIgdXAgZnJvbSB0aGUgY2VudGVyIHNvIHRoZSB0aXAgaXMgYXQgdGhlIE1hcmtlciBsbmdMYXRcbiAgICAgICAgICAgIHRoaXMuX29mZnNldCA9IFBvaW50LmNvbnZlcnQob3B0aW9ucyAmJiBvcHRpb25zLm9mZnNldCB8fCBbMCwgLTE0XSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9lbGVtZW50ID0gb3B0aW9ucy5lbGVtZW50O1xuICAgICAgICAgICAgdGhpcy5fb2Zmc2V0ID0gUG9pbnQuY29udmVydChvcHRpb25zICYmIG9wdGlvbnMub2Zmc2V0IHx8IFswLCAwXSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoJ21hcGJveGdsLW1hcmtlcicpO1xuICAgICAgICB0aGlzLl9lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdzdGFydCcsIChlOiBEcmFnRXZlbnQpID0+IHtcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGFwcGx5QW5jaG9yQ2xhc3ModGhpcy5fZWxlbWVudCwgdGhpcy5fYW5jaG9yLCAnbWFya2VyJyk7XG5cbiAgICAgICAgdGhpcy5fcG9wdXAgPSBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEF0dGFjaGVzIHRoZSBtYXJrZXIgdG8gYSBtYXBcbiAgICAgKiBAcGFyYW0ge01hcH0gbWFwXG4gICAgICogQHJldHVybnMge01hcmtlcn0gYHRoaXNgXG4gICAgICovXG4gICAgYWRkVG8obWFwOiBNYXApIHtcbiAgICAgICAgdGhpcy5yZW1vdmUoKTtcbiAgICAgICAgdGhpcy5fbWFwID0gbWFwO1xuICAgICAgICBtYXAuZ2V0Q2FudmFzQ29udGFpbmVyKCkuYXBwZW5kQ2hpbGQodGhpcy5fZWxlbWVudCk7XG4gICAgICAgIG1hcC5vbignbW92ZScsIHRoaXMuX3VwZGF0ZSk7XG4gICAgICAgIG1hcC5vbignbW92ZWVuZCcsIHRoaXMuX3VwZGF0ZSk7XG4gICAgICAgIHRoaXMuc2V0RHJhZ2dhYmxlKHRoaXMuX2RyYWdnYWJsZSk7XG4gICAgICAgIHRoaXMuX3VwZGF0ZSgpO1xuXG4gICAgICAgIC8vIElmIHdlIGF0dGFjaGVkIHRoZSBgY2xpY2tgIGxpc3RlbmVyIHRvIHRoZSBtYXJrZXIgZWxlbWVudCwgdGhlIHBvcHVwXG4gICAgICAgIC8vIHdvdWxkIGNsb3NlIG9uY2UgdGhlIGV2ZW50IHByb3BvZ2F0ZWQgdG8gYG1hcGAgZHVlIHRvIHRoZVxuICAgICAgICAvLyBgUG9wdXAjX29uQ2xpY2tDbG9zZWAgbGlzdGVuZXIuXG4gICAgICAgIHRoaXMuX21hcC5vbignY2xpY2snLCB0aGlzLl9vbk1hcENsaWNrKTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRoZSBtYXJrZXIgZnJvbSBhIG1hcFxuICAgICAqIEBleGFtcGxlXG4gICAgICogdmFyIG1hcmtlciA9IG5ldyBtYXBib3hnbC5NYXJrZXIoKS5hZGRUbyhtYXApO1xuICAgICAqIG1hcmtlci5yZW1vdmUoKTtcbiAgICAgKiBAcmV0dXJucyB7TWFya2VyfSBgdGhpc2BcbiAgICAgKi9cbiAgICByZW1vdmUoKSB7XG4gICAgICAgIGlmICh0aGlzLl9tYXApIHtcbiAgICAgICAgICAgIHRoaXMuX21hcC5vZmYoJ2NsaWNrJywgdGhpcy5fb25NYXBDbGljayk7XG4gICAgICAgICAgICB0aGlzLl9tYXAub2ZmKCdtb3ZlJywgdGhpcy5fdXBkYXRlKTtcbiAgICAgICAgICAgIHRoaXMuX21hcC5vZmYoJ21vdmVlbmQnLCB0aGlzLl91cGRhdGUpO1xuICAgICAgICAgICAgdGhpcy5fbWFwLm9mZignbW91c2Vkb3duJywgdGhpcy5fYWRkRHJhZ0hhbmRsZXIpO1xuICAgICAgICAgICAgdGhpcy5fbWFwLm9mZigndG91Y2hzdGFydCcsIHRoaXMuX2FkZERyYWdIYW5kbGVyKTtcbiAgICAgICAgICAgIHRoaXMuX21hcC5vZmYoJ21vdXNldXAnLCB0aGlzLl9vblVwKTtcbiAgICAgICAgICAgIHRoaXMuX21hcC5vZmYoJ3RvdWNoZW5kJywgdGhpcy5fb25VcCk7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5fbWFwO1xuICAgICAgICB9XG4gICAgICAgIERPTS5yZW1vdmUodGhpcy5fZWxlbWVudCk7XG4gICAgICAgIGlmICh0aGlzLl9wb3B1cCkgdGhpcy5fcG9wdXAucmVtb3ZlKCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgbWFya2VyJ3MgZ2VvZ3JhcGhpY2FsIGxvY2F0aW9uLlxuICAgICAqXG4gICAgICogVGhlIGxvbmdpdHVkZSBvZiB0aGUgcmVzdWx0IG1heSBkaWZmZXIgYnkgYSBtdWx0aXBsZSBvZiAzNjAgZGVncmVlcyBmcm9tIHRoZSBsb25naXR1ZGUgcHJldmlvdXNseVxuICAgICAqIHNldCBieSBgc2V0TG5nTGF0YCBiZWNhdXNlIGBNYXJrZXJgIHdyYXBzIHRoZSBhbmNob3IgbG9uZ2l0dWRlIGFjcm9zcyBjb3BpZXMgb2YgdGhlIHdvcmxkIHRvIGtlZXBcbiAgICAgKiB0aGUgbWFya2VyIG9uIHNjcmVlbi5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtMbmdMYXR9XG4gICAgICovXG4gICAgZ2V0TG5nTGF0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbG5nTGF0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgbWFya2VyJ3MgZ2VvZ3JhcGhpY2FsIHBvc2l0aW9uIGFuZCBtb3ZlIGl0LlxuICAgICAqIEByZXR1cm5zIHtNYXJrZXJ9IGB0aGlzYFxuICAgICAqL1xuICAgIHNldExuZ0xhdChsbmdsYXQ6IExuZ0xhdExpa2UpIHtcbiAgICAgICAgdGhpcy5fbG5nTGF0ID0gTG5nTGF0LmNvbnZlcnQobG5nbGF0KTtcbiAgICAgICAgdGhpcy5fcG9zID0gbnVsbDtcbiAgICAgICAgaWYgKHRoaXMuX3BvcHVwKSB0aGlzLl9wb3B1cC5zZXRMbmdMYXQodGhpcy5fbG5nTGF0KTtcbiAgICAgICAgdGhpcy5fdXBkYXRlKCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGBNYXJrZXJgJ3MgSFRNTCBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICAgICAqL1xuICAgIGdldEVsZW1lbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9lbGVtZW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEJpbmRzIGEgUG9wdXAgdG8gdGhlIE1hcmtlclxuICAgICAqIEBwYXJhbSBwb3B1cCBhbiBpbnN0YW5jZSBvZiB0aGUgYFBvcHVwYCBjbGFzcy4gSWYgdW5kZWZpbmVkIG9yIG51bGwsIGFueSBwb3B1cFxuICAgICAqIHNldCBvbiB0aGlzIGBNYXJrZXJgIGluc3RhbmNlIGlzIHVuc2V0XG4gICAgICogQHJldHVybnMge01hcmtlcn0gYHRoaXNgXG4gICAgICovXG4gICAgc2V0UG9wdXAocG9wdXA6ID9Qb3B1cCkge1xuICAgICAgICBpZiAodGhpcy5fcG9wdXApIHtcbiAgICAgICAgICAgIHRoaXMuX3BvcHVwLnJlbW92ZSgpO1xuICAgICAgICAgICAgdGhpcy5fcG9wdXAgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBvcHVwKSB7XG4gICAgICAgICAgICBpZiAoISgnb2Zmc2V0JyBpbiBwb3B1cC5vcHRpb25zKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1hcmtlckhlaWdodCA9IDQxIC0gKDUuOCAvIDIpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG1hcmtlclJhZGl1cyA9IDEzLjU7XG4gICAgICAgICAgICAgICAgY29uc3QgbGluZWFyT2Zmc2V0ID0gTWF0aC5zcXJ0KE1hdGgucG93KG1hcmtlclJhZGl1cywgMikgLyAyKTtcbiAgICAgICAgICAgICAgICBwb3B1cC5vcHRpb25zLm9mZnNldCA9IHRoaXMuX2RlZmF1bHRNYXJrZXIgPyB7XG4gICAgICAgICAgICAgICAgICAgICd0b3AnOiBbMCwgMF0sXG4gICAgICAgICAgICAgICAgICAgICd0b3AtbGVmdCc6IFswLCAwXSxcbiAgICAgICAgICAgICAgICAgICAgJ3RvcC1yaWdodCc6IFswLCAwXSxcbiAgICAgICAgICAgICAgICAgICAgJ2JvdHRvbSc6IFswLCAtbWFya2VySGVpZ2h0XSxcbiAgICAgICAgICAgICAgICAgICAgJ2JvdHRvbS1sZWZ0JzogW2xpbmVhck9mZnNldCwgKG1hcmtlckhlaWdodCAtIG1hcmtlclJhZGl1cyArIGxpbmVhck9mZnNldCkgKiAtMV0sXG4gICAgICAgICAgICAgICAgICAgICdib3R0b20tcmlnaHQnOiBbLWxpbmVhck9mZnNldCwgKG1hcmtlckhlaWdodCAtIG1hcmtlclJhZGl1cyArIGxpbmVhck9mZnNldCkgKiAtMV0sXG4gICAgICAgICAgICAgICAgICAgICdsZWZ0JzogW21hcmtlclJhZGl1cywgKG1hcmtlckhlaWdodCAtIG1hcmtlclJhZGl1cykgKiAtMV0sXG4gICAgICAgICAgICAgICAgICAgICdyaWdodCc6IFstbWFya2VyUmFkaXVzLCAobWFya2VySGVpZ2h0IC0gbWFya2VyUmFkaXVzKSAqIC0xXVxuICAgICAgICAgICAgICAgIH0gOiB0aGlzLl9vZmZzZXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9wb3B1cCA9IHBvcHVwO1xuICAgICAgICAgICAgaWYgKHRoaXMuX2xuZ0xhdCkgdGhpcy5fcG9wdXAuc2V0TG5nTGF0KHRoaXMuX2xuZ0xhdCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBfb25NYXBDbGljayhlOiBNYXBNb3VzZUV2ZW50KSB7XG4gICAgICAgIGNvbnN0IHRhcmdldEVsZW1lbnQgPSBlLm9yaWdpbmFsRXZlbnQudGFyZ2V0O1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5fZWxlbWVudDtcblxuICAgICAgICBpZiAodGhpcy5fcG9wdXAgJiYgKHRhcmdldEVsZW1lbnQgPT09IGVsZW1lbnQgfHwgZWxlbWVudC5jb250YWlucygodGFyZ2V0RWxlbWVudDogYW55KSkpKSB7XG4gICAgICAgICAgICB0aGlzLnRvZ2dsZVBvcHVwKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBQb3B1cCBpbnN0YW5jZSB0aGF0IGlzIGJvdW5kIHRvIHRoZSBNYXJrZXJcbiAgICAgKiBAcmV0dXJucyB7UG9wdXB9IHBvcHVwXG4gICAgICovXG4gICAgZ2V0UG9wdXAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wb3B1cDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPcGVucyBvciBjbG9zZXMgdGhlIGJvdW5kIHBvcHVwLCBkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgc3RhdGVcbiAgICAgKiBAcmV0dXJucyB7TWFya2VyfSBgdGhpc2BcbiAgICAgKi9cbiAgICB0b2dnbGVQb3B1cCgpIHtcbiAgICAgICAgY29uc3QgcG9wdXAgPSB0aGlzLl9wb3B1cDtcblxuICAgICAgICBpZiAoIXBvcHVwKSByZXR1cm4gdGhpcztcbiAgICAgICAgZWxzZSBpZiAocG9wdXAuaXNPcGVuKCkpIHBvcHVwLnJlbW92ZSgpO1xuICAgICAgICBlbHNlIHBvcHVwLmFkZFRvKHRoaXMuX21hcCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIF91cGRhdGUoZT86IHt0eXBlOiAnbW92ZScgfCAnbW92ZWVuZCd9KSB7XG4gICAgICAgIGlmICghdGhpcy5fbWFwKSByZXR1cm47XG5cbiAgICAgICAgaWYgKHRoaXMuX21hcC50cmFuc2Zvcm0ucmVuZGVyV29ybGRDb3BpZXMpIHtcbiAgICAgICAgICAgIHRoaXMuX2xuZ0xhdCA9IHNtYXJ0V3JhcCh0aGlzLl9sbmdMYXQsIHRoaXMuX3BvcywgdGhpcy5fbWFwLnRyYW5zZm9ybSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9wb3MgPSB0aGlzLl9tYXAucHJvamVjdCh0aGlzLl9sbmdMYXQpLl9hZGQodGhpcy5fb2Zmc2V0KTtcblxuICAgICAgICAvLyBiZWNhdXNlIHJvdW5kaW5nIHRoZSBjb29yZGluYXRlcyBhdCBldmVyeSBgbW92ZWAgZXZlbnQgY2F1c2VzIHN0dXR0ZXJlZCB6b29taW5nXG4gICAgICAgIC8vIHdlIG9ubHkgcm91bmQgdGhlbSB3aGVuIF91cGRhdGUgaXMgY2FsbGVkIHdpdGggYG1vdmVlbmRgIG9yIHdoZW4gaXRzIGNhbGxlZCB3aXRoXG4gICAgICAgIC8vIG5vIGFyZ3VtZW50cyAod2hlbiB0aGUgTWFya2VyIGlzIGluaXRpYWxpemVkIG9yIE1hcmtlciNzZXRMbmdMYXQgaXMgaW52b2tlZCkuXG4gICAgICAgIGlmICghZSB8fCBlLnR5cGUgPT09IFwibW92ZWVuZFwiKSB7XG4gICAgICAgICAgICB0aGlzLl9wb3MgPSB0aGlzLl9wb3Mucm91bmQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIERPTS5zZXRUcmFuc2Zvcm0odGhpcy5fZWxlbWVudCwgYCR7YW5jaG9yVHJhbnNsYXRlW3RoaXMuX2FuY2hvcl19IHRyYW5zbGF0ZSgke3RoaXMuX3Bvcy54fXB4LCAke3RoaXMuX3Bvcy55fXB4KWApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgbWFya2VyJ3Mgb2Zmc2V0LlxuICAgICAqIEByZXR1cm5zIHtQb2ludH1cbiAgICAgKi9cbiAgICBnZXRPZmZzZXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9vZmZzZXQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgb2Zmc2V0IG9mIHRoZSBtYXJrZXJcbiAgICAgKiBAcGFyYW0ge1BvaW50TGlrZX0gb2Zmc2V0IFRoZSBvZmZzZXQgaW4gcGl4ZWxzIGFzIGEge0BsaW5rIFBvaW50TGlrZX0gb2JqZWN0IHRvIGFwcGx5IHJlbGF0aXZlIHRvIHRoZSBlbGVtZW50J3MgY2VudGVyLiBOZWdhdGl2ZXMgaW5kaWNhdGUgbGVmdCBhbmQgdXAuXG4gICAgICogQHJldHVybnMge01hcmtlcn0gYHRoaXNgXG4gICAgICovXG4gICAgc2V0T2Zmc2V0KG9mZnNldDogUG9pbnRMaWtlKSB7XG4gICAgICAgIHRoaXMuX29mZnNldCA9IFBvaW50LmNvbnZlcnQob2Zmc2V0KTtcbiAgICAgICAgdGhpcy5fdXBkYXRlKCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIF9vbk1vdmUoZTogTWFwTW91c2VFdmVudCB8IE1hcFRvdWNoRXZlbnQpIHtcbiAgICAgICAgdGhpcy5fcG9zID0gZS5wb2ludC5zdWIodGhpcy5fcG9zaXRpb25EZWx0YSk7XG4gICAgICAgIHRoaXMuX2xuZ0xhdCA9IHRoaXMuX21hcC51bnByb2plY3QodGhpcy5fcG9zKTtcbiAgICAgICAgdGhpcy5zZXRMbmdMYXQodGhpcy5fbG5nTGF0KTtcbiAgICAgICAgLy8gc3VwcHJlc3MgY2xpY2sgZXZlbnQgc28gdGhhdCBwb3B1cHMgZG9uJ3QgdG9nZ2xlIG9uIGRyYWdcbiAgICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnO1xuXG4gICAgICAgIC8vIG1ha2Ugc3VyZSBkcmFnc3RhcnQgb25seSBmaXJlcyBvbiB0aGUgZmlyc3QgbW92ZSBldmVudCBhZnRlciBtb3VzZWRvd24uXG4gICAgICAgIC8vIHRoaXMgY2FuJ3QgYmUgb24gbW91c2Vkb3duIGJlY2F1c2UgdGhhdCBldmVudCBkb2Vzbid0IG5lY2Vzc2FyaWx5XG4gICAgICAgIC8vIGltcGx5IHRoYXQgYSBkcmFnIGlzIGFib3V0IHRvIGhhcHBlbi5cbiAgICAgICAgaWYgKHRoaXMuX3N0YXRlID09PSAncGVuZGluZycpIHtcbiAgICAgICAgICAgIHRoaXMuX3N0YXRlID0gJ2FjdGl2ZSc7XG5cbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogRmlyZWQgd2hlbiBkcmFnZ2luZyBzdGFydHNcbiAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgKiBAZXZlbnQgZHJhZ3N0YXJ0XG4gICAgICAgICAgICAgKiBAbWVtYmVyb2YgTWFya2VyXG4gICAgICAgICAgICAgKiBAaW5zdGFuY2VcbiAgICAgICAgICAgICAqIEB0eXBlIHtPYmplY3R9XG4gICAgICAgICAgICAgKiBAcHJvcGVydHkge01hcmtlcn0gbWFya2VyIG9iamVjdCB0aGF0IGlzIGJlaW5nIGRyYWdnZWRcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgnZHJhZ3N0YXJ0JykpO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZpcmVkIHdoaWxlIGRyYWdnaW5nXG4gICAgICAgICAqXG4gICAgICAgICAqIEBldmVudCBkcmFnXG4gICAgICAgICAqIEBtZW1iZXJvZiBNYXJrZXJcbiAgICAgICAgICogQGluc3RhbmNlXG4gICAgICAgICAqIEB0eXBlIHtPYmplY3R9XG4gICAgICAgICAqIEBwcm9wZXJ0eSB7TWFya2VyfSBtYXJrZXIgb2JqZWN0IHRoYXQgaXMgYmVpbmcgZHJhZ2dlZFxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgnZHJhZycpKTtcbiAgICB9XG5cbiAgICBfb25VcCgpIHtcbiAgICAgICAgLy8gcmV2ZXJ0IHRvIG5vcm1hbCBwb2ludGVyIGV2ZW50IGhhbmRsaW5nXG4gICAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdhdXRvJztcbiAgICAgICAgdGhpcy5fcG9zaXRpb25EZWx0YSA9IG51bGw7XG4gICAgICAgIHRoaXMuX21hcC5vZmYoJ21vdXNlbW92ZScsIHRoaXMuX29uTW92ZSk7XG4gICAgICAgIHRoaXMuX21hcC5vZmYoJ3RvdWNobW92ZScsIHRoaXMuX29uTW92ZSk7XG5cbiAgICAgICAgLy8gb25seSBmaXJlIGRyYWdlbmQgaWYgaXQgd2FzIHByZWNlZGVkIGJ5IGF0IGxlYXN0IG9uZSBkcmFnIGV2ZW50XG4gICAgICAgIGlmICh0aGlzLl9zdGF0ZSA9PT0gJ2FjdGl2ZScpIHtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgKiBGaXJlZCB3aGVuIHRoZSBtYXJrZXIgaXMgZmluaXNoZWQgYmVpbmcgZHJhZ2dlZFxuICAgICAgICAgICAgKlxuICAgICAgICAgICAgKiBAZXZlbnQgZHJhZ2VuZFxuICAgICAgICAgICAgKiBAbWVtYmVyb2YgTWFya2VyXG4gICAgICAgICAgICAqIEBpbnN0YW5jZVxuICAgICAgICAgICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgICAgICAgICAgKiBAcHJvcGVydHkge01hcmtlcn0gbWFya2VyIG9iamVjdCB0aGF0IHdhcyBkcmFnZ2VkXG4gICAgICAgICAgICAqL1xuICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgnZHJhZ2VuZCcpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3N0YXRlID0gJ2luYWN0aXZlJztcbiAgICB9XG5cbiAgICBfYWRkRHJhZ0hhbmRsZXIoZTogTWFwTW91c2VFdmVudCB8IE1hcFRvdWNoRXZlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuX2VsZW1lbnQuY29udGFpbnMoKGUub3JpZ2luYWxFdmVudC50YXJnZXQ6IGFueSkpKSB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gY2FsY3VsYXRlIHRoZSBwaXhlbCBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBjbGljayBwb2ludFxuICAgICAgICAgICAgLy8gYW5kIHRoZSBtYXJrZXIgcG9zaXRpb24sIHdpdGggdGhlIG9mZnNldCBhY2NvdW50ZWQgZm9yLiBUaGVuIHdlXG4gICAgICAgICAgICAvLyBjYW4gc3VidHJhY3QgdGhpcyBkaXN0YW5jZSBmcm9tIHRoZSBtb3VzZW1vdmUgZXZlbnQncyBwb3NpdGlvblxuICAgICAgICAgICAgLy8gdG8gY2FsY3VsYXRlIHRoZSBuZXcgbWFya2VyIHBvc2l0aW9uLlxuICAgICAgICAgICAgLy8gSWYgd2UgZG9uJ3QgZG8gdGhpcywgdGhlIG1hcmtlciAnanVtcHMnIHRvIHRoZSBjbGljayBwb3NpdGlvblxuICAgICAgICAgICAgLy8gY3JlYXRpbmcgYSBqYXJyaW5nIFVYIGVmZmVjdC5cbiAgICAgICAgICAgIHRoaXMuX3Bvc2l0aW9uRGVsdGEgPSBlLnBvaW50LnN1Yih0aGlzLl9wb3MpLmFkZCh0aGlzLl9vZmZzZXQpO1xuXG4gICAgICAgICAgICB0aGlzLl9zdGF0ZSA9ICdwZW5kaW5nJztcbiAgICAgICAgICAgIHRoaXMuX21hcC5vbignbW91c2Vtb3ZlJywgdGhpcy5fb25Nb3ZlKTtcbiAgICAgICAgICAgIHRoaXMuX21hcC5vbigndG91Y2htb3ZlJywgdGhpcy5fb25Nb3ZlKTtcbiAgICAgICAgICAgIHRoaXMuX21hcC5vbmNlKCdtb3VzZXVwJywgdGhpcy5fb25VcCk7XG4gICAgICAgICAgICB0aGlzLl9tYXAub25jZSgndG91Y2hlbmQnLCB0aGlzLl9vblVwKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGBkcmFnZ2FibGVgIHByb3BlcnR5IGFuZCBmdW5jdGlvbmFsaXR5IG9mIHRoZSBtYXJrZXJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtzaG91bGRCZURyYWdnYWJsZT1mYWxzZV0gVHVybnMgZHJhZyBmdW5jdGlvbmFsaXR5IG9uL29mZlxuICAgICAqIEByZXR1cm5zIHtNYXJrZXJ9IGB0aGlzYFxuICAgICAqL1xuICAgIHNldERyYWdnYWJsZShzaG91bGRCZURyYWdnYWJsZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLl9kcmFnZ2FibGUgPSAhIXNob3VsZEJlRHJhZ2dhYmxlOyAvLyBjb252ZXJ0IHBvc3NpYmxlIHVuZGVmaW5lZCB2YWx1ZSB0byBmYWxzZVxuXG4gICAgICAgIC8vIGhhbmRsZSBjYXNlIHdoZXJlIG1hcCBtYXkgbm90IGV4aXN0IHlldFxuICAgICAgICAvLyBlLmcuIHdoZW4gc2V0RHJhZ2dhYmxlIGlzIGNhbGxlZCBiZWZvcmUgYWRkVG9cbiAgICAgICAgaWYgKHRoaXMuX21hcCkge1xuICAgICAgICAgICAgaWYgKHNob3VsZEJlRHJhZ2dhYmxlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbWFwLm9uKCdtb3VzZWRvd24nLCB0aGlzLl9hZGREcmFnSGFuZGxlcik7XG4gICAgICAgICAgICAgICAgdGhpcy5fbWFwLm9uKCd0b3VjaHN0YXJ0JywgdGhpcy5fYWRkRHJhZ0hhbmRsZXIpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXAub2ZmKCdtb3VzZWRvd24nLCB0aGlzLl9hZGREcmFnSGFuZGxlcik7XG4gICAgICAgICAgICAgICAgdGhpcy5fbWFwLm9mZigndG91Y2hzdGFydCcsIHRoaXMuX2FkZERyYWdIYW5kbGVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgbWFya2VyIGNhbiBiZSBkcmFnZ2VkXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgaXNEcmFnZ2FibGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kcmFnZ2FibGU7XG4gICAgfVxufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHsgRXZlbnQsIEV2ZW50ZWQgfSBmcm9tICcuLi8uLi91dGlsL2V2ZW50ZWQnO1xuaW1wb3J0IERPTSBmcm9tICcuLi8uLi91dGlsL2RvbSc7XG5pbXBvcnQgd2luZG93IGZyb20gJy4uLy4uL3V0aWwvd2luZG93JztcbmltcG9ydCB7IGV4dGVuZCwgYmluZEFsbCwgd2Fybk9uY2UgfSBmcm9tICcuLi8uLi91dGlsL3V0aWwnO1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IExuZ0xhdCBmcm9tICcuLi8uLi9nZW8vbG5nX2xhdCc7XG5pbXBvcnQgTWFya2VyIGZyb20gJy4uL21hcmtlcic7XG5cbmltcG9ydCB0eXBlIE1hcCBmcm9tICcuLi9tYXAnO1xuaW1wb3J0IHR5cGUgeyBBbmltYXRpb25PcHRpb25zLCBDYW1lcmFPcHRpb25zIH0gZnJvbSAnLi4vY2FtZXJhJztcblxudHlwZSBPcHRpb25zID0ge1xuICAgIHBvc2l0aW9uT3B0aW9ucz86IFBvc2l0aW9uT3B0aW9ucyxcbiAgICBmaXRCb3VuZHNPcHRpb25zPzogQW5pbWF0aW9uT3B0aW9ucyAmIENhbWVyYU9wdGlvbnMsXG4gICAgdHJhY2tVc2VyTG9jYXRpb24/OiBib29sZWFuLFxuICAgIHNob3dVc2VyTG9jYXRpb24/OiBib29sZWFuXG59O1xuXG5jb25zdCBkZWZhdWx0T3B0aW9uczogT3B0aW9ucyA9IHtcbiAgICBwb3NpdGlvbk9wdGlvbnM6IHtcbiAgICAgICAgZW5hYmxlSGlnaEFjY3VyYWN5OiBmYWxzZSxcbiAgICAgICAgbWF4aW11bUFnZTogMCxcbiAgICAgICAgdGltZW91dDogNjAwMCAvKiA2IHNlYyAqL1xuICAgIH0sXG4gICAgZml0Qm91bmRzT3B0aW9uczoge1xuICAgICAgICBtYXhab29tOiAxNVxuICAgIH0sXG4gICAgdHJhY2tVc2VyTG9jYXRpb246IGZhbHNlLFxuICAgIHNob3dVc2VyTG9jYXRpb246IHRydWVcbn07XG5jb25zdCBjbGFzc05hbWUgPSAnbWFwYm94Z2wtY3RybCc7XG5cbmxldCBzdXBwb3J0c0dlb2xvY2F0aW9uO1xuXG5mdW5jdGlvbiBjaGVja0dlb2xvY2F0aW9uU3VwcG9ydChjYWxsYmFjaykge1xuICAgIGlmIChzdXBwb3J0c0dlb2xvY2F0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY2FsbGJhY2soc3VwcG9ydHNHZW9sb2NhdGlvbik7XG5cbiAgICB9IGVsc2UgaWYgKHdpbmRvdy5uYXZpZ2F0b3IucGVybWlzc2lvbnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBuYXZpZ2F0b3IucGVybWlzc2lvbnMgaGFzIGluY29tcGxldGUgYnJvd3NlciBzdXBwb3J0XG4gICAgICAgIC8vIGh0dHA6Ly9jYW5pdXNlLmNvbS8jZmVhdD1wZXJtaXNzaW9ucy1hcGlcbiAgICAgICAgLy8gVGVzdCBmb3IgdGhlIGNhc2Ugd2hlcmUgYSBicm93c2VyIGRpc2FibGVzIEdlb2xvY2F0aW9uIGJlY2F1c2Ugb2YgYW5cbiAgICAgICAgLy8gaW5zZWN1cmUgb3JpZ2luXG4gICAgICAgIHdpbmRvdy5uYXZpZ2F0b3IucGVybWlzc2lvbnMucXVlcnkoeyBuYW1lOiAnZ2VvbG9jYXRpb24nIH0pLnRoZW4oKHApID0+IHtcbiAgICAgICAgICAgIHN1cHBvcnRzR2VvbG9jYXRpb24gPSBwLnN0YXRlICE9PSAnZGVuaWVkJztcbiAgICAgICAgICAgIGNhbGxiYWNrKHN1cHBvcnRzR2VvbG9jYXRpb24pO1xuICAgICAgICB9KTtcblxuICAgIH0gZWxzZSB7XG4gICAgICAgIHN1cHBvcnRzR2VvbG9jYXRpb24gPSAhIXdpbmRvdy5uYXZpZ2F0b3IuZ2VvbG9jYXRpb247XG4gICAgICAgIGNhbGxiYWNrKHN1cHBvcnRzR2VvbG9jYXRpb24pO1xuICAgIH1cbn1cblxuLyoqXG4gKiBBIGBHZW9sb2NhdGVDb250cm9sYCBjb250cm9sIHByb3ZpZGVzIGEgYnV0dG9uIHRoYXQgdXNlcyB0aGUgYnJvd3NlcidzIGdlb2xvY2F0aW9uXG4gKiBBUEkgdG8gbG9jYXRlIHRoZSB1c2VyIG9uIHRoZSBtYXAuXG4gKlxuICogTm90IGFsbCBicm93c2VycyBzdXBwb3J0IGdlb2xvY2F0aW9uLFxuICogYW5kIHNvbWUgdXNlcnMgbWF5IGRpc2FibGUgdGhlIGZlYXR1cmUuIEdlb2xvY2F0aW9uIHN1cHBvcnQgZm9yIG1vZGVyblxuICogYnJvd3NlcnMgaW5jbHVkaW5nIENocm9tZSByZXF1aXJlcyBzaXRlcyB0byBiZSBzZXJ2ZWQgb3ZlciBIVFRQUy4gSWZcbiAqIGdlb2xvY2F0aW9uIHN1cHBvcnQgaXMgbm90IGF2YWlsYWJsZSwgdGhlIEdlb2xvY2F0ZUNvbnRyb2wgd2lsbCBub3RcbiAqIGJlIHZpc2libGUuXG4gKlxuICogVGhlIHpvb20gbGV2ZWwgYXBwbGllZCB3aWxsIGRlcGVuZCBvbiB0aGUgYWNjdXJhY3kgb2YgdGhlIGdlb2xvY2F0aW9uIHByb3ZpZGVkIGJ5IHRoZSBkZXZpY2UuXG4gKlxuICogVGhlIEdlb2xvY2F0ZUNvbnRyb2wgaGFzIHR3byBtb2Rlcy4gSWYgYHRyYWNrVXNlckxvY2F0aW9uYCBpcyBgZmFsc2VgIChkZWZhdWx0KSB0aGUgY29udHJvbCBhY3RzIGFzIGEgYnV0dG9uLCB3aGljaCB3aGVuIHByZXNzZWQgd2lsbCBzZXQgdGhlIG1hcCdzIGNhbWVyYSB0byB0YXJnZXQgdGhlIHVzZXIgbG9jYXRpb24uIElmIHRoZSB1c2VyIG1vdmVzLCB0aGUgbWFwIHdvbid0IHVwZGF0ZS4gVGhpcyBpcyBtb3N0IHN1aXRlZCBmb3IgdGhlIGRlc2t0b3AuIElmIGB0cmFja1VzZXJMb2NhdGlvbmAgaXMgYHRydWVgIHRoZSBjb250cm9sIGFjdHMgYXMgYSB0b2dnbGUgYnV0dG9uIHRoYXQgd2hlbiBhY3RpdmUgdGhlIHVzZXIncyBsb2NhdGlvbiBpcyBhY3RpdmVseSBtb25pdG9yZWQgZm9yIGNoYW5nZXMuIEluIHRoaXMgbW9kZSB0aGUgR2VvbG9jYXRlQ29udHJvbCBoYXMgdGhyZWUgc3RhdGVzOlxuICogKiBhY3RpdmUgLSB0aGUgbWFwJ3MgY2FtZXJhIGF1dG9tYXRpY2FsbHkgdXBkYXRlcyBhcyB0aGUgdXNlcidzIGxvY2F0aW9uIGNoYW5nZXMsIGtlZXBpbmcgdGhlIGxvY2F0aW9uIGRvdCBpbiB0aGUgY2VudGVyLlxuICogKiBwYXNzaXZlIC0gdGhlIHVzZXIncyBsb2NhdGlvbiBkb3QgYXV0b21hdGljYWxseSB1cGRhdGVzLCBidXQgdGhlIG1hcCdzIGNhbWVyYSBkb2VzIG5vdC5cbiAqICogZGlzYWJsZWRcbiAqXG4gKiBAaW1wbGVtZW50cyB7SUNvbnRyb2x9XG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMucG9zaXRpb25PcHRpb25zPXtlbmFibGVIaWdoQWNjdXJhY3k6IGZhbHNlLCB0aW1lb3V0OiA2MDAwfV0gQSBHZW9sb2NhdGlvbiBBUEkgW1Bvc2l0aW9uT3B0aW9uc10oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1Bvc2l0aW9uT3B0aW9ucykgb2JqZWN0LlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLmZpdEJvdW5kc09wdGlvbnM9e21heFpvb206IDE1fV0gQSBbYGZpdEJvdW5kc2BdKCNtYXAjZml0Ym91bmRzKSBvcHRpb25zIG9iamVjdCB0byB1c2Ugd2hlbiB0aGUgbWFwIGlzIHBhbm5lZCBhbmQgem9vbWVkIHRvIHRoZSB1c2VyJ3MgbG9jYXRpb24uIFRoZSBkZWZhdWx0IGlzIHRvIHVzZSBhIGBtYXhab29tYCBvZiAxNSB0byBsaW1pdCBob3cgZmFyIHRoZSBtYXAgd2lsbCB6b29tIGluIGZvciB2ZXJ5IGFjY3VyYXRlIGxvY2F0aW9ucy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy50cmFja1VzZXJMb2NhdGlvbj1mYWxzZV0gSWYgYHRydWVgIHRoZSBHZW9sb2NhdGUgQ29udHJvbCBiZWNvbWVzIGEgdG9nZ2xlIGJ1dHRvbiBhbmQgd2hlbiBhY3RpdmUgdGhlIG1hcCB3aWxsIHJlY2VpdmUgdXBkYXRlcyB0byB0aGUgdXNlcidzIGxvY2F0aW9uIGFzIGl0IGNoYW5nZXMuXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMuc2hvd1VzZXJMb2NhdGlvbj10cnVlXSBCeSBkZWZhdWx0IGEgZG90IHdpbGwgYmUgc2hvd24gb24gdGhlIG1hcCBhdCB0aGUgdXNlcidzIGxvY2F0aW9uLiBTZXQgdG8gYGZhbHNlYCB0byBkaXNhYmxlLlxuICpcbiAqIEBleGFtcGxlXG4gKiBtYXAuYWRkQ29udHJvbChuZXcgbWFwYm94Z2wuR2VvbG9jYXRlQ29udHJvbCh7XG4gKiAgICAgcG9zaXRpb25PcHRpb25zOiB7XG4gKiAgICAgICAgIGVuYWJsZUhpZ2hBY2N1cmFjeTogdHJ1ZVxuICogICAgIH0sXG4gKiAgICAgdHJhY2tVc2VyTG9jYXRpb246IHRydWVcbiAqIH0pKTtcbiAqIEBzZWUgW0xvY2F0ZSB0aGUgdXNlcl0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9sb2NhdGUtdXNlci8pXG4gKi9cbmNsYXNzIEdlb2xvY2F0ZUNvbnRyb2wgZXh0ZW5kcyBFdmVudGVkIHtcbiAgICBfbWFwOiBNYXA7XG4gICAgb3B0aW9uczogT3B0aW9ucztcbiAgICBfY29udGFpbmVyOiBIVE1MRWxlbWVudDtcbiAgICBfZG90RWxlbWVudDogSFRNTEVsZW1lbnQ7XG4gICAgX2dlb2xvY2F0ZUJ1dHRvbjogSFRNTEVsZW1lbnQ7XG4gICAgX2dlb2xvY2F0aW9uV2F0Y2hJRDogbnVtYmVyO1xuICAgIF90aW1lb3V0SWQ6ID9UaW1lb3V0SUQ7XG4gICAgX3dhdGNoU3RhdGU6IHN0cmluZztcbiAgICBfbGFzdEtub3duUG9zaXRpb246IGFueTtcbiAgICBfdXNlckxvY2F0aW9uRG90TWFya2VyOiBNYXJrZXI7XG4gICAgX3NldHVwOiBib29sZWFuOyAvLyBzZXQgdG8gdHJ1ZSBvbmNlIHRoZSBjb250cm9sIGhhcyBiZWVuIHNldHVwXG5cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOiBPcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IGV4dGVuZCh7fSwgZGVmYXVsdE9wdGlvbnMsIG9wdGlvbnMpO1xuXG4gICAgICAgIGJpbmRBbGwoW1xuICAgICAgICAgICAgJ19vblN1Y2Nlc3MnLFxuICAgICAgICAgICAgJ19vbkVycm9yJyxcbiAgICAgICAgICAgICdfZmluaXNoJyxcbiAgICAgICAgICAgICdfc2V0dXBVSScsXG4gICAgICAgICAgICAnX3VwZGF0ZUNhbWVyYScsXG4gICAgICAgICAgICAnX3VwZGF0ZU1hcmtlcidcbiAgICAgICAgXSwgdGhpcyk7XG4gICAgfVxuXG4gICAgb25BZGQobWFwOiBNYXApIHtcbiAgICAgICAgdGhpcy5fbWFwID0gbWFwO1xuICAgICAgICB0aGlzLl9jb250YWluZXIgPSBET00uY3JlYXRlKCdkaXYnLCBgJHtjbGFzc05hbWV9ICR7Y2xhc3NOYW1lfS1ncm91cGApO1xuICAgICAgICBjaGVja0dlb2xvY2F0aW9uU3VwcG9ydCh0aGlzLl9zZXR1cFVJKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnRhaW5lcjtcbiAgICB9XG5cbiAgICBvblJlbW92ZSgpIHtcbiAgICAgICAgLy8gY2xlYXIgdGhlIGdlb2xvY2F0aW9uIHdhdGNoIGlmIGV4aXN0c1xuICAgICAgICBpZiAodGhpcy5fZ2VvbG9jYXRpb25XYXRjaElEICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHdpbmRvdy5uYXZpZ2F0b3IuZ2VvbG9jYXRpb24uY2xlYXJXYXRjaCh0aGlzLl9nZW9sb2NhdGlvbldhdGNoSUQpO1xuICAgICAgICAgICAgdGhpcy5fZ2VvbG9jYXRpb25XYXRjaElEID0gKHVuZGVmaW5lZDogYW55KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNsZWFyIHRoZSBtYXJrZXIgZnJvbSB0aGUgbWFwXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2hvd1VzZXJMb2NhdGlvbiAmJiB0aGlzLl91c2VyTG9jYXRpb25Eb3RNYXJrZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX3VzZXJMb2NhdGlvbkRvdE1hcmtlci5yZW1vdmUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIERPTS5yZW1vdmUodGhpcy5fY29udGFpbmVyKTtcbiAgICAgICAgdGhpcy5fbWFwID0gKHVuZGVmaW5lZDogYW55KTtcbiAgICB9XG5cbiAgICBfb25TdWNjZXNzKHBvc2l0aW9uOiBQb3NpdGlvbikge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnRyYWNrVXNlckxvY2F0aW9uKSB7XG4gICAgICAgICAgICAvLyBrZWVwIGEgcmVjb3JkIG9mIHRoZSBwb3NpdGlvbiBzbyB0aGF0IGlmIHRoZSBzdGF0ZSBpcyBCQUNLR1JPVU5EIGFuZCB0aGUgdXNlclxuICAgICAgICAgICAgLy8gY2xpY2tzIHRoZSBidXR0b24sIHdlIGNhbiBtb3ZlIHRvIEFDVElWRV9MT0NLIGltbWVkaWF0ZWx5IHdpdGhvdXQgd2FpdGluZyBmb3JcbiAgICAgICAgICAgIC8vIHdhdGNoUG9zaXRpb24gdG8gdHJpZ2dlciBfb25TdWNjZXNzXG4gICAgICAgICAgICB0aGlzLl9sYXN0S25vd25Qb3NpdGlvbiA9IHBvc2l0aW9uO1xuXG4gICAgICAgICAgICBzd2l0Y2ggKHRoaXMuX3dhdGNoU3RhdGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ1dBSVRJTkdfQUNUSVZFJzpcbiAgICAgICAgICAgIGNhc2UgJ0FDVElWRV9MT0NLJzpcbiAgICAgICAgICAgIGNhc2UgJ0FDVElWRV9FUlJPUic6XG4gICAgICAgICAgICAgICAgdGhpcy5fd2F0Y2hTdGF0ZSA9ICdBQ1RJVkVfTE9DSyc7XG4gICAgICAgICAgICAgICAgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoJ21hcGJveGdsLWN0cmwtZ2VvbG9jYXRlLXdhaXRpbmcnKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LnJlbW92ZSgnbWFwYm94Z2wtY3RybC1nZW9sb2NhdGUtYWN0aXZlLWVycm9yJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5hZGQoJ21hcGJveGdsLWN0cmwtZ2VvbG9jYXRlLWFjdGl2ZScpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnQkFDS0dST1VORCc6XG4gICAgICAgICAgICBjYXNlICdCQUNLR1JPVU5EX0VSUk9SJzpcbiAgICAgICAgICAgICAgICB0aGlzLl93YXRjaFN0YXRlID0gJ0JBQ0tHUk9VTkQnO1xuICAgICAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKCdtYXBib3hnbC1jdHJsLWdlb2xvY2F0ZS13YWl0aW5nJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoJ21hcGJveGdsLWN0cmwtZ2VvbG9jYXRlLWJhY2tncm91bmQtZXJyb3InKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LmFkZCgnbWFwYm94Z2wtY3RybC1nZW9sb2NhdGUtYmFja2dyb3VuZCcpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBhc3NlcnQoZmFsc2UsIGBVbmV4cGVjdGVkIHdhdGNoU3RhdGUgJHt0aGlzLl93YXRjaFN0YXRlfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgc2hvd1VzZXJMb2NhdGlvbiBhbmQgdGhlIHdhdGNoIHN0YXRlIGlzbid0IG9mZiB0aGVuIHVwZGF0ZSB0aGUgbWFya2VyIGxvY2F0aW9uXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2hvd1VzZXJMb2NhdGlvbiAmJiB0aGlzLl93YXRjaFN0YXRlICE9PSAnT0ZGJykge1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlTWFya2VyKHBvc2l0aW9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGlmIGluIG5vcm1hbCBtb2RlIChub3Qgd2F0Y2ggbW9kZSksIG9yIGlmIGluIHdhdGNoIG1vZGUgYW5kIHRoZSBzdGF0ZSBpcyBhY3RpdmUgd2F0Y2hcbiAgICAgICAgLy8gdGhlbiB1cGRhdGUgdGhlIGNhbWVyYVxuICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy50cmFja1VzZXJMb2NhdGlvbiB8fCB0aGlzLl93YXRjaFN0YXRlID09PSAnQUNUSVZFX0xPQ0snKSB7XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVDYW1lcmEocG9zaXRpb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zaG93VXNlckxvY2F0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLl9kb3RFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ21hcGJveGdsLXVzZXItbG9jYXRpb24tZG90LXN0YWxlJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZpcmUobmV3IEV2ZW50KCdnZW9sb2NhdGUnLCBwb3NpdGlvbikpO1xuICAgICAgICB0aGlzLl9maW5pc2goKTtcbiAgICB9XG5cbiAgICBfdXBkYXRlQ2FtZXJhKHBvc2l0aW9uOiBQb3NpdGlvbikge1xuICAgICAgICBjb25zdCBjZW50ZXIgPSBuZXcgTG5nTGF0KHBvc2l0aW9uLmNvb3Jkcy5sb25naXR1ZGUsIHBvc2l0aW9uLmNvb3Jkcy5sYXRpdHVkZSk7XG4gICAgICAgIGNvbnN0IHJhZGl1cyA9IHBvc2l0aW9uLmNvb3Jkcy5hY2N1cmFjeTtcbiAgICAgICAgY29uc3QgYmVhcmluZyA9IHRoaXMuX21hcC5nZXRCZWFyaW5nKCk7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBleHRlbmQoe2JlYXJpbmd9LCB0aGlzLm9wdGlvbnMuZml0Qm91bmRzT3B0aW9ucyk7XG5cbiAgICAgICAgdGhpcy5fbWFwLmZpdEJvdW5kcyhjZW50ZXIudG9Cb3VuZHMocmFkaXVzKSwgb3B0aW9ucywge1xuICAgICAgICAgICAgZ2VvbG9jYXRlU291cmNlOiB0cnVlIC8vIHRhZyB0aGlzIGNhbWVyYSBjaGFuZ2Ugc28gaXQgd29uJ3QgY2F1c2UgdGhlIGNvbnRyb2wgdG8gY2hhbmdlIHRvIGJhY2tncm91bmQgc3RhdGVcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgX3VwZGF0ZU1hcmtlcihwb3NpdGlvbjogP1Bvc2l0aW9uKSB7XG4gICAgICAgIGlmIChwb3NpdGlvbikge1xuICAgICAgICAgICAgdGhpcy5fdXNlckxvY2F0aW9uRG90TWFya2VyLnNldExuZ0xhdChbcG9zaXRpb24uY29vcmRzLmxvbmdpdHVkZSwgcG9zaXRpb24uY29vcmRzLmxhdGl0dWRlXSkuYWRkVG8odGhpcy5fbWFwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3VzZXJMb2NhdGlvbkRvdE1hcmtlci5yZW1vdmUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9vbkVycm9yKGVycm9yOiBQb3NpdGlvbkVycm9yKSB7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMudHJhY2tVc2VyTG9jYXRpb24pIHtcbiAgICAgICAgICAgIGlmIChlcnJvci5jb2RlID09PSAxKSB7XG4gICAgICAgICAgICAgICAgLy8gUEVSTUlTU0lPTl9ERU5JRURcbiAgICAgICAgICAgICAgICB0aGlzLl93YXRjaFN0YXRlID0gJ09GRic7XG4gICAgICAgICAgICAgICAgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoJ21hcGJveGdsLWN0cmwtZ2VvbG9jYXRlLXdhaXRpbmcnKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LnJlbW92ZSgnbWFwYm94Z2wtY3RybC1nZW9sb2NhdGUtYWN0aXZlJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoJ21hcGJveGdsLWN0cmwtZ2VvbG9jYXRlLWFjdGl2ZS1lcnJvcicpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKCdtYXBib3hnbC1jdHJsLWdlb2xvY2F0ZS1iYWNrZ3JvdW5kJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoJ21hcGJveGdsLWN0cmwtZ2VvbG9jYXRlLWJhY2tncm91bmQtZXJyb3InKTtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9nZW9sb2NhdGlvbldhdGNoSUQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jbGVhcldhdGNoKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMuX3dhdGNoU3RhdGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdXQUlUSU5HX0FDVElWRSc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3dhdGNoU3RhdGUgPSAnQUNUSVZFX0VSUk9SJztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoJ21hcGJveGdsLWN0cmwtZ2VvbG9jYXRlLWFjdGl2ZScpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LmFkZCgnbWFwYm94Z2wtY3RybC1nZW9sb2NhdGUtYWN0aXZlLWVycm9yJyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ0FDVElWRV9MT0NLJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fd2F0Y2hTdGF0ZSA9ICdBQ1RJVkVfRVJST1InO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LnJlbW92ZSgnbWFwYm94Z2wtY3RybC1nZW9sb2NhdGUtYWN0aXZlJyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QuYWRkKCdtYXBib3hnbC1jdHJsLWdlb2xvY2F0ZS1hY3RpdmUtZXJyb3InKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5hZGQoJ21hcGJveGdsLWN0cmwtZ2VvbG9jYXRlLXdhaXRpbmcnKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gdHVybiBtYXJrZXIgZ3JleVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdCQUNLR1JPVU5EJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fd2F0Y2hTdGF0ZSA9ICdCQUNLR1JPVU5EX0VSUk9SJztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoJ21hcGJveGdsLWN0cmwtZ2VvbG9jYXRlLWJhY2tncm91bmQnKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5hZGQoJ21hcGJveGdsLWN0cmwtZ2VvbG9jYXRlLWJhY2tncm91bmQtZXJyb3InKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5hZGQoJ21hcGJveGdsLWN0cmwtZ2VvbG9jYXRlLXdhaXRpbmcnKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gdHVybiBtYXJrZXIgZ3JleVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdBQ1RJVkVfRVJST1InOlxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBhc3NlcnQoZmFsc2UsIGBVbmV4cGVjdGVkIHdhdGNoU3RhdGUgJHt0aGlzLl93YXRjaFN0YXRlfWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl93YXRjaFN0YXRlICE9PSAnT0ZGJyAmJiB0aGlzLm9wdGlvbnMuc2hvd1VzZXJMb2NhdGlvbikge1xuICAgICAgICAgICAgdGhpcy5fZG90RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdtYXBib3hnbC11c2VyLWxvY2F0aW9uLWRvdC1zdGFsZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgnZXJyb3InLCBlcnJvcikpO1xuXG4gICAgICAgIHRoaXMuX2ZpbmlzaCgpO1xuICAgIH1cblxuICAgIF9maW5pc2goKSB7XG4gICAgICAgIGlmICh0aGlzLl90aW1lb3V0SWQpIHsgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXRJZCk7IH1cbiAgICAgICAgdGhpcy5fdGltZW91dElkID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIF9zZXR1cFVJKHN1cHBvcnRlZDogYm9vbGVhbikge1xuICAgICAgICBpZiAoc3VwcG9ydGVkID09PSBmYWxzZSkge1xuICAgICAgICAgICAgd2Fybk9uY2UoJ0dlb2xvY2F0aW9uIHN1cHBvcnQgaXMgbm90IGF2YWlsYWJsZSwgdGhlIEdlb2xvY2F0ZUNvbnRyb2wgd2lsbCBub3QgYmUgdmlzaWJsZS4nKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9jb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcignY29udGV4dG1lbnUnLCAoZTogTW91c2VFdmVudCkgPT4gZS5wcmV2ZW50RGVmYXVsdCgpKTtcbiAgICAgICAgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uID0gRE9NLmNyZWF0ZSgnYnV0dG9uJyxcbiAgICAgICAgICAgIGAke2NsYXNzTmFtZX0taWNvbiAke2NsYXNzTmFtZX0tZ2VvbG9jYXRlYCxcbiAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lcik7XG4gICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi50eXBlID0gJ2J1dHRvbic7XG4gICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCAnR2VvbG9jYXRlJyk7XG5cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy50cmFja1VzZXJMb2NhdGlvbikge1xuICAgICAgICAgICAgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLnNldEF0dHJpYnV0ZSgnYXJpYS1wcmVzc2VkJywgJ2ZhbHNlJyk7XG4gICAgICAgICAgICB0aGlzLl93YXRjaFN0YXRlID0gJ09GRic7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB3aGVuIHNob3dVc2VyTG9jYXRpb24gaXMgZW5hYmxlZCwga2VlcCB0aGUgR2VvbG9jYXRlIGJ1dHRvbiBkaXNhYmxlZCB1bnRpbCB0aGUgZGV2aWNlIGxvY2F0aW9uIG1hcmtlciBpcyBzZXR1cCBvbiB0aGUgbWFwXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2hvd1VzZXJMb2NhdGlvbikge1xuICAgICAgICAgICAgdGhpcy5fZG90RWxlbWVudCA9IERPTS5jcmVhdGUoJ2RpdicsICdtYXBib3hnbC11c2VyLWxvY2F0aW9uLWRvdCcpO1xuXG4gICAgICAgICAgICB0aGlzLl91c2VyTG9jYXRpb25Eb3RNYXJrZXIgPSBuZXcgTWFya2VyKHRoaXMuX2RvdEVsZW1lbnQpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnRyYWNrVXNlckxvY2F0aW9uKSB0aGlzLl93YXRjaFN0YXRlID0gJ09GRic7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLFxuICAgICAgICAgICAgdGhpcy50cmlnZ2VyLmJpbmQodGhpcykpO1xuXG4gICAgICAgIHRoaXMuX3NldHVwID0gdHJ1ZTtcblxuICAgICAgICAvLyB3aGVuIHRoZSBjYW1lcmEgaXMgY2hhbmdlZCAoYW5kIGl0J3Mgbm90IGFzIGEgcmVzdWx0IG9mIHRoZSBHZW9sb2NhdGlvbiBDb250cm9sKSBjaGFuZ2VcbiAgICAgICAgLy8gdGhlIHdhdGNoIG1vZGUgdG8gYmFja2dyb3VuZCB3YXRjaCwgc28gdGhhdCB0aGUgbWFya2VyIGlzIHVwZGF0ZWQgYnV0IG5vdCB0aGUgY2FtZXJhLlxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnRyYWNrVXNlckxvY2F0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLl9tYXAub24oJ21vdmVzdGFydCcsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghZXZlbnQuZ2VvbG9jYXRlU291cmNlICYmIHRoaXMuX3dhdGNoU3RhdGUgPT09ICdBQ1RJVkVfTE9DSycpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fd2F0Y2hTdGF0ZSA9ICdCQUNLR1JPVU5EJztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5hZGQoJ21hcGJveGdsLWN0cmwtZ2VvbG9jYXRlLWJhY2tncm91bmQnKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoJ21hcGJveGdsLWN0cmwtZ2VvbG9jYXRlLWFjdGl2ZScpO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ3RyYWNrdXNlcmxvY2F0aW9uZW5kJykpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVHJpZ2dlciBhIGdlb2xvY2F0aW9uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgZmFsc2VgIGlmIGNhbGxlZCBiZWZvcmUgY29udHJvbCB3YXMgYWRkZWQgdG8gYSBtYXAsIG90aGVyd2lzZSByZXR1cm5zIGB0cnVlYC5cbiAgICAgKi9cbiAgICB0cmlnZ2VyKCkge1xuICAgICAgICBpZiAoIXRoaXMuX3NldHVwKSB7XG4gICAgICAgICAgICB3YXJuT25jZSgnR2VvbG9jYXRlIGNvbnRyb2wgdHJpZ2dlcmVkIGJlZm9yZSBhZGRlZCB0byBhIG1hcCcpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMudHJhY2tVc2VyTG9jYXRpb24pIHtcbiAgICAgICAgICAgIC8vIHVwZGF0ZSB3YXRjaFN0YXRlIGFuZCBkbyBhbnkgb3V0Z29pbmcgc3RhdGUgY2xlYW51cFxuICAgICAgICAgICAgc3dpdGNoICh0aGlzLl93YXRjaFN0YXRlKSB7XG4gICAgICAgICAgICBjYXNlICdPRkYnOlxuICAgICAgICAgICAgICAgIC8vIHR1cm4gb24gdGhlIEdlb2xvY2F0ZSBDb250cm9sXG4gICAgICAgICAgICAgICAgdGhpcy5fd2F0Y2hTdGF0ZSA9ICdXQUlUSU5HX0FDVElWRSc7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmZpcmUobmV3IEV2ZW50KCd0cmFja3VzZXJsb2NhdGlvbnN0YXJ0JykpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnV0FJVElOR19BQ1RJVkUnOlxuICAgICAgICAgICAgY2FzZSAnQUNUSVZFX0xPQ0snOlxuICAgICAgICAgICAgY2FzZSAnQUNUSVZFX0VSUk9SJzpcbiAgICAgICAgICAgIGNhc2UgJ0JBQ0tHUk9VTkRfRVJST1InOlxuICAgICAgICAgICAgICAgIC8vIHR1cm4gb2ZmIHRoZSBHZW9sb2NhdGUgQ29udHJvbFxuICAgICAgICAgICAgICAgIHRoaXMuX3dhdGNoU3RhdGUgPSAnT0ZGJztcbiAgICAgICAgICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LnJlbW92ZSgnbWFwYm94Z2wtY3RybC1nZW9sb2NhdGUtd2FpdGluZycpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKCdtYXBib3hnbC1jdHJsLWdlb2xvY2F0ZS1hY3RpdmUnKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LnJlbW92ZSgnbWFwYm94Z2wtY3RybC1nZW9sb2NhdGUtYWN0aXZlLWVycm9yJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoJ21hcGJveGdsLWN0cmwtZ2VvbG9jYXRlLWJhY2tncm91bmQnKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LnJlbW92ZSgnbWFwYm94Z2wtY3RybC1nZW9sb2NhdGUtYmFja2dyb3VuZC1lcnJvcicpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgndHJhY2t1c2VybG9jYXRpb25lbmQnKSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdCQUNLR1JPVU5EJzpcbiAgICAgICAgICAgICAgICB0aGlzLl93YXRjaFN0YXRlID0gJ0FDVElWRV9MT0NLJztcbiAgICAgICAgICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LnJlbW92ZSgnbWFwYm94Z2wtY3RybC1nZW9sb2NhdGUtYmFja2dyb3VuZCcpO1xuICAgICAgICAgICAgICAgIC8vIHNldCBjYW1lcmEgdG8gbGFzdCBrbm93biBsb2NhdGlvblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9sYXN0S25vd25Qb3NpdGlvbikgdGhpcy5fdXBkYXRlQ2FtZXJhKHRoaXMuX2xhc3RLbm93blBvc2l0aW9uKTtcblxuICAgICAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ3RyYWNrdXNlcmxvY2F0aW9uc3RhcnQnKSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGFzc2VydChmYWxzZSwgYFVuZXhwZWN0ZWQgd2F0Y2hTdGF0ZSAke3RoaXMuX3dhdGNoU3RhdGV9YCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGluY29taW5nIHN0YXRlIHNldHVwXG4gICAgICAgICAgICBzd2l0Y2ggKHRoaXMuX3dhdGNoU3RhdGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ1dBSVRJTkdfQUNUSVZFJzpcbiAgICAgICAgICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LmFkZCgnbWFwYm94Z2wtY3RybC1nZW9sb2NhdGUtd2FpdGluZycpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QuYWRkKCdtYXBib3hnbC1jdHJsLWdlb2xvY2F0ZS1hY3RpdmUnKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0FDVElWRV9MT0NLJzpcbiAgICAgICAgICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LmFkZCgnbWFwYm94Z2wtY3RybC1nZW9sb2NhdGUtYWN0aXZlJyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdBQ1RJVkVfRVJST1InOlxuICAgICAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QuYWRkKCdtYXBib3hnbC1jdHJsLWdlb2xvY2F0ZS13YWl0aW5nJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5hZGQoJ21hcGJveGdsLWN0cmwtZ2VvbG9jYXRlLWFjdGl2ZS1lcnJvcicpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnQkFDS0dST1VORCc6XG4gICAgICAgICAgICAgICAgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5hZGQoJ21hcGJveGdsLWN0cmwtZ2VvbG9jYXRlLWJhY2tncm91bmQnKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0JBQ0tHUk9VTkRfRVJST1InOlxuICAgICAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QuYWRkKCdtYXBib3hnbC1jdHJsLWdlb2xvY2F0ZS13YWl0aW5nJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5hZGQoJ21hcGJveGdsLWN0cmwtZ2VvbG9jYXRlLWJhY2tncm91bmQtZXJyb3InKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ09GRic6XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGFzc2VydChmYWxzZSwgYFVuZXhwZWN0ZWQgd2F0Y2hTdGF0ZSAke3RoaXMuX3dhdGNoU3RhdGV9YCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIG1hbmFnZSBnZW9sb2NhdGlvbi53YXRjaFBvc2l0aW9uIC8gZ2VvbG9jYXRpb24uY2xlYXJXYXRjaFxuICAgICAgICAgICAgaWYgKHRoaXMuX3dhdGNoU3RhdGUgPT09ICdPRkYnICYmIHRoaXMuX2dlb2xvY2F0aW9uV2F0Y2hJRCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgLy8gY2xlYXIgd2F0Y2hQb3NpdGlvbiBhcyB3ZSd2ZSBjaGFuZ2VkIHRvIGFuIE9GRiBzdGF0ZVxuICAgICAgICAgICAgICAgIHRoaXMuX2NsZWFyV2F0Y2goKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5fZ2VvbG9jYXRpb25XYXRjaElEID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAvLyBlbmFibGUgd2F0Y2hQb3NpdGlvbiBzaW5jZSB3YXRjaFN0YXRlIGlzIG5vdCBPRkYgYW5kIHRoZXJlIGlzIG5vIHdhdGNoUG9zaXRpb24gYWxyZWFkeSBydW5uaW5nXG5cbiAgICAgICAgICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LmFkZCgnbWFwYm94Z2wtY3RybC1nZW9sb2NhdGUtd2FpdGluZycpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5zZXRBdHRyaWJ1dGUoJ2FyaWEtcHJlc3NlZCcsICd0cnVlJyk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLl9nZW9sb2NhdGlvbldhdGNoSUQgPSB3aW5kb3cubmF2aWdhdG9yLmdlb2xvY2F0aW9uLndhdGNoUG9zaXRpb24oXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX29uU3VjY2VzcywgdGhpcy5fb25FcnJvciwgdGhpcy5vcHRpb25zLnBvc2l0aW9uT3B0aW9ucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB3aW5kb3cubmF2aWdhdG9yLmdlb2xvY2F0aW9uLmdldEN1cnJlbnRQb3NpdGlvbihcbiAgICAgICAgICAgICAgICB0aGlzLl9vblN1Y2Nlc3MsIHRoaXMuX29uRXJyb3IsIHRoaXMub3B0aW9ucy5wb3NpdGlvbk9wdGlvbnMpO1xuXG4gICAgICAgICAgICAvLyBUaGlzIHRpbWVvdXQgZW5zdXJlcyB0aGF0IHdlIHN0aWxsIGNhbGwgZmluaXNoKCkgZXZlbiBpZlxuICAgICAgICAgICAgLy8gdGhlIHVzZXIgZGVjbGluZXMgdG8gc2hhcmUgdGhlaXIgbG9jYXRpb24gaW4gRmlyZWZveFxuICAgICAgICAgICAgdGhpcy5fdGltZW91dElkID0gc2V0VGltZW91dCh0aGlzLl9maW5pc2gsIDEwMDAwIC8qIDEwc2VjICovKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIF9jbGVhcldhdGNoKCkge1xuICAgICAgICB3aW5kb3cubmF2aWdhdG9yLmdlb2xvY2F0aW9uLmNsZWFyV2F0Y2godGhpcy5fZ2VvbG9jYXRpb25XYXRjaElEKTtcblxuICAgICAgICB0aGlzLl9nZW9sb2NhdGlvbldhdGNoSUQgPSAodW5kZWZpbmVkOiBhbnkpO1xuICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LnJlbW92ZSgnbWFwYm94Z2wtY3RybC1nZW9sb2NhdGUtd2FpdGluZycpO1xuICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24uc2V0QXR0cmlidXRlKCdhcmlhLXByZXNzZWQnLCAnZmFsc2UnKTtcblxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnNob3dVc2VyTG9jYXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZU1hcmtlcihudWxsKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgR2VvbG9jYXRlQ29udHJvbDtcblxuLyogR2VvbG9jYXRlIENvbnRyb2wgV2F0Y2ggU3RhdGVzXG4gKiBUaGlzIGlzIHRoZSBwcml2YXRlIHN0YXRlIG9mIHRoZSBjb250cm9sLlxuICpcbiAqIE9GRlxuICogICAgb2ZmL2luYWN0aXZlXG4gKiBXQUlUSU5HX0FDVElWRVxuICogICAgR2VvbG9jYXRlIENvbnRyb2wgd2FzIGNsaWNrZWQgYnV0IHN0aWxsIHdhaXRpbmcgZm9yIEdlb2xvY2F0aW9uIEFQSSByZXNwb25zZSB3aXRoIHVzZXIgbG9jYXRpb25cbiAqIEFDVElWRV9MT0NLXG4gKiAgICBTaG93aW5nIHRoZSB1c2VyIGxvY2F0aW9uIGFzIGEgZG90IEFORCB0cmFja2luZyB0aGUgY2FtZXJhIHRvIGJlIGZpeGVkIHRvIHRoZWlyIGxvY2F0aW9uLiBJZiB0aGVpciBsb2NhdGlvbiBjaGFuZ2VzIHRoZSBtYXAgbW92ZXMgdG8gZm9sbG93LlxuICogQUNUSVZFX0VSUk9SXG4gKiAgICBUaGVyZSB3YXMgZW4gZXJyb3IgZnJvbSB0aGUgR2VvbG9jYXRpb24gQVBJIHdoaWxlIHRyeWluZyB0byBzaG93IGFuZCB0cmFjayB0aGUgdXNlciBsb2NhdGlvbi5cbiAqIEJBQ0tHUk9VTkRcbiAqICAgIFNob3dpbmcgdGhlIHVzZXIgbG9jYXRpb24gYXMgYSBkb3QgYnV0IHRoZSBjYW1lcmEgZG9lc24ndCBmb2xsb3cgdGhlaXIgbG9jYXRpb24gYXMgaXQgY2hhbmdlcy5cbiAqIEJBQ0tHUk9VTkRfRVJST1JcbiAqICAgIFRoZXJlIHdhcyBhbiBlcnJvciBmcm9tIHRoZSBHZW9sb2NhdGlvbiBBUEkgd2hpbGUgdHJ5aW5nIHRvIHNob3cgKGJ1dCBub3QgdHJhY2spIHRoZSB1c2VyIGxvY2F0aW9uLlxuICovXG5cblxuLyoqXG4gKiBGaXJlZCBvbiBlYWNoIEdlb2xvY2F0aW9uIEFQSSBwb3NpdGlvbiB1cGRhdGUgd2hpY2ggcmV0dXJuZWQgYXMgc3VjY2Vzcy5cbiAqXG4gKiBAZXZlbnQgZ2VvbG9jYXRlXG4gKiBAbWVtYmVyb2YgR2VvbG9jYXRlQ29udHJvbFxuICogQGluc3RhbmNlXG4gKiBAcHJvcGVydHkge1Bvc2l0aW9ufSBkYXRhIFRoZSByZXR1cm5lZCBbUG9zaXRpb25dKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9Qb3NpdGlvbikgb2JqZWN0IGZyb20gdGhlIGNhbGxiYWNrIGluIFtHZW9sb2NhdGlvbi5nZXRDdXJyZW50UG9zaXRpb24oKV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0dlb2xvY2F0aW9uL2dldEN1cnJlbnRQb3NpdGlvbikgb3IgW0dlb2xvY2F0aW9uLndhdGNoUG9zaXRpb24oKV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0dlb2xvY2F0aW9uL3dhdGNoUG9zaXRpb24pLlxuICpcbiAqL1xuXG4vKipcbiAqIEZpcmVkIG9uIGVhY2ggR2VvbG9jYXRpb24gQVBJIHBvc2l0aW9uIHVwZGF0ZSB3aGljaCByZXR1cm5lZCBhcyBhbiBlcnJvci5cbiAqXG4gKiBAZXZlbnQgZXJyb3JcbiAqIEBtZW1iZXJvZiBHZW9sb2NhdGVDb250cm9sXG4gKiBAaW5zdGFuY2VcbiAqIEBwcm9wZXJ0eSB7UG9zaXRpb25FcnJvcn0gZGF0YSBUaGUgcmV0dXJuZWQgW1Bvc2l0aW9uRXJyb3JdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9Qb3NpdGlvbkVycm9yKSBvYmplY3QgZnJvbSB0aGUgY2FsbGJhY2sgaW4gW0dlb2xvY2F0aW9uLmdldEN1cnJlbnRQb3NpdGlvbigpXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvR2VvbG9jYXRpb24vZ2V0Q3VycmVudFBvc2l0aW9uKSBvciBbR2VvbG9jYXRpb24ud2F0Y2hQb3NpdGlvbigpXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvR2VvbG9jYXRpb24vd2F0Y2hQb3NpdGlvbikuXG4gKlxuICovXG5cbi8qKlxuICogRmlyZWQgd2hlbiB0aGUgR2VvbG9jYXRlIENvbnRyb2wgY2hhbmdlcyB0byB0aGUgYWN0aXZlIGxvY2sgc3RhdGUsIHdoaWNoIGhhcHBlbnMgZWl0aGVyIHVwb24gZmlyc3Qgb2J0YWluaW5nIGEgc3VjY2Vzc2Z1bCBHZW9sb2NhdGlvbiBBUEkgcG9zaXRpb24gZm9yIHRoZSB1c2VyIChhIGdlb2xvY2F0ZSBldmVudCB3aWxsIGZvbGxvdyksIG9yIHRoZSB1c2VyIGNsaWNrcyB0aGUgZ2VvbG9jYXRlIGJ1dHRvbiB3aGVuIGluIHRoZSBiYWNrZ3JvdW5kIHN0YXRlIHdoaWNoIHVzZXMgdGhlIGxhc3Qga25vd24gcG9zaXRpb24gdG8gcmVjZW50ZXIgdGhlIG1hcCBhbmQgZW50ZXIgYWN0aXZlIGxvY2sgc3RhdGUgKG5vIGdlb2xvY2F0ZSBldmVudCB3aWxsIGZvbGxvdyB1bmxlc3MgdGhlIHVzZXJzJ3MgbG9jYXRpb24gY2hhbmdlcykuXG4gKlxuICogQGV2ZW50IHRyYWNrdXNlcmxvY2F0aW9uc3RhcnRcbiAqIEBtZW1iZXJvZiBHZW9sb2NhdGVDb250cm9sXG4gKiBAaW5zdGFuY2VcbiAqXG4gKi9cblxuLyoqXG4gKiBGaXJlZCB3aGVuIHRoZSBHZW9sb2NhdGUgQ29udHJvbCBjaGFuZ2VzIHRvIHRoZSBiYWNrZ3JvdW5kIHN0YXRlLCB3aGljaCBoYXBwZW5zIHdoZW4gYSB1c2VyIGNoYW5nZXMgdGhlIGNhbWVyYSBkdXJpbmcgYW4gYWN0aXZlIHBvc2l0aW9uIGxvY2suIFRoaXMgb25seSBhcHBsaWVzIHdoZW4gdHJhY2tVc2VyTG9jYXRpb24gaXMgdHJ1ZS4gSW4gdGhlIGJhY2tncm91bmQgc3RhdGUsIHRoZSBkb3Qgb24gdGhlIG1hcCB3aWxsIHVwZGF0ZSB3aXRoIGxvY2F0aW9uIHVwZGF0ZXMgYnV0IHRoZSBjYW1lcmEgd2lsbCBub3QuXG4gKlxuICogQGV2ZW50IHRyYWNrdXNlcmxvY2F0aW9uZW5kXG4gKiBAbWVtYmVyb2YgR2VvbG9jYXRlQ29udHJvbFxuICogQGluc3RhbmNlXG4gKlxuICovXG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgRE9NIGZyb20gJy4uLy4uL3V0aWwvZG9tJztcbmltcG9ydCB7IGV4dGVuZCwgYmluZEFsbCB9IGZyb20gJy4uLy4uL3V0aWwvdXRpbCc7XG5cbmltcG9ydCB0eXBlIE1hcCBmcm9tICcuLi9tYXAnO1xuXG50eXBlIFVuaXQgPSAnaW1wZXJpYWwnIHwgJ21ldHJpYycgfCAnbmF1dGljYWwnO1xuXG50eXBlIE9wdGlvbnMgPSB7XG4gICAgbWF4V2lkdGg/OiBudW1iZXIsXG4gICAgdW5pdD86IFVuaXQ7XG59O1xuXG5jb25zdCBkZWZhdWx0T3B0aW9uczogT3B0aW9ucyA9IHtcbiAgICBtYXhXaWR0aDogMTAwLFxuICAgIHVuaXQ6ICdtZXRyaWMnXG59O1xuXG4vKipcbiAqIEEgYFNjYWxlQ29udHJvbGAgY29udHJvbCBkaXNwbGF5cyB0aGUgcmF0aW8gb2YgYSBkaXN0YW5jZSBvbiB0aGUgbWFwIHRvIHRoZSBjb3JyZXNwb25kaW5nIGRpc3RhbmNlIG9uIHRoZSBncm91bmQuXG4gKlxuICogQGltcGxlbWVudHMge0lDb250cm9sfVxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLm1heFdpZHRoPScxMDAnXSBUaGUgbWF4aW11bSBsZW5ndGggb2YgdGhlIHNjYWxlIGNvbnRyb2wgaW4gcGl4ZWxzLlxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLnVuaXQ9J21ldHJpYyddIFVuaXQgb2YgdGhlIGRpc3RhbmNlIChgJ2ltcGVyaWFsJ2AsIGAnbWV0cmljJ2Agb3IgYCduYXV0aWNhbCdgKS5cbiAqIEBleGFtcGxlXG4gKiB2YXIgc2NhbGUgPSBuZXcgbWFwYm94Z2wuU2NhbGVDb250cm9sKHtcbiAqICAgICBtYXhXaWR0aDogODAsXG4gKiAgICAgdW5pdDogJ2ltcGVyaWFsJ1xuICogfSk7XG4gKiBtYXAuYWRkQ29udHJvbChzY2FsZSk7XG4gKlxuICogc2NhbGUuc2V0VW5pdCgnbWV0cmljJyk7XG4gKi9cbmNsYXNzIFNjYWxlQ29udHJvbCB7XG4gICAgX21hcDogTWFwO1xuICAgIF9jb250YWluZXI6IEhUTUxFbGVtZW50O1xuICAgIG9wdGlvbnM6IE9wdGlvbnM7XG5cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOiBPcHRpb25zKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IGV4dGVuZCh7fSwgZGVmYXVsdE9wdGlvbnMsIG9wdGlvbnMpO1xuXG4gICAgICAgIGJpbmRBbGwoW1xuICAgICAgICAgICAgJ19vbk1vdmUnLFxuICAgICAgICAgICAgJ3NldFVuaXQnXG4gICAgICAgIF0sIHRoaXMpO1xuICAgIH1cblxuICAgIGdldERlZmF1bHRQb3NpdGlvbigpIHtcbiAgICAgICAgcmV0dXJuICdib3R0b20tbGVmdCc7XG4gICAgfVxuXG4gICAgX29uTW92ZSgpIHtcbiAgICAgICAgdXBkYXRlU2NhbGUodGhpcy5fbWFwLCB0aGlzLl9jb250YWluZXIsIHRoaXMub3B0aW9ucyk7XG4gICAgfVxuXG4gICAgb25BZGQobWFwOiBNYXApIHtcbiAgICAgICAgdGhpcy5fbWFwID0gbWFwO1xuICAgICAgICB0aGlzLl9jb250YWluZXIgPSBET00uY3JlYXRlKCdkaXYnLCAnbWFwYm94Z2wtY3RybCBtYXBib3hnbC1jdHJsLXNjYWxlJywgbWFwLmdldENvbnRhaW5lcigpKTtcblxuICAgICAgICB0aGlzLl9tYXAub24oJ21vdmUnLCB0aGlzLl9vbk1vdmUpO1xuICAgICAgICB0aGlzLl9vbk1vdmUoKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5fY29udGFpbmVyO1xuICAgIH1cblxuICAgIG9uUmVtb3ZlKCkge1xuICAgICAgICBET00ucmVtb3ZlKHRoaXMuX2NvbnRhaW5lcik7XG4gICAgICAgIHRoaXMuX21hcC5vZmYoJ21vdmUnLCB0aGlzLl9vbk1vdmUpO1xuICAgICAgICB0aGlzLl9tYXAgPSAodW5kZWZpbmVkOiBhbnkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgc2NhbGUncyB1bml0IG9mIHRoZSBkaXN0YW5jZVxuICAgICAqXG4gICAgICogQHBhcmFtIHVuaXQgVW5pdCBvZiB0aGUgZGlzdGFuY2UgKGAnaW1wZXJpYWwnYCwgYCdtZXRyaWMnYCBvciBgJ25hdXRpY2FsJ2ApLlxuICAgICAqL1xuICAgIHNldFVuaXQodW5pdDogVW5pdCkge1xuICAgICAgICB0aGlzLm9wdGlvbnMudW5pdCA9IHVuaXQ7XG4gICAgICAgIHVwZGF0ZVNjYWxlKHRoaXMuX21hcCwgdGhpcy5fY29udGFpbmVyLCB0aGlzLm9wdGlvbnMpO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgU2NhbGVDb250cm9sO1xuXG5mdW5jdGlvbiB1cGRhdGVTY2FsZShtYXAsIGNvbnRhaW5lciwgb3B0aW9ucykge1xuICAgIC8vIEEgaG9yaXpvbnRhbCBzY2FsZSBpcyBpbWFnaW5lZCB0byBiZSBwcmVzZW50IGF0IGNlbnRlciBvZiB0aGUgbWFwXG4gICAgLy8gY29udGFpbmVyIHdpdGggbWF4aW11bSBsZW5ndGggKERlZmF1bHQpIGFzIDEwMHB4LlxuICAgIC8vIFVzaW5nIHNwaGVyaWNhbCBsYXcgb2YgY29zaW5lcyBhcHByb3hpbWF0aW9uLCB0aGUgcmVhbCBkaXN0YW5jZSBpc1xuICAgIC8vIGZvdW5kIGJldHdlZW4gdGhlIHR3byBjb29yZGluYXRlcy5cbiAgICBjb25zdCBtYXhXaWR0aCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5tYXhXaWR0aCB8fCAxMDA7XG5cbiAgICBjb25zdCB5ID0gbWFwLl9jb250YWluZXIuY2xpZW50SGVpZ2h0IC8gMjtcbiAgICBjb25zdCBtYXhNZXRlcnMgPSBnZXREaXN0YW5jZShtYXAudW5wcm9qZWN0KFswLCB5XSksIG1hcC51bnByb2plY3QoW21heFdpZHRoLCB5XSkpO1xuICAgIC8vIFRoZSByZWFsIGRpc3RhbmNlIGNvcnJlc3BvbmRpbmcgdG8gMTAwcHggc2NhbGUgbGVuZ3RoIGlzIHJvdW5kZWQgb2ZmIHRvXG4gICAgLy8gbmVhciBwcmV0dHkgbnVtYmVyIGFuZCB0aGUgc2NhbGUgbGVuZ3RoIGZvciB0aGUgc2FtZSBpcyBmb3VuZCBvdXQuXG4gICAgLy8gRGVmYXVsdCB1bml0IG9mIHRoZSBzY2FsZSBpcyBiYXNlZCBvbiBVc2VyJ3MgbG9jYWxlLlxuICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMudW5pdCA9PT0gJ2ltcGVyaWFsJykge1xuICAgICAgICBjb25zdCBtYXhGZWV0ID0gMy4yODA4ICogbWF4TWV0ZXJzO1xuICAgICAgICBpZiAobWF4RmVldCA+IDUyODApIHtcbiAgICAgICAgICAgIGNvbnN0IG1heE1pbGVzID0gbWF4RmVldCAvIDUyODA7XG4gICAgICAgICAgICBzZXRTY2FsZShjb250YWluZXIsIG1heFdpZHRoLCBtYXhNaWxlcywgJ21pJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZXRTY2FsZShjb250YWluZXIsIG1heFdpZHRoLCBtYXhGZWV0LCAnZnQnKTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSBpZiAob3B0aW9ucyAmJiBvcHRpb25zLnVuaXQgPT09ICduYXV0aWNhbCcpIHtcbiAgICAgICAgY29uc3QgbWF4TmF1dGljYWxzID0gbWF4TWV0ZXJzIC8gMTg1MjtcbiAgICAgICAgc2V0U2NhbGUoY29udGFpbmVyLCBtYXhXaWR0aCwgbWF4TmF1dGljYWxzLCAnbm0nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBzZXRTY2FsZShjb250YWluZXIsIG1heFdpZHRoLCBtYXhNZXRlcnMsICdtJyk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBzZXRTY2FsZShjb250YWluZXIsIG1heFdpZHRoLCBtYXhEaXN0YW5jZSwgdW5pdCkge1xuICAgIGxldCBkaXN0YW5jZSA9IGdldFJvdW5kTnVtKG1heERpc3RhbmNlKTtcbiAgICBjb25zdCByYXRpbyA9IGRpc3RhbmNlIC8gbWF4RGlzdGFuY2U7XG5cbiAgICBpZiAodW5pdCA9PT0gJ20nICYmIGRpc3RhbmNlID49IDEwMDApIHtcbiAgICAgICAgZGlzdGFuY2UgPSBkaXN0YW5jZSAvIDEwMDA7XG4gICAgICAgIHVuaXQgPSAna20nO1xuICAgIH1cblxuICAgIGNvbnRhaW5lci5zdHlsZS53aWR0aCA9IGAke21heFdpZHRoICogcmF0aW99cHhgO1xuICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSBkaXN0YW5jZSArIHVuaXQ7XG59XG5cbmZ1bmN0aW9uIGdldERpc3RhbmNlKGxhdGxuZzEsIGxhdGxuZzIpIHtcbiAgICAvLyBVc2VzIHNwaGVyaWNhbCBsYXcgb2YgY29zaW5lcyBhcHByb3hpbWF0aW9uLlxuICAgIGNvbnN0IFIgPSA2MzcxMDAwO1xuXG4gICAgY29uc3QgcmFkID0gTWF0aC5QSSAvIDE4MCxcbiAgICAgICAgbGF0MSA9IGxhdGxuZzEubGF0ICogcmFkLFxuICAgICAgICBsYXQyID0gbGF0bG5nMi5sYXQgKiByYWQsXG4gICAgICAgIGEgPSBNYXRoLnNpbihsYXQxKSAqIE1hdGguc2luKGxhdDIpICtcbiAgICAgICAgICBNYXRoLmNvcyhsYXQxKSAqIE1hdGguY29zKGxhdDIpICogTWF0aC5jb3MoKGxhdGxuZzIubG5nIC0gbGF0bG5nMS5sbmcpICogcmFkKTtcblxuICAgIGNvbnN0IG1heE1ldGVycyA9IFIgKiBNYXRoLmFjb3MoTWF0aC5taW4oYSwgMSkpO1xuICAgIHJldHVybiBtYXhNZXRlcnM7XG5cbn1cblxuZnVuY3Rpb24gZ2V0RGVjaW1hbFJvdW5kTnVtKGQpIHtcbiAgICBjb25zdCBtdWx0aXBsaWVyID0gTWF0aC5wb3coMTAsIE1hdGguY2VpbCgtTWF0aC5sb2coZCkgLyBNYXRoLkxOMTApKTtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChkICogbXVsdGlwbGllcikgLyBtdWx0aXBsaWVyO1xufVxuXG5mdW5jdGlvbiBnZXRSb3VuZE51bShudW0pIHtcbiAgICBjb25zdCBwb3cxMCA9IE1hdGgucG93KDEwLCAoYCR7TWF0aC5mbG9vcihudW0pfWApLmxlbmd0aCAtIDEpO1xuICAgIGxldCBkID0gbnVtIC8gcG93MTA7XG5cbiAgICBkID0gZCA+PSAxMCA/IDEwIDpcbiAgICAgICAgZCA+PSA1ID8gNSA6XG4gICAgICAgIGQgPj0gMyA/IDMgOlxuICAgICAgICBkID49IDIgPyAyIDpcbiAgICAgICAgZCA+PSAxID8gMSA6IGdldERlY2ltYWxSb3VuZE51bShkKTtcblxuICAgIHJldHVybiBwb3cxMCAqIGQ7XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgRE9NIGZyb20gJy4uLy4uL3V0aWwvZG9tJztcblxuaW1wb3J0IHsgYmluZEFsbCwgd2Fybk9uY2UgfSBmcm9tICcuLi8uLi91dGlsL3V0aWwnO1xuaW1wb3J0IHdpbmRvdyBmcm9tICcuLi8uLi91dGlsL3dpbmRvdyc7XG5cbmltcG9ydCB0eXBlIE1hcCBmcm9tICcuLi9tYXAnO1xuXG50eXBlIE9wdGlvbnMgPSB7XG4gICAgY29udGFpbmVyPzogSFRNTEVsZW1lbnRcbn07XG5cbi8qKlxuICogQSBgRnVsbHNjcmVlbkNvbnRyb2xgIGNvbnRyb2wgY29udGFpbnMgYSBidXR0b24gZm9yIHRvZ2dsaW5nIHRoZSBtYXAgaW4gYW5kIG91dCBvZiBmdWxsc2NyZWVuIG1vZGUuXG4gKlxuICogQGltcGxlbWVudHMge0lDb250cm9sfVxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gW29wdGlvbnMuY29udGFpbmVyXSBgY29udGFpbmVyYCBpcyB0aGUgW2NvbXBhdGlibGUgRE9NIGVsZW1lbnRdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9FbGVtZW50L3JlcXVlc3RGdWxsU2NyZWVuI0NvbXBhdGlibGVfZWxlbWVudHMpIHdoaWNoIHNob3VsZCBiZSBtYWRlIGZ1bGwgc2NyZWVuLiBCeSBkZWZhdWx0LCB0aGUgbWFwIGNvbnRhaW5lciBlbGVtZW50IHdpbGwgYmUgbWFkZSBmdWxsIHNjcmVlbi5cbiAqXG4gKiBAZXhhbXBsZVxuICogbWFwLmFkZENvbnRyb2wobmV3IG1hcGJveGdsLkZ1bGxzY3JlZW5Db250cm9sKHtjb250YWluZXI6IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2JvZHknKX0pKTtcbiAqIEBzZWUgW1ZpZXcgYSBmdWxsc2NyZWVuIG1hcF0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9mdWxsc2NyZWVuLylcbiAqL1xuXG5jbGFzcyBGdWxsc2NyZWVuQ29udHJvbCB7XG4gICAgX21hcDogTWFwO1xuICAgIF9jb250cm9sQ29udGFpbmVyOiBIVE1MRWxlbWVudDtcbiAgICBfZnVsbHNjcmVlbjogYm9vbGVhbjtcbiAgICBfZnVsbHNjcmVlbmNoYW5nZTogc3RyaW5nO1xuICAgIF9mdWxsc2NyZWVuQnV0dG9uOiBIVE1MRWxlbWVudDtcbiAgICBfY2xhc3NOYW1lOiBzdHJpbmc7XG4gICAgX2NvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XG5cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOiBPcHRpb25zKSB7XG4gICAgICAgIHRoaXMuX2Z1bGxzY3JlZW4gPSBmYWxzZTtcbiAgICAgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5jb250YWluZXIpIHtcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmNvbnRhaW5lciBpbnN0YW5jZW9mIHdpbmRvdy5IVE1MRWxlbWVudCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lciA9IG9wdGlvbnMuY29udGFpbmVyO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB3YXJuT25jZSgnRnVsbCBzY3JlZW4gY29udHJvbCBcXCdjb250YWluZXJcXCcgbXVzdCBiZSBhIERPTSBlbGVtZW50LicpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJpbmRBbGwoW1xuICAgICAgICAgICAgJ19vbkNsaWNrRnVsbHNjcmVlbicsXG4gICAgICAgICAgICAnX2NoYW5nZUljb24nXG4gICAgICAgIF0sIHRoaXMpO1xuICAgICAgICBpZiAoJ29uZnVsbHNjcmVlbmNoYW5nZScgaW4gd2luZG93LmRvY3VtZW50KSB7XG4gICAgICAgICAgICB0aGlzLl9mdWxsc2NyZWVuY2hhbmdlID0gJ2Z1bGxzY3JlZW5jaGFuZ2UnO1xuICAgICAgICB9IGVsc2UgaWYgKCdvbm1vemZ1bGxzY3JlZW5jaGFuZ2UnIGluIHdpbmRvdy5kb2N1bWVudCkge1xuICAgICAgICAgICAgdGhpcy5fZnVsbHNjcmVlbmNoYW5nZSA9ICdtb3pmdWxsc2NyZWVuY2hhbmdlJztcbiAgICAgICAgfSBlbHNlIGlmICgnb253ZWJraXRmdWxsc2NyZWVuY2hhbmdlJyBpbiB3aW5kb3cuZG9jdW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuX2Z1bGxzY3JlZW5jaGFuZ2UgPSAnd2Via2l0ZnVsbHNjcmVlbmNoYW5nZSc7XG4gICAgICAgIH0gZWxzZSBpZiAoJ29ubXNmdWxsc2NyZWVuY2hhbmdlJyBpbiB3aW5kb3cuZG9jdW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuX2Z1bGxzY3JlZW5jaGFuZ2UgPSAnTVNGdWxsc2NyZWVuQ2hhbmdlJztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9jbGFzc05hbWUgPSAnbWFwYm94Z2wtY3RybCc7XG4gICAgfVxuXG4gICAgb25BZGQobWFwOiBNYXApIHtcbiAgICAgICAgdGhpcy5fbWFwID0gbWFwO1xuICAgICAgICBpZiAoIXRoaXMuX2NvbnRhaW5lcikgdGhpcy5fY29udGFpbmVyID0gdGhpcy5fbWFwLmdldENvbnRhaW5lcigpO1xuICAgICAgICB0aGlzLl9jb250cm9sQ29udGFpbmVyID0gRE9NLmNyZWF0ZSgnZGl2JywgYCR7dGhpcy5fY2xhc3NOYW1lfSBtYXBib3hnbC1jdHJsLWdyb3VwYCk7XG4gICAgICAgIGlmICh0aGlzLl9jaGVja0Z1bGxzY3JlZW5TdXBwb3J0KCkpIHtcbiAgICAgICAgICAgIHRoaXMuX3NldHVwVUkoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2NvbnRyb2xDb250YWluZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgICAgIHdhcm5PbmNlKCdUaGlzIGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IGZ1bGxzY3JlZW4gbW9kZS4nKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fY29udHJvbENvbnRhaW5lcjtcbiAgICB9XG5cbiAgICBvblJlbW92ZSgpIHtcbiAgICAgICAgRE9NLnJlbW92ZSh0aGlzLl9jb250cm9sQ29udGFpbmVyKTtcbiAgICAgICAgdGhpcy5fbWFwID0gKG51bGw6IGFueSk7XG4gICAgICAgIHdpbmRvdy5kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKHRoaXMuX2Z1bGxzY3JlZW5jaGFuZ2UsIHRoaXMuX2NoYW5nZUljb24pO1xuICAgIH1cblxuICAgIF9jaGVja0Z1bGxzY3JlZW5TdXBwb3J0KCkge1xuICAgICAgICByZXR1cm4gISEoXG4gICAgICAgICAgICB3aW5kb3cuZG9jdW1lbnQuZnVsbHNjcmVlbkVuYWJsZWQgfHxcbiAgICAgICAgICAgICh3aW5kb3cuZG9jdW1lbnQ6IGFueSkubW96RnVsbFNjcmVlbkVuYWJsZWQgfHxcbiAgICAgICAgICAgICh3aW5kb3cuZG9jdW1lbnQ6IGFueSkubXNGdWxsc2NyZWVuRW5hYmxlZCB8fFxuICAgICAgICAgICAgKHdpbmRvdy5kb2N1bWVudDogYW55KS53ZWJraXRGdWxsc2NyZWVuRW5hYmxlZFxuICAgICAgICApO1xuICAgIH1cblxuICAgIF9zZXR1cFVJKCkge1xuICAgICAgICBjb25zdCBidXR0b24gPSB0aGlzLl9mdWxsc2NyZWVuQnV0dG9uID0gRE9NLmNyZWF0ZSgnYnV0dG9uJywgKGAke3RoaXMuX2NsYXNzTmFtZX0taWNvbiAke3RoaXMuX2NsYXNzTmFtZX0tZnVsbHNjcmVlbmApLCB0aGlzLl9jb250cm9sQ29udGFpbmVyKTtcbiAgICAgICAgYnV0dG9uLnR5cGUgPSAnYnV0dG9uJztcbiAgICAgICAgdGhpcy5fdXBkYXRlVGl0bGUoKTtcbiAgICAgICAgdGhpcy5fZnVsbHNjcmVlbkJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX29uQ2xpY2tGdWxsc2NyZWVuKTtcbiAgICAgICAgd2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIodGhpcy5fZnVsbHNjcmVlbmNoYW5nZSwgdGhpcy5fY2hhbmdlSWNvbik7XG4gICAgfVxuXG4gICAgX3VwZGF0ZVRpdGxlKCkge1xuICAgICAgICBjb25zdCB0aXRsZSA9IHRoaXMuX2lzRnVsbHNjcmVlbigpID8gXCJFeGl0IGZ1bGxzY3JlZW5cIiA6IFwiRW50ZXIgZnVsbHNjcmVlblwiO1xuICAgICAgICB0aGlzLl9mdWxsc2NyZWVuQnV0dG9uLnNldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIiwgdGl0bGUpO1xuICAgICAgICB0aGlzLl9mdWxsc2NyZWVuQnV0dG9uLnRpdGxlID0gdGl0bGU7XG4gICAgfVxuXG4gICAgX2lzRnVsbHNjcmVlbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Z1bGxzY3JlZW47XG4gICAgfVxuXG4gICAgX2NoYW5nZUljb24oKSB7XG4gICAgICAgIGNvbnN0IGZ1bGxzY3JlZW5FbGVtZW50ID1cbiAgICAgICAgICAgIHdpbmRvdy5kb2N1bWVudC5mdWxsc2NyZWVuRWxlbWVudCB8fFxuICAgICAgICAgICAgKHdpbmRvdy5kb2N1bWVudDogYW55KS5tb3pGdWxsU2NyZWVuRWxlbWVudCB8fFxuICAgICAgICAgICAgKHdpbmRvdy5kb2N1bWVudDogYW55KS53ZWJraXRGdWxsc2NyZWVuRWxlbWVudCB8fFxuICAgICAgICAgICAgKHdpbmRvdy5kb2N1bWVudDogYW55KS5tc0Z1bGxzY3JlZW5FbGVtZW50O1xuXG4gICAgICAgIGlmICgoZnVsbHNjcmVlbkVsZW1lbnQgPT09IHRoaXMuX2NvbnRhaW5lcikgIT09IHRoaXMuX2Z1bGxzY3JlZW4pIHtcbiAgICAgICAgICAgIHRoaXMuX2Z1bGxzY3JlZW4gPSAhdGhpcy5fZnVsbHNjcmVlbjtcbiAgICAgICAgICAgIHRoaXMuX2Z1bGxzY3JlZW5CdXR0b24uY2xhc3NMaXN0LnRvZ2dsZShgJHt0aGlzLl9jbGFzc05hbWV9LXNocmlua2ApO1xuICAgICAgICAgICAgdGhpcy5fZnVsbHNjcmVlbkJ1dHRvbi5jbGFzc0xpc3QudG9nZ2xlKGAke3RoaXMuX2NsYXNzTmFtZX0tZnVsbHNjcmVlbmApO1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlVGl0bGUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9vbkNsaWNrRnVsbHNjcmVlbigpIHtcbiAgICAgICAgaWYgKHRoaXMuX2lzRnVsbHNjcmVlbigpKSB7XG4gICAgICAgICAgICBpZiAod2luZG93LmRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKSB7XG4gICAgICAgICAgICAgICAgKHdpbmRvdy5kb2N1bWVudDogYW55KS5leGl0RnVsbHNjcmVlbigpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh3aW5kb3cuZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbikge1xuICAgICAgICAgICAgICAgICh3aW5kb3cuZG9jdW1lbnQ6IGFueSkubW96Q2FuY2VsRnVsbFNjcmVlbigpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh3aW5kb3cuZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbikge1xuICAgICAgICAgICAgICAgICh3aW5kb3cuZG9jdW1lbnQ6IGFueSkubXNFeGl0RnVsbHNjcmVlbigpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh3aW5kb3cuZG9jdW1lbnQud2Via2l0Q2FuY2VsRnVsbFNjcmVlbikge1xuICAgICAgICAgICAgICAgICh3aW5kb3cuZG9jdW1lbnQ6IGFueSkud2Via2l0Q2FuY2VsRnVsbFNjcmVlbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX2NvbnRhaW5lci5yZXF1ZXN0RnVsbHNjcmVlbikge1xuICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyLnJlcXVlc3RGdWxsc2NyZWVuKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoKHRoaXMuX2NvbnRhaW5lcjogYW55KS5tb3pSZXF1ZXN0RnVsbFNjcmVlbikge1xuICAgICAgICAgICAgKHRoaXMuX2NvbnRhaW5lcjogYW55KS5tb3pSZXF1ZXN0RnVsbFNjcmVlbigpO1xuICAgICAgICB9IGVsc2UgaWYgKCh0aGlzLl9jb250YWluZXI6IGFueSkubXNSZXF1ZXN0RnVsbHNjcmVlbikge1xuICAgICAgICAgICAgKHRoaXMuX2NvbnRhaW5lcjogYW55KS5tc1JlcXVlc3RGdWxsc2NyZWVuKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoKHRoaXMuX2NvbnRhaW5lcjogYW55KS53ZWJraXRSZXF1ZXN0RnVsbHNjcmVlbikge1xuICAgICAgICAgICAgKHRoaXMuX2NvbnRhaW5lcjogYW55KS53ZWJraXRSZXF1ZXN0RnVsbHNjcmVlbigpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBGdWxsc2NyZWVuQ29udHJvbDtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7IGV4dGVuZCwgYmluZEFsbCB9IGZyb20gJy4uL3V0aWwvdXRpbCc7XG5pbXBvcnQgeyBFdmVudCwgRXZlbnRlZCB9IGZyb20gJy4uL3V0aWwvZXZlbnRlZCc7XG5pbXBvcnQgRE9NIGZyb20gJy4uL3V0aWwvZG9tJztcbmltcG9ydCBMbmdMYXQgZnJvbSAnLi4vZ2VvL2xuZ19sYXQnO1xuaW1wb3J0IFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuaW1wb3J0IHdpbmRvdyBmcm9tICcuLi91dGlsL3dpbmRvdyc7XG5pbXBvcnQgc21hcnRXcmFwIGZyb20gJy4uL3V0aWwvc21hcnRfd3JhcCc7XG5pbXBvcnQgeyB0eXBlIEFuY2hvciwgYW5jaG9yVHJhbnNsYXRlLCBhcHBseUFuY2hvckNsYXNzIH0gZnJvbSAnLi9hbmNob3InO1xuXG5pbXBvcnQgdHlwZSBNYXAgZnJvbSAnLi9tYXAnO1xuaW1wb3J0IHR5cGUge0xuZ0xhdExpa2V9IGZyb20gJy4uL2dlby9sbmdfbGF0JztcbmltcG9ydCB0eXBlIHtQb2ludExpa2V9IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuXG5jb25zdCBkZWZhdWx0T3B0aW9ucyA9IHtcbiAgICBjbG9zZUJ1dHRvbjogdHJ1ZSxcbiAgICBjbG9zZU9uQ2xpY2s6IHRydWUsXG4gICAgY2xhc3NOYW1lOiAnJyxcbiAgICBtYXhXaWR0aDogXCIyNDBweFwiXG59O1xuXG5leHBvcnQgdHlwZSBPZmZzZXQgPSBudW1iZXIgfCBQb2ludExpa2UgfCB7W0FuY2hvcl06IFBvaW50TGlrZX07XG5cbmV4cG9ydCB0eXBlIFBvcHVwT3B0aW9ucyA9IHtcbiAgICBjbG9zZUJ1dHRvbj86IGJvb2xlYW4sXG4gICAgY2xvc2VPbkNsaWNrPzogYm9vbGVhbixcbiAgICBhbmNob3I/OiBBbmNob3IsXG4gICAgb2Zmc2V0PzogT2Zmc2V0LFxuICAgIGNsYXNzTmFtZT86IHN0cmluZyxcbiAgICBtYXhXaWR0aD86IHN0cmluZ1xufTtcblxuLyoqXG4gKiBBIHBvcHVwIGNvbXBvbmVudC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmNsb3NlQnV0dG9uPXRydWVdIElmIGB0cnVlYCwgYSBjbG9zZSBidXR0b24gd2lsbCBhcHBlYXIgaW4gdGhlXG4gKiAgIHRvcCByaWdodCBjb3JuZXIgb2YgdGhlIHBvcHVwLlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5jbG9zZU9uQ2xpY2s9dHJ1ZV0gSWYgYHRydWVgLCB0aGUgcG9wdXAgd2lsbCBjbG9zZWQgd2hlbiB0aGVcbiAqICAgbWFwIGlzIGNsaWNrZWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuYW5jaG9yXSAtIEEgc3RyaW5nIGluZGljYXRpbmcgdGhlIHBhcnQgb2YgdGhlIFBvcHVwIHRoYXQgc2hvdWxkXG4gKiAgIGJlIHBvc2l0aW9uZWQgY2xvc2VzdCB0byB0aGUgY29vcmRpbmF0ZSBzZXQgdmlhIHtAbGluayBQb3B1cCNzZXRMbmdMYXR9LlxuICogICBPcHRpb25zIGFyZSBgJ2NlbnRlcidgLCBgJ3RvcCdgLCBgJ2JvdHRvbSdgLCBgJ2xlZnQnYCwgYCdyaWdodCdgLCBgJ3RvcC1sZWZ0J2AsXG4gKiAgIGAndG9wLXJpZ2h0J2AsIGAnYm90dG9tLWxlZnQnYCwgYW5kIGAnYm90dG9tLXJpZ2h0J2AuIElmIHVuc2V0IHRoZSBhbmNob3Igd2lsbCBiZVxuICogICBkeW5hbWljYWxseSBzZXQgdG8gZW5zdXJlIHRoZSBwb3B1cCBmYWxscyB3aXRoaW4gdGhlIG1hcCBjb250YWluZXIgd2l0aCBhIHByZWZlcmVuY2VcbiAqICAgZm9yIGAnYm90dG9tJ2AuXG4gKiBAcGFyYW0ge251bWJlcnxQb2ludExpa2V8T2JqZWN0fSBbb3B0aW9ucy5vZmZzZXRdIC1cbiAqICBBIHBpeGVsIG9mZnNldCBhcHBsaWVkIHRvIHRoZSBwb3B1cCdzIGxvY2F0aW9uIHNwZWNpZmllZCBhczpcbiAqICAgLSBhIHNpbmdsZSBudW1iZXIgc3BlY2lmeWluZyBhIGRpc3RhbmNlIGZyb20gdGhlIHBvcHVwJ3MgbG9jYXRpb25cbiAqICAgLSBhIHtAbGluayBQb2ludExpa2V9IHNwZWNpZnlpbmcgYSBjb25zdGFudCBvZmZzZXRcbiAqICAgLSBhbiBvYmplY3Qgb2Yge0BsaW5rIFBvaW50fXMgc3BlY2lmaW5nIGFuIG9mZnNldCBmb3IgZWFjaCBhbmNob3IgcG9zaXRpb25cbiAqICBOZWdhdGl2ZSBvZmZzZXRzIGluZGljYXRlIGxlZnQgYW5kIHVwLlxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmNsYXNzTmFtZV0gU3BhY2Utc2VwYXJhdGVkIENTUyBjbGFzcyBuYW1lcyB0byBhZGQgdG8gcG9wdXAgY29udGFpbmVyXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMubWF4V2lkdGhdIEEgc3RyaW5nIHRoYXQgc2V0cyB0aGUgQ1NTIHByb3BlcnR5IG9mIHRoZSBwb3B1cCdzIG1heFdpZHRoIGluIHBpeGVscywgZWcgXCIzMDBweFwiXG4gKiBAZXhhbXBsZVxuICogdmFyIG1hcmtlckhlaWdodCA9IDUwLCBtYXJrZXJSYWRpdXMgPSAxMCwgbGluZWFyT2Zmc2V0ID0gMjU7XG4gKiB2YXIgcG9wdXBPZmZzZXRzID0ge1xuICogICd0b3AnOiBbMCwgMF0sXG4gKiAgJ3RvcC1sZWZ0JzogWzAsMF0sXG4gKiAgJ3RvcC1yaWdodCc6IFswLDBdLFxuICogICdib3R0b20nOiBbMCwgLW1hcmtlckhlaWdodF0sXG4gKiAgJ2JvdHRvbS1sZWZ0JzogW2xpbmVhck9mZnNldCwgKG1hcmtlckhlaWdodCAtIG1hcmtlclJhZGl1cyArIGxpbmVhck9mZnNldCkgKiAtMV0sXG4gKiAgJ2JvdHRvbS1yaWdodCc6IFstbGluZWFyT2Zmc2V0LCAobWFya2VySGVpZ2h0IC0gbWFya2VyUmFkaXVzICsgbGluZWFyT2Zmc2V0KSAqIC0xXSxcbiAqICAnbGVmdCc6IFttYXJrZXJSYWRpdXMsIChtYXJrZXJIZWlnaHQgLSBtYXJrZXJSYWRpdXMpICogLTFdLFxuICogICdyaWdodCc6IFstbWFya2VyUmFkaXVzLCAobWFya2VySGVpZ2h0IC0gbWFya2VyUmFkaXVzKSAqIC0xXVxuICogIH07XG4gKiB2YXIgcG9wdXAgPSBuZXcgbWFwYm94Z2wuUG9wdXAoe29mZnNldDogcG9wdXBPZmZzZXRzLCBjbGFzc05hbWU6ICdteS1jbGFzcyd9KVxuICogICAuc2V0TG5nTGF0KGUubG5nTGF0KVxuICogICAuc2V0SFRNTChcIjxoMT5IZWxsbyBXb3JsZCE8L2gxPlwiKVxuICogICAuc2V0TWF4V2lkdGgoXCIzMDBweFwiKVxuICogICAuYWRkVG8obWFwKTtcbiAqIEBzZWUgW0Rpc3BsYXkgYSBwb3B1cF0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9wb3B1cC8pXG4gKiBAc2VlIFtEaXNwbGF5IGEgcG9wdXAgb24gaG92ZXJdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvcG9wdXAtb24taG92ZXIvKVxuICogQHNlZSBbRGlzcGxheSBhIHBvcHVwIG9uIGNsaWNrXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3BvcHVwLW9uLWNsaWNrLylcbiAqIEBzZWUgW0F0dGFjaCBhIHBvcHVwIHRvIGEgbWFya2VyIGluc3RhbmNlXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3NldC1wb3B1cC8pXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBvcHVwIGV4dGVuZHMgRXZlbnRlZCB7XG4gICAgX21hcDogTWFwO1xuICAgIG9wdGlvbnM6IFBvcHVwT3B0aW9ucztcbiAgICBfY29udGVudDogSFRNTEVsZW1lbnQ7XG4gICAgX2NvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XG4gICAgX2Nsb3NlQnV0dG9uOiBIVE1MRWxlbWVudDtcbiAgICBfdGlwOiBIVE1MRWxlbWVudDtcbiAgICBfbG5nTGF0OiBMbmdMYXQ7XG4gICAgX3BvczogP1BvaW50O1xuXG4gICAgY29uc3RydWN0b3Iob3B0aW9uczogUG9wdXBPcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IGV4dGVuZChPYmplY3QuY3JlYXRlKGRlZmF1bHRPcHRpb25zKSwgb3B0aW9ucyk7XG4gICAgICAgIGJpbmRBbGwoWydfdXBkYXRlJywgJ19vbkNsaWNrQ2xvc2UnLCAncmVtb3ZlJ10sIHRoaXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgdGhlIHBvcHVwIHRvIGEgbWFwLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtNYXB9IG1hcCBUaGUgTWFwYm94IEdMIEpTIG1hcCB0byBhZGQgdGhlIHBvcHVwIHRvLlxuICAgICAqIEByZXR1cm5zIHtQb3B1cH0gYHRoaXNgXG4gICAgICovXG4gICAgYWRkVG8obWFwOiBNYXApIHtcbiAgICAgICAgdGhpcy5fbWFwID0gbWFwO1xuICAgICAgICB0aGlzLl9tYXAub24oJ21vdmUnLCB0aGlzLl91cGRhdGUpO1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmNsb3NlT25DbGljaykge1xuICAgICAgICAgICAgdGhpcy5fbWFwLm9uKCdjbGljaycsIHRoaXMuX29uQ2xpY2tDbG9zZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fbWFwLm9uKCdyZW1vdmUnLCB0aGlzLnJlbW92ZSk7XG4gICAgICAgIHRoaXMuX3VwZGF0ZSgpO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGaXJlZCB3aGVuIHRoZSBwb3B1cCBpcyBvcGVuZWQgbWFudWFsbHkgb3IgcHJvZ3JhbWF0aWNhbGx5LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXZlbnQgb3BlblxuICAgICAgICAgKiBAbWVtYmVyb2YgUG9wdXBcbiAgICAgICAgICogQGluc3RhbmNlXG4gICAgICAgICAqIEB0eXBlIHtPYmplY3R9XG4gICAgICAgICAqIEBwcm9wZXJ0eSB7UG9wdXB9IHBvcHVwIG9iamVjdCB0aGF0IHdhcyBvcGVuZWRcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ29wZW4nKSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgcG9wdXAgaXMgb3BlbiwgYGZhbHNlYCBpZiBpdCBpcyBjbG9zZWQuXG4gICAgICovXG4gICAgaXNPcGVuKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLl9tYXA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyB0aGUgcG9wdXAgZnJvbSB0aGUgbWFwIGl0IGhhcyBiZWVuIGFkZGVkIHRvLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiB2YXIgcG9wdXAgPSBuZXcgbWFwYm94Z2wuUG9wdXAoKS5hZGRUbyhtYXApO1xuICAgICAqIHBvcHVwLnJlbW92ZSgpO1xuICAgICAqIEByZXR1cm5zIHtQb3B1cH0gYHRoaXNgXG4gICAgICovXG4gICAgcmVtb3ZlKCkge1xuICAgICAgICBpZiAodGhpcy5fY29udGVudCkge1xuICAgICAgICAgICAgRE9NLnJlbW92ZSh0aGlzLl9jb250ZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9jb250YWluZXIpIHtcbiAgICAgICAgICAgIERPTS5yZW1vdmUodGhpcy5fY29udGFpbmVyKTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9jb250YWluZXI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fbWFwKSB7XG4gICAgICAgICAgICB0aGlzLl9tYXAub2ZmKCdtb3ZlJywgdGhpcy5fdXBkYXRlKTtcbiAgICAgICAgICAgIHRoaXMuX21hcC5vZmYoJ2NsaWNrJywgdGhpcy5fb25DbGlja0Nsb3NlKTtcbiAgICAgICAgICAgIHRoaXMuX21hcC5vZmYoJ3JlbW92ZScsIHRoaXMucmVtb3ZlKTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9tYXA7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogRmlyZWQgd2hlbiB0aGUgcG9wdXAgaXMgY2xvc2VkIG1hbnVhbGx5IG9yIHByb2dyYW1hdGljYWxseS5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV2ZW50IGNsb3NlXG4gICAgICAgICAqIEBtZW1iZXJvZiBQb3B1cFxuICAgICAgICAgKiBAaW5zdGFuY2VcbiAgICAgICAgICogQHR5cGUge09iamVjdH1cbiAgICAgICAgICogQHByb3BlcnR5IHtQb3B1cH0gcG9wdXAgb2JqZWN0IHRoYXQgd2FzIGNsb3NlZFxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgnY2xvc2UnKSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgZ2VvZ3JhcGhpY2FsIGxvY2F0aW9uIG9mIHRoZSBwb3B1cCdzIGFuY2hvci5cbiAgICAgKlxuICAgICAqIFRoZSBsb25naXR1ZGUgb2YgdGhlIHJlc3VsdCBtYXkgZGlmZmVyIGJ5IGEgbXVsdGlwbGUgb2YgMzYwIGRlZ3JlZXMgZnJvbSB0aGUgbG9uZ2l0dWRlIHByZXZpb3VzbHlcbiAgICAgKiBzZXQgYnkgYHNldExuZ0xhdGAgYmVjYXVzZSBgUG9wdXBgIHdyYXBzIHRoZSBhbmNob3IgbG9uZ2l0dWRlIGFjcm9zcyBjb3BpZXMgb2YgdGhlIHdvcmxkIHRvIGtlZXBcbiAgICAgKiB0aGUgcG9wdXAgb24gc2NyZWVuLlxuICAgICAqXG4gICAgICogQHJldHVybnMge0xuZ0xhdH0gVGhlIGdlb2dyYXBoaWNhbCBsb2NhdGlvbiBvZiB0aGUgcG9wdXAncyBhbmNob3IuXG4gICAgICovXG4gICAgZ2V0TG5nTGF0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbG5nTGF0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGdlb2dyYXBoaWNhbCBsb2NhdGlvbiBvZiB0aGUgcG9wdXAncyBhbmNob3IsIGFuZCBtb3ZlcyB0aGUgcG9wdXAgdG8gaXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbG5nbGF0IFRoZSBnZW9ncmFwaGljYWwgbG9jYXRpb24gdG8gc2V0IGFzIHRoZSBwb3B1cCdzIGFuY2hvci5cbiAgICAgKiBAcmV0dXJucyB7UG9wdXB9IGB0aGlzYFxuICAgICAqL1xuICAgIHNldExuZ0xhdChsbmdsYXQ6IExuZ0xhdExpa2UpIHtcbiAgICAgICAgdGhpcy5fbG5nTGF0ID0gTG5nTGF0LmNvbnZlcnQobG5nbGF0KTtcbiAgICAgICAgdGhpcy5fcG9zID0gbnVsbDtcbiAgICAgICAgdGhpcy5fdXBkYXRlKCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHBvcHVwJ3MgY29udGVudCB0byBhIHN0cmluZyBvZiB0ZXh0LlxuICAgICAqXG4gICAgICogVGhpcyBmdW5jdGlvbiBjcmVhdGVzIGEgW1RleHRdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9UZXh0KSBub2RlIGluIHRoZSBET00sXG4gICAgICogc28gaXQgY2Fubm90IGluc2VydCByYXcgSFRNTC4gVXNlIHRoaXMgbWV0aG9kIGZvciBzZWN1cml0eSBhZ2FpbnN0IFhTU1xuICAgICAqIGlmIHRoZSBwb3B1cCBjb250ZW50IGlzIHVzZXItcHJvdmlkZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdGV4dCBUZXh0dWFsIGNvbnRlbnQgZm9yIHRoZSBwb3B1cC5cbiAgICAgKiBAcmV0dXJucyB7UG9wdXB9IGB0aGlzYFxuICAgICAqIEBleGFtcGxlXG4gICAgICogdmFyIHBvcHVwID0gbmV3IG1hcGJveGdsLlBvcHVwKClcbiAgICAgKiAgIC5zZXRMbmdMYXQoZS5sbmdMYXQpXG4gICAgICogICAuc2V0VGV4dCgnSGVsbG8sIHdvcmxkIScpXG4gICAgICogICAuYWRkVG8obWFwKTtcbiAgICAgKi9cbiAgICBzZXRUZXh0KHRleHQ6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXRET01Db250ZW50KHdpbmRvdy5kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0ZXh0KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgcG9wdXAncyBjb250ZW50IHRvIHRoZSBIVE1MIHByb3ZpZGVkIGFzIGEgc3RyaW5nLlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgZG9lcyBub3QgcGVyZm9ybSBIVE1MIGZpbHRlcmluZyBvciBzYW5pdGl6YXRpb24sIGFuZCBtdXN0IGJlXG4gICAgICogdXNlZCBvbmx5IHdpdGggdHJ1c3RlZCBjb250ZW50LiBDb25zaWRlciB7QGxpbmsgUG9wdXAjc2V0VGV4dH0gaWZcbiAgICAgKiB0aGUgY29udGVudCBpcyBhbiB1bnRydXN0ZWQgdGV4dCBzdHJpbmcuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gaHRtbCBBIHN0cmluZyByZXByZXNlbnRpbmcgSFRNTCBjb250ZW50IGZvciB0aGUgcG9wdXAuXG4gICAgICogQHJldHVybnMge1BvcHVwfSBgdGhpc2BcbiAgICAgKi9cbiAgICBzZXRIVE1MKGh0bWw6IHN0cmluZykge1xuICAgICAgICBjb25zdCBmcmFnID0gd2luZG93LmRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcbiAgICAgICAgY29uc3QgdGVtcCA9IHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdib2R5Jyk7XG4gICAgICAgIGxldCBjaGlsZDtcbiAgICAgICAgdGVtcC5pbm5lckhUTUwgPSBodG1sO1xuICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgY2hpbGQgPSB0ZW1wLmZpcnN0Q2hpbGQ7XG4gICAgICAgICAgICBpZiAoIWNoaWxkKSBicmVhaztcbiAgICAgICAgICAgIGZyYWcuYXBwZW5kQ2hpbGQoY2hpbGQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0RE9NQ29udGVudChmcmFnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBwb3B1cCdzIG1heCB3aWR0aC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBtYXggd2lkdGggb2YgdGhlIHBvcHVwLlxuICAgICAqL1xuICAgIGdldE1heFdpZHRoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29udGFpbmVyLnN0eWxlLm1heFdpZHRoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHBvcHVwJ3MgbWF4IHdpZHRoLiBUaGlzIGlzIHNldHRpbmcgdGhlIENTUyBwcm9wZXJ0eSBtYXhXaWR0aC4gSXQgZXhwZWN0cyBhIHN0cmluZyBpbiBcIk5weFwiIGZvcm1hdCwgd2hlcmUgTiBpcyBzb21lIG51bWJlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBtYXhXaWR0aCBBIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHBpeGVsIHZhbHVlIGZvciB0aGUgbWF4aW11bSB3aWR0aC5cbiAgICAgKiBAcmV0dXJucyB7UG9wdXB9IGB0aGlzYFxuICAgICAqL1xuICAgIHNldE1heFdpZHRoKG1heFdpZHRoOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLm1heFdpZHRoID0gbWF4V2lkdGg7XG4gICAgICAgIHRoaXMuX3VwZGF0ZSgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBwb3B1cCdzIGNvbnRlbnQgdG8gdGhlIGVsZW1lbnQgcHJvdmlkZWQgYXMgYSBET00gbm9kZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBodG1sTm9kZSBBIERPTSBub2RlIHRvIGJlIHVzZWQgYXMgY29udGVudCBmb3IgdGhlIHBvcHVwLlxuICAgICAqIEByZXR1cm5zIHtQb3B1cH0gYHRoaXNgXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBjcmVhdGUgYW4gZWxlbWVudCB3aXRoIHRoZSBwb3B1cCBjb250ZW50XG4gICAgICogdmFyIGRpdiA9IHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgKiBkaXYuaW5uZXJIVE1MID0gJ0hlbGxvLCB3b3JsZCEnO1xuICAgICAqIHZhciBwb3B1cCA9IG5ldyBtYXBib3hnbC5Qb3B1cCgpXG4gICAgICogICAuc2V0TG5nTGF0KGUubG5nTGF0KVxuICAgICAqICAgLnNldERPTUNvbnRlbnQoZGl2KVxuICAgICAqICAgLmFkZFRvKG1hcCk7XG4gICAgICovXG4gICAgc2V0RE9NQ29udGVudChodG1sTm9kZTogTm9kZSkge1xuICAgICAgICB0aGlzLl9jcmVhdGVDb250ZW50KCk7XG4gICAgICAgIHRoaXMuX2NvbnRlbnQuYXBwZW5kQ2hpbGQoaHRtbE5vZGUpO1xuICAgICAgICB0aGlzLl91cGRhdGUoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgX2NyZWF0ZUNvbnRlbnQoKSB7XG4gICAgICAgIGlmICh0aGlzLl9jb250ZW50KSB7XG4gICAgICAgICAgICBET00ucmVtb3ZlKHRoaXMuX2NvbnRlbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fY29udGVudCA9IERPTS5jcmVhdGUoJ2RpdicsICdtYXBib3hnbC1wb3B1cC1jb250ZW50JywgdGhpcy5fY29udGFpbmVyKTtcblxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmNsb3NlQnV0dG9uKSB7XG4gICAgICAgICAgICB0aGlzLl9jbG9zZUJ1dHRvbiA9IERPTS5jcmVhdGUoJ2J1dHRvbicsICdtYXBib3hnbC1wb3B1cC1jbG9zZS1idXR0b24nLCB0aGlzLl9jb250ZW50KTtcbiAgICAgICAgICAgIHRoaXMuX2Nsb3NlQnV0dG9uLnR5cGUgPSAnYnV0dG9uJztcbiAgICAgICAgICAgIHRoaXMuX2Nsb3NlQnV0dG9uLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsICdDbG9zZSBwb3B1cCcpO1xuICAgICAgICAgICAgdGhpcy5fY2xvc2VCdXR0b24uaW5uZXJIVE1MID0gJyYjMjE1Oyc7XG4gICAgICAgICAgICB0aGlzLl9jbG9zZUJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX29uQ2xpY2tDbG9zZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfdXBkYXRlKCkge1xuICAgICAgICBpZiAoIXRoaXMuX21hcCB8fCAhdGhpcy5fbG5nTGF0IHx8ICF0aGlzLl9jb250ZW50KSB7IHJldHVybjsgfVxuXG4gICAgICAgIGlmICghdGhpcy5fY29udGFpbmVyKSB7XG4gICAgICAgICAgICB0aGlzLl9jb250YWluZXIgPSBET00uY3JlYXRlKCdkaXYnLCAnbWFwYm94Z2wtcG9wdXAnLCB0aGlzLl9tYXAuZ2V0Q29udGFpbmVyKCkpO1xuICAgICAgICAgICAgdGhpcy5fdGlwICAgICAgID0gRE9NLmNyZWF0ZSgnZGl2JywgJ21hcGJveGdsLXBvcHVwLXRpcCcsIHRoaXMuX2NvbnRhaW5lcik7XG4gICAgICAgICAgICB0aGlzLl9jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5fY29udGVudCk7XG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmNsYXNzTmFtZSkge1xuICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jbGFzc05hbWUuc3BsaXQoJyAnKS5mb3JFYWNoKG5hbWUgPT5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyLmNsYXNzTGlzdC5hZGQobmFtZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5tYXhXaWR0aCAmJiB0aGlzLl9jb250YWluZXIuc3R5bGUubWF4V2lkdGggIT09IHRoaXMub3B0aW9ucy5tYXhXaWR0aCkge1xuICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyLnN0eWxlLm1heFdpZHRoID0gdGhpcy5vcHRpb25zLm1heFdpZHRoO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX21hcC50cmFuc2Zvcm0ucmVuZGVyV29ybGRDb3BpZXMpIHtcbiAgICAgICAgICAgIHRoaXMuX2xuZ0xhdCA9IHNtYXJ0V3JhcCh0aGlzLl9sbmdMYXQsIHRoaXMuX3BvcywgdGhpcy5fbWFwLnRyYW5zZm9ybSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwb3MgPSB0aGlzLl9wb3MgPSB0aGlzLl9tYXAucHJvamVjdCh0aGlzLl9sbmdMYXQpO1xuXG4gICAgICAgIGxldCBhbmNob3I6ID9BbmNob3IgPSB0aGlzLm9wdGlvbnMuYW5jaG9yO1xuICAgICAgICBjb25zdCBvZmZzZXQgPSBub3JtYWxpemVPZmZzZXQodGhpcy5vcHRpb25zLm9mZnNldCk7XG5cbiAgICAgICAgaWYgKCFhbmNob3IpIHtcbiAgICAgICAgICAgIGNvbnN0IHdpZHRoID0gdGhpcy5fY29udGFpbmVyLm9mZnNldFdpZHRoO1xuICAgICAgICAgICAgY29uc3QgaGVpZ2h0ID0gdGhpcy5fY29udGFpbmVyLm9mZnNldEhlaWdodDtcbiAgICAgICAgICAgIGxldCBhbmNob3JDb21wb25lbnRzO1xuXG4gICAgICAgICAgICBpZiAocG9zLnkgKyBvZmZzZXQuYm90dG9tLnkgPCBoZWlnaHQpIHtcbiAgICAgICAgICAgICAgICBhbmNob3JDb21wb25lbnRzID0gWyd0b3AnXTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocG9zLnkgPiB0aGlzLl9tYXAudHJhbnNmb3JtLmhlaWdodCAtIGhlaWdodCkge1xuICAgICAgICAgICAgICAgIGFuY2hvckNvbXBvbmVudHMgPSBbJ2JvdHRvbSddO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBhbmNob3JDb21wb25lbnRzID0gW107XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChwb3MueCA8IHdpZHRoIC8gMikge1xuICAgICAgICAgICAgICAgIGFuY2hvckNvbXBvbmVudHMucHVzaCgnbGVmdCcpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwb3MueCA+IHRoaXMuX21hcC50cmFuc2Zvcm0ud2lkdGggLSB3aWR0aCAvIDIpIHtcbiAgICAgICAgICAgICAgICBhbmNob3JDb21wb25lbnRzLnB1c2goJ3JpZ2h0Jyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChhbmNob3JDb21wb25lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGFuY2hvciA9ICdib3R0b20nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBhbmNob3IgPSAoYW5jaG9yQ29tcG9uZW50cy5qb2luKCctJyk6IGFueSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBvZmZzZXRlZFBvcyA9IHBvcy5hZGQob2Zmc2V0W2FuY2hvcl0pLnJvdW5kKCk7XG5cbiAgICAgICAgRE9NLnNldFRyYW5zZm9ybSh0aGlzLl9jb250YWluZXIsIGAke2FuY2hvclRyYW5zbGF0ZVthbmNob3JdfSB0cmFuc2xhdGUoJHtvZmZzZXRlZFBvcy54fXB4LCR7b2Zmc2V0ZWRQb3MueX1weClgKTtcbiAgICAgICAgYXBwbHlBbmNob3JDbGFzcyh0aGlzLl9jb250YWluZXIsIGFuY2hvciwgJ3BvcHVwJyk7XG4gICAgfVxuXG4gICAgX29uQ2xpY2tDbG9zZSgpIHtcbiAgICAgICAgdGhpcy5yZW1vdmUoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZU9mZnNldChvZmZzZXQ6ID9PZmZzZXQpIHtcbiAgICBpZiAoIW9mZnNldCkge1xuICAgICAgICByZXR1cm4gbm9ybWFsaXplT2Zmc2V0KG5ldyBQb2ludCgwLCAwKSk7XG5cbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBvZmZzZXQgPT09ICdudW1iZXInKSB7XG4gICAgICAgIC8vIGlucHV0IHNwZWNpZmllcyBhIHJhZGl1cyBmcm9tIHdoaWNoIHRvIGNhbGN1bGF0ZSBvZmZzZXRzIGF0IGFsbCBwb3NpdGlvbnNcbiAgICAgICAgY29uc3QgY29ybmVyT2Zmc2V0ID0gTWF0aC5yb3VuZChNYXRoLnNxcnQoMC41ICogTWF0aC5wb3cob2Zmc2V0LCAyKSkpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgJ2NlbnRlcic6IG5ldyBQb2ludCgwLCAwKSxcbiAgICAgICAgICAgICd0b3AnOiBuZXcgUG9pbnQoMCwgb2Zmc2V0KSxcbiAgICAgICAgICAgICd0b3AtbGVmdCc6IG5ldyBQb2ludChjb3JuZXJPZmZzZXQsIGNvcm5lck9mZnNldCksXG4gICAgICAgICAgICAndG9wLXJpZ2h0JzogbmV3IFBvaW50KC1jb3JuZXJPZmZzZXQsIGNvcm5lck9mZnNldCksXG4gICAgICAgICAgICAnYm90dG9tJzogbmV3IFBvaW50KDAsIC1vZmZzZXQpLFxuICAgICAgICAgICAgJ2JvdHRvbS1sZWZ0JzogbmV3IFBvaW50KGNvcm5lck9mZnNldCwgLWNvcm5lck9mZnNldCksXG4gICAgICAgICAgICAnYm90dG9tLXJpZ2h0JzogbmV3IFBvaW50KC1jb3JuZXJPZmZzZXQsIC1jb3JuZXJPZmZzZXQpLFxuICAgICAgICAgICAgJ2xlZnQnOiBuZXcgUG9pbnQob2Zmc2V0LCAwKSxcbiAgICAgICAgICAgICdyaWdodCc6IG5ldyBQb2ludCgtb2Zmc2V0LCAwKVxuICAgICAgICB9O1xuXG4gICAgfSBlbHNlIGlmIChvZmZzZXQgaW5zdGFuY2VvZiBQb2ludCB8fCBBcnJheS5pc0FycmF5KG9mZnNldCkpIHtcbiAgICAgICAgLy8gaW5wdXQgc3BlY2lmaWVzIGEgc2luZ2xlIG9mZnNldCB0byBiZSBhcHBsaWVkIHRvIGFsbCBwb3NpdGlvbnNcbiAgICAgICAgY29uc3QgY29udmVydGVkT2Zmc2V0ID0gUG9pbnQuY29udmVydChvZmZzZXQpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgJ2NlbnRlcic6IGNvbnZlcnRlZE9mZnNldCxcbiAgICAgICAgICAgICd0b3AnOiBjb252ZXJ0ZWRPZmZzZXQsXG4gICAgICAgICAgICAndG9wLWxlZnQnOiBjb252ZXJ0ZWRPZmZzZXQsXG4gICAgICAgICAgICAndG9wLXJpZ2h0JzogY29udmVydGVkT2Zmc2V0LFxuICAgICAgICAgICAgJ2JvdHRvbSc6IGNvbnZlcnRlZE9mZnNldCxcbiAgICAgICAgICAgICdib3R0b20tbGVmdCc6IGNvbnZlcnRlZE9mZnNldCxcbiAgICAgICAgICAgICdib3R0b20tcmlnaHQnOiBjb252ZXJ0ZWRPZmZzZXQsXG4gICAgICAgICAgICAnbGVmdCc6IGNvbnZlcnRlZE9mZnNldCxcbiAgICAgICAgICAgICdyaWdodCc6IGNvbnZlcnRlZE9mZnNldFxuICAgICAgICB9O1xuXG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gaW5wdXQgc3BlY2lmaWVzIGFuIG9mZnNldCBwZXIgcG9zaXRpb25cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICdjZW50ZXInOiBQb2ludC5jb252ZXJ0KG9mZnNldFsnY2VudGVyJ10gfHwgWzAsIDBdKSxcbiAgICAgICAgICAgICd0b3AnOiBQb2ludC5jb252ZXJ0KG9mZnNldFsndG9wJ10gfHwgWzAsIDBdKSxcbiAgICAgICAgICAgICd0b3AtbGVmdCc6IFBvaW50LmNvbnZlcnQob2Zmc2V0Wyd0b3AtbGVmdCddIHx8IFswLCAwXSksXG4gICAgICAgICAgICAndG9wLXJpZ2h0JzogUG9pbnQuY29udmVydChvZmZzZXRbJ3RvcC1yaWdodCddIHx8IFswLCAwXSksXG4gICAgICAgICAgICAnYm90dG9tJzogUG9pbnQuY29udmVydChvZmZzZXRbJ2JvdHRvbSddIHx8IFswLCAwXSksXG4gICAgICAgICAgICAnYm90dG9tLWxlZnQnOiBQb2ludC5jb252ZXJ0KG9mZnNldFsnYm90dG9tLWxlZnQnXSB8fCBbMCwgMF0pLFxuICAgICAgICAgICAgJ2JvdHRvbS1yaWdodCc6IFBvaW50LmNvbnZlcnQob2Zmc2V0Wydib3R0b20tcmlnaHQnXSB8fCBbMCwgMF0pLFxuICAgICAgICAgICAgJ2xlZnQnOiBQb2ludC5jb252ZXJ0KG9mZnNldFsnbGVmdCddIHx8IFswLCAwXSksXG4gICAgICAgICAgICAncmlnaHQnOiBQb2ludC5jb252ZXJ0KG9mZnNldFsncmlnaHQnXSB8fCBbMCwgMF0pXG4gICAgICAgIH07XG4gICAgfVxufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHN1cHBvcnRlZCBmcm9tICdAbWFwYm94L21hcGJveC1nbC1zdXBwb3J0ZWQnO1xuXG5pbXBvcnQgeyB2ZXJzaW9uIH0gZnJvbSAnLi4vcGFja2FnZS5qc29uJztcbmltcG9ydCBNYXAgZnJvbSAnLi91aS9tYXAnO1xuaW1wb3J0IE5hdmlnYXRpb25Db250cm9sIGZyb20gJy4vdWkvY29udHJvbC9uYXZpZ2F0aW9uX2NvbnRyb2wnO1xuaW1wb3J0IEdlb2xvY2F0ZUNvbnRyb2wgZnJvbSAnLi91aS9jb250cm9sL2dlb2xvY2F0ZV9jb250cm9sJztcbmltcG9ydCBBdHRyaWJ1dGlvbkNvbnRyb2wgZnJvbSAnLi91aS9jb250cm9sL2F0dHJpYnV0aW9uX2NvbnRyb2wnO1xuaW1wb3J0IFNjYWxlQ29udHJvbCBmcm9tICcuL3VpL2NvbnRyb2wvc2NhbGVfY29udHJvbCc7XG5pbXBvcnQgRnVsbHNjcmVlbkNvbnRyb2wgZnJvbSAnLi91aS9jb250cm9sL2Z1bGxzY3JlZW5fY29udHJvbCc7XG5pbXBvcnQgUG9wdXAgZnJvbSAnLi91aS9wb3B1cCc7XG5pbXBvcnQgTWFya2VyIGZyb20gJy4vdWkvbWFya2VyJztcbmltcG9ydCBTdHlsZSBmcm9tICcuL3N0eWxlL3N0eWxlJztcbmltcG9ydCBMbmdMYXQgZnJvbSAnLi9nZW8vbG5nX2xhdCc7XG5pbXBvcnQgTG5nTGF0Qm91bmRzIGZyb20gJy4vZ2VvL2xuZ19sYXRfYm91bmRzJztcbmltcG9ydCBQb2ludCBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcbmltcG9ydCBNZXJjYXRvckNvb3JkaW5hdGUgZnJvbSAnLi9nZW8vbWVyY2F0b3JfY29vcmRpbmF0ZSc7XG5pbXBvcnQge0V2ZW50ZWR9IGZyb20gJy4vdXRpbC9ldmVudGVkJztcbmltcG9ydCBjb25maWcgZnJvbSAnLi91dGlsL2NvbmZpZyc7XG5pbXBvcnQge3NldFJUTFRleHRQbHVnaW59IGZyb20gJy4vc291cmNlL3J0bF90ZXh0X3BsdWdpbic7XG5pbXBvcnQgV29ya2VyUG9vbCBmcm9tICcuL3V0aWwvd29ya2VyX3Bvb2wnO1xuXG5jb25zdCBleHBvcnRlZCA9IHtcbiAgICB2ZXJzaW9uLFxuICAgIHN1cHBvcnRlZCxcbiAgICBzZXRSVExUZXh0UGx1Z2luLFxuICAgIE1hcCxcbiAgICBOYXZpZ2F0aW9uQ29udHJvbCxcbiAgICBHZW9sb2NhdGVDb250cm9sLFxuICAgIEF0dHJpYnV0aW9uQ29udHJvbCxcbiAgICBTY2FsZUNvbnRyb2wsXG4gICAgRnVsbHNjcmVlbkNvbnRyb2wsXG4gICAgUG9wdXAsXG4gICAgTWFya2VyLFxuICAgIFN0eWxlLFxuICAgIExuZ0xhdCxcbiAgICBMbmdMYXRCb3VuZHMsXG4gICAgUG9pbnQsXG4gICAgTWVyY2F0b3JDb29yZGluYXRlLFxuICAgIEV2ZW50ZWQsXG4gICAgY29uZmlnLFxuXG4gICAgLyoqXG4gICAgICogR2V0cyBhbmQgc2V0cyB0aGUgbWFwJ3MgW2FjY2VzcyB0b2tlbl0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9oZWxwL2RlZmluZS1hY2Nlc3MtdG9rZW4vKS5cbiAgICAgKlxuICAgICAqIEB2YXIge3N0cmluZ30gYWNjZXNzVG9rZW5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIG1hcGJveGdsLmFjY2Vzc1Rva2VuID0gbXlBY2Nlc3NUb2tlbjtcbiAgICAgKiBAc2VlIFtEaXNwbGF5IGEgbWFwXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlcy8pXG4gICAgICovXG4gICAgZ2V0IGFjY2Vzc1Rva2VuKCk6ID9zdHJpbmcge1xuICAgICAgICByZXR1cm4gY29uZmlnLkFDQ0VTU19UT0tFTjtcbiAgICB9LFxuXG4gICAgc2V0IGFjY2Vzc1Rva2VuKHRva2VuOiBzdHJpbmcpIHtcbiAgICAgICAgY29uZmlnLkFDQ0VTU19UT0tFTiA9IHRva2VuO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGFuZCBzZXRzIHRoZSBtYXAncyBkZWZhdWx0IEFQSSBVUkwgZm9yIHJlcXVlc3RpbmcgdGlsZXMsIHN0eWxlcywgc3ByaXRlcywgYW5kIGdseXBoc1xuICAgICAqXG4gICAgICogQHZhciB7c3RyaW5nfSBiYXNlQXBpVXJsXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBtYXBib3hnbC5iYXNlQXBpVXJsID0gJ2h0dHBzOi8vYXBpLm1hcGJveC5jb20nO1xuICAgICAqL1xuICAgIGdldCBiYXNlQXBpVXJsKCk6ID9zdHJpbmcge1xuICAgICAgICByZXR1cm4gY29uZmlnLkFQSV9VUkw7XG4gICAgfSxcblxuICAgIHNldCBiYXNlQXBpVXJsKHVybDogc3RyaW5nKSB7XG4gICAgICAgIGNvbmZpZy5BUElfVVJMID0gdXJsO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGFuZCBzZXRzIHRoZSBudW1iZXIgb2Ygd2ViIHdvcmtlcnMgaW5zdGFudGlhdGVkIG9uIGEgcGFnZSB3aXRoIEdMIEpTIG1hcHMuXG4gICAgICogQnkgZGVmYXVsdCwgaXQgaXMgc2V0IHRvIGhhbGYgdGhlIG51bWJlciBvZiBDUFUgY29yZXMgKGNhcHBlZCBhdCA2KS5cbiAgICAgKiBNYWtlIHN1cmUgdG8gc2V0IHRoaXMgcHJvcGVydHkgYmVmb3JlIGNyZWF0aW5nIGFueSBtYXAgaW5zdGFuY2VzIGZvciBpdCB0byBoYXZlIGVmZmVjdC5cbiAgICAgKlxuICAgICAqIEB2YXIge3N0cmluZ30gd29ya2VyQ291bnRcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIG1hcGJveGdsLndvcmtlckNvdW50ID0gMjtcbiAgICAgKi9cbiAgICBnZXQgd29ya2VyQ291bnQoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIFdvcmtlclBvb2wud29ya2VyQ291bnQ7XG4gICAgfSxcblxuICAgIHNldCB3b3JrZXJDb3VudChjb3VudDogbnVtYmVyKSB7XG4gICAgICAgIFdvcmtlclBvb2wud29ya2VyQ291bnQgPSBjb3VudDtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR2V0cyBhbmQgc2V0cyB0aGUgbWF4aW11bSBudW1iZXIgb2YgaW1hZ2VzIChyYXN0ZXIgdGlsZXMsIHNwcml0ZXMsIGljb25zKSB0byBsb2FkIGluIHBhcmFsbGVsLFxuICAgICAqIHdoaWNoIGFmZmVjdHMgcGVyZm9ybWFuY2UgaW4gcmFzdGVyLWhlYXZ5IG1hcHMuIDE2IGJ5IGRlZmF1bHQuXG4gICAgICpcbiAgICAgKiBAdmFyIHtzdHJpbmd9IG1heFBhcmFsbGVsSW1hZ2VSZXF1ZXN0c1xuICAgICAqIEBleGFtcGxlXG4gICAgICogbWFwYm94Z2wubWF4UGFyYWxsZWxJbWFnZVJlcXVlc3RzID0gMTA7XG4gICAgICovXG4gICAgZ2V0IG1heFBhcmFsbGVsSW1hZ2VSZXF1ZXN0cygpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gY29uZmlnLk1BWF9QQVJBTExFTF9JTUFHRV9SRVFVRVNUUztcbiAgICB9LFxuXG4gICAgc2V0IG1heFBhcmFsbGVsSW1hZ2VSZXF1ZXN0cyhudW1SZXF1ZXN0czogbnVtYmVyKSB7XG4gICAgICAgIGNvbmZpZy5NQVhfUEFSQUxMRUxfSU1BR0VfUkVRVUVTVFMgPSBudW1SZXF1ZXN0cztcbiAgICB9LFxuXG4gICAgd29ya2VyVXJsOiAnJ1xufTtcblxuLyoqXG4gKiBUaGUgdmVyc2lvbiBvZiBNYXBib3ggR0wgSlMgaW4gdXNlIGFzIHNwZWNpZmllZCBpbiBgcGFja2FnZS5qc29uYCxcbiAqIGBDSEFOR0VMT0cubWRgLCBhbmQgdGhlIEdpdEh1YiByZWxlYXNlLlxuICpcbiAqIEB2YXIge3N0cmluZ30gdmVyc2lvblxuICovXG5cbi8qKlxuICogVGVzdCB3aGV0aGVyIHRoZSBicm93c2VyIFtzdXBwb3J0cyBNYXBib3ggR0wgSlNdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vaGVscC9tYXBib3gtYnJvd3Nlci1zdXBwb3J0LyNtYXBib3gtZ2wtanMpLlxuICpcbiAqIEBmdW5jdGlvbiBzdXBwb3J0ZWRcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdD1mYWxzZV0gSWYgYHRydWVgLFxuICogICB0aGUgZnVuY3Rpb24gd2lsbCByZXR1cm4gYGZhbHNlYCBpZiB0aGUgcGVyZm9ybWFuY2Ugb2YgTWFwYm94IEdMIEpTIHdvdWxkXG4gKiAgIGJlIGRyYW1hdGljYWxseSB3b3JzZSB0aGFuIGV4cGVjdGVkIChlLmcuIGEgc29mdHdhcmUgV2ViR0wgcmVuZGVyZXIgd291bGQgYmUgdXNlZCkuXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICogQGV4YW1wbGVcbiAqIG1hcGJveGdsLnN1cHBvcnRlZCgpIC8vID0gdHJ1ZVxuICogQHNlZSBbQ2hlY2sgZm9yIGJyb3dzZXIgc3VwcG9ydF0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9jaGVjay1mb3Itc3VwcG9ydC8pXG4gKi9cblxuLyoqXG4gKiBTZXRzIHRoZSBtYXAncyBbUlRMIHRleHQgcGx1Z2luXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9wbHVnaW5zLyNtYXBib3gtZ2wtcnRsLXRleHQpLlxuICogTmVjZXNzYXJ5IGZvciBzdXBwb3J0aW5nIGxhbmd1YWdlcyBsaWtlIEFyYWJpYyBhbmQgSGVicmV3IHRoYXQgYXJlIHdyaXR0ZW4gcmlnaHQtdG8tbGVmdC5cbiAqXG4gKiBAZnVuY3Rpb24gc2V0UlRMVGV4dFBsdWdpblxuICogQHBhcmFtIHtzdHJpbmd9IHBsdWdpblVSTCBVUkwgcG9pbnRpbmcgdG8gdGhlIE1hcGJveCBSVEwgdGV4dCBwbHVnaW4gc291cmNlLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGVkIHdpdGggYW4gZXJyb3IgYXJndW1lbnQgaWYgdGhlcmUgaXMgYW4gZXJyb3IuXG4gKiBAZXhhbXBsZVxuICogbWFwYm94Z2wuc2V0UlRMVGV4dFBsdWdpbignaHR0cHM6Ly9hcGkubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvcGx1Z2lucy9tYXBib3gtZ2wtcnRsLXRleHQvdjAuMi4wL21hcGJveC1nbC1ydGwtdGV4dC5qcycpO1xuICogQHNlZSBbQWRkIHN1cHBvcnQgZm9yIHJpZ2h0LXRvLWxlZnQgc2NyaXB0c10oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9tYXBib3gtZ2wtcnRsLXRleHQvKVxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGV4cG9ydGVkO1xuXG4vLyBjYW5hcnkgYXNzZXJ0OiB1c2VkIHRvIGNvbmZpcm0gdGhhdCBhc3NlcnRzIGhhdmUgYmVlbiByZW1vdmVkIGZyb20gcHJvZHVjdGlvbiBidWlsZFxuYXNzZXJ0KHRydWUsICdjYW5hcnkgYXNzZXJ0Jyk7XG4iLCIvL1xuLy8gT3VyIGN1c3RvbSBpbnRybyBwcm92aWRlcyBhIHNwZWNpYWxpemVkIFwiZGVmaW5lKClcIiBmdW5jdGlvbiwgY2FsbGVkIGJ5IHRoZVxuLy8gQU1EIG1vZHVsZXMgYmVsb3csIHRoYXQgc2V0cyB1cCB0aGUgd29ya2VyIGJsb2IgVVJMIGFuZCB0aGVuIGV4ZWN1dGVzIHRoZVxuLy8gbWFpbiBtb2R1bGUsIHN0b3JpbmcgaXRzIGV4cG9ydGVkIHZhbHVlIGFzICdtYXBib3hnbCdcblxuLy8gVGhlIHRocmVlIFwiY2h1bmtzXCIgaW1wb3J0ZWQgaGVyZSBhcmUgcHJvZHVjZWQgYnkgYSBmaXJzdCBSb2xsdXAgcGFzcyxcbi8vIHdoaWNoIG91dHB1dHMgdGhlbSBhcyBBTUQgbW9kdWxlcy5cblxuLy8gU2hhcmVkIGRlcGVuZGVuY2llcywgaS5lLjpcbi8qXG5kZWZpbmUoWydleHBvcnRzJ10sIGZ1bmN0aW9uIChleHBvcnRzKSB7XG4gICAgLy8gQ29kZSBmb3IgYWxsIGNvbW1vbiBkZXBlbmRlbmNpZXNcbiAgICAvLyBFYWNoIG1vZHVsZSdzIGV4cG9ydHMgYXJlIGF0dGFjaGVkIGF0dGFjaGVkIHRvICdleHBvcnRzJyAod2l0aFxuICAgIC8vIG5hbWVzIHJld3JpdHRlbiB0byBhdm9pZCBjb2xsaXNpb25zLCBldGMuKVxufSlcbiovXG5pbXBvcnQgJy4vYnVpbGQvbWFwYm94Z2wvc2hhcmVkJztcblxuLy8gV29ya2VyIGFuZCBpdHMgdW5pcXVlIGRlcGVuZGVuY2llcywgaS5lLjpcbi8qXG5kZWZpbmUoWycuL3NoYXJlZC5qcyddLCBmdW5jdGlvbiAoX19zaGFyZWRfX2pzKSB7XG4gICAgLy8gIENvZGUgZm9yIHdvcmtlciBzY3JpcHQgYW5kIGl0cyB1bmlxdWUgZGVwZW5kZW5jaWVzLlxuICAgIC8vICBFeHBlY3RzIHRoZSBvdXRwdXQgb2YgJ3NoYXJlZCcgbW9kdWxlIHRvIGJlIHBhc3NlZCBpbiBhcyBhbiBhcmd1bWVudCxcbiAgICAvLyAgc2luY2UgYWxsIHJlZmVyZW5jZXMgdG8gY29tbW9uIGRlcHMgbG9vayBsaWtlLCBlLmcuLFxuICAgIC8vICBfX3NoYXJlZF9fanMuc2hhcGVUZXh0KCkuXG59KTtcbiovXG4vLyBXaGVuIHRoaXMgd3JhcHBlciBmdW5jdGlvbiBpcyBwYXNzZWQgdG8gb3VyIGN1c3RvbSBkZWZpbmUoKSBhYm92ZSxcbi8vIGl0IGdldHMgc3RyaW5naWZpZWQsIHRvZ2V0aGVyIHdpdGggdGhlIHNoYXJlZCB3cmFwcGVyICh1c2luZ1xuLy8gRnVuY3Rpb24udG9TdHJpbmcoKSksIGFuZCB0aGUgcmVzdWx0aW5nIHN0cmluZyBvZiBjb2RlIGlzIG1hZGUgaW50byBhXG4vLyBCbG9iIFVSTCB0aGF0IGdldHMgdXNlZCBieSB0aGUgbWFpbiBtb2R1bGUgdG8gY3JlYXRlIHRoZSB3ZWIgd29ya2Vycy5cbmltcG9ydCAnLi9idWlsZC9tYXBib3hnbC93b3JrZXInO1xuXG4vLyBNYWluIG1vZHVsZSBhbmQgaXRzIHVuaXF1ZSBkZXBlbmRlbmNpZXNcbi8qXG5kZWZpbmUoWycuL3NoYXJlZC5qcyddLCBmdW5jdGlvbiAoX19zaGFyZWRfX2pzKSB7XG4gICAgLy8gIENvZGUgZm9yIG1haW4gR0wgSlMgbW9kdWxlIGFuZCBpdHMgdW5pcXVlIGRlcGVuZGVuY2llcy5cbiAgICAvLyAgRXhwZWN0cyB0aGUgb3V0cHV0IG9mICdzaGFyZWQnIG1vZHVsZSB0byBiZSBwYXNzZWQgaW4gYXMgYW4gYXJndW1lbnQsXG4gICAgLy8gIHNpbmNlIGFsbCByZWZlcmVuY2VzIHRvIGNvbW1vbiBkZXBzIGxvb2sgbGlrZSwgZS5nLixcbiAgICAvLyAgX19zaGFyZWRfX2pzLnNoYXBlVGV4dCgpLlxuICAgIC8vXG4gICAgLy8gIFJldHVybnMgdGhlIGFjdHVhbCBtYXBib3hnbCAoaS5lLiBzcmMvaW5kZXguanMpXG59KTtcbiovXG5pbXBvcnQgJy4vYnVpbGQvbWFwYm94Z2wvaW5kZXgnO1xuXG5leHBvcnQgZGVmYXVsdCBtYXBib3hnbDtcbiJdLCJuYW1lcyI6WyJhcmd1bWVudHMiLCJyZXF1aXJlJCQwIiwicmVxdWlyZSQkMSIsImxldCIsImNvbnN0IiwiVW5pdEJlemllciIsIndpbmRvdyIsImV4cG9ydGVkIiwiYnJvd3NlciIsIndlYnBTdXBwb3J0ZWQiLCJzZGtWZXJzaW9uIiwidGhpcyIsInN1cGVyIiwiYXNzZXJ0IiwibGlzdGVuZXIiLCJwYXJzZUNTU0NvbG9yIiwidG9TdHJpbmciLCJ0eXBlIiwidHlwZXMiLCJhcmciLCJ2YWx1ZVRvU3RyaW5nIiwiaSIsImV4cGVjdGVkIiwicGFyc2VkIiwiZXJyb3IiLCJhcnJheSIsImludGVycG9sYXRlTnVtYmVyIiwib3V0cHV0SW5kZXgiLCJsdCIsInJ0IiwidHlwZVRvU3RyaW5nIiwiZXh0ZW5kIiwic3RvcCIsImZpbmRTdG9wTGVzc1RoYW5PckVxdWFsVG8iLCJkZWZpbml0aW9ucyIsImlzQ29uc3RhbnQuaXNTdGF0ZUNvbnN0YW50IiwiaXNGZWF0dXJlQ29uc3RhbnQiLCJpc0NvbnN0YW50LmlzRmVhdHVyZUNvbnN0YW50IiwiaXNDb25zdGFudC5pc0dsb2JhbFByb3BlcnR5Q29uc3RhbnQiLCJ2YWxpZGF0ZVNwZWMiLCJlbGVtZW50U3BlY0tleSIsInByb3AiLCJsYXRlc3RTdHlsZVNwZWMiLCJ2YWxpZGF0ZVNvdXJjZSIsInZhbGlkYXRlTGlnaHQiLCJ2YWxpZGF0ZUZpbHRlciIsInZhbGlkYXRlUGFpbnRQcm9wZXJ0eSIsInZhbGlkYXRlTGF5b3V0UHJvcGVydHkiLCJHcmlkIiwibmFtZSIsImlzQ2hhciIsInJ0bFRleHRQbHVnaW4iLCJwcm9wZXJ0eSIsInN0eWxlU3BlYyIsIlBvaW50IiwibGF5b3V0IiwiU3RydWN0QXJyYXlMYXlvdXQiLCJQYXR0ZXJuTGF5b3V0QXJyYXkiLCJDaXJjbGVMYXlvdXRBcnJheSIsIlRyaWFuZ2xlSW5kZXhBcnJheSIsImxheW91dEF0dHJpYnV0ZXMiLCJpbmRleCIsInBhaW50IiwiZ2xNYXRyaXguQVJSQVlfVFlQRSIsImNsb25lIiwiZXF1YWxzIiwiZ2xNYXRyaXguRVBTSUxPTiIsImNyZWF0ZSIsImNvcHkiLCJpZGVudGl0eSIsImZyb21WYWx1ZXMiLCJzZXQiLCJpbnZlcnQiLCJkZXRlcm1pbmFudCIsIm11bHRpcGx5Iiwicm90YXRlIiwic2NhbGUiLCJ0cmFuc2xhdGUiLCJmcm9tUm90YXRpb24iLCJmcm9tU2NhbGluZyIsInN0ciIsImZyb2IiLCJhZGQiLCJzdWJ0cmFjdCIsIm11bHRpcGx5U2NhbGFyIiwibXVsdGlwbHlTY2FsYXJBbmRBZGQiLCJleGFjdEVxdWFscyIsIm11bCIsInN1YiIsInRyYW5zcG9zZSIsImFkam9pbnQiLCJmcm9tVHJhbnNsYXRpb24iLCJmcm9tUXVhdCIsImJlemllciIsImdsTWF0cml4LlJBTkRPTSIsInJvdGF0ZVgiLCJyb3RhdGVZIiwicm90YXRlWiIsImRpdmlkZSIsImNlaWwiLCJmbG9vciIsIm1pbiIsIm1heCIsInJvdW5kIiwic2NhbGVBbmRBZGQiLCJkaXN0YW5jZSIsInNxdWFyZWREaXN0YW5jZSIsImxlbmd0aCIsInNxdWFyZWRMZW5ndGgiLCJuZWdhdGUiLCJpbnZlcnNlIiwibm9ybWFsaXplIiwiZG90IiwiY3Jvc3MiLCJsZXJwIiwicmFuZG9tIiwidHJhbnNmb3JtTWF0NCIsInRyYW5zZm9ybVF1YXQiLCJ6ZXJvIiwiZGl2IiwiZGlzdCIsInNxckRpc3QiLCJsZW4iLCJzcXJMZW4iLCJmb3JFYWNoIiwidmVjNC5jbG9uZSIsInZlYzQuZnJvbVZhbHVlcyIsInZlYzQuY29weSIsInZlYzQuc2V0IiwidmVjNC5hZGQiLCJ2ZWM0LnNjYWxlIiwidmVjNC5kb3QiLCJ2ZWM0LmxlcnAiLCJ2ZWM0Lmxlbmd0aCIsInZlYzQuc3F1YXJlZExlbmd0aCIsInZlYzQubm9ybWFsaXplIiwidmVjNC5leGFjdEVxdWFscyIsInZlYzQuZXF1YWxzIiwidmVjMy5jcmVhdGUiLCJ2ZWMzLmZyb21WYWx1ZXMiLCJ2ZWMzLmRvdCIsInZlYzMuY3Jvc3MiLCJ2ZWMzLmxlbiIsInZlYzMubm9ybWFsaXplIiwibWF0My5jcmVhdGUiLCJmcm9tUm90YXRpb25UcmFuc2xhdGlvbiIsImZyb21NYXQ0IiwicXVhdC5jcmVhdGUiLCJtYXQ0LmdldFJvdGF0aW9uIiwibWF0NC5nZXRUcmFuc2xhdGlvbiIsInF1YXQuY29weSIsImdldFRyYW5zbGF0aW9uIiwicXVhdC5yb3RhdGVYIiwicXVhdC5yb3RhdGVZIiwicXVhdC5yb3RhdGVaIiwicXVhdC5kb3QiLCJjb25qdWdhdGUiLCJxdWF0Lmxlbmd0aCIsInF1YXQuc3F1YXJlZExlbmd0aCIsInRyYW5zZm9ybU1hdDMiLCJhbmdsZSIsInZlYzQudHJhbnNmb3JtTWF0NCIsInByb3BlcnRpZXMiLCJzd2FwIiwiRmlsbExheW91dEFycmF5IiwiTGluZUluZGV4QXJyYXkiLCJyaW5nIiwiZWFyY3V0IiwiY2xhc3NpZnlSaW5ncyIsInNpZ25lZEFyZWEiLCJWZWN0b3JUaWxlRmVhdHVyZSIsIlZlY3RvclRpbGVMYXllciIsInJlcXVpcmUkJDIiLCJtdnQiLCJFQVJDVVRfTUFYX1JJTkdTIiwiRmlsbEV4dHJ1c2lvbkxheW91dEFycmF5IiwicCIsInByb2plY3RRdWVyeUdlb21ldHJ5IiwidmVjdG9yVGlsZUZlYXR1cmVUeXBlcyIsIkxpbmVMYXlvdXRBcnJheSIsImludGVycG9sYXRlIiwiZXhwcmVzc2lvbiIsInByb3BlcnR5VmFsdWUiLCJ6b29tUmFuZ2UiLCJhZGRWZXJ0ZXgiLCJTeW1ib2xMYXlvdXRBcnJheSIsIlN5bWJvbER5bmFtaWNMYXlvdXRBcnJheSIsIlN5bWJvbE9wYWNpdHlBcnJheSIsInVwbG9hZCIsIkNvbGxpc2lvblZlcnRleEFycmF5IiwiQ29sbGlzaW9uQm94TGF5b3V0QXJyYXkiLCJDb2xsaXNpb25DaXJjbGVMYXlvdXRBcnJheSIsInRyYW5zZm9ybVRleHQiLCJpbmRleEFycmF5IiwiayIsImJveCIsInN5bWJvbEluc3RhbmNlIiwiY2lyY2xlIiwiaGVhdG1hcCIsImhpbGxzaGFkZSIsImZpbGwiLCJmaWxsRXh0cnVzaW9uIiwibGluZSIsInN5bWJvbCIsImJhY2tncm91bmQiLCJyYXN0ZXIiLCJpZCIsInNyYyIsImJpbiIsInciLCJoIiwiSW1hZ2VEYXRhIiwiUHJvdG9idWYiLCJ4IiwiZGVzZXJpYWxpemUiLCJwcm90b3R5cGVBY2Nlc3NvcnMiLCJzb3VyY2VMYXllciIsImxheWVyU3RhdGVzIiwiZmVhdHVyZSIsInZ0IiwiZmVhdHVyZUZpbHRlciIsIkdlb0pTT05GZWF0dXJlIiwiZGVzZXJpYWxpemVCdWNrZXQiLCJidWNrZXQiLCJSYXN0ZXJCb3VuZHNBcnJheSIsInRhZ2dlZExpbmUiLCJhbGlnbiIsImRlZmF1bHRDb21wYXJlIiwiUXVldWUiLCJtdXJtdXIzIiwibXVybXVyMiIsInNoYXBpbmciLCJhbmNob3IiLCJyZWZQcm9wZXJ0aWVzIiwiY3JlYXRlU3R5bGVMYXllciIsInZhbHVlcyIsImxheWVyQ29uZmlncyIsImxheWVyIiwicG90cGFjayIsIkFscGhhSW1hZ2UiLCJzdGFjayIsImdseXBocyIsInJlZ2lzdGVyIiwiT3ZlcnNjYWxlZFRpbGVJRCIsIkNvbGxpc2lvbkJveEFycmF5IiwiRGljdGlvbmFyeUNvZGVyIiwiRmVhdHVyZUluZGV4Iiwid2Fybk9uY2UiLCJtYXBPYmplY3QiLCJJbWFnZUF0bGFzIiwiU3ltYm9sQnVja2V0IiwicGVyZm9ybVN5bWJvbExheW91dCIsIkxpbmVCdWNrZXQiLCJGaWxsQnVja2V0IiwiRmlsbEV4dHJ1c2lvbkJ1Y2tldCIsIkV2YWx1YXRpb25QYXJhbWV0ZXJzIiwiZ2V0QXJyYXlCdWZmZXIiLCJwZXJmb3JtYW5jZSIsIkRFTURhdGEiLCJFWFRFTlQiLCJnZW9tZXRyeSIsInBvaW50IiwiR2VvSlNPTldyYXBwZXIiLCJGZWF0dXJlV3JhcHBlciIsIlBiZiIsInNvcnQiLCJyZXdpbmQiLCJ0cmFuc2Zvcm0iLCJ2dHBiZiIsImdldEpTT04iLCJjcmVhdGVFeHByZXNzaW9uIiwiQWN0b3IiLCJnbG9iYWxSVExUZXh0UGx1Z2luIiwic2VsZiIsIm9wdGlvbnMiLCJSZXNvdXJjZVR5cGUiLCJnZXRJbWFnZSIsIlJHQkFJbWFnZSIsIkV2ZW50IiwiSW1hZ2VQb3NpdGlvbiIsIlRleHR1cmUiLCJFdmVudGVkIiwicGFyc2VHbHlwaFBCRiIsImFzeW5jQWxsIiwiVGlueVNERiIsInNwaGVyaWNhbFRvQ2FydGVzaWFuIiwiUHJvcGVydGllcyIsIkRhdGFDb25zdGFudFByb3BlcnR5IiwiVHJhbnNpdGlvbmFibGUiLCJlbmRzV2l0aCIsImVtaXRWYWxpZGF0aW9uRXJyb3JzIiwidmFsaWRhdGVTdHlsZSIsInVuaXF1ZUlkIiwicGljayIsIkxuZ0xhdEJvdW5kcyIsIm1lcmNhdG9yWGZyb21MbmciLCJtZXJjYXRvcllmcm9tTGF0IiwiRXJyb3JFdmVudCIsInBvc3RUdXJuc3RpbGVFdmVudCIsInBvc3RNYXBMb2FkRXZlbnQiLCJNZXJjYXRvckNvb3JkaW5hdGUiLCJyYXN0ZXJCb3VuZHNBdHRyaWJ1dGVzIiwiU2VnbWVudFZlY3RvciIsIkNhbm9uaWNhbFRpbGVJRCIsImdldFZpZGVvIiwiVmFsaWRhdGlvbkVycm9yIiwidmVjdG9yIiwicmFzdGVyRGVtIiwiZ2VvanNvbiIsInZpZGVvIiwiaW1hZ2UiLCJjYW52YXMiLCJiaW5kQWxsIiwibWF0NC5pZGVudGl0eSIsIm1hdDQudHJhbnNsYXRlIiwibWF0NC5zY2FsZSIsIm1hdDQubXVsdGlwbHkiLCJDb2xvciIsIkFMV0FZUyIsImRlZXBFcXVhbCIsImNyZWF0ZVNvdXJjZSIsIlNvdXJjZUZlYXR1cmVTdGF0ZSIsInRpbGUiLCJrZXlzRGlmZmVyZW5jZSIsInRpbGVJRCIsIlRpbGUiLCJtYXBib3hnbCIsImlzRXF1YWwiLCJvZmZzZXQiLCJtYXQ0LmNyZWF0ZSIsIm1hdDQucm90YXRlWiIsIm1hdDQuY2xvbmUiLCJzeW1ib2xTaXplLmV2YWx1YXRlU2l6ZUZvclpvb20iLCJXcml0aW5nTW9kZSIsInN5bWJvbFNpemUuZXZhbHVhdGVTaXplRm9yRmVhdHVyZSIsIm9yaWVudGF0aW9uQ2hhbmdlIiwiYWRkRHluYW1pY0F0dHJpYnV0ZXMiLCJwcm9qZWN0aW9uLnByb2plY3QiLCJwcm9qZWN0aW9uLnBsYWNlRmlyc3RBbmRMYXN0R2x5cGgiLCJpbnRlcnNlY3Rpb25UZXN0cy5wb2x5Z29uSW50ZXJzZWN0c1BvbHlnb24iLCJwcm9qZWN0aW9uLnh5VHJhbnNmb3JtTWF0NCIsImdldEFuY2hvckFsaWdubWVudCIsImV2YWx1YXRlUmFkaWFsT2Zmc2V0IiwicHJvamVjdGlvbi5nZXRMYWJlbFBsYW5lTWF0cml4Iiwic3ltYm9sTGF5ZXJQcm9wZXJ0aWVzIiwiZ2V0QW5jaG9ySnVzdGlmaWNhdGlvbiIsImNyb3NzVGlsZUlEIiwicHJldk9wYWNpdHkiLCJwYWNrZWRPcGFjaXR5IiwiX2VtaXRWYWxpZGF0aW9uRXJyb3JzIiwiZGlmZk9wZXJhdGlvbnMiLCJnZXRXb3JrZXJQb29sIiwiWm9vbUhpc3RvcnkiLCJnZXRSZWZlcnJlciIsImlzTWFwYm94VVJMIiwiZGVyZWYiLCJ2YWxpZGF0ZUN1c3RvbVN0eWxlTGF5ZXIiLCJmaWx0ZXJPYmplY3QiLCJsIiwibGF5ZXJJZCIsInNvdXJjZVJlc3VsdCIsImxheWVyRmVhdHVyZXMiLCJmZWF0dXJlV3JhcHBlciIsInJ0bFRleHRQbHVnaW5FdmVudGVkIiwibGF5ZXJJRCIsInN0eWxlTGF5ZXIiLCJtYWtlUmVxdWVzdCIsImdldFNvdXJjZVR5cGUiLCJzZXRTb3VyY2VUeXBlIiwicmVnaXN0ZXJGb3JQbHVnaW5BdmFpbGFiaWxpdHkiLCJjcmVhdGVMYXlvdXQiLCJ2ZXJ0ZXhCdWZmZXIiLCJQcm9ncmFtIiwiVW5pZm9ybU1hdHJpeDRmIiwiVW5pZm9ybTNmIiwiVW5pZm9ybTFmIiwiVW5pZm9ybTFpIiwiVW5pZm9ybTJmIiwiVW5pZm9ybTRmIiwibWF0My5mcm9tUm90YXRpb24iLCJ2ZWMzLnRyYW5zZm9ybU1hdDMiLCJVbmlmb3JtQ29sb3IiLCJtYXQ0Lm9ydGhvIiwic3ltYm9sTGF5b3V0UHJvcGVydGllcyIsInN5bWJvbFByb2plY3Rpb24uaGlkZUdseXBocyIsInN5bWJvbFByb2plY3Rpb24ucHJvamVjdCIsIk9ORV9FTSIsInN5bWJvbFByb2plY3Rpb24uZ2V0TGFiZWxQbGFuZU1hdHJpeCIsInN5bWJvbFByb2plY3Rpb24uZ2V0R2xDb29yZE1hdHJpeCIsInN5bWJvbFByb2plY3Rpb24udXBkYXRlTGluZUxhYmVscyIsInN5bWJvbFNpemUiLCJzdGF0ZSIsInVuaWZvcm1WYWx1ZXMiLCJkZXB0aE1vZGUiLCJjbGFtcCIsIlBvc0FycmF5IiwiZHJhdyIsImRlYnVnIiwiY3VzdG9tIiwiUHJvZ3JhbUNvbmZpZ3VyYXRpb24iLCJMaW5lU3RyaXBJbmRleEFycmF5Iiwic291cmNlQ2FjaGUiLCJjb29yZHMiLCJMbmdMYXQiLCJ3cmFwIiwibWF0Mi5jcmVhdGUiLCJtYXQyLnJvdGF0ZSIsIlVud3JhcHBlZFRpbGVJRCIsIm1hdDQucGVyc3BlY3RpdmUiLCJtYXQ0LnJvdGF0ZVgiLCJtZXJjYXRvclpmcm9tQWx0aXR1ZGUiLCJtYXQ0LmludmVydCIsIl9lYXNlIiwiaW5lcnRpYUxpbmVhcml0eSIsImluZXJ0aWFFYXNpbmciLCJpbmVydGlhTWF4U3BlZWQiLCJpbmVydGlhRGVjZWxlcmF0aW9uIiwic2Nyb2xsWm9vbSIsImJveFpvb20iLCJkcmFnUm90YXRlIiwiZHJhZ1BhbiIsImtleWJvYXJkIiwiZG91YmxlQ2xpY2tab29tIiwidG91Y2hab29tUm90YXRlIiwiZGVmYXVsdEVhc2luZyIsImNvbmZpZyIsIlJlcXVlc3RNYW5hZ2VyIiwibW91c2VpbiIsIm1vdXNlbW92ZSIsIm1vdXNlb3V0Iiwid2lkdGgiLCJoZWlnaHQiLCJkYXRhIiwiaXNTdXBwb3J0ZWQiLCJkZWZhdWx0T3B0aW9u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R0FBQyxFQUFFLENBQUM7O0FBRXZELElBQUksVUFBVSxHQUFHLE1BQU0sQ0FBQyxJQUFJLElBQUksVUFBVSxHQUFHLEVBQUU7RUFDN0MsSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDO0VBQ2QsS0FBSyxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQUU7SUFDbkIsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsSUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFDO0dBQzNDO0VBQ0QsT0FBTyxJQUFJLENBQUM7Q0FDYixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUM3Y0YsY0FBYyxHQUFHLFVBQVUsQ0FBQzs7QUFFNUIsU0FBUyxVQUFVLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFOztJQUVwQyxJQUFJLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7SUFDcEIsSUFBSSxDQUFDLEVBQUUsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUM7SUFDdEMsSUFBSSxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDOztJQUVsQyxJQUFJLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7SUFDcEIsSUFBSSxDQUFDLEVBQUUsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUM7SUFDdEMsSUFB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Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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QUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7RUFDcEQsZ0JBQWdCLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7RUFDOUQsU0FBUyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0VBQy9DLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztFQUNsRCxlQUFlLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7RUFDNUQsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0VBQ3JELFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLGFBQWEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztFQUMxRCxnQkFBZ0IsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUM1RCxZQUFZLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDcEQsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsY0FBYyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0VBQzlELGVBQWUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLGVBQWUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztFQUM3RCxlQUFlLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxlQUFlLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7RUFDN0QsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0VBQ3ZELGFBQWEsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztFQUN4RCxTQUFTLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxZQUFZLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7RUFDeEQsV0FBVyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsYUFBYSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0VBQzFELGFBQWEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztFQUN0RCxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxZQUFZLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7RUFDM0QsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsV0FBVyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0VBQ2xELE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUM3QyxhQUFhLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7RUFDdEQsVUFBVSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0VBQ3ZELFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztFQUNsRCxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7RUFDbEQsVUFBVSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsZUFBZSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0VBQzdELFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLGNBQWMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztFQUMzRCxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxZQUFZLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7RUFDM0QsV0FBVyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsc0JBQXNCLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7RUFDckUsV0FBVyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0VBQzNELFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztFQUMxRCxhQUFhLEVBQUUsQ0FBQyxH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LENBQUMsQ0FBQztFQUNuRCxRQUFRLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDbEQsUUFBUSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsZUFBZSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0VBQzNELFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLGVBQWUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztFQUM5RCxlQUFlLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxZQUFZLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7RUFDL0QsV0FBVyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0VBQ3BELE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztFQUNoRCxZQUFZLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7RUFDdEQsZUFBZSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0VBQy9CLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztFQUNoRCxXQUFXLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxhQUFhLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7RUFDekQsUUFBUSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0VBQ3ZELFVBQVUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztFQUN0RCxRQUFRLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7RUFDbEQsU0FBUyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsV0FBVyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0VBQ3ZELFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztFQUMxRCxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FB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RUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7TUFDdkU7OzRDQUVELDRCQUFRLENBQUMsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsR0FBRyxVQUFVO1FBQ3BKQSxJQUFNLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ2xCQSxJQUFNLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2pCLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN6QixJ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RyxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDOUMsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDOUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDaEQsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDaEQsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7TUFDckQ7OzRDQUVELG9DQUFZLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxHQUFHLFVBQVUsR0FBRyxVQUFVLEdBQUcsVUFBVSxHQUFHLFVBQVUsR0FBRyxVQUFVLEdBQUcsVUFBVSxHQUFHLFVBQVUsR0FBRyxVQUFVO1FBQ3hPQSxJQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ25CLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztNQUMxRzs7NENBRUQsNEJBQVEsQ0FBQyxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVB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RSxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRTtJQUM1RCxtQkFBSSxtQkFBRyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFFO0lBQzFELG1CQUFJLHFCQUFLLEVBQUUsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUU7SUFDNUQsbUJBQUksbUJBQUcsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRTtJQUMxRCxtQkFBSSxxQkFBSyxFQUFFLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFFO0lBQzVELG1CQUFJLG1CQUFHLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUU7SUFDMUQsbUJBQUkscUJBQUssRUFBRSxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRTtJQUM1RCxtQkFBSSxtQkFBRyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFFO0lBQzFELG1CQUFJLCtCQUFlLEVBQUUsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFH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LEdBQUU7SUFDdkUscUJBQUksNEJBQVksQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRTtJQUNyRSxxQkFBSSw4QkFBYyxFQUFFLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFFO0lBQ3ZFLHFCQUFJLDRCQUFZLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUU7SUFDckUscUJBQUksOEJBQWMsRUFBRSxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRTtJQUN0RSxxQkFBSSw0QkFBWSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFFO0lBQ3BFLHFCQUFJLHlCQUFTLEVBQUUsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUU7SUFDakUscUJBQUksdUJBQU8sQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRTtJQUMvRCxxQkFBSSw4QkFBYyxFQUFFLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFFO0lBQ3ZFLHFCQUFJLDRCQUFZLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxZQUFZLENB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QUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUU7SUFDNUQscUJBQUksb0NBQW9CLEVBQUUsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUU7SUFDNUUscUJBQUksa0NBQWtCLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUU7SUFDMUUscUJBQUksa0NBQWtCLEVBQUUsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUU7SUFDMUUscUJBQUksZ0NBQWdCLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUU7SUFDeEUscUJBQUksb0NBQW9CLEVBQUUsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUU7SUFDNUUscUJBQUksa0NBQWtCLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUU7SUFDMUUscUJBQUksa0NBQWtCLEVBQUUsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUU7SUFDM0UscUJBQUksZ0NBQWdCLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDLEdBQUcs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QyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNmLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNmLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7RUFDWixPQUFPLEdBQUcsQ0FBQztDQUNaOzs7Ozs7OztBQVFNLFNBQVMsV0FBVyxDQUFDLENBQUMsRUFBRTtFQUM3QixPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztDQUNsQzs7Ozs7Ozs7OztBQVVELFNBQWdCLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtFQUNsQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZCxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0VBQzNCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7RUFDM0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztFQUMzQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0VBQzNCLE9BQU8sR0FBRyxDQUFDO0NBQ1o7Ozs7Ozs7Ozs7QUFVRCxTQUFnQixNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUU7RUFDbEMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2QsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUN0QixJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ3RCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7RUFDekIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztFQUN6QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7RUFDMUIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0VBQzFCLE9BQU8sR0FBRyxDQUFDO0NBQ1o7Ozs7Ozs7Ozs7QUFVRCxTQUFnQixLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7RUFDL0IsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2QsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztFQUNqQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztFQUNqQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztFQUNqQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztFQUNqQixPQUFPLEdBQUcsQ0FBQztDQUNaOzs7Ozs7Ozs7Ozs7O0FBYU0sU0FBUyxZQUFZLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRTtFQUNyQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ3RCLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDdEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7RUFDWixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1gsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7Ozs7OztBQWFNLFNBQVMsV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7RUFDbEMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLE9BQU8sR0FBRyxDQUFDO0NBQ1o7Ozs7Ozs7O0FBUU0sU0FBUyxHQUFHLENBQUMsQ0FBQyxFQUFFO0VBQ3JCLE9BQU8sT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7Q0FDdkU7Ozs7Ozs7O0FBUU0sU0FBUyxJQUFJLENBQUMsQ0FBQyxFQUFFO0VBQ3RCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0NBQ2pHOzs7Ozs7Ozs7QUFTRCxTQUFnQixHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0VBQzlCLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ25CLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDWixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ1osQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQzFCLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0NBQ2xCOzs7Ozs7Ozs7O0FBVUQsU0FBZ0IsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0VBQzdCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ3JCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ3JCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ3JCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ3JCLE9BQU8sR0FBRyxDQUFDO0NBQ1o7Ozs7Ozs7Ozs7QUFVRCxTQUFnQixRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7RUFDbEMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDckIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDckIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDckIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDckIsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7O0FBU00sU0FBUyxXQUFXLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRTtFQUNoQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Q0FDekU7Ozs7Ozs7OztBQVNNLFNBQVNFLFFBQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFO0VBQzNCLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUlDLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUlBLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUlBLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUlBLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Q0FDelY7Ozs7Ozs7Ozs7QUFVRCxTQUFnQixjQUFjLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7RUFDeEMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDbEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDbEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDbEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDbEIsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7Ozs7QUFXRCxTQUFnQixvQkFBb0IsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUU7RUFDckQsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0VBQzdCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztFQUM3QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7RUFDN0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0VBQzdCLE9BQU8sR0FBRyxDQUFDO0NBQ1o7Ozs7OztBQU1NLElBQUksR0FBRyxHQUFHLFFBQVEsQ0FBQzs7Ozs7O0FBTTFCLElBQVcsR0FBRyxHQUFHLFFBQVE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3JaekIsU0FBZ0JDLFFBQU0sR0FBRztFQUN2QixJQUFJLEdBQUcsR0FBRyxJQUFJSixVQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDOztFQUVyQyxJQUFJQSxVQUFtQixJQUFJLFlBQVksRUFBRTtJQUN2QyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0dBQ1o7O0VBRUQsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWCxPQUFPLEdBQUcsQ0FBQztDQUNaOzs7Ozs7OztBQVFNLFNBQVNDLE9BQUssQ0FBQyxDQUFDLEVBQUU7RUFDdkIsSUFBSSxHQUFHLEdBQUcsSUFBSUQsVUFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNyQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZCxPQUFPLEdBQUcsQ0FBQztDQUNaOzs7Ozs7Ozs7QUFTTSxTQUFTSyxNQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRTtFQUMzQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZCxPQUFPLEdBQUcsQ0FBQztDQUNaOzs7Ozs7OztBQVFNLFNBQVNDLFVBQVEsQ0FBQyxHQUFHLEVBQUU7RUFDNUIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1gsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7Ozs7OztBQWFNLFNBQVNDLFlBQVUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRTtFQUM3QyxJQUFJLEdBQUcsR0FBRyxJQUFJUCxVQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ3JDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0VBQ1osR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztFQUNaLE9BQU8sR0FBRyxDQUFDO0NBQ1o7Ozs7Ozs7Ozs7Ozs7O0FBY00sU0FBU1EsS0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRTtFQUMzQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztFQUNaLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7RUFDWixPQUFPLEdBQUcsQ0FBQztDQUNaOzs7Ozs7Ozs7QUFTTSxTQUFTQyxRQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRTtFQUM3QixJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZCxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1YsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNmLElBQUksR0FBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQzs7RUFFNUIsSUFBSSxDQUFDLEdBQUcsRUFBRTtJQUNSLE9BQU8sSUFBSSxDQUFDO0dBQ2I7O0VBRUQsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7RUFDaEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUM7RUFDbEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQztFQUNuQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDO0VBQ25CLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDO0VBQ2xCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7RUFDckMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQztFQUNyQyxPQUFPLEdBQUcsQ0FBQztDQUNaOzs7Ozs7OztBQVFNLFNBQVNDLGFBQVcsQ0FBQyxDQUFDLEVBQUU7RUFDN0IsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Q0FDbEM7Ozs7Ozs7Ozs7QUFVRCxTQUFnQkMsVUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0VBQ2xDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZCxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztFQUMzQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0VBQzNCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7RUFDM0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztFQUMzQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztFQUNoQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztFQUNoQyxPQUFPLEdBQUcsQ0FBQztDQUNaOzs7Ozs7Ozs7O0FBVUQsU0FBZ0JDLFFBQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRTtFQUNsQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2QsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUN0QixJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ3RCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7RUFDekIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztFQUN6QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7RUFDMUIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0VBQzFCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7RUFDWixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0VBQ1osT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7OztBQVVELFNBQWdCQyxPQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7RUFDL0IsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7RUFDakIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7RUFDakIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7RUFDakIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7RUFDakIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztFQUNaLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7RUFDWixPQUFPLEdBQUcsQ0FBQztDQUNaOzs7Ozs7Ozs7O0FBVUQsU0FBZ0JDLFdBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtFQUNuQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2QsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0VBQ1osR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztFQUNaLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7RUFDWixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0VBQ1osR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7RUFDaEMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7RUFDaEMsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7Ozs7OztBQWFNLFNBQVNDLGNBQVksQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFO0VBQ3JDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO01BQ2pCLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ3RCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0VBQ1osR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1gsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7Ozs7OztBQWFNLFNBQVNDLGFBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0VBQ2xDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNYLE9BQU8sR0FBRyxDQUFDO0NBQ1o7Ozs7Ozs7Ozs7Ozs7QUFhTSxTQUFTLGVBQWUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0VBQ3RDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLE9BQU8sR0FBRyxDQUFDO0NBQ1o7Ozs7Ozs7O0FBUU0sU0FBU0MsS0FBRyxDQUFDLENBQUMsRUFBRTtFQUNyQixPQUFPLFFBQVEsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztDQUNwRzs7Ozs7Ozs7QUFRTSxTQUFTQyxNQUFJLENBQUMsQ0FBQyxFQUFFO0VBQ3RCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztDQUM3STs7Ozs7Ozs7OztBQVVELFNBQWdCQyxLQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7RUFDN0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDckIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDckIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDckIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDckIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDckIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDckIsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7OztBQVVELFNBQWdCQyxVQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7RUFDbEMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDckIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDckIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDckIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDckIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDckIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDckIsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7OztBQVVELFNBQWdCQyxnQkFBYyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0VBQ3hDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ2xCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ2xCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ2xCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ2xCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ2xCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ2xCLE9BQU8sR0FBRyxDQUFDO0NBQ1o7Ozs7Ozs7Ozs7O0FBV0QsU0FBZ0JDLHNCQUFvQixDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRTtFQUNyRCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7RUFDN0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0VBQzdCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztFQUM3QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7RUFDN0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0VBQzdCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztFQUM3QixPQUFPLEdBQUcsQ0FBQztDQUNaOzs7Ozs7Ozs7QUFTTSxTQUFTQyxhQUFXLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRTtFQUNoQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0NBQzNHOzs7Ozs7Ozs7QUFTTSxTQUFTckIsUUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUU7RUFDM0IsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJQyxPQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJQSxPQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJQSxPQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJQSxPQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJQSxPQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJQSxPQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0NBQ25nQjs7Ozs7O0FBTU0sSUFBSXFCLEtBQUcsR0FBR2IsVUFBUSxDQUFDOzs7Ozs7QUFNMUIsSUFBV2MsS0FBRyxHQUFHTCxVQUFROzs7Ozs7Ozs7Ozs7O0FDemR6QixTQUFnQmhCLFFBQU0sR0FBRztFQUN2QixJQUFJLEdBQUcsR0FBRyxJQUFJSixVQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDOztFQUVyQyxJQUFJQSxVQUFtQixJQUFJLFlBQVksRUFBRTtJQUN2QyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7R0FDWjs7RUFFRCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWCxPQUFPLEdBQUcsQ0FBQztDQUNaOzs7Ozs7Ozs7QUFTTSxTQUFTLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0VBQy9CLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztFQUNmLE9BQU8sR0FBRyxDQUFDO0NBQ1o7Ozs7Ozs7O0FBUU0sU0FBU0MsT0FBSyxDQUFDLENBQUMsRUFBRTtFQUN2QixJQUFJLEdBQUcsR0FBRyxJQUFJRCxVQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ3JDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLE9BQU8sR0FBRyxDQUFDO0NBQ1o7Ozs7Ozs7OztBQVNNLFNBQVNLLE1BQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0VBQzNCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLE9BQU8sR0FBRyxDQUFDO0NBQ1o7Ozs7Ozs7Ozs7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QUFDLENBQUMsQ0FBQztJQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7SUFDYixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUNiLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7R0FDZCxNQUFNO0lBQ0wsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0dBQ2Y7O0VBRUQsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7O0FBU00sU0FBU2pCLFFBQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0VBQzdCLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVixHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNWLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZixJQUFJ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QUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZixPQUFPLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7Q0FDdkc7Ozs7Ozs7Ozs7QUFVRCxTQUFnQkMsVUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0VBQ2xDLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVixHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNWLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZixJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1YsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVixHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2YsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNWLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1YsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNmLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVixHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNWLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZixJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1YsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVixHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2YsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNWLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1YsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNmLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztFQUMzQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7RUFDM0MsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0VBQzNDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztFQUMzQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7RUFDM0MsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0VBQzNDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztFQUMzQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7RUFDM0MsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0VBQzNDLE9BQU8sR0FBRyxDQUFDO0NBQ1o7Ozs7Ozs7Ozs7QUFVRCxTQUFnQkcsV0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0VBQ25DLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVixHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNWLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1YsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVixHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNWLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1YsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVixHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNWLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1YsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDUixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztFQUNiLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7RUFDYixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0VBQ2IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztFQUNiLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7RUFDYixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0VBQ2IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7RUFDakMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7RUFDakMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7RUFDakMsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7OztBQVVELFNBQWdCRixRQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUU7RUFDbEMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNWLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1YsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVixHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNWLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1YsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVixHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNWLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1YsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVixDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7TUFDakIsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDdEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztFQUMzQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO0VBQzNCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7RUFDM0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztFQUMzQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO0VBQzNCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7RUFDM0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztFQUNiLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7RUFDYixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0VBQ2IsT0FBTyxHQUFHLENBQUM7Q0FDWjtBQUNELENBQUM7Ozs7Ozs7Ozs7QUFVRCxTQUFnQkMsT0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0VBQy9CLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDUixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDbEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDbEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDbEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDbEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDbEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDbEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2QsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7Ozs7OztBQWFNLFNBQVNlLGlCQUFlLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRTtFQUN0QyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWCxPQUFPLEdBQUcsQ0FBQztDQUNaOzs7Ozs7Ozs7Ozs7O0FBYU0sU0FBU2IsY0FBWSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUU7RUFDckMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7TUFDakIsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDdEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0VBQ1osR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWCxPQUFPLEdBQUcsQ0FBQztDQUNaOzs7Ozs7Ozs7Ozs7O0FBYU0sU0FBU0MsYUFBVyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7RUFDbEMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1gsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7O0FBU00sU0FBUyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRTtFQUNoQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FB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R0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZixJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1YsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVixHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztNQUNYLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7RUFDaEIsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztNQUNYLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO01BQ1gsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7TUFDWCxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0VBQ2hCLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztFQUNoQyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7RUFDaEMsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0VBQ2hDLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztFQUNoQyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7RUFDaEMsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0VBQ2hDLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztFQUNoQyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7RUFDaEMsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0VBQ2hDLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztFQUNoQyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7RUFDaEMsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDOztFQUVoQyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQzs7RUFFaEYsSUFBSSxDQUFDLEdBQUcsRUFBRTtJQUNSLE9BQU8sSUFBSSxDQUFDO0dBQ2I7O0VBRUQsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7RUFDaEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO0VBQ25ELEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQztFQUNuRCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7RUFDbkQsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO0VBQ25ELEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQztFQUNuRCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7RUFDbkQsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO0VBQ25ELEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQztFQUNuRCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7RUFDbkQsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7OztBQVVELFNBQWdCLFVBQVUsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRTtFQUM3QyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQztFQUNuQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDO0VBQ3JCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7RUFDWixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNYLE9BQU8sR0FBRyxDQUFDO0NBQ1o7Ozs7Ozs7O0FBUU0sU0FBU0MsS0FBRyxDQUFDLENBQUMsRUFBRTtFQUNyQixPQUFPLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztDQUM3STs7Ozs7Ozs7QUFRTSxTQUFTQyxNQUFJLENBQUMsQ0FBQyxFQUFFO0VBQ3RCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0NBQ3JNOzs7Ozs7Ozs7O0FBVUQsU0FBZ0JDLEtBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtFQUM3QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNyQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNyQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNyQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNyQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNyQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNyQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNyQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNyQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNyQixPQUFPLEdBQUcsQ0FBQztDQUNaOzs7Ozs7Ozs7O0FBVUQsU0FBZ0JDLFVBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtFQUNsQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNyQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNyQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNyQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNyQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNyQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNyQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNyQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNyQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNyQixPQUFPLEdBQUcsQ0FBQztDQUNaOzs7Ozs7Ozs7O0FBVUQsU0FBZ0JDLGdCQUFjLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7RUFDeEMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDbEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDbEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDbEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDbEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDbEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDbEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDbEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDbEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDbEIsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7Ozs7QUFXRCxTQUFnQkMsc0JBQW9CLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFO0VBQ3JELEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztFQUM3QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7RUFDN0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0VBQzdCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztFQUM3QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7RUFDN0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0VBQzdCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztFQUM3QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7RUFDN0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0VBQzdCLE9BQU8sR0FBRyxDQUFDO0NBQ1o7Ozs7Ozs7OztBQVNNLFNBQVNDLGFBQVcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFO0VBQ2hDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Q0FDOUo7Ozs7Ozs7OztBQVNNLFNBQVNyQixRQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRTtFQUMzQixJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2QsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUlDLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUlBLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUlBLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUlBLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUlBLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUlBLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUlBLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUlBLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUlBLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Q0FDbHdCOzs7Ozs7QUFNTSxJQUFJcUIsS0FBRyxHQUFHYixVQUFRLENBQUM7Ozs7OztBQU0xQixJQUFXYyxLQUFHLEdBQUdMLFVBQVE7Ozs7Ozs7Ozs7Ozs7QUM5dkJ6QixTQUFnQmhCLFFBQU0sR0FBRztFQUN2QixJQUFJLEdBQUcsR0FBRyxJQUFJSixVQUFtQixDQUFDLEVBQUUsQ0FBQyxDQUFDOztFQUV0QyxJQUFJQSxVQUFtQixJQUFJLFlBQVksRUFBRTtJQUN2QyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNYLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDWixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ1osR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNaLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7R0FDYjs7RUFFRCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNYLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1osT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7QUFRTSxTQUFTQyxPQUFLLENBQUMsQ0FBQyxFQUFFO0VBQ3ZCLElBQUksR0FBRyxHQUFHLElBQUlELFVBQW1CLENBQUMsRUFBRSxDQUFDLENBQUM7RUFDdEMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7RUFDaEIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztFQUNoQixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0VBQ2hCLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7RUFDaEIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztFQUNoQixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0VBQ2hCLE9BQU8sR0FBRyxDQUFDO0NBQ1o7Ozs7Ozs7OztBQVNNLFNBQVNLLE1BQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0VBQzNCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZCxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0VBQ2hCLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7RUFDaEIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztFQUNoQixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0VBQ2hCLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7RUFDaEIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztFQUNoQixPQUFPLEdBQUcsQ0FBQztDQUNaOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXVCTSxTQUFTRSxZQUFVLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFO0VBQ3pHLElBQUksR0FBRyxHQUFHLElBQUlQLFVBQW1CLENBQUMsRUFBRSxDQUFDLENBQUM7RUFDdEMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztFQUNiLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7RUFDYixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0VBQ2IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztFQUNiLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7RUFDYixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0VBQ2IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztFQUNiLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7RUFDYixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0VBQ2IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztFQUNiLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7RUFDZCxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO0VBQ2QsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztFQUNkLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7RUFDZCxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO0VBQ2QsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztFQUNkLE9BQU8sR0FBRyxDQUFDO0NBQ1o7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXdCTSxTQUFTUSxLQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRTtFQUN2RyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0VBQ2IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztFQUNiLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7RUFDYixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0VBQ2IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztFQUNiLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7RUFDYixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0VBQ2IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztFQUNiLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7RUFDYixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0VBQ2IsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztFQUNkLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7RUFDZCxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO0VBQ2QsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztFQUNkLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7RUFDZCxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO0VBQ2QsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7QUFRTSxTQUFTRixVQUFRLENBQUMsR0FBRyxFQUFFO0VBQzVCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWCxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1osR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNaLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1osR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNaLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWixPQUFPLEdBQUcsQ0FBQztDQUNaOzs7Ozs7Ozs7QUFTTSxTQUFTb0IsV0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7O0VBRWhDLElBQUksR0FBRyxLQUFLLENBQUMsRUFBRTtJQUNiLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDVixHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNWLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDZixJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ1YsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNmLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNoQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDZixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBQ2IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDZixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBQ2IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUNiLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDaEIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUNkLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7SUFDZCxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO0dBQ2YsTUFBTTtJQUNMLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDZixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2YsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDZCxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2hCLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDaEIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNmLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDZixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2hCLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7R0FDakI7O0VBRUQsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7O0FBU00sU0FBU2pCLFFBQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0VBQzdCLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVixHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNWLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1YsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNmLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVixHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNWLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1YsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNmLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVixHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNWLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO01BQ1gsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztFQUNoQixJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO01BQ1gsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7TUFDWCxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztNQUNYLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7RUFDaEIsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0VBQ2hDLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztFQUNoQyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7RUFDaEMsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0VBQ2hDLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztFQUNoQyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7RUFDaEMsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0VBQ2hDLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztFQUNoQyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7RUFDaEMsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0VBQ2hDLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztFQUNoQyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7O0VBRWhDLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDOztFQUVoRixJQUFJLENBQUMsR0FBRyxFQUFFO0lBQ1IsT0FBTyxJQUFJLENBQUM7R0FDYjs7RUFFRCxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztFQUNoQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7RUFDbkQsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO0VBQ25ELEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQztFQUNuRCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7RUFDbkQsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO0VBQ25ELEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQztFQUNuRCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7RUFDbkQsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO0VBQ25ELEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQztFQUNuRCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7RUFDbkQsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO0VBQ3BELEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQztFQUNwRCxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7RUFDcEQsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO0VBQ3BELEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQztFQUNwRCxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7RUFDcEQsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7O0FBU00sU0FBU2tCLFNBQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0VBQzlCLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVixHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNWLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1YsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNmLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVixHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNWLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1YsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNmLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVixHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNWLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO01BQ1gsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztFQUNoQixJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO01BQ1gsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7TUFDWCxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztNQUNYLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7RUFDaEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0VBQ3ZHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7RUFDMUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0VBQ3ZHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7RUFDMUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztFQUMxRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7RUFDdkcsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztFQUMxRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7RUFDdkcsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0VBQ3ZHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7RUFDMUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0VBQ3hHLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7RUFDM0csR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztFQUMzRyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7RUFDeEcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztFQUMzRyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7RUFDeEcsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7QUFRTSxTQUFTakIsYUFBVyxDQUFDLENBQUMsRUFBRTtFQUM3QixJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1YsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVixHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNWLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZixJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1YsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVixHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNWLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZixJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1YsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVixHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztNQUNYLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7RUFDaEIsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztNQUNYLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO01BQ1gsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7TUFDWCxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0VBQ2hCLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztFQUNoQyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7RUFDaEMsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0VBQ2hDLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztFQUNoQyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7RUFDaEMsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0VBQ2hDLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztFQUNoQyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7RUFDaEMsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0VBQ2hDLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztFQUNoQyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7RUFDaEMsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDOztFQUVoQyxPQUFPLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0NBQzlFOzs7Ozs7Ozs7O0FBVUQsU0FBZ0JDLFVBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtFQUNsQyxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1YsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVixHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNWLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZixJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1YsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVixHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNWLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZixJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1YsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVixHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztNQUNYLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7RUFDaEIsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztNQUNYLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO01BQ1gsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7TUFDWCxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDOztFQUVoQixJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQztFQUNuRCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQztFQUNuRCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQztFQUNuRCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQztFQUNuRCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ1YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNWLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDVixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ1YsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUM7RUFDbkQsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUM7RUFDbkQsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUM7RUFDbkQsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUM7RUFDbkQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNWLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDVixFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0VBQ1gsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztFQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDO0VBQ25ELEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDO0VBQ25ELEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDO0VBQ3BELEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDO0VBQ3BELEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7RUFDWCxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0VBQ1gsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztFQUNYLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7RUFDWCxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQztFQUNwRCxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQztFQUNwRCxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQztFQUNwRCxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQztFQUNwRCxPQUFPLEdBQUcsQ0FBQztDQUNaOzs7Ozs7Ozs7O0FBVUQsU0FBZ0JHLFdBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtFQUNuQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDUixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2IsSUFBSSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7RUFDdkIsSUFBSSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7RUFDdkIsSUFBSSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7O0VBRXZCLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRTtJQUNiLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDakQsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNqRCxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2xELEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7R0FDbkQsTUFBTTtJQUNMLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDWCxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ1gsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNYLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDWCxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ1gsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNYLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDWCxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ1gsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNYLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDWCxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ1osR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNaLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7SUFDYixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBQ2IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUNiLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7SUFDYixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBQ2IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUNiLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7SUFDYixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBQ2IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUNiLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7SUFDYixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBQ2QsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUNkLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDOUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM5QyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzlDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7R0FDL0M7O0VBRUQsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7OztBQVVELFNBQWdCRCxPQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7RUFDL0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNSLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNiLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ2xCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ2xCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ2xCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ2xCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ2xCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ2xCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ2xCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ2xCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ2xCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ2xCLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ3BCLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ3BCLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7RUFDaEIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztFQUNoQixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0VBQ2hCLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7RUFDaEIsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7Ozs7QUFXRCxTQUFnQkQsUUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRTtFQUN4QyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO01BQ1gsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7TUFDWCxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2hCLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztFQUMzQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0VBQ1osSUFBSSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7RUFDdkIsSUFBSSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7RUFDdkIsSUFBSSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7RUFDdkIsSUFBSSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQztFQUNsQixJQUFJLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDO0VBQ2xCLElBQUksR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7O0VBRWxCLElBQUksR0FBRyxHQUFHVCxPQUFnQixFQUFFO0lBQzFCLE9BQU8sSUFBSSxDQUFDO0dBQ2I7O0VBRUQsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7RUFDZCxDQUFDLElBQUksR0FBRyxDQUFDO0VBQ1QsQ0FBQyxJQUFJLEdBQUcsQ0FBQztFQUNULENBQUMsSUFBSSxHQUFHLENBQUM7RUFDVCxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNsQixDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNsQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNWLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDWCxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ1gsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNYLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDWCxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ1gsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNYLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDWCxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ1gsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNYLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDWCxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0VBQ1osR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQzs7RUFFWixHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ3BCLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ3hCLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ3hCLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ3hCLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDcEIsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDeEIsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDeEIsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDeEIsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzs7RUFFcEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0VBQzNDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztFQUMzQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7RUFDM0MsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0VBQzNDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztFQUMzQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7RUFDM0MsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0VBQzNDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztFQUMzQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FB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QUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7RUFDM0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztFQUMzQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0VBQzNCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7RUFDM0IsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztFQUM1QixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0VBQzVCLE9BQU8sR0FBRyxDQUFDO0NBQ1o7Ozs7Ozs7Ozs7QUFVRCxTQUFnQixPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUU7RUFDbkMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUN0QixJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ3RCLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNmLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNmLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNmLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNmLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNmLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNmLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztFQUNoQixJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7O0VBRWhCLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRTs7SUFFYixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2QsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNoQixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2hCLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDaEIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztHQUNqQjs7O0VBR0QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztFQUMzQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0VBQzNCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7RUFDM0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztFQUMzQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0VBQzNCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7RUFDM0IsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztFQUM1QixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0VBQzVCLE9BQU8sR0FBRyxDQUFDO0NBQ1o7Ozs7Ozs7Ozs7QUFVRCxTQUFnQixPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUU7RUFDbkMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUN0QixJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ3RCLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNmLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNmLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNmLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNmLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNmLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNmLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNmLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7RUFFZixJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUU7O0lBRWIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDZCxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2hCLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDaEIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNoQixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2hCLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDaEIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztHQUNqQjs7O0VBR0QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztFQUMzQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0VBQzNCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7RUFDM0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztFQUMzQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0VBQzNCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7RUFDM0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztFQUMzQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcs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QUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztFQUMzQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDOztFQUVaLElBQUksR0FBRyxHQUFHWixPQUFnQixFQUFFO0lBQzFCLE9BQU8sSUFBSSxDQUFDO0dBQ2I7O0VBRUQsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7RUFDZCxDQUFDLElBQUksR0FBRyxDQUFDO0VBQ1QsQ0FBQyxJQUFJLEdBQUcsQ0FBQztFQUNULENBQUMsSUFBSSxHQUFHLENBQUM7RUFDVCxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNsQixDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNsQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzs7RUFFVixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ3ZCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQzNCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQzNCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUMzQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ3ZCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQzNCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUMzQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUMzQixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ3hCLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1osR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNaLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1osT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7Ozs7OztBQWFNLFNBQVMsYUFBYSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUU7RUFDdEMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUN0QixJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDOztFQUV0QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7RUFDWixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1osR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNaLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1osR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNaLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWixPQUFPLEdBQUcsQ0FBQztDQUNaOzs7Ozs7Ozs7Ozs7O0FBYU0sU0FBUyxhQUFhLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRTtFQUN0QyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ3RCLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7O0VBRXRCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0VBQ1osR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNYLEdB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QUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztFQUN0QyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7O0VBRVYsSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFO0lBQ2IsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMvQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQztJQUNsQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMvQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMvQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztHQUNoQyxNQUFNLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFO0lBQzlDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNuRCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMvQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQztJQUNsQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMvQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztHQUNoQyxNQUFNLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRTtJQUMzQixDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDbkQsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDL0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDL0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUM7SUFDbEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7R0FDaEMsTUFBTTtJQUNMLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNuRCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMvQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMvQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMvQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQztHQUNuQjs7RUFFRCxPQUFPLEdBQUcsQ0FBQztDQUNaOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBbUJELFNBQWdCLDRCQUE0QixDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTs7RUFFekQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNSLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDUixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2IsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNmLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDZixJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ2YsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztFQUNoQixJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0VBQ2hCLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7RUFDaEIsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztFQUNoQixJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0VBQ2hCLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7RUFDaEIsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztFQUNoQixJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0VBQ2hCLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7RUFDaEIsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2QsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2QsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7RUFDOUIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUM7RUFDeEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUM7RUFDeEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxDQUFDO0VBQ3hCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO0VBQzlCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxDQUFDO0VBQ3hCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsQ0FBQztFQUN4QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsQ0FBQztFQUN4QixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztFQUMvQixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1osR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNmLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2YsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNaLE9BQU8sR0FBRyxDQUFDO0NBQ1o7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFzQk0sU0FBUyxrQ0FBa0MsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFOztFQUVsRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDUixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNSLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDYixJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ2YsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNmLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDZixJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0VBQ2hCLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7RUFDaEIsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztFQUNoQixJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0VBQ2hCLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7RUFDaEIsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztFQUNoQixJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0VBQ2hCLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7RUFDaEIsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztFQUNoQixJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZCxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZCxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZCxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZCxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZCxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZCxJQUFJLElBQUksR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO0VBQ2hDLElBQUksSUFBSSxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUM7RUFDMUIsSUFBSSxJQUFJLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsQ0FBQztFQUMxQixJQUFJLElBQUksR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxDQUFDO0VBQzFCLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7RUFDaEMsSUFBSSxJQUFJLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsQ0FBQztFQUMxQixJQUFJLElBQUksR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxDQUFDO0VBQzFCLElBQUksSUFBSSxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUM7RUFDMUIsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztFQUNqQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO0VBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQztFQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7RUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQztFQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7RUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO0VBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7RUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO0VBQ2QsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQztFQUNoQixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1osR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksSUFBSSxHQUFHLEVBQUUsR0FBRyxJQUFJLEdBQUcsRUFBRSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQztFQUMxRCxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxJQUFJLEdBQUcsRUFBRSxHQUFHLElBQUksR0FBRyxFQUFFLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0VBQzFELEdB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QUMsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUM7RUFDNUIsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJLEdBQUcsR0FBRyxNQUFNLENBQUMsQ0FBQztFQUM1QixJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUksSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDO0VBQzFCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztFQUN2QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0VBQ3ZCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7RUFDN0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLE1BQU0sSUFBSSxFQUFFLENBQUM7RUFDN0IsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7RUFDNUIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0VBQ2IsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNaLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFD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LEdBQUcsQ0FBQyxJQUFJLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQztFQUM1QixJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUksTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDO0VBQzVCLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7RUFDMUIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztFQUNqQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztFQUNqQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1gsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7RUFDakIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNaLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxLQUFLLElBQUksRUFBRSxDQUFDO0VBQzlCLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxNQUFNLElBQUksRUFBRSxDQUFDO0VBQzlCLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO0VBQzVCLEdBQUcsQ0FBQyxFQUFFLENBQUMs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RyxFQUFFLEdBQUcsRUFBRSxDQUFDO0VBQ3ZCLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7O0VBRTdDLElBQUksQ0FBQyxHQUFHLEVBQUU7SUFDUixFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ1AsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNQLEVBQUUsR0FBRyxDQUFDLENBQUM7R0FDUixNQUFNO0lBQ0wsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7SUFDZCxFQUFFLElBQUksR0FBRyxDQUFDO0lBQ1YsRUFBRSxJQUFJLEdBQUcsQ0FBQztJQUNWLEVBQUUsSUFBSSxHQUFHLENBQUM7R0FDWDs7RUFFRCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0VBQ1osR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztFQUNaLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7RUFDWixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztFQUNaLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7RUFDWixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0VBQ1osR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7RUFDWixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0VBQ1osR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztFQUNiLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLEdBQUcsSUFBSSxHQUFHLEVBQUUsR0FBRyxJQUFJ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QUUsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7Q0FDclA7Ozs7Ozs7O0FBUU0sU0FBU0MsTUFBSSxDQUFDLENBQUMsRUFBRTtFQUN0QixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztDQUN2Vjs7Ozs7Ozs7OztBQVVELFNBQWdCQyxLQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7RUFDN0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDckIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDckIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDckIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDckIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDckIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDckIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDckIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDckIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDckIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDckIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7RUFDeEIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7RUFDeEIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7RUFDeEIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7RUFDeEIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7RUFDeEIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7RUFDeEIsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7OztBQVVELFNBQWdCQyxVQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7RUFDbEMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDckIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDckIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDckIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDckIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDckIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDckIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDckIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDckIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDckIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDckIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7RUFDeEIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7RUFDeEIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7RUFDeEIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7RUFDeEIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7RUFDeEIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7RUFDeEIsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7OztBQVVELFNBQWdCQyxnQkFBYyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0VBQ3hDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ2xCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ2xCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ2xCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ2xCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ2xCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ2xCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ2xCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ2xCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ2xCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ2xCLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ3BCLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ3BCLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ3BCLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ3BCLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ3BCLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ3BCLE9BQU8sR0FBRyxDQUFDO0NBQ1o7Ozs7Ozs7Ozs7O0FBV0QsU0FBZ0JDLHNCQUFvQixDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRTtFQUNyRCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7RUFDN0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0VBQzdCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztFQUM3QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7RUFDN0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0VBQzdCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztFQUM3QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7RUFDN0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0VBQzdCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztFQUM3QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7RUFDN0IsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDO0VBQ2hDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQztFQUNoQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUM7RUFDaEMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDO0VBQ2hDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQztFQUNoQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUM7RUFDaEMsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7O0FBU00sU0FBU0MsYUFBVyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUU7RUFDaEMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0NBQ2pTOzs7Ozs7Ozs7QUFTTSxTQUFTckIsUUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUU7RUFDM0IsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2QsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2QsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7TUFDWCxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0VBQ2hCLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7TUFDWCxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztNQUNYLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO01BQ1gsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztFQUNoQixJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZCxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZCxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztNQUNYLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7RUFDaEIsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztNQUNYLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO01BQ1gsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7TUFDWCxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0VBQ2hCLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUlDLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUlBLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUlBLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUlBLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUlBLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUlBLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUlBLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUlBLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUlBLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUlBLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLElBQUlBLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLElBQUlBLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLElBQUlBLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFB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Q0FBQztFQUN6QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUN6QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUN6QixPQUFPLEdBQUcsQ0FBQztDQUNaOzs7Ozs7Ozs7QUFTTSxTQUFTLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0VBQzVCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQzFCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQzFCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQzFCLE9BQU8sR0FBRyxDQUFDO0NBQ1o7Ozs7Ozs7Ozs7QUFVRCxTQUFnQixHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7RUFDN0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQzlCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUM5QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDOUIsT0FBTyxH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QyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztDQUNoRDs7Ozs7Ozs7OztBQVVELFNBQWdCLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtFQUMvQixJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2QsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7RUFDM0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztFQUMzQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0VBQzNCLE9BQU8sR0FBRyxDQUFDO0NBQ1o7Ozs7Ozs7Ozs7O0FBV0QsU0FBZ0IsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtFQUNqQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZCxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZCxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7RUFDOUIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0VBQzlCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztFQUM5QixPQUFPLEdBQUcsQ0FBQztDQUNaOzs7Ozs7Ozs7Ozs7O0FBYU0sU0FBUyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7RUFDMUMsSUFBSSxZQUFZLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUN6QixJQUFJLE9BQU8sR0FBRyxZQUFZLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDN0MsSUFBSSxPQUFPLEdBQUcsWUFBWSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDekMsSUFBSSxPQUFPLEdBQUcsWUFBWSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztFQUNyQyxJQUFJLE9BQU8sR0FBRyxZQUFZLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztFQUN6QyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQztFQUMzRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQztFQUMzRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQztFQUMzRSxPQUFPLEdBQUcsQ0FBQztDQUNaOzs7Ozs7Ozs7Ozs7O0FBYU0sU0FBU2lCLFFBQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtFQUN6QyxJQUFJLGFBQWEsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQzFCLElBQUkscUJBQXFCLEdBQUcsYUFBYSxHQUFHLGFBQWEsQ0FBQztFQUMxRCxJQUFJLFlBQVksR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ3pCLElBQUksT0FBTyxHQUFHLHFCQUFxQixHQUFHLGFBQWEsQ0FBQztFQUNwRCxJQUFJLE9BQU8sR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLHFCQUFxQixDQUFDO0VBQzVDLElBQUksT0FBTyxHQUFHLENBQUMsR0FBRyxZQUFZLEdBQUcsYUFBYSxDQUFDO0VBQy9DLElBQUksT0FBTyxHQUFHLFlBQVksR0FBRyxDQUFDLENBQUM7RUFDL0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUM7RUFDM0UsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUM7RUFDM0UsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUM7RUFDM0UsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7O0FBU00sU0FBUyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRTtFQUNqQyxLQUFLLEdBQUcsS0FBSyxJQUFJLEdBQUcsQ0FBQztFQUNyQixJQUFJLENBQUMsR0FBR0MsTUFBZSxFQUFFLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUM7RUFDMUMsSUFBSSxDQUFDLEdBQUdBLE1BQWUsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7RUFDdEMsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztFQUM1QyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUM7RUFDOUIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDO0VBQzlCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDO0VBQ25CLE9BQU8sR0FBRyxDQUFDO0NBQ1o7Ozs7Ozs7Ozs7O0FBV0QsU0FBZ0IsYUFBYSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0VBQ3ZDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDUixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNSLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDYixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7RUFDaEQsQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUM7RUFDYixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO0VBQ3RELEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7RUFDdEQsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztFQUN2RCxPQUFPLEdBQUcsQ0FBQztDQUNaOzs7Ozs7Ozs7O0FBVUQsU0FBZ0IsYUFBYSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0VBQ3ZDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDUixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNSLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDYixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDeEMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ3hDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUN4QyxPQUFPLEdBQUcsQ0FBQztDQUNaOzs7Ozs7Ozs7OztBQVdELFNBQWdCLGFBQWEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTs7RUFFdkMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNSLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7O0VBR2IsSUFBSSxHQUFHLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQztNQUNyQixHQUFHLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQztNQUNyQixHQUFHLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDOztFQUUxQixJQUFJLElBQUksR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHO01BQzFCLElBQUksR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHO01BQzFCLElBQUksR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUM7O0VBRS9CLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7RUFDaEIsR0FBRyxJQUFJLEVBQUUsQ0FBQztFQUNWLEdBQUcsSUFBSSxFQUFFLENBQUM7RUFDVixHQUFHLElBQUksRUFBRSxDQUFDOztFQUVWLElBQUksSUFBSSxDQUFDLENBQUM7RUFDVixJQUFJLElBQUksQ0FBQyxDQUFDO0VBQ1YsSUFBSSxJQUFJLENBQUMsQ0FBQzs7RUFFVixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUM7RUFDeEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDO0VBQ3hCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQztFQUN4QixPQUFPLEdBQUcsQ0FBQztDQUNaOzs7Ozs7Ozs7O0FBVUQsU0FBZ0JDLFNBQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7RUFDcEMsSUFBSSxDQUFDLEdBQUcsRUFBRTtNQUNOLENBQUMsR0FBRyxFQUFFLENBQUM7O0VBRVgsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDbkIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDbkIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7O0VBRW5CLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDWixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDL0MsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDOztFQUUvQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNyQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNyQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNyQixPQUFPLEdBQUcsQ0FBQztDQUNaOzs7Ozs7Ozs7O0FBVUQsU0FBZ0JDLFNBQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7RUFDcEMsSUFBSSxDQUFDLEdBQUcsRUFBRTtNQUNOLENBQUMsR0FBRyxFQUFFLENBQUM7O0VBRVgsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDbkIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDbkIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7O0VBRW5CLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUMvQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ1osQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDOztFQUUvQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNyQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNyQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNyQixPQUFPLEdBQUcsQ0FBQztDQUNaOzs7Ozs7Ozs7O0FBVUQsU0FBZ0JDLFNBQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7RUFDcEMsSUFBSSxDQUFDLEdBQUcsRUFBRTtNQUNOLENBQUMsR0FBRyxFQUFFLENBQUM7O0VBRVgsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDbkIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDbkIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7O0VBRW5CLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUMvQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDL0MsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7RUFFWixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNyQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNyQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxD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QyxDQUFDLENBQUM7RUFDZCxPQUFPLEdBQUcsQ0FBQztDQUNaOzs7Ozs7Ozs7Ozs7QUFZTSxTQUFTRyxLQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtFQUNuQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1gsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7OztBQVVELFNBQWdCVyxLQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7RUFDN0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDckIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDckIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDckIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDckIsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7OztBQVVELFNBQWdCQyxVQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7RUFDbEMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDckIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDckIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDckIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDckIsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7OztBQVVELFNBQWdCVCxVQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7RUFDbEMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDckIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDckIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDckIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDckIsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7OztBQVVELFNBQWdCd0IsUUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0VBQ2hDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ3JCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ3JCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ3JCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ3JCLE9BQU8sR0FBRyxDQUFDO0NBQ1o7Ozs7Ozs7OztBQVNNLFNBQVNDLE1BQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0VBQzNCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ3pCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ3pCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ3pCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ3pCLE9BQU8sR0FBRyxDQUFDO0NBQ1o7Ozs7Ozs7OztBQVNNLFNBQVNDLE9BQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0VBQzVCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQzFCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQzFCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQzFCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQzFCLE9BQU8sR0FBRyxDQUFDO0NBQ1o7Ozs7Ozs7Ozs7QUFVRCxTQUFnQkMsS0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0VBQzdCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUM5QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDOUIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQzlCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUM5QixPQUFPLEdBQUcsQ0FBQztDQUNaOzs7Ozs7Ozs7O0FBVUQsU0FBZ0JDLEtBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtFQUM3QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDOUIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQzlCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUM5QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDOUIsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7O0FBU00sU0FBU0MsT0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7RUFDNUIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDMUIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDMUIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDMUIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDMUIsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7OztBQVVELFNBQWdCM0IsT0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0VBQy9CLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ2xCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ2xCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ2xCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ2xC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QUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDYixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDYixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDYixPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7Q0FDdEM7Ozs7Ozs7OztBQVNNLFNBQVNDLFFBQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0VBQzdCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNmLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNmLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNmLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNmLE9BQU8sR0FBRyxDQUFDO0NBQ1o7Ozs7Ozs7OztBQVNNLFNBQVNDLFNBQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0VBQzlCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ3BCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ3BCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ3BCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ3BCLE9BQU8sR0FBRyxDQUFDO0NBQ1o7Ozs7Ozs7OztBQVNNLFNBQVNDLFdBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0VBQ2hDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNiLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNiLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNiLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNiLElBQUksR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7O0VBRXhDLElBQUksR0FBRyxHQUFHLENBQUMsRUFBRTtJQUNYLEdBQUcsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztHQUMxQjs7RUFFRCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztFQUNqQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztFQUNqQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztFQUNqQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztFQUNqQixPQUFPLEdBQUcsQ0FBQztDQUNaOzs7Ozs7Ozs7QUFTTSxTQUFTQyxLQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRTtFQUN4QixPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Q0FDOUQ7Ozs7Ozs7Ozs7O0FBV0QsU0FBZ0JDLE9BQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7RUFDbEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUM3QixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUM3QixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUM3QixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUM3QixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUM3QixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2xDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNiLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNiLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNiLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNiLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUMvQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ2xDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUMvQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ2xDLE9BQU8sR0FBRyxDQUFDO0NBQ1o7QUFDRCxDQUFDOzs7Ozs7Ozs7OztBQVdELFNBQWdCQyxNQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0VBQ2pDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztFQUM5QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7RUFDOUIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0VBQzlCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztFQUM5QixPQUFPLEdBQUcsQ0FBQztDQUNaOzs7Ozs7Ozs7QUFTTSxTQUFTQyxRQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRTtFQUNqQyxLQUFLLEdBQUcsS0FBSyxJQUFJLEdBQUcsQ0FBQzs7OztFQUlyQixJQUFJLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQztFQUNuQixJQUFJLEVBQUUsRUFBRSxFQUFFLENBQUM7O0VBRVgsR0FBRztJQUNELEVBQUUsR0FBR3JCLE1BQWUsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDL0IsRUFBRSxHQUFHQSxNQUFlLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQy9CLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7R0FDeEIsUUFBUSxFQUFFLElBQUksQ0FBQyxFQUFFOztFQUVsQixHQUFHO0lBQ0QsRUFBRSxHQUFHQSxNQUFlLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQy9CLEVBQUUsR0FBR0EsTUFBZSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMvQixFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0dBQ3hCLFFBQVEsRUFBRSxJQUFJLENBQUMsRUFBRTs7RUFFbEIsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7RUFDakMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssR0FBRyxFQUFFLENBQUM7RUFDcEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssR0FBRyxFQUFFLENBQUM7RUFDcEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0VBQ3hCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztFQUN4QixPQUFPLEdBQUcsQ0FBQztDQUNaOzs7Ozs7Ozs7O0FBVUQsU0FBZ0JzQixlQUFhLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7RUFDdkMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNSLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDUixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDcEQsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDcEQsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDckQsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDckQsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7OztBQVVELFNBQWdCQyxlQUFhLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7RUFDdkMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNSLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNiLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7RUFFZCxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztFQUNsQyxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztFQUNsQyxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztFQUNsQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDOztFQUVuQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQztFQUNsRCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQztFQUNsRCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQztFQUNsRCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2QsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7QUFRTSxTQUFTQyxNQUFJLENBQUMsR0FBRyxFQUFFO0VBQ3hCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7RUFDYixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0VBQ2IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztFQUNiLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7RUFDYixPQUFPLEdBQUcsQ0FBQztDQUNaOzs7Ozs7OztBQVFNLFNBQVN0QyxLQUFHLENBQUMsQ0FBQyxFQUFFO0VBQ3JCLE9BQU8sT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7Q0FDdkU7Ozs7Ozs7OztBQVNNLFNBQVNNLGFBQVcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFO0VBQ2hDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztDQUN6RTs7Ozs7Ozs7O0FBU00sU0FBU3JCLFFBQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFO0VBQzNCLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUlDLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUlBLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVB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QUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztFQUMvQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztFQUMvQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztFQUMvQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztFQUMvQyxPQUFPLEdBQUcsQ0FBQztDQUNaOzs7Ozs7Ozs7O0FBVUQsU0FBZ0JxQixTQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUU7RUFDbkMsR0FBRyxJQUFJLEdBQUcsQ0FBQztFQUNYLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO01BQ2xCLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ3ZCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7RUFDM0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztFQUMzQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0VBQzNCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7RUFDM0IsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7OztBQVVELFNBQWdCQyxTQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUU7RUFDbkMsR0FBRyxJQUFJLEdBQUcsQ0FBQztFQUNYLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO01BQ2xCLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ3ZCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7RUFDM0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztFQUMzQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0VBQzNCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7RUFDM0IsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7OztBQVVELFNBQWdCQyxTQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUU7RUFDbkMsR0FBRyxJQUFJLEdBQUcsQ0FBQztFQUNYLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO01BQ2xCLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ3ZCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7RUFDM0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztFQUMzQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0VBQzNCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7RUFDM0IsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7Ozs7QUFXTSxTQUFTLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0VBQ2pDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDUixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNSLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDYixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDMUQsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7Ozs7QUFXRCxTQUFnQixLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFOzs7RUFHbEMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2QsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2QsSUFBSSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDOztFQUV4QyxLQUFLLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQzs7RUFFOUMsSUFBSSxLQUFLLEdBQUcsR0FBRyxFQUFFO0lBQ2YsS0FBSyxHQUFHLENBQUMsS0FBSyxDQUFDO0lBQ2YsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDO0lBQ1QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDO0lBQ1QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDO0lBQ1QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDO0dBQ1Y7OztFQUdELElBQUksR0FBRyxHQUFHLEtBQUssR0FBRy9CLE9BQWdCLEVBQUU7O0lBRWxDLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3pCLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3hCLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsSUFBSSxLQUFLLENBQUMsR0FBRyxLQUFLLENBQUM7SUFDN0MsTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxHQUFHLEtBQUssQ0FBQztHQUN0QyxNQUFNOzs7SUFHTCxNQUFNLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztJQUNqQixNQUFNLEdBQUcsQ0FBQyxDQUFDO0dBQ1o7OztFQUdELEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLEdBQUcsRUFBRSxHQUFHLE1BQU0sR0FBRyxFQUFFLENBQUM7RUFDbkMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sR0FBRyxFQUFFLEdBQUcsTUFBTSxHQUFHLEVBQUUsQ0FBQztFQUNuQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxHQUFHLEVBQUUsR0FBRyxNQUFNLEdBQUcsRUFBRSxDQUFDO0VBQ25DLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLEdBQUcsRUFBRSxHQUFHLE1BQU0sR0FBRyxFQUFFLENBQUM7RUFDbkMsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7QUFRTSxTQUFTaUQsUUFBTSxDQUFDLEdBQUcsRUFBRTs7O0VBRzFCLElBQUksRUFBRSxHQUFHckIsTUFBZSxFQUFFLENBQUM7RUFDM0IsSUFBSSxFQUFFLEdBQUdBLE1BQWUsRUFBRSxDQUFDO0VBQzNCLElBQUksRUFBRSxHQUFHQSxNQUFlLEVBQUUsQ0FBQztFQUMzQixJQUFJLFlBQVksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztFQUNyQyxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0VBQzNCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxZQUFZLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztFQUNyRCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsWUFBWSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7RUFDckQsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0VBQy9DLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztFQUMvQyxPQUFPLEdBQUcsQ0FBQztDQUNaOzs7Ozs7Ozs7QUFTTSxTQUFTdEIsUUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7RUFDN0IsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2QsSUFBSSxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztFQUNoRCxJQUFJLE1BQU0sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7O0VBRWpDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxNQUFNLENBQUM7RUFDdEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLE1BQU0sQ0FBQztFQUN0QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsTUFBTSxDQUFDO0VBQ3RCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsTUFBTSxDQUFDO0VBQ3JCLE9BQU8sR0FBRyxDQUFDO0NBQ1o7Ozs7Ozs7Ozs7QUFVTSxTQUFTLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0VBQ2hDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNmLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNmLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNmLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZCxPQUFPLEdBQUcsQ0FBQztDQUNaOzs7Ozs7Ozs7Ozs7O0FBYU0sU0FBUyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRTs7O0VBRy9CLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2hDLElBQUksS0FBSyxDQUFDOztFQUVWLElBQUksTUFBTSxHQUFHLEdBQUcsRUFBRTs7SUFFaEIsS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDOztJQUVoQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEtBQUssQ0FBQztJQUNyQixLQUFLLEdBQUcsR0FBRyxHQUFHLEtBQUssQ0FBQzs7SUFFcEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUM7SUFDL0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUM7SUFDL0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUM7R0FDaEMsTUFBTTs7SUFFTCxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDVixJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUUsQ0FBQyxHQUFHLENBQUMsR0FBQztJQUN2QixJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFDO0lBQy9CLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDcEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNwQixLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztJQUNwRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEtBQUssQ0FBQztJQUNyQixLQUFLLEdBQUcsR0FBRyxHQUFHLEtBQUssQ0FBQztJQUNwQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUM7SUFDL0MsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDO0lBQy9DLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQztHQUNoRDs7RUFFRCxPQUFPLEdBQUcsQ0FBQztDQUNaOzs7Ozs7Ozs7Ozs7QUFZRCxTQUFnQixTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0VBQ3RDLElBQUksU0FBUyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEtBQUssQ0FBQztFQUN0QyxDQUFDLElBQUksU0FBUyxDQUFDO0VBQ2YsQ0FBQyxJQUFJLFNBQVMsQ0FBQztFQUNmLENBQUMsSUFBSSxTQUFTLENBQUM7RUFDZixJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ3JCLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDckIsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNyQixJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ3JCLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDckIsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNyQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7RUFDckMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0VBQ3JDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztFQUNyQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7RUFDckMsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7QUFRTSxTQUFTUSxLQUFHLENBQUMsQ0FBQyxFQUFFO0VBQ3JCLE9BQU8sT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7Q0FDdkU7Ozs7Ozs7OztBQVNNLElBQUloQixPQUFLLEdBQUc2RCxPQUFVLENBQUM7Ozs7Ozs7Ozs7OztBQVl2QixJQUFJdkQsWUFBVSxHQUFHd0QsWUFBZSxDQUFDOzs7Ozs7Ozs7O0FBVWpDLElBQUkxRCxNQUFJLEdBQUcyRCxNQUFTLENBQUM7Ozs7Ozs7Ozs7Ozs7QUFhckIsSUFBSXhELEtBQUcsR0FBR3lELEtBQVEsQ0FBQzs7Ozs7Ozs7Ozs7QUFXbkIsSUFBSTlDLEtBQUcsR0FBRytDLEtBQVEsQ0FBQzs7Ozs7O0FBTW5CLElBQUkxQyxLQUFHLEdBQUdiLFVBQVEsQ0FBQzs7Ozs7Ozs7Ozs7QUFXbkIsSUFBSUUsT0FBSyxHQUFHc0QsT0FBVSxDQUFDOzs7Ozs7Ozs7O0FBVXZCLElBQUlsQixLQUFHLEdBQUdtQixLQUFRLENBQUM7Ozs7Ozs7Ozs7OztBQVluQixJQUFJakIsTUFBSSxHQUFHa0IsTUFBUyxDQUFDOzs7Ozs7OztBQVFyQixJQUFJekIsUUFBTSxHQUFHMEIsUUFBVyxDQUFDOzs7Ozs7QUFNekIsSUFBSVgsS0FBRyxHQUFHZixRQUFNLENBQUM7Ozs7Ozs7OztBQVNqQixJQUFJQyxlQUFhLEdBQUcwQixlQUFrQixDQUFDOzs7Ozs7QUFNdkMsSUFBSVgsUUFBTSxHQUFHZixlQUFhLENBQUM7Ozs7Ozs7Ozs7QUFVM0IsSUFBSUcsV0FBUyxHQUFHd0IsV0FBYyxDQUFDOzs7Ozs7Ozs7QUFTL0IsSUFBSWpELGFBQVcsR0FBR2tELGFBQWdCLENBQUM7Ozs7Ozs7OztBQVNuQyxJQUFJdkUsUUFBTSxHQUFHd0UsUUFBVyxDQUFDOzs7Ozs7Ozs7Ozs7O0FBYWhDLElBQVcsVUFBVSxHQUFHLFlBQVk7RUFDbEMsSUFBSSxPQUFPLEdBQUdDLFFBQVcsRUFBRSxDQUFDO0VBQzVCLElBQUksU0FBUyxHQUFHQyxZQUFlLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztFQUN6QyxJQUFJLFNBQVMsR0FBR0EsWUFBZSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7RUFDekMsT0FBTyxVQUFVLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0lBQzFCLElBQUkzQixLQUFHLEdBQUc0QixHQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDOztJQUV6QixJQUFJNUIsS0FBRyxHQUFHLENBQUMsUUFBUSxFQUFFO01BQ25CNkIsS0FBVSxDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUM7TUFDbEMsSUFBSUMsR0FBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLFFBQVEsSUFBRUQsS0FBVSxDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEdBQUM7TUFDcEVFLFNBQWMsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7TUFDakMsWUFBWSxDQUFDLEdBQUcsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO01BQ3BDLE9BQU8sR0FBRyxDQUFDO0tBQ1osTUFBTSxJQUFJL0IsS0FBRyxHQUFHLFFBQVEsRUFBRTtNQUN6QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO01BQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztNQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7TUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO01BQ1gsT0FBTyxHQUFHLENBQUM7S0FDWixNQUFNO01BQ0w2QixLQUFVLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztNQUMxQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ3BCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDcEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNwQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHN0IsS0FBRyxDQUFDO01BQ2pCLE9BQU9ELFdBQVMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7S0FDNUI7R0FDRixDQUFDO0NBQ0gsRUFBRSxDQUFDOzs7Ozs7Ozs7Ozs7O0FBYUosSUFBVyxNQUFNLEdBQUcsWUFBWTtFQUM5QixJQUFJLEtBQUssR0FBRzVDLFFBQU0sRUFBRSxDQUFDO0VBQ3JCLElBQUksS0FBSyxHQUFHQSxRQUFNLEVBQUUsQ0FBQztFQUNyQixPQUFPLFVBQVUsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7SUFDbkMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3RCLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN0QixLQUFLLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMxQyxPQUFPLEdBQUcsQ0FBQztHQUNaLENBQUM7Q0FDSCxFQUFFLENBQUM7Ozs7Ozs7Ozs7OztBQVlKLElBQVcsT0FBTyxHQUFHLFlBQVk7RUFDL0IsSUFBSSxJQUFJLEdBQUc2RSxRQUFXLEVBQUUsQ0FBQztFQUN6QixPQUFPLFVBQVUsR0FBRyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFO0lBQ3JDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbkIsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNuQixJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ25CLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDaEIsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNoQixJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2hCLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNuQixJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbkIsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ25CLE9BQU9qQyxXQUFTLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztHQUM1QyxDQUFDO0NBQ0gsRUFBRTs7Ozs7Ozs7Ozs7Ozs7OztBQzltQkgsU0FBZ0I1QyxRQUFNLEdBQUc7RUFDdkIsSUFBSSxFQUFFLEdBQUcsSUFBSUosVUFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7RUFFcEMsSUFBSUEsVUFBbUIsSUFBSSxZQUFZLEVBQUU7SUFDdkMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNWLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDVixFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ1YsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNWLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDVixFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ1YsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztHQUNYOztFQUVELEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDVixPQUFPLEVBQUUsQ0FBQztDQUNYOzs7Ozs7Ozs7QUFTTSxTQUFTQyxPQUFLLENBQUMsQ0FBQyxFQUFFO0VBQ3ZCLElBQUksRUFBRSxHQUFHLElBQUlELFVBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDcEMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNiLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDYixFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2IsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNiLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDYixFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2IsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNiLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDYixPQUFPLEVBQUUsQ0FBQztDQUNYOzs7Ozs7Ozs7Ozs7Ozs7O0FBZ0JNLFNBQVNPLFlBQVUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFO0VBQ3pELElBQUksRUFBRSxHQUFHLElBQUlQLFVBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDcEMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztFQUNYLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7RUFDWCxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0VBQ1gsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztFQUNYLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7RUFDWCxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0VBQ1gsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztFQUNYLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7RUFDWCxPQUFPLEVBQUUsQ0FBQztDQUNYOzs7Ozs7Ozs7Ozs7Ozs7QUFlTSxTQUFTLDZCQUE2QixDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRTtFQUN4RSxJQUFJLEVBQUUsR0FBRyxJQUFJQSxVQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ3BDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7RUFDWCxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0VBQ1gsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztFQUNYLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7RUFDWCxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRztNQUNiLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRztNQUNiLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDO0VBQ2xCLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztFQUNwQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7RUFDcEMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0VBQ3BDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0VBQ3JDLE9BQU8sRUFBRSxDQUFDO0NBQ1g7Ozs7Ozs7Ozs7O0FBV0QsU0FBZ0JrRix5QkFBdUIsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtFQUNqRCxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRztNQUNmLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRztNQUNmLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRztNQUNmLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0VBQ1osR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztFQUNaLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7RUFDWixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0VBQ1osR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0VBQ3JDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztFQUNyQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7RUFDckMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7RUFDdEMsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7OztBQVVNLFNBQVN0RCxpQkFBZSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7RUFDdEMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0VBQ3BCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0VBQ3BCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0VBQ3BCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWCxPQUFPLEdBQUcsQ0FBQztDQUNaOzs7Ozs7Ozs7O0FBVU0sU0FBU2IsY0FBWSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7RUFDbkMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWCxPQUFPLEdBQUcsQ0FBQztDQUNaOzs7Ozs7Ozs7O0FBVU0sU0FBU29FLFVBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFF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QUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0VBQ2IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztFQUNiLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7RUFDYixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0VBQ2pELEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7RUFDakQsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztFQUNqRCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7RUFDbEQsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7OztBQVVELFNBQWdCa0IsU0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFO0VBQ25DLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNWLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRTtNQUMzQyxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUU7TUFDM0MsR0FBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFO01BQzNDLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0VBQ2hEeUQsU0FBWSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7RUFDMUIsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNaLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDWixFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ1osRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNaLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDO0VBQ25ELEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDO0VBQ25ELEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDO0VBQ25ELEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDO0VBQ25ELE9BQU8sR0FBRyxDQUFDO0NBQ1o7Ozs7Ozs7Ozs7QUFVRCxTQUFnQnhELFNBQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRTtFQUNuQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNWLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUU7TUFDM0MsR0FBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFO01BQzNDLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRTtNQUMzQyxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztFQUNoRHlELFNBQVksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0VBQzFCLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDWixFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ1osRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNaLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDWixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQztFQUNuRCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQztFQUNuRCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQztFQUNuRCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQztFQUNuRCxPQUFPLEdBQUcsQ0FBQztDQUNaOzs7Ozs7Ozs7O0FBVUQsU0FBZ0J4RCxTQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUU7RUFDbkMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNWLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsR0FBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFO01BQzNDLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRTtNQUMzQyxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUU7TUFDM0MsR0FBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7RUFDaER5RCxTQUFZLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztFQUMxQixFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ1osRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNaLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDWixFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ1osR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUM7RUFDbkQsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUM7RUFDbkQsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUM7RUFDbkQsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUM7RUFDbkQsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7OztBQVVELFNBQWdCLGtCQUFrQixDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0VBQzVDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7RUFDL0MsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7RUFDL0MsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7RUFDL0MsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7RUFDL0MsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNWLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDVixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ1YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNWLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0VBQy9DLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0VBQy9DLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0VBQy9DLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0VBQy9DLE9BQU8sR0FBRyxDQUFDO0NBQ1o7Ozs7Ozs7Ozs7QUFVRCxTQUFnQixtQkFBbUIsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtFQUM3QyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0VBQy9DLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0VBQy9DLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0VBQy9DLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0VBQy9DLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDVixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ1YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNWLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDVixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztFQUMvQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztFQUMvQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztFQUMvQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztFQUMvQyxPQUFPLEdBQUcsQ0FBQztDQUNaOzs7Ozs7Ozs7OztBQVdELFNBQWdCLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRTs7RUFFbEQsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHeEYsT0FBZ0IsRUFBRTtJQUNwQyxPQUFPRSxNQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO0dBQ3JCOztFQUVELElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUN0RixHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztFQUNoQixJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ3RCLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDO0VBQ2xDLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDO0VBQ2xDLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDO0VBQ2xDLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDdkIsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNWLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1YsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVixHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2YsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUM7RUFDbkQsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUM7RUFDbkQsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUM7RUFDbkQsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUM7RUFDbkQsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7RUFDL0MsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7RUFDL0MsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7RUFDL0MsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7RUFDL0MsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7Ozs7QUFXRCxTQUFnQmMsS0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0VBQzdCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ3JCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ3JCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ3JCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ3JCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ3JCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ3JCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ3JCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ3JCLE9BQU8sR0FBRyxDQUFDO0NBQ1o7Ozs7Ozs7Ozs7QUFVRCxTQUFnQlIsVUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0VBQ2xDLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVixHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNWLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1YsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVixHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNWLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1YsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVixHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNWLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1YsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVixHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNWLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1YsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVixHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNWLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1YsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNmLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0VBQ3ZELEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0VBQ3ZELEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0VBQ3ZELEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0VBQ3ZELEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7RUFDdkcsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztFQUN2RyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0VBQ3ZHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7RUFDdkcsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7O0FBTU0sSUFBSWEsS0FBRyxHQUFHYixVQUFRLENBQUM7Ozs7Ozs7Ozs7O0FBVzFCLFNBQWdCRSxPQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7RUFDL0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDbEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDbEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDbEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDbEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDbEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDbEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDbEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDbEIsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7OztBQVVNLElBQUlvQyxLQUFHLEdBQUcyQyxLQUFRLENBQUM7Ozs7Ozs7Ozs7OztBQVkxQixTQUFnQnpDLE1BQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7RUFDakMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNmLElBQUlGLEtBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBQztFQUMxQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQzlCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDOUIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUM5QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQzlCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDOUIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUM5QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQzlCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDOUIsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7O0FBU00sU0FBU3hDLFFBQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0VBQzdCLElBQUksS0FBSyxHQUFHb0MsZUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQzdCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7RUFDdkIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztFQUN2QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0VBQ3ZCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0VBQ3RCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7RUFDdkIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FB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QUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0NBQzdJOzs7Ozs7Ozs7QUFTTSxTQUFTckIsUUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUU7RUFDM0IsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZCxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUlDLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUlBLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUlBLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUlBLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUlBLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUlBLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FB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QUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDckIsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7OztBQVVELFNBQWdCVCxVQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7RUFDbEMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDckIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDckIsT0FBTyxHQUFHLENBQUM7Q0FDWjs7Ozs7Ozs7OztBQVVELFNBQWdCd0IsUUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0VBQ2hDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ3JCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ3JCLE9BQU8sR0FBRyxDQUFDO0NBQ1o7Ozs7Ozs7OztBQVNNLFNBQVNDLE1BQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0VBQzNCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ3pCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ3pCLE9BQU8sR0FBRyxDQUFDO0NBQ1o7Ozs7Ozs7OztBQVNNLFNBQVNDLE9BQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0VBQzVCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMs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QyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckUsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckUsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckUsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7O0lBRzFFLElBQUksSUFBSSxHQUFHLE1BQU0sQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDO1FBQ2hELElBQUksR0FBRyxNQUFNLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDOztJQUVyRCxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsS0FBSztRQUNiLENBQUMsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDOzs7SUFHbEIsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxFQUFFO1FBQ3pDLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxJQUFJO1lBQ2hDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdkQsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUUsT0FBTyxLQUFLLEdBQUM7UUFDL0MsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUM7O1FBRVosSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLElBQUk7WUFDaEMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN2RCxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBRSxPQUFPLEtBQUssR0FBQztRQUMvQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQztLQUNmOzs7SUFHRCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksRUFBRTtRQUNyQixJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsSUFBSTtZQUNoQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3ZELElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFFLE9BQU8sS0FBSyxHQUFDO1FBQy9DLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDO0tBQ2Y7OztJQUdELE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxFQUFFO1FBQ3JCLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxJQUFJO1lBQ2hDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdkQsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUUsT0FBTyxLQUFLLEdBQUM7UUFDL0MsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUM7S0FDZjs7SUFFRCxPQUFPLElBQUksQ0FBQztDQUNmOzs7QUFHRCxTQUFTLHNCQUFzQixDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFO0lBQ25ELElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQztJQUNkLEdBQUc7UUFDQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSTtZQUNWLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQzs7UUFFcEIsSUFBSSxDQUFDQSxRQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksYUFBYSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxhQUFhLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFOztZQUU1RixTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUM7WUFDMUIsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDO1lBQzFCLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQzs7O1lBRzFCLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNkLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7O1lBRW5CLENBQUMsR0FBRyxLQUFLLEdBQUcsQ0FBQyxDQUFDO1NBQ2pCO1FBQ0QsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7S0FDZCxRQUFRLENBQUMsS0FBSyxLQUFLLEVBQUU7O0lBRXRCLE9BQU8sQ0FBQyxDQUFDO0NBQ1o7OztBQUdELFNBQVMsV0FBVyxDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFOztJQUU3RCxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUM7SUFDZCxHQUFHO1FBQ0MsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDcEIsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksRUFBRTtZQUNqQixJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxlQUFlLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFOztnQkFFdEMsSUFBSSxDQUFDLEdBQUcsWUFBWSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQzs7O2dCQUczQixDQUFDLEdBQUcsWUFBWSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzVCLENBQUMsR0FBRyxZQUFZLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQzs7O2dCQUc1QixZQUFZLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztnQkFDckQsWUFBWSxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQ3JELE9BQU87YUFDVjtZQUNELENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDO1NBQ2Q7UUFDRCxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQztLQUNkLFFBQVEsQ0FBQyxLQUFLLEtBQUssRUFBRTtDQUN6Qjs7O0FBR0QsU0FBUyxjQUFjLENBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFO0lBQ3ZELElBQUksS0FBSyxHQUFHLEVBQUU7UUFDVixDQUFDLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDOztJQUU3QixLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUNoRCxLQUFLLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUM3QixHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsV0FBVyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUMzRCxJQUFJLEdBQUcsVUFBVSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNoRCxJQUFJLElBQUksS0FBSyxJQUFJLENBQUMsSUFBSSxJQUFFLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxHQUFDO1FBQzVDLEtBQUssQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7S0FDakM7O0lBRUQsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQzs7O0lBR3JCLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUMvQixhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ25DLFNBQVMsR0FBRyxZQUFZLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUN2RDs7SUFFRCxPQUFPLFNBQVMsQ0FBQztDQUNwQjs7QUFFRCxTQUFTLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFO0lBQ3BCLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0NBQ3BCOzs7QUFHRCxTQUFTLGFBQWEsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFO0lBQ3BDLFNBQVMsR0FBRyxjQUFjLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQzVDLElBQUksU0FBUyxFQUFFO1FBQ1gsSUFBSSxDQUFDLEdBQUcsWUFBWSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN0QyxZQUFZLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUMzQjtDQUNKOzs7QUFHRCxTQUFTLGNBQWMsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFO0lBQ3JDLElBQUksQ0FBQyxHQUFHLFNBQVM7UUFDYixFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7UUFDWCxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7UUFDWCxFQUFFLEdBQUcsQ0FBQyxRQUFRO1FBQ2QsQ0FBQyxDQUFDOzs7O0lBSU4sR0FBRztRQUNDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDakQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDL0QsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUU7Z0JBQ25CLEVBQUUsR0FBRyxDQUFDLENBQUM7Z0JBQ1AsSUFBSSxDQUFDLEtBQUssRUFBRSxFQUFFO29CQUNWLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUUsT0FBTyxDQUFDLEdBQUM7b0JBQ3pCLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFFLE9BQU8sQ0FBQyxDQUFDLElBQUksR0FBQztpQkFDdEM7Z0JBQ0QsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7YUFDbkM7U0FDSjtRQUNELENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDO0tBQ2QsUUFBUSxDQUFDLEtBQUssU0FBUyxFQUFFOztJQUUxQixJQUFJLENBQUMsQ0FBQyxJQUFFLE9BQU8sSUFBSSxHQUFDOztJQUVwQixJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUUsT0FBTyxDQUFDLENBQUMsSUFBSSxHQUFDOzs7Ozs7SUFNN0IsSUFBSSxJQUFJLEdBQUcsQ0FBQztRQUNSLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNSLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNSLE1BQU0sR0FBRyxRQUFRO1FBQ2pCLEdBQUcsQ0FBQzs7SUFFUixDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQzs7SUFFWCxPQUFPLENBQUMsS0FBSyxJQUFJLEVBQUU7UUFDZixJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztnQkFDaEMsZUFBZSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFOztZQUVyRixHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7O1lBRXRDLElBQUksQ0FBQyxHQUFHLEdBQUcsTUFBTSxLQUFLLEdBQUcsS0FBSyxNQUFNLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssYUFBYSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsRUFBRTtnQkFDM0UsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDTixNQUFNLEdBQUcsR0FBRyxDQUFDO2FBQ2hCO1NBQ0o7O1FBRUQsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7S0FDZDs7SUFFRCxPQUFPLENBQUMsQ0FBQztDQUNaOzs7QUFHRCxTQUFTLFVBQVUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUU7SUFDNUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDO0lBQ2QsR0FBRztRQUNDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLElBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLEdBQUM7UUFDOUQsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ2pCLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUNqQixDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQztLQUNkLFFBQVEsQ0FBQyxLQUFLLEtBQUssRUFBRTs7SUFFdEIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO0lBQ3JCLENBQUMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDOztJQUVmLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztDQUNqQjs7OztBQUlELFNBQVMsVUFBVSxDQUFDLElBQUksRUFBRTtJQUN0QixJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxLQUFLO1FBQ3pDLE1BQU0sR0FBRyxDQUFDLENBQUM7O0lBRWYsR0FBRztRQUNDLENBQUMsR0FBRyxJQUFJLENBQUM7UUFDVCxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ1osSUFBSSxHQUFHLElBQUksQ0FBQztRQUNaLFNBQVMsR0FBRyxDQUFDLENBQUM7O1FBRWQsT0FBTyxDQUFDLEVBQUU7WUFDTixTQUFTLEVBQUUsQ0FBQztZQUNaLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDTixLQUFLLEdBQUcsQ0FBQyxDQUFDO1lBQ1YsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ3pCLEtBQUssRUFBRSxDQUFDO2dCQUNSLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDO2dCQUNaLElBQUksQ0FBQyxDQUFDLElBQUUsUUFBTTthQUNqQjtZQUNELEtBQUssR0FBRyxNQUFNLENBQUM7O1lBRWYsT0FBTyxLQUFLLEdBQUcsQ0FBQyxLQUFLLEtBQUssR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUU7O2dCQUVsQyxJQUFJLEtBQUssS0FBSyxDQUFDLEtBQUssS0FBSyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtvQkFDbEQsQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDTixDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQztvQkFDWixLQUFLLEVBQUUsQ0FBQztpQkFDWCxNQUFNO29CQUNILENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQ04sQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUM7b0JBQ1osS0FBSyxFQUFFLENBQUM7aUJBQ1g7O2dCQUVELElBQUksSUFBSSxJQUFFLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxHQUFDO3VCQUNwQixJQUFJLEdBQUcsQ0FBQyxHQUFDOztnQkFFZCxDQUFDLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztnQkFDZixJQUFJLEdBQUcsQ0FBQyxDQUFDO2FBQ1o7O1lBRUQsQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUNUOztRQUVELElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO1FBQ2xCLE1BQU0sSUFBSSxDQUFDLENBQUM7O0tBRWYsUUFBUSxTQUFTLEdBQUcsQ0FBQyxFQUFFOztJQUV4QixPQUFPLElBQUksQ0FBQztDQUNmOzs7QUFHRCxTQUFTLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFOztJQUV2QyxDQUFDLEdBQUcsS0FBSyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxPQUFPLENBQUM7SUFDakMsQ0FBQyxHQUFHLEtBQUssSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsT0FBTyxDQUFDOztJQUVqQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLFVBQVUsQ0FBQztJQUNoQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLFVBQVUsQ0FBQztJQUNoQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLFVBQVUsQ0FBQztJQUNoQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLFVBQVUsQ0FBQzs7SUFFaEMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxVQUFVLENBQUM7SUFDaEMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxVQUFVLENBQUM7SUFDaEMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxVQUFVLENBQUM7SUFDaEMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxVQUFVLENBQUM7O0lBRWhDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztDQUN2Qjs7O0FBR0QsU0FBUyxXQUFXLENBQUMsS0FBSyxFQUFFO0lBQ3hCLElBQUksQ0FBQyxHQUFHLEtBQUs7UUFDVCxRQUFRLEdBQUcsS0FBSyxDQUFDO0lBQ3JCLEdBQUc7UUFDQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUUsUUFBUSxHQUFHLENBQUMsR0FBQztRQUMvRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQztLQUNkLFFBQVEsQ0FBQyxLQUFLLEtBQUssRUFBRTs7SUFFdEIsT0FBTyxRQUFRLENBQUM7Q0FDbkI7OztBQUdELFNBQVMsZUFBZSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUU7SUFDckQsT0FBTyxDQUFDLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQztXQUNsRCxDQUFDLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQztXQUNsRCxDQUFDLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO0NBQzdEOzs7QUFHRCxTQUFTLGVBQWUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFO0lBQzNCLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztXQUNoRSxhQUFhLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLGFBQWEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksWUFBWSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztDQUMzRTs7O0FBR0QsU0FBUyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7SUFDbkIsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztDQUNoRTs7O0FBR0QsU0FBU0EsUUFBTSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUU7SUFDcEIsT0FBTyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO0NBQ3pDOzs7QUFHRCxTQUFTLFVBQVUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUU7SUFDaEMsSUFBSSxDQUFDQSxRQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxJQUFJQSxRQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQztTQUNoQ0EsUUFBTSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsSUFBSUEsUUFBTSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFFLE9BQU8sSUFBSSxHQUFDO0lBQ3BELE9BQU8sSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLElBQUksQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUM7V0FDN0MsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLElBQUksQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztDQUN4RDs7O0FBR0QsU0FBUyxpQkFBaUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFO0lBQzdCLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNWLEdBQUc7UUFDQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztnQkFDOUQsVUFBVSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBRSxPQUFPLElBQUksR0FBQztRQUNqRCxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQztLQUNkLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRTs7SUFFbEIsT0FBTyxLQUFLLENBQUM7Q0FDaEI7OztBQUdELFNBQVMsYUFBYSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUU7SUFDekIsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7UUFDOUIsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUNsRCxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7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QUFLLENBQUM7SUFDN0JBLElBQU0sS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7SUFDMUJBLElBQU0sS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7SUFDMUJBLElBQU0sS0FBSyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUM7SUFDM0JBLElBQU0sS0FBSyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUM7O0lBRTNCLEtBQUssc0JBQVcsdUNBQVEsRUFBRTtRQUFyQkEsSUFBTTs7UUFDUEEsSUFBTSxRQUFRLEdBQUcsRUFBRSxDQUFDO1FBQ3BCQSxJQUFNLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDbkIsS0FBSyxrQkFBVywwQkFBQyxFQUFFO1lBQWRBLElBQU07O1lBQ1BBLElBQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDZEEsSUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7WUFFZEEsSUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN2Q0EsSUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN2Q0EsSUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN2Q0EsSUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FB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QUM7UUFDM0IsU0FBUyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQzs7UUFFdkIsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN0QyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlFLE9BQU8sQ0FBQyxDQUFDO0tBQ1o7O0lBRUQsU0FBUyxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUU7UUFDakNBLElBQU0sS0FBSyxHQUFHLE9BQU8sR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakUsUUFBVSxJQUFJLFVBQUksS0FBSyxDQUFDLEVBQUMsVUFBSSxLQUFLLENBQUMsQ0FBQyxHQUFHO0tBQzFDOztJQUVELEtBQUtELElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUN0Q0MsSUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVCQSxJQUFNLElBQUksR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDO1FBQzlCQSxJQUFNLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEdBQUcsSUFBSSxDQUFDOztRQUUzRCxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ1AsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ1AsU0FBUztTQUNaOztRQUVEQSxJQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQztZQUM5QixRQUFRLEdBQUcsTUFBTSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7O1FBRXhDLElBQUksQ0FBQyxPQUFPLElBQUksVUFBVSxNQUFNLFFBQVEsSUFBSSxTQUFTLENBQUMsS0FBSyxVQUFVLENBQUMsT0FBTyxDQUFDLEtBQUssU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUU7O1lBRXJHQSxJQUFNLENBQUMsR0FBRyxhQUFhLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNqREEsSUFBTSxDQUFDLEdBQUcsY0FBYyxDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDOztZQUV4RSxPQUFPLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUMxQixPQUFPLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQzs7WUFFNUIsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUMvRCxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxJQUFJLElBQUksTUFBTSxDQUFDOztTQUU1QyxNQUFNLElBQUksT0FBTyxJQUFJLFVBQVUsRUFBRTs7WUFFOUIsY0FBYyxDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7O1NBRTNDLE1BQU0sSUFBSSxRQUFRLElBQUksU0FBUyxFQUFFOztZQUU5QixhQUFhLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQzs7U0FFMUMsTUFBTTs7WUFFSCxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDUCxTQUFTLENBQUMsT0FBTyxDQUFDLEdBQUcsV0FBVyxHQUFHLENBQUMsQ0FBQztZQUNyQyxVQUFVLENBQUMsUUFBUSxDQUFDLEdBQUcsV0FBVyxHQUFHLENBQUMsQ0FBQztTQUMxQztLQUNKOztJQUVELE9BQU8sY0FBYyxDQUFDLE1BQU0sV0FBRSxDQUFDLEVBQUUsU0FBRyxDQUFDLENBQUMsV0FBUSxDQUFDLENBQUM7Q0FDbkQ7Ozs7QUMzRUQsSUFBYSx3QkFBd0IsR0FBRztJQUNwQyxHQUFHLEVBQUUsR0FBRztJQUNSLEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsR0FBRztJQUNSLEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsR0FBRztJQUNSLEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsR0FBRztJQUNSLEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsR0FBRztJQUNSLEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsR0FBRztJQUNSLEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsR0FBRztJQUNSLEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixJQUFJLEVBQUUsR0FBRztJQUNULEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsR0FBRztJQUNSLEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsR0FBRztJQUNSLEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsR0FBRztJQUNSLEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsR0FBRztJQUNSLEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsR0FBRztJQUNSLEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsR0FBRztJQUNSLEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsR0FBRztJQUNSLEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsR0FBRztJQUNSLEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsR0FBRztJQUNSLEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsR0FBRztJQUNSLEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsR0FBRztJQUNSLEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsR0FBRztJQUNSLEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsR0FBRztJQUNSLEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsR0FBRztJQUNSLEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsR0FBRztJQUNSLEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsR0FBRztJQUNSLEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsR0FBRztJQUNSLEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsR0FBRztJQUNSLEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsR0FBRztJQUNSLEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsR0FBRztJQUNSLEdBQUcsRUFBRSxHQUFH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WSxHQUFHLFVBQVUsTUFBTSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRTtFQUMzRCxJQUFJLENBQUMsRUFBRSxFQUFDO0VBQ1IsSUFBSSxJQUFJLEdBQUcsTUFBTSxHQUFHLENBQUMsR0FBRyxJQUFJLEdBQUcsRUFBQztFQUNoQyxJQUFJLElBQUksR0FBRyxDQUFDLENBQUMsSUFBSSxJQUFJLElBQUksRUFBQztFQUMxQixJQUFJLEtBQUssR0FBRyxJQUFJLElBQUksRUFBQztFQUNyQixJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUM7RUFDZCxJQUFJLENBQUMsR0FBRyxJQUFJLElBQUksTUFBTSxHQUFHLENBQUMsSUFBSSxFQUFDO0VBQy9CLElBQUksQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFDO0VBQ3JCLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFDOztFQUUxQixDQUFDLElBQUksRUFBQzs7RUFFTixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFDO0VBQzdCLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBQztFQUNkLEtBQUssSUFBSSxLQUFJO0VBQ2IsT0FBTyxLQUFLLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLElBQUksQ0FBQyxFQUFFLEVBQUU7O0VBRTFFLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUM7RUFDN0IsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFDO0VBQ2QsS0FBSyxJQUFJLEtBQUk7RUFDYixPQUFPLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssSUFBSSxDQUFDLEVBQUUsRUFBRTs7RUFFMUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFO0lBQ1gsQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFLO0dBQ2QsTUFBTSxJQUFJLENBQUMsS0FBSyxJQUFJLEVBQUU7SUFDckIsT0FBTyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxRQUFRLENBQUM7R0FDM0MsTUFBTTtJQUNMLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFDO0lBQ3pCLENBQUMsR0FBRyxDQUFDLEdBQUcsTUFBSztHQUNkO0VBQ0QsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUM7RUFDaEQ7O0FBRUQsU0FBYSxHQUFHLFVBQVUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUU7RUFDbkUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUM7RUFDWCxJQUFJLElBQUksR0FBRyxNQUFNLEdBQUcsQ0FBQyxHQUFHLElBQUksR0FBRyxFQUFDO0VBQ2hDLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQyxJQUFJLElBQUksSUFBSSxFQUFDO0VBQzFCLElBQUksS0FBSyxHQUFHLElBQUksSUFBSSxFQUFDO0VBQ3JCLElBQUksRUFBRSxJQUFJLElBQUksS0FBSyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBQztFQUNoRSxJQUFJLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLE1BQU0sR0FBRyxDQUFDLEVBQUM7RUFDL0IsSUFBSSxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUM7RUFDckIsSUFBSSxDQUFDLEdBQUcsS0FBSyxHQUFHLENBQUMsS0FBSyxLQUFLLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUM7O0VBRTNELEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBQzs7RUFFdkIsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxLQUFLLFFBQVEsRUFBRTtJQUN0QyxDQUFDLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFDO0lBQ3hCLENBQUMsR0FBRyxLQUFJO0dBQ1QsTUFBTTtJQUNMLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBQztJQUMxQyxJQUFJLEtBQUssSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRTtNQUNyQyxDQUFDLEdBQUU7TUFDSCxDQUFDLElBQUksRUFBQztLQUNQO0lBQ0QsSUFBSSxDQUFDLEdBQUcsS0FBSyxJQUFJLENBQUMsRUFBRTtNQUNsQixLQUFLLElBQUksRUFBRSxHQUFHLEVBQUM7S0FDaEIsTUFBTTtNQUNMLEtBQUssSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssRUFBQztLQUNyQztJQUNELElBQUksS0FBSyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUU7TUFDbEIsQ0FBQyxHQUFFO01BQ0gsQ0FBQyxJQUFJLEVBQUM7S0FDUDs7SUFFRCxJQUFJLENBQUMsR0FBRyxLQUFLLElBQUksSUFB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QUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksSUFBRSxPQUFPLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFDO0lBQzdFLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksSUFBRSxPQUFPLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFDO0lBQzdFLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksSUFBRSxPQUFPLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFDO0lBQzdFLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksSUFBRSxPQUFPLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFDOztJQUU3RSxNQUFNLElBQUksS0FBSyxDQUFDLHdDQUF3QyxDQUFDLENBQUM7Q0FDN0Q7O0FBRUQsU0FBUyxhQUFhLENBQUMsR0FBRyxFQUFFO0lBQ3hCLE9BQU8sR0FBRyxDQUFDLElBQUksS0FBSyxHQUFHLENBQUMsS0FBSztRQUN6QixHQUFHLENBQUMsVUFBVSxFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztDQUNoRDs7QUFF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LENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksTUFBTSxDQUFDLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksSUFBRSxTQUFPO0lBQ2xGLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksTUFBTSxDQUFDLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksSUFBRSxTQUFPO0lBQ2xGLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksTUFBTSxDQUFDLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksSUFBRSxTQUFPO0lBQ2xGLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksTUFBTSxDQUFDLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksSUFBRSxTQUFPO0lBQ2xGLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQztDQUNyQzs7QUFFRCxTQUFTLHNCQUFzQixDQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFO0lBQ2hELElBQUksUUFBUTtRQUNSLEdBQUcsSUFBSSxNQUFNLEdBQUcsQ0FBQztRQUNqQixHQUFHLElBQUksUUFBUSxHQUFHLENBQUM7UUFDbkIsR0FBRyxJQUFJLFNBQVMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7O0lBR3JFLEdBQUcsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDdEIsS0FBSyxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksUUFBUSxFQUFFLENBQUMsRUFBRSxJQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUM7Q0FDcEY7O0FBRUQsU0FBUyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLEVBQUUsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLElBQUUsR0FBRyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBQyxJQUFJO0FBQzFHLFNBQVMsa0JBQWtCLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxFQUFFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxJQUFFLEdBQUcsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUMsR0FBRztBQUMxRyxTQUFTLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxHQUFHLEtBQUssRUFBRSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsSUFBRSxHQUFHLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFDLEtBQUs7QUFDMUcsU0FBUyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLEVBQUUsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLElBQUUsR0FBRyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBQyxJQUFJO0FBQzFHLFNBQVMsa0JBQWtCLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxFQUFFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxJQUFFLEdBQUcsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUMsR0FBRztBQUMxRyxTQUFTLGtCQUFrQixDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsRUFBRSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsSUFBRSxHQUFHLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFDLEdBQUc7QUFDMUcsU0FBUyxtQkFBbUIsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLElBQUUsR0FBRyxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBQyxFQUFFO0FBQzFHLFNBQVMsa0JBQWtCLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxFQUFFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxJQUFFLEdBQUcsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUMsR0FBRztBQUMxRyxTQUFTLG1CQUFtQixDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsSUFBRSxHQUFHLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFDLEVBQUU7Ozs7QUFJMUcsU0FBUyxVQUFVLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRTtJQUMxQixPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO1NBQ1osR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDbEIsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7U0FDbkIsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQztDQUNsQzs7QUFFRCxTQUFTLFVBQVUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRTtJQUMvQixHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBQ2YsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDM0IsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsSUFBSSxHQUFHLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDNUIsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsSUFBSSxHQUFHLEtBQUssRUFBRSxDQUFDLENBQUM7Q0FDL0I7O0FBRUQsU0FBUyxTQUFTLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRTtJQUN6QixPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO1NBQ1osR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDbEIsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7U0FDbkIsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztDQUM1Qjs7QUFFRCxTQUFTLFFBQVEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdB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R0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUMxQixLQUFLQSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUM5QixJQUFVLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztZQUN0QkMsSUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNoQixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ25FO0tBQ0o7Ozs7O0lBS0QsS0FBS0QsSUFBSWtOLEdBQUMsR0FBRyxDQUFDLEVBQUVBLEdBQUMsR0FBRyxHQUFHLEVBQUVBLEdBQUMsRUFBRSxFQUFFOztRQUUxQixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFQSxHQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUVBLEdBQUMsQ0FBQyxDQUFDLENBQUM7O1FBRWhDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFQSxHQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFQSxHQUFDLENBQUMsQ0FBQyxDQUFDOztRQUV2QyxJQUFJLENBQUMsR0FBRyxDQUFDQSxHQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQ0EsR0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7O1FBRWhDLElBQUksQ0FBQyxHQUFHLENBQUNBLEdBQUMsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQ0EsR0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQzFDOztJQUVELElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyQyxJQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM1QyxJQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM1QyxJQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2xEOztBQUVMLGtCQUFJLG9CQUFJLENBQUMsTUFBVSxDQUFDLE1BQVUsS0FBSyxNQUFVO0lBQ3JDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsS0FBSyxDQUFDO0VBQzlDOztBQUVMLGtCQUFJLG9CQUFJLENBQUMsTUFBVSxDQUFDLE1BQVU7SUFDdEIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0VBQzdDOztBQUVMLGtCQUFJLHNCQUFLLENBQUMsTUFBVSxDQUFDLE1BQVU7SUFDdkIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsR0FB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WSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xDLEtBQUtELElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUN2Q0MsSUFBTSxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLElBQUUsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUM7UUFDakMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksSUFBRSxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBQztRQUNqQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxJQUFFLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFDO1FBQ2pDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLElBQUUsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUM7S0FDcEM7O0lBRURBLElBQU0sS0FBSyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7SUFDMUJBLElBQU0sTUFBTSxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7SUFDM0JBLElBQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3pDRCxJQUFJLENBQUMsR0FBRyxRQUFRLEdBQUcsQ0FBQyxDQUFDOzs7SUFHckJDLElBQU0sU0FBUyxHQUFHLElBQUlnTyxTQUFLLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxDQUFDOztJQUU1QyxJQUFJLFFBQVEsS0FBSyxDQUFDLElBQUUsT0FBTyxJQUFJOUssYUFBSyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsR0FBQzs7O0lBR2pELEtBQUtuRCxJQUFJLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxHQUFHLElBQUksRUFBRSxD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RCxLQUFLLENBQUMsRUFBRSxFQUFFLEtBQUssR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQzs7RUFFekMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxNQUFNLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLE1BQU0sS0FBSyxFQUFFLENBQUMsSUFBSSxVQUFVLENBQUM7RUFDakYsRUFBRSxHQUFHLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7RUFDOUIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxNQUFNLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLE1BQU0sS0FBSyxFQUFFLENBQUMsSUFBSSxVQUFVLENBQUM7RUFDakYsRUFBRSxJQUFJLEVBQUUsQ0FBQztFQUNUOztDQUVELEVBQUUsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDOztDQUVqQixFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQztDQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLE1BQU0sSUFBSSxVQUFVLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxVQUFVLElBQUksTUFBTSxLQUFLLEVBQUUsQ0FBQyxJQUFJLFVBQVUsQ0FBQztDQUNqRyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQztDQUNoQixFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLE1BQU0sSUFBSSxVQUFVLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxVQUFVLElBQUksTUFBTSxLQUFLLEVBQUUsQ0FBQyxLQUFLLFVBQVUsQ0FBQztDQUNuRyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQzs7Q0FFaEIsT0FBTyxFQUFF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QUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUU7SUFDOUIsSUFBSSxJQUFJLEdBQUcsUUFBUSxDQUFDLENBQUMsRUFBQztJQUN0QixJQUFJLEtBQUssR0FBRyxFQUFDO0lBQ2IsSUFBSSxJQUFJLEtBQUssQ0FBQyxFQUFFO01BQ2QsS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFNO0tBQ3BCO0lBQ0QsR0FBRyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxFQUFDOztJQUVsQyxJQUFJLFNBQVMsR0FBRyxJQUFJLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFNO0lBQzFELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLEVBQUUsQ0FBQyxFQUFFLEVBQUU7TUFDbEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksS0FBSyxDQUFDLEVBQUU7UUFDekIsR0FBRyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLFNBQVMsR0FBRyxDQUFDLENBQUMsRUFBQztPQUMzQztNQUNELElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBQztNQUN0QixJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUM7TUFDdEIsR0FBRyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEVBQUM7TUFDM0IsR0FBRyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEVBQUM7TUFDM0IsQ0FBQyxJQUFJLEdBQUU7TUFDUCxDQUFDLElBQUksR0FBRTtLQUNSO0lBQ0QsSUFBSSxJQUFJLEtBQUssQ0FBQyxFQUFFO01BQ2QsR0FBRyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFDO0tBQy9CO0dBQ0Y7Q0FDRjs7QUFFRCxTQUFTLFVBQVUsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFO0VBQy9CLElBQUksSUFBSSxHQUFHLE9BQU8sTUFBSztFQUN2QixJQUFJLElBQUksS0FBSyxRQUFRLEVBQUU7SUFDckIsR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUM7R0FDL0IsTUFBTSxJQUFJLElBQUksS0FBSyxTQUFTLEVBQUU7SUFDN0IsR0FBRyxDQUFDLGlCQUFpQixDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUM7R0FDaEMsTUFBTSxJQUFJLElBQUksS0FBSyxRQUFRLEVBQUU7SUFDNUIsSUFBSSxLQUFLLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRTtNQUNuQixHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBQztLQUMvQixNQUFNLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRTtNQUNwQixHQUFHLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBQztLQUNoQyxNQUFNO01BQ0wsR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUM7S0FDL0I7R0FDRjtDQUNGOzs7OztBQzlLYyxTQUFTLE1BQU0sQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRTtJQUN0RSxJQUFJLEtBQUssR0FBRyxJQUFJLElBQUksUUFBUSxJQUFFLFNBQU87O0lBRXJDbFEsSUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsS0FBSyxLQUFLLENBQUMsQ0FBQzs7SUFFOUIsTUFBTSxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDOztJQUUvQyxNQUFNLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3RELE1BQU0sQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEtBQUssRUFBRSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7Q0FDMUQ7O0FBRUQsU0FBUyxNQUFNLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUU7O0lBRTlDLE9BQU8sS0FBSyxHQUFHLElBQUksRUFBRTtRQUNqQixJQUFJLEtBQUssR0FBRyxJQUFJLEdBQUcsR0FBRyxFQUFFO1lBQ3BCQSxJQUFNLENBQUMsR0FBRyxLQUFLLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQztZQUMzQkEsSUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUM7WUFDdkJBLElBQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdEJBLElBQU0sQ0FBQyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDcENBLElBQU0sRUFBRSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMzRUEsSUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUMvREEsSUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN2RSxNQUFNLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQztTQUNsRDs7UUFFREEsSUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFDOUJELElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQztRQUNiQSxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUM7O1FBRWQsUUFBUSxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQy9CLElBQUksTUFBTSxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFFLFFBQVEsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsR0FBQzs7UUFFcEUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ1YsUUFBUSxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzVCLENBQUMsRUFBRSxDQUFDO1lBQ0osQ0FBQyxFQUFFLENBQUM7WUFDSixPQUFPLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBRSxDQUFDLEVBQUUsR0FBQztZQUNwQyxPQUFPLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBRSxDQUFDLEVBQUUsR0FBQztTQUN2Qzs7UUFFRCxJQUFJLE1BQU0sQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBRSxRQUFRLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUM7YUFDNUQ7WUFDRCxDQUFDLEVBQUUsQ0FBQztZQUNK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LE1BQU0sR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLENBQUM7SUFDM0QsSUFBVSxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BEQSxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLENBQUM7SUFDbkYsSUFBVSxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDOztJQUVwRCxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxFQUFFO1FBQzFCLE1BQU0sR0FBRyxDQUFDLEdBQUcsQ0FBQztRQUNsQixNQUFVLEdBQUcsR0FBRyxDQUFDO0tBQ2hCLE1BQU0sSUFBSSxNQUFNLEdBQUcsTUFBTSxFQUFFO1FBQzVCLElBQVUsVUFBVSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxNQUFNLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUM3RSxJQUFVLFVBQVUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUMxRSxPQUFPLFVBQVUsQ0FBQyxNQUFNLENB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T0FBTyxFQUFFLElBQUk7UUFDYixVQUFVLEVBQUUsT0FBTyxDQUFDLEVBQUU7UUFDdEIsV0FBVyxFQUFFLEtBQUs7UUFDbEIsdUJBQXVCLEVBQUUsTUFBTTtLQUNsQyxDQUFDLENBQUM7Q0FDTjs7O0FBR0QsU0FBUyxJQUFJLENBQUMsR0FBRyxFQUFFO0lBQ2YsT0FBTyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztDQUMxQjtBQUNELFNBQVMsSUFBSSxDQUFDLEdBQUcsRUFBRTtJQUNmQSxJQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDO0lBQzFDQSxJQUFNLENBQUMsSUFBSSxHQUFHLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNuRSxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztDQUNwQzs7O0FBR0QsU0FBUyxJQUFJLENBQUMsQ0FBQyxFQUFFO0lBQ2IsT0FBTyxDQUFDLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO0NBQzFCO0FBQ0QsU0FBUyxJQUFJLENBQUMsQ0FBQyxFQUFFO0lBQ2JBLElBQU0sRUFBRSxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksSUFBSSxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUM7SUFDM0MsT0FBTyxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7Q0FDdkQ7O0FBRUQsU0FBUyxNQUFNLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRTtJQUN2QixLQUFL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RUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRTs7SUFFcEUsSUFBSSxLQUFLLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzNCLElBQUksU0FBUyxHQUFHLElBQUksS0FBSyxDQUFDLEdBQUcsVUFBVSxHQUFHLFVBQVUsQ0FBQztJQUNyRCxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3JCLElBQUksTUFBTSxFQUFFLENBQUMsQ0FBQzs7SUFFZCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRTtRQUN6QyxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakIsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNyQixJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3JCLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDckIsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNyQixJQUFJLENBQUMsR0FBRyxJQUFJLEtBQUssQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7UUFDN0IsSUFBSSxDQUFDLEdBQUcsSUFBSSxLQUFLLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO1FBQzdCLElBQUksTUFBTSxHQUFHLEtBQUssQ0FBQzs7UUFFbkIsSUFBSSxZQUFZLElBQUUsTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFD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SSxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUNsQyxPQUFPO0tBQ1Y7O0lBRUQsSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDOztJQUVkLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUU7UUFDckMsSUFBSSxTQUFTLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsV0FBVyxFQUFFO1lBQzlDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUNyQixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ25CLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQzFCO1FBQ0QsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO0tBQ3BCOztJQUVELElBQUksU0FBUyxJQUFFc1EsUUFBTSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsR0FBQzs7SUFFckMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztDQUNyQjs7QUFFRCxTQUFTQSxRQUFNLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRTtJQUM3QixJQUFJLElBQUksR0FBRyxDQUFDLENBQUM7SUFDYixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRTtRQUNwRSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFD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LEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzdFLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztRQUM3RSxRQUFRLEdBQUcsSUFBSSxDQUFDOztRQUVoQixJQUFJLElBQUksRUFBRTtZQUNOLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztZQUN0RSxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDdEUsSUFBSSxHQUFHLElBQUksQ0FBQztTQUNmOztRQUVELElBQUksS0FBSyxFQUFFO1lBQ1AsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ3ZFLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxJ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QUFHLElBQUksaUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7O0lBRWhFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDNUMsSUFBSSxDQUFDLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUN0QyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3BGLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7S0FDdkY7O0lBRUQsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMxRSxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDOztJQUUxRSxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUN4QyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDekc7O0lBRUQsT0FBTyxZQUFZLENBQUM7Q0FDdkIsQ0FBQzs7O0FBR0YsU0FBUyxHQUFHLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0lBQzFDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDNUIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUM3QixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDOUI7UUFDRCxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQzFCLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3pCLElBQUksQ0FBQyxDQUFDLEdBQUcsS0FBSyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUM5QjtLQUNKO0lBQ0QsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDekIsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDeEIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQzlCO1FBQ0QsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN6QixLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUN4QixJQUFJLENBQUMsQ0FBQyxHQUFHLEtBQUssR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ3pDO0tBQ0o7Q0FDSjs7O0FBR0QsU0FBUyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtJQUMxQixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ1QsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO0lBQ1osQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDOztJQUVaLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUMvQixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4RSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDZCxDQUFDLEVBQUUsQ0FBQztZQUNKLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUN2RTtRQUNELENBQUMsRUFBRSxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNULENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDVCxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO0tBQ25COztJQUVELEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDM0IsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBRSxDQUFDLEVBQUUsR0FBQztRQUN6QixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FB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QUMsSUFBSSxDQUFDLENBQUM7TUFDN0MsSUFBTSxDQUFDLFNBQVMsR0FBRyxJQUFJLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztNQUN2QyxJQUFNLENBQUMsU0FBUyxHQUFHLElBQUksU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO01BQ3ZDLElBQU0sQ0FBQyxXQUFXLEdBQUcsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7TUFDM0MsSUFBTSxDQUFDLFdBQVcsR0FBRyxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztNQUMzQyxJQUFNLENBQUMsU0FBUyxHQUFHLElBQUksU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO01BQ3ZDLElBQU0sQ0FBQyxXQUFXLEdBQUcsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7TUFDM0MsSUFBTSxDQUFDLFVBQVUsR0FBRyxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztNQUN6QyxJQUFNLENBQUMsU0FBUyxHQUFHLElBQUksU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO01BQ3ZDLElBQU0sQ0FBQyxTQUFTLEdBQUcsSUFBSSxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7TUFDdkMsSUFBTSxDQUFDLEtBQUssR0FBRyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztNQUMvQixJQUFNLENBQUMsU0FBUyxHQUFHLElBQUksU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO01BQ3ZDLElBQU0sQ0FBQyxVQUFVLEdBQUcsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7TUFDekMsSUFBTSxDQUFDLGFBQWEsR0FBRyxJQUFJLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztNQUMvQyxJQUFNLENBQUMsUUFBUSxHQUFHLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO01BQ3JDLElBQU0sQ0FBQyxZQUFZLEdBQUcsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7TUFDN0MsSUFBTSxDQUFDLFNBQVMsR0FBRyxJQUFJLFNBQVMsQ0FBQyxJ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RSxPQUFPLEVBQUUsVUFBVSxDQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQzVFO1FBQ0QsSUFBSSxDQUFDQSxtQkFBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ3JDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxPQUFPLEVBQUUsVUFBVSxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQ3hFO1FBQ0QsSUFBSSxDQUFDQSxtQkFBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ3ZDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxPQUFPLEVBQUUsVUFBVSxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQzFFO1FBQ0QsSUFBSSxDQUFDQSxtQkFBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ3ZDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxPQUFPLEVBQUUsVUFBVSxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQzFFO1FBQ0QsSUFBSSxDQUFDQSxtQkFBTyxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLFVBQVUsQ0FBQyxFQUFFO1lBQy9DLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxPQUFPLEVBQUUsVUFBVSxDQUFDLGFBQWEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQ2xGO1FBQ0QsSUFBSSxDQUFDQSxtQkFBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFD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QUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN0TSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM3TyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDL1AsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzVELEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNqRixHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDakYsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUN0RSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDL0MsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDOUQsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDeEIsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDekMsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMxQixHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNsSSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDeEMsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDbkgsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNySCxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN2RCxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNsSSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNoTCxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDaEQsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDeE4sR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDN0ssR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3BGLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN6RyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2hDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUMvQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQy9CLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUMxSixHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDeFosR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNuRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3RMLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDeEksR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDeEgsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDM0YsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUN0RSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3JLLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDdEUsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDdkIsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzVFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDcEUsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzdDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzVGLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDckUsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUM5SixHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzlHLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDckwsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDckksR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDeEosR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQy9DLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUMvRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDOUMsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDNUYsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQy9DLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3RELEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDckUsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM3RixJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzNCLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDL0YsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDcEYsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzFCLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUM1RCxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDbEksR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2xJLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzNHLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNsSSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNoSSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDcEUsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN6SyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3BGLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNsRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN6RixHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ25FLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3ZCLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNuSixHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3BGLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ2hJLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ25JLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ25JLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNuRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNoSSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDakUsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNoRixHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDOUMsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDNUYsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQy9DLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDMUUsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNyRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ25SLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDeEIsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNwUixHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7Q0FDbEwsQ0FBQzs7QUFFRixTQUFTLGtCQUFrQixDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRTtJQUNyRCxLQUFLLEdBQUcsS0FBSyxJQUFJLENBQUMsQ0FBQzs7SUFFbkJBLElBQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQztJQUNuQkQsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDOztJQUV2QyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUN6QyxLQUFLLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzdCLElBQUksQ0FBQyxLQUFLLElBQUUsV0FBUztRQUNyQixJQUFJLEdBQUcsSUFBSSxDQUFDOztRQUVaLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsSUFBSSxF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QUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLElBQUMsQ0FBQyxDQUFDOzs7Ozs7SUFNckYsWUFBWSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDcEYsWUFBWSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7O0lBRXBGLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLFdBQUUsRUFBRSxFQUFFO1FBQzNCLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0tBQ2hCLENBQUMsQ0FBQztDQUNOOzs7Ozs7QUFNRCxTQUFTLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTO0lBQzlCLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUVsRCxJQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFO0lBQzdDLE9BQU87UUFDSCxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDUCxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDUCxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDUCxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDUCxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNiLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0tBQ2hCLENBQUM7Q0FDTDs7QUFFRCxTQUFTLFNBQVMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFO0lBQzdDQSxJQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzdDQSxJQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDOzs7SUFHNUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFO1NBQ2xDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUU7U0FDckMsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7UUFDekNBLElBQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0tBQ2pDOzs7SUFHREEsSUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQ3pCQSxJQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDekJBLElBQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3JCQSxJQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNyQixLQUFLRCxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUMxQkMsSUFBTSxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFDckVBLElBQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQ3JFLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7S0FDOUM7Q0FDSjs7QUFFRCxTQUFTLFlBQVksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsU0FBUyxJQUFJLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRTtJQUN0RUQsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDZixFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDZixFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQzs7SUFFcEJBLElBQUksQ0FBQyxDQUFDOzs7SUFHTixJQUFJLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFO0lB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LEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDbEM7OztRQUdEQSxJQUFNLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDOzs7Ozs7OztRQVF2QixTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDVkEsSUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksR0FBRyxJQUFJLEdBQUcsRUFBRSxHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFDdkcsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztTQUM3Qzs7UUFFRCxTQUFTLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUU7UUFDN0QsU0FBUyxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFO1FBQzdELFNBQVMsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFOzs7UUFHOUNBLElBQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7OztRQUloQkQsSUFBSSxDQUFDLHVCQUF1QixVQUFVLENBQUMsRUFBRTtZQUNyQyxRQUFRLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRTtTQUMxQyxDQUFDOzs7O1FBSUZBLElBQUksQ0FBQyx1QkFBdUIsVUFBVSxDQUFDLEVBQUU7WUFDckMsT0FBTyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztTQUN4RSxDQUFDOzs7UUFHRkEsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLEdBQUcsQ0FBQzs7O1FBRzFCLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUU7O1lBRXpDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsUUFBUSxJQUFFLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLEdBQUM7O1lBRXpFQyxJQUFNLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUMzQixDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQzs7WUFFdEMsQ0FBQyxHQUFHLFdBQVcsRUFBRSxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDN0IsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxFQUFFLEVBQUUsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcs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